STM32CubeMX学习笔记2:GPIO按键外部中断控制LED状态

发布者:CuriousMind123最新更新时间:2019-06-15 来源: eefocus关键字:STM32CubeMX  GPIO按键  外部中断  控制LED 手机看文章 扫描二维码
随时随地手机看文章

MCU:STM32F103ZET6


IDE:  MDK-ARM V5 +STM32CubeMX5.0.0


 


本次实现的功能是通过按键的外部中断,来改变对应LED的状态,需要将按键的I/O端口映射到外部中断线上。


需要初始化的按键I/O口分别对应PA0PE2PE3PE4,LEDI/O口分别为PC0PC1PC2PC3PC4。


一. 在 Pinout&Configuration---System Core中:

1. 首先设置时钟RCC的HSE(外部高速时钟)为晶振模式:Crystal/ceramic Resonator


2. 设置系统SYS的Debug为Serial Wire:


3. 设置GPIO中的LED管脚。

根据MCU的硬件原理图可以看出LED均是低电平触发,且对应的端口为PC0-PC7,因此在使能是应开启GPIOC端口。



在MCU管脚图中找到PC0-PC4管脚,右键将管脚设置为GPIO_Output输出模式。


此时在System Core的GPIO中,会出现对应端口,点击端口将GPIO output level设置为low,将User Label定义为LED。

4. 设置按键映射到外部中断线上。

选择PA0的端口为GPIO_EXTI0,PE2PE3PE4的端口依次为GPIO_EXTI234。


                

此时在System Core的GPIO中,会出现对应I/O端口,按键部分的硬件原理图:


KEY_UP应为上升沿触发,并外接下拉电阻,点击端口将GPIO mode设置为External Interrupt Mode with Rising edge trigger detection,将GPIO Pull-up/Pull-down配置为Pull-down,将User Label定义为KEY_UP。


K1K2K3应为下降沿触发,点击端口将GPIO mode设置为External Interrupt Mode with Falling edge trigger detection,将User Label定义为KEY_LEFTKEY_DOWNKEY_RIGHT。


接着在GPIO-Configuration中使能四个GPIO的中断:


*在将端口映射到EXTI线上后,SYS会出现以下警告:表示红色部分的模式不可使用,且因为PA0本身对应的是系统唤醒功能,因此System Wake-UP的功能也无法被选中。


二.在 Clock Configuration中:

配置时钟为72 Mhz。



三.在 Project Manager---Project中:

1.设置项目的名称以及保存的位置,选择Toolchain/IDE为MDK-ARM V5,

Tips:最好把Linker Settings中的Minimum Heap Size设置为0x600。

2.在Code Generator选项中如下勾选:

最后点Generate Code生成代码,并选择“Open Project”:


四.代码分析与改写:

在生成的stm32f1xx_it.c中是系统中断的相关函数,找到四个外部中断的中断服务函数:


void EXTI0_IRQHandler(void)

{

  /* USER CODE BEGIN EXTI0_IRQn 0 */

 

  /* USER CODE END EXTI0_IRQn 0 */

  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);

  /* USER CODE BEGIN EXTI0_IRQn 1 */

 

  /* USER CODE END EXTI0_IRQn 1 */

}

进入“HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0)”函数后发现定义如下:


void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)

{

  /* EXTI line interrupt detected */

  if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)

  {

    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);

    HAL_GPIO_EXTI_Callback(GPIO_Pin);

  }

}

服务函数中第一步对中断口清零,随后进入回调函数“HAL_GPIO_EXTI_Callback”:


__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

  /* Prevent unused argument(s) compilation warning */

  UNUSED(GPIO_Pin);

  /* NOTE: This function Should not be modified, when the callback is needed,

           the HAL_GPIO_EXTI_Callback could be implemented in the user file

   */

}

回调函数是_weak符号弱定义,(库中定义的弱符号可以被用户定义的强符号覆盖,从而使程序可以使用自定义版本的库函数)但是回调函数中没有定义任何操作,因此将我们要实现的功能编写在回调函数中。


*关于强弱符号的详细定义见:强符号 弱符号。


在main.c中添加下列程序:


/* USER CODE BEGIN 4 */

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

if(GPIO_Pin==KEY_UP_Pin)

{

for(long i = 1;i<72000;i++){}; //消除抖动

if(HAL_GPIO_ReadPin(KEY_UP_GPIO_Port,KEY_UP_Pin)==1)

{

HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);

}

}

else if(GPIO_Pin==KEY_DOWN_Pin)

