前言
更新日志
版本:2022.03.07 Ver1.0.0
版本:2022.03.08 Ver1.1.0 追加RGB版本
简介
一般而言,作为最基础部分,核心板或者开发板上都会有LED灯。
在STM32学习的一开始,让我们来尝试点亮一个LED灯。
博主使用的是自研制的STM32L431RCT6试作型板。
LED灯部分为RGB灯,与单色LED原理基本相同。
查看原理图
首先需要查看核心板或开发板上LED部分的原理图:
(参考手册、用户手册、datasheet、原理图这些是真的必不可少)
例如,博主这里的是共阳极(一般都是如此,拉高/低一侧电平)。
当LED1/2/3(对应引脚)处于低电平状态(数字信号0)时,LED灯会导通发光;
当LED1/2/3(对应引脚)处于高电平状态(数字信号1)时,LED灯会截止熄灭。
CubeMX的配置
找到板子上LED对应的端口 右键 并 选择 GPIO_Output一项,即设置该引脚端口为GPIO输出模式。
在GPIO里可以设置相应Label进行对相应引脚名称替换(推荐做这步)。
配置 外部晶振 、下载方式 与 时钟
具体参考STM32集成开发环境 STM32CubeIDE 安装与配置指南
生成代码
主代码
打开main.c
下面这步是我偷懒办法
我们来define一下相应的GPIO操作
注意此步需添加在 ↓ 之间,否则更新CubeMX的时候区域外的内容会被刷新丢失掉
/ * USER CODE BEGIN PD * /
/ * USER CODE END PD * /
↓该语句对应为对label为LED1的端口输出RESET(低电平,数字信号0);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET)
这一语句已经实现了点亮LED的操作
SET相应的就是高电平,数字信号1。
//LED1 SETTING
#define LED1_ON HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET)
#define LED1_OFF HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET)
在while中,添加LED代码
注意此步需添加在 ↓ 之间,否则更新CubeMX的时候区域外的内容会被刷新丢失掉
/ * USER CODE BEGIN 3 * /
/ * USER CODE END 3 * /
刷新一下发现自己辛辛苦苦写的一大串啪的一下就消失了是多么惨痛的体验
LED1_ON;
HAL_Delay(1500);
LED1_OFF;
HAL_Delay(1500);
构建Debug与调试
代码编写完毕后,开始构建Debug
待到构建完成后,连接ST-LINK(可能会显示更新ST-LINK驱动,显示DFU-MODE、RESTART等字样时,拔插一遍ST-LINK即可进行upgrade)
基本保持默认设置即可
这里需要注意的是,使用ST-LINK的话,选择调试配置 > 调试器 下 ST-LINK(ST-LINK GDB server)(这里可能会弹出需要安装下这个GDB server)和SWD
然后再次点击Debug图标
显示下载成功
演示
复位(RESET)即可
RGB版本
首先参考
STM32CubeIDE开发笔记 MK.II - ST-LINK调试 与 外部驱动库的建立
建立相应 头文件 和 源文件
参照DataSheet 找到RGB对应脚
博主这边 1对应R 2对应G 3对应B
在CubeMX做相应修改
添加 RGB_LED.h RGB_LED.c
RGB_LED.h
/*
* RGB_LED.h
*
* Created on: Mar 8, 2022
* Author: KeeganKei
*/
#ifndef INC_RGB_LED_H_
#define INC_RGB_LED_H_
//RGB-LED setting
void RGB_LED_SET(uint16_t L_RGB);
#endif /* INC_RGB_LED_H_ */
RGB_LED.c
/*
* RGB_LED.c
*
* Created on: Mar 8, 2022
* Author: KeeganKei
*/
#include <stdio.h> //uint8_t import
#include <main.h> //GPIO_Port import
//LED_R setting
#define LED_R_ON HAL_GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin,GPIO_PIN_RESET)
#define LED_R_OFF HAL_GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin,GPIO_PIN_SET)
//LED_G setting
#define LED_G_ON HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_RESET)
#define LED_G_OFF HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_SET)
//LED_B setting
#define LED_B_ON HAL_GPIO_WritePin(LED_B_GPIO_Port,LED_B_Pin,GPIO_PIN_RESET)
#define LED_B_OFF HAL_GPIO_WritePin(LED_B_GPIO_Port,LED_B_Pin,GPIO_PIN_SET)
void RGB_LED_SET(uint16_t L_RGB)
{
switch(L_RGB)
{
case 000:
{
LED_R_OFF;
LED_G_OFF;
LED_B_OFF;
break;
}
case 001:
{
LED_R_OFF;
LED_G_OFF;
LED_B_ON;
break;
}
case 010:
{
LED_R_OFF;
LED_G_ON;
LED_B_OFF;
break;
}
case 011:
{
LED_R_OFF;
LED_G_ON;
LED_B_ON;
break;
}
case 100:
{
LED_R_ON;
LED_G_OFF;
LED_B_OFF;
break;
}
case 101:
{
LED_R_ON;
LED_G_OFF;
LED_B_ON;
break;
}
case 110:
{
LED_R_ON;
LED_G_ON;
LED_B_OFF;
break;
}
case 111:
{
LED_R_ON;
LED_G_ON;
LED_B_ON;
break;
}
default:
{
LED_R_OFF;
LED_G_OFF;
LED_B_OFF;
break;
}
}
}
在main.c添加 include 和 LED代码
后记
emmmmmm 这次似乎没什么好说的
我们 MK.II 见 (つ´ω`)つ
追加了一个RGB版本
RGB灯比单色好看多了 ┐(๑¯∀¯๑)┌