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

Linux 下 STM32 开发环境搭建

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

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


6 q' Z3 V# Z" P* U( [, w

% Y- V4 e: W+ o) _! Y2 k
  1. sudo apt install gcc-arm-none-eabi
    3 ?( T, W, v7 V$ X
  2. sudo apt install gdb-arm-none-eabi( ^: @; W1 U0 D
  3. sudo apt install binutils-arm-none-eabi
复制代码

9 @' L3 f7 G( E& B5 _9 l8 U' ~
6 ]7 l8 |4 w5 w2 @/ {" n% x0 k1 m7 C" c5 a2 ?/ l- J2 r
安装 cmake 和 libusb
. d! ^6 g7 T" x' G8 o
  • CMake(版本大于 v2.8.7)
  • Libusb 1.0(版本大于 v1.0.9)
    0 ~6 @$ K* M3 z+ K1 ~
! O9 v- N6 o2 J; `! I

/ M! [4 Z( R5 k4 o' U
  1. sudo apt update* o$ N4 p5 j" @' m) _4 Z3 o$ k2 Z
  2. sudo apt install cmake# t- X. n5 A; e. e
  3. sudo apt install libusb-1.0-0 libusb-1.0-0-dev libusb-1.0-0-dbg
复制代码
+ `8 S$ |* q4 k/ b2 T$ Y9 B+ J% I
1 g, |- {8 `8 N' t& u  w
安装 stlink
% X- k, w8 x5 F1 L7 F

下载开源的 STLink 驱动代码

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

编译、安装


' {4 b. w9 y$ x+ I

  1. cd stlink/
    " J7 {6 s" y' ^* ?6 B% k
  2. make
    - w% l- O% M) T. M5 j4 |" G+ |
  3. make install
复制代码

3 M& t3 [6 v8 x3 [& E. U

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

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

+ f2 L; l% G; O, g' M* v


4 u" v! E) h' D+ F5 q3 i' Y- u5 g
工具
功能
st-flash
将二进制文件固化到 STM32 设备
st-info
查询已连接 STLink 的 STM32 设备信息
st-util
运行 GDB 服务与 STM32 设备进行交互
stlink-gui
STlink 图形化工具,如下所示

- a: v2 z3 @. x

1_meitu_1.jpg

连接测试% D& h& C, X' G1 ~- i8 O; i2 _  p
+ w  s( p: k5 s! ?9 \0 N& u

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

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

/ N. E; {! v" b" w" o

2_meitu_2.jpg


# m4 U4 j/ H& Z. u4 l5 D/ S( A/ n  m: _, S6 i9 W! a

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


, a8 f" o7 v1 l( Q$ G. j, X  k

3_meitu_3.jpg

  h& {: {% H5 W6 ^! k* }
编译 bsp 工程

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

& b% V* E8 z! h7 S/ d1 I

8 I3 t& ?3 {+ h, J+ F% n6 Q3 d- _1 b
  1. cd /bsp/stm32/stm32f411-st-nucleo/
    $ h* g# _& Z4 B9 }
  2. source ~/.env/env.sh1 }! V' W3 A3 M1 m" x: r: z
  3. scons
复制代码
) p$ m4 \5 M- k' t6 s
2 K1 G- t$ N, Z5 ]/ s0 i

' H. N) w/ v4 J8 M7 I$ k% X编译不了,原因是交叉编译工具没有配置好。打开 rtconfig.py 文件,找到对应编译器选项中的 EXEC_PATH 变量,将其修改为本地编译器所在的目录,我这里是 /usr/bin。
- I  c! J' X1 o1 F  ]4 {. M& j/ d

( T3 Z8 _2 n2 r

4_meitu_4.jpg


: }5 T  w# _8 I4 c9 H# k8 T2 j6 @4 X9 @' X& }

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

9 h; B* t0 l1 }$ k0 w

  1. ......
    8 A3 t4 V4 m! c4 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':/ Q5 [* _5 i8 x. I( v8 h
  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 mode4 Z5 G# ?! A5 S
  4.      for (int i = 0; i < obj_num; i++)
    5 N$ ~0 {; |; E" b
  5.      ^& T) M8 E. S% q- \: X* 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
    1 V/ p. D5 u; E
  7. scons: *** [/home/rudy/workspace_hd/Draft/RTTB/rt-thread-4.0.1/bsp/stm32/libraries/HAL_Drivers/drv_usart.o] Error 1
    + B) `) U: _& }6 t% H  Q
  8. scons: building terminated because of errors.
复制代码

' j+ Y7 l- Y& k: q/ F1 B) D

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


2 V8 W+ U* ?7 D7 f

5_meitu_5.jpg

' J/ J0 F/ |6 L: q  U

4 W4 Q* f! Q7 z  V) E

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

