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

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

[复制链接]
qianfan 发布时间:2015-10-22 20:52
本帖最后由 QianFan 于 2015-12-5 16:45 编辑
5 z# b$ s: z5 P8 _1 n  }
2 C) D  u6 h. o" @. l5 F    许久没来论坛发帖了。从今天开始,写Ubuntu下使用Makefile开发STM32,来水一下经验,希望大家不要见怪。几天一篇。这个帖子作为一个合集,以后新出教程(或许叫做笔记更好吧)的网址就贴在这个地方。方便大家阅读。
- u9 [( R4 n' C! ?! h% V. v
8 B9 j3 C- e2 H0 G+ R    鉴于篇幅的原因,有些东西不能够写的太细,比如什么软件的安装啊,或者设置PATH路径啊。还请大家自行谷歌。当然了,谷歌已经挂了,还是用镜像吧。这个镜像我用过几个月了,很稳定,一直没有出现什么问题。
& g  q5 p- y+ {& n4 e
, `9 g: B) q5 ~) J4 |) I) e$ U    Ubuntu不同与windows。可以你会说在Ubuntu下开发是瞎折腾。当然,如果你在windows下开发会有许多优秀的IDE。有付费的,有免费的。但是在Ubuntu下却不同。虽然你可以使用Eclipse装插件的方式来编写,但我看来那并不是一个好方法。特别是对刚开始进行Linux下开发的人来说。那个插件给你做了太多的东西。在他的基础上,你不会深入的理解newlib库的系统调用。出了问题之后,甚至不知道从何下手。所以,对新手来说,最好的方法就是不使用IDE,虽然这可能有些困难。
  r4 F% q  J. Q# [1 o5 s. t
9 }% H4 R! M& l# `3 z4 {! Q! T    说这么多并不是为了黑IDE,也不是为了体现命令行下的编译多厉害。只是想说IDE,让我们变笨。一旦习惯了IDE之后,我们甚至忘了程序是如何链接的,甚至不知道为什么需要将多个源文件一股脑的加进工程中。或许有人还会在main.c文件里面写几千行代码,而不是将他们分文件组织。刚开始在Ubuntu下开发STM32的时候,我也曾怀念Windows下IDE的日子。有那些熟悉的Keil,IAR,CoIDE。我也曾想将window下的IDE搬到Ubuntu上面。于是开始安装wine。可是事情并不像想象中的那样发展。于是我给Eclipse装插件,一步一步的摸索。然而网上陈旧的资料并不总是有效。特别是在软件版本更新这么快的时代。无论如何,最后还是如愿的装上了。但是里面的文件太过繁杂,并不适合。
8 f. v' T! g* w/ s- `' g    Eclipse行不通之后,我又对CodeBlocks动手。用它开发STM32,经过若干天的失败之后,终于能够用它编译程序,点亮一个LED灯了。只是成功的一小步。用着用着,发现如果我想改一个编译参数,比如用C99吧,却要动那么多次鼠标。想加一个头文件路径,还要使用鼠标进行繁杂的操作。终于想通,告别IDE,拥抱Makefile。' |0 H* ^1 C! O" _

5 [. \4 K. G$ l    下面的几篇教程会讲解如何在Ubuntu下用命令行开发STM32。敬请期待!
2 M6 z( m3 g8 q4 M0 T: ^/ e' o0 d
/ E$ \: x# m) ~$ e2 K5 L
以下的所有帖子都是在Nucleo303(之前在社区兑换的)的基础上编写的。如果你想更换其他的板子,请更改固件库中的所有文件,以及链接文件。
* l: ?9 y1 j3 i1 a

, K4 u  B( K' a- Q  y
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。
    & H* ~  ?! _# g& v% ~2 l

3 T1 V0 W$ f( H; `) s# K" N1.我叫Makefile  https://www.stmcu.org.cn/module/forum/thread-603780-1-1.html& [1 A( ?* \/ U' d( X
  • 使用Makefile进行简单的工程管理。
    0 n& b, H# O2 g
2 `, U6 f- V/ v; R0 l) P% x
2.灯,等灯等灯~ https://www.stmcu.org.cn/module/forum/thread-603787-1-1.html( t: z8 \1 a8 I  p# M% G( v
  • 固件库准备
  • 编写Makefile
  • 编写main函数。
  • 编译,链接,下载
    ' _, |0 A9 C1 i5 m+ d. P
& O+ A( K: M1 A: _5 g4 X4 j4 B
3.优化程序大小 https://www.stmcu.org.cn/module/forum/thread-603791-1-1.html8 y0 Q# a# i+ `2 `
  • 未优化(6372Bytes)
  • -Os优化(3780Bytes)
  • -ffunction-sections,-fdata-sections,-Wl,--gc-sections优化(1680Bytes)
  • -ffunction-sections,-fdata-sections,-Wl,--gc-sections,-Os优化(1348Bytes)
    0 ?* w6 q; C  i; ~

; s/ S, k2 }- ?2 M, _4.在SRAM中运行程序 https://www.stmcu.org.cn/module/forum/thread-603793-1-1.html
  • 反汇编代码
  • 分析flash.ld链接文件
  • 修改flash.ld,将代码区域更改到RAM中
  • 修改Makefile,生成SRAM中运行的代码。
  • 下载,反汇编验证。
  • 隐含的巨大bug。(中断向量表的问题)
    2 g5 u, P5 T! B: X2 O- ]0 n0 p% M
  m3 A8 z3 c0 c. d
5.使用串口Part1 https://www.stmcu.org.cn/module/forum/thread-603881-1-1.html% E* c1 F2 N1 q- J: R/ s
  • ringbuffer
  • 在中断中使用ringbuffer
  • 使用gdb调试
  • 添加volatile修正代码
  • 修正ringbuffer的无锁实现。! }! @% @  n& S) d
  • 隐含的bug。(中断向量表的问题。下节讲述)# X9 c$ e/ `7 L
, b/ D8 I& v  ?9 T: I
6.使用串口Part2  https://www.stmcu.org.cn/module/forum/thread-603909-1-1.html
9 _. c1 h& g7 R' ]
  • SCB->VTOR
  • 更改Makefile进行版本控制
  • 修改__io_getchar适用backspace
  • _exit系统调用
    - b- D" I  u% R* [% U# n2 P

3 E# b% y; @$ Q8 I' {4 f7.使用printf  https://www.stmcu.org.cn/module/forum/thread-603927-1-1.html
  • syscalls
  • 使用Newlib-nano减小代码大小
  • 为Newlib-nano添加printf的浮点输出支持。
    , `5 t2 R6 h2 K: _% C. w
- A! r) S7 C. r. u. x
8. 使用硬浮点计算 https://www.stmcu.org.cn/module/forum/thread-603940-1-1.html
  • 反汇编相关软浮点代码
  • 添加硬浮点运算的参数
  • 反汇编相关硬浮点代码
    9 m  s* o/ C* a; J* h8 K( j

$ A. J, N5 w+ f  M' _/ }9.再谈_exit  https://www.stmcu.org.cn/module/forum/thread-603942-1-1.html
  • 返回值和参数的传递规则
  • 将main的返回值传递给_exit& ^7 M/ c+ i" z, M, K

+ x+ i, G9 b8 j) V10.使用malloc https://www.stmcu.org.cn/module/forum/thread-603945-1-1.html3 ]# C) t7 W8 e
  • 动态内存分配机制
  • malloc内存分配测试
  • 为栈保留安全域量
  • 内存布局
    : U+ B1 Z$ |1 _) m

4 q$ L( J) k+ }/ D11.使用gdb找出因除0导致的HardFault。https://www.stmcu.org.cn/module/forum/thread-604503-1-1.html+ v% [$ ~$ b6 D  k3 [3 x
4 f: b# U1 ]* ?$ {( f5 ]
- N( T3 w% ~; R; t8 G
完结8 ?# L4 \1 ?% d% n/ e( P: c
0 ]2 P0 Q1 X+ \  ^  o8 e, k
发一个最终版本的文件end.zip。里面包含Makefile,syscalls,以及串口的源代码。4 U) ~8 m7 E: P& d+ P1 d
串口中添加__io_gets,__io_puts。用于从串口中读入一行数据(考虑backspace的情况)或者发送一个字符串。
& \8 y: ~. t% {$ Z
% b% ?+ _, P  T9 D* n# I" O

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:2 c! t, v" D. W
cc: stlib/startup_stm32f30x.S
% D2 `$ o* ]+ v% q( w" P" Vcc1: error: bad value (cortex-m4) for -mcpu= switch
8 e- \8 F5 t. Q4 `& v: _1 u+ M6 ucc1: error: invalid floating point option: -mfpu=fpv4-sp-d16
3 f, p5 _/ J2 \9 ?: @+ W- ^4 lMakefile:63: recipe for target 'stlib/startup_stm32f30x.o' failed) u& c) ~; }* ~. k( ~0 y, s
make: *** [stlib/startup_stm32f30x.o] Error 1- E/ i' ~) M+ q# Z; p! R+ m
thanks( T. F6 n( J8 U- u

3 [1 z' i9 n( W% @- x! x! T! m8 x: u
qianfan 回答时间:2015-11-8 21:07:50
pythonworld 发表于 2015-11-6 12:44% J5 \: q& d/ q5 H- d! X
谢谢楼主。能否再写写怎么用HAL在Linux开发。
% H) @) y$ K+ J& m! W, G
这个系列的帖子不是为了讲解标准库如何使用,而是为了讲解如何使用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的镜像都自己私用了。。
; N+ F/ s* B* I) G. ^! b" j% [- Shttp://www.guge.click/+ h$ @) v% c/ C2 ^" C
无法显示网页。
2 W, I; `3 [$ _4 i: j0 i3 |( z$ G4 j- f# o) k* M
还好我能直接使用google.com
  d2 F' H1 c- j  p4 g  j, X
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) m* h* S+ D% F1 L$ j! S* q9 q* p
自私的抢个版主的板凳,这帖子必须得加精啊!
' w9 `+ Y2 o- R) Z2 i9 r' ^
那天脸皮厚了,自己加一个。。。
qianfan 回答时间:2015-10-23 13:01:41
风子 发表于 2015-10-23 00:52, M* c0 n  S, K9 \
地板留给我,坐等更新

3 Y+ ^" [* [4 f" m
qianfan 回答时间:2015-10-23 13:01:59
ataudio 发表于 2015-10-23 08:227 _# ^! l6 {% J3 b) r
太自私了,楼主连google的镜像都自己私用了。。8 V$ Q7 e( ]% `  x% S5 h, j
http://www.guge.click/
# P* h( X% {9 n2 s" b无法显示网页。

- R' v# _# {( r6 }难道你打不开镜像吗?
qianfan 回答时间:2015-10-23 13:02:14
MouseCat 发表于 2015-10-23 09:22
  Z" L, i. C& ^0 h1 V又有大作推出哈,围观

) t6 A6 I. M4 v! M1 I2 L, z) D好久不见啊

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版