打印

LP-MSPM0L1306开发板试用体验---轻松实现xprintf串口打印

[复制链接]
220|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xiaoqi976633690 于 2023-10-6 16:28 编辑

1、开发环境
开发板:LP-MSPM0L1306 LaunchPad™ 开发套件
IDE:Code Composer Studio 12.4.0
仿真器:板载
例程参考自官方
SDK\mspm0_sdk_1_10_01_05\examples\nortos\LP_MSPM0L1306\driverlib\uart_echo_interrupts_standby

2、硬件配置








3、代码实现
串口初始化代码官方例程已经写好了直接参考就好了
/* Defines for UART_0 */
#define UART_0_INST                                                        UART0
#define UART_0_INST_IRQHandler                                  UART0_IRQHandler
#define UART_0_INST_INT_IRQN                                      UART0_INT_IRQn
#define GPIO_UART_0_RX_PORT                                                GPIOA
#define GPIO_UART_0_TX_PORT                                                GPIOA
#define GPIO_UART_0_RX_PIN                                         DL_GPIO_PIN_9
#define GPIO_UART_0_TX_PIN                                         DL_GPIO_PIN_8
#define GPIO_UART_0_IOMUX_RX                                     (IOMUX_PINCM10)
#define GPIO_UART_0_IOMUX_TX                                      (IOMUX_PINCM9)
#define GPIO_UART_0_IOMUX_RX_FUNC                      IOMUX_PINCM10_PF_UART0_RX
#define GPIO_UART_0_IOMUX_TX_FUNC                       IOMUX_PINCM9_PF_UART0_TX
#define UART_0_BAUD_RATE                                                  (9600)
#define UART_0_IBRD_33_kHZ_9600_BAUD                                         (1)
#define UART_0_FBRD_33_kHZ_9600_BAUD                                         (9)



static const DL_UART_Main_ClockConfig gUART_0ClockConfig = {
    .clockSel    = DL_UART_MAIN_CLOCK_LFCLK,
    .divideRatio = DL_UART_MAIN_CLOCK_DIVIDE_RATIO_1
};

static const DL_UART_Main_Config gUART_0Config = {
    .mode        = DL_UART_MAIN_MODE_NORMAL,
    .direction   = DL_UART_MAIN_DIRECTION_TX_RX,
    .flowControl = DL_UART_MAIN_FLOW_CONTROL_NONE,
    .parity      = DL_UART_MAIN_PARITY_NONE,
    .wordLength  = DL_UART_MAIN_WORD_LENGTH_8_BITS,
    .stopBits    = DL_UART_MAIN_STOP_BITS_ONE
};

SYSCONFIG_WEAK void SYSCFG_DL_UART_0_init(void)
{
    DL_UART_Main_setClockConfig(UART_0_INST, (DL_UART_Main_ClockConfig *) &gUART_0ClockConfig);

    DL_UART_Main_init(UART_0_INST, (DL_UART_Main_Config *) &gUART_0Config);
    /*
     * Configure baud rate by setting oversampling and baud rate divisors.
     *  Target baud rate: 9600
     *  Actual baud rate: 9576.04
     */
    DL_UART_Main_setOversampling(UART_0_INST, DL_UART_OVERSAMPLING_RATE_3X);
    DL_UART_Main_setBaudRateDivisor(UART_0_INST, UART_0_IBRD_33_kHZ_9600_BAUD, UART_0_FBRD_33_kHZ_9600_BAUD);


    /* Configure Interrupts */
    DL_UART_Main_enableInterrupt(UART_0_INST,
                                 DL_UART_MAIN_INTERRUPT_RX);


    DL_UART_Main_enable(UART_0_INST);
}



xprintf移植
源码 https://gitee.com/eegithub/xprintf_demo功能裁剪:
#define XF_USE_OUTPUT        1        /* 1: Enable output functions */
#define        XF_CRLF                        0        /* 1: Convert \n ==> \r\n in the output char */
#define        XF_USE_DUMP                0        /* 1: Enable put_dump function */
#define        XF_USE_LLI                0        /* 1: Enable long long integer in size prefix ll */
#define        XF_USE_FP                0        /* 1: Enable support for floating point in type e and f */
#define XF_DPC                        '.'        /* Decimal separator for floating point */
#define XF_USE_INPUT        0        /* 1: Enable input functions */
#define        XF_INPUT_ECHO        0        /* 1: Echo back input chars in xgets function */