{

for(long i = 1;i<72000;i++){};

if(HAL_GPIO_ReadPin(KEY_DOWN_GPIO_Port,KEY_DOWN_Pin)==0)

{

  HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);

}

}

else if(GPIO_Pin==KEY_LEFT_Pin)

{

for(long i = 1;i<72000;i++){};

if(HAL_GPIO_ReadPin(KEY_LEFT_GPIO_Port,KEY_LEFT_Pin)==0)

{

HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);

}

}

else if(GPIO_Pin==KEY_RIGHT_Pin)

{

for(long i = 1;i<72000;i++){};

if(HAL_GPIO_ReadPin(KEY_RIGHT_GPIO_Port,KEY_RIGHT_Pin)==0)

{

HAL_GPIO_TogglePin(LED4_GPIO_Port,LED4_Pin);

}

}

__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);

}

/* USER CODE END 4 */

在编程中一般不在中断函数中添加延时函数,(这里有个BUG:当PA0按下时,只要进入HAL_delay函数就无法跳出循环,解决未果,因此用上面的for循环代替了延时函数,实现消抖的功能)。


以KEY_UP按下为例:当KEY_UP按键按下后,


“GPIO_Pin==KEY_UP_Pin”

进入for循环(相当于小型的延时函数),循环一段时间后判断KEY_UP管脚是否仍未高电平:


“HAL_GPIO_ReadPin(KEY_UP_GPIO_Port,KEY_UP_Pin)==1”

这里因为UP管脚是高电平触发,其余管脚是低电平触发,因此判断条件不同。


若此时KEY_UP仍为高电平,说明不是抖动引起,则改变对应LED的状态:


“HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin)”

最终在退出函数时要清除中断标志位,避免对下次按键的判断造成影响。


至此,编译后无错并下载到开发板中,就完成了通过STM32CubeMX调用HAL库实现按键控制LED的效果程序。


关键字:STM32CubeMX  GPIO按键  外部中断  控制LED 引用地址:STM32CubeMX学习笔记2:GPIO按键外部中断控制LED状态

上一篇:STM32Cube MX学习二--定时器、外部中断
下一篇:Key按键中断之STM32CubeMX 生成和代码编写

推荐阅读最新更新时间:2024-11-12 15:51

