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

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

[复制链接]
qianfan 发布时间:2015-10-22 20:52
本帖最后由 QianFan 于 2015-12-5 16:45 编辑 : b4 }; a" o& A$ A; C; Y" E0 `" G
; n7 W8 Q9 w& {0 n5 `8 Z) O* ~7 v% [
    许久没来论坛发帖了。从今天开始,写Ubuntu下使用Makefile开发STM32,来水一下经验,希望大家不要见怪。几天一篇。这个帖子作为一个合集,以后新出教程(或许叫做笔记更好吧)的网址就贴在这个地方。方便大家阅读。, d. y, [, E, V$ [; q4 |

$ e% C+ ~8 u. \8 f: d2 ?- P    鉴于篇幅的原因,有些东西不能够写的太细,比如什么软件的安装啊,或者设置PATH路径啊。还请大家自行谷歌。当然了,谷歌已经挂了,还是用镜像吧。这个镜像我用过几个月了,很稳定,一直没有出现什么问题。
* k- _% c/ ]3 \7 Y! ?5 R
% }; k3 M& d3 h0 R: {# G' q9 l" H    Ubuntu不同与windows。可以你会说在Ubuntu下开发是瞎折腾。当然,如果你在windows下开发会有许多优秀的IDE。有付费的,有免费的。但是在Ubuntu下却不同。虽然你可以使用Eclipse装插件的方式来编写,但我看来那并不是一个好方法。特别是对刚开始进行Linux下开发的人来说。那个插件给你做了太多的东西。在他的基础上,你不会深入的理解newlib库的系统调用。出了问题之后,甚至不知道从何下手。所以,对新手来说,最好的方法就是不使用IDE,虽然这可能有些困难。
- J; h9 d3 {  @9 O6 U9 s! H: D( ?! Z* L, ~
    说这么多并不是为了黑IDE,也不是为了体现命令行下的编译多厉害。只是想说IDE,让我们变笨。一旦习惯了IDE之后,我们甚至忘了程序是如何链接的,甚至不知道为什么需要将多个源文件一股脑的加进工程中。或许有人还会在main.c文件里面写几千行代码,而不是将他们分文件组织。刚开始在Ubuntu下开发STM32的时候,我也曾怀念Windows下IDE的日子。有那些熟悉的Keil,IAR,CoIDE。我也曾想将window下的IDE搬到Ubuntu上面。于是开始安装wine。可是事情并不像想象中的那样发展。于是我给Eclipse装插件,一步一步的摸索。然而网上陈旧的资料并不总是有效。特别是在软件版本更新这么快的时代。无论如何,最后还是如愿的装上了。但是里面的文件太过繁杂,并不适合。; H4 V9 X3 J$ r( s! O6 _' L4 d* t
    Eclipse行不通之后,我又对CodeBlocks动手。用它开发STM32,经过若干天的失败之后,终于能够用它编译程序,点亮一个LED灯了。只是成功的一小步。用着用着,发现如果我想改一个编译参数,比如用C99吧,却要动那么多次鼠标。想加一个头文件路径,还要使用鼠标进行繁杂的操作。终于想通,告别IDE,拥抱Makefile。
4 @  C7 X; I0 t7 t: ^: n. G' C& `$ m( \
    下面的几篇教程会讲解如何在Ubuntu下用命令行开发STM32。敬请期待!5 h) l4 Y- T7 J

6 z! A) s" L0 t8 f/ q3 H# [
以下的所有帖子都是在Nucleo303(之前在社区兑换的)的基础上编写的。如果你想更换其他的板子,请更改固件库中的所有文件,以及链接文件。( O9 `& n, J0 a; O! e
4 \; A5 F5 k2 M1 Q6 U1 E, I# j  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。! F2 Q& u7 |+ ~$ [

5 c6 L: H# [6 }9 C1.我叫Makefile  https://www.stmcu.org.cn/module/forum/thread-603780-1-1.html
4 }( W% [" r/ s$ n+ v* C2 a9 C" H. F
  • 使用Makefile进行简单的工程管理。
    0 u: p" O1 i5 C: o8 S7 B
7 t6 [% {) H$ u* S
2.灯,等灯等灯~ https://www.stmcu.org.cn/module/forum/thread-603787-1-1.html7 [# s5 |, F$ Q" w
  • 固件库准备
  • 编写Makefile
  • 编写main函数。
  • 编译,链接,下载
    : B  Y8 b3 {, [/ e
. r+ e' @5 @9 t6 f/ {" g4 U
3.优化程序大小 https://www.stmcu.org.cn/module/forum/thread-603791-1-1.html
3 M5 H6 J' y/ \* _5 J" H1 X
  • 未优化(6372Bytes)
  • -Os优化(3780Bytes)
  • -ffunction-sections,-fdata-sections,-Wl,--gc-sections优化(1680Bytes)
  • -ffunction-sections,-fdata-sections,-Wl,--gc-sections,-Os优化(1348Bytes)4 ~1 Y; ?2 \+ m' ?; M

) W7 H6 z+ w$ @! D: \4.在SRAM中运行程序 https://www.stmcu.org.cn/module/forum/thread-603793-1-1.html
  • 反汇编代码
  • 分析flash.ld链接文件
  • 修改flash.ld,将代码区域更改到RAM中
  • 修改Makefile,生成SRAM中运行的代码。
  • 下载,反汇编验证。
  • 隐含的巨大bug。(中断向量表的问题)' Z- S  ?4 C! W8 B
; p, O" {+ t8 x: J: r( m$ A2 Q
5.使用串口Part1 https://www.stmcu.org.cn/module/forum/thread-603881-1-1.html
6 K6 I! o( }/ {+ T. w2 v1 f/ |
  • ringbuffer
  • 在中断中使用ringbuffer
  • 使用gdb调试
  • 添加volatile修正代码
  • 修正ringbuffer的无锁实现。1 X8 o4 C5 V; L: Y" ^+ w
  • 隐含的bug。(中断向量表的问题。下节讲述)' }& W1 b! n5 P: d1 X
2 S6 H6 i6 W1 q- n* H6 k; ^
6.使用串口Part2  https://www.stmcu.org.cn/module/forum/thread-603909-1-1.html3 F4 P2 @/ ^) I0 [( s, f- T
  • SCB->VTOR
  • 更改Makefile进行版本控制
  • 修改__io_getchar适用backspace
  • _exit系统调用
    ' B! n( u# Y% ]' q7 _% _
- c$ F7 M; @* X% c2 _7 |( B: ~
7.使用printf  https://www.stmcu.org.cn/module/forum/thread-603927-1-1.html
  • syscalls
  • 使用Newlib-nano减小代码大小
  • 为Newlib-nano添加printf的浮点输出支持。+ S) U& ?3 g4 \) |6 T% G$ d9 q
$ x, {6 P7 v; R8 Z: @1 v7 q5 J9 y
8. 使用硬浮点计算 https://www.stmcu.org.cn/module/forum/thread-603940-1-1.html
  • 反汇编相关软浮点代码
  • 添加硬浮点运算的参数
  • 反汇编相关硬浮点代码1 b2 b8 J7 }6 Z4 t% x5 r8 U) }8 R

. V7 G* ~6 Q2 q7 M9.再谈_exit  https://www.stmcu.org.cn/module/forum/thread-603942-1-1.html
  • 返回值和参数的传递规则
  • 将main的返回值传递给_exit9 |/ A) j. G2 H1 W

9 m0 k, I, i6 S8 ?) s10.使用malloc https://www.stmcu.org.cn/module/forum/thread-603945-1-1.html
' v* B8 I6 i8 b8 p
  • 动态内存分配机制
  • malloc内存分配测试
  • 为栈保留安全域量
  • 内存布局
    7 e* O( b% P: q! v; p
7 n4 C& U8 _9 h5 u6 k+ k; T, f# y
11.使用gdb找出因除0导致的HardFault。https://www.stmcu.org.cn/module/forum/thread-604503-1-1.html3 n1 x2 H9 i2 M! \8 c
+ H6 N7 g/ G/ m6 c) F2 Y$ K

1 O9 r, c' ?' G% Y7 k- z完结
  s1 m% u2 N8 ], B8 A; w& z# e; i4 R, x* n
发一个最终版本的文件end.zip。里面包含Makefile,syscalls,以及串口的源代码。
8 Y& D9 S, }+ D, u* f6 A串口中添加__io_gets,__io_puts。用于从串口中读入一行数据(考虑backspace的情况)或者发送一个字符串。
; E) r1 Q* D1 P8 Q. k
  D# Y( J# E6 _9 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:+ g! e' z' k- g+ `( e/ Y
cc: stlib/startup_stm32f30x.S* k% w5 O" B+ W
cc1: error: bad value (cortex-m4) for -mcpu= switch2 p5 U5 H  B+ H3 l0 q  u
cc1: error: invalid floating point option: -mfpu=fpv4-sp-d16
9 s6 R( Q# m# E& N8 b9 QMakefile:63: recipe for target 'stlib/startup_stm32f30x.o' failed
. D) R' y4 A  b5 Hmake: *** [stlib/startup_stm32f30x.o] Error 1
7 `2 d, T8 |( W. P3 ~) \; V( @thanks$ f2 v- a+ m+ _% A5 x) k
+ n5 y% o8 u) x
+ q& w% X4 r# {3 q% G. h
qianfan 回答时间:2015-11-8 21:07:50
pythonworld 发表于 2015-11-6 12:44
4 R  t2 z7 x& X* z谢谢楼主。能否再写写怎么用HAL在Linux开发。
4 g& n6 I! s: C8 E, @/ _
这个系列的帖子不是为了讲解标准库如何使用,而是为了讲解如何使用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的镜像都自己私用了。。5 `- \3 P, t+ r
http://www.guge.click/* L6 N0 |( b% ^6 E
无法显示网页。1 A1 c6 d' p1 a: Z1 _) J: v, H
! L- C5 c' L0 O( W. C2 z3 f2 T
还好我能直接使用google.com
1 O1 E( j: n; Z5 C2 w% y3 h$ a
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 N7 w, O) b% Y0 a  G3 _3 r0 q自私的抢个版主的板凳,这帖子必须得加精啊!
, o$ m, K$ H+ R, k9 [: H) s  E. J
那天脸皮厚了,自己加一个。。。
qianfan 回答时间:2015-10-23 13:01:41
风子 发表于 2015-10-23 00:52
1 T5 r1 b, ]# X; Z7 T* ~地板留给我,坐等更新

# {9 e2 y# l2 r
qianfan 回答时间:2015-10-23 13:01:59
ataudio 发表于 2015-10-23 08:22. N4 {$ d6 S" q  I3 g" R
太自私了,楼主连google的镜像都自己私用了。。, b% N% d4 J$ O9 u# K, {* x7 Q% ~9 f/ Y! H
http://www.guge.click/5 t/ r. H% @1 v
无法显示网页。
; z  k' o  X1 f' u  F
难道你打不开镜像吗?
qianfan 回答时间:2015-10-23 13:02:14
MouseCat 发表于 2015-10-23 09:224 C. K( A) k% z( \" z
又有大作推出哈,围观
; t& h) R7 {6 }$ G! m$ Q2 r% P
好久不见啊

所属标签

相似分享

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