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

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统

[复制链接]
STMCU小助手 发布时间:2022-9-4 16:54
1、基础工程建立
4 }2 b' H) _0 L* Q& F5 U首先通过STM32CubeMX建立基础工程,首先开启RCC并将时钟配置到72M主频:& {8 I, d3 J. D- K# a
; L0 d3 T: Y8 A. x" t: c
0d9a9d0cdf844058b67dcb56f0824717.png 2 Y0 f* M2 X2 q
27e99cb5ca624cfa946152e3d4268811.png / U8 d" P7 ]# |2 ~( }$ m9 H

+ {+ O2 u; }/ n: f' q配置串口1用于调试打印:, h% v- S; ]. s3 m$ ^9 S9 H: K

3 }* [  X* e# v- \; N9 V# h a139d6331f4740f182d61b46f26253ba.png
9 n! \. s7 o5 Y8 p1 {! k; Y
* T* U+ |. b: [* X5 y在配置个LED灯的IO:3 m/ n  ]7 K  h) |+ S& n

5 d6 a+ c1 Z' s% g  U; {7 U 7ce51f1027e440d9889cf6e2f4647a75.png
5 }( t- a7 r7 h" X: I; \
6 `. `7 Y4 {4 q" S! r3 F$ {将HAL用到的系统滴答定时器切换成定时器7,因为SysTick定时器我们要给rtthread使用:- V/ n% M4 P) m4 Y) I
# P( \  y( p* X1 v, j! `
76ef1c75457e45f4881e20e9b4ce86d4.png , O$ s# y1 r2 i" X& w0 e
% M& b# f9 i6 N. E, W9 \0 Y
中断分组设置为4:9 }$ c. l, T; d( \$ w- D8 p8 P
1 l4 m; G* v' ~! [! y
4628c0ec1aef4130972ed4e81954007b.png & [/ e7 n0 M% P  B1 n# Z- O9 N

" P+ K; B) T. i1 c* o取消掉这三个函数的生成,因为rtthread已经把这三个函数生成好了:% d. a1 f- W( N9 P. i3 y
& G0 V% c! V) ?' \
55205bfb94604af794ba0184059c1c92.png
' i" x2 P/ j- e$ _, _. ?0 O
  c8 Z5 d3 C  ?- `! ?最后输出工程:/ n6 B& P# H! G1 C& `! J9 S

. i  S; |8 Q/ o% Q* @- L e7ca145b011c401fbb1f1f9c8ad5467c.png : r' @2 l: n2 n& q$ i* c6 Z
5 U  T3 p0 \/ q6 g5 L' S
f4da79b9a4ef44be9e97854af8767d77.png   T9 }; A: H1 s3 y  e  w
/ Z; e$ `2 {- `, q0 t" `6 z" Z
( S8 @0 b* ?1 y7 J( [/ `
2、移植rtthread-nano
+ y& k7 b' s1 n* Y3 o: C从rtthread官网下载解压rtthread-nano源码并解压,我们移植需要以下文件:" Y3 \" d& v/ g/ J: J/ T5 g
/ m) I6 [, r: B5 q& n
2592cf885b784e149ee478576865d88b.png
8 M% N! l  E0 y: C8 F. Q% O/ r
$ @, i# Z2 M3 |) I将上图文件拷贝到工程目录,如下图所示:
; }6 \+ w/ H3 k% u5 u2 h( F- ]$ K" D* b7 d& V4 k
eab01db0b60f4fa6bbf11c88a7fb93f2.png 6 W# r; q/ ?+ p: d
* U% w0 }) q) b
需要将rtthread添加进工程的文件有:
* E( ^' G9 J* Q+ a/ p+ v) z: O9 O+ s' W
libcpu\arm\cortex-m3\cpuport.c
6 [$ r! p/ @" D8 ?, h( v( ilibcpu\arm\cortex-m3\context_rvds.S- Y4 o% v, K2 ~5 R, P
src目录下的所有文件
/ a1 S9 q; c* n, _( Zboard.c/ R; P8 i1 n: _, k

/ _- G8 q" y, r, d+ E8 U+ P如下图所示:: v* ], I( ^7 c5 G; ^' M1 u! |

# x, N* l* M3 g% A 816423cfd5a64dcd8fcaca5858558f25.png
+ d# r, p4 F' v$ J" P9 ?7 v  f. n, c: {3 u4 t
然后添加头文件包含:$ n2 o4 @: S6 l1 `
. a# ^: x/ E, {" G& O" _
dcc75905292b49749fbad7b3994cd752.png ( A1 L3 p9 C7 ]5 r

. ^5 d$ H6 K  g尝试初次编译,直接编译通过:
/ Q5 e- V+ d0 C/ Y; Q
. u" o& b1 C: y" n$ g6 f 457ead60999e4a288672a0bfe10bc0c3.png
' j8 l! W' \3 g. c% }& C3 Q+ ^% O
+ ]- y7 t( F# M0 C4 T( f接下来还需要修改一下源码,适配HAL库。
' f5 v4 _/ O$ o2 f1 `9 Z7 m/ b+ `
首先检查一下rtconfig.h配置文件的各项,在keil中打开可以切换为图像化配置,基本默认配置即可:
6 j- j& `" f! Q' d: b& ~( `+ n
- z1 r: k5 v0 U3 w5 ~/ u: k 02570946856a47bb8461afde46d08f04.png / ^% Y" v5 b) i0 o6 G% d) D/ J

* V" p+ G; x' L; ^然后适配时钟,打开board.c文件,找到rt_hw_board_init函数,改为以下:
3 `$ c9 M. u/ }5 \4 l% B: k# t% f& G# `% D7 J( k
2d9d30fc46f74af0a3fe6cad6a57037d.png
, d% X3 w2 j, K* _- e  j) n: o6 O! R
接着在main.c文件中写一个外设初始化的函数chip_init,将CUBE生成的外设初始化函数中该函数内,用rtthread初始化列表的形式进行外设初始化:
; U2 w1 K* Q* C  ]- m6 Q$ R
+ I2 R1 c& b8 i% J) u" l f777aac63d17478ca06343ed8d5964ff.png
9 W) D6 F% k" }9 ^- Q+ ?0 ]9 s- f7 c" z7 K: D# q
然后重定向rt_kprintf函数到串口1:
0 S/ P* c( A9 q7 P
0 n% i- A% ^) t e6c40ba7bc3541a58e32d230ebe505ee.png 8 }' z# W. B1 N- [. Z

