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

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

[复制链接]
qianfan 发布时间:2015-10-22 20:52
本帖最后由 QianFan 于 2015-12-5 16:45 编辑 . q: x4 Q% l1 B! T

$ V7 b/ r4 M! y0 P( i    许久没来论坛发帖了。从今天开始,写Ubuntu下使用Makefile开发STM32,来水一下经验,希望大家不要见怪。几天一篇。这个帖子作为一个合集,以后新出教程(或许叫做笔记更好吧)的网址就贴在这个地方。方便大家阅读。! y" M+ v. k. q. |* q
0 J% D* G+ k. j: ~1 H0 D
    鉴于篇幅的原因,有些东西不能够写的太细,比如什么软件的安装啊,或者设置PATH路径啊。还请大家自行谷歌。当然了,谷歌已经挂了,还是用镜像吧。这个镜像我用过几个月了,很稳定,一直没有出现什么问题。" a( P6 z5 L0 V7 e$ f* `
* |" ]* c; ~% V, H( G
    Ubuntu不同与windows。可以你会说在Ubuntu下开发是瞎折腾。当然,如果你在windows下开发会有许多优秀的IDE。有付费的,有免费的。但是在Ubuntu下却不同。虽然你可以使用Eclipse装插件的方式来编写,但我看来那并不是一个好方法。特别是对刚开始进行Linux下开发的人来说。那个插件给你做了太多的东西。在他的基础上,你不会深入的理解newlib库的系统调用。出了问题之后,甚至不知道从何下手。所以,对新手来说,最好的方法就是不使用IDE,虽然这可能有些困难。  }# c, B" C5 Q) K

* c/ Z# c0 h7 z    说这么多并不是为了黑IDE,也不是为了体现命令行下的编译多厉害。只是想说IDE,让我们变笨。一旦习惯了IDE之后,我们甚至忘了程序是如何链接的,甚至不知道为什么需要将多个源文件一股脑的加进工程中。或许有人还会在main.c文件里面写几千行代码,而不是将他们分文件组织。刚开始在Ubuntu下开发STM32的时候,我也曾怀念Windows下IDE的日子。有那些熟悉的Keil,IAR,CoIDE。我也曾想将window下的IDE搬到Ubuntu上面。于是开始安装wine。可是事情并不像想象中的那样发展。于是我给Eclipse装插件,一步一步的摸索。然而网上陈旧的资料并不总是有效。特别是在软件版本更新这么快的时代。无论如何,最后还是如愿的装上了。但是里面的文件太过繁杂,并不适合。
- {; S# E' e, I- B! W2 p6 g5 v    Eclipse行不通之后,我又对CodeBlocks动手。用它开发STM32,经过若干天的失败之后,终于能够用它编译程序,点亮一个LED灯了。只是成功的一小步。用着用着,发现如果我想改一个编译参数,比如用C99吧,却要动那么多次鼠标。想加一个头文件路径,还要使用鼠标进行繁杂的操作。终于想通,告别IDE,拥抱Makefile。
. ^! }( r$ {% U( J! \! J( U
, z5 H- W8 x/ h6 H    下面的几篇教程会讲解如何在Ubuntu下用命令行开发STM32。敬请期待!$ n% W+ |8 w8 `- D

3 [; }; `' J" G# M5 t4 i
以下的所有帖子都是在Nucleo303(之前在社区兑换的)的基础上编写的。如果你想更换其他的板子,请更改固件库中的所有文件,以及链接文件。8 M: U/ J3 J+ Z6 M0 ]# R% X1 c
! P. d: E, i$ R) q4 ~* G
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。; J8 o9 \! h( }: X' p( I

9 R' e" v7 }% s1.我叫Makefile  https://www.stmcu.org.cn/module/forum/thread-603780-1-1.html7 G: Z) V0 r3 O
  • 使用Makefile进行简单的工程管理。
    4 y* r7 F2 X9 X5 w' Z& ~9 {+ L

9 p' v9 P9 ]3 f6 b" T! U1 f2.灯,等灯等灯~ https://www.stmcu.org.cn/module/forum/thread-603787-1-1.html# _* e. o0 U7 `# ~
  • 固件库准备
  • 编写Makefile
  • 编写main函数。
  • 编译,链接,下载
    # A7 K$ v- G$ ~9 U7 A3 A
' Z) ~$ Z. h( }
3.优化程序大小 https://www.stmcu.org.cn/module/forum/thread-603791-1-1.html7 o# [8 |$ p( g5 A! L  h
  • 未优化(6372Bytes)
  • -Os优化(3780Bytes)
  • -ffunction-sections,-fdata-sections,-Wl,--gc-sections优化(1680Bytes)
  • -ffunction-sections,-fdata-sections,-Wl,--gc-sections,-Os优化(1348Bytes)
    # n* G% s# }9 y5 [! ~% z, R

9 F# G! A' K, o; H6 m4.在SRAM中运行程序 https://www.stmcu.org.cn/module/forum/thread-603793-1-1.html
  • 反汇编代码
  • 分析flash.ld链接文件
  • 修改flash.ld,将代码区域更改到RAM中
  • 修改Makefile,生成SRAM中运行的代码。
  • 下载,反汇编验证。
  • 隐含的巨大bug。(中断向量表的问题)
    # ?- ~4 w4 J5 N  H

+ G6 O6 a, r+ S. P; w$ A5.使用串口Part1 https://www.stmcu.org.cn/module/forum/thread-603881-1-1.html0 U8 U  I# j( D+ ?$ v2 j4 S: `! i8 v
  • ringbuffer
  • 在中断中使用ringbuffer
  • 使用gdb调试
  • 添加volatile修正代码
  • 修正ringbuffer的无锁实现。& T8 f" g* p- p; k! `4 e) F
  • 隐含的bug。(中断向量表的问题。下节讲述)) }# r2 w- j  N" a( s( \
