蓝桥杯–嵌入431RBT6(点亮一个LED篇)
蓝桥杯–嵌入式STM32G431RBT6(点亮一个LED篇)
前言
为自己学习蓝桥杯嵌入式开发板做记录,方便以后的复习得心应手!!!
工具
1、KEIL5软件
2、STM32CUBEMX
新建外设文件
①继新建工程后,我们需要回到STM32CUBEMX软件对开发板IO口输出模式进行设置,根据官方的原理图可以看出LED电路由74HC573锁存器构成一部分。控制LED的IO口为PC高位口,进而就会牵扯到后续的移位操作。
②设置IO口只需要在STM32CUBEMX软件进行设置即可,设置时需注意LED为低电平点亮,锁存器高电平触发,所以在初始电平设置为LED为高电平,锁存器为低电平。
③打开工程之后,IO口初始化代码如下(与标准库十分相像):
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
/*Configure GPIO pins : PC13 PC14 PC15 PC8
PC9 PC10 PC11 PC12 */
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pin : PD2 */
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
④添加外设代码,建议添加相关组以便于后期维护。
⑤文件架构如下图所示,注意到是在以后重新使用STM32CUBEMX软件生成代码时,需要注意外设文件弹框填写否按键。
⑥编写相关LED程序,代码如下。
//C文件
#include "led.h"
void LED_Disp(uchar dsLED)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
//头文件
#ifndef _LED_H_
#define _LED_H_
#include "main.h"
void LED_Disp(uchar dsLED);
#endif
//主函数
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
LED_Disp(0x8f);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
点亮一个LED代码展示
寻思为啥要进行这一步操作,感觉点一个灯应该不会很难吧,结果出乎我的意料,蓝桥杯嵌入式开发板是LED与LCD的外设使用的IO口是重复的,当我们使用LED的同时又使用了LED,一定会出现PC8–PC15的引脚电平处于不是我想设置的LED状态,所以我们在每次对LED进行所存时,都一定要对LED的状态做一个保存,然后下次写入的时候在做一个写入,写入之后在对想要修改的IO口进行修改,所以更新代码如下。
//LED处理函数
void LED_Process(u8 led_set,GPIO_PinState PIN_State)
{
HAL_GPIO_WritePin(GPIOC,led_state << 8,GPIO_PIN_SET);//写入上一次的电平状态
HAL_GPIO_WritePin(GPIOC,led_set << 8,PIN_State);//写入想要设置的LED IO口
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2, GPIO_PIN_SET);//将数据从锁存寄存器转至输出IO口
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2, GPIO_PIN_RESET);//将信号锁存至LED口
led_state = GPIOC->IDR >> 8; //存储本次设置完成的IO口灯的状态
}
效果演示
重点
①使用STM32CUBEMX软件进行IO的配置。
②STM32CUBEMX软件重新加载,需注意文件丢失问题。
③LED灯为PC口高八位口,需要进行数据移位操作。
④认真仔细。