你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103实现类似SHELL命令调试

[复制链接]
寂寞,点燃一支烟 发布时间:2018-7-12 10:29
楼主也是参考别人整理的,主要是为了和我一样的菜鸟 进行 CTRI+C  CTRL+V 做的准备  让你一分钟就移植成功,后续我再做在操作系统TreeRTOS下的,当前别人可以做一下 方便我们学习,不BB了,看效果图:
/ F# }* X: [/ h$ q7 n0 L4 {

! H% x+ \; {7 v* m命令结束符是回车  这个主意一下 ,不然就是未识别命令,我估计很多人会用SecureCRT 这类软件,这个是可以用的,自己配置一下就OK
1 ]4 J& u2 j/ z! b0 H9 K3 _7 R! y

/ f& b% h4 h4 W: O, [: _  ]( H8 w( t: W& f8 r; {
6 E1 x' P3 `2 n" I
% }' C" x; R3 m. t4 y2 @

0 c& a9 {  W! o代码解析概要:
" {( T/ Q$ a' `中断接收处理: 这段代码的方式大家应该陌生,收到之后缓存
3 C( w/ G1 s5 p( t" Lint i;; ^( h: y4 I5 j9 Y
unsigned char ch;
: r$ M; Q; E% s- A; |void USART1_IRQHandler(void)( }- {6 \8 O% l  k3 d
{            # U+ m# T& W, s2 c# {
          ch = getchar();, Q0 Y2 t: D3 E3 R4 z* e1 ]
                  if(ch!=0)
) v+ V% u- X  m5 s; N                        {
. m$ ~5 m" b! W  B2 r+ f/ p' N: h                                cmd[i++] = ch;
6 r/ T  r& }2 i3 _                                if(i>CMD_MAX_LENGTH)# s& G" {" _1 a" r  W0 o
                                {" ~7 @2 H/ C9 H3 z3 t, F% d
                                        i = 0;
5 v5 i! q7 m/ [9 q                                }                       
- A5 J/ W' C) R8 `5 ~                                if((cmd[i-1]=='\n')&&(cmd[i-2]=='\r'))
4 }) T1 x5 c( @, Y3 }# H1 W                                {( X0 k/ j" X9 l/ \' y2 ]/ M
                                        cmd[i-1]=0;
6 ?& Z$ x" D  |) E7 A                                        cmd[i-2]=0;        3 Z7 t! u  g; m4 S" ?! p% M7 {
                                        i=0; 4 s* P4 B9 c% I/ f" f6 O* C
                                        flag=1 ;
; F) x$ h3 C1 B3 P! H; Z5 k
% H0 e5 o8 P# M* D
, X* t* {3 n: d" ]5 v2 @
                                }        6 ]7 t" r8 a2 W* X5 q: G& V
                  }
& j% `2 V% ~( f& _- ` }
- U- C+ X& l, j- {1 ]$ B. ]' Q/ G! E6 Z4 O# L) [
重定向C语言函数
; L. e" v5 `" L  y  }$ Aint fgetc(FILE *f)
0 P* j/ o7 t; w6 F/ Z3 j+ Z" M! z# J{3 p6 j/ ^) K1 J/ |; M0 E8 v& ~
        while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);' q5 c( d: @! a* t$ y0 f
        return (uint8_t)USART_ReceiveData(USART1);: z+ P% r6 u, X  h( G, W  D& J
}1 `- V7 i8 O' o! z2 o9 J
int fputc(int ch, FILE *f)
! ]6 V% @% M! L* k/ L; K( \{
/ ]8 w0 j! D1 N# R        USART_SendData(USART1, ch);
$ r% c5 E9 U% I3 y! R4 `6 l    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );# @" V/ \* X- V. W
        return ch;6 r' K  N6 }! W/ b" a# U3 }4 h$ B

& |6 y9 C( z) y+ C% I+ o

; J4 L4 m) g0 F# R7 E}7 A4 y6 h$ E5 N/ u9 Q
1 H# O9 B3 d5 W3 |  S/ {

* T, F& B; M- m% P+ ^6 j$ v, z

