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

STM32 CubeIDE 使用RT-Thread Nano

[复制链接]
STMCU-管管 发布时间:2020-9-24 12:54
1、RT-Thread Nano pack 安装

打开 STM32 CubeIDE --------->Software Packs ------------>Manager Software Packs界面

% w6 ^3 ]6 V9 ]" I

1_meitu_1.jpg
/ f- x$ R( }  W$ d- K7 H/ J
- N1 s+ E* k' Z9 ^( Q" L# f

! P4 i+ F5 y: Z) s( S8 X# Z8 U9 N7 e" N1 p  T* H

  获取 RT-Thread Nano 软件包,需要在 STM32CubeIDE 中添加 http://www.rt-thread.org/download/cube/RealThread.RT-Thread.pdsc


# a: Z4 x+ I- v) f% s

2_meitu_2.jpg


. S1 R/ i! B; A

回到 Manage software packages 界面,就会发现 RT-Thread Nano 3.1.3 软件包,选择该软件包,点击 Install Now,如下图所示(颜色填充表示已安装):

# ]* t; m) S, k. [8 X- |$ a. x

3_meitu_3.jpg
3 V3 O+ L' G* F: X( ~, f
+ k+ E7 `- @3 o$ y3 X/ b/ M. @
4_meitu_4.jpg
. Y/ J6 @0 j5 B. U( U

8 C3 ?0 q1 q! V/ P- ~% C
* l! I( i, W$ V1 e2、创建工程添加 RT-Thread Nano) r9 N- @2 t# `
) p5 B1 W7 a; K5 R
2.1 、创建一个基本工程" f9 }2 n1 i; ^, h7 ~/ p% K% |, ?

创建一个基本的工程文件,包含2个LED灯和USART1。

6 ]6 |& h; k, l6 }

  ?+ B" D4 c' N* N, V" Q
