学习调试:CubeMX点亮LED灯+按键点亮LED灯0.5ms后熄灭+使用User Lable提高代码的重用性

server/2024/10/20 20:39:40/

一、CubeMX 点亮 LED 灯

1.1 CubeMX 中操作

1、打开 CubeMX → file → new project 新建一个工程→ 搜索框里输入芯片型号→双击选择芯片对应封装等待 

2、根据上面深蓝/浅蓝的导航对 IO 口进行配置:

(1)Pinout & Configuration(引脚和配置):板子上连接 LED 的 IO 口是 PB5,点击 PB5,设置为GPIO output。

(2)Clock Configuration(时钟配置):使用外部时钟的最快频率。

(3)Project Manager(项目管理)

根据竖边的导航 :

① Project

  1. 给项目取名、设置工程路径。
  2. 选择 IDE: MDK-ARM V5

②Code Generator

一定要将 Generated fies 中的第一个给勾上。

(译为:以每个外围设备的一对“.c/.h”文件的形式生成外围设备初始化)

③Advanced Settings

无操作,默认第一个勾上。

3、点击最上面蓝条 GENERATE CODE ,生成代码。

4、close 关闭弹窗。

1.2编写核心代码

1、代码地址:C:\Users\chenlDesktopltest\CubeMX\test1\MDK-ARM\test.uvprojx-μVision

2、用 CubeMX 对 GPIO 的设置都放在了 gpio.c  文件下, CubeMX 已经自动生成了这部分初始化代码。

3、想要点亮 LED 的话,需要在 main.c 里进行编写。以下代码是实现 3 个 LED 每 500ms 的闪烁。

  /* USER CODE BEGIN WHILE */while (1){HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_RESET);HAL_Delay(500);HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_SET);HAL_Delay(500);/* USER CODE END WHILE */

注意:

  1. 必须在 CODE BEGIN 和CODE END 之间编写代码,在调试后修改才不会丢失。
  2. 注意一下括号中的 3 部分。
  3. 注意同时写 3 个引脚的方式。

二、按键点亮 LED 灯 500ms 后熄灭

2.1任务分析

  1. 按下按键:Input 的过程\平时是高电平,用来检测低电平,就是上拉输入
  2. 点亮 LED 灯 :Output 的过程\平时是低电平,用来检测高电平,就是下拉输出
  3. 500ms : 延时的过程
  4. 熄灭 :Output 的过程

2.2 CubeMX 中操作

1、打开 CubeMX → file → new project 新建一个工程→ 搜索框里输入芯片型号→双击选择芯片对应封装等待 

2、根据上面深蓝/浅蓝的导航对 IO 口进行配置:

(1)Pinout & Configuration(引脚和配置):控制 LED 的 IO :PE4、PE5、PE6 配置成输出,控制开关的 IO :PE0、PE1、PE2 配置成输入。

在下图 1 中点击 2 配置上面的内容,还需要点击 3,选中 4 中的 GPIO 输出进行进一步配置,如 5所示。

框5 放大翻译版

(2)Clock Configuration(时钟配置):使用外部时钟的最快频率。

必须在 RCC 中选择使用外部时钟才有下一步的选择
在时钟配置中选择 72 为最快时钟

后面的内容与上面 1.1 中一模一样。

2.3编写核心代码

1、实现 3 个按键分别控制点亮 3 个 LED灯 500ms 后熄灭代码地址:C:\Users\chenlDesktopltest\CubeMX\test2\MDK-ARM\test2.uvprojx-μVision

  /* USER CODE BEGIN WHILE */while (1){if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0)==GPIO_PIN_RESET){ /* if 判断 */while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0)== GPIO_PIN_RESET );  /* 松手检测 */HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_SET);/* 点亮 */HAL_Delay(500);/* 延时 */HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET);/* 熄灭 */}if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_1)==GPIO_PIN_RESET){while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_1)== GPIO_PIN_RESET ); HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);HAL_Delay(500);HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET);}if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==GPIO_PIN_RESET){while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)== GPIO_PIN_RESET ); HAL_GPIO_WritePin(GPIOE,GPIO_PIN_6,GPIO_PIN_SET);HAL_Delay(500);HAL_GPIO_WritePin(GPIOE,GPIO_PIN_6,GPIO_PIN_RESET);}/* USER CODE END WHILE */

注意:

  1. 自己的项目中按键模块使用了一款芯片,可以有自己的模式配置,这里没有用到,后续有机会探究。
  2. 这里的 3 个按键和 3 个 LED 灯必须写成 3 个 if ,不能像 1.2 中的一样,写成一个部分。

