【笔记】MSPM0G3507使用RT-Thread console——MSPM0G3507与RT_Thread(三)

想在在 RT-Thread Nano 上添加控制台与 FinSH分为两部分:

第一部分是添加 UART 控制台(实现打印):用来向控制台对接的终端输出打印信息;该部分只需要实现两个函数,串口初始化和系统输出函数,即可完成 UART 控制台打印功能。

第二部分是移植 FinSH 组件(实现命令输入),用以在控制台输入命令调试系统;该部分的实现基于第一部分,只需要添加 FinSH 组件源码并再对接一个系统输入函数即可实现。

本文解决第一部分内容

实验效果如图

一.实现串口初始化

图形化界面配置,看不懂的去本系列第一篇文章查看。

配置详细信息

地猛星入门手册 | 立创开发板技术文档中心 (lckfb.com)

关闭SYSCONFIG,编译,烧写。

修改main.c测试串口是否正常工作

cpp 复制代码
#include "ti_msp_dl_config.h"
#include "rtthread.h"

volatile unsigned int delay_times = 0;
volatile unsigned char uart_data = 0;

void delay_ms(unsigned int ms);
void uart0_send_char(char ch);
void uart0_send_string(char *str);

int main(void)
{
    SYSCFG_DL_init();
    // 清除串口中断标志
    NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);
    // 使能串口中断
    NVIC_EnableIRQ(UART_0_INST_INT_IRQN);

    while (1)
    {
        // LED引脚输出高电平
        DL_GPIO_setPins(LED1_PORT, LED1_PIN_14_PIN);
        delay_ms(500);
        // LED引脚输出低电平
        DL_GPIO_clearPins(LED1_PORT, LED1_PIN_14_PIN);
        delay_ms(500);
    }
}

// 搭配滴答定时器实现的精确ms延时
void delay_ms(unsigned int ms)
{
    rt_thread_mdelay(ms);
}
// 串口发送单个字符
void uart0_send_char(char ch)
{
    // 当串口0忙的时候等待,不忙的时候再发送传进来的字符
    while (DL_UART_isBusy(UART_0_INST) == true)
        ;
    // 发送单个字符
    DL_UART_Main_transmitData(UART_0_INST, ch);
}
// 串口发送字符串
void uart0_send_string(char *str)
{
    // 当前字符串地址不在结尾 并且 字符串首地址不为空
    while (*str != 0 && str != 0)
    {
        // 发送字符串首地址中的字符,并且在发送完成之后首地址自增
        uart0_send_char(*str++);
    }
}

// 串口的中断服务函数
void UART_0_INST_IRQHandler(void)
{
    // 如果产生了串口中断
    switch (DL_UART_getPendingInterrupt(UART_0_INST))
    {
    case DL_UART_IIDX_RX: // 如果是接收中断
        // 接发送过来的数据保存在变量中
        uart_data = DL_UART_Main_receiveData(UART_0_INST);
        // 将保存的数据再发送出去
        uart0_send_char(uart_data);
        break;

    default: // 其他的串口中断
        break;
    }
}

串口回显输入的内容,串口正常工作

二.实现 rt_hw_console_output

1.实现printf打印

修改堆栈大小

使用微库

接着修改main.c

cpp 复制代码
#include "ti_msp_dl_config.h"
#include "rtthread.h"

volatile unsigned int delay_times = 0;
volatile unsigned char uart_data = 0;

void delay_ms(unsigned int ms);
void uart0_send_char(char ch);
void uart0_send_string(char *str);

#include <stdio.h>
int fputc(int ch, FILE *stream)
{
    while (DL_UART_isBusy(UART_0_INST) == true)
        ;

    DL_UART_Main_transmitData(UART_0_INST, ch);

    return ch;
}

int main(void)
{
    SYSCFG_DL_init();
    // 清除串口中断标志
    NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);
    // 使能串口中断
    NVIC_EnableIRQ(UART_0_INST_INT_IRQN);

    while (1)
    {
        // LED引脚输出高电平
        DL_GPIO_setPins(LED1_PORT, LED1_PIN_14_PIN);
        delay_ms(500);
        // LED引脚输出低电平
        DL_GPIO_clearPins(LED1_PORT, LED1_PIN_14_PIN);
        delay_ms(500);
    }
}

// 搭配滴答定时器实现的精确ms延时
void delay_ms(unsigned int ms)
{
    rt_thread_mdelay(ms);
}
// 串口发送单个字符
void uart0_send_char(char ch)
{
    // 当串口0忙的时候等待,不忙的时候再发送传进来的字符
    while (DL_UART_isBusy(UART_0_INST) == true)
        ;
    // 发送单个字符
    DL_UART_Main_transmitData(UART_0_INST, ch);
}
// 串口发送字符串
void uart0_send_string(char *str)
{
    // 当前字符串地址不在结尾 并且 字符串首地址不为空
    while (*str != 0 && str != 0)
    {
        // 发送字符串首地址中的字符,并且在发送完成之后首地址自增
        uart0_send_char(*str++);
    }
}

// 串口的中断服务函数
void UART_0_INST_IRQHandler(void)
{
    // 如果产生了串口中断
    switch (DL_UART_getPendingInterrupt(UART_0_INST))
    {
    case DL_UART_IIDX_RX: // 如果是接收中断
        // 接发送过来的数据保存在变量中
        uart_data = DL_UART_Main_receiveData(UART_0_INST);
        // 将保存的数据再发送出去
        // uart0_send_char(uart_data);
        printf("receive data ....");
        break;

    default: // 其他的串口中断
        break;
    }
}

2.使能控制台

添加自己的函数实现rt_hw_console_output

改为:

然后烧录,嗯~~~~,熟悉的界面,舒服了

三.结束

本篇文章到此结束

参考链接:

Nano 移植控制台/FinSH (rt-thread.org)

地猛星入门手册 | 立创开发板技术文档中心 (lckfb.com)

相关推荐
志尊宝4 小时前
Vue3 零基础每日笔记(010):watchEffect——用到谁就自动听谁的“懒人侦听器“
前端·vue.js·笔记
陈年老古董4 小时前
Python模拟MapReduce分治思想 | 从单文件统计到大文件拆分聚合 学习笔记
开发语言·hadoop·笔记·python·学习
snow@li4 小时前
服务器运维:Node.js 安装笔记(Alibaba Cloud Linux 4)
笔记
江湖人称菠萝包4 小时前
【Windows】《深入浅出Windows API程序设计:编程基础篇》笔记-Chapter9-对话框
windows·笔记
David猪大卫4 小时前
【C++修炼】异常
开发语言·c++·经验分享·笔记·学习·考研·面试
youm20035 小时前
【学习笔记】reids的数据类型
redis·笔记·学习
hanlin036 小时前
刷题笔记:力扣第84题-柱状图中最大的矩形
笔记·算法·leetcode
一米阳光866114 小时前
软考高级【信息系统项目管理师】高项重要考点(3)高级项目管理-下 助你顺利上岸!
笔记·职场发展·软考·信息系统项目管理师·高级职称
dianziyao_15 小时前
第 4.1 篇:让 Codex 理解你的双链——AI 辅助发现笔记间的关联
人工智能·笔记
xian_wwq18 小时前
【学习笔记】OWASP Agentic 应用安全(二)
笔记·学习·安全·owasp