5_meitu_5.jpg
2 s& r* C! ?( s7 [

, Z5 h$ ^- J9 u& K4 U" Y
6_meitu_6.jpg

' k# v4 S; L4 Y4 Y0 j
5 v7 d. D/ W' L( c& s* X
7_meitu_7.jpg

- c$ c( z% n  @. H+ M) g" G- F/ c, H4 X/ H( V

- w4 \/ e3 n4 k2.2、配置 Nano- ?$ J& _* y$ z0 q

勾选 RT-Thread


$ g, @" Q6 ~% p# x$ L: _

8_meitu_8.jpg
/ `# b( I4 t; Y$ r2 K% C' U
, Y4 }4 q! ~& c. p. |3 |% G
适配 RT-Thread Nano+ C$ O: W: c8 D: s. c6 H

/ f1 J- T/ x  ^; u  s9 {
中断与异常处理

! ~2 P; I1 i2 c9 z/ M. r' |  m
RT-Thread 操作系统重定义 HardFault_Handler、PendSV_Handler、SysTick_Handler 中断函数,为了避免重复定义的问题,在生成工程之前,需要在中断配置中,代码生成的选项中,取消选择三个中断函数(对应注释选项是 Hard fault interrupt, Pendable request, Time base :System tick timer),最后点击生成代码,具体操作如下图中

, q4 R+ q8 ?/ A* k* Q+ \

9_meitu_9.jpg
# E; G) }- t) `3 @- `" ~
$ x4 @' h6 E) W0 O- Q0 M0 T
7 c" [! N# _3 ~9 w4 G
3、工程代码修改
$ I  X  O; B* x7 a+ A0 o9 Y2 f% x0 M
3.1 需要修改的部分. X  ]5 R$ }6 g; j  V. X. W# Z/ `5 ?

1 、修改启动文件 startup_stm32f103rctx.s9 |; m3 ~; k6 }; B7 {  N* t6 V6 t
bl main 修改为 bl entry

. d  c7 q* |* N3 O) s( h% o

10_meitu_10.jpg
2 m& E( l8 T4 U, e. [5 d" f
2 Z; H+ n6 |8 w/ U" o

# w( f/ }. z* k' P" a7 W/ o+ T3.2 、配置rt_kprintf端口输出

端口映射,函数可以放在main.c文件里面。' v5 P/ h5 t+ a$ q2 K  _! s

11_meitu_11.jpg

- D7 \( [- ^. _* R7 t  \
6 U. \( k" R3 C- S0 j
12_meitu_12.jpg

) w7 u6 H- u0 P6 @4 Z( G/ J: s1 z' X/ G4 I

# p- I9 m/ e* o8 R9 \0 K
7 L/ `1 r7 q6 T$ L4 |; S9 Y2 A3 n2 u% c+ n( M2 \

% `( g$ }+ s) s8 A$ ~
  1. /* USER CODE BEGIN 4 */
    6 s$ f+ s1 y. a! [3 B
  2. char rt_hw_console_getchar(void)/ S3 }( ]. U# Q; k7 D$ @, M
  3. {
    / h  H3 Z  O/ T* \
  4.         int ch = -1;0 l% l. ^/ C& w- h" P+ K6 Y
  5.         if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
    , k+ t8 }/ @/ P! h% N$ S, F' _
  6.         {
    - q0 b! `5 `8 R/ t6 S7 _- ?3 K
  7.                 ch = huart1.Instance->DR & 0xff;
    & l0 W+ W  S" R, Z1 W7 [( P1 Y
  8.         }
    & j3 W2 _) `4 T0 z9 n/ G+ \) a
  9.         else
    . ~# u; h0 ^- s: y; b4 k; W5 D6 a6 f
  10.         {! w* E6 W3 L! |: }4 G" G
  11.                 if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE) != RESET)
    4 N* O4 s7 v6 o. [% D7 A* |* e
  12.                 {
    & @8 X7 @% u! K3 m/ F$ t& u
  13.                         __HAL_UART_CLEAR_OREFLAG(&huart1);
    : M- i! j& L5 X% D. @+ v  `
  14.                 }% q8 O7 B0 c, f7 g; M4 L3 P
  15.                 rt_thread_mdelay(10);
    ; \& k. U% ~/ [7 v1 n
  16.         }
    1 D  ^# U" t6 b
  17.         return ch;+ U, ]* ~/ f4 V) H9 A! R
  18. }! e8 f5 g3 Z4 {# b) m" K/ D
  19. void rt_hw_console_output(const char *str)
    ! a' j7 ], i6 j2 b0 g$ I. @
  20. {
    $ x3 D3 e) p9 J' C
  21.         rt_size_t i = 0, size = 0;& Y$ B: o5 J: s  y
  22.         char a = '\r';
    ' R, Y; H  N# D( x
  23.         __HAL_UNLOCK(&huart1);2 k2 W1 c) L- B9 ~& N
  24.         size = rt_strlen(str);9 w# F+ t: A9 W5 v$ k/ Q- |3 a
  25.         for (i = 0; i < size; i++)
    ) s! }; C( w2 K! F3 p, M, j
  26.         {, q9 ^6 Y1 i; |, W
  27.                 if (*(str + i) == '\n')' e  i5 b3 [* j- z8 W
  28.                 {" z6 V! p. x4 G- G* [
  29.                         ITM_SendChar(a);4 o5 ~* k) |. |8 I! Y! e, V. G
  30.                         HAL_UART_Transmit(&huart1, (uint8_t*) &a, 1, 1);" D2 `: _) G9 i; `. {* _
  31.                 }  V+ H) l# A' i0 R# J3 F
  32.                 HAL_UART_Transmit(&huart1, (uint8_t*) (str + i), 1, 1);
    ( t. m0 d  K5 d) a/ y' I
  33.         }
    1 _- @) u4 o: g& F* b/ f2 A! x
  34. }
    9 ^* T; }2 h# w2 @) `* C
  35. 5 T, Y2 W9 K8 d) h
  36. /* USER CODE END 4 */
复制代码
1 T' L% a: l6 z6 k. {
& _' P) ]2 ]* A; m5 M# J/ G4 X. l
6 H. b- W/ a7 J: S) |4 e
3.3 、编写线程文件
6 x) G, I5 x! |$ D: A# r4 f3 W% r% l* g9 d

创建一个app_rt_thread.c文件用于保存线程代码

7 i* \* J* I; C

13_meitu_13.jpg

, w3 T5 x0 N, @7 N
4 H3 P8 y. B1 D' T- X  k
app_rt_thread.c文件内容:# u2 c  H4 N, V1 `2 _" N- \! V