1 B# W8 E- N  X4 }- I
  1. #ifdef RT_USING_CONSOLE
    % h8 m# m0 y  M" j! K2 \8 [% K, ~+ s
  2. void rt_hw_console_output(const char *str)0 Y0 i$ I' G+ ^- Y
  3. {3 e1 _1 W3 o5 V- S: T/ ?- c/ \4 x
  4.         HAL_UART_Transmit(&huart1, (uint8_t *)str, rt_strlen(str), 100);
    # V8 M  A+ K, ^. z. b7 d/ M; \/ A+ H' o
  5. }
    * q" c* e+ O4 s& J+ B% ~' m" q
  6. #endif
    $ y3 b2 \1 ^* V8 R. Q

  7. ' h7 ?4 \) h  z; k; u
  8. #ifdef RT_USING_FINSH
    2 j9 T  L- W5 p. R3 W- P) D
  9. char rt_hw_console_getchar(void)
    5 H' X3 i4 ?  C1 X6 u
  10. {* K( D  p- A* Y
  11.     /* Note: the initial value of ch must < 0 */
    ( r7 f) l: u6 j7 K" w3 E
  12.     int ch = -1;
    6 ]( Z2 k. G4 _

  13. 5 M. C5 s) @9 x) x
  14.     if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
    + [8 ^1 s3 c+ I' _. P8 ~; I
  15.     {/ \9 M9 J; a) w+ |2 Z
  16.         ch = huart1.Instance->DR & 0xff;( B+ `) K( U4 Z7 ^: `4 z
  17.     }2 r& H/ u! ]1 a- [
  18.     else: u* w2 m- c* ^
  19.     {
    : {3 y$ t( m+ V, v4 o) y. V! ]$ A
  20.         rt_thread_mdelay(10);- s. J- `2 K! E& U2 P5 x$ H* R
  21.     }5 F. ]+ s1 D/ ^" P  _/ Q, f& z
  22.     return ch;
    6 G0 w5 B6 @9 T) t3 N
  23. }
    $ O- w+ W6 w4 _
  24. #endif
复制代码

# }$ _! P, C6 `. ^  q+ H# v
  p0 Z( H8 [# Q/ Cmain函数中创建一个LED灯的任务:
- x* ~& x& l: H1 i5 ?. f' q' l! \; q& m: t* w6 t' l
2299bd1ba3ca42c29ca97415b92d4bdb.png + e8 \. B: l$ ~$ |$ b

' N% `6 T+ U8 h6 O- b# }最后编译运行就可以了:' F8 U( N& ~. G5 I2 f3 b( h

! h7 u: l" r1 u* b( o7 V* V db629f459d994599b234b959e2905323.png . {- ?2 O, h  I2 C% D/ ^
2 W5 }4 m  I3 u( K% S/ P
3、添加finsh组件
$ e3 Y' j( w+ W. L将finsh源码和头文件包含加入工程:
$ L' b1 [3 D9 q. q5 i& C# w
% k# b. T. {$ G; B6 x4 W 5f49dba9a85148de9e58aec227a6b3f2.png
. B' G  V9 [  X1 ]+ Y! A; H$ z4 {4 ?0 B& N# H" q: a$ w* B( Y& }
73fb4cf1fc304438b7b3a5057bd0d97c.png
8 I9 o" U$ D4 {
" m7 I7 M2 g: K- `( N( u$ f* E- S' _0 t4 F
在rtconfig.h中添加宏定义:
, j9 o" o, r6 i6 `( B, P0 Z. @+ I% I. F  w& o
#define RT_USING_FINSH
/ q1 K0 `! l1 {2 j4 ^9 `! a, k0 ?: [
f30d19f69311467fadd5aeb7fcb0f378.png
/ y3 s" R7 l" g) x3 j# `* i; e" W: v- p1 t8 E$ l9 E- ~' ?
将mian函数中的打印屏蔽掉,要不然不方便finsh的使用:
" r1 o) Z4 s: K9 @0 k$ K9 f4 n) ?3 X/ Y" D4 U1 u$ O, z
d6d943b3774c472f8eb3987682f37804.png , ?/ O3 Y7 L5 h) o; n" _8 l
9 u) L5 k2 m' D: _+ t/ l; R( S1 d
然后编译下载运行:
' X8 _5 H( F) w6 r( D3 D6 b4 {( b0 ^
91e954d608d54757839743f95e0008cd.png
* o+ n0 A' b; g; W& U% U) e9 J8 F) Q/ \' s
注意xshell的设置,rtthread是用\n作为回车换行,而xshell默认为\r\n才是回车换行,所以xshell需要这么设置才能正常显示rtthread的打印:8 |- M+ w$ D6 Q6 B1 x& F: Q% m4 Q
- j4 v' a) n3 g4 s) u% v
599c0380b0c642a5bfa09d5c7a77bdcb.png . r3 k7 \$ p, a$ |$ ?( f
/ }6 ~5 j9 \' n: j
————————————————
9 `" Y# K0 F4 v# B0 P) B- u& ^1 |版权转载自:雍正不秃头
" f5 q6 A! s; E& L
. M+ X. R$ U. N# S5 \8 W
, v+ s" \# u7 p* }4 n: j+ e
赞 收藏 评论0 发布时间:2022-9-4 16:54

举报

0个回答

所属标签

相似技术帖

官网相关资源

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