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

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

[复制链接]
qianfan 发布时间:2015-10-22 20:52
本帖最后由 QianFan 于 2015-12-5 16:45 编辑
; M; m& W7 _* v) ~6 T/ x2 h( m& V. ?9 M1 V
    许久没来论坛发帖了。从今天开始,写Ubuntu下使用Makefile开发STM32,来水一下经验,希望大家不要见怪。几天一篇。这个帖子作为一个合集,以后新出教程(或许叫做笔记更好吧)的网址就贴在这个地方。方便大家阅读。1 B; o& r" e/ U4 ^# Q& ]" l9 m2 a
* R& K+ |& a# d( O2 x' z* T, t! D
    鉴于篇幅的原因,有些东西不能够写的太细,比如什么软件的安装啊,或者设置PATH路径啊。还请大家自行谷歌。当然了,谷歌已经挂了,还是用镜像吧。这个镜像我用过几个月了,很稳定,一直没有出现什么问题。, ^6 k& M- X4 d1 U$ Y% s" a( v( d

' V8 h4 b. E4 x( G2 I    Ubuntu不同与windows。可以你会说在Ubuntu下开发是瞎折腾。当然,如果你在windows下开发会有许多优秀的IDE。有付费的,有免费的。但是在Ubuntu下却不同。虽然你可以使用Eclipse装插件的方式来编写,但我看来那并不是一个好方法。特别是对刚开始进行Linux下开发的人来说。那个插件给你做了太多的东西。在他的基础上,你不会深入的理解newlib库的系统调用。出了问题之后,甚至不知道从何下手。所以,对新手来说,最好的方法就是不使用IDE,虽然这可能有些困难。
; V0 n9 q& c* D- j2 y0 R2 L
! j. `: A, G: v' b    说这么多并不是为了黑IDE,也不是为了体现命令行下的编译多厉害。只是想说IDE,让我们变笨。一旦习惯了IDE之后,我们甚至忘了程序是如何链接的,甚至不知道为什么需要将多个源文件一股脑的加进工程中。或许有人还会在main.c文件里面写几千行代码,而不是将他们分文件组织。刚开始在Ubuntu下开发STM32的时候,我也曾怀念Windows下IDE的日子。有那些熟悉的Keil,IAR,CoIDE。我也曾想将window下的IDE搬到Ubuntu上面。于是开始安装wine。可是事情并不像想象中的那样发展。于是我给Eclipse装插件,一步一步的摸索。然而网上陈旧的资料并不总是有效。特别是在软件版本更新这么快的时代。无论如何,最后还是如愿的装上了。但是里面的文件太过繁杂,并不适合。4 L5 n) v1 j6 h3 J
    Eclipse行不通之后,我又对CodeBlocks动手。用它开发STM32,经过若干天的失败之后,终于能够用它编译程序,点亮一个LED灯了。只是成功的一小步。用着用着,发现如果我想改一个编译参数,比如用C99吧,却要动那么多次鼠标。想加一个头文件路径,还要使用鼠标进行繁杂的操作。终于想通,告别IDE,拥抱Makefile。8 e8 t" e, T) f& H+ m8 D7 ?; O2 b- t

. x" G5 B' b* m6 K' R# o) ?    下面的几篇教程会讲解如何在Ubuntu下用命令行开发STM32。敬请期待!
( r5 r' t$ Q9 e6 h1 U2 G% a  G4 c+ d9 y0 F6 {8 c
以下的所有帖子都是在Nucleo303(之前在社区兑换的)的基础上编写的。如果你想更换其他的板子,请更改固件库中的所有文件,以及链接文件。# w: n( w7 _5 x! L

0 Q. `) }; t4 t+ X1 }
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。5 S) n. N) \1 T6 V: e" B  F

) g" i" N6 ~, k0 X# U1.我叫Makefile  https://www.stmcu.org.cn/module/forum/thread-603780-1-1.html% {6 \! w' C% J( j; U) e
  • 使用Makefile进行简单的工程管理。
    & \8 l: T1 T2 A0 L2 i

# N) G$ ~3 f7 C2.灯,等灯等灯~ https://www.stmcu.org.cn/module/forum/thread-603787-1-1.html
3 c: u5 E( @" y9 W3 R  L
  • 固件库准备
  • 编写Makefile
  • 编写main函数。
  • 编译,链接,下载7 ]: v' V9 P! ?

