返回列表 发新帖我要提问本帖赏金: 40.00元(功能说明)

[MM32软件] MM32H5480通过J-Link实现日志打印的三种方法

[复制链接]
2671|4
 楼主| xld0932 发表于 2024-11-11 11:02 | 显示全部楼层 |阅读模式
本帖最后由 xld0932 于 2024-11-12 09:08 编辑

#申请原创#   @21小跑堂

1、前言
“灵动·星”系列MM32高性能MCU产品,基于安谋科技(Arm China)Star-MC1内核(兼容 Cortex-M33),Armv8架构性能上比传统的Cortex-M3/M4提升了近 20%,其 4.02的Coremark跑分在Arm架构的MCU领域里名列前茅;最高工作频率可达300MHz,内置单精度浮点运算单元(FPU),支持DSP扩展,同时支持先进的L1 I-Cache & D-Cache,以及ITCM&DTCM,提供强劲的内核动力,在市场上同类型内核MCU产品中首屈一指。目前包含4个子系列: MM32F3,灵动·天枢MM32F5,灵动·玉衡MM32G5,灵动·天玑MM32H5,为用户提供灵活、丰富的选择。
3.png

2、J-Link接口
对于20PIN的标准接口,其定义多种兼容的工作模式,具备JTAG、SWD、VCOM、SPI、QSPI、SWO等等功能,具体的内容可以参考如下链接进行研读:https://wiki.segger.com/20-pin_J-Link_Connector

3、MM32H5480系列
MM32H5480微控制器搭载了由安谋科技授权的ARM®v8-M架构“星辰” STAR-MC1(兼容 Cortex®-M33)处理器,最高工作频率可达300MHz,性能可达4.02 CoreMark®/MHz,内置数字信号处理器(DSP)、浮点运算单元( FPU)和三角函数运算加速单元(CORDIC)辅助算法加速。本产品系列内置了多达2MB Flash,多达256KB SRAM,其中64KB支持ECC,多达4KB备份RAM,并集成了丰富的I/O端口和外设模块,包括3个3MSPS 12位的ADC,2个12位的DAC,4个模拟比较器,1个高精度可编程电压参考(SCVREF),3个16位高级定时器, 4个16位和2个32位通用定时器, 4个16位基础定时器,1个低功耗定时器,1个实时时钟(RTC),1个 QSPI和1个FMC接口用于存储扩展,还包含通信接口如2个I2C,3个SPI或I2S,7个USART, 1个低功耗UART,1个10/100M以太网控制器,1个集成了内部PHY的USB 2.0全速Device/Host控制器,1个集成了内部全速PHY和ULPI接口的USB 2.0 高速Device/Host控制器,1个SDIO接口和3个支持CAN-FD模式的FlexCAN接口。

MM32H5480微控制器还提供了一系列的安全配置,包括 AES-128、SHA-256、真随机数发生器(TRNG)、Flash访问保护功能和基于AES-128的Flash在线解密(OTFDEC)功能。MM32H5480的调试模式支持串行调试接口(SWD)、JTAG接口、TRACE接口。
2.png
4、MM32H5480通过UART与J-Link的VCOM功能实现日志打印
首先可以参考之前分享的《带你掌握通过J-Link下载SPI FLASH的4种方式》:https://bbs.21ic.com/icview-3366504-1-1.html?fromuser=xld0932将J-Link开始VCOM功能,需要注意的是在使用VCOM功能时,J-Link需要工作在SWD模式下,且VTref是需要有参考电压的;
在硬件连接上,我们需要将MM32H5480芯片UART的RX\TX引脚连接到J-Link的J-Link Tx和J-Link Rx引脚上,如下图所示:
1.png
最后通过代码实现UART串口初始化及配置,如下所示:
  1. void PLATFORM_InitConsole(void)
  2. {
  3.     GPIO_InitTypeDef  GPIO_InitStruct;
  4.     USART_InitTypeDef USART_InitStruct;

  5.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  6.     USART_StructInit(&USART_InitStruct);
  7.     USART_InitStruct.USART_BaudRate   = 115200;
  8.     USART_InitStruct.USART_StopBits   = USART_StopBits_1;
  9.     USART_InitStruct.USART_Parity     = USART_Parity_No;
  10.     USART_InitStruct.USART_Mode       = USART_Mode_Rx | USART_Mode_Tx;
  11.     USART_Init(USART1, &USART_InitStruct);

  12.     RCC_AHBENRPeriphClockCmd(RCC_AHBENRPeriph_GPIOB, ENABLE);

  13.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_7);

  14.     GPIO_StructInit(&GPIO_InitStruct);
  15.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_6;
  16.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
  17.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;
  18.     GPIO_Init(GPIOB, &GPIO_InitStruct);

  19.     USART_Cmd(USART1, ENABLE);
  20. }

  21. int fputc(int ch, FILE *f)
  22. {
  23.     USART_SendData(USART1, (uint8_t)ch);

  24.     while (RESET == USART_GetFlagStatus(USART1, USART_FLAG_TC))
  25.     {
  26.     }

  27.     return (ch);
  28. }
