打印
[STM32]

立创商城STM32F系列——STM32f4外部中断实验代码(02)

[复制链接]
822|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小乐Tzz|  楼主 | 2018-8-31 14:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

70

帖子

0

粉丝