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

STM32 CubeIDE 使用RT-Thread Nano

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

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


; B: v' {5 s  l1 {! {, {

1_meitu_1.jpg
1 o- j$ A* _' g
7 z  b4 J# }) [5 G: o7 a

$ q) b# W+ x5 V8 }: k9 ?* b; A& J$ F5 o

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


+ m  H' h/ L5 S5 U

2_meitu_2.jpg


, |: N$ }7 u4 J$ Z5 @' j

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

# H& c( b+ V- g% p

3_meitu_3.jpg
! ~' c/ q* L$ R- W" Y- i  c4 z' S

. q0 u/ I+ s* d- w/ y; Y' K2 p
4_meitu_4.jpg

2 G1 z4 B) _3 k! R6 K, d* X. q' u1 P0 |! |+ H& n5 }7 j$ n

- [3 r9 z  p  A8 `# v% W, g# R& Q2 J. ^* {2、创建工程添加 RT-Thread Nano
( ]. P/ d# Q) D: i: w8 R2 ~
: L) ^; {' U0 s) X2.1 、创建一个基本工程( o  a4 R; _9 f2 A! s7 |

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


1 Z, c5 C) i' a. b" r) J

5 S% w! v" d' [( T5 V
5_meitu_5.jpg
: F. d8 ^" H; Q
5 p- E  h8 y2 ~' ]3 @7 V
6_meitu_6.jpg

7 V* C$ E- m% X* t/ z- m, s( V. C" i% s) O, J" h$ C
7_meitu_7.jpg

0 \( s* B6 t% Q% Q
$ [; `8 E2 R& P+ [  d7 m3 ]- U# x5 a. M- t, F+ M, l
2.2、配置 Nano
- e* _, d7 k0 H4 g3 W3 C+ v. H

勾选 RT-Thread


/ I% ]* N. ~' w7 z  a6 O9 `. v* V

8_meitu_8.jpg
: q9 [" }( k2 s0 B

$ }# U3 f# N7 H3 i+ L, {
适配 RT-Thread Nano
, p/ P6 q+ R, ^  O( F

0 c: o. v% x" N- a3 |1 ?; z
中断与异常处理


0 e- n+ p" e9 `' {5 j6 _RT-Thread 操作系统重定义 HardFault_Handler、PendSV_Handler、SysTick_Handler 中断函数,为了避免重复定义的问题,在生成工程之前,需要在中断配置中,代码生成的选项中,取消选择三个中断函数(对应注释选项是 Hard fault interrupt, Pendable request, Time base :System tick timer),最后点击生成代码,具体操作如下图中


( }# L1 b+ b& X/ R  v, g% L

9_meitu_9.jpg
4 Y- Q1 T4 g; Y2 {  ~

& P4 ?5 W6 M, i) r) y1 a
- S; D2 Y: c  }( W5 F
3、工程代码修改
$ D0 S5 t& A3 L$ o4 b* j. r" v: o: e2 U% c- Y( G  q
3.1 需要修改的部分
8 ^9 P/ U6 r' z+ s+ K& w1 c, h

1 、修改启动文件 startup_stm32f103rctx.s; h5 q, \1 O# b3 [- H
bl main 修改为 bl entry

6 v5 V/ ]7 }: ?& I

10_meitu_10.jpg
3 O$ i. D: q+ x5 s" [

) S# [! r8 r! H1 D/ t5 R7 B/ W
4 Q( G% b) @) T5 q6 ~' e+ s
3.2 、配置rt_kprintf端口输出

端口映射,函数可以放在main.c文件里面。' }- N% v6 K- b1 P$ m% r

11_meitu_11.jpg