硬件连接:
5.jpg
测试效果:我们通过串口工具来查看VCOM的输出打印日志信息:
4.png

5、MM32H5480通过SWD与J-Link的RTT功能实现日志打印
SWD接口除了能够实现对MCU的调试、下载功能之外,还可以借助SEGGER的RTT组件实现日志信息的打印功能,它的优点是不需要再MCU的UART引脚,利用下载引脚的复用功能实现模拟UART的功能,很大程度上节省了MCU的资源,又不影响其它的功能。
15.png
具体配置代码如下所示:
  1. #include "SEGGER_RTT.h"

  2. void PLATFORM_InitConsole(void)
  3. {
  4.     SEGGER_RTT_ConfigUpBuffer(0, "RTTUP", NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
  5. }

  6. int fputc(int ch, FILE *f)
  7. {
  8.     SEGGER_RTT_PutCharSkip(0, (char)ch);

  9.     return (ch);
  10. }
硬件连接:
8.jpg
测试效果:我们通过SEGGER RTT Viewer这个软件来查看SWD的输出打印日志信息:
6.png 7.png
在上述建立连接时,RTT Control Block选择的是Search Range,其后填入了对应的RAM起始位置和RAM空间大小,这是一种方式;还有另外一个方式如下所示:
9.png 10.png
就是在程序编译完成后,通过MAP文件找到SEGGER_RTT所在的RAM具体地址,然后在RTT Control Block中选择Address,并填写具体的RAM地址也可以,但为什么不选择Auto Detection选项呢,我也没太搞清,大概可能也许是没有自动检测到吧

6、MM32H5480通过TRACE与J-Link的SWO功能实现日志打印
通过MM32H5480的TRACE接口与J-Link的SWO实现日志打印输出与通过MM32H5480的UART接口与J-Link的VCOM实现日志打印输出的功能相似,在硬件资源上都需要占用MCU的引脚资源,但VCOM占用的是UART的两个引脚,而SWO仅占用一个SWO引脚,在软件上VCOM配置的UART,而SWO配置的是TRACE功能使能,以KEIL工程为例,具体如下:
工程配置:
16.png
首先我们通过上述图片的过程,进入如下的配置界面:
13.png
在Trace Settings界面中我们需要设置如下几个参数:
Core Clock时钟频率,这个需要与我们芯片配置的TPIU时钟,即TRACECLK时钟频率保持一致
Trace Port,这个需要选择Serial Wire Output - UART/NRZ
SWO Settings->Prescaler Core Clk这个是基于Core Clock来配置SWO的分频系数,最大的SWO取决于MCU和J-Link的能力;对于MM32H5480系列MCU来说,这边可以最大可以配置到7.5MHz,如果Prescaler这个值太小/SWO的频率太大,不支持的话,会有相应的提示窗口,如下所示,这时就需要我们修改这个分频值到一个合理的范围内:
14.png
软件配置:
  1. volatile int32_t ITM_RxBuffer = ITM_RXBUFFER_EMPTY;

  2. void PLATFORM_InitConsole(void)
  3. {
  4.     DBG->CR &= ~(DBG_CR_TRACE_MODE_Msk | DBG_CR_TRACE_IOEN_Msk);
  5.     DBG->CR |=   DBG_CR_TRACE_IOEN;
  6. }

  7. int fputc(int ch, FILE *f)
  8. {
  9.     ITM_SendChar(ch);

  10.     return (ch);
  11. }
测试效果:我们通过SEGGER J-Link SWO Viewer这个软件来查看SWO的输出打印日志信息:
12.png


7、附件工程
测试工程: Project.zip (1.07 MB, 下载次数: 1)

打赏榜单

21小跑堂 打赏了 40.00 元 2024-11-14
理由:恭喜通过原创审核!期待您更多的原创作品~~

评论

三种不同方式实现J-Link下的日志打印功能,开发者可根据需求自行选择,大大提升灵活性。  发表于 2024-11-14 15:49
weifeng90 发表于 2024-11-14 17:19 来自手机 | 显示全部楼层
JLINK的RTT功能比较实用,在串口数量不够的情况下,可以用JLINK作为调试接口。
袁胜富 发表于 2024-11-15 21:27 | 显示全部楼层
开发板那里获得
 楼主| xld0932 发表于 2024-11-18 13:13 | 显示全部楼层

联系原厂销售吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:King.Xu

77

主题

3023

帖子

38

粉丝
快速回复 在线客服 返回列表 返回顶部