嵌入式命令行交互工具移植过程

描述

| 移植准备

1、去托管平台把源码下下来;

2、准备一个基础工程,实现串口重定义输出:

嵌入式

移植源码

1、把核心源码复制到工程中:

嵌入式

2、把命令示例源码复制到工程中:

嵌入式

3、把源码添加到工程中:

嵌入式

4、屏蔽RT-Thread 的头文件:

嵌入式

5、修改输出的末尾行模式:

嵌入式

6、初始化nr_micro_shell:

 

#include "gd32f10x.h"
#include "stdio.h"
#include "nr_micro_shell.h"


// uart配置
void hal_log_init(void)
{
    /* 使GPIO时钟 */
    rcu_periph_clock_enable(RCU_GPIOA);


    /* 使USART时钟 */
    rcu_periph_clock_enable(RCU_USART0);


    /* 连接端口到USARTx_Tx */
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);


    /* 连接端口到USARTx_Rx */
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);


    /* USART配置 */
    usart_deinit(USART0);                                   /*!< 复位外设USART */
    usart_word_length_set(USART0, USART_WL_8BIT);           /*!< 配置USART字长 */
    usart_stop_bit_set(USART0, USART_STB_1BIT);             /*!< 配置USART停止位 */
    usart_parity_config(USART0, USART_PM_NONE);             /*!< 配置USART奇偶校验 */
    usart_baudrate_set(USART0, 115200U);                    /*!< 配置USART波特率 */
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);     /*!< USART/UART接收器配置 */
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);   /*!< USART/UART发送器配置 */
  
    usart_enable(USART0);                                   /*!< 使能USART */
  
    /*中断管理器使能,并分配优先级*/
    nvic_irq_enable(USART0_IRQn, 1, 0);
    /*清除中断标志*/
    usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);
    usart_interrupt_flag_clear(USART0, USART_INT_FLAG_IDLE);
    /* 使能串口中断 */
    usart_interrupt_enable(USART0, USART_INT_RBNE);         /*!< 接收不为空中断 */
}


// usart0中断
void USART0_IRQHandler(void)
{
    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE))
    {
        /* 清除标志位 */
        usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);
        /* 接收数据(注意) */
        shell(usart_data_receive(USART0));
    }
}


//printf重定向函数
int fputc(int ch,FILE *f)
{
    usart_data_transmit(USART0, (uint8_t)ch);  //发送一字节数据
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));  //等待发送完成
    return ch;
}


// 外设初始化
void hal_device_init(void)
{
    hal_log_init();
    /* 初始化 */
    shell_init();
}


// 主循环
int main(void)
{
    // 设置优先级组
    nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
    // 外设初始化
    hal_device_init();
    while (1)
    {
    
    }
}

 

7、查看效果:

嵌入式

| 定义指令

1、添加自定义指令代码:

嵌入式

2、查看效果:

嵌入式

| 最终效果

移植成功后就可以在MCU中体验Linux的shell命令那种感觉,注意一定要修改输出的末尾行模式,不然会不能正常使用,来感受一下最终效果:

嵌入式

最终的效果还是不错的,和Linux的体验类似,感兴趣的同学可以移植来体验一下MCU级别的shell命令交互。





审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分