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

Linux 下 STM32 开发环境搭建

[复制链接]
STMCU-管管 发布时间:2020-9-24 13:16
安装编译器

如果还没安装编译器的,先安装:


( j& G' f- i; }5 M& f5 `
9 _' h1 o& p/ T
  1. sudo apt install gcc-arm-none-eabi! y" t: |" a9 o: J" `4 S9 y
  2. sudo apt install gdb-arm-none-eabi
    9 |$ w1 _! j( B- u9 H
  3. sudo apt install binutils-arm-none-eabi
复制代码

, N' w3 g8 `" g" s
- D$ p% h  ?# ?4 A, R7 B( V1 h. R3 e- |, {
安装 cmake 和 libusb
, i) o9 i: O) z, j! t
  • CMake(版本大于 v2.8.7)
  • Libusb 1.0(版本大于 v1.0.9)
    ; S: z5 Q) t& u; v% n
+ e; _! D; A, @

- |, z* D4 ^; G, u" w  I. A
  1. sudo apt update
    ! U" F( {% D5 m
  2. sudo apt install cmake
    6 z2 d- Z/ a$ C5 E8 A! F" `
  3. sudo apt install libusb-1.0-0 libusb-1.0-0-dev libusb-1.0-0-dbg
复制代码

9 c% G3 j4 N3 w  C
' G; K  B3 F& a: ?安装 stlink
% G, _* i1 w0 j! S# W' J

下载开源的 STLink 驱动代码

  1. git clone <a href="http://github.com/texane/stlink.git" target="_blank">http://github.com/texane/stlink.git</a>
复制代码

编译、安装


' C* u' f8 q2 R+ x* q

  1. cd stlink/
    : \! I) g  p# C) z# B  {& |! Z) u
  2. make! u: _* y% x! O
  3. make install
复制代码
6 \* U8 L% e1 D; T

默认安装路径为 /usr/local/,可以根据需要指定安装路径,例如 make install DESTDIR=$HOME

安装成功后,系统增加了如下几个工具:


% ?9 J! I8 J4 W


; t" e' i0 q2 m5 K
工具
功能
st-flash
将二进制文件固化到 STM32 设备
st-info
查询已连接 STLink 的 STM32 设备信息
st-util
运行 GDB 服务与 STM32 设备进行交互
stlink-gui
STlink 图形化工具,如下所示
6 ?$ U- \, ?% g5 y2 Q0 i6 a* X# v) T9 d

1_meitu_1.jpg

连接测试
0 z/ C+ I: @- e5 I: R& T0 w2 q! E# b7 I, s' K/ D, r$ U

刚好我手上有一块 STM32 NUCLEO-F411R,下面我们将利用它来做个简单的实验。

使用 USB 线连接开发板和电脑,执行 lsusb 可以看到已经识别到 ST-LINK/v2.1 设备。


0 a5 y4 Z" j9 s1 B  M4 T% q

2_meitu_2.jpg


, P  Y# T! N# F& k( S" e9 j: j- V& t$ N2 `; J6 |5 a5 N' V4 e$ C

执行 st-info --probe 查看 STLink 设备信息。


- x5 k* i: W$ B; H

3_meitu_3.jpg


4 s. D0 m; a( q6 ^9 {编译 bsp 工程

前面我们已经下载好的 rt-thread-4.0.1 源码,进入 stm32f411-st-nucleo 的 BSP 目录,直接编译一下看看。

1 }  E; r; c8 G) {; t
; G' E* D) K- y6 z; b( f  `$ z! s
  1. cd /bsp/stm32/stm32f411-st-nucleo/; W: Z, [! ]/ B
  2. source ~/.env/env.sh
    8 F% i! h- b+ p' ~5 \+ d
  3. scons
复制代码
0 d. H1 w/ ~. \) G

. W' j/ m% O2 n8 z+ i& ~/ _% }5 v/ u1 r" g- @
编译不了,原因是交叉编译工具没有配置好。打开 rtconfig.py 文件,找到对应编译器选项中的 EXEC_PATH 变量,将其修改为本地编译器所在的目录,我这里是 /usr/bin。
6 N8 s* M% l0 i$ e" P& b& f

/ |# H# M/ q1 O" L

4_meitu_4.jpg


3 ^" _  `* A5 m7 W* s* m8 a  z5 r1 c2 X3 a7 D: Y$ ^

执行 scons 构建工程,出现如下错误:

