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

STM32F103实现类似SHELL命令调试

[复制链接]
寂寞,点燃一支烟 发布时间:2018-7-12 10:29
楼主也是参考别人整理的,主要是为了和我一样的菜鸟 进行 CTRI+C  CTRL+V 做的准备  让你一分钟就移植成功,后续我再做在操作系统TreeRTOS下的,当前别人可以做一下 方便我们学习,不BB了,看效果图:
/ j' R. x4 V; h1 `% j- k4 |; @
3 G; r) R, }# D1 @
命令结束符是回车  这个主意一下 ,不然就是未识别命令,我估计很多人会用SecureCRT 这类软件,这个是可以用的,自己配置一下就OK
% c# Q. `) G' _" p* z5 A1 J  J0 E9 m6 z% e5 M1 X6 m
. Z, `! \. v( @9 R. Y
  g; T& V9 \+ o# Y+ x
# Z* O9 `( v; ]7 J

6 A1 [% D- v0 A) |3 i- |% H' U

% \. }! @, T4 ?8 T代码解析概要:
! t! A' z8 p# s5 M中断接收处理: 这段代码的方式大家应该陌生,收到之后缓存
5 f9 v" o' f/ U1 e  P6 ?: [& N" Rint i;
% P  e/ Z/ R8 v' runsigned char ch;. W$ s# I  o% m9 ~- ?( y3 ?
void USART1_IRQHandler(void)
) P8 f4 P8 ]( g  Q& `2 p{            
" `) g5 Q1 w' J          ch = getchar();1 N+ A6 s; m* ]; `8 D% ~6 @7 n# p9 A# e
                  if(ch!=0)
* N7 _. v( |. _+ k0 O                        {
2 e3 s! B$ p3 u1 @) e                                cmd[i++] = ch;1 d7 m) q) X0 M0 R
                                if(i>CMD_MAX_LENGTH)
+ P) x% S3 {  h: S                                {9 X3 W9 h& B& A
                                        i = 0;1 \+ N2 y! k1 d2 \! X' J
                                }                       
( p: y2 @; p  F' k1 W, g                                if((cmd[i-1]=='\n')&&(cmd[i-2]=='\r'))
- c4 ~, b/ D7 `* u                                {
. a. g: E8 a9 c/ @6 ^                                        cmd[i-1]=0;0 H# l5 o) s7 |8 A8 e! y
                                        cmd[i-2]=0;       
# g! `5 H: E5 O                                        i=0;
- K' r* m9 V1 c6 |) d( R                                        flag=1 ;" }# ^% u* R: t+ r8 Y/ n' u
4 m! ^7 Q2 ~* u+ R
% E0 W/ a  B- A9 |8 o! o& I1 U
                                }       
0 ?  `8 K& m$ r* t6 Z: A                  }3 P1 Q) j& T! L
}7 e- K2 b' b+ r0 p
# r: O9 Z/ E4 L
重定向C语言函数
0 L  s9 C; u# g& d; [3 W4 hint fgetc(FILE *f)
3 n6 ^4 o% j) K2 t! O{
" l; Q+ v$ Y/ V( ?8 A; W        while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
$ v% H1 n. }( W  v/ h5 s7 g7 X        return (uint8_t)USART_ReceiveData(USART1);+ @% @) G( u1 Z
}( W: S" q% C9 Y  M/ T) h
int fputc(int ch, FILE *f)# E: ^2 _* a1 z7 V3 m3 H
{
9 t: o: o: O6 q3 O5 f; w* x* k        USART_SendData(USART1, ch);
, h' J$ ^4 ^- q) k( a    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );% X$ t2 n7 {. ^0 z, h& @
        return ch;% N8 w4 j! J8 U! Z

# \# M1 u/ g. L, _, Z3 E& H# e
  M! ?6 y7 T+ m: {9 h, s
}
1 L& h4 G: l) `9 ?) z' ^

3 t3 F$ D0 Y" Y8 \! R1 b5 f! a- c* L
, u# L6 C! Z, P% s3 T! u) M% u
命令缓存" T* H! \# v: R: l% k
9 W# c4 ]3 A9 I4 Z
6 A( x0 v& K$ S3 _. d$ ^7 l$ t
tCmdLineEntry g_sCmdTable[ ] =
' V+ ]2 @) P9 C: X! N1 S{' G" D) T+ j% ?, x
    {"help",        Cmd_help,"\t\tisplay list of commands\r\n" },
, ]. Y/ N7 ]  {  M    {"?",           Cmd_help,"\t\tisplay list of commands\r\n" },. p% O1 I, D: }; b
    {"getbaud",     Cmd_get_baud,"\t\t:Get the current baud rate\r\n"},