/ J) p6 g5 u3 j$ C

  1. #include "rtthread.h"' m( S4 C  J1 C8 a: u. ?8 K
  2. #include "main.h"
    + H4 y! y+ W& D7 r9 X  [
  3. #include "stdio.h"
    0 D/ K9 [" }6 t6 U# T3 t+ f. B
  4. #include <finsh.h>        
    / F1 Z+ y4 t/ J6 k5 k1 v! `2 Y

  5. ; s0 s0 X: g; W' B5 E8 P

  6. ( r" X) S( u9 v# m
  7. /* 定义线程控制块 */6 z. a  U- V# O$ U
  8. //添加LED闪烁线程
    & ~2 V2 Z( T# ~  z- j8 h6 ?
  9. static struct rt_thread led_thread;1 T8 }6 i2 r$ f2 h
  10. static char led_thread_stack[256];& Y1 F; {: o% S6 O
  11. static void led_thread_entry(void *parameter);
    2 e  T# o- E; a
  12. int MX_RT_Thread_Init(void);
    * n! l  \5 L6 ?; P

  13. ( y; `0 ]0 r1 v/ C
  14. int MX_RT_Thread_Init(void)
    6 }/ y: a1 P8 C! N5 x( @& X
  15. {8 L8 {' H- c) @) |$ o" q$ _
  16.         //初始化线程
    ; y3 I3 n; e5 X9 G4 K' S/ n; N. L
  17.         rt_err_t rst;
    , [, N( D# s; d  o* Z) K
  18.         rst = rt_thread_init(&led_thread,; |. A0 p: I8 x3 o7 q1 U# }9 t
  19.                                                 (const char *)"ledshine",  /* 线程名字 */
    % H& [# m. a# G
  20.                                                 led_thread_entry,  /* 线程入口函数 */
    ) r* P" ?' b, T7 K0 k5 p9 I
  21.                                                 RT_NULL,           /* 线程入口函数参数 */0 o& k0 b) G3 S2 T: `
  22.                                                 &led_thread_stack[0],7 M( k+ v" h& n4 ^5 w
  23.                                                 sizeof(led_thread_stack),   /* 线程栈大小 */7 c2 ^) [% r2 {" }; y" R
  24.                                                 RT_THREAD_PRIORITY_MAX-2,  /* 线程的优先级 */
    9 b! V( y  G) M' X$ e
  25.                                                 20); /* 线程时间片 */1 f* A8 u0 k5 W' Z; [# ?$ P
  26.         if(rst == RT_EOK)
    5 {+ O6 Y* l% _. k9 v; R
  27.         {///* 启动线程,开启调度 */
    # D# |3 F' t* P4 u/ V1 g
  28.                 rt_thread_startup(&led_thread);$ I8 M& `6 D6 m2 e) b
  29.         }
    9 o5 z4 `$ g5 r
  30. ; Y; Z7 ?2 R8 G  u
  31. }0 d- h, R7 v& p6 d0 ?; Q

  32. 6 E& i+ q( H7 E4 ?4 X2 }; q

  33.   G% Q" n6 s5 O! w
  34. /*
    , Y3 z9 @& `: h5 `
  35. *************************************************************************
    8 S4 J  w; t% O1 T6 l1 |) B; `
  36. * 线程定义
    $ z, P+ P3 E) M& k$ ]) Z5 ~
  37. *************************************************************************! `3 Q. o& b! M: J% M7 \
  38. */% B* n" v. {9 P1 N/ D! f
  39. static void led_thread_entry(void *parameter)
    7 O' u% f( o/ F
  40. {* d! Z, y  X5 @8 ^. k
  41.         while(1)* R/ p% c" Q( C. p) R+ S$ }+ @
  42.         {
    1 S1 \4 m! F0 M0 f3 R% d, n
  43.                 rt_kprintf("led1_thread running,LED1_ON\r\n");
    4 C/ E+ Y/ ^) q, u, O' |: ?) i
  44.                 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);- p0 t7 ~1 S, U  E2 r
  45.                 rt_thread_mdelay(500);+ m! F2 V8 `' K: A8 B
  46.                 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);2 q0 N3 [5 N& a- ]( ~! o
  47.                 rt_thread_mdelay(500);
    # `: L) Y% W4 C7 I; o
  48.         }
    6 h5 w+ G4 `  @# s4 G- [2 S$ Y: B
  49. }  h/ x) ^* I) n( w7 F

  50. * B; E' f6 ?+ T# d/ f3 y4 y
  51. MSH_CMD_EXPORT(led_thread_entry,thread running);
复制代码

: ], D9 c# ?+ ?4 `8 R3.4 、main.c 修改
$ g  L5 H# a" U* \& ]; @( s, F

14_meitu_14.jpg


