这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持数字示波器】MicrochipMPLABHarmony框架下串口调试p

共2条 1/1 1 跳转至

【换取手持数字示波器】MicrochipMPLABHarmony框架下串口调试printf输出记录

助工
2025-03-23 22:24:09   被打赏 29 分(兑奖)     打赏

本文旨在记录分享初次使用Microchip公司的MPLAB Harmony框架如何通过printf - uart来打印调试信息。

先来介绍一下本次使用的实验环境:

硬件:SAME51J20A Curiosity Nano evaluation kit   ARM Cortex-M4内核,支持两路FDCAN,多个串行通讯接口随意配置

image.png

软件:MPLAB X IDE v6.20

一、SERCOM模块简介

针对本次使用的SAME51J20A 芯片,据数据手册了解到一个“SERCOM”的概念。这个是“SERIAL COMMUNICATION INTERFACE”的简写。不同于之前接触过的芯片,这个“SERCOM”竟然可以配置成I2C或者SPI或者USART还有LIN总线等不同的用法。

33.1 概述

实例:微控制器上最多可以有八个SERCOM实例,具体数量取决于设备型号。

模式:每个SERCOM实例可以配置为以下模式之一:

I2C(Inter-Integrated Circuit):一种两线串行通信协议。

SPI(Serial Peripheral Interface):一种高速同步串行通信协议。

USART(Universal Synchronous/Asynchronous Receiver/Transmitter):一种灵活的串行通信协议,支持同步和异步模式。

专用资源:一旦SERCOM实例被配置并启用,其所有资源将专用于所选模式。

串行引擎:SERCOM外设包括:

发送器和接收器:处理数据发送和接收。

波特率发生器:生成通信所需的时钟信号。

地址匹配逻辑:在I2C模式下用于检测特定设备地址。

时钟源

可以使用内部通用时钟外部时钟

使用外部时钟时,SERCOM可以在所有睡眠模式下运行,适合低功耗应用。


33.2 特性

    可配置接口

    通过**CTRLA.MODE[2:0]**寄存器选择操作模式。

    支持的模式:

    I2C:两线串行接口。

    SMBus™:兼容系统管理总线。

    SPI:串行外设接口。

    USART:通用同步/异步收发器。

    单发送缓冲区和双接收缓冲区

    提高数据传输效率。

    波特率发生器

    支持灵活的波特率设置。

    地址匹配/掩码逻辑

    用于I2C模式下的地址识别。

    在所有睡眠模式下运行

    使用外部时钟时,SERCOM可以在所有睡眠模式下工作。

    支持DMA

    可以与DMA(直接内存访问)配合使用,提高数据传输效率。

    32位扩展

    优化系统总线利用率。


二、串口调试CDC_RX CDC_TX配置

参考开发板原理图,PB16 PB17用于SAME51J20A 芯片与调试器进行通信,并且这一组引脚的串行通信模块可以配置为SERCOM5。

image.png

打开MCC,在左侧的Device Resources -> SERCOM里面找到SERCOM5,点击+号,添加到Project Resources里面。

image.png


添加完后,点击SERCOM5,在右侧编辑参数细节,尤其是TXP, RXP等。

image.png

之后在Pin Configuaration里面,对引脚进行配置:

image.png

之后点击Generate,自动生成代码。尤其是初始化等基础代码生成的非常完善。