基于无线传感技术的LED路灯节能控制系统设计
我国的城市照明伴随着我国城市化进程的加速,得到了快速的发展。但是,城市照明发展中的能源需求和消耗也在不断加大。总体上看,绿色照明工作还存在高能耗、高污染、低效率等问题。 据调查,我国当前的路灯以低效照明为主,电能利用率低。 针对照明中存在的污染严重、电能浪费、能耗密度高、照明效能低等问题,研究路灯节能控制系统,推动路灯照明节能节电,将对绿色照明的全面发展起到积极的推进作用。 1 当前路灯照明系统存在的不足 现代社会,成为城市魅力名片和窗口的路灯照明,缔造了辉煌绚丽的城市文明,也带来了一些问题。能源耗费已经成为制约当前路灯系统发展的关键所在。 1.1 电压波动大---运行浪费 由于电网负荷的变化随着时段的不同而不同,因此,相应的
[电源管理]
基于无线传感技术的<font color='red'>LED</font>路灯节能<font color='red'>控制</font>系统设计
基于MSP430G2553的IO外部中断配置说明
这一篇文章将说明MSP430G2553的IO中断配置,整个P1的IO都可以配置IO中断,但中断处理函数只有一个,MSP430和大多数MCU一样提供上升沿、下降沿选择。 在Launchpad上有按键S2,接在P1.3口,当按下后P1.3将接入高电平,从而触发中断。 在实例代码中,配置了P1.3和P1.6的LED灯,当按下P1.3的按键产生中断,LED灯将切换点亮 1.按键的中断配置 要配置按键中断,需要先设置P1.3口为输入,并且设置上拉电阻以保障稳定性, P1DIR &= ~BIT3;//设置P1.3为输入 P1REN |= BIT3;//启用P1.3电阻 在启用电阻后,由P1OUT来配置下拉还是上拉 P1OUT |=
[单片机]
基于MSP430G2553的IO<font color='red'>外部中断</font>配置说明
基于LM3402的新型LED无影灯控制系统设计
无影灯是用来照明外科手术部位不可缺少的重要设备,要求能以最佳地观察处于切口和体腔中不同深度、大小、对比度低的物体。因此,除需要“无影”以外,还需要光照度均匀、光质好,能够很好地区分血液与人体其他组织、脏器的色差。此外,无影灯还须能长时间地持续工作,而不散发出过量的热,因为过热会使手术者不适,也会使处在外科手术区域中的组织干燥 。 目前手术灯一般都采用环形节能灯或卤素灯,但随着发光二极管LED技术的不断发展,特别是高亮度白光LED的发展,LED无影灯彻底解决了环形节能灯自身存在的先天缺陷,是环形节能灯的升级换代产品。目前,LED无影灯的优越性逐渐被显微镜使用者所了解和接受,使用成本亦较环形节能灯低,减少了每1~2 个月就需更换环形灯
[电源管理]
基于LM3402的新型<font color='red'>LED</font>无影灯<font color='red'>控制</font>系统设计
stm32按键控制led灯亮灭
在嵌入式系统中,硬件按键常常被用作开关输入,控制LED灯亮灭。在STM32系列单片机中,有多种方式实现按键控制LED灯亮灭,我们将介绍其中一种较为简单的方法。 一、STM32开发环境搭建 1. 软件环境搭建 首先,需要在计算机中下载安装Keil MDK开发环境,以实现对STM32单片机的编写、编译、烧录等操作。同时,还需要下载对应的STM32CubeMX软件,用于生成代码、初始化硬件等操作。 2. 硬件环境搭建 将STM32单片机与相应的按键和LED灯连接。本实验使用的STM32是STM32F103C8T6,按键使用的是按钮开关,LED灯使用的是红色和蓝色通用的LED灯。 二、STM32按键控制LED灯亮灭实验步骤 1. 打开ST
[单片机]
STM32 外部中断/事件控制EXTI
EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的20个中断/事件线。每个中断/事件线都有一个边缘检测器,可以实现对输入信号的上升沿或下降沿检测。EXTI可以实现对每个中断/事件线进行单独的配置,可以单独配置为中断或者事件,以及触发事件的属性。 如下图所示,为EXTI的功能框图。EXTI有两个功能,一个是产生中断,一个是产生事件,下面我们将对这两个功能进行讲解。 1.中断产生 如上图所示,红色虚线指示的是一个产生中断的线路,最终流入到NVIC中断控制器内。 编号1是输入线,可以指定到任意的GPIO,也可以是一些外设事件,输入线一般是存在电平变化的信号
[单片机]
STM32 <font color='red'>外部中断</font>/事件<font color='red'>控制</font>器<font color='red'>EXTI</font>
基于STM32F407库函数开发按键控制LED
按键控制灯的亮与灭的效果图: 一、寄存器开发与库函数开发的优缺点 1、寄存器开发 缺点: (1)开发难度大,查阅相关手册比较多 (2)开发效率相对低,产品周期长 (3)可维护性较差 (4)可移植性、阅读性差 优点: 运行效率高。 2、库函数开发 优点: (1)开发难度小,有库函数封装,即可实现功能 (2)开发效率高,产品周期短 (3)可维护性高 (4)可移植性、阅读性强 缺点: 运行效率相对寄存器低一些。 STM32库函数实际是ST公司对寄存器开发封装。 二、LED库函数开发 LED库开发要添加库文件:stm32f4xx_gpio.c (1)原理图可参看上篇文章:入门篇 | STM32F407寄存器开发--点灯 (2)
[单片机]
基于STM32F407库函数开发<font color='red'>按键</font><font color='red'>控制</font><font color='red'>LED</font>灯
STM32单片机(2) 外部中断
学习资料 李想stm32视频教程49集 http://pan.baidu.com/s/1kTyt03P STM32的中断(上中下)外部中断(寄存器、库函数) STM32的函数说明(中文).pdf http://download.csdn.net/detail/leytton/7630851 中断管理函数.pdf http://wenku.baidu.com/view/b90e5b82360cba1aa811dad3.html 概念基础 STM32共76个中断,16个内核中断,60个外部中断,即可屏蔽中断 中断分5组:0-4,所有中断只能放在同一组里 ISER 、ISER 是32位的中断使能寄存器数组,ISER 的bi
[单片机]
STM32单片机(2) <font color='red'>外部中断</font>
用51单片机中断控制LED灯亮灭
#include reg51.h //头文件 sbit LED=P2^0;//位定义LED灯 sbit k3=P3^2;//位定义按键 void delay()//延时函数 { unsigned char a,b; for(a=0;a 200;a++) for(b=0;b 200;b++); } void Int0()//使用中断所做的处理函数 { IT0=1;//外部中断0下降沿触发 EX0=1;//打开外部中断0 EA=1;//打开总中断 } void main()//主函数 { Int0();//调用函数 while(1); } void ledxs() interrupt
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved