发新帖本帖赏金 40.00元(功能说明)我要提问
返回列表
打印
[MM32软件]

MM32H5480通过J-Link实现日志打印的三种方法

[复制链接]
610|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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,为用户提供灵活、丰富的选择。


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接口。

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引脚上,如下图所示:

最后通过代码实现UART串口初始化及配置,如下所示:
void PLATFORM_InitConsole(void)
{
    GPIO_InitTypeDef  GPIO_InitStruct;
    USART_InitTypeDef USART_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    USART_StructInit(&USART_InitStruct);
    USART_InitStruct.USART_BaudRate   = 115200;
    USART_InitStruct.USART_StopBits   = USART_StopBits_1;
    USART_InitStruct.USART_Parity     = USART_Parity_No;
    USART_InitStruct.USART_Mode       = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1, &USART_InitStruct);

    RCC_AHBENRPeriphClockCmd(RCC_AHBENRPeriph_GPIOB, ENABLE);

    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_7);

    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_6;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    USART_Cmd(USART1, ENABLE);
}

int fputc(int ch, FILE *f)
{
    USART_SendData(USART1, (uint8_t)ch);

    while (RESET == USART_GetFlagStatus(USART1, USART_FLAG_TC))
    {
    }

    return (ch);
}
硬件连接:

测试效果:我们通过串口工具来查看VCOM的输出打印日志信息:


5、MM32H5480通过SWD与J-Link的RTT功能实现日志打印
SWD接口除了能够实现对MCU的调试、下载功能之外,还可以借助SEGGER的RTT组件实现日志信息的打印功能,它的优点是不需要再MCU的UART引脚,利用下载引脚的复用功能实现模拟UART的功能,很大程度上节省了MCU的资源,又不影响其它的功能。

具体配置代码如下所示:
#include "SEGGER_RTT.h"

void PLATFORM_InitConsole(void)
{
    SEGGER_RTT_ConfigUpBuffer(0, "RTTUP", NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
}

int fputc(int ch, FILE *f)
{
    SEGGER_RTT_PutCharSkip(0, (char)ch);

    return (ch);
}
硬件连接:

测试效果:我们通过SEGGER RTT Viewer这个软件来查看SWD的输出打印日志信息:

在上述建立连接时,RTT Control Block选择的是Search Range,其后填入了对应的RAM起始位置和RAM空间大小,这是一种方式;还有另外一个方式如下所示:

就是在程序编译完成后,通过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工程为例,具体如下:
工程配置:

首先我们通过上述图片的过程,进入如下的配置界面:

在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的频率太大,不支持的话,会有相应的提示窗口,如下所示,这时就需要我们修改这个分频值到一个合理的范围内:

软件配置:
volatile int32_t ITM_RxBuffer = ITM_RXBUFFER_EMPTY;

void PLATFORM_InitConsole(void)
{
    DBG->CR &= ~(DBG_CR_TRACE_MODE_Msk | DBG_CR_TRACE_IOEN_Msk);
    DBG->CR |=   DBG_CR_TRACE_IOEN;
}

int fputc(int ch, FILE *f)
{
    ITM_SendChar(ch);

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



7、附件工程
测试工程: Project.zip (1.07 MB)

使用特权

评论回复

打赏榜单

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

评论
21小跑堂 2024-11-14 15:49 回复TA
三种不同方式实现J-Link下的日志打印功能,开发者可根据需求自行选择,大大提升灵活性。 
沙发
weifeng90| | 2024-11-14 17:19 | 只看该作者
JLINK的RTT功能比较实用,在串口数量不够的情况下,可以用JLINK作为调试接口。

使用特权

评论回复
板凳
袁胜富| | 2024-11-15 21:27 | 只看该作者
开发板那里获得

使用特权

评论回复
地板
xld0932|  楼主 | 2024-11-18 13:13 | 只看该作者

联系原厂销售吧

使用特权

评论回复
发新帖 本帖赏金 40.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:上海灵动微电子股份有限公司资深现场应用工程师
简介:诚信·承诺·创新·合作

70

主题

3001

帖子

31

粉丝