按键控制LED灯

三、使用User Lable提高代码的重用性

3.1引入

在以上的代码中,如果 3 个按键不是用于 LED 灯的点亮,而是改成分别用于电机的正转、反转、停转或者其他复用功能,就需要非常繁琐的修改代码,这说明代码的重用性很低,这就需要用 User Label (用户标签)来提升代码的重用性。

User Label (用户标签):在 main.h 中生成 define 语句。

3.2 CubeMX 中操作

将 LED 灯添加标签:LED1,LED2,LED3。

将按键灯添加标签:KEY1,KEY2,KEY3。

图3.1

操作完毕后,再次打开文件已经更新。

再次打开 Keil 中 main.h 文件,可以看见私有定义:

修改 main.c 文件如下:

说明:

GPIOE 变成对应的 XXXn_GPIO_Port ,GPIO_PIN_n 变成对应的 XXXn_Pin。
(其中,XXX 为 KEY 或者 LED,n=1,2,3)

你可能会疑惑,改变后的代码在功能上没有任何的变化,那为什么还要改变呢?

请你设想,如果我现在需要用按键 2,3,4 来点亮灯 1,2,3 了,不再是按键 1,2,3 了,按照之前的代码就需要再 CubeMX 中先释放之前的引脚,重新配置引脚,再修改代码中所有含引脚序号的位置,但是使用现在这个代码,我只要在图 3.1 中修改对应的按键 1,2,3,4 的 User Lable 即可。

这个例子不太明显,不能真正体现 User Lable ,大家在后续更复杂的工程可能更有体会,现在了解即可。


调试学习是根据以下视频进行学习,感谢每一位讲课的好老师,如有侵权,敬请联系。

STM32系列视频(CubeMX+MDK5+HAL库+库函数一站式学习)_哔哩哔哩_bilibili


http://www.ppmy.cn/server/90164.html

相关文章

【BUG】已解决:IndexError: positional indexers are out-of-bounds

IndexError: positional indexers are out-of-bounds 目录 IndexError: positional indexers are out-of-bounds 【常见模块错误】 【解决方案】 原因分析 解决方法 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博…

RabbitMQ入门详解

前言 本篇文章将详细介绍rabbitmq的基本概念知识,以及rabbitmq各个工作模式在springboot中如何使用。 文章目录 介绍 简介 RabbitMQ 核心 生产者与消费者 Exchange Queue 工作模式 简单模式 工作队列模式 发布订阅模式 路由模式 主题模式 SpringBoot中…

FFmpeg解复用器如何从封装格式中解析出不同的音视频数据

目录 1、ffmpeg介绍 2、FFMPEG的目录结构 3、FFmpeg的格式封装与分离 3.1、数据结构 3.2、封装和分离(muxer和demuxer) 3.2.1、Demuxer流程 3.2.2、Muxer流程 4、总结 4.1、播放器 4.2、转码器 C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续…

Linux定时同步系统时间到硬件时间

Linux定时同步系统时间到硬件时间 1. 系统时间、软件时间 系统时间 (System Time): 一般说来就是我们执行 date命令看到的时间,linux系统下所有的时间调 用(除了直接访问硬件时间的命令)都是使用的这个时…

LeetCode //C - 257. Binary Tree Paths

257. Binary Tree Paths Given the root of a binary tree, return all root-to-leaf paths in any order. A leaf is a node with no children. Example 1: Input: root [1,2,3,null,5] Output: [“1->2->5”,“1->3”] Example 2: Input: root [1] Output: […

昇思MindSpore 应用学习-GAN图像生成-CSDN

模型简介 生成式对抗网络(Generative Adversarial Networks,GAN)是一种生成式机器学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。 最初,GAN由Ian J. Goodfellow于2014年发明,并在论文Generative Adversarial Nets中…

docker常用命令总结

Docker 的常用命令可以大致分为几大类:启动类、镜像类、容器类、网络类以及其他一些辅助命令。以下是对这些常用命令的详细归纳: 一、启动类命令 启动 Docker:systemctl start docker关闭 Docker:systemctl stop docker重启 Doc…

Redisson分布式锁使用详解

引言 日常开发中,难免遇到一些并发的场景,为了保证接口执行的一致性,通常采用加锁的方式,因为服务是分布式部署模式,本地锁Reentrantlock和Synchnorized这些就先放到一边了,Redis的setnx锁存在无法抱保证原…