+ R0 K. E, q, e: y+ {' U/ u! x7 m2 Q- b6 }% {
12_meitu_12.jpg
& l& w6 @( G' Z! Y& q& H
- S7 d+ y* u% {' E; v: w. b0 Y( g

/ I. n- R4 q: o" ^0 n, [0 k. Q+ y+ a' {$ n% o' A

# ~' d* a* f1 Q! [3 t
5 i( ?' h; ?+ k% J. L
  1. /* USER CODE BEGIN 4 */
    , F3 g2 `+ V& j4 C& ?( O" t. s
  2. char rt_hw_console_getchar(void)5 t1 L5 r, r( ?/ o' V
  3. {/ ^  D  W1 A. \$ |+ K" x& U* q; T: Y
  4.         int ch = -1;
    " k5 f2 q4 D! W) k' ?
  5.         if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET). [4 P* Y1 P' z& F2 K2 r% G- F# R
  6.         {0 V+ i8 q" k% l  E( t2 G& X
  7.                 ch = huart1.Instance->DR & 0xff;# ]" D- |3 K5 u# A$ w
  8.         }$ W+ }* x: o) d, m/ c
  9.         else) q4 r/ f0 b/ f' Q6 |& T, @
  10.         {9 ^+ {, i; C; [5 y! [( m1 k
  11.                 if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE) != RESET)- q9 O+ x) Q9 g
  12.                 {
    ( T  o$ i( @# U0 K
  13.                         __HAL_UART_CLEAR_OREFLAG(&huart1);* v4 }8 s9 q# V
  14.                 }1 P/ v! }5 I& q
  15.                 rt_thread_mdelay(10);
    6 J+ v! T' k! _) k
  16.         }5 L5 \  h+ k$ M' h
  17.         return ch;& e* a/ \0 T+ ?9 |
  18. }/ b4 J( K1 b/ \  d5 _9 |
  19. void rt_hw_console_output(const char *str)% @9 V% b! `. o3 P7 B: D
  20. {
    8 n. m: l* F7 U8 X! P/ z
  21.         rt_size_t i = 0, size = 0;
    * r* z6 F( i: g4 J, K- u9 K& J4 I
  22.         char a = '\r';
    . Z2 e2 a7 O. L# w1 E0 i' Q
  23.         __HAL_UNLOCK(&huart1);
    ; u4 j6 Z0 o% ^8 k
  24.         size = rt_strlen(str);
    / ^; \0 p& M$ L* \% k) R5 Q; W! s
  25.         for (i = 0; i < size; i++)2 m) ]+ W+ q4 s3 o" J$ X
  26.         {% j1 O5 U. s- [
  27.                 if (*(str + i) == '\n')
    % \9 C% E* X$ y7 R6 `7 R9 B
  28.                 {
    5 J' _. ^! i/ \2 J" Y3 G, m- P
  29.                         ITM_SendChar(a);
    + _  O; O; }- K; d  G8 A
  30.                         HAL_UART_Transmit(&huart1, (uint8_t*) &a, 1, 1);& K' \/ f' a3 V/ W# z0 E
  31.                 }* I* l4 k- ~/ r
  32.                 HAL_UART_Transmit(&huart1, (uint8_t*) (str + i), 1, 1);
    & [3 Q: @- |# U8 G  f7 ~
  33.         }- E$ ^) C! e) c. h; d
  34. }
    : F. n* d& b4 l2 A& t, s' s3 E

  35. " Q8 r  f& P" a  n& u5 s
  36. /* USER CODE END 4 */
复制代码
6 l2 q- {9 \( \, A
- K$ R/ d! X, @6 r# B- a4 h% F
) W! N! r3 t$ S
3.3 、编写线程文件. U7 o7 L, g! f5 c8 C/ L/ D2 n+ o2 _5 Z, ^
1 G+ g$ [! ~; v3 J7 `

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


! a3 R# f8 k' T1 V2 G! d

13_meitu_13.jpg

  {( \. L! o' o2 S
0 a" q% U# F0 E# Q. {5 o/ i2 B7 t* `" G
app_rt_thread.c文件内容:6 m" u# |' W7 L& t) z, m- i8 B% U


' _$ V2 ?- A8 _  `' _; J( j

  1. #include "rtthread.h"$ h' `! E1 g* T7 i3 y
  2. #include "main.h"& G; t' M; f/ a5 V6 M
  3. #include "stdio.h"
    8 m& F) o+ Z% v, K6 S4 O9 N  P
  4. #include <finsh.h>        
    3 \5 J. b% c" P: U
  5. 3 D- N3 o9 m! A$ r' {

  6. ' g! g9 ]) u6 l
  7. /* 定义线程控制块 */6 B) K  c. D" Z" E4 ~- a1 C& ?
  8. //添加LED闪烁线程
    ' [6 K. m1 C% I2 v3 _
  9. static struct rt_thread led_thread;' T1 Y2 V+ a* ?
  10. static char led_thread_stack[256];
    - h$ E" t4 R1 |8 F" x2 O
  11. static void led_thread_entry(void *parameter);
    & s8 g8 u/ E- L7 J7 v4 r
  12. int MX_RT_Thread_Init(void);
    + }5 {: H) k, `) ]3 ~

  13. " A8 H5 e; ]1 f: Q
  14. int MX_RT_Thread_Init(void): W) d& u% _2 ~9 M* g. y
  15. {1 o! w( ?6 r( T& z
  16.         //初始化线程$ m1 M$ \6 b1 R/ }8 U
  17.         rt_err_t rst;6 }* T" W" E/ W- K) H% p
  18.         rst = rt_thread_init(&led_thread,
    5 J5 d, f2 h  d7 J% i0 m& R' ^
  19.                                                 (const char *)"ledshine",  /* 线程名字 */
    5 R# E6 @) s, B
  20.                                                 led_thread_entry,  /* 线程入口函数 */
    6 _! _/ ]3 D" g
  21.                                                 RT_NULL,           /* 线程入口函数参数 */0 U: {( F( _/ ^0 a5 C3 k
  22.                                                 &led_thread_stack[0],, T$ ^6 N" C5 i0 r
  23.                                                 sizeof(led_thread_stack),   /* 线程栈大小 */3 w/ G7 y5 D! e  i- f1 ~
  24.                                                 RT_THREAD_PRIORITY_MAX-2,  /* 线程的优先级 */
    & X0 E! y7 V0 ~+ y+ @, F+ \* w
  25.                                                 20); /* 线程时间片 */
    2 v2 h/ g8 Z3 U) e: U0 c' Q$ L
  26.         if(rst == RT_EOK)5 a6 r7 f8 r# S4 q# n2 N
  27.         {///* 启动线程,开启调度 */6 X# j2 B4 |% k" I( S: @
  28.                 rt_thread_startup(&led_thread);
    4 ~4 u. O: T2 V
  29.         }
    / A( g: ^% {/ d9 Y$ \( v* c! \) y) d) F

  30. ; y5 Z0 |, q4 w- n% U, c
  31. }
    . D( s/ W  J" ?( Q# n0 ~1 G; F* P% f
  32. 4 ?$ ?: Z! F0 l1 D# E: I$ k

  33. # h- b' C) G) q" I
  34. /*
    7 L5 \: z$ Z" C5 ?% Q1 }$ D
  35. *************************************************************************
    2 m- s6 U0 k- w8 C  C% Z
  36. * 线程定义
      t) p0 t- }/ n1 Z7 y7 ]: c
  37. *************************************************************************
    9 V( z3 l: o  [' {2 l# X
  38. */5 D+ T$ K/ ~8 o
  39. static void led_thread_entry(void *parameter)
    ) j2 l' J! A) P- j% V  ]
  40. {' l( X9 g' h6 h$ F) V9 i# A) m
  41.         while(1)$ a; j$ `; q+ q) y( v
  42.         {0 `2 X' ]7 a, D* L( ~
  43.                 rt_kprintf("led1_thread running,LED1_ON\r\n");
    ; P+ @5 x' |' |$ }/ G) ^
  44.                 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
    : h2 {3 c8 ~% ?( L" ^
  45.                 rt_thread_mdelay(500);) i8 {2 ?& y& j
  46.                 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);- G: Q. P' y* w1 Z/ S; q* q& u0 L
  47.                 rt_thread_mdelay(500);' Y4 a5 G& a' d3 ~* H# E0 |
  48.         }
    * ~, M- b7 D. g1 _2 N
  49. }
    ' D! U" I; u* a# M  I
  50. + Y" {0 c  N7 {, h  q
  51. MSH_CMD_EXPORT(led_thread_entry,thread running);
复制代码
( W3 V, O! ]9 @1 S4 [
3.4 、main.c 修改  J) p( O. s* t6 y

14_meitu_14.jpg

4 k9 C0 b& j4 O4 p/ ]4 z! L
2 Y  a2 e5 E+ m: T+ x! g
  1. /* USER CODE BEGIN Includes */
    ' D! `! T+ V, O/ N* u
  2. #include "rtthread.h"
    " x7 E  I1 S) e7 y, S- P  r0 l

  3. - l# t; }+ A9 @! X+ \
  4. extern int MX_RT_Thread_Init(void);
复制代码
- d- W( v" t6 j3 _

8 D( O; P4 h% _$ P

15_meitu_15.jpg


+ h5 U1 P6 K, Z3 C( F
  1. int main(void)
    + H# J- q- Y4 k- s8 |- V- o- j" N' z
  2. {7 L* W  z; |. S$ Y8 |2 i5 i( g
  3.   /* USER CODE BEGIN 1 */- t5 k9 P' a1 |$ |7 K4 A+ h

  4. & Y4 Z5 s6 b' n+ q. U' ~/ U1 ~
  5.   /* USER CODE END 1 */, r0 y4 O5 L9 y) r

  6. 3 K9 j/ c) f8 s( e
  7.   /* MCU Configuration--------------------------------------------------------*/- g- O$ \/ i& K2 k6 n
  8. $ K3 V* s0 g( `5 Y, X
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */2 a) x  F. {+ ?8 y) \
  10.   HAL_Init();: u6 h# c3 \; s6 {. W: M! l

  11. : \  ?2 z3 F# \% U1 U& i& _6 P
  12.   /* USER CODE BEGIN Init */
    # l  @! p* ^7 Y+ N. R9 _# H7 ~

  13. 7 q% F& _9 f4 b1 t/ N) e
  14.   /* USER CODE END Init */
    : c. M5 J8 s. S) X0 }4 a4 r0 Y
  15. 2 k( u( q; f( i
  16.   /* Configure the system clock */
    - o, s4 p0 a; P" l
  17.   SystemClock_Config();$ N: e% b' L8 O8 |* r9 U- T
  18. 2 P2 o" e3 r0 f# f% X
  19.   /* USER CODE BEGIN SysInit */% r6 ]: T6 ~' w- `2 {

  20. % A) E* i; Q$ o
  21.   /* USER CODE END SysInit */
    ' i" V6 W( a6 r* |! \; u' L0 |, T6 D

  22. ) G  N7 v' Z8 ?3 u) \, a
  23.   /* Initialize all configured peripherals */
    " Q9 G5 e) X' Z: k) \( d7 @1 A! a
  24.   MX_GPIO_Init();8 Q! L5 g- q. x2 u- a  W. L
  25.   MX_USART1_UART_Init();  S+ d  v2 v( P: {7 i
  26.   /* USER CODE BEGIN 2 */
    9 g1 e. t  r2 E5 p
  27.   MX_RT_Thread_Init();4 ^, g: D; d3 A
  28.   /* USER CODE END 2 */: Q  X% H/ H' r
  29. & V4 B, E, w, x5 g9 f1 s. C: x; A
  30.   /* Infinite loop */
    2 }/ [$ e6 l1 X- {
  31.   /* USER CODE BEGIN WHILE */8 s- {4 A7 ]" q) A) [3 c/ w, M
  32.   while (1)
    # J. z: F; W+ ^' k. y8 W7 d
  33.   {0 ], p- z8 i: Q* l$ v; x6 V% S
  34.           HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_2);2 Q" A: I* K% T# t% {
  35.           rt_kprintf("led1_thread TEST\r\n");+ B8 h. G- L0 I. I
  36.           rt_thread_mdelay(100);
    0 J7 b) c6 g) M4 D! E# f7 U
  37.     /* USER CODE END WHILE */' |; s! C3 F" _' d* r9 E; `
  38.   ~& Y. F  C( P: ^  s! @; V( q5 v
  39.     /* USER CODE BEGIN 3 */
    5 V8 R5 v+ H2 Y8 t% Q
  40.   }' c& J9 ?5 \7 ]  Z! i# P; m0 b
  41.   /* USER CODE END 3 */) ~$ u  [- H0 U* U$ B
  42. }
复制代码

; k" X, m9 A8 B9 ]& _* d  q1 j

串口输出:


: U* T: y& M- `. c9 d

16_meitu_16.jpg
1 n: _0 i. ^- E* J- {' \

+ t; n: @: p! Y8 E: t
$ [7 b/ A) s6 x2 C7 h4 X) T: @
7 _$ l' ]3 h, W+ f& {* }, k' Q% f2 o
赞 收藏 评论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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版