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

Ubuntu下使用Makefile开发STM32(合集) 精华  

[复制链接]
qianfan 发布时间:2015-10-22 20:52
本帖最后由 QianFan 于 2015-12-5 16:45 编辑 ) ^0 Z1 d7 Y! Y) l. P
( k' e" E; ?7 M
    许久没来论坛发帖了。从今天开始,写Ubuntu下使用Makefile开发STM32,来水一下经验,希望大家不要见怪。几天一篇。这个帖子作为一个合集,以后新出教程(或许叫做笔记更好吧)的网址就贴在这个地方。方便大家阅读。
+ I; ]8 o1 P7 \4 p8 g+ Y2 C. _8 v$ x% U- n! ?/ B
    鉴于篇幅的原因,有些东西不能够写的太细,比如什么软件的安装啊,或者设置PATH路径啊。还请大家自行谷歌。当然了,谷歌已经挂了,还是用镜像吧。这个镜像我用过几个月了,很稳定,一直没有出现什么问题。4 @" g. ~( u! P: g* x; w; z

0 R2 I, N0 H5 ~; B0 J    Ubuntu不同与windows。可以你会说在Ubuntu下开发是瞎折腾。当然,如果你在windows下开发会有许多优秀的IDE。有付费的,有免费的。但是在Ubuntu下却不同。虽然你可以使用Eclipse装插件的方式来编写,但我看来那并不是一个好方法。特别是对刚开始进行Linux下开发的人来说。那个插件给你做了太多的东西。在他的基础上,你不会深入的理解newlib库的系统调用。出了问题之后,甚至不知道从何下手。所以,对新手来说,最好的方法就是不使用IDE,虽然这可能有些困难。% @* f+ s8 }, W0 p& m$ \. N
7 H- w- `+ C( A. W6 M
    说这么多并不是为了黑IDE,也不是为了体现命令行下的编译多厉害。只是想说IDE,让我们变笨。一旦习惯了IDE之后,我们甚至忘了程序是如何链接的,甚至不知道为什么需要将多个源文件一股脑的加进工程中。或许有人还会在main.c文件里面写几千行代码,而不是将他们分文件组织。刚开始在Ubuntu下开发STM32的时候,我也曾怀念Windows下IDE的日子。有那些熟悉的Keil,IAR,CoIDE。我也曾想将window下的IDE搬到Ubuntu上面。于是开始安装wine。可是事情并不像想象中的那样发展。于是我给Eclipse装插件,一步一步的摸索。然而网上陈旧的资料并不总是有效。特别是在软件版本更新这么快的时代。无论如何,最后还是如愿的装上了。但是里面的文件太过繁杂,并不适合。
8 g/ t0 j  f4 L, u9 @, |    Eclipse行不通之后,我又对CodeBlocks动手。用它开发STM32,经过若干天的失败之后,终于能够用它编译程序,点亮一个LED灯了。只是成功的一小步。用着用着,发现如果我想改一个编译参数,比如用C99吧,却要动那么多次鼠标。想加一个头文件路径,还要使用鼠标进行繁杂的操作。终于想通,告别IDE,拥抱Makefile。! h" ]) U* ]9 E% Y( D2 p3 n% J
% D* J; \9 ^0 o, [: P- A; Z3 n% c
    下面的几篇教程会讲解如何在Ubuntu下用命令行开发STM32。敬请期待!
* F5 z5 D1 t3 Q& e8 V$ j, f* @# p% E/ |4 |0 X$ \& _, [3 W$ U
以下的所有帖子都是在Nucleo303(之前在社区兑换的)的基础上编写的。如果你想更换其他的板子,请更改固件库中的所有文件,以及链接文件。- L5 P+ @/ S# T, S) g5 u; B8 Q, [
- C; @4 y/ n7 Q) {9 I7 k
0.工欲善其事  https://www.stmcu.org.cn/module/forum/thread-603768-1-1.html
  • 在Ubuntu下寻找Nucleo的串口号。
  • 安装常用的串口软件。minicom,putty。
  • 安装st-link在Ubuntu下的驱动程序。包括下载用的st-flash,调试用的st-util。
  • 安装arm-none-eabi-xxx。( o3 ~/ l6 @1 H' j- u, F: t& y
, n2 j* H( y0 H
1.我叫Makefile  https://www.stmcu.org.cn/module/forum/thread-603780-1-1.html
( _" c, n4 s0 j- Y$ Y9 V
  • 使用Makefile进行简单的工程管理。6 `, S+ X( S. p8 w9 S* h) u7 y+ i2 K1 E

