STM32/STM8技术论坛
直播中

ben111

11年用户 2655经验值
擅长:MEMS/传感技术 嵌入式技术 模拟技术
私信 关注
[经验]

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

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

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



代码解析概要:
中断接收处理: 这段代码的方式大家应该陌生,收到之后缓存
  1. int i;
  2. unsigned char ch;
  3. void USART1_IRQHandler(void)
  4. {            
  5.           ch = getchar();
  6.                   if(ch!=0)
  7.                         {
  8.                                 cmd[i++] = ch;
  9.                                 if(i>CMD_MAX_LENGTH)
  10.                                 {
  11.                                         i = 0;
  12.                                 }                        
  13.                                 if((cmd[i-1]=='n')&&(cmd[i-2]=='r'))
  14.                                 {
  15.                                         cmd[i-1]=0;
  16.                                         cmd[i-2]=0;        
  17.                                         i=0;
  18.                                         flag=1 ;


  19.                                 }        
  20.                   }
  21. }

  22. 重定向C语言函数
  23. int fgetc(FILE *f)
  24. {
  25.         while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
  26.         return (uint8_t)USART_ReceiveData(USART1);
  27. }
  28. int fputc(int ch, FILE *f)
  29. {
  30.         USART_SendData(USART1, ch);
  31.     while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );
  32.         return ch;


  33. }



  34. 命令缓存


  35. tCmdLineEntry g_sCmdTable[ ] =
  36. {
  37.     {"help",        Cmd_help,"ttisplay list of commandsrn" },
  38.     {"?",           Cmd_help,"ttisplay list of commandsrn" },
  39.     {"getbaud",     Cmd_get_baud,"tt:Get the current baud ratern"},
  40.    {"getstate",    Cmd_get_state,"t:Get the current flag statern"},
  41.    {"setstate",    Cmd_set_state,"t:Set the current flag state rn"},
  42.     {"resetmcu",    Cmd_MCU_Reset,"t:Reset MCUrn"},
  43.     {0,0,0}
  44. };

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

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

命令解析部分  可以不用管 看这个函数  主要就是提取解析 结束符和 上面红色函数的参数,其实我也不是很懂,有能力的可以详细解释一下
  1. int CmdLineProcess(char *pcCmdLine)

  2. main函数
  3. while(1)
  4. {
  5.         if(flag)
  6.                 {
  7.                         if(CMDLINE_BAD_CMD == CmdLineProcess(cmd))
  8.                         {
  9.                                 printf("unkown command, please input "help" nr");
  10.                         }
  11.                         flag=0;
  12.                         
  13.                 }



  14. }


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

回帖(1)

jinyi7016

2018-7-27 12:28:10
这样,以后仿真就调试就方便了
举报

更多回帖

发帖
×
20
完善资料,
赚取积分