文章目录
- ST - NUCLEO-H723ZG ITM不生效的问题
- 概述
- CubeMX配置点
- END
ST - NUCLEO-H723ZG ITM不生效的问题
概述
在用NUCLEO-H723ZG官方板子做实验, 想用ITM打印一些调试信息出来. 不好使啊.
后来查问题, 发现 NUCLEO-H723ZG上的HSE, LSE的晶振无效, 等于是不能用外部的HSE, LSE, 只能用HSI, LSI.
要查看官方PDF版的原理图才准确, 看官方提供的PCB工程反而不准(可能是设计文件对应多个NUCLEO_144板子).
板子实际元件焊接情况如下:
X3是HSE, 因为没焊接, 所以HSE无效.
X2是LSE, 虽然焊接了, 但是X2的起振电容C71, C72都没有焊接, 所以LSE也无效.
用CubeIDE配置工程时, 要禁掉HSE/LSE, 使用HSI/LSI才行.
CubeMX配置点
选了NUCLEO-H723ZG, 会有提示, 是否按照默认参数配置, 选择是.
这样大部分外设都配好了(除了HSE, LSE配置的不对).
我的板子将按钮PC13的跳线(0R电阻)从SB51去掉, 焊到SB58上, 这样就相当于我有了手工控制的边沿触发的EXTI0.
将PA0配置为EXTI0, 生成外中断0处理程序.
在CubeMX中禁止掉HSE, LSE, 和官方板子实际情况相符合.
DEBUG选线打开SWO
时钟配置
当禁掉HSE, LSE后, 再进入时钟配置页, 会提示是否自动配置时种, 选择是.
这是配置的时钟, 并没有使用HSI, 需要自己改一下.
改成HSI为主时钟配置后, 可以看到注释中为64MHZ. 这个64MHZ的主时钟值要在MDK中配置SWO trace.
其实往下拉, 可以看到具体的trace时钟值, 和主时钟一样, 都是64MHZ.
在MDK中配置 ITM
看到禁止了HSE, LSE后, MDK中没有定义主时钟值, 但是这个值实际是有的, 是64MHZ
这里要勾上使用微库, 默认生成的工程没有.
为了调试时准确一些, 将代码优化等级改为O0, 不改也行.
选择调试器为STLINK(官方板子自带STLINKV3)
进入调试器设置后, DEBUG页不需要改.
Trace页如下:
填上主时钟值, 前面配置时钟时, 看到这个值为64
确定退出, MDK ITM配置已经改好.
在工程中添加ITM实现
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "string.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h> // add .h for fputc
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
int fputc(int ch, FILE *f) {
return (ITM_SendChar(ch)); // in fputc, call ITM_SendChar()
}
/* USER CODE END PD */
在主时钟配置后, 就可以调用printf
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();
printf("test\r\n"); // must call printf() after SystemClock_Config()
单步调试时, 就可以在在MDKTrace窗口打印出ITM调试语句.