( I, Z! S+ c7 B0 U+ C* p2.灯,等灯等灯~ https://www.stmcu.org.cn/module/forum/thread-603787-1-1.html
# z* X1 g, S$ F, B
  • 固件库准备
  • 编写Makefile
  • 编写main函数。
  • 编译,链接,下载8 l8 S9 D; s8 _, B

# l! l$ `8 D/ U7 h3 i0 I" \3.优化程序大小 https://www.stmcu.org.cn/module/forum/thread-603791-1-1.html
3 C3 L7 v: _9 }( k
  • 未优化(6372Bytes)
  • -Os优化(3780Bytes)
  • -ffunction-sections,-fdata-sections,-Wl,--gc-sections优化(1680Bytes)
  • -ffunction-sections,-fdata-sections,-Wl,--gc-sections,-Os优化(1348Bytes)2 F. }5 _9 j  E7 v/ k' `, I

; U6 v$ f6 y7 p, w1 P' s4.在SRAM中运行程序 https://www.stmcu.org.cn/module/forum/thread-603793-1-1.html
  • 反汇编代码
  • 分析flash.ld链接文件
  • 修改flash.ld,将代码区域更改到RAM中
  • 修改Makefile,生成SRAM中运行的代码。
  • 下载,反汇编验证。
  • 隐含的巨大bug。(中断向量表的问题)' P2 y' u: R1 ?/ O

6 |; g. k3 C9 c3 b: Y5.使用串口Part1 https://www.stmcu.org.cn/module/forum/thread-603881-1-1.html7 V8 p( t7 j! X# j$ M
  • ringbuffer
  • 在中断中使用ringbuffer
  • 使用gdb调试
  • 添加volatile修正代码
  • 修正ringbuffer的无锁实现。5 Z; W+ s$ O5 j2 F+ {
  • 隐含的bug。(中断向量表的问题。下节讲述)
      I0 I7 V$ T6 }$ @4 G, k

