历史上的今天
今天是:2025年01月17日(星期五)
2019年01月17日 | STM32:STM32学习记录5: 外部中断
2019-01-17 来源:eefocus
配置流程:
1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。
2:IO口初始化,包括引脚,速率,输入输出模式等。
3:NVIC 中断向量配置 ,中断向量基地址和优先级的配置。
4:EXTI 中断/事件控制器,使能或失能外部线路,使能的模式(事件请求和中断请求),边沿触发模式,状态等。
说明:
1:主函数写在main.c中,中断函数写在stm32f10x_it.c 中,找到相应的中断函数(一般都是空白),加入自己的中断代码即可。
2:中断函数名在startup_stm32f10x_xx.s中查阅
3:清除 EXT13 线路的挂起位 注意此处一定要清除!!!!!!!!在EXTI_PR寄存器中
3:NVIC一般配置流程:(需要中断就要配置)
void NVIC_Configuare(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//设定中断向量表基址0x08000000
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 先占优先级0位 从优先级4位
//使能KEY0,KEY1中断
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//外部中断线15-10中断 由于两个按键是PA13 PA15由外部中断IO映射得知
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x0F; //先占优先级0位,从优先级4位
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x0F; //
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
4:EXIT中断、事件控制器配置流程
// EXTI_InitTypeDef EXTI_InitStructure;
// EXTI_InitStructure.EXTI_Line=EXTI_Line0;//外部中断线 0
// EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求
// EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//设置输入线路上升沿为中断请求
// EXTI_InitStructure.EXTI_LineCmd=ENABLE;
// EXTI_Init(&EXTI_InitStructure);
main.c文件为:
#include"stm32f10x.h"
#define LED0_ON GPIO_SetBits(GPIOA,GPIO_Pin_8) // LED0开
#define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0关
#define LED1_ON GPIO_SetBits(GPIOD,GPIO_Pin_2) //LED1开
#define LED1_OFF GPIO_ResetBits(GPIOD,GPIO_Pin_2)//LED1关
//初始化IO端口
void IO_Configuart(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义 GPIO_InitStructure为 GPIO_InitTypeDef结构体类型
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//引脚选择
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
//配置GPIOD_2
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//引脚选择
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化
//配置GPIOA_13 KEY0
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;//引脚选择
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU ;//上拉输入 由于按键按下为低电平
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
// //配置GPIOA_15 KEY1
// GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//引脚选择
// GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入 由于按键按下为低电平
// GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
// //配置GPIOA_0 WK_UP
// GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//引脚选择
// GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率
// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//下拉输入 由于按键按下为高电平
// GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允许总线CLOCK,在使用GPIO之前必须允许相应的端口时钟
}
//复位和系统时钟控制
void RCC_Configuare(void)
{
SystemInit();//频率设定有system_stm32f10x.c文件中的宏定义 开放某个宏 当调用SystemInit()时即可设置好频率
RCC_ClockSecuritySystemCmd(ENABLE);//使能或者失能时钟安全系统
//使能GPIOA,GPIOD端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允许总线CLOCK,在使用GPIO之前必须允许相应的端口时钟
/* 也可以写为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE); 更加简洁*/
}
//NVIC设置
void NVIC_Configuare(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//设定中断向量表基址0x08000000
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 先占优先级0位 从优先级4位
//使能KEY0,KEY1中断
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//外部中断线15-10中断 由于两个按键是PA13 PA15由外部中断IO映射得知
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x0F; //先占优先级0位,从优先级4位
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x0F; //
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
// //使能WK_UP中断
// NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//外部中断线0中断 WK_UP按键 接PA0
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //先占优先级0位,从优先级4位
// NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //
// NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
// NVIC_Init(&NVIC_InitStructure);
}
void Delay(u16 speed)
{
u16 i=0;
while(speed!=0)
{
speed--;
for(i=0;i<400;i++);
}
}
int main(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //JTAG-DP 失能 + SW-DP使能
// GPIO_AFIODeInit(); //将复用功能(重映射事件控制和 EXTI 设置)重设为缺省值
// GPIO_DeInit(GPIOA);
// GPIO_DeInit(GPIOD);
RCC_Configuare();
IO_Configuart();
NVIC_Configuare();
LED1_OFF;
// EXTI_InitStructure.EXTI_Line=EXTI_Line0;//外部中断线 0
// EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求
// EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//设置输入线路上升沿为中断请求
// EXTI_InitStructure.EXTI_LineCmd=ENABLE;
// EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line=EXTI_Line13;//外部中断线 13
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling ;//设置输入线路下降沿为中断请求
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
// EXTI_InitStructure.EXTI_Line=EXTI_Line15;//外部中断线 15
// EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求
// EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling ;//设置输入线路下降沿为中断请求
// EXTI_InitStructure.EXTI_LineCmd=ENABLE;
// EXTI_Init(&EXTI_InitStructure);
while(1)
{
LED0_ON;
// LED1_OFF;
Delay(2000);
LED0_OFF;
// LED1_ON;
Delay(2000);
}
}
// void EXTI15_10_IRQHandler(void)
//{
// if(EXTI_GetITStatus(EXTI_Line13)!=RESET) //按键1按下
// {
// LED0_ON;
// }
// else
// {
// LED0_OFF;
// }
// if(EXTI_GetITStatus(EXTI_Line15)!=RESET) //按键2按下
// {
// LED1_ON;
// }
// else
// {
// LED1_OFF;
// }
//
//
//
// EXTI_ClearITPendingBit(EXTI_Line13);//待清除 EXT13 线路的挂起位
// EXTI_ClearITPendingBit(EXTI_Line15);
//}
//
//void EXTI0_IRQHandler(void)
//{
// if(EXTI_GetITStatus(EXTI_Line15)!=RESET) //按键WK_UP按下
// {
// LED1_ON;
// LED0_ON;
// }
// else
// {
// LED1_OFF;
// LED0_OFF;
// }
// EXTI_ClearITPendingBit(EXTI_Line0); //待清除 EXTI 线路的挂起位
//}
stm32f10x_it.c 文件为:
/**
******************************************************************************
* @file GPIO/IOToggle/stm32f10x_it.c
* @author MCD Application Team
* @version V3.4.0
* @date 10/15/2010
* @brief Main Interrupt Service Routines.
* This file provides template for all exceptions handler and peripherals
* interrupt service routine.
******************************************************************************
* @copy
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
*
© COPYRIGHT 2010 STMicroelectronics
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"
#define LED0_ON GPIO_SetBits(GPIOA,GPIO_Pin_8) // LED0开
#define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0关
#define LED1_ON GPIO_SetBits(GPIOD,GPIO_Pin_2) //LED1开
#define LED1_OFF GPIO_ResetBits(GPIOD,GPIO_Pin_2)//LED1关
/** @addtogroup STM32F10x_StdPeriph_Examples
* @{
*/
/** @addtogroup GPIO_IOToggle
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
/* Cortex-M3 Processor Exceptions Handlers */
/******************************************************************************/
/**
* @brief This function handles NMI exception.
* @param None
* @retval None
*/
void NMI_Handler(void)
{
}
/**
* @brief This function handles Hard Fault exception.
* @param None
* @retval None
*/
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}
/**
* @brief This function handles Memory Manage exception.
* @param None
* @retval None
*/
void MemManage_Handler(void)
{
/* Go to infinite loop when Memory Manage exception occurs */
while (1)
{
}
}
/**
* @brief This function handles Bus Fault exception.
* @param None
* @retval None
*/
void BusFault_Handler(void)
{
/* Go to infinite loop when Bus Fault exception occurs */
while (1)
{
}
}
/**
* @brief This function handles Usage Fault exception.
* @param None
* @retval None
*/
void UsageFault_Handler(void)
{
/* Go to infinite loop when Usage Fault exception occurs */
while (1)
{
}
}
/**
* @brief This function handles SVCall exception.
* @param None
* @retval None
*/
void SVC_Handler(void)
{
}
/**
* @brief This function handles Debug Monitor exception.
* @param None
* @retval None
*/
void DebugMon_Handler(void)
{
}
/**
* @brief This function handles PendSV_Handler exception.
* @param None
* @retval None
*/
void PendSV_Handler(void)
{
}
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
}
/******************************************************************************/
/* STM32F10x Peripherals Interrupt Handlers */
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
/* available peripheral interrupt handler's name please refer to the startup */
/* file (startup_stm32f10x_xx.s). */
/******************************************************************************/
//中断处理函数
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line13)!=RESET) //按键0按下
{
LED1_ON;
}
else
{
LED1_OFF;
}
// if(EXTI_GetITStatus(EXTI_Line15)!=RESET) //按键1按下
// {
// LED1_ON;
// }
// else
// {
// LED1_OFF;
// }
EXTI_ClearITPendingBit(EXTI_Line13);//待清除 EXT13 线路的挂起位 注意此处一定要清除
// EXTI_ClearITPendingBit(EXTI_Line15);
}
//void EXTI0_IRQHandler(void)
//{
// if(EXTI_GetITStatus(EXTI_Line15)!=RESET) //按键WK_UP按下
// {
// LED1_ON;
// LED0_ON;
// }
// else
// {
// LED1_OFF;
// LED0_OFF;
// }
// EXTI_ClearITPendingBit(EXTI_Line0); //待清除 EXTI 线路的挂起位
//}
/**
* @brief This function handles PPP interrupt request.
* @param None
* @retval None
*/
/*void PPP_IRQHandler(void)
{
}*/
/**
* @}
*/
/**
* @}
*/
/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/
史海拾趣
|
基于EL7558BC的DC/DC变换器的设计与实现 摘要:对HSOP封装的EL7558BC降压型开关整流器芯片的使用特点进行了分析,给出了利用该整流器芯片设计DC/DC变换器的外围电路和设计方法。并通过实验验证了该设计方法。 关键词:DC/DC变换器;EL7 ...… 查看全部问答> |
|
SV做验证不必说了,但据说将来SV也可以做设计,而且是趋势。现在有用SV做设计的吗,如果有,其流程是什么?用什么工具综合和布局布线?目前据我所知,两大主流FPGA供应商xilinx和altera的开发工具还不支持SV做设计。… 查看全部问答> |
|
hr |= m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl); hr |= m_pGraph->QueryInterface(IID_IMediaEvent, (void **)&m_pIMediaEvent); hr |= m_pGraph->QueryInterface(IID_ ...… 查看全部问答> |
|
、、开发环境iar;st_link;stm8sdiscovery系统版;无法进入中断;大家帮忙看看啊。以下是全部代码,stm8_conf.h里面的_EXTI已经配置了。 #include "stm8s.h" #include "stm8s_type.h" #include "stm8s_conf.h" #include "s ...… 查看全部问答> |
|
#pragma interrupt_handler TimeCountr0_Interrupt:20 void TimeCountr0_Interrupt(void){//中断程序 ...… 查看全部问答> |
|
刚接触si4432,用该芯片传输语音,在我设置Fd=45K,Rb=5.6Kbps的时候,频谱仪上看到的带宽是95K左右,通信正常。但当我把设置改成Fd=5.6K的时候,频谱仪上看到的带宽还是那么多,接收端也收不到信号了,是怎么回事呢,这个带宽怎么设置就变窄了,有 ...… 查看全部问答> |
|
MSP430 链接时出现附图所示错误,说CSTACK尺寸太大,改小后问题解决。只是我担心改小后有其它问题,故请教是否有其它更好的办法?导致该问题的原因是什么?有会的网友请帮忙指教一下,谢谢! StackSet… 查看全部问答> |




