历史上的今天
今天是:2025年05月20日(星期二)
2020年05月20日 | 按键操作(CubeMX加HAL库学STM32系列)
2020-05-20 来源:eefocus
这一篇是补充第一篇的按键操作, 因为第一篇很多地方很详细了, 写了很大的篇幅, 所以单独写一篇用CubeMX配置STM32使用自带按键的操作
提示 : 仍然按照先Cube配置再IAR或者Keil编程, CubeMX里面关于时钟的配置跟我上一篇写的一样, RCC和SYS设置以及时钟树(Clock Configuration)都按照第一篇配置即可, 没有什么特别的需求, 是从始至终不需改变这个地方的配置的。
1-2. 使用核心板自带按键
操作简介 : 通过板子上的两个按钮控制LED灯的亮灭 WK_UP按键按下则LED0闪烁, 松开停止闪烁并熄灭, 即WK_UP按键长按LED0才会持续闪烁 KEY0按下再松手, LED1就亮, 再按下一次LED1就灭, 类似于开关的功能,每按一次KEY0键, LED1状态翻转一次
Step1 (1) 新建工程(New Project)---->搜索自己所用的MCU型号(我的是STM32F407zg系列) 这里我直接把前面的工程拿来用, 添加对按键对应引脚的配置即可 这里关于引脚上拉下拉解释一下: 可以看到, 当WK_UP按下时, +3.3v就进入PA0, 而KEY0按下时, PE4就会变为低电平。 所以WK_UP相当于有一个下拉电阻. 我在图里标注了两个额外的上下拉电阻, 便于理解清晰 此外, 电阻是上拉还是下拉是看通过这个电阻, 电流是注入引脚 (就是下拉) 还是从引脚流出 (即上拉) 1、比如WK_UP对应那个地方, 通过那个电阻将WK_UP那一边钳在了低电平, 所以是下拉电阻 2、同理, KEY0那个对应引脚, 相当于是有一个另一端接VCC的电阻, 从而在KEY0那个按键没有按下的时候, KEY0引脚被钳在了高电平, 那个电阻还起着限流的作用 (2) 引脚配置 这里我们将按键都设置为输入引脚, 因为对应按键按下之后, 一个会给对应引脚输入高电平, 一个会输入低电平, 都会给引脚输入一个信号, 所以设置为输入GPIO_Input 根据前面的上下拉讲解, 应该知道, WK_UP对应的PA0引脚应设置为内部下拉(Pull-down) KEY0对应PE4引脚内部设置为上拉(Pull-up) 具体配置见下图展示 同理配置KEY0对应的PE4 配置完成后点击 Generate Code---->Open Project (3) 部分初始化代码展示 打开工程后, 我们先看一下多了哪些东西 在main.h 这里面也多了对引脚的宏定义, 因为我们自己给它起了个别名 Step2 (1) 功能代码编写 下面我直接把代码打出来, 便于复制 /* USER CODE BEGIN 3 */ // 在while(1)里面循环扫描, 判断读取的按键引脚状态 // 先读取WKUP引脚的电平 若为GPIO_PIN_SET(即WKUP得到了高电平, 表示这个按键按下了) if (HAL_GPIO_ReadPin(WKUP_GPIO_Port, WKUP_Pin) == GPIO_PIN_SET) { HAL_Delay(10); // 延时10ms, 做一个软件的消抖, 防止因抖动而检测到按键按下 if (HAL_GPIO_ReadPin(WKUP_GPIO_Port, WKUP_Pin) == GPIO_PIN_SET) { HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);// 点亮LED0 HAL_Delay(100); HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET); // 点亮LED0 HAL_Delay(100); } } // 下面扫描KEY0按键的引脚信号 if (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET) { HAL_Delay(10); // 延时10ms, 做一个软件的消抖, 防止因抖动而检测到按键按下 if (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET) { // 做一个松手检测, 若KEY0一直是RESET(低电平),则一直在死循环 // 当KEY0位SET才会跳出,进而继续执行下面的对 LED1 的操作 while(HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET); HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); } } } /* USER CODE END 3 */ HAL_GPIO_ReadPin这个函数就是去读取引脚的状态, 读取引脚是RESET(0)还是SET(非0) 在while(1)里面循环扫描, 如果发现按键按下, 就执行其内部的函数, 每次读取引脚电平后还要用HAL_Delay()函数做一个小延时, 作为软件消抖,消除按键意外抖动出现的结果 (2) 功能函数解释 (3) 实际效果展示
史海拾趣
|
天祥 (protel升级版)Altium Designer 视频教程 5dvd AD6.9安装程序 AD6.9 Crack.rar AD6.9中文菜单修正文件.rar Altium.Designer.v6.9.12759.rar 免License操作说明.txt Altium Designer官方网站资料 Altium 宣传信息 Altium\'s DEMOcenter Vidios Altium官方资料 Training Manuals ...… 查看全部问答> |
|
跳不?”“危机来袭不能跳!” “跳吧!”“等形势好些咱在跳!” “跳啦……” 金融危机的阴霾逐渐散去,职场人越发地按捺不住跳槽的欲望。阳春三月,正值跳槽的黄金期,观望许久的职场人开始行 ...… 查看全部问答> |
|
我的定义过程。 1.在1.h文件中第一了一个结构体新的数据类型。 typedef struct { UINT32 Scope; UINT32 WaveSpeed; UINT32 Scale; &nb ...… 查看全部问答> |
|
急啊!x86上跑wince,加hive注册表后停留在开机画面 ,这是怎么回事。 加hive 注册表有些什么详细步骤?我只是加了组件和注册表里按照网上添加一些东西。我不知道它详细的步骤。!!!!!!… 查看全部问答> |
|
请问 bsp for powerpc in vxworks 5.5 在哪里可以下到? 从一家网站的ftp上下的只有12MB, 无法使用。Emule现在也无源。还有哪里可以下到呢? 非常感谢!… 查看全部问答> |
|
求把自己写的设备驱动程序编译进嵌入式arm Linux内核的具体方法? 自己写了个ds1307的设备驱动程序源代码(iic_ds1307.c),但是对编译内核的方法不是很了解,怎样把这段代码嵌入到arm linux 2.4.20的内核中?… 查看全部问答> |
|
诸位兄台:本人用的是quartus9.1 +matlab200+dsp builder 9.1 sp1,在破解dsp builder 9.1的时候,PortManager.dll总是破解不了,错误提示为:文件CRC校验错误,继续修补将会损坏原始文件。本人琢磨了很久,都无功而返,恳请各位大虾施以援手,感激 ...… 查看全部问答> |
|
一. 强调Verilog代码编写风格的必要性。 强调Verilog代码编写规范,经常是一个不太受欢迎的话题,但却是非常有必要的。 每个代码编写者都有自己的编写习惯,而且都喜欢按照自己的习惯去编写代码。与自己编写风格相近的代码,阅读起来容易接受和理 ...… 查看全部问答> |