* m0 v% F# x8 N6 o& p2 x. B, j: O
' M* c( M/ X/ G/ ^& B
  1. /* USER CODE BEGIN Includes */( i/ b' Z5 A) i0 S
  2. #include "rtthread.h"
    ( v; e+ G! `+ t' q
  3. " o) }5 r6 n+ u. h$ j# l6 [
  4. extern int MX_RT_Thread_Init(void);
复制代码
& n. V- `7 x9 l+ d& F
8 E" d2 l9 H4 |1 d6 Y

15_meitu_15.jpg


) A& z' \& n" Z
  1. int main(void)9 y, i, N5 o7 }/ U
  2. {6 E+ j: a6 `! o
  3.   /* USER CODE BEGIN 1 */# q* S( i1 P4 `1 K

  4. * z; Q! q- m4 q1 C
  5.   /* USER CODE END 1 */
    - O7 R' S* e- {0 v( e
  6. ' h" @* v% M1 y$ i* c
  7.   /* MCU Configuration--------------------------------------------------------*/
    8 r3 z1 }. }7 g

  8. + @! l. O% V3 N0 K
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    ( k2 |' z7 t: {8 ]. l5 E4 x
  10.   HAL_Init();
    5 C/ A0 ]9 M2 p
  11. - T; I+ `4 N3 H- b5 l
  12.   /* USER CODE BEGIN Init */
    % s& ?' p- n8 x( G; a
  13. & `  e, J7 }' Y9 z8 H$ H
  14.   /* USER CODE END Init */
      Q" G5 i+ |; B2 R$ h

  15. ; a! M* v! C3 J' |) t
  16.   /* Configure the system clock */
    : ^+ b" q# E( I; Q
  17.   SystemClock_Config();* h. r0 f6 F7 y- r. `) B2 R0 F
  18. + x0 u$ R7 M7 F3 S( J6 I
  19.   /* USER CODE BEGIN SysInit */
    $ p. X5 }% Y, J

  20. ' k) J* @2 t. R5 U) W9 R
  21.   /* USER CODE END SysInit */
    # n6 R1 a" f5 f" P3 m  m

  22. 7 L6 J  m+ U, Z; P7 ^% D/ n
  23.   /* Initialize all configured peripherals */( E0 X5 O; d% n2 A: t
  24.   MX_GPIO_Init();. }5 S/ A8 ^- Y: |3 `7 [
  25.   MX_USART1_UART_Init();. l; ~9 k' o& a2 A, ?4 D& x
  26.   /* USER CODE BEGIN 2 */
    2 y, P7 c- S2 ~- f- d9 u- P$ |: Q
  27.   MX_RT_Thread_Init();
    ( `1 o! p0 `# e1 j7 e" e
  28.   /* USER CODE END 2 */
    ) N# {! Y( o6 c: {
  29. ' ^: l+ {% y& H& ?  ^7 o6 E! b
  30.   /* Infinite loop *// c. G. K$ Z& S  J7 s% K
  31.   /* USER CODE BEGIN WHILE */0 t* x* o8 {  Q0 h2 Y& b# }- S3 ]
  32.   while (1)
    : H2 B$ M% T7 X% `* N; `
  33.   {
    0 i; K+ i! H) g, k; K/ C5 r) I' M
  34.           HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_2);
    ' O; [  q% r2 w4 I* C% J# `
  35.           rt_kprintf("led1_thread TEST\r\n");
    # C/ ^  p+ ^& S7 N% X, K8 r
  36.           rt_thread_mdelay(100);, S6 D3 a7 s& n! }6 i$ b1 {
  37.     /* USER CODE END WHILE */
    6 K+ g' g) i0 G" B$ D5 b
  38. ; |" f9 H' l7 O" \+ H& W0 H! N  h+ z1 |
  39.     /* USER CODE BEGIN 3 */
    - M2 g. ]) }2 h. s6 b& h9 a
  40.   }5 J9 u# g& H- S% Z# u7 M8 p
  41.   /* USER CODE END 3 */
    " O% a, z* b2 X+ K
  42. }
复制代码
% |4 P$ ]* d& r& r6 P& u

串口输出:

, q# S0 Q: ~( q4 G3 m6 x

16_meitu_16.jpg
: W3 W: R& m2 [: o

. L6 X8 Q7 z. F4 p4 L7 Q7 p5 O" L# a: z
! ]3 W7 _0 k6 B! p' ?, w  P
# r8 |4 m/ s( C/ x* b
收藏 评论2 发布时间:2020-9-24 12:54

举报

2个回答
goyhuan 回答时间:2020-9-24 15:22:40
rtthread
goyhuan 回答时间:2020-9-24 16:12:30
cubev5.61不支持吗?

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版