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

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

[复制链接]
qianfan 发布时间:2015-10-22 20:52
本帖最后由 QianFan 于 2015-12-5 16:45 编辑 ! g4 Z# L1 M, g( v; p, M& S4 r. r7 d

' C0 N) C: p  N4 I    许久没来论坛发帖了。从今天开始,写Ubuntu下使用Makefile开发STM32,来水一下经验,希望大家不要见怪。几天一篇。这个帖子作为一个合集,以后新出教程(或许叫做笔记更好吧)的网址就贴在这个地方。方便大家阅读。
0 D0 d+ J0 G1 v. W, n
' ?% t! t$ L# E* N5 A! ]    鉴于篇幅的原因,有些东西不能够写的太细,比如什么软件的安装啊,或者设置PATH路径啊。还请大家自行谷歌。当然了,谷歌已经挂了,还是用镜像吧。这个镜像我用过几个月了,很稳定,一直没有出现什么问题。
! F" G1 u7 ?( a8 {1 Z- m+ J( a) i& @4 b* p+ P, S$ I
    Ubuntu不同与windows。可以你会说在Ubuntu下开发是瞎折腾。当然,如果你在windows下开发会有许多优秀的IDE。有付费的,有免费的。但是在Ubuntu下却不同。虽然你可以使用Eclipse装插件的方式来编写,但我看来那并不是一个好方法。特别是对刚开始进行Linux下开发的人来说。那个插件给你做了太多的东西。在他的基础上,你不会深入的理解newlib库的系统调用。出了问题之后,甚至不知道从何下手。所以,对新手来说,最好的方法就是不使用IDE,虽然这可能有些困难。) J" G* z" W7 l. l2 d
2 a" U: F- Z$ q  f+ Z' P2 u
    说这么多并不是为了黑IDE,也不是为了体现命令行下的编译多厉害。只是想说IDE,让我们变笨。一旦习惯了IDE之后,我们甚至忘了程序是如何链接的,甚至不知道为什么需要将多个源文件一股脑的加进工程中。或许有人还会在main.c文件里面写几千行代码,而不是将他们分文件组织。刚开始在Ubuntu下开发STM32的时候,我也曾怀念Windows下IDE的日子。有那些熟悉的Keil,IAR,CoIDE。我也曾想将window下的IDE搬到Ubuntu上面。于是开始安装wine。可是事情并不像想象中的那样发展。于是我给Eclipse装插件,一步一步的摸索。然而网上陈旧的资料并不总是有效。特别是在软件版本更新这么快的时代。无论如何,最后还是如愿的装上了。但是里面的文件太过繁杂,并不适合。
+ I- l9 }! U2 f& Y5 Z    Eclipse行不通之后,我又对CodeBlocks动手。用它开发STM32,经过若干天的失败之后,终于能够用它编译程序,点亮一个LED灯了。只是成功的一小步。用着用着,发现如果我想改一个编译参数,比如用C99吧,却要动那么多次鼠标。想加一个头文件路径,还要使用鼠标进行繁杂的操作。终于想通,告别IDE,拥抱Makefile。- v3 K4 n# G) W! ^' @* x5 R