5 _& x% f1 v; L0 G# R3 C- k8 I
6.使用串口Part2  https://www.stmcu.org.cn/module/forum/thread-603909-1-1.html
- Q+ i8 w' B- [* S8 y3 o
  • SCB->VTOR
  • 更改Makefile进行版本控制
  • 修改__io_getchar适用backspace
  • _exit系统调用
    ' p% a2 Y7 \' h; _3 y0 @6 Y) F7 U( H

2 N. m) e( t* @7.使用printf  https://www.stmcu.org.cn/module/forum/thread-603927-1-1.html
  • syscalls
  • 使用Newlib-nano减小代码大小
  • 为Newlib-nano添加printf的浮点输出支持。# i$ w5 W7 V- @8 D* o4 M1 R

3 s9 n1 i) m* [. j8 b2 u6 Z+ x- `+ D8. 使用硬浮点计算 https://www.stmcu.org.cn/module/forum/thread-603940-1-1.html
  • 反汇编相关软浮点代码
  • 添加硬浮点运算的参数
  • 反汇编相关硬浮点代码2 Z* F* a9 v) g# S

6 Q: B) N6 l! c) N) v* |) z9.再谈_exit  https://www.stmcu.org.cn/module/forum/thread-603942-1-1.html
  • 返回值和参数的传递规则
  • 将main的返回值传递给_exit$ i" Y3 U1 Y9 H

7 |. Z' K2 H: H+ a; H, _) C$ t10.使用malloc https://www.stmcu.org.cn/module/forum/thread-603945-1-1.html
# l4 \9 d$ M2 s* o
  • 动态内存分配机制
  • malloc内存分配测试
  • 为栈保留安全域量
  • 内存布局# H; @' g; r/ Z7 h% }
; d9 G: Q; j* n2 C& q
11.使用gdb找出因除0导致的HardFault。https://www.stmcu.org.cn/module/forum/thread-604503-1-1.html5 O$ M& K# r/ N8 m- {0 y$ j

2 m$ K$ E2 ?, c( M& y4 T/ ~
. M" f5 v( {# r4 e完结2 Q5 q2 }- J( U& s6 P8 I3 y

5 H9 @) J  z! L, Z2 h: }; d发一个最终版本的文件end.zip。里面包含Makefile,syscalls,以及串口的源代码。, N: r+ Y- v  S; G4 z
串口中添加__io_gets,__io_puts。用于从串口中读入一行数据(考虑backspace的情况)或者发送一个字符串。
0 Q1 M) h- c% z# g4 |! |
8 n5 f5 S: |0 f, q# C

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:/ ~. R! j! F/ w, g! q* b, d
cc: stlib/startup_stm32f30x.S% z% y$ w0 O) l8 Q! I7 U+ d0 G
cc1: error: bad value (cortex-m4) for -mcpu= switch
% }$ p' K" q7 R5 rcc1: error: invalid floating point option: -mfpu=fpv4-sp-d16
! w2 [! j+ C: _7 F$ H0 M3 ^Makefile:63: recipe for target 'stlib/startup_stm32f30x.o' failed
5 q6 b' T% {* `( ]make: *** [stlib/startup_stm32f30x.o] Error 1
! D/ V* y) y: j4 N+ D: {- S& mthanks
* a& R& {; p1 Y/ r: i* ]* r) S$ s! i; C

: b% |6 b1 ]; v% L
qianfan 回答时间:2015-11-8 21:07:50
pythonworld 发表于 2015-11-6 12:44
/ O+ {( T/ L3 s6 j$ f, L( q; m! @谢谢楼主。能否再写写怎么用HAL在Linux开发。

4 \( w9 R  W) |- g5 X2 m这个系列的帖子不是为了讲解标准库如何使用,而是为了讲解如何使用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的镜像都自己私用了。。; G" _$ }4 W4 d, ]
http://www.guge.click/4 ?$ J) w4 E( P% V5 w  ~3 r& Z
无法显示网页。4 a' J7 S  p2 j9 K# p# ]

9 I1 p' P9 b( }. E4 ]9 A还好我能直接使用google.com
9 n3 V  M4 i/ |: z! X! @0 C: V! y
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& y, y$ w5 M6 n9 ~( O* a9 e4 b
自私的抢个版主的板凳,这帖子必须得加精啊!
- J- {+ q. i% p2 j9 O/ J
那天脸皮厚了,自己加一个。。。
qianfan 回答时间:2015-10-23 13:01:41
风子 发表于 2015-10-23 00:52$ R4 Z" e3 q" }4 d& L
地板留给我,坐等更新

+ T8 q+ `8 i: ?- Y: s; ]( J3 `
qianfan 回答时间:2015-10-23 13:01:59
ataudio 发表于 2015-10-23 08:22
; r! \) z& K6 v0 ], S: Y% N太自私了,楼主连google的镜像都自己私用了。。" ]8 I% g& a% Y( s) r" O/ ?0 L' i
http://www.guge.click/
8 e# b5 o; P0 a1 V, c5 f! i, l0 {无法显示网页。

0 ?$ ?- B- u( e2 J* F. i$ h$ R难道你打不开镜像吗?
qianfan 回答时间:2015-10-23 13:02:14
MouseCat 发表于 2015-10-23 09:22& S9 c0 ~4 w5 u+ j$ Q1 e1 c
又有大作推出哈,围观

  j9 m: ~& W5 X  B- a好久不见啊

所属标签

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