外部事件/中断的区别及EXTI->SWIER的用途
EXTI_SWIER作用:允许我们通过程序控制就可以启动中断/事件线
1、产生事件的线路最终的产物是一个脉冲信号,这个脉冲信号可以给其他外设电路使用,比如定时器TIM、模拟数字转换器ADC等等。
2、产生中断线路目的是把输入信号输入到NVIC,进一步会运行中断服务函数,实现功能,这样是软件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级的。
关于外部中断寄存器EXTI->SWIER的用途,刚开始我也是云里雾里,感觉手册说的不是很清楚。凭借自己对EXTI->SWIER功能的理解,自己写了验证程序,做了一个实验。实验成功了;实验平台是野火mini开发板。
实验原理是:定义两个中断线EXTI0(PA0)和EXTI13(PC13)用来管理两个按键KEY0和KEY1,然后编写中断服务函数,中断服务函数的思路是,按下KEY0时,在LCD上显示“SWIER+KEY0:”;按下KEY1时就将LCD上显示的“SWIER+KEY0:”清除掉以证明KEY1按键已按下,同时也证明了外部中断线EXTI13已经触发(主函数会有相关的操作)。下面是两个中断服务函数(至于配置和分组函数就不贴出来了):
void EXTI0_IRQHandler(void) //KEY0按键
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
LCD_DispStr(20, 80, (uint8_t *)"SWIER+KEY0:", RED); //显示SWIER+KEY0:
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
void EXTI15_10_IRQHandler(void) //KEY1按键
{
if(EXTI_GetITStatus(EXTI_Line13) != RESET)
{
// LCD_DispStr(20, 60, (uint8_t *)"SWIER+KEY1:", RED);
LCD_DispStr(20, 80, (uint8_t *)"SWIER+KEY0:", WHITE); //清除LCD显示的SWIER+KEY0:
EXTI_ClearITPendingBit(EXTI_Line13);
EXTI->SWIER=0; //清除EXTI->SWIER寄存器相应的位,这种写法有点不规范,其实是应该将EXTI->SWIER寄存器的bit13清零即复位
}
}
主函数:
int main(void)
{ u8 m=0;
LCD_Init();
LED_GPIO_Config();
delay_init();
uart_init(9600);
EXTI_PC13_Config();
EXTI_PA0_Config();
LCD_Clear(0, 0, 240, 320, WHITE);
EXTI->IMR|=1<<13;//
EXTI->EMR|=1<<13;//
EXTI->SWIER=0;
while( 1 )
{
m++;
LCD_DispNumber(100, 100, m, WHITE); //显示m的值
delay_ms(500);
if(m==10)
{
EXTI->SWIER|=1<<13; //软件触发中断线13,
m=0;
}
}
主函数其实很简单,程序运行之后,先按下KEY0按键这时会在LCD上显示“SWIER+KEY0”;同时,在LCD上每隔500ms显示一次m的值,当m等于10的时候程序将 EXTI->SWIER寄存器的bit13位置1,这时就相当于按下KEY1按键只不过是由程序执行的而已,这时LCD上显示的“SWIER+KEY0”会被清除;证明外部中断线EXTI13已经触发。