格式:
xprintf("%d", 1234);             /* "1234" */ 
    xprintf("%6d,%3d%%", -200, 5);   /* " -200, 5%" */
    xprintf("%-6u", 100);            /* "100 " */
    xprintf("%ld", 12345678);        /* "12345678" */
    xprintf("%llu", 0x100000000);    /* "4294967296" <XF_USE_LLI> */
    xprintf("%lld", -1LL);           /* "-1" <XF_USE_LLI> */
    xprintf("%04x", 0xA3);           /* "00a3" */
    xprintf("%08lX", 0x123ABC);      /* "00123ABC" */
    xprintf("%016b",        0x550F); /* "0101010100001111" */
    xprintf("%*d", 6, 100);          /* "100" */
    xprintf("%s", "abcdefg");        /* "abcdefg" */
    xprintf("%5s", "abc");           /* " abc" */
    xprintf("%-5s", "abc");          /* "abc " */
    xprintf("%.5s", "abcdefg");      /* "abcde" */
    xprintf("%-5.2s", "abcdefg");    /* "ab" */
    xprintf("%c", 'a');              /* "a" */
    xprintf("%12f", 10.0);           /* " 10.000000" <XF_USE_FP> */
    xprintf("%.4E", 123.45678);      /* "1.2346E+02" <XF_USE_FP> */

设备输入/输出功能
  • 输出函数是用户提供的回调函数,用于将字节写入输出设备。其地址应设置为模块中的函数指针xfunc_output,默认输出设备。通常,此函数将字节放入 UART、LCD 或某些输出设备。输出函数从 xputc() 回调。有一个宏可以轻松设置。
  • 例如,当将 void uart1_putc (uint8_t chr) 附加到模块时, xdev_out(uart1_putc) 就可以了。如果输出函数有多个参数或没有简单的输出函数,则需要另一个封装函数。 xfputc()、xfputs()、xfprintf() 和 xsprintf() 使用其参数覆盖默认输出设备。
  • 输入函数是用户提供的回调函数,用于从输入设备读取字节。它的地址应该设置为函数指针 xfunc_input,默认输入设备。有一个宏 xdev_in() 可以轻松设置它。
  • 例如xdev_in(uart1_getc)。xfgets() 函数使用其参数覆盖默认输入设备。输入函数从 xgets() 函数回调。通常,输入函数从输入设备或文件中读取一个字节。当输入设备报告流结束时,输入函数应返回-1。xgets() 函数以零中止,应用程序将能够检测到它。




这里我们只需要实现一个byte发送的函数即可
void UART_0_write_Byte(uint8_t data)//1 byte 发送
{
        DL_UART_transmitDataBlocking(UART_0_INST,data);
}
xdev_out(UART_0_write_Byte);


主函数
#include "ti_msp_dl_config.h"
#include "xprintf.h"

uint8_t data = 0;
const uint8_t str[]="HELLO,TI MCU SERIAL MSPM0L1306\n";
void UART_0_write_str(uint8_t *s);
void UART_0_write_Byte(uint8_t data);


int main(void)
{
        uint8_t i=0;
        SYSCFG_DL_init();

        NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);
        NVIC_EnableIRQ(UART_0_INST_INT_IRQN);
        DL_SYSCTL_disableSleepOnExit();
        xdev_out(UART_0_write_Byte);
        while (1)
        {

                delay_cycles((32000*1000));
                UART_0_write_str(str);
                UART_0_write_str("string send\n");
            xprintf("xprintf :%d\n\r", i);
            i++;
        }
}

void UART_0_INST_IRQHandler(void)
{
        switch (DL_UART_Main_getPendingInterrupt(UART_0_INST))
        {
        case DL_UART_MAIN_IIDX_RX:
                data = DL_UART_Main_receiveData(UART_0_INST);
                DL_UART_Main_transmitData(UART_0_INST, data);
                break;
        default:
                break;
        }
}

void UART_0_write_str(uint8_t *s)//字符串发送函数
{
        uint8_t i=0;
        while(s[i]!='\0')
        {
                if(s[i]=='\r') DL_UART_transmitDataBlocking(UART_0_INST, '\n');
                DL_UART_transmitDataBlocking(UART_0_INST, s[i]);
                i++;
        }
}

void UART_0_write_Byte(uint8_t data)//1 byte 发送
{
        DL_UART_transmitDataBlocking(UART_0_INST,data);
}




4、实验现象










































使用特权

评论回复
评分
参与人数 1威望 +10 收起 理由
xyz549040622 + 10 很给力!
沙发
xyz549040622| | 2023-10-16 10:05 | 只看该作者
果断收藏了,这个可以移植到所有的MCU中,稍后就安排移植,太方便了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

163

帖子

2

粉丝