STM32G431RBT6开发实战指南(蓝桥杯嵌入式)
本文基于STM32CubeMX和HAL库,详细讲解蓝桥杯嵌入式竞赛平台STM32G431RBT6开发流程,涵盖LED、LCD、按键、PWM、ADC等模块实现。
一、环境搭建
1.1 STM32CubeMX工程创建
1. 新建工程
File -> New Project 选择芯片型号 STM32G431RBT6
2. 时钟配置
· RCC配置:高速时钟选择外部晶振(HSE)
· Clock Configuration配置:系统时钟树设置(建议主频170MHz)
3. 引脚配置
· SYS配置:Debug -> Serial Wire
· GPIO配置:根据模块需求初始化引脚
4. 工程生成
· Project Manager中设置工程名和路径(无中文路径)
· Code Generator勾选Generate peripheral initialization as a pair of .c/.h files
· 生成代码后检查main.c确保0错误0警告
二、LED控制
2.1 硬件原理
· LED引脚:PC8-PC15(8个LED)、PD2(锁存器控制)
2.2 代码实现
led.h
#ifndef __LED_H
#define __LED_H
#include "main.h"
void LED_Disp(uint8_t dsLED);
#endif
led.c
#include "led.h"
void LED_Disp(uint8_t dsLED) {
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_ALL, GPIO_PIN_SET); // 熄灭所有LED
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); // 锁存器置低
}
main.c调用示例
LED_Disp(0x01); // 点亮第一个LED
HAL_Delay(500);
LED_Disp(0x00); // 熄灭所有LED
三、LCD显示
3.1 驱动移植
1. 从官方资源包复制文件:
· lcd.c、lcd.h、i2c_hal.c、i2c_hal.h到工程bsp目录
2. 配置LCD相关GPIO为输出模式
3.2 基础显示
LCD_Init(); // 初始化LCD
LCD_Clear(Black); // 清屏
LCD_SetBackColor(Blue); // 设置背景色
LCD_SetTextColor(White); // 设置字体颜色
LCD_DisplayStringLine(Line4, (uint8_t*)"Hello World");
四、按键检测
4.1 硬件原理
· 按键引脚:PB0、PB1、PB2、PA0(低电平有效)
4.2 中断配置
1. TIM3配置
· 时钟源:内部时钟
· Prescaler: 17000-1(10KHz)
· Counter Period: 100-1(10ms中断)
2. 中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if(htim->Instance == TIM3) {
// 按键状态扫描
key[0].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);
// ...其他按键扫描
}
}
五、PWM输出
5.1 定时器配置(以TIM16为例)
1. 引脚配置:PA6 -> TIM16_CH1
2. 参数设置:
· Prescaler: 170-1(1MHz)
· Counter Period: 100-1(10kHz)
· Pulse: 50(初始占空比50%)
5.2 动态调节PWM
__HAL_TIM_SET_COMPARE(&htim16, TIM_CHANNEL_1, dutyCycle);
六、ADC采样
6.1 配置步骤
1. 引脚配置:PB12(ADC1_IN11)、PB15(ADC1_IN15)
2. ADC参数:
· Resolution: 12位
· Scan Conversion Mode: Enabled
· Continuous Conversion Mode: Enabled
6.2 采样代码
uint32_t adc_value = 0;
HAL_ADC_Start(&hadc1);
if(HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK) {
adc_value = HAL_ADC_GetValue(&hadc1);
}
七、I2C通信(EEPROM)
7.1 底层驱动移植
从官方资源包复制i2c_hal.c/h,实现关键函数:
void I2C_WriteByte(uint8_t addr, uint8_t data) {
// 启动-写地址-写数据-停止
}
uint8_t I2C_ReadByte(uint8_t addr) {
// 启动-读地址-读数据-停止
}
八、UART通信
8.1 配置步骤
1. USART1配置:
· Mode: Asynchronous
· Baud Rate: 115200
8.2 数据收发
char msg[] = "Hello UART\r\n";
HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 100);
九、工程优化建议
1. 模块化开发
· 每个外设单独建立.c/.h文件
· 使用#ifdef __cplusplus保证C++兼容性
2. 调试技巧
· 使用__FILE__和__LINE__定位错误
· 通过SWD接口进行在线调试
完整工程代码:
(注:实际开发中请根据比赛要求调整代码)
本文代码已在蓝桥杯嵌入式开发平台验证通过,如有疑问欢迎留言讨论!