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

news2024/11/17 21:30:15

一、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.coloradmin.cn/o/1955854.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何利用开源Bug管理系统提高团队效率

国内外主流的10款开源bug管理系统对比:PingCode、Worktile、Trac、WebIssues、MantisBT、Bugzilla 、Fossil、The Bug Genie、TestLink 、OpenProject。 在软件开发的复杂世界中,Bug管理可能是一个令人头疼的问题,尤其是当工具不足以捕捉和解…

C语言进阶版—扫雷游戏

文章目录 1. 打印棋盘2. 游戏逻辑3. 游戏框架3.1 打印菜单3.2 do……while实现主逻辑3.3 创建棋盘3.4 初始化棋盘3.5 设置雷3.6 排查雷 完整游戏代码 1. 打印棋盘 在正式讲解扫雷游戏之前,我们简单来看一下打印出来的棋盘.   第一步我们要打印每行的框架 printf…

一文带你读懂TCP

文章目录 1 TCP协议1.1 TCP 基础1.1.1 TCP 特性1.2.2 TCP连接数 1.2 TCP 头1.2.1 TCP 头格式1.2.2 MTU,MSS,分片传输 1.3 TCP 连接三路握手1.4 TCP 断开四次挥手1.5 SYN攻击和防范1.6 重传机制1.6.1 超时重传1.6.2 快速重传1.6.3 SACK 1.7 滑动窗口1.8 流…

【Vulnhub系列】Vulnhub_DC-1靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_DC-1靶场渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、环境准备 1、在百度网盘中下载DC-1靶场。DC-1靶场受virtual box 的影响,在VM中直接打开是扫描不到IP 的…

基于Java的微博传播分析系统的设计与实现

1 项目介绍 1.1 摘要 本文致力于展示一项创新的微博传播分析系统设计与应用研究,该系统基于Java技术,巧妙利用大数据环境下的社交媒体——微博的庞大用户群及高度活跃特性,旨在深度探索信息传播的内在逻辑与社会影响机制。研究开篇明确定了…

【网络安全】文件上传黑白名单及数组绕过技巧

不安全的文件上传(Unsafe FileUpload) 不安全的文件上传是指Web应用程序在处理用户上传的文件时,没有采取足够的安全措施,导致攻击者可能利用这些漏洞上传恶意文件,进而对服务器或用户造成危害。 目录 一、文件上传…

20240729 每日AI必读资讯

Meta科学家最新采访,揭秘Llama 3.1是如何炼成的 - Llama 3.1都使用了哪些数据?其中有多少合成数据?为什么不使用MoE架构?后训练与RLHF流程是如何进行的?模型评估是如何进行的? - 受访者Thomas Scialom现任…

在Android上实现汉字笔顺动画效果——HanZiWriter

序,万般皆是命,半点不由人。 Hanzi Writer 是 javascript 免费开源库,根据汉字书写时按照笔画顺序的特征,可以播放正确笔画顺序的描边动画和练习测试。支持简体字和繁体字。可以让全球用户能够通过手绘模仿的方式来学习和练习书写…

复杂系统的动态演化与自相似性探究——揭示系统内部的结构与行为模式

复杂系统的动态演化与自相似性探究——揭示系统内部的结构与行为模式 动态演化与自相似性的核心思想 想象一下,你正在观察一棵树的生长。随着时间的推移,树会不断长高,长出新的叶子和枝条。这就是动态演化。同时,你会发现树的每一…

甄选范文“论企业集成架构设计及应用”软考高级论文,系统架构设计师论文

论文真题 论企业集成架构设计及应用企业集成架构(Enterprise Integration Arhitecture,EIA) 是企业集成平台的核心,也是解决企业信息孤岛问题的关键。企业集成架构设计包括了企业信息、业务过程、应用系统集成架构的设计。实现企业集成的技术多种多样,早期的集成方式是通过…

LexLIP——图片搜索中的多模态稀疏化召回方法

LexLIP——图片搜索中的多模态稀疏化召回方法 FesianXu 20240728 at WeChat Search Team 前言 最近笔者在回顾&笔记一些老论文,准备整理下之前看的一篇论文LexLIP,其很适合在真实的图片搜索业务场景中落地,希望笔记能给读者带来启发。如…

业务记录:处理动态表头的CSV/EXCEL文件

业务描述:传入一个动态表头的CSV文件,解析CSV,并保存入库。 CSV文件的表头是不确定的,即顺序和字段个数不确定,以及表头是中文字段。 例如: 为了顺利解析CSV文件,前端需要传入对应的字段名和顺…

Qwen-VL全文翻译(from GPT-4o)

目录 Abstract1 Introduction2 Methodology2.1 Model Architecture2.2 Inputs and Outputs 3 Training3.1 Pre-training3.2 Multi-task Pre-training3.3 Supervised Fine-tuning 4 Evaluation4.1 Image Caption and General Visual Question Answering4.2 Text-oriented Visual…

01 Go Web基础_20240728 课程笔记

概述 如果您没有Golang的基础,应该学习如下前置课程。 基础不好的同学每节课的代码最好配合视频进行阅读和学习,如果基础比较扎实,则阅读本教程巩固一下相关知识点即可,遇到不会的知识点再看视频。 视频课程 最近发现越来越多…

【算法专题】双指针算法之18. 四数之和(力扣)

欢迎来到 CILMY23的博客 🏆本篇主题为:双指针算法之18. 四数之和(力扣) 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算…

网络安全威胁情报是什么,它对代工生产(OEM)意味着什么?

随着汽车数字环境的不断变化,网络安全基础设施及其面临的威胁也日趋复杂。 为了更好地识别、理解并最终预防这些风险,网络安全威胁情报(CTI)的管理应是一个综合多方面的过程。 以下是CTI对OEM的意义,以及如何利用网络…

代码随想录算法训练营第40天|LeetCode 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

1. LeetCode 198.打家劫舍 题目链接:https://leetcode.cn/problems/house-robber/ 文章链接:https://programmercarl.com/0198.打家劫舍.html#算法公开课 视频链接:https://www.bilibili.com/video/BV1Te411N7SX 思路: 递推公式&a…

Profinet从站转TCP/IP协议转化网关(功能与配置)

如何将Profinet和TCP/IP网络连接通讯起来呢?近来几天有几个朋友问到这个问题,那么作者在这里统一说明一下。其实有一个不错的设备产品可以很轻易地解决这个问题,名为JM-DNT-PN。接下来作者就从该设备的功能及配置详细说明一下。 一,设备主要…

相机镜头移动特效视频转场模板Pr工程文件

Pr转场模板,相机镜头移动特效视频转场Pr工程文件 逼真的相机移动:具有一系列动态相机移动功能,包括平移、倾斜、缩放和旋转,为您的过渡添加逼真和引人入胜的视觉元素。 无缝集成:以.prproj文件形式提供,便…

操作系统——进程深度理解

目录 一、操作系统 1、概念 2、操作系统的结构 3、操作系统的理解 二、进程 一、操作系统 1、概念 操作系统是一个软件,一款进行软硬件资源管理的软件 电脑开机的时间,就是把操作系统加载到内存并运行的过程。 对操作系统广义的认识:…