8 {6 q1 C+ |; X4 i& l, ?6.使用串口Part2  https://www.stmcu.org.cn/module/forum/thread-603909-1-1.html5 f/ u$ g6 e7 D8 o" j
  • SCB->VTOR
  • 更改Makefile进行版本控制
  • 修改__io_getchar适用backspace
  • _exit系统调用
    ' h3 L! l2 u) t
  q6 k, P/ \5 N  ~* U
7.使用printf  https://www.stmcu.org.cn/module/forum/thread-603927-1-1.html
  • syscalls
  • 使用Newlib-nano减小代码大小
  • 为Newlib-nano添加printf的浮点输出支持。
    " d. q2 t, {" |( F
- B' l/ m6 O/ C0 h  G
8. 使用硬浮点计算 https://www.stmcu.org.cn/module/forum/thread-603940-1-1.html
  • 反汇编相关软浮点代码
  • 添加硬浮点运算的参数
  • 反汇编相关硬浮点代码
    ! B: H- `. [: {5 H
/ l: V1 n- Y, w, i2 Y
9.再谈_exit  https://www.stmcu.org.cn/module/forum/thread-603942-1-1.html
  • 返回值和参数的传递规则
  • 将main的返回值传递给_exit. V6 M9 O5 M: F. d
- ^4 E: W* A! j3 S0 t# T! X
10.使用malloc https://www.stmcu.org.cn/module/forum/thread-603945-1-1.html- m. j0 x- ]' @3 ~+ ]7 t) Y
  • 动态内存分配机制
  • malloc内存分配测试
  • 为栈保留安全域量
  • 内存布局
    ( P. ~/ M* Q& ^1 A9 }* p

  Z6 m# \. ]" s7 J7 v/ j11.使用gdb找出因除0导致的HardFault。https://www.stmcu.org.cn/module/forum/thread-604503-1-1.html* o9 k' Y- W4 G) r$ \7 T7 S

" g' O3 t* B4 o7 R' Z" `. a; Q1 w) z, L; K& D3 r' |5 _
完结$ ]- R* C1 U& }7 _0 B% S) [
$ A3 w& n% @) J2 l( A& D# z9 I
发一个最终版本的文件end.zip。里面包含Makefile,syscalls,以及串口的源代码。# B5 r# e0 [3 N1 }
串口中添加__io_gets,__io_puts。用于从串口中读入一行数据(考虑backspace的情况)或者发送一个字符串。" W; ], i$ X& B) M) A: }, C
9 {2 m9 L. ^. s  E* M: V- `

end.zip

下载

401.67 KB, 下载次数: 425

评分

参与人数 1 ST金币 +30 收起 理由
zero99 + 30

查看全部评分

1 收藏 52 评论89 发布时间:2015-10-22 20:52

举报

89个回答
johnlees 回答时间:2021-5-30 20:24:24
when i use make all to the file of "end" ,the terminal show:
8 g5 S7 O7 S: b# L" t& F  A6 @3 E# q( pcc: stlib/startup_stm32f30x.S% W# u+ R0 W4 j" F# I9 p
cc1: error: bad value (cortex-m4) for -mcpu= switch" x) t% A" D; X" ^' S5 C
cc1: error: invalid floating point option: -mfpu=fpv4-sp-d16! I  H: Y" P1 E5 J7 p' o/ Q
Makefile:63: recipe for target 'stlib/startup_stm32f30x.o' failed
/ ~3 S3 c  ~: U7 V. wmake: *** [stlib/startup_stm32f30x.o] Error 1: G: \3 M6 G9 q5 b
thanks7 V: O2 r' [# u4 z% t

1 B. k. I2 [5 u& R  O8 T
7 n2 g0 H/ ?' s
qianfan 回答时间:2015-11-8 21:07:50
pythonworld 发表于 2015-11-6 12:44
. C8 @$ E9 ?& E  p谢谢楼主。能否再写写怎么用HAL在Linux开发。
9 M" y& ~6 }  n# b
这个系列的帖子不是为了讲解标准库如何使用,而是为了讲解如何使用linux下的相关工具进行开发。因此,使用标准库还是使用HAL是不重要的。
你好我好大家好! 回答时间:2015-10-23 08:57:48
帮顶                                 
qianfan 回答时间:2015-10-22 20:57:26
自私的打上一个版主推荐
creep 回答时间:2015-10-22 22:12:57
自私的抢个版主的板凳,这帖子必须得加精啊!
风子 回答时间:2015-10-23 00:52:32
地板留给我,坐等更新
yanhaijian 回答时间:2015-10-23 08:22:09
坐等更新啊。
ataudio 回答时间:2015-10-23 08:22:11
太自私了,楼主连google的镜像都自己私用了。。+ y  U  Y7 J* E: P! s
http://www.guge.click/& Z0 y$ `6 l7 W9 K: B, t+ f& l
无法显示网页。
' ], Z; k$ A1 g; _
& f  Q: Y" A# y& U2 J7 n还好我能直接使用google.com
& h4 e  c* S$ x3 \/ j, I
MouseCat 回答时间:2015-10-23 09:22:32
又有大作推出哈,围观
watershade 回答时间:2015-10-23 09:28:36
linux上配置st-link海挺复杂,openOCD试了一下,没连通。回头也在试试
eshui 回答时间:2015-10-23 10:04:24
牛                     
无线传感器啊 回答时间:2015-10-23 10:18:17
qianfan 回答时间:2015-10-23 12:59:27
creep 发表于 2015-10-22 22:12
# f/ v( @  f6 C3 H( N自私的抢个版主的板凳,这帖子必须得加精啊!

0 K# @+ @( m) N9 V1 z- `那天脸皮厚了,自己加一个。。。
qianfan 回答时间:2015-10-23 13:01:41
风子 发表于 2015-10-23 00:528 n1 }3 G/ J9 J- ?- `
地板留给我,坐等更新
* L/ M/ m3 o% t+ ~
qianfan 回答时间:2015-10-23 13:01:59
ataudio 发表于 2015-10-23 08:22
% a5 ?6 k& @5 j$ |  K太自私了,楼主连google的镜像都自己私用了。。
0 v: d2 W7 ^2 m7 z- lhttp://www.guge.click/8 a5 w: ]7 A3 `1 N8 _
无法显示网页。
2 W; L1 \9 d- i" O$ x$ s, i# |* I
难道你打不开镜像吗?
qianfan 回答时间:2015-10-23 13:02:14
MouseCat 发表于 2015-10-23 09:22( Q- J( o" I2 L* I
又有大作推出哈,围观

* J8 V& D! z; ^, [( j好久不见啊

所属标签

相似分享

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