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

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

[复制链接]
qianfan 发布时间:2015-10-22 20:52
本帖最后由 QianFan 于 2015-12-5 16:45 编辑
3 g$ n3 T0 l4 _' o" |* g: Y: l3 \1 i# ^- z3 L
    许久没来论坛发帖了。从今天开始,写Ubuntu下使用Makefile开发STM32,来水一下经验,希望大家不要见怪。几天一篇。这个帖子作为一个合集,以后新出教程(或许叫做笔记更好吧)的网址就贴在这个地方。方便大家阅读。) Y! X: a! }/ C

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

' @, u7 R2 m. I
以下的所有帖子都是在Nucleo303(之前在社区兑换的)的基础上编写的。如果你想更换其他的板子,请更改固件库中的所有文件,以及链接文件。
7 [% I. s* v, a8 L2 s3 q9 [0 E
- E6 d& S2 D$ R2 n2 ^/ m
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。
    $ A. p( ?& ~; c3 T1 x5 m
, r3 b0 D" u2 G' J6 Y* e( q0 f) e
1.我叫Makefile  https://www.stmcu.org.cn/module/forum/thread-603780-1-1.html
+ X! Y% b& q+ ]
  • 使用Makefile进行简单的工程管理。
    + _0 u! |+ {% u1 ~$ w/ v4 l$ g
% D4 i4 D: v! s! l2 U
2.灯,等灯等灯~ https://www.stmcu.org.cn/module/forum/thread-603787-1-1.html
7 v7 J2 f+ `6 F$ S$ {, x7 n
  • 固件库准备
  • 编写Makefile
  • 编写main函数。
  • 编译,链接,下载! a5 M4 @# A7 }' Q. c8 _% o# }

& ?: g, l/ M: e9 `4 E; n& \; q* @3.优化程序大小 https://www.stmcu.org.cn/module/forum/thread-603791-1-1.html
/ M. B9 T& [! q- x1 f
  • 未优化(6372Bytes)
  • -Os优化(3780Bytes)
  • -ffunction-sections,-fdata-sections,-Wl,--gc-sections优化(1680Bytes)
  • -ffunction-sections,-fdata-sections,-Wl,--gc-sections,-Os优化(1348Bytes); W  u# w+ E6 K0 ?' z% _( w! }+ s& B

* }$ w4 C) V7 I& `/ I7 T4.在SRAM中运行程序 https://www.stmcu.org.cn/module/forum/thread-603793-1-1.html
  • 反汇编代码
  • 分析flash.ld链接文件
  • 修改flash.ld,将代码区域更改到RAM中
  • 修改Makefile,生成SRAM中运行的代码。
  • 下载,反汇编验证。
  • 隐含的巨大bug。(中断向量表的问题)7 b7 c8 b3 z2 i! N* x1 ?8 Z2 c

; K- b' G7 A2 p- i5.使用串口Part1 https://www.stmcu.org.cn/module/forum/thread-603881-1-1.html/ A7 Q; R* r. V5 H' n/ A
  • ringbuffer
  • 在中断中使用ringbuffer
  • 使用gdb调试
  • 添加volatile修正代码
  • 修正ringbuffer的无锁实现。
    # l9 [/ w7 H8 a3 s. c* T! G  t- r' X
  • 隐含的bug。(中断向量表的问题。下节讲述)/ V7 ?/ e- G9 A/ Z
' d$ k% k' c1 v( c6 \
6.使用串口Part2  https://www.stmcu.org.cn/module/forum/thread-603909-1-1.html, P- }% L# @! I
  • SCB->VTOR
  • 更改Makefile进行版本控制
  • 修改__io_getchar适用backspace
  • _exit系统调用
    4 R1 a! ?  ?- a' }. o1 V3 h
8 F- @, {8 U& ?( a4 u
7.使用printf  https://www.stmcu.org.cn/module/forum/thread-603927-1-1.html
  • syscalls
  • 使用Newlib-nano减小代码大小
  • 为Newlib-nano添加printf的浮点输出支持。6 f7 ~- A5 |  v7 C

/ I% B8 j# r& e" @6 {8 R/ Q  V8. 使用硬浮点计算 https://www.stmcu.org.cn/module/forum/thread-603940-1-1.html
  • 反汇编相关软浮点代码
  • 添加硬浮点运算的参数
  • 反汇编相关硬浮点代码
    * a' V! X  q# v

9 q6 o7 d6 h  ?/ z" H6 \5 l9.再谈_exit  https://www.stmcu.org.cn/module/forum/thread-603942-1-1.html
  • 返回值和参数的传递规则
  • 将main的返回值传递给_exit
    * u" l- a, m% Z6 k; Q5 i; F

, g! U' o$ @4 X10.使用malloc https://www.stmcu.org.cn/module/forum/thread-603945-1-1.html
& b+ P3 Y% H3 n- a2 Q. V  R
  • 动态内存分配机制
  • malloc内存分配测试
  • 为栈保留安全域量
  • 内存布局
    0 o/ x5 N# U. p# q: i; C0 c( c! L6 D

5 f' U  F, f7 t7 S( R11.使用gdb找出因除0导致的HardFault。https://www.stmcu.org.cn/module/forum/thread-604503-1-1.html
1 K. @) A- \, K$ e9 j2 a; _' r- }9 U- h: ?4 [' N5 C! C
. C& D" O' m6 O* h: n5 w
完结9 w8 p+ C9 T$ @; s. @# X8 }

0 U+ C5 R/ B9 G6 k7 r/ q6 W$ K发一个最终版本的文件end.zip。里面包含Makefile,syscalls,以及串口的源代码。' C' u7 g5 S& X2 c" h( W
串口中添加__io_gets,__io_puts。用于从串口中读入一行数据(考虑backspace的情况)或者发送一个字符串。8 _" ]" d' U/ _& D3 [% H. |6 o
# J1 g" U" s# _2 n

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:
) _% K- W+ k$ G9 X& ^, Fcc: stlib/startup_stm32f30x.S
" r" L( u+ \( A  Scc1: error: bad value (cortex-m4) for -mcpu= switch  V# _, a+ B6 |2 }% u- j* Z$ T
cc1: error: invalid floating point option: -mfpu=fpv4-sp-d16
: d9 f) ~, o, s& QMakefile:63: recipe for target 'stlib/startup_stm32f30x.o' failed
2 G3 t0 A/ L# ymake: *** [stlib/startup_stm32f30x.o] Error 1
, B2 R$ K# J' U; t+ Nthanks
  k* z6 c. m4 f% K6 E1 I  F* P5 N' q

. A' G4 H  K& P: [$ O+ x
qianfan 回答时间:2015-11-8 21:07:50
pythonworld 发表于 2015-11-6 12:443 I$ L/ a' Y2 ]6 S
谢谢楼主。能否再写写怎么用HAL在Linux开发。
* s7 Z# q& P/ c3 u
这个系列的帖子不是为了讲解标准库如何使用,而是为了讲解如何使用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的镜像都自己私用了。。# b% n1 s- f) P) U* K0 P
http://www.guge.click/
1 I! G0 E$ ?( ^6 C无法显示网页。
' ]$ `7 @5 ?2 i# w( s, _3 O, n& u$ Y1 s( `4 ~
还好我能直接使用google.com
( z9 W( m2 X% I- T0 Z1 H4 `7 x( j# `
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
9 g- j, d* A! m. q: f3 n自私的抢个版主的板凳,这帖子必须得加精啊!

# u; g) N% c  p# L; k% |那天脸皮厚了,自己加一个。。。
qianfan 回答时间:2015-10-23 13:01:41
风子 发表于 2015-10-23 00:52; S# M1 m3 Q$ M- q
地板留给我,坐等更新
7 v* Z3 a3 Z& ?1 n% y  d+ R
qianfan 回答时间:2015-10-23 13:01:59
ataudio 发表于 2015-10-23 08:22
. p' L: j( D6 U0 _太自私了,楼主连google的镜像都自己私用了。。) t+ C, ^6 E, Q
http://www.guge.click/. A. L3 n. u/ {: [) ]7 ?4 [* t
无法显示网页。
2 C" o/ V1 E" n9 ~  _* v' \
难道你打不开镜像吗?
qianfan 回答时间:2015-10-23 13:02:14
MouseCat 发表于 2015-10-23 09:22
; T. M9 I- u( P. b( v又有大作推出哈,围观
& i- y, ]% @6 A' @3 j/ U: E
好久不见啊

所属标签

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