|
楼主也是参考别人整理的,主要是为了和我一样的菜鸟 进行 CTRI+C CTRL+V 做的准备 让你一分钟就移植成功,后续我再做在操作系统TreeRTOS下的,当前别人可以做一下 方便我们学习,不BB了,看效果图: * N9 l" X% b7 M8 ?4 a7 P3 ^* U' d3 { 命令结束符是回车 这个主意一下 ,不然就是未识别命令,我估计很多人会用SecureCRT 这类软件,这个是可以用的,自己配置一下就OK " k7 f( s4 ]8 K: _! Z( { ] 代码解析概要: 中断接收处理: 这段代码的方式大家应该陌生,收到之后缓存 int i; unsigned char ch;1 r5 V' h$ n, H& `1 n void USART1_IRQHandler(void)0 w$ u- O* C/ U2 d0 X9 { { 9 e! T! M( @/ ]2 P/ T ch = getchar(); if(ch!=0)2 X- M, x/ z! v% e' Q2 J5 @ {$ l! W6 p, f W/ Q9 ` cmd[i++] = ch;& j* V7 i9 y- Z( k, B% ^7 q if(i>CMD_MAX_LENGTH) {, [# r4 {; c0 A" L" A i = 0;" {( B7 r3 q$ l } if((cmd[i-1]=='\n')&&(cmd[i-2]=='\r'))! h* M0 @; @3 z! Z6 _+ E {/ J% T' _5 t5 M3 E% c( o2 r cmd[i-1]=0;! J5 {( \: Y- U+ o: ?* l cmd[i-2]=0; i=0; flag=1 ;8 c& }- o. u5 l + V9 F* b7 B2 {1 h 7 n Q/ g5 S$ E& A+ ^ } # s. b5 W' ?) ]! H* F5 f' j } } `- J( T" K1 |1 A) ? ) u! E% ?! q. n& I: h 重定向C语言函数 int fgetc(FILE *f) {2 ], r L) z+ L! o while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); return (uint8_t)USART_ReceiveData(USART1); }/ l& r) E8 r# b: N4 i, ?+ b/ T p int fputc(int ch, FILE *f): _* X' J, v, ~/ `( q! v' \4 V, x% h { USART_SendData(USART1, ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );. }" g+ O0 F/ M( [3 Y) I return ch;% W9 W" R# o) z0 D 0 H+ j8 s- I) Y) A" X U# {& D" i& | }0 X, S% g1 \7 j4 S. G " }/ v- i# F [ H0 R0 Y 2 B: P, y b$ Y 命令缓存# C1 D" G: E3 ^; m" Z " O. H( k2 s, Z. a tCmdLineEntry g_sCmdTable[ ] =8 Q2 a# S( O$ x' [- X { {"help", Cmd_help,"\t\t isplay list of commands\r\n" },( h0 q! q8 `1 { d7 A+ r{"?", Cmd_help,"\t\t isplay 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"},( p0 }/ Y5 N0 G1 x {"setstate", Cmd_set_state,"\t:Set the current flag state \r\n"}, {"resetmcu", Cmd_MCU_Reset,"\t:Reset MCU\r\n"},) {& t- V, V4 S5 c! U+ O, }; B {0,0,0} }; " n, L( ^: G" K7 M' @) s2 _+ G 这个 格式就是 输入的命令 函数名字 提示符, k% }9 V! c6 w% `) ~7 q 自己往里面加就可以了 至于这些函数自己实现就行了8 L; e2 @5 @% p, D+ H) q, y$ b int Cmd_get_baud(int argc, char *argv[]) {; Z( S; A4 \% Q1 Z: g uint32_t baud=115200; uint8_t APP_Data[8]={ 0xAA,0x01,0x00,0x00,0x00,0x00,0x00,0x55};//»ñÈ¡ÐÒéÊý¾Ý uint8_t i;4 y/ P4 ~% {6 T% ? ~; c. p printf("baud= %d\r\n",baud); for(i=0;i<8;i++); Y. z @9 G' h3 R7 c { printf("APP_Data[%d]=%-d\t",i,APP_Data); }2 s9 u* o* g5 m% P4 l; R return 0; }0 z2 m7 V- c0 m" X( y, U7 o0 \7 b 1 A' e" p9 v6 T' }+ A9 V4 n + w9 {7 n/ R# ~" l: b. {9 B 就这样: 注意 很多和我一样的菜鸟不玩linux 可能对函数int Cmd_get_baud(int argc, char *argv[]) 不是很懂,建议百度 秒懂4 _6 s- A" ~* W : U0 f# X5 L9 E% \) R3 z6 a' @ 命令解析部分 可以不用管 看这个函数 主要就是提取解析 结束符和 上面红色函数的参数,其实我也不是很懂,有能力的可以详细解释一下4 ]$ l1 \' D& K " i) k, I, F& n% y6 U& d8 _. _8 n int CmdLineProcess(char *pcCmdLine) , J1 |4 r7 S: i6 L; n0 s% k / r1 P1 z2 X4 M main函数 while(1)" F2 @+ L( S! x8 ~% k" t* } {/ W0 G9 ]8 S2 ]& Y) n: u% Q4 J if(flag) { if(CMDLINE_BAD_CMD == CmdLineProcess(cmd))5 C" [( v+ }1 E# z4 g& K1 _& V {2 R1 i; h& v; m# E printf("unkown command, please input \"help\" \n\r"); } flag=0; 1 ~0 E% [* H, W7 L } 3 K- e+ ]: U i6 K* D" L & i5 h! Y6 H$ L" o8 w }- m& o; L4 \9 J2 `3 p& p1 k, g 打工搞成 ,记得选Use MicroLIB 不然可能会死机哦 如果自己修改过不用这个库的话 就不必要做了# ], x/ d# z/ C; U
SHELL.rar
(1.57 MB, 下载次数: 183)
|
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:雨露均沾·逢7狂欢】之五:STM32系统时钟PLL故障排除1例
【福利三:雨露均沾·逢7狂欢】之三:AI帮我查BUG
福利三:雨露均沾·逢7狂欢】之二:STM32F407VG串口通信乱码故障的排除
基于STM32F103的I2C主从机通信
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
TFT LCD 与 FSMC 的硬件连接大容量 STM32F10xxx FSMC 接口
单片机:初学者该了解的STM32F103基础知识
2025软件工具兔哥知道
STM32之继电器模块
微信公众号
手机版
源代码没有问题!
提交了啊 ,欢迎下载
欢迎分享