' W# @: T2 P$ Z0 T8 M$ l0 l   {"getstate",    Cmd_get_state,"\t:Get the current flag state\r\n"},
3 B) r, \# `/ F; w2 S) ?   {"setstate",    Cmd_set_state,"\t:Set the current flag state \r\n"},
3 F' e. A4 D; X' R7 Q, c9 [    {"resetmcu",    Cmd_MCU_Reset,"\t:Reset MCU\r\n"},) k9 d1 C( U; A9 j  T  n! T1 o
    {0,0,0}
( h& b! Y  K9 b: }, r) e+ ^};9 n$ `7 P: {# G% q
0 w) k# x  {9 M% V$ n/ u/ Z
0 m2 s& G5 c/ S  r' c
0 h- s( R, N1 A6 ]

# E# Y7 c" Z5 T6 {这个 格式就是 输入的命令   函数名字   提示符* I- L. ?0 _7 q4 j" s
自己往里面加就可以了
1 h. S+ c, F* L. h5 X至于这些函数自己实现就行了
: _, G0 E- m* e. Cint Cmd_get_baud(int argc, char *argv[])0 F" H% |' A3 O
{3 P8 z- V, J; w" N/ a, H
        uint32_t baud=115200;
3 a/ a; @" e8 S3 d    uint8_t APP_Data[8]={ 0xAA,0x01,0x00,0x00,0x00,0x00,0x00,0x55};//»ñȡЭÒéÊý¾Ý
4 m' g, s3 K, @: J$ X) J$ i        uint8_t i;
5 T; O  G. g( ]& @3 x9 h9 Y    printf("baud= %d\r\n",baud);. t8 l- Q/ Q- M# A, K, {; O
    for(i=0;i<8;i++)
8 l* _- n( g: O0 C1 Q% J% q( w: R    {
! C9 M2 _( O; O! |+ z1 H, \+ |$ R: |        printf("APP_Data[%d]=%-d\t",i,APP_Data);5 M9 ~# L" z- Q. ]) r% o
    }9 P/ k9 p* B  U3 S
    return 0;
- s; I- s. O& s; x}- P0 K$ b  ?+ c' v7 M) r& P2 Z

! f9 a1 p6 P! X

3 {1 P' R: }! Y2 U8 m就这样:
6 B5 q3 d: {2 y% n7 h4 c注意  很多和我一样的菜鸟不玩linux 可能对函数int Cmd_get_baud(int argc, char *argv[]) 不是很懂,建议百度 秒懂
$ \, |+ h7 H; }5 i' z- i: H/ s1 C: Y

# @4 j1 E9 p; Z. d% |命令解析部分  可以不用管 看这个函数  主要就是提取解析 结束符和 上面红色函数的参数,其实我也不是很懂,有能力的可以详细解释一下' v6 ^$ m7 F  ~" X
! |" s4 |2 c0 @$ x9 D' z/ N
+ [  D  k3 A& W, e! G! o8 `8 n+ @) R
int CmdLineProcess(char *pcCmdLine)4 E0 m2 h- ~7 Q! y* K: N

9 M  ~: f6 R1 `8 r; p3 k
4 [9 l2 O3 F2 F9 d  E
main函数6 V+ ]) F# F$ Q( t
while(1)
- `# X6 G6 I9 F) C0 D3 k( m{' P, L$ n2 e! q
        if(flag)
! A; `6 T/ T3 L. I                {
) R. X! J3 @. O* F+ H                        if(CMDLINE_BAD_CMD == CmdLineProcess(cmd))
6 J# y1 V  b# j, C% X                        {- [! i4 y' k- z/ o  e' D1 {- F
                                printf("unkown command, please input \"help\" \n\r");
+ q2 f7 }8 [+ X& G3 }0 d2 w                        }  S' F* u( T; Z( Z- b  l, m% F5 W* I) q
                        flag=0;% k4 c! s+ C, M9 \
                       
: i; ^! g( C+ ~4 F# U0 ]                }
4 y# p" M* I9 s& M; r  L+ P. ~8 c& B

9 Y# g- @$ w' J- F

9 O9 q0 l3 p* S- L0 N8 M- f}) O" [/ N9 y! Z8 [1 B$ v' s% t
打工搞成 ,记得选Use MicroLIB 不然可能会死机哦  如果自己修改过不用这个库的话   就不必要做了9 f$ h* j& q% m/ p$ P
                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【】出现了表情 这个是字符格式个表情重复了 ,不惜在意( \, |/ m8 u1 v2 n
源代码没有问题!
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:037 W" A8 t( A1 Y- O* ?7 _
建议也把工程文件发上来!!!

/ q7 w  P& c: o+ N1 I9 E提交了啊 ,欢迎下载
寂寞,点燃一支烟 回答时间:2018-7-13 14:06:48
creep 发表于 2018-7-12 13:50
: B% x' v7 r5 `( K7 V2 v8 k支持!!!

: `% {, t6 N7 g" 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* d0 G' t/ M# U0 D8 H( v
我有移植UBOOT的命令行到407
% {3 x/ X& h' g& ~+ L9 [7 \* o
欢迎分享
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版