本教程主要介绍如何配置VisualGDB和OpenOCD来调试STM32L0开发板的固件,使微控制器进入睡眠模式。
我们将创建一个NUCLEO-L031K6开发板的基本工程,并介绍当CPU进入休眠模式时为什么默认配置不能正常工作,以及如何在调试设置中使用特殊的复位模式来解决该问题。
1、 首先启动Visual Studio并打开VisualGDB Embedded Project Wizard:
2、 选择“Create a new project -> Embedded binary”,然后单击“Next”:
3、 从列表中选择ARM工具链和器件型号。 本教程中使用的NUCLEO-L031K6开发板采用的是STM32L031K6微控制器:
4、 使用默认的“LEDBlink”示例继续下一步:
5、 在最后一页选择“OpenOCD”,通过USB连接开发板,然后单击“Detect”自动检测调试设置:
6、 按“Finish”生成项目。 将main()函数的内容替换为以下内容: - int main(void)
- {
- HAL_Init();
-
- __GPIOB_CLK_ENABLE();
- GPIO_InitTypeDef GPIO_InitStructure;
-
- GPIO_InitStructure.Pin = GPIO_PIN_3;
-
- GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
- GPIO_InitStructure.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- for (;;)
- {
- HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
- HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
- }
-
- }
复制代码该段代码将使器件进入睡眠模式,直到发生SysTick中断。
7、 按F5开始调试。 调试应该会正常启动,并且你应该能够单步调试代码:
8、 按Shift-F5停止调试,然后尝试重新启动。 现在调试会失败,并且OpenOCD显示以下错误: - Error: timed out while waiting for target halted
复制代码
发生错误的原因是,当器件处于睡眠模式时,OpenOCD无法通过JTAG正确连接到它。
9、 现在我们将演示如何通过编辑OpenOCD配置来解决这个问题。 打开VisualGDB项目属性的Debug Settings页面,并切换到Manual setup模式:
10、 单击“Target”字段中的“Open”按钮,复制原始文件(例如,复制为stm32l0_reset.cfg),然后在编辑器中打开:
11、 找到以reset_config开头的行,并使用以下行将其替换: - reset_config trst_and_srst srst_nogate connect_assert_srst
复制代码
connect_assert_rst标志将强制OpenOCD在初始连接期间重置CPU,使其脱离睡眠模式并确保调试通信成功。
12、 保存该新脚本并确保在VisualGDB项目属性中选择它:
13、 按F5开始调试。 不管固件是否进入睡眠模式,现在调试应该可以正常工作:
参考链接: Debugging STM32L0 Firmware with Sleep Mode with OpenOCD:http://visualgdb.com/tutorials/stm32/sleep/ |