查看: 664|回复: 0

如何实现STM32F103类似SHELL命令调试?

[复制链接]
  • TA的每日心情
    开心
    2019-11-4 13:48
  • 签到天数: 14 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2020-4-1 09:43:20 | 显示全部楼层 |阅读模式
    分享到:

    参考别人整理的,主要是为了和我一样的菜鸟 进行 CTRI+C  CTRL+V 做的准备  让你一分钟就移植成功,后续我再做在操作系统TreeRTOS下的,当前别人可以做一下 方便我们学习,不BB了,看效果图:

    命令结束符是回车  这个主意一下 ,不然就是未识别命令,我估计很多人会用SecureCRT 这类软件,这个是可以用的,自己配置一下就OK



    代码解析概要:
    中断接收处理: 这段代码的方式大家应该陌生,收到之后缓存
    • int i;
    • unsigned char ch;
    • void USART1_IRQHandler(void)
    • {
    •           ch = getchar();
    •                   IF(ch!=0)
    •                         {
    •                                 cmd[i++] = ch;
    •                                 if(i>CMD_MAX_LENGTH)
    •                                 {
    •                                         i = 0;
    •                                 }
    •                                 if((cmd[i-1]=='\n')&&(cmd[i-2]=='\r'))
    •                                 {
    •                                         cmd[i-1]=0;
    •                                         cmd[i-2]=0;
    •                                         i=0;
    •                                         flag=1 ;
    •                                 }
    •                   }
    • }
    • 重定向C语言函数
    • int fgetc(FILE *f)
    • {
    •         while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    •         return (uint8_t)USART_ReceiveData(USART1);
    • }
    • int fputc(int ch, FILE *f)
    • {
    •         USART_SendData(USART1, ch);
    •     while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );
    •         return ch;
    • }
    • 命令缓存
    • tCmdLineEntry g_sCmdTable[ ] =
    • {
    •     {"help",        Cmd_help,"\t\tisplay list of commands\r\n" },
    •     {"?",           Cmd_help,"\t\tisplay list of commands\r\n" },
    •     {"getbaud",     Cmd_get_baud,"\t\t:Get the current baud rate\r\n"},
    •    {"getstate",    Cmd_get_state,"\t:Get the current flag state\r\n"},
    •    {"setstate",    Cmd_set_state,"\t:Set the current flag state \r\n"},
    •     {"resetmcu",    Cmd_MCU_Reset,"\t:Reset MCU\r\n"},
    •     {0,0,0}
    • };


    [color=rgb(51, 102, 153) !important]复制代码


    这个 格式就是 输入的命令   函数名字   提示符
    自己往里面加就可以了
    至于这些函数自己实现就行了
    • int Cmd_get_baud(int argc, char *argv[])
    • {
    •         uint32_t baud=115200;
    •     uint8_t APP_Data[8]={ 0xAA,0x01,0x00,0x00,0x00,0x00,0x00,0x55};//»ñȡЭÒéÊý¾Ý
    •         uint8_t i;
    •     printf("baud= %d\r\n",baud);
    •     for(i=0;i<8;i++)
    •     {
    •         printf("APP_Data[%d]=%-d\t",i,APP_Data);
    •     }
    •     return 0;
    • }

    [color=rgb(51, 102, 153) !important]复制代码


    就这样:
    注意  很多和我一样的菜鸟不玩linux 可能对函数int Cmd_get_baud(int argc, char *argv[]) 不是很懂,建议百度 秒懂

    命令解析部分  可以不用管 看这个函数  主要就是提取解析 结束符和 上面红色函数的参数,其实我也不是很懂,有能力的可以详细解释一下
    • int CmdLineProcess(char *pcCmdLine)
    • main函数
    • while(1)
    • {
    •         if(flag)
    •                 {
    •                         if(CMDLINE_BAD_CMD == CmdLineProcess(cmd))
    •                         {
    •                                 printf("unkown command, please input \"help\" \n\r");
    •                         }
    •                         flag=0;
    •                 }
    • }

    [color=rgb(51, 102, 153) !important]复制代码



    打工搞成 ,记得选Use microLIB 不然可能会死机哦  如果自己修改过不用这个库的话   就不必要做了








    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 22:23 , Processed in 0.129945 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.