你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

NUCLEO_L552ZE_Q 『人生中的首块STM32L552开发板』┅ 外部中断

[复制链接]
三界狗 发布时间:2020-3-21 21:06
上回向大家介绍了如何使用GPIO口的输出功能点亮一盏LED灯,以及使用GPIO口的输入功能读取按键的状态控制LED的闪烁频率,然鹅,获取按键的状态采用的是主循环查询的方法,这有一个弊端,试想当主循环的循环周期非常长的时候,比如夸张点说要1秒,那就得一直按着按键等到程序扫描到按键的输入引脚后才能放开,这个等待时间最长需要1秒,这是很糟糕的,我可没有这个耐心去等,比如在将一个数从1调节到100的时候,那后果是可想而知的。为此,就有必要引入一个叫中断的神奇东西,程序中的中断,会把正在运行的普通程序或者低级的中断服务程序打断,先运行本中断服务函数内的程序,就好比我们日常生活中的突发事件,你正在洗衣服,突然快递小哥到你家门口了,你得放下手上的衣服先去取个快递,总不能让快递小哥在门口等你把衣服洗完吧。中断还有很多种分类,在普通的51单片机中有三类中断共五个中断源,分别是外部中断0和1、定时器中断0和1以及串口中断,而在STM32中的中断那可多了去了,比方说有GPIO外部中断、定时器中断、串口中断、DMA中断、ADC中断等等等等,每个中断都有它独特的功能,而本次我们需要的就是这当中的GPIO外部中断,好了,废话不多说,接下来我们就来研究研究STM32L552的外部中断是如何使用的。评测内容:
1、使用外部中断获取按键的状态,并调节LED灯闪烁的频率。
所需元件:
1、STM32L552ZET6Q;
2、板载红色LED(LD3);
3、板载蓝色按键(USER)。
评测步骤:
1、将按键引脚配置成外部中断模式,打开上回创建的STM32CubeMX工程,将芯片的PC13引脚按照步骤配置成下图所示的设置,第五步为设置程序中的引脚别名,可根据自己的需求进行设置;
1-1.png

2、使能外部中断并设置中断优先级,按照下图所示步骤及内容设置,中断优先级可自己根据需要设置;
1-2.png

3、保存工程并生成代码工程。
4、打开代码工程,发现main.c文件中的GPIO口配置函数多了如下两行设置中山优先级和使能中断的代码;
  1. HAL_NVIC_SetPriority(EXTI13_IRQn, 3, 0);
  2. HAL_NVIC_EnableIRQ(EXTI13_IRQn);
复制代码

5、在stm32l5xx_it.c文件中也多了一段中断服务函数的代码;
  1. void EXTI13_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN EXTI13_IRQn 0 */

  4.   /* USER CODE END EXTI13_IRQn 0 */
  5.   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
  6.   /* USER CODE BEGIN EXTI13_IRQn 1 */

  7.   /* USER CODE END EXTI13_IRQn 1 */
  8. }
复制代码
6、跳转到HAL_GPIO_EXTI_IRQHandler函数的实现,该函数的内容如下;
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
  2. {
  3.   /* EXTI line interrupt detected */
  4.   if(__HAL_GPIO_EXTI_GET_RISING_IT(GPIO_Pin) != 0U)
  5.   {
  6.     __HAL_GPIO_EXTI_CLEAR_RISING_IT(GPIO_Pin);
  7.     HAL_GPIO_EXTI_Rising_Callback(GPIO_Pin);
  8.   }

  9.   if(__HAL_GPIO_EXTI_GET_FALLING_IT(GPIO_Pin) != 0U)
  10.   {
  11.     __HAL_GPIO_EXTI_CLEAR_FALLING_IT(GPIO_Pin);
  12.     HAL_GPIO_EXTI_Falling_Callback(GPIO_Pin);
  13.   }
  14. }
复制代码
其中的HAL_GPIO_EXTI_Rising_Callback和HAL_GPIO_EXTI_Falling_Callback函数就是外部中断的回调函数,两个函数内分别有如下注释:
/* NOTE: This function should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Rising_Callback could be implemented in the user file
   */
/* NOTE: This function should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Falling_Callback could be implemented in the user file
   */

意思是这两个函数在用户需要的时候可以在用户文件上实现,实现的内容就是用户需要本次中断执行的内容。
7、回到main.c文件,添加如下函数的实现;
  1. void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
  2. {
  3.   if (GPIO_Pin == USER_BUTTON_Pin)
  4.   {
  5.     USER_BUTTON = 1;
  6.   }
  7. }
复制代码
USER_BUTTON为一个全局变量,在文件开头进行定义:_Bool USER_BUTTON = 0;
8、在主函数的循环中添加如下代码;
一切就绪,重新编译连接并
  1. /*外部中断操作*/
  2. //按键检测程序
  3. if(USER_BUTTON == 1)
  4. {
  5.         u_cycle += 10;
  6.         if(u_cycle>=50)
  7.         {
  8.                 u_cycle = 10;
  9.         }
  10.         USER_BUTTON = 0;
  11. }
  12. //LED灯闪烁程序
  13. u_cnt++;
  14. if(u_cnt >= u_cycle)
  15. {
  16.         u_cnt = 0;
  17.         LED_R = !LED_R;
  18. }
  19. HAL_Delay(10);
复制代码

下载到开发板上,按下按键观察程序运行情况,还是跟上回的一样,实现了使用外部中断检测按键对LED的闪烁频率进行调节。
总结:
得益于STM32CubeMX的强大功能以及HAL库的完美包装,外部中断的实现似乎并没有那么难(相比于标准固件库来说真的是简单了不少),只需要自己实现一个回调函数就好了,对快速开发是方便了不少。好了,本次评测就到此结束,感谢您的阅读,我们下回再见。





收藏 评论0 发布时间:2020-3-21 21:06

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版