/ f! C3 u) r: j3 A3.优化程序大小 https://www.stmcu.org.cn/module/forum/thread-603791-1-1.html
( r: b3 x, _2 N/ F! ?. |  `
  • 未优化(6372Bytes)
  • -Os优化(3780Bytes)
  • -ffunction-sections,-fdata-sections,-Wl,--gc-sections优化(1680Bytes)
  • -ffunction-sections,-fdata-sections,-Wl,--gc-sections,-Os优化(1348Bytes)% q; y+ N! n2 d  Z% ?1 Q/ v
0 Y  Q# S" ?2 Z) _. {
4.在SRAM中运行程序 https://www.stmcu.org.cn/module/forum/thread-603793-1-1.html
  • 反汇编代码
  • 分析flash.ld链接文件
  • 修改flash.ld,将代码区域更改到RAM中
  • 修改Makefile,生成SRAM中运行的代码。
  • 下载,反汇编验证。
  • 隐含的巨大bug。(中断向量表的问题)& i$ y: M8 l' @- I! J
  `7 l6 M9 p, e' F# f& [: B
5.使用串口Part1 https://www.stmcu.org.cn/module/forum/thread-603881-1-1.html# t# T3 v0 R5 q9 H% o
  • ringbuffer
  • 在中断中使用ringbuffer
  • 使用gdb调试
  • 添加volatile修正代码
  • 修正ringbuffer的无锁实现。
    3 i# j4 ?3 a+ z0 E: D
  • 隐含的bug。(中断向量表的问题。下节讲述)0 A" l. l7 x- L5 j" D
8 d8 y' L) i: s! Y' Q
6.使用串口Part2  https://www.stmcu.org.cn/module/forum/thread-603909-1-1.html# Q3 ?9 Y- Y" z2 A9 E5 @3 z  A
  • SCB->VTOR
  • 更改Makefile进行版本控制
  • 修改__io_getchar适用backspace
  • _exit系统调用
    & F, x- B' v" T. {& H2 W) T
+ o$ o% ~# I) T% _+ N
7.使用printf  https://www.stmcu.org.cn/module/forum/thread-603927-1-1.html
  • syscalls
  • 使用Newlib-nano减小代码大小
  • 为Newlib-nano添加printf的浮点输出支持。
    : `# g8 l, Y, j" E& e" z: t' ^
2 X$ B+ \( L/ N- ^+ I
8. 使用硬浮点计算 https://www.stmcu.org.cn/module/forum/thread-603940-1-1.html
  • 反汇编相关软浮点代码
  • 添加硬浮点运算的参数
  • 反汇编相关硬浮点代码
    $ v5 c* M6 _3 t# `# @
' F" {+ R5 F' E7 j* i
9.再谈_exit  https://www.stmcu.org.cn/module/forum/thread-603942-1-1.html
  • 返回值和参数的传递规则
  • 将main的返回值传递给_exit
    0 u4 m) K5 k4 x4 l* a

9 A8 {; R* Y$ |, C4 r10.使用malloc https://www.stmcu.org.cn/module/forum/thread-603945-1-1.html. U+ ?1 _" r, d2 b3 J( @
  • 动态内存分配机制
  • malloc内存分配测试
  • 为栈保留安全域量
  • 内存布局
    7 d. F# f* U4 Z. _

2 K: u% b3 D- z0 y8 p! J11.使用gdb找出因除0导致的HardFault。https://www.stmcu.org.cn/module/forum/thread-604503-1-1.html2 }1 i3 y* Z' {5 O8 j  r
- R/ }3 B- Q! V+ s) V3 x2 r: g
. v1 |/ j7 Z& O# h: B1 t# m
完结7 {' c7 H) ^7 B
! x: j* g4 l) V* W6 g
发一个最终版本的文件end.zip。里面包含Makefile,syscalls,以及串口的源代码。1 W- e4 }& e7 t3 c  f6 r! X5 x% W' U
串口中添加__io_gets,__io_puts。用于从串口中读入一行数据(考虑backspace的情况)或者发送一个字符串。6 ^, w6 \$ r, b; x! A
& f) ]8 Q6 D6 ~7 R, H, h

end.zip

下载

401.67 KB, 下载次数: 433

评分

参与人数 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:/ s! f8 x; ^* \( h* I* c
cc: stlib/startup_stm32f30x.S
0 t0 h: u2 k: C8 I8 d! Hcc1: error: bad value (cortex-m4) for -mcpu= switch% u: B& s. }: U. k" @
cc1: error: invalid floating point option: -mfpu=fpv4-sp-d161 [% g1 \. M$ e% d: E! W" P6 i
Makefile:63: recipe for target 'stlib/startup_stm32f30x.o' failed" v1 H; y2 P( o
make: *** [stlib/startup_stm32f30x.o] Error 18 y2 `4 s7 v( Z1 u% l- W& V: C
thanks
( s9 V( r9 y$ [0 M$ Z! _: y
* i1 g2 _8 u8 M, y7 g
# E9 l) o$ V3 S) f
qianfan 回答时间:2015-11-8 21:07:50
pythonworld 发表于 2015-11-6 12:443 e# v' T5 Y/ B" a+ v
谢谢楼主。能否再写写怎么用HAL在Linux开发。
* `# d! N6 c$ c2 _
这个系列的帖子不是为了讲解标准库如何使用,而是为了讲解如何使用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的镜像都自己私用了。。2 ]4 M2 f. B  T, l, p
http://www.guge.click/
' j1 a# A8 N2 e) C; H无法显示网页。
& j0 F+ K/ n* i3 C  n4 A% E/ V2 h; E2 T
还好我能直接使用google.com9 {& X6 \1 p8 H" }
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& |8 h- ?/ E# p
自私的抢个版主的板凳,这帖子必须得加精啊!
* [1 r% w9 u  d$ X1 ~
那天脸皮厚了,自己加一个。。。
qianfan 回答时间:2015-10-23 13:01:41
风子 发表于 2015-10-23 00:521 @/ g7 A! p& j
地板留给我,坐等更新
" N- O' d* U2 o) I5 C
qianfan 回答时间:2015-10-23 13:01:59
ataudio 发表于 2015-10-23 08:22
, f' N4 [2 u4 E太自私了,楼主连google的镜像都自己私用了。。6 T4 M- K' }1 G
http://www.guge.click/6 ~2 R2 _+ y* y" l4 {" v( Z
无法显示网页。
' ?: a' Z% Q( r$ y
难道你打不开镜像吗?
qianfan 回答时间:2015-10-23 13:02:14
MouseCat 发表于 2015-10-23 09:22" ^/ M8 o& @" L6 z
又有大作推出哈,围观

/ Q+ o8 C+ h* C+ k. L9 B好久不见啊

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版