F407对应的十个内核级中断。。。
F407对应的82个外部中断。。。
注意其不编译相应的宏定义是找不到的。。。
注意其断言assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));之意即判断相应的形参是否有效。。。
注意找相应定义报错时可以可以试试勾选这个按钮。。。
太繁琐了,无需细究,只需知道其是对寄存器的操作即可。。。
下面标注分别对应抢占优先级和响应优先级。。。
注意其中IP下标即对应相应的中断编号(240个8位的寄存器对应最大可以有240个中断,当然F407只用了82个,而F407还限制只使用8位寄存器的高4位即对应16个中断优先级)
对相应的中断号进行使能。。。
主线任务:EXTI线0-15
注意其F1是20个而F4是23个(对应407参考手册有误)。。。
其数字电路中和与门相关故置1。。。
下面是对于F7的。。。
可能参考手册写错了(x写成了C)。。。
醍醐灌顶
注意不是5_9还是9_5。。。
关于回调函数。。。
PE4对应外部中断下降沿触发。。。
其中断优先级分组已在相应xx_hal.c中配置过了且其图中对应分组即对应4个中断优先级和4个响应优先级。。。
对应获取中断挂起标志位看其是否为0。。。
中断挂起标志位(为1表示有中断)。。。
注意区分其引脚号和分组号(对于同一时刻相应只能有一个有效)。。。
注意这里其__EXTI_LINE__是一个形参进而接受对应的GPIO_PIN故找不到很正常。。。
太坑了(注意其置一和写一的区别)。。。
通过外部中段点灯成功。。。而相应四个按键的中段处理与此相比主要是复杂度大一点以及优先级的设置要多留意一点,其他没什么,这里就不费笔墨了。。。
main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"//其内包含LED初始化函数声明
//#include "./BSP/KEY/key.h"
#include "./BSP/EXTI/exti.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
led_init(); /* 初始化LED */
//key_init();
exti_init();
while(1)
{
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);
delay_ms(500);
}
}
exti.h
#ifndef __EXTI_H//防止其重复包含和编译。。。
#define __EXTI_H
#include "./SYSTEM/sys/sys.h"
void exti_init(void);
#endif
exti.c
#include "./BSP/EXTI/exti.h"
#include "./SYSTEM/delay/delay.h"
void exti_init(void){
GPIO_InitTypeDef gpio_init_struct;//定义结构体,为了下面的传参
__HAL_RCC_GPIOE_CLK_ENABLE();//对该GPIO组进行使能
gpio_init_struct.Pin = GPIO_PIN_4;//选择组内IO口
gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;//外部中断下降沿触发
gpio_init_struct.Pull = GPIO_PULLUP;//上拉
//gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;//高速
HAL_GPIO_Init(GPIOE,&gpio_init_struct);//对应组内IO口初始化
HAL_NVIC_SetPriority(EXTI4_IRQn,2,0);
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
}
void EXTI4_IRQHandler(void){
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4); /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
delay_ms(20);
if(GPIO_Pin==GPIO_PIN_4){
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0){
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);
}
}
}