想在在 RT-Thread Nano 上添加控制台与 FinSH分为两部分:
第一部分是添加 UART 控制台(实现打印):用来向控制台对接的终端输出打印信息;该部分只需要实现两个函数,串口初始化和系统输出函数,即可完成 UART 控制台打印功能。
第二部分是移植 FinSH 组件(实现命令输入),用以在控制台输入命令调试系统;该部分的实现基于第一部分,只需要添加 FinSH 组件源码并再对接一个系统输入函数即可实现。
本文解决第一部分内容
实验效果如图
一.实现串口初始化
图形化界面配置,看不懂的去本系列第一篇文章查看。
配置详细信息
地猛星入门手册 | 立创开发板技术文档中心 (lckfb.com)
关闭SYSCONFIG,编译,烧写。
修改main.c测试串口是否正常工作
#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
#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)