! c& Z9 Q  z/ J4 Q; T/ G; R% w7 B命令缓存
* U2 q) z7 [/ c: Q! ^# G" x3 k' s! S6 N! o8 ]

# p5 f* j- F" ]; M- C9 JtCmdLineEntry g_sCmdTable[ ] =
8 t" `7 Y3 H5 n6 m  j' p  S{  V! a* m2 w8 p7 T0 N" {
    {"help",        Cmd_help,"\t\tisplay list of commands\r\n" },, a, H- {6 ^, h& W* d1 U# ?
    {"?",           Cmd_help,"\t\tisplay list of commands\r\n" },
/ s/ `& @; P) l, F3 c' X    {"getbaud",     Cmd_get_baud,"\t\t:Get the current baud rate\r\n"},
1 n% q% F% a" `% Y$ N$ K   {"getstate",    Cmd_get_state,"\t:Get the current flag state\r\n"},
8 `# X7 s/ w" r( O6 X   {"setstate",    Cmd_set_state,"\t:Set the current flag state \r\n"},: l$ H1 c8 y; Z7 E( S. ?
    {"resetmcu",    Cmd_MCU_Reset,"\t:Reset MCU\r\n"},1 `! ]# v' ^& |/ z( q
    {0,0,0}
7 D4 C& F" j8 E" K};8 ~1 P# L* l2 P

2 i7 S* `1 v- K9 R: l' m4 C
0 B' |1 A' }3 S+ {* v0 l' ^3 ^
' m; G2 ?5 r: W+ P' k. w- R8 {

: c8 n* _: x2 j9 t+ r这个 格式就是 输入的命令   函数名字   提示符
/ Y8 |/ H+ C$ H. G$ e自己往里面加就可以了- [# W# k% ^: R+ `4 j
至于这些函数自己实现就行了
6 f2 U0 |" L8 eint Cmd_get_baud(int argc, char *argv[])
0 V2 `5 H$ k9 x0 o{7 G. N7 c" M( s8 e
        uint32_t baud=115200;  N8 Y* ]  Z, F- g% T) I0 X# Z
    uint8_t APP_Data[8]={ 0xAA,0x01,0x00,0x00,0x00,0x00,0x00,0x55};//»ñȡЭÒéÊý¾Ý
0 Q& c5 i! Q. Q6 l0 d        uint8_t i;) q1 F0 n; k9 d3 Z/ }7 h2 p
    printf("baud= %d\r\n",baud);8 G7 _0 L+ h. c1 G. D
    for(i=0;i<8;i++)7 x& _( p+ [3 C4 |( b" i
    {- d& u" }9 N0 E. x4 }( U
        printf("APP_Data[%d]=%-d\t",i,APP_Data);
+ L# Z+ ~1 @$ f/ l6 I( E    }1 \6 m; \3 Y4 o" U
    return 0;
, D  `( A% d  w7 d}( T* D# a1 i- m4 r
& h4 d$ u  s# @
0 {, N6 H4 M1 F) a8 a1 a
就这样:) c: i0 ]1 d9 `$ E# o  ?5 L+ {( u
注意  很多和我一样的菜鸟不玩linux 可能对函数int Cmd_get_baud(int argc, char *argv[]) 不是很懂,建议百度 秒懂
7 ?5 Y1 O; B- x. B6 Q
% B6 U- U, M+ c
4 F/ M) _& }/ h% u9 x! a) H: L3 i
命令解析部分  可以不用管 看这个函数  主要就是提取解析 结束符和 上面红色函数的参数,其实我也不是很懂,有能力的可以详细解释一下
/ f- [9 M. D( |  K4 u+ R4 H/ d1 o1 [  u

' |- Q# i5 U8 ~int CmdLineProcess(char *pcCmdLine)2 X) S6 k9 x! F: e2 [7 l, U
8 v. A: z& d  v* h

9 o5 z% z2 @5 {1 E& [main函数
4 w- s; u0 a0 M; M% ?6 M- e! [while(1)* C: b$ `, C' Y8 Y- ~/ d  k
{' Q& _3 b4 ~1 A8 r! O
        if(flag)" A; U' }9 r9 [8 x
                {
" t  L8 E+ V8 J: S7 g& B                        if(CMDLINE_BAD_CMD == CmdLineProcess(cmd))
3 x" c2 ?- p$ M) B9 P1 b                        {
: y3 j2 k5 b1 ~0 Z: ]% f9 P* R) M+ k                                printf("unkown command, please input \"help\" \n\r");
" d4 }- u0 t; o: H' D                        }4 Q1 m' p. W  J" c( `
                        flag=0;; ^) X  ]0 I) y7 B0 o
                        * T. f4 U3 S' W5 F$ {- w- H
                }   Z- t; I5 f7 Z& c- E0 D
: ~$ x# k6 }" \1 N, |$ B

* t8 a7 n8 x( Q5 a4 h

9 O" t9 \7 @8 R) `}  @$ R# m( F+ s8 W; G' t' v
打工搞成 ,记得选Use MicroLIB 不然可能会死机哦  如果自己修改过不用这个库的话   就不必要做了( m  M0 j5 Z  j
                SHELL.rar (1.57 MB, 下载次数: 182)
baud.png
CMD.png
help.png

评分

参与人数 2 ST金币 +12 收起 理由
creep + 10 很给力!
MrJiu + 2 赞一个!

查看全部评分

1 收藏 3 评论11 发布时间:2018-7-12 10:29

举报

11个回答
寂寞,点燃一支烟 回答时间:2018-7-12 10:32:00
提交了之后发现  那个tCmdLineEntry g_sCmdTable【】出现了表情 这个是字符格式个表情重复了 ,不惜在意; [, `8 ^- q4 t( h/ p
源代码没有问题!
MrJiu 回答时间:2018-7-12 11:03:20
建议也把工程文件发上来!!!
creep 回答时间:2018-7-12 13:50:16
支持!!!
andey 回答时间:2018-7-12 17:28:00
提示: 作者被禁止或删除 内容自动屏蔽
西点钟灵毓秀 回答时间:2018-7-12 20:02:13
bucuo 不错不错
anobodykey 回答时间:2018-7-12 21:41:46
感谢楼主分享
寂寞,点燃一支烟 回答时间:2018-7-13 14:06:27
MrJiu 发表于 2018-7-12 11:03$ X- c& F# q, n+ x* A6 i& ^  T- f7 J
建议也把工程文件发上来!!!

  j( w: ?9 O/ z7 ?5 _1 p提交了啊 ,欢迎下载
寂寞,点燃一支烟 回答时间:2018-7-13 14:06:48
creep 发表于 2018-7-12 13:50% c1 J% ]6 O0 V
支持!!!

( [" m$ w+ m" i9 o+ C. }0 P 谢谢大神
wujique 回答时间:2018-7-14 18:27:41
我有移植UBOOT的命令行到407
zero99 回答时间:2018-7-16 17:11:53
赞一个
寂寞,点燃一支烟 回答时间:2018-7-25 09:25:38
huangxuejia-292 发表于 2018-7-14 18:27
! h- e# X% M5 i) f. X我有移植UBOOT的命令行到407

$ k! J2 v% t( D$ m3 C欢迎分享
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版