void SERCOM5_USART_Initialize( void )
{
    /*
     * Configures USART Clock Mode
     * Configures TXPO and RXPO
     * Configures Data Order
     * Configures Standby Mode
     * Configures Sampling rate
     * Configures IBON
     */

    SERCOM5_REGS->USART_INT.SERCOM_CTRLA = SERCOM_USART_INT_CTRLA_MODE_USART_INT_CLK | SERCOM_USART_INT_CTRLA_RXPO(0x1UL) | SERCOM_USART_INT_CTRLA_TXPO(0x0UL) | SERCOM_USART_INT_CTRLA_DORD_Msk | SERCOM_USART_INT_CTRLA_IBON_Msk | SERCOM_USART_INT_CTRLA_FORM(0x0UL) | SERCOM_USART_INT_CTRLA_SAMPR(0UL) ;

    /* Configure Baud Rate */
    SERCOM5_REGS->USART_INT.SERCOM_BAUD = (uint16_t)SERCOM_USART_INT_BAUD_BAUD(SERCOM5_USART_INT_BAUD_VALUE);

    /*
     * Configures RXEN
     * Configures TXEN
     * Configures CHSIZE
     * Configures Parity
     * Configures Stop bits
     */
    SERCOM5_REGS->USART_INT.SERCOM_CTRLB = SERCOM_USART_INT_CTRLB_CHSIZE_8_BIT | SERCOM_USART_INT_CTRLB_SBMODE_1_BIT | SERCOM_USART_INT_CTRLB_RXEN_Msk | SERCOM_USART_INT_CTRLB_TXEN_Msk;

    /* Wait for sync */
    while((SERCOM5_REGS->USART_INT.SERCOM_SYNCBUSY) != 0U)
    {
        /* Do nothing */
    }


    /* Enable the UART after the configurations */
    SERCOM5_REGS->USART_INT.SERCOM_CTRLA |= SERCOM_USART_INT_CTRLA_ENABLE_Msk;

    /* Wait for sync */
    while((SERCOM5_REGS->USART_INT.SERCOM_SYNCBUSY) != 0U)
    {
        /* Do nothing */
    }
}


在main.c里面,要手动添加如下语句使能SERCOM5模块:

SERCOM5_USART_Enable();

接下来添加简单的串口输出,打开串口助手,查看结果。

        sprintf(tempStr, "\r\nSystickDelay: LED0 PA14 Toggled. %lu", cnt++);
        SERCOM5_USART_Write(tempStr, sizeof (tempStr));

uart.gif

三、重定向printf

UART配合printf是基操,接下来介绍一下如何在MPLAB Harmony框架下重定向printf到SERCOM5,以本文为例。

首先打卡MCC,在Tools里面找到STDIO,点击+号,添加到项目中。

image.png

接下来就是“连连看”,在中间的外设框图模型中,连接STDIO模块与前文中添加的SERCOM5模块。

image.png

如此简单!点击Generate,查看代码生成结果。

image.png

到项目树里面,找打Source Files -> config -> default -> stdio,查看xc32_monitor.c,已经适配到SERCOM5模块。

image.png

注释掉之前的打印代码,添加一行printf:

#include <stdio.h>

#if 0 
        sprintf(tempStr, "\r\nSystickDelay: LED0 PA14 Toggled. %lu", cnt++);
        SERCOM5_USART_Write(tempStr, sizeof (tempStr));
        //SimpleDalay_ms(1000);
#endif
        printf("\r\nUsingPrintf_SystickDelay: LED0 PA14 Toggled. %lu", cnt++);

重新编译,下载:

Currently loaded versions:
Application version...........1.30.35 (0x01.0x1e.0x23)
Tool pack version .............1.13.715
Target voltage detected
Target device ATSAME51J20A found.
Device Revision Id  = 0x3
Device Id = 0x61810004

Calculating memory ranges for operation...

Erasing...

The following memory area(s) will be programmed:
program memory: start address = 0x0, end address = 0x1fff
configuration memory

Due to the large memory ranges on this device, only the areas of memory that have been loaded with code (via the build process or loading a hex file) will be read by default. If you wish to read custom ranges, please go to the Memories to Program property page and specify the ranges you want to read.
Programming complete


四、测试结果

printf.gif

测试结果符合预期。本文难度较小,分享出来主要是给不熟悉Microchip工具链的朋友,快速上手MCC图形化开发工具和串口输出。



管理员
2025-04-03 16:44:38     打赏
2楼

评语汇总:

1 常规操作,介绍SERCOM的知识,有详细配置过程,有关键代码,可参考;

2 介绍MPLAB Harmony 开发板的串口输出的函数,适合初学者;

3 非常详细的Microchip 配置printf的过程. 如果使用microchip的芯片需要配置的话可以参考本篇文章;

4 Microchip公司的MPLAB Harmony介绍的文章相对不多,对使用Microchip 开发的开发者熟悉其配置工具有借鉴意义;

5 这应该是硬禾学堂搞的那个microchip的调试过程贴,内容是打通串口并重定向printf函数,具有可操作性,但是还是那句话,不太建议在mcu中使用printf函数。



共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]