×
单片机 > 单片机程序设计 > 详情

STM32f4外部中断实验代码(02)

发布时间:2020-05-19 发布时间:
|

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 ");  //打印 OK提示程序运行

    delay_ms(1000);  //每隔 1s打印一次

  }

}

该部分代码很简单,先设置系统优先级分组,延时函数以及串口等外设。然后在初始化完中断后,点亮LED0,就进入死循环等待了,这里死循环里面通过一个printf函数来告诉我们系统正在运行,在中断发生后,就执行相应的处理,从而实现第八章类似的功能。


关键字:STM32f4  外部中断  实验代码

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址