1、写在前面的注意事项和要点。
当在使用外部中断的时候stm32基本每一个io口都可以当外部中断使用,在设置中断优先级的时候有个很模糊的地方容易出错,这里标注一下。简单一句话“当使用5到9的EXIT端口的时候,共用EXTI9_5_IRQn的;使用10到15端口的EXTI时候,共用EXTI15_10_IRQn的;其它就是0到4端口单独对应EXTI0_IRQn、EXTI1_IRQn、EXTI2_IRQn、EXTI3_IRQn、EXTI4_IRQn。”
函数名用: EXTI1_IRQHandler EXTI2_IRQHandler EXTI3_IRQHandler EXTI4_IRQHandler EXTI9_5_IRQHandler EXTI15_10_IRQHandler
设置中断线初始化时要相应IO和中断线一一对应设置,中断通道也是要分别对应初始化设置,不能像初始化GPIO口时那样同一端口的用"|"一起初始化!
2、SD红外射线测速传感器中断编程流程分析
使能AFIO时钟(如果要用到其它iO口,需要使能其对应的时钟),设置NVIC优先级组为NVIC_PRIORITYGROUP_2;
使能SD红外传感器引脚端口GPIOA时钟(用到其它引脚就使能对应的引脚端口时钟),初始化配置PA2和PA3引脚为下降沿触发中断模式并使能上拉;
配置SD红外引脚中断优先级并使能中断;
编写外部中断回调函数,为减少误差,对引脚进行消抖处理,确保SD红外传感器的红外光遮挡后执行应用功能。
3、SD红外射线测速传感器中断代码实现
HAL_MspInit函数是控制器系统级初始化,在HAL_Init函数中被调用。
SD红外传感器引脚宏定义,中断为EXTI2_IRQn,中断复位函数为SD1_EXTI_IRQHandler。
SD_GPIO_Init函数用于初始化传感器引脚,HAL_NVIC_SetPriority函数设置中断的优先级:抢占式优先级为1,响应优先级为1。
中断服务函数的存放
传感器中断,传感器的应用程序在中断回调函数中实现,这里无限循环无需执行其它确认。
HAL_GPIO_EXTI_Callback是外部中断回调函数,在成功触发外部中断后就会运行该函数,该函数有一个形参,用于说明中断引脚编号,也是通过这个参数知道哪个引脚发生了中断。
4、调试现象
通过遮挡2个传感器,令电机正反转。