本帖最后由 黑皮男 于 2017-5-24 19:29 编辑 # t0 J* ^4 p. h) J) P& a, d- ~ 基本情况: 手上已经有了好几块STM32,NUCLEO_F303,NUCLEO_L073,NUCLEO_L476,NUCLEO_F412。感谢社区,收集了这么多板子,满满的幸福感啊。之前也通过串口和NUCLEO进行了交互,但是在后续调试的过程中发现问题很多,经常死机。由于当时码代码水平有限,也就只能那样了,随着逐渐的深入学习码代码,相比之前来说,可以实现更多的功能了,也能更容易的理解各位大咖写的代码了。现在再来发表一片试用的帖子,这次不是使用一块板子,而是两块,L073和L476。所搭建的代码同时支持这两块开发板,实现了串口命令行。先来张效果图* A5 s- [; T% d 代码结构:+ o' Q* V- k3 N- [) v1 S ecode |-common$ P) f$ [) i, e6 x( k+ l* Z |-drivers |-library |-OS6 W/ j I3 V6 Z* x |-FreeRTOS |-platform( [- ~! g, M: Y7 d2 h- D |-targets& G& H+ k2 P G* C |-TARGET_STM32L0 |-BSP; Q( s' `6 V+ B7 Y. L$ ` q |-CMSIS: ~' T" Y- J H: Y3 m$ h% H# M |-common |-NUCLEO_L0735 L a) P. P. L Q |-STM32L0xx_HAL_Driver% ?6 v7 j* A/ p6 ?+ @3 s7 g, @ |-TARGET_STM32L48 h( ^* `) C$ T! Y$ S, ?! E |-BSP, {$ I2 y; L+ n+ S/ d |-CMSIS0 o! {+ u6 {6 w8 U- t( S |-common0 F. N8 i5 r$ P |-NUCLEO_L476: h5 a4 p6 v% J6 D) s4 W& s |-STM32L4xx_HAL_Driver8 p+ k) Z. {7 d; _ 1 z; Y1 b t$ I' f3 i+ ~ |-user 以上列出了主要的代码目录,借鉴了一下mbed,整个target来决定目标板。target目录主要是对不同的目标板进行封装,然后提供统一的接口函数。 所有平台相关的代码都在platform目录中,目前实现的功能有命令行,pwm,serial,timer,platform_driver。像mbed这样的软件平台提供的接口函数很友好,所以这里也借鉴了一下,例如pwm功能,有period_us,period_ms,period_pulsewidth_us,period_pulsewidth_ms这样的接口,对于使用很方便,虽然都是借鉴,但是这也是一种进步,看的多了,也就慢慢会写了,以后就会慢慢行程自己的习惯。. g! \+ g/ G5 `& F4 L5 P 此外不得不说,前人都趟过不知几遍浑水所总结的经验,真的没有必要自己再从头走一遍,拿来用,这样才能更快的完成新功能,这次所完成的命令行是基于双向量表来完成的,这里借鉴了一下linux平台下的list实现方法,真的是太经典了,自己之前写了一些简单的链表结构,感觉很混乱,还是大咖们写的经典啊。 命令行的实现: 命令行其实就是对一串字符串进行解析,然后根据解析的结果找到对应的函数并执行。这个就是最基本的思路。6 a! q+ P8 M% x. H- b+ a 实现命令行可以分解成,字符串输入,字符指令和参数解析,命令匹配和执行这几部分。 先看一下命令行的结构体,/ R1 o+ w3 ^: K4 K$ C o* \ U$ c
/ s+ W; s, R& a G4 O2 s 接下来看一下命令匹配部分,(又开始贴代码了),list_for_each,强大的list由此开始,首先是串口数据接收,接收完一行数据后,解析出指令的命令名称和参数,命令名称传入此函数进行命令匹配,如果命令名匹配成功则进行执行相应的命令。这里的每个链表节点都是指向一个命令数组,每个数组中都是不等数量的命令。 n3 _1 y. w+ K* y
% S" A+ P; k" u3 l9 \ 完整的代码放到了github上了http://github.com/ArnoYuan/ecode,有点大,就不上附件了,剩下的代码也不一一介绍了。 . `* z' U" k- A% t$ o 非常感谢QianFan (相关gcc+makefile编译的帖子https://www.stmcu.org.cn/module/foru ... 53&highlight=ubuntu,虽然是在ubuntu环境下编译,但是windows也可以搭建出linux的编译环境,需要交叉编译工具gcc,git附带的linux命令行和mingw的make),参考了其相关的帖子,支持了gcc+makefile编译,同时也能够使用printf,只不过nano.specs目前还不能使能,虽然我的makefile写的不怎么样,每次都会重新编译,但还是能用的。 % R( O- a4 I6 G' o) p f4 k2 i L6 D 3 W' ^, |. Y9 n6 K- k3 K |
这个还是有的,只是简单的回显,没做过多处理
其实uboot已经支持stm32了,可以弄一个
可以 考虑一下