【笔记】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)

相关推荐
无心水7 小时前
24、系统架构师论文写作专题 核心考点与学习笔记
笔记·学习·系统架构·架构师·安全架构·软考架构师·软考系统架构设计师
蒸蒸yyyyzwd7 小时前
邓明 Agent 系统面试-意图识别学习笔记
笔记·学习
Zhao-Jichao10 小时前
AI Prompting for Everyone 课程笔记 - P21 总结 Conclusion
人工智能·笔记
欢欢李10 小时前
【LTE L3 笔记 05】LTE同步信号
笔记·无线通信·物理层·lte·空口协议
La Pulga12 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd12 小时前
秋招学习笔记 day106
笔记·学习
小李不想当小白13 小时前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
欢欢李14 小时前
【LTE L3 笔记 04】LTE帧结构
笔记·无线通信·物理层·lte·空口协议
Zhao-Jichao16 小时前
AI Prompting for Everyone 课程笔记 - P20 实验与期末项目 Lab and Final Project
前端·人工智能·笔记
Z21-X17 小时前
云原生运维实战笔记:企业网站综合上云部署与云运维服务全景解析
运维·笔记·学习·云原生