; \' z2 S& J6 L" b6 ?: U+ d) N

  1. ......" A0 J$ E2 b* G& f5 Q
  2. /home/rudy/workspace_hd/Draft/RTTB/rt-thread-4.0.1/bsp/stm32/libraries/HAL_Drivers/drv_usart.c: In function 'rt_hw_usart_init':
    " {. z0 c6 I! v5 t+ T
  3. /home/rudy/workspace_hd/Draft/RTTB/rt-thread-4.0.1/bsp/stm32/libraries/HAL_Drivers/drv_usart.c:662:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode! q/ O: i6 ]( N( C+ T9 g1 u
  4.      for (int i = 0; i < obj_num; i++)1 G  R* G: N8 c3 j7 ^' A3 s
  5.      ^, {% n8 ?3 b4 Q: z
  6. /home/rudy/workspace_hd/Draft/RTTB/rt-thread-4.0.1/bsp/stm32/libraries/HAL_Drivers/drv_usart.c:662:5: note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code$ ~( |4 p/ J5 t* C' V) S) R, q
  7. scons: *** [/home/rudy/workspace_hd/Draft/RTTB/rt-thread-4.0.1/bsp/stm32/libraries/HAL_Drivers/drv_usart.o] Error 11 Y& s, _2 S/ }9 f( k& B
  8. scons: building terminated because of errors.
复制代码
% Y6 z  t4 B4 o/ O

很明显,因为代码中变量定义的风格是 C99 以上标准才支持的,所以需要为编译器指定 C99 或 C11 模式。打开 rtconfig.py 文件,在对应编译器选项中的 CFLAGS 变量末尾添加 -std=c99 参数。

  @3 \. H5 m2 c  }$ q% L% h0 x  X

5_meitu_5.jpg


' s$ k+ o' o/ R: O0 N. Q" Y: H& t9 d7 ~7 H) ]. }

重新执行 scons 命令,稍等片刻出现 scons: done building targets. 提示,表示编译成功。可以看到当前目录下多了 rtthread.elf 和 rtthread.bin 两个二进制文件。


1 [* N4 R; i5 T1 ^2 @

下载测试$ G3 D; M4 T' _# b8 x* T% }# E

打开 applications/main.c 文件,在 main 函数中添加一行打印:


/ I7 ~. s" c5 n% n3 Z- F

  1. int main(void)
    3 S: r8 \5 {1 ]" K
  2. {
    - I1 p: L, K0 l( A
  3.     int count = 1;
    + G$ s- M# {  |5 f0 a9 G1 r, _0 O! z! c
  4.     /* set LED0 pin mode to output */0 s6 r/ O( V, A, O& H" W3 G4 w4 p  s, g
  5.     rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
    ( W4 o7 Q5 b' {! f7 E; u$ d
  6. * e& K/ H1 X; a' c  f2 n  M) b
  7.         rt_kprintf("\nI am running RT-Thread in STM32 NUCLEO-F411RE.\n\n");
    : I* Z  j0 l# s% B1 J/ d" b0 g

  8. ( q, W. `& A- w- {
  9.     while (count++)
    9 K- N  f+ c' O3 O/ o
  10.     {
    ; o0 t+ v3 Z) T
  11.         rt_pin_write(LED0_PIN, PIN_HIGH);
    6 k* C  W( [0 Y1 O  `* p, }8 s
  12.         rt_thread_mdelay(500);
    ) v" u" A5 H* G
  13.         rt_pin_write(LED0_PIN, PIN_LOW);
    7 E4 V5 r) L/ M, `! _4 a; l. {0 e
  14.         rt_thread_mdelay(500);
    $ I3 a3 c8 i1 F, w
  15.     }
    % ^( r/ f0 z1 A3 Z6 j/ h! x& }& o
  16. 0 j: \! ^4 H8 j- D8 z5 w% Y: P
  17.     return RT_EOK;
      M: H3 d/ [" u! ~
  18. }
复制代码

! _2 [$ ?; T: X  V

重新构建工程

, L* S3 }+ Y5 @% f8 t! t

6_meitu_6.jpg

4 J1 S- u' u- @1 c$ j; `: Y

接下来执行 sudo st-flash write rtthread.bin 0x8000000,将 rtthread.bin 文件烧写到板子的 0x8000000 地址。


+ [) Z# y- [3 U2 X3 w) m7 M3 H

7_meitu_7.jpg


  G$ q- |5 U+ @. {8 Q

看来烧写成功了!


) n7 U# \$ c7 n4 ~

minicom 连接虚拟串口
2 P" j! ~* b6 M5 _" m5 @, e/ ^

我们还需要连接 STLink 虚拟串口,看看有没有打印出我们想要的信息。首先要确定设备节点,这里是 /dev/ttyACM0,然后执行如下命令进行设置:


. x5 o( {- w# l% M0 R8 j6 y; S4 S
  1. sudo minicom -s
复制代码
0 i% x7 S9 v8 j6 S3 F7 q! H0 P

选择 “Serial port setup”,设置串口设备为 /dev/ttyACM0,波特率 115200。

% Q: l0 O) e6 Z+ I. Y6 }

9_meitu_9.jpg

# [* d: H, o* b1 w2 Y4 l

选择 “Save setup as…” 将配置命名为 stlink,该配置文件保存在 /etc/minicom/minirc.stlink。


2 ~( t& r" s+ {2 h+ x7 N5 ^

8_meitu_8.jpg

% w- C: M8 e4 s! S7 h

退出,重新输入 minicom stlink 命令,即可打开 ST-LINK 虚拟调试串口。

7 [% P3 E  f. V6 _1 G

* z/ _; I- O0 b2 i; J5 C% c

看到我们想要的信息啦!这也表明我们在 Linux 下搭建的 STM32 开发环境 OK 了!


- H$ i6 }( Z* O5 `' u% H( p

10_meitu_10.jpg

3 x, o! q8 \  l8 O3 u
9 F8 ]" r6 y  D. U' ^
赞 收藏 1 评论2 发布时间:2020-9-24 13:16

举报

2个回答
小歆-2051663 回答时间:2020-9-24 16:23:13
微信截图_20200924162150.png ( r' I3 }9 x+ M, b) v& p
4 [/ Z  T) |* r& k, G5 r# z" _0 W
这个位置的命令有错误,应该是:' T4 c/ @7 Z+ [6 z* Y1 X$ N

8 ?# `( e2 I: A/ b/ B
  1. git clone http://github.com/texane/stlink.git
复制代码
" `! `; h% P$ J- ~$ c
" b: u9 h' H0 n$ I0 b! t
海石生风 回答时间:2020-9-25 15:27:51
为何不用STM32CubeIDE?
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版