9 r$ B5 z" V1 m$ p  d8 K

下载测试0 O+ v/ S/ n5 \

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

3 H3 ^' P" _( f

  1. int main(void)
    9 j' V0 R5 w/ q4 j( y! Z
  2. {
    7 m6 y" a4 d6 m/ [* e9 T, v/ P  c0 ?
  3.     int count = 1;
    5 m* k* j0 v  r% M; {' p! m
  4.     /* set LED0 pin mode to output */0 I0 i! c' o8 I0 Z
  5.     rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);1 D* @. p0 j! G
  6. . W8 M. n7 P- t9 |
  7.         rt_kprintf("\nI am running RT-Thread in STM32 NUCLEO-F411RE.\n\n");
    9 D6 _  W7 Y; o$ F; X+ R& o% [' o

  8. 8 E6 Z8 m, Y) t- h
  9.     while (count++)1 I( q: v4 T* w# g( M( I4 J' j
  10.     {
    2 l; I( J, n5 u+ W6 K7 ~, J4 P/ @
  11.         rt_pin_write(LED0_PIN, PIN_HIGH);
    , D$ w7 I' f% `! A6 |- p' }, ~, J/ k
  12.         rt_thread_mdelay(500);
    6 \& q; d: [) V0 w  t0 K3 E) j& r
  13.         rt_pin_write(LED0_PIN, PIN_LOW);
    ' @0 t5 e9 R8 f& P2 e: G
  14.         rt_thread_mdelay(500);
    2 E$ j- |; R0 J3 Q# E: ~' C" B5 c
  15.     }- }% f$ q9 p: H& T/ J

  16. . o8 T# L7 ]! O% u
  17.     return RT_EOK;0 R2 \" W* V; [7 o5 T1 e" t
  18. }
复制代码
7 B* I# E8 i- Z- ~

重新构建工程


, W9 c7 a) U2 i7 D6 p. D  ?8 T

6_meitu_6.jpg


9 t+ H3 g3 E5 w# ]+ T% \8 E

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

" A* n( a7 {1 u2 t2 J" Q7 W& p- [

7_meitu_7.jpg


$ X( S" a& e! S, e+ b

看来烧写成功了!


3 X; Y% u9 p  i0 @: {

minicom 连接虚拟串口
( w' p* H4 \- O% o

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

4 u2 W  t/ G3 D  v
  1. sudo minicom -s
复制代码

2 u: y8 K+ G, r/ Q+ t7 d9 o! j4 `

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


- u) y' t4 q- @; @0 O* Y- P5 x

9_meitu_9.jpg

9 C, h) Y( q1 f* g" c( S2 a) d' A/ z

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


0 M) l* R7 c, w) H

8_meitu_8.jpg


7 M9 S, b7 k  }; f* N

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


' S; h# O0 g$ f  Y( e1 ?

" N3 F2 M( N. O# t, x- B

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


9 q' H8 i' V' M" z6 K1 x0 T

10_meitu_10.jpg

9 M3 X/ ]- z' m. J: K

8 w! y9 i, _. G1 X
收藏 1 评论2 发布时间:2020-9-24 13:16

举报

2个回答
小歆-2051663 回答时间:2020-9-24 16:23:13
微信截图_20200924162150.png
8 }3 j) h+ j# h$ u3 M/ ^6 B: U! M" G: f( m7 t  n9 {
这个位置的命令有错误,应该是:
) L2 r& F0 C+ m; @3 a/ `; @9 Z
' u) {$ K+ L2 w* O- Q7 s+ O1 \% S; a
  1. git clone http://github.com/texane/stlink.git
复制代码
, P, F7 e2 x0 a. Z; \% S

2 B( W& V" J5 W0 \5 ?. L4 Q
海石生风 回答时间:2020-9-25 15:27:51
为何不用STM32CubeIDE?

所属标签

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