核心部分:两个文件四个函数
两个文件:it.c和msp.c
it.c:放置中断函数的文件(当中断产生便会跳入这个文件实施操作)
msp.c :放置中断优先级组,中断优先级的函数
函数1:设置中断优先级组HAL_NVIC_SetPriorityGrouping()
函数2:HAL_NVIC_SetPriority函数用于设置一个中断的优先级,它有三个形参,第一个为IRQn_Type类型参数,指定中断源,中断源在stm32g431xx.h文件里。 第二个和第三个形参分别设定中断的抢占式优先级和响应优先级,这个的设置要与中断组配合使用。
函数3: HAL_NVIC_EnableIRQ函数用于在NVIC控制器中使能指定中断,它有一个形参,是IRQn_Type类型参数。
函数4:HAL_NVIC_DisableIRQ函数是在NVIC控制器中禁用指定中断,用法与HAL_NVIC_EnableIRQ函数相同。
stm32cubeMX配置
复制上一讲的LCD工程并改名为HAL_04_EXTI_TEST
配置PA0引脚为外部中断GPIO_EXTI0,下降沿触发
在NVIC界面使能外中断0
设置优先级组为组2,组2有可配置两个抢占优先级和两个响应优先级,我们设置抢占优先级为1,响应优先级为1
将系统时钟的中断优先级配置为0,1并生成代码
移植source中的代码
在新建工程文档HAL_04_EXTI_TEST的Src和inc文件里的bsp中分别创建bsp_exti的.c和.h文件
打开HAL_04_EXTI_TEST的keil工程,在bsp_key.c中屏蔽掉按键PA0之前配置的所有代码
把Source中配置好的代码移植到bsp_exti.c中并删除多余的代码
在main.c中调用EXTI_Init
当外中断产生时需要跳转到中断里
在Srouce里复制外部中断函数放到TEST的it.c里(外部中断EXTI0一旦触发就会调用这个函数)
在HAL_00_Srouce中的msp里的中断优先级分组粘贴到HAL_04_EXTI_TEST中的相同位置
Source里的中断优先级分组移植到msp文件里
修改滴答定时器外部中断的优先级为0,0放在msp文件夹里
(在main.c的HAL_Init() -> HAL_InitTick(TICK_INT_PRIORITY) 找滴答定时器中断)
在外部中断函数中找到回调函数(这是一个弱函数),在主函数里写回调函数,我们想在外部中断产生时实现一些灯的操作
中断产生后是如何执行的
当中断产生时首先会跳转到stm324xx_it.c中执行EXTI0_IRQHandler(void)接着执行这个函数里面的函数HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0)
接着调用 HAL_GPIO_EXTI_Callback(GPIO_Pin)
因为这个函数默认是一个弱函数,但我们在主函数中重新声明了这个函数,所以会接着执行主函数我们重新声明的内容
当外中断产生后我们让灯点亮
ucLed ^= 0x88(让灯翻滚操作)
ucled = ucLed 异或 0x88