请选择 进入手机版 | 继续访问电脑版

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

STM32 CubeIDE 使用RT-Thread Nano

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

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


5 H7 L6 {8 ?+ f" d6 x, Q6 u; m4 I

1_meitu_1.jpg

- S# }6 ^" e  V: I7 u
6 d# J/ q; I. w2 i
- k5 d1 F. Q+ W4 J- l- J9 T
$ a6 U- N* H" C  M

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

3 P# F" [6 H0 A; U9 z; _# j

2_meitu_2.jpg


6 E7 x# X$ T9 k2 j* U$ b$ @/ x  A

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


$ E2 F7 v$ J9 A+ J( \

3_meitu_3.jpg

9 p6 B6 M# J2 y% \/ t7 T7 f; A6 U7 [: H' {2 {; b& ~
4_meitu_4.jpg
5 P( W% J# G- m4 ]! O
9 z1 |# z( _% H% T: l

$ N: Z2 V7 l# G  {2、创建工程添加 RT-Thread Nano+ n3 c, n" w" t3 S6 k1 {

, U2 ?( D4 Z* P1 W' A  ?8 W2.1 、创建一个基本工程
: L4 I% v! S6 E9 }+ w4 u5 ]

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

2 {8 \# a/ A0 L- M3 M( u

, f3 a% Y$ N# C! f& p6 ?; d9 j
5_meitu_5.jpg

; f9 y% i9 n  y5 [3 Y" x  N- C& ]( Z
6_meitu_6.jpg
; t. U9 q" k  q# o4 v+ o$ B! E
! q3 k, v6 W. P3 q1 K" w
7_meitu_7.jpg
& G7 d3 x# J! K% K+ v5 w1 g% A
* u8 f/ _# _8 n9 i

: L# N! X, u: F  u  d% A2.2、配置 Nano
& E+ {$ g" u7 ]4 s

勾选 RT-Thread


+ B$ b" @; h$ I. K

8_meitu_8.jpg

, w/ y" @7 a1 Z) M
, [; z9 e: Z% x" R
适配 RT-Thread Nano( ~3 D% E0 z: c* @) B2 A0 X8 M. B. F


) ^* e% k: V/ ~4 C1 }4 V中断与异常处理


" B" t$ C+ z, V+ T7 xRT-Thread 操作系统重定义 HardFault_Handler、PendSV_Handler、SysTick_Handler 中断函数,为了避免重复定义的问题,在生成工程之前,需要在中断配置中,代码生成的选项中,取消选择三个中断函数(对应注释选项是 Hard fault interrupt, Pendable request, Time base :System tick timer),最后点击生成代码,具体操作如下图中

/ D2 z0 n2 e0 b" x: N6 m1 b- L, l

9_meitu_9.jpg

6 _% h" i7 c! `! N8 w& q7 c+ P% G/ p7 x
' l7 f) H- o% W% h* T
3、工程代码修改; D  D% b$ |# f! I, h4 J

, j( O# y0 `$ T1 k+ i  G3.1 需要修改的部分
. e( u; {; F( B4 V9 A+ H% A

1 、修改启动文件 startup_stm32f103rctx.s4 h0 q$ a# {- w/ F
bl main 修改为 bl entry


9 m' k; y8 b/ R

10_meitu_10.jpg
" Y# i! Z; O) d, g, Z

3 ~! t, Z6 b/ {+ u* }7 W0 q

1 r2 m) Y/ u5 z; [+ g' G6 \( G: e3.2 、配置rt_kprintf端口输出

端口映射,函数可以放在main.c文件里面。
& D+ }1 {8 p+ d. @9 x% [

11_meitu_11.jpg

0 E1 k" M$ G* g/ q- p8 @  _; A
! N) U7 c4 m2 R: V
12_meitu_12.jpg

, s  ]: B+ K5 N4 C6 x
" v0 b+ g! a& S+ [8 P6 V" t2 g4 u7 R5 X7 L7 f0 A/ t

, Q% O6 C/ y2 J; m5 H" w3 B& Z& P
$ Q1 v- G) b/ r- y8 X1 X( u' _. o1 n  a( ~9 ?" @+ `$ k2 [4 q
  1. /* USER CODE BEGIN 4 */+ f: ?2 z5 o6 L2 O# Q1 E9 a/ R
  2. char rt_hw_console_getchar(void)
    0 b* t9 a5 V$ n" \2 U4 G: z
  3. {3 W0 n. t/ j: M- `; H: x
  4.         int ch = -1;. x+ r4 Z# O1 A9 S9 F( B% p
  5.         if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
    ( k( ?& L- \- Y6 g& v
  6.         {
      l; h8 b7 G  q  V  {1 z
  7.                 ch = huart1.Instance->DR & 0xff;
    / c1 G/ ^8 J0 A
  8.         }
      j! p$ S) d, h1 `  E5 G3 e, O+ _
  9.         else
    1 v8 T) Q' x) f8 n5 v
  10.         {
    % c. z+ Q( G  W* I, J; H9 j
  11.                 if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE) != RESET)
    1 v# T8 K* X: q; P, g3 w
  12.                 {! T. b- L5 A5 p
  13.                         __HAL_UART_CLEAR_OREFLAG(&huart1);2 ]4 m/ Q/ W, Y9 T9 i8 N  N
  14.                 }* P2 V4 [& I! R6 c: Y
  15.                 rt_thread_mdelay(10);0 n( w% d* V2 d( L& Q! g8 v9 G
  16.         }4 U6 t: N- E4 N, J, @: h
  17.         return ch;- u' ^+ [* U2 W0 @
  18. }$ l0 b5 N# c$ S, S# g
  19. void rt_hw_console_output(const char *str). v" J+ s2 Q" i% g% U4 b2 M
  20. {
    2 g( v8 O* p& [8 `! t
  21.         rt_size_t i = 0, size = 0;/ B) o4 \3 R' p. n( m+ h& K
  22.         char a = '\r';$ L6 f/ n5 n- \
  23.         __HAL_UNLOCK(&huart1);
    8 h  F# ~! _+ u( w  \( _6 r
  24.         size = rt_strlen(str);" y8 S8 H- @( x' F3 f, Z6 \
  25.         for (i = 0; i < size; i++); x3 X/ D! a- ~& f- v
  26.         {- d6 t3 O7 H! A; h1 G6 o
  27.                 if (*(str + i) == '\n')/ |. p5 e' d+ u& [5 @7 X( ~
  28.                 {* u; J2 F: v1 I( s* W, b
  29.                         ITM_SendChar(a);
    $ M( s; e3 l2 z3 d& |* r# p
  30.                         HAL_UART_Transmit(&huart1, (uint8_t*) &a, 1, 1);  ^8 I1 Y8 F( H' \
  31.                 }
      D# z( W5 Q6 f% `4 D
  32.                 HAL_UART_Transmit(&huart1, (uint8_t*) (str + i), 1, 1);
      P; b2 _( S, O+ W0 @" P% B+ _8 |
  33.         }  [! e, O7 a9 |* M7 W0 ]8 I3 `
  34. }( Y1 i, R9 V5 F
  35. $ k+ \1 H; @% ~2 I- f6 m
  36. /* USER CODE END 4 */
复制代码
- ?4 _+ l& a9 H: ~0 {

2 M& {1 P1 J% {' o: N, N# U
4 h5 R" P4 I4 c, Y. T3.3 、编写线程文件
0 ?4 f, @' L- G5 x$ `9 x  w( T' A3 }) s) d! D- D

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


! }2 G) T  d3 [

13_meitu_13.jpg

6 q) I1 M( J8 S: m
# X* f2 e  W8 {! T+ d$ c4 u
app_rt_thread.c文件内容:' I1 P+ D6 f6 i7 ?


* x1 j7 P, N; g* _( p6 |

  1. #include "rtthread.h"
    $ M2 J3 [" O- e& u% d& X
  2. #include "main.h"
    ) e7 S2 D, v9 i+ ?
  3. #include "stdio.h"
    : o3 l* H5 g% v% F( _- \% |
  4. #include <finsh.h>        - Z* I5 Q2 q9 m& I5 `" P

  5. 4 D) h- g8 a4 ]( \2 B
  6. % y& t  p/ K3 S9 f  ~$ D. k2 m
  7. /* 定义线程控制块 */
    ) b, |, O5 q. U- y
  8. //添加LED闪烁线程, \/ i, Q. w1 s  f7 M
  9. static struct rt_thread led_thread;
    % P7 O9 H- }6 h3 n
  10. static char led_thread_stack[256];% T7 n" l( z$ J
  11. static void led_thread_entry(void *parameter);
    ; S* q) {1 x' J% k/ [, W4 v
  12. int MX_RT_Thread_Init(void);: l+ V- |+ G/ l2 t

  13. ) }2 v' M# @# Y7 [
  14. int MX_RT_Thread_Init(void)) i4 j; b$ i  I2 C  Z
  15. {
    8 M. l6 Q2 a" W. L
  16.         //初始化线程  f, R; k1 a' r+ p3 s0 A) `
  17.         rt_err_t rst;
    & I% e$ V. \) X) X, u. y0 l" f  e
  18.         rst = rt_thread_init(&led_thread,( Q  Y: H. f( X1 K7 v: W
  19.                                                 (const char *)"ledshine",  /* 线程名字 */. `$ a0 I' I. y
  20.                                                 led_thread_entry,  /* 线程入口函数 */
    - p  \  D% n) L' {; N: C# i9 t
  21.                                                 RT_NULL,           /* 线程入口函数参数 */
    ( p9 R  o/ S0 e6 D$ z. Z- R
  22.                                                 &led_thread_stack[0],
    6 I1 Y% e3 R7 }  x6 u% T' e
  23.                                                 sizeof(led_thread_stack),   /* 线程栈大小 */
    - |/ Y+ U0 p# c4 `2 u
  24.                                                 RT_THREAD_PRIORITY_MAX-2,  /* 线程的优先级 */
    5 @6 B, w& B! f! q8 I
  25.                                                 20); /* 线程时间片 */
    + K& j+ ]  }  Y; h6 k
  26.         if(rst == RT_EOK)
    4 Z) G: c) P: Y' \$ d" [
  27.         {///* 启动线程,开启调度 */! p, ^# U% S0 k
  28.                 rt_thread_startup(&led_thread);
    & [& Q( O- M7 @% L
  29.         }! K* L% c0 s: ~, B6 A8 r
  30. # j: h# `7 _& R  c) p$ v
  31. }4 z$ q$ P& a# S

  32. * d7 k! s2 B5 T6 P: u
  33. 8 L+ k1 A3 H$ _7 r. z0 o
  34. /*
    , k: Y) V4 @7 `0 r
  35. *************************************************************************( j6 i+ Y4 a$ h% D* B2 e
  36. * 线程定义. h' M/ C/ `2 q" q) R
  37. *************************************************************************
    3 R1 j1 W5 `& i8 v- E7 v1 H
  38. */& n/ o' w5 |9 _2 e1 U9 k8 x  D
  39. static void led_thread_entry(void *parameter)0 x% G; P% H* p1 \4 F5 [' l. [
  40. {+ o) n0 E. z9 X- U) ], [& y' d
  41.         while(1)
    9 f$ |3 T1 R5 F1 w/ K
  42.         {% k5 ^3 ?* C, D: l
  43.                 rt_kprintf("led1_thread running,LED1_ON\r\n");" [0 ?0 z& ]* q" b9 @" M/ W
  44.                 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
    0 ^3 h& ?9 R+ W! d# N8 h$ j! ]& K
  45.                 rt_thread_mdelay(500);
    . G" x. E' [6 V% }, L% j
  46.                 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);" E% Z  H$ L8 o6 C
  47.                 rt_thread_mdelay(500);$ U4 g" u6 ?" W* h
  48.         }6 d9 m, l; f% `7 j( l
  49. }" ~! c& Q: V0 p9 x! `8 n7 W

  50. 6 F! b1 K0 s9 e
  51. MSH_CMD_EXPORT(led_thread_entry,thread running);
复制代码
; s, B6 E/ n) k+ s, u
3.4 、main.c 修改) _3 S  u6 m" ]7 b/ M2 f

14_meitu_14.jpg


& k( v8 f5 a* g  `* W0 N; b! a: t" [  \6 z8 e
  1. /* USER CODE BEGIN Includes */
    + A* i% ~) {4 n5 M. t  h! T' b
  2. #include "rtthread.h"/ \* s! s% r& e# b& ^: _9 f

  3. 7 I% {6 G- o4 u9 n
  4. extern int MX_RT_Thread_Init(void);
复制代码
% E8 s& [% d4 j
, R! k& Q# o5 K' L2 d

15_meitu_15.jpg

; Q0 w6 ?( f) E* I2 }: D
  1. int main(void)/ }0 p: C3 M6 |5 d2 n. s, M' T) i4 J
  2. {  o; n$ |, h; q( E1 V
  3.   /* USER CODE BEGIN 1 */4 l2 Q+ e4 L& I- C, ]! V2 c0 l' T) F

  4. + W% |2 ^# ~4 L) v4 s1 E; k
  5.   /* USER CODE END 1 */) b  S- G, w/ H- m* ~

  6. 4 A4 y- t0 F& e& \' d
  7.   /* MCU Configuration--------------------------------------------------------*/9 a! K5 j% ]1 E5 `( [  `* @

  8.   S3 c" M; h+ i# N* v* J4 p
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */1 Q4 j! A* s. O; ^; V1 R3 }
  10.   HAL_Init();, X3 Z+ s7 o( n( C3 U$ Z
  11. + q  I! t& R9 v  L
  12.   /* USER CODE BEGIN Init */
    2 ]' R& j, P; P2 U: u2 O) i: ]' U/ Y

  13. % w$ U. E/ e$ `0 Q0 v
  14.   /* USER CODE END Init */1 ]0 t, p# G" \% \, M1 {2 D- e

  15. + _4 p- v6 X- ~9 w, \! V
  16.   /* Configure the system clock */
    % q( d3 W7 S) j$ Z6 v2 ^$ ]# H  P2 n
  17.   SystemClock_Config();2 v0 s0 P) O3 ^  i5 V7 A* h' l

  18. 6 `9 n) \  f' w8 c$ z/ q
  19.   /* USER CODE BEGIN SysInit */  z! z, z+ v4 R/ G) }% V
  20. " O% D& B" B3 ?  E6 e) e! N
  21.   /* USER CODE END SysInit */
    % M- F8 f5 ~( b, ~) e
  22. 4 z3 E! h3 c9 T+ Q& g
  23.   /* Initialize all configured peripherals */& C* M- S7 m* I4 c7 N3 q! a
  24.   MX_GPIO_Init();0 Y$ M$ R) e: M$ g- z- ]9 j3 h3 G5 J
  25.   MX_USART1_UART_Init();
    - I1 z; T' f2 u+ g7 t5 v0 u
  26.   /* USER CODE BEGIN 2 */
    % [5 x9 D4 K+ t
  27.   MX_RT_Thread_Init();
    ) h1 c0 k8 v! x3 Q# w( [. V4 k
  28.   /* USER CODE END 2 */& w4 U' [) O$ \) S

  29. $ K+ r2 w# ^/ u/ v4 D
  30.   /* Infinite loop */
    ) Y, ]2 r: }1 Y) m
  31.   /* USER CODE BEGIN WHILE */! a/ R2 I/ E1 u$ e
  32.   while (1)% D$ e; E# o5 C1 G% o( C
  33.   {1 r1 M. ^2 Q8 V" E! G
  34.           HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_2);/ {" [' }/ r1 D+ M4 ^
  35.           rt_kprintf("led1_thread TEST\r\n");
    9 X% l5 o7 z& @! |
  36.           rt_thread_mdelay(100);
    7 K$ A  {4 `& g9 ~! V
  37.     /* USER CODE END WHILE */# P8 u- Z: g8 e7 Q. t
  38. 6 D7 D, ^$ |8 }* K% A6 Z5 q
  39.     /* USER CODE BEGIN 3 */
    . B, ]+ a6 |) c3 E4 v
  40.   }
    ! J7 N  S: f. K7 l' E; n
  41.   /* USER CODE END 3 */$ _6 n6 A2 t3 G
  42. }
复制代码
: J9 C4 i1 l- E  }6 @: }

串口输出:

7 m1 E: G9 ^2 O" d2 z3 Q! i1 ]

16_meitu_16.jpg
" l* p8 j* t( s: U! G  i
: H9 B* p: L6 a3 x. t

9 [; _) T* z  S' M) s% x
4 F* X( b! v/ k4 }) f- Z
; Y% G! X  Z8 P( ], g
收藏 评论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 手机版