STM32f4————外部中断实验代码(02)
/*******************************************************/
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//外部中断2
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//响应优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//配置 NVIC
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//外部中断3
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//响应优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//配置 NVIC
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//外部中断4
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//响应优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//配置 NVIC
}
exti.c文件总共包含5 个函数。一个是外部中断初始化函数void EXTIX_Init(void),另外 4个都是中断服务函数。void EXTI0_IRQHandler(void)是外部中断0的服务函数,负责KEY_UP按键的中断检测;void EXTI2_IRQHandler(void)是外部中断2 的服务函数,负责KEY2按键的中断检测; void EXTI3_IRQHandler(void)是外部中断3 的服务函数,负责KEY1按键的中断检测; void EXTI4_IRQHandler(void)是外部中断4 的服务函数,负责KEY0按键的中断检测; 下面我们分别介绍这几个函数。
首先是外部中断初始化函数 void EXTIX_Init(void),该函数严格按照我们之前的步骤来初始化外部中断,首先调用KEY_Init,利用第八章按键初始化函数,来初始化外部中断输入的IO口,接着调用 RCC_APB2PeriphClockCmd 函数来使能 SYSCFG 时钟。接着调用函数SYSCFG_EXTILineConfig配置中断线和GPIO的映射关系,然后初始化中断线和配置中断优先级。需要说明的是因为我们的KEY_UP 按键是高电平有效的,而KEY0、KEY1和 KEY2是低电平有效的,所以我们设置KEY_UP 为上升沿触发中断,而 KEY0、KEY1和KEY2则设置为下降沿触发。这里我们,把按键的抢占优先级设置成一样,而响应优先级不同,这四个按键,KEY0的优先级最高。
接下来我们介绍各个按键的中断服务函数,一共 4个。先看 KEY_UP 的中断服务函数void EXTI0_IRQHandler(void),该函数代码比较简单,先延时 10ms 以消抖,再检测 KEY_UP 是否还是为高电平,如果是,则执行此次操作(翻转蜂鸣器控制信号),如果不是,则直接跳过,在最后有一句 EXTI_ClearITPendingBit(EXTI_Line0);通过该句清除已经发生的中断请求。同样,我们可以发现 KEY0、KEY1和 KEY2的中断服务函数和 KEY_UP 按键的十分相似,我们就不逐个介绍了。
这里向大家重申一下, STM32F4的外部中断0~4都有单独的中断服务函数,但是从5开始,他们就没有单独的服务函数了,而是多个中断共用一个服务函数,比如外部中断 5~9的中断服务函数为:void EXTI9_5_IRQHandler(void),类似的,void EXTI15_10_IRQHandler(void)就是外部中断 10~15 的中断服务函数。另外,STM32F4 所有中断服务函数的名字,都已经在startup_stm32f40_41xx.s里面定义好了,如果有不知道的,去这个文件里面找就可以了。
exti.h头文件里面主要是一个函数申明,比较简单,这里不做过多讲解。
接下来我们看看主函数,main函数代码如下:
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //串口初始化
LED_Init(); //初始化 LED 端口
BEEP_Init(); //初始化蜂鸣器端口
EXTIX_Init(); //初始化外部中断输入
LED0=0; //先点亮红灯
while(1)
{ printf("OK\r\n"); //打印 OK提示程序运行
delay_ms(1000); //每隔 1s打印一次
}
}
该部分代码很简单,先设置系统优先级分组,延时函数以及串口等外设。然后在初始化完中断后,点亮 LED0,就进入死循环等待了,这里死循环里面通过一个printf函数来告诉我们系统正在运行,在中断发生后,就执行相应的处理,从而实现第八章类似的功能。
/*******************************************************/
【立创商城】STM32F103CBT6 托盘 https://item.szlcsc.com/8796.html |