安装编译器 如果还没安装编译器的,先安装: - l/ k8 E5 g7 ~! d2 v$ m
7 L% b" I3 n8 M% `" K2 f6 N- sudo apt install gcc-arm-none-eabi, r* a' M% W. \( H, L6 L& J! _- N# W
- sudo apt install gdb-arm-none-eabi
. [2 _0 i8 C4 S F5 F5 l - sudo apt install binutils-arm-none-eabi
复制代码 . G* J# U" b3 I% N
/ q4 M5 b& _) y" {4 x# I
7 M4 s3 {4 L" g9 j1 T安装 cmake 和 libusb# K3 K# s) b' x
- CMake(版本大于 v2.8.7)
- Libusb 1.0(版本大于 v1.0.9)2 P: y9 }) N" p/ t
* |* E: i" i3 i( i: S! ~! ]
2 O/ j! c5 k! r' G# z1 s' R4 ^- sudo apt update
3 ~: R5 [4 e* c0 m; c - sudo apt install cmake* @* P# Y" l5 U4 i4 J; W
- sudo apt install libusb-1.0-0 libusb-1.0-0-dev libusb-1.0-0-dbg
复制代码 * _7 _" w( z9 a& X& |5 `
( D! ?9 u, h# k( t' ]- }1 i5 B
安装 stlink
% I* y0 Q- l! }0 ^1 N" V下载开源的 STLink 驱动代码 - git clone <a href="http://github.com/texane/stlink.git" target="_blank">http://github.com/texane/stlink.git</a>
复制代码编译、安装
! q Z( a1 B( V2 r6 \" C6 z- E+ l% ?" d
- cd stlink/3 k6 ]/ Q0 x1 f! u
- make. G# o) j3 L2 l: R# G7 {! P
- make install
复制代码 + w3 S/ N0 V6 \# ]" Y1 I; m, U) p
默认安装路径为 /usr/local/,可以根据需要指定安装路径,例如 make install DESTDIR=$HOME 安装成功后,系统增加了如下几个工具:
2 p- x0 L, V1 z' ?. \
! g. m ^$ }6 G, i工具 | 功能 | st-flash | 将二进制文件固化到 STM32 设备 | st-info | 查询已连接 STLink 的 STM32 设备信息 | st-util | 运行 GDB 服务与 STM32 设备进行交互 | stlink-gui | STlink 图形化工具,如下所示 |
6 `& V, Q7 j. |4 ~* n+ [
连接测试& B9 i$ b6 F2 ]. `/ F! a
+ h9 `8 T. E2 A f* R
刚好我手上有一块 STM32 NUCLEO-F411R,下面我们将利用它来做个简单的实验。 使用 USB 线连接开发板和电脑,执行 lsusb 可以看到已经识别到 ST-LINK/v2.1 设备。
4 l8 E) O: V: |0 x6 z* b- Y6 U
( F5 s) X5 R5 ? s2 Y( v: }, r9 S1 Q. R; n3 w
执行 st-info --probe 查看 STLink 设备信息。 8 J9 c' W0 u5 R
2 \) y0 ^( w |编译 bsp 工程前面我们已经下载好的 rt-thread-4.0.1 源码,进入 stm32f411-st-nucleo 的 BSP 目录,直接编译一下看看。
s+ ^- E- K0 j. _
w' S) _6 U( b3 g1 t- cd /bsp/stm32/stm32f411-st-nucleo/# L/ q) j' m- ]0 b/ V) _# F
- source ~/.env/env.sh, \/ w0 N" h* D: |- p# M
- scons
复制代码
. v& G5 f; [) R$ D6 ^3 s. ^3 S. R9 ?5 \( u3 E
5 ]* {5 F C' l8 I- T% B% Q- a2 ~编译不了,原因是交叉编译工具没有配置好。打开 rtconfig.py 文件,找到对应编译器选项中的 EXEC_PATH 变量,将其修改为本地编译器所在的目录,我这里是 /usr/bin。
8 O" z, x/ X O2 N: H/ b' c% P5 ?" B. _* k/ T3 j3 I
/ n5 ?" d' K! b; c/ K/ T4 J9 z$ f% \
执行 scons 构建工程,出现如下错误: ) o6 b. q9 z X/ S2 y1 A
- ......
$ a; b& l& A; Y1 W" O. ] - /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':# r4 j9 m. U' L0 C# z
- /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
1 _: J( E+ y0 G - for (int i = 0; i < obj_num; i++)# y2 E# A! \$ F5 ~+ D# K$ l
- ^3 C3 R" Y0 O9 M+ H
- /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
; k' x8 y6 v2 A' `; U7 U- @& d - scons: *** [/home/rudy/workspace_hd/Draft/RTTB/rt-thread-4.0.1/bsp/stm32/libraries/HAL_Drivers/drv_usart.o] Error 1# {% }4 b \+ W' v1 c5 ^3 v
- scons: building terminated because of errors.
复制代码 0 ~4 U& k' Z7 x+ S0 D
很明显,因为代码中变量定义的风格是 C99 以上标准才支持的,所以需要为编译器指定 C99 或 C11 模式。打开 rtconfig.py 文件,在对应编译器选项中的 CFLAGS 变量末尾添加 -std=c99 参数。
* D6 C3 x; W$ C) o+ F
, b! e0 {- `* ?0 a+ a j. M
$ G- @, R f1 d
重新执行 scons 命令,稍等片刻出现 scons: done building targets. 提示,表示编译成功。可以看到当前目录下多了 rtthread.elf 和 rtthread.bin 两个二进制文件。 4 {/ _; {9 q, f$ |
下载测试
/ P7 O2 c# G5 m" b% i; S: j& h打开 applications/main.c 文件,在 main 函数中添加一行打印: ' Y5 |5 L* k5 u ]. f& J* H% E. x
- int main(void)
. ]7 T- R# M/ K7 y! r( i' R - {) @2 } y' I) w
- int count = 1;: f1 D' D& H, g: b& U$ W
- /* set LED0 pin mode to output */
1 R1 N z" c4 E8 H( { Q - rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
$ O5 e; L; p8 M" m$ { - y& E7 o, I+ Q, O5 c# t* X) j
- rt_kprintf("\nI am running RT-Thread in STM32 NUCLEO-F411RE.\n\n");
1 U! O6 G& G" }( W. c
" J+ X' l+ x3 m' c# c5 n, Z- while (count++)
0 r/ b2 c2 ]* U$ `& w5 R - {
) Z9 `# _* O4 m3 j$ d# a - rt_pin_write(LED0_PIN, PIN_HIGH);( i. h0 n! z& B- g
- rt_thread_mdelay(500); a# t8 K( [6 A2 g# [: Z3 h
- rt_pin_write(LED0_PIN, PIN_LOW);. @8 m& Y+ c& a: m
- rt_thread_mdelay(500);: R# J1 j& E/ J+ q' T3 _" A! `8 F; N
- }
3 v5 S7 t8 A) }, \ - ' v( P* {5 q; Y3 m+ `& ]+ S
- return RT_EOK;# K1 ^3 d; |: ^( D% q7 `
- }
复制代码 " _3 `* B; r" |/ Q, `
重新构建工程
- a8 O2 l# U( t! y3 [- m
3 U9 F. M5 S( L5 T5 c- _接下来执行 sudo st-flash write rtthread.bin 0x8000000,将 rtthread.bin 文件烧写到板子的 0x8000000 地址。 / Q! h. X" A f( \1 m
- _7 E k; I% ?' D0 A看来烧写成功了!
+ f, o( y+ P1 ]; _ minicom 连接虚拟串口
1 ^6 Q. f" a: S我们还需要连接 STLink 虚拟串口,看看有没有打印出我们想要的信息。首先要确定设备节点,这里是 /dev/ttyACM0,然后执行如下命令进行设置: / o M" u. F& @/ s- j% n
8 A, f$ A& b. E: [$ l选择 “Serial port setup”,设置串口设备为 /dev/ttyACM0,波特率 115200。
+ n; z/ E+ e. j; m3 ?/ _6 i
. D+ R7 Y! m* r* m2 x4 v
选择 “Save setup as…” 将配置命名为 stlink,该配置文件保存在 /etc/minicom/minirc.stlink。 9 _! v( k- [ n2 c2 N1 \
6 [0 r) ~4 u; \ M
退出,重新输入 minicom stlink 命令,即可打开 ST-LINK 虚拟调试串口。
9 G# G5 n( K6 C, v- m( a
# v7 b Y0 \8 }; }% H6 n7 n看到我们想要的信息啦!这也表明我们在 Linux 下搭建的 STM32 开发环境 OK 了!
; Q" K% c% l; O/ p, b2 }( Z3 A
% A/ m' B6 @0 n( A6 {
$ r9 g- ^& N( B, _
|
这个位置的命令有错误,应该是:& e* p/ `4 H5 g: a7 D
+ {2 g* R6 O' l+ d