STM32中EXTI原理及其运用
中断的概念
中断在现实生活中的引用为:做一件事的时候(看电视)产生突发事件(上厕所)然后当前就要转去做完突发事件(上厕所)再回到原事件(看电视)。
在STM32中这样的作用在于:实时控制、故障处理、数据传输等。
同时中断比if语句触发更好的是高效处理紧急程序不会占用CPU资源。
中断流程
在32中NVIC的触发流程:触发信号→GPIO(经过AFIO(F1系列)或SYSCFG(F4、F7、H7系列)映射到EXTI)→EXTI→NVIC→CPU。
如何使用NVIC
- GPIO设置输入模式。
- AFIO(F1系列)或SYSCFG(F4、F7、H7系列)设置EXTI和IO映射。 (补充:除了EXTI可以进入NVIC,由其它外设同样可以进入NVIC)
- NVIC设置中断分组(该设置代码一般在一个项目中只需要设置一次)、优先级、使能。
- CPU按优先级顺序依次处理中断。
配置步骤(HAL库)
- 使能GPIO时钟。
- 设置GPIO输入模式,使能AFIO/SYSCFG时钟,设置EXTI和IO映射,设置EXTI屏蔽和上下沿触发(这一步在HAL库中可以一步完成)。
- 设置中断分组(仅需要设置一次)。
- 设置中断优先级。
- 使能中断,
- 设计中断服务函数。
程序配置代码
void exti_init(void) {GPIO_InitTypeDef gpio_init_struct;__HAL_RCC_GPIOA_CLK_ENABLE();//使能GPIO时钟gpio_init_struct.Pin = GPIO_PIN_15;gpio_init_struct.Mode = GPIO_MODE_OUTPUT_OD;gpio_init_struct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOA,&gpio_init_struct);//配置GPIO映射、模式和触发//中断分组我在其它页已设置所以在这里仅作为注释写出 /* HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); */HAL_NVIC_SetPriority( EXTI0_IRQn, 2, 0);//设置中断优先级HAL_NVIC_EnableIRQ(EXTI0_IRQn);//使能中断 }void EXTI0_IRQHandler(void)//设计中断服务函数 {HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_15);//先清中断再处理回调,退出时再清一次中断避免抖动误触发 }void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//进入中断服务函数会触发的事件(回调处理机制) //这里在stm32f1xx_hal_gpio.c文件中声明的是弱函数,所以可以被我们修改程序事件触发内容 {delay_ms(20);if(GPIO_Pin == GPIO_PIN_15) /*进入中断服务函数除了EXTI还有其它外设中断所以我们要检测是哪一个触发中断*/{if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15) == 0){HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);}}}