1. 项目概述
拿到STM32L562开发板的第一天,我就被这块板子的低功耗特性吸引了。作为ST最新推出的Cortex-M33内核MCU,L5系列主打安全与低功耗,而这块Discovery Kit开发板(STM32L562E-DK)则为我们提供了完整的评估环境。今天我就带大家从最基础的外设开始,一步步体验这块板子的魅力。
开发板开箱后,最显眼的就是那块240x240的圆形TFT液晶屏,以及板载的ST-LINK调试器。我习惯性地先检查了板载资源:用户按键、LED灯、电容触摸按键这些基础外设一应俱全,还有加速度计、数字麦克风等扩展器件。对于初次接触STM32L5系列的开发者来说,从基础外设入手是最稳妥的选择。
2. 开发环境搭建
2.1 工具链准备
我选择了STM32CubeIDE作为开发环境,这是ST官方推出的免费IDE,基于Eclipse框架,集成了STM32CubeMX配置工具。安装过程很简单:
- 从ST官网下载最新版STM32CubeIDE(当前是1.8.0版本)
- 安装时勾选STM32L5系列支持包
- 安装完成后,通过Help > STM32Cube Repository检查固件库版本
注意:STM32L5系列需要使用HAL库1.3.0及以上版本,旧版本可能不支持部分外设。
2.2 工程创建
新建工程时选择"STM32L562E-DK"开发板模板,IDE会自动配置好时钟树和基本外设。这里有个小技巧:在Project Explorer中右键工程,选择"Properties > C/C++ Build > Settings",将优化等级改为-O0,这样调试时变量查看会更方便。
3. GPIO外设体验
3.1 LED控制
开发板上有两个用户LED:LD1(绿色)和LD2(红色)。查看原理图发现它们分别连接在PG12和PG11引脚。在CubeMX中配置这两个引脚为GPIO_Output模式后,生成代码。
控制LED的典型代码如下:
c复制HAL_GPIO_WritePin(GPIOG, GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET); // 熄灭LED
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_11, GPIO_PIN_RESET); // 点亮红色LED
HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_12); // 切换绿色LED状态
3.2 按键输入
板载的用户按键B1连接在PC13,配置为GPIO_Input模式。需要注意这个引脚具有唤醒功能,因此在CubeMX中要正确配置上下拉电阻:
c复制if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET) {
// 按键按下处理
}
4. 定时器应用
4.1 基本定时
使用TIM2实现1秒定时中断是个不错的起点。在CubeMX中配置TIM2:
- Clock Source: Internal Clock
- Prescaler: 999 (APB1时钟为80MHz, 分频后为80kHz)
- Counter Mode: Up
- Counter Period: 79999 (80kHz/80000=1Hz)
生成代码后,在stm32l5xx_it.c中添加中断处理:
c复制void TIM2_IRQHandler(void) {
if(__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET) {
__HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);
HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_12); // 每秒切换LED状态
}
}
4.2 PWM输出
尝试用TIM1的CH1(PE9)输出PWM信号驱动LED亮度变化:
- 配置TIM1 Channel1为PWM Generation CH1
- 设置Prescaler=79,Counter Period=999(产生1kHz PWM)
- 在代码中动态调整占空比:
c复制__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, dutyCycle);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
5. 串口通信
5.1 USART配置
开发板通过ST-LINK提供了虚拟串口功能(USART1,PA9/PA10)。配置参数:
- Baud Rate: 115200
- Word Length: 8 Bits
- Stop Bits: 1
- Parity: None
- Mode: Rx and Tx
初始化后即可使用标准库函数进行通信:
c复制char msg[] = "Hello STM32L5!\r\n";
HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
5.2 接收中断
更实用的方式是启用接收中断:
c复制HAL_UART_Receive_IT(&huart1, &rx_data, 1); // 启动接收
// 在回调函数中处理数据
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if(huart->Instance == USART1) {
HAL_UART_Transmit(&huart1, &rx_data, 1, HAL_MAX_DELAY);
HAL_UART_Receive_IT(&huart1, &rx_data, 1); // 重新启用接收
}
}
6. 低功耗特性体验
6.1 睡眠模式
STM32L5最大的特色就是低功耗。最简单的睡眠模式实现:
c复制__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
实测电流从5mA降至1.8mA左右。唤醒源可以配置为按键或定时器。
6.2 STOP2模式
更深的省电模式是STOP2:
c复制HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
// 唤醒后需要重新配置时钟
SystemClock_Config();
此时电流降至约20μA,可以通过RTC或外部中断唤醒。
7. 常见问题排查
7.1 时钟配置问题
新手最容易遇到时钟配置错误。STM32L5的时钟树比较复杂,建议:
- 使用CubeMX自动生成时钟配置
- 检查SystemClock_Config()函数中的参数
- 确认各总线时钟频率符合预期
7.2 外设不工作
如果某个外设没有反应:
- 检查__HAL_RCC_xxx_CLK_ENABLE()是否调用
- 确认GPIO模式配置正确(特别是复用功能)
- 查看参考手册中的寄存器描述
7.3 低功耗模式异常
进入低功耗模式后无法唤醒的常见原因:
- 未正确配置唤醒源
- 唤醒后未重新初始化关键外设
- 调试接口影响了功耗状态
8. 开发技巧分享
8.1 利用CubeMX生成代码
CubeMX不仅能生成初始化代码,还能:
- 计算定时器参数
- 验证时钟配置
- 生成中间件配置(如FreeRTOS)
- 导出为其他IDE的工程
8.2 调试低功耗应用
调试低功耗应用时要注意:
- 断开不必要的调试连接
- 使用电流表监测实际功耗
- 利用RTC唤醒进行周期性调试
- 注意IO口状态对功耗的影响
8.3 安全特性初探
STM32L5的安全特性值得关注:
- TrustZone硬件隔离
- 安全启动(Secure Boot)
- 加解密加速器
- 防篡改检测
虽然本次只是基础外设体验,但这些安全功能将是后续深入研究的重点。