7 v; p# h% j& B& |3 J: Z5 M    下面的几篇教程会讲解如何在Ubuntu下用命令行开发STM32。敬请期待!6 r3 L- e8 K* E* v& r
( r+ S+ q4 ?8 C' q6 {+ q
以下的所有帖子都是在Nucleo303(之前在社区兑换的)的基础上编写的。如果你想更换其他的板子,请更改固件库中的所有文件,以及链接文件。
% q" L* l, a% R
3 u! Y$ Q* J/ B
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。$ t" A' h- D0 [! a; c) |
7 v* I$ h5 x/ A% _( k0 M9 b9 g- U
1.我叫Makefile  https://www.stmcu.org.cn/module/forum/thread-603780-1-1.html
3 R! D: h2 Z; h% _( ]
  • 使用Makefile进行简单的工程管理。
    ; T8 G$ O% c5 r0 ^1 \2 M
- g0 F) P/ r' D" O
2.灯,等灯等灯~ https://www.stmcu.org.cn/module/forum/thread-603787-1-1.html
  d+ ^4 a# N7 U* [# Z/ o$ i* a, W% C7 P
  • 固件库准备
  • 编写Makefile
  • 编写main函数。
  • 编译,链接,下载7 e" @. v4 b" L* V. |" [

2 T* G7 T* _4 A3 C3.优化程序大小 https://www.stmcu.org.cn/module/forum/thread-603791-1-1.html# j) Q: z9 T  [1 I# I
  • 未优化(6372Bytes)
  • -Os优化(3780Bytes)
  • -ffunction-sections,-fdata-sections,-Wl,--gc-sections优化(1680Bytes)
  • -ffunction-sections,-fdata-sections,-Wl,--gc-sections,-Os优化(1348Bytes)- L# n/ d" c' R
+ I6 S* r0 y4 u. k7 ~: z' N
4.在SRAM中运行程序 https://www.stmcu.org.cn/module/forum/thread-603793-1-1.html
  • 反汇编代码
  • 分析flash.ld链接文件
  • 修改flash.ld,将代码区域更改到RAM中
  • 修改Makefile,生成SRAM中运行的代码。
  • 下载,反汇编验证。
  • 隐含的巨大bug。(中断向量表的问题)7 t' q& ]: z1 B! I

: g6 @& i7 F& q$ Y" t6 Q" w' o5.使用串口Part1 https://www.stmcu.org.cn/module/forum/thread-603881-1-1.html2 H1 [( r; O2 F4 I
  • ringbuffer
  • 在中断中使用ringbuffer
  • 使用gdb调试
  • 添加volatile修正代码
  • 修正ringbuffer的无锁实现。3 `) Q; Q6 t+ ~; W( b$ w; F
  • 隐含的bug。(中断向量表的问题。下节讲述)
    & `0 V3 t  C0 v6 S( P
6 P1 H# j+ U/ Q$ D$ @! s
6.使用串口Part2  https://www.stmcu.org.cn/module/forum/thread-603909-1-1.html% q+ X. v  _- v3 i5 x; w+ {
  • SCB->VTOR
  • 更改Makefile进行版本控制
  • 修改__io_getchar适用backspace
  • _exit系统调用
    % {7 A, g6 B" R

7 @! |5 ?! P- Z- y: I9 T$ D7.使用printf  https://www.stmcu.org.cn/module/forum/thread-603927-1-1.html
  • syscalls
  • 使用Newlib-nano减小代码大小
  • 为Newlib-nano添加printf的浮点输出支持。
    ) o, A2 z; \( d" P2 }  o' O6 j

7 _1 S# R- B8 m( b% e8. 使用硬浮点计算 https://www.stmcu.org.cn/module/forum/thread-603940-1-1.html
  • 反汇编相关软浮点代码
  • 添加硬浮点运算的参数
  • 反汇编相关硬浮点代码! }" X1 t  }( l) S; M7 N$ E' L" n' L3 O
/ U6 m# s% g7 m' R1 I+ e
9.再谈_exit  https://www.stmcu.org.cn/module/forum/thread-603942-1-1.html
  • 返回值和参数的传递规则
  • 将main的返回值传递给_exit
    * C% c: A- h/ \3 T% I0 }+ W% c$ @" u% m
8 V9 W; u+ K- B2 B! {+ v9 U6 d1 d6 w
10.使用malloc https://www.stmcu.org.cn/module/forum/thread-603945-1-1.html 。
. |0 C' F- Q: Y2 O9 Y( g
  • 动态内存分配机制
  • malloc内存分配测试
  • 为栈保留安全域量
  • 内存布局
    - L( |5 R$ F# m9 t( C
1 b" b& t2 H9 n/ U+ O5 W- I
11.使用gdb找出因除0导致的HardFault。https://www.stmcu.org.cn/module/forum/thread-604503-1-1.html9 R: D# q( s/ y1 e
' s& Z8 o* z) u" i

3 ]) @4 A1 X* z5 L+ R完结
5 }6 m. F7 l" H7 t  V- F
; A' g- P4 R1 c* _$ S发一个最终版本的文件end.zip。里面包含Makefile,syscalls,以及串口的源代码。" f. R6 _1 Z5 J8 i. T% \0 S. W# m
串口中添加__io_gets,__io_puts。用于从串口中读入一行数据(考虑backspace的情况)或者发送一个字符串。2 h; K, T/ \; D, \' p( _' \! ]

0 d. A" o1 p; }  E

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:' z/ R' W7 V$ _- y, j$ i1 F
cc: stlib/startup_stm32f30x.S
3 E) ?9 i& }! bcc1: error: bad value (cortex-m4) for -mcpu= switch8 I3 F+ M$ v& q5 ]
cc1: error: invalid floating point option: -mfpu=fpv4-sp-d16
5 c$ K0 I7 _3 W( s! f, R! w( QMakefile:63: recipe for target 'stlib/startup_stm32f30x.o' failed
, D, ]1 h. k- ]! hmake: *** [stlib/startup_stm32f30x.o] Error 1& D% w8 K; e5 k/ n2 t
thanks3 T# m3 ~. p. A2 x2 U; e6 R
: j6 U. O4 |- U, h4 t" M

% ?6 D3 P) W+ w2 ?2 |: e/ v
qianfan 回答时间:2015-11-8 21:07:50
pythonworld 发表于 2015-11-6 12:44
4 A8 m7 O" ~; [2 g+ |谢谢楼主。能否再写写怎么用HAL在Linux开发。
# @$ x0 T+ u% R( ^: n
这个系列的帖子不是为了讲解标准库如何使用,而是为了讲解如何使用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的镜像都自己私用了。。
& c8 |) G/ U/ S0 z  rhttp://www.guge.click/
. \' k3 E. o; A$ N7 j无法显示网页。
& }: \, X) _8 Q/ N7 d+ P
8 p* V! m+ m; ?: u" z# W还好我能直接使用google.com1 G, v# L4 z7 g0 F
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 V; A1 P  Q9 J7 G/ G' S% o自私的抢个版主的板凳,这帖子必须得加精啊!

% T! [6 _% _3 W2 Z4 R! \) }. h那天脸皮厚了,自己加一个。。。
qianfan 回答时间:2015-10-23 13:01:41
风子 发表于 2015-10-23 00:524 C) ]" v5 P4 j& f) K/ w- L" ^" R
地板留给我,坐等更新

% T- B7 K7 T2 X
qianfan 回答时间:2015-10-23 13:01:59
ataudio 发表于 2015-10-23 08:22
( S# w  \0 K  C6 B- s8 `# P& \太自私了,楼主连google的镜像都自己私用了。。4 D8 x6 v4 S+ d& _& v$ b' X
http://www.guge.click/  e# r. h; f. I
无法显示网页。
$ `8 O) k9 o$ P' b
难道你打不开镜像吗?
qianfan 回答时间:2015-10-23 13:02:14
MouseCat 发表于 2015-10-23 09:220 j- u, b5 K2 O9 }4 P
又有大作推出哈,围观

2 g% V6 m6 k0 O4 G' e8 j好久不见啊

所属标签

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