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

【经验分享】STM32G0学习手册——移植FreeRTOS v202107.00

[复制链接]
STMCU小助手 发布时间:2021-11-8 15:32
1.准备FreeRTOS源文件
- b" e7 W. B: Z3 \$ ~2 O  \: N0 d1.1、到freertos.org下载最新版本的源文件,链接地址
8 b2 z4 n( W) m7 q1 R! ]
" U3 g7 n* ?- i4 G# K3 e1 c( B1.2、FreeRTOS 文件结构如下:
2 E# e  I0 t0 P( D
7 E4 u& U4 L  p% i需要用到的是粉色的头文件和翠绿色c文件。/ {- _9 Q7 r; e! u9 b

4 I% x% x7 S8 Y) S
20210630230907158.jpg

* L3 a( p' r2 V* Y7 P" b
0 b' m7 S' S% L5 p/ i- D2、使用STM32CubeMX生成初始化代码(BSP_Init)3 J; t; ?4 I, S# t6 t% b+ C( E" h" x7 Y
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)! f' H: p$ g2 Q; q  R( l9 L
' P( Q9 n: [5 _- _$ A4 K/ C4 t
2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档
% f4 c3 z) r6 d7 C' k+ e
& D* A! h9 n9 x3、复制FreeRTOS文件到工程目录中
3 }& Z, H8 R9 f3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹
& ~& O3 q* K/ e1 r9 g) z8 L# Z
; s- I  w1 c6 u% T+ @0 w0 W最后看起来目录结构是这样
& @2 D( \7 p9 V3 p. b3 Y8 r" p, g& k" p* j# g" k) F  r: l
20210630232103223.png

3 w; j; K$ |/ p* \- x
& ?% Y1 G# d0 E) A5 g* S) k+FreeRTOS, I% ?1 |5 i1 }, b$ ^; ?
|+include
0 ~1 I. i5 k! |2 k' ~* u6 l0 L/ w  _ |+source+ b5 d! I9 |, y

' g2 R- b8 u4 }; t4 p3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中. i0 i3 `* S) g
2 m- f, V" R# ]0 D
3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中
$ i+ ^: V- a# ?2 G# Q/ o
  \, f9 d& q; s3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程$ i; r5 f- z; v( {+ Q' K  r
" A; S" f) H! {9 q% `: g
3.5、新建一个FreeRTOS/source,把所有的c文件添加进去# R* H9 a) U# r3 E* o; n
0 X; \9 j3 U# A% ?6 C1 l" g* k% ]* U
20210630232815686.png

8 L9 I* P3 W0 m. s+ k+ k( e% j' {! F, `+ g, a' P
3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"1 c7 q) D) i$ t2 C; D3 Z$ F9 O/ C
4 }* A9 w: \7 |' Y
20210630232918944.png
- L5 F. Z+ J( C( I* a1 T

) [' n+ ]+ @% ?7 R$ x5 q4、修改代码& {* A+ b, C" J. U$ L) T6 E
4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次
/ {. Z& S. b- v+ I! t% L5 |
% u% t# K8 P. P+ c/ U4.2、在main.c添加代码,添加任务
$ J, U( V" l# W3 C$ Z. y1 ]9 R3 c  v. L
  1. /* USER CODE BEGIN Includes */9 G% ^( ~: w+ l  S, F5 }2 O' W
  2. #include "FreeRTOS.h"+ v( b- b/ G* |: X, E
  3. #include "task.h"% k1 m) y6 M5 }1 J! h
  4. #include "queue.h"- j/ m2 _2 [* f8 V8 p& I
  5. #include "semphr.h". m/ q9 h$ ^9 ]( E" J
  6. #include "event_groups.h"% u) k9 C  I# T) b( ^
  7. #include "timers.h"
    7 @  _- h4 g5 C7 J* H
  8. 9 e- g, Z2 v5 P6 C" d. Y& m! V
  9. /* USER CODE END Includes */9 Z# M+ M" Q6 t2 D4 W
  10. *
    , x% \7 F, v$ g/ \+ y; f
  11. *. l3 m9 R1 N% K9 O% O' a; a# ~, c
  12. *
    5 ~1 j" O8 N1 K9 u, G# |
  13. /* USER CODE BEGIN PV */
    6 M9 k% r! X( R( q
  14. static void Send_Task(void* pvParameters);: ?" c. @& A2 W% s6 G5 e
  15. static void Callback_LEDTOGGLE(void* pvParameters);2 g+ b$ L7 U7 I9 C/ H$ k) o( x) i

  16. * B/ d  h  b. U1 K
  17. static void AppTaskCreate(void);: @: K% a1 Z; \
  18. $ o& ^6 V3 x. i# }/ L4 R8 v

  19. ! w( A) E  \. d! \" W
  20. /*Task Handle*/
    ! w/ I/ V8 y0 X/ u6 X
  21. static TaskHandle_t AppTaskCreate_Handle=NULL;& ^" h# E/ U" c
  22. static TaskHandle_t Send_Task_Handle=NULL;       //PRO:3
    : n/ i9 g' q3 d9 ]

  23. ; ?( @$ f6 ~) h5 z

  24. ) N: S2 j- c2 O2 c+ e5 q
  25. /*Timer handle*/& X: G" Y$ V$ N, Z/ B
  26. static TimerHandle_t Timer1=NULL;
    ) w9 D5 m$ N! f  d! H, w

  27. 7 U6 x! y" \+ l, Y5 v2 @7 B% M" Z
  28. static void Callback_LEDTOGGLE(void* pvParameters)
    0 C& Z& F; }; d& s4 n+ m. v% E
  29. {
    ! d: T* n2 N! K( K
  30.   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);9 Z! t2 r8 W- h/ H; ?, a

  31. 2 b; q0 c+ j- E& y. L
  32. }& W1 ^6 V! }' n, O
  33. /* USER CODE END PV */- M5 \- X0 a( ?% |- Z) }9 I# f4 G4 B
  34. *
    : \5 p  T% U" V+ g( S
  35. *
    0 g9 z6 u' d* ]5 R& I5 f$ J
  36. *
      l9 l" u. H( }8 ?$ z9 A
  37. int main(void)
    + d2 V7 @( O  }; V
  38. {
    * e% s, H  S7 i1 t4 e! B6 V' a, z0 _
  39.   /* USER CODE BEGIN 1 */
    ' Y1 W# p! x0 T) m
  40.   BaseType_t xReturn =pdPASS;
    - J/ s3 I9 b6 R4 U
  41.   /* USER CODE END 1 */* k  \% f- @0 ?! G! f
  42. *
      `1 C; m+ ^; f
  43. *
    0 y3 _' ?: R; w! x: O9 f
  44.   /* Infinite loop */) v% g3 s: t  o% ^, }
  45.   /* USER CODE BEGIN WHILE */
      k9 B; Y# c( e2 w  U3 d' ^* I
  46.           xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\- e; T& I- \' t% m5 T4 _: ^  t7 m
  47.               (const char *)"APPTASKCREATE",\9 V/ B$ w. X7 r3 h( a' k( e3 B
  48.               (uint16_t)512,(void*)NULL,(UBaseType_t)1,\/ e: l& _7 i" Z% e1 h6 }5 J
  49.               (TaskHandle_t*)&AppTaskCreate_Handle);
    ; }( P: t+ X6 i9 o5 j0 Y
  50.   if(pdPASS==xReturn)5 b5 Q9 d$ M8 q( U3 |. e
  51.     vTaskStartScheduler();! C9 |; j9 b5 ]$ h; c# T) v
  52.   else
    - w( v6 L. M, p7 p/ B
  53.     return -1;
    , g5 w: ?; H0 v8 R4 P" F( h
  54.   while (1)
    . h; w: e4 E, I
  55.   {; g% ^$ a+ o6 ~5 K1 I# d) r: Z
  56.     /* USER CODE END WHILE */
    - O/ |  M9 i7 Y, X
  57.     /* USER CODE BEGIN 3 */1 `. |8 a' z  z; a
  58.   }5 q4 H! H6 }  i- |8 ?( v
  59.   /* USER CODE END 3 */
    7 R  Y, d1 k7 A8 I- E
  60. }
    5 V1 f8 C6 f6 @2 b4 K. G& u8 ]4 Q
  61. ; X) ~; I7 `) [+ L5 e. O) |. D
  62. *
    % N7 }( B/ F7 ~  o! o6 e% l' T
  63. *) M; I! j+ @; B* a& G* H# U5 U
  64.   A( [! n2 `/ t% f9 e
  65. /* USER CODE BEGIN 4 */" H! B' R6 ^0 y7 @7 r, ^" v
  66. /***********5 ?0 ^& P3 t- L$ f
  67. *@Function name:SEND_Task  t# n7 V" q6 f: j
  68. *@description:SEND_Task body6 b; o/ I4 {# x' P) W/ K# ]
  69. *@Parameter:None8 X% d) {- Z  [3 [/ {3 ?
  70. *@return:None+ d0 W% m8 g8 j# f' m0 D+ X
  71. *************/; o* ]) v( J9 l" D9 R# w+ g& y
  72. static void Send_Task(void* pvParameters): J  C4 g2 `! x3 b! }
  73. {$ \$ r0 E3 O/ a$ ~( m
  74. 8 m1 }! {6 h( S9 |
  75.   while(1)
    ; ]0 G5 k( ?0 s/ H" @; o
  76.   {  
    5 z& J0 ]! J, X4 a" j% S5 v- a
  77.     vTaskDelay(100);         //Just to demonstrate task switching.
    $ o! W/ s) P! j3 w+ ^; w5 A
  78.   }  f' r- [% i; u, }) D9 w4 k) ~
  79. }1 P# g: {; ^- a
  80. - ~" b! D1 u1 [5 R. N) r
  81. static void AppTaskCreate(void)! X2 t$ U4 s" G5 O8 b
  82. {
    " U7 I7 a8 d4 v9 ]# s0 v
  83.   BaseType_t xReturn=pdPASS;
    . T  O1 C! b# o7 W/ X5 n& ]
  84.   taskENTER_CRITICAL();1 D$ u0 q/ d1 J6 T6 a1 U

  85.   G, Q/ B# {" h/ m4 B
  86.   /* Create Timer1 Handle*/7 p/ h7 d% p  J  Z% w1 F
  87.   Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\$ ^8 O2 O0 s6 f7 v2 |5 A# C/ n/ _$ q
  88.                      (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);, q2 ]& D) J7 K) P
  89.   if(NULL!=Timer1)% |6 q5 ?9 e1 t
  90.         {}3 J5 ~  O' U$ e1 j2 N  r
  91.   xTimerStart(Timer1,0);8 c) L0 ^/ ^' e& S' g
  92. & F: @. J: ^3 J; b
  93.   /*SEND task*/
    ) E  y: m& Z) c: \: u$ P" [
  94.   xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
      d& N- B' Z, V
  95.                       (const char*)"SEND_TASK",\
    2 e0 q1 b( U) n, |# G3 [# c
  96.                       (uint16_t)512,(void*)NULL,(UBaseType_t)3,\
    ) Y4 C$ r; j) L8 ~
  97.                       (TaskHandle_t*)&Send_Task_Handle);  P4 M8 g) v* r
  98.   if(pdPASS==xReturn)
    & d! i8 }& d2 M4 N( b
  99.         {}8 S  ^/ j1 \+ U: \
  100. # }5 ?! s* L) m; E; @6 q
  101.   vTaskDelete(AppTaskCreate_Handle);
    ' X3 k) x8 _* |
  102.   taskEXIT_CRITICAL();1 J" e  G/ w  g4 F
  103. }) Z5 h  A8 s" @5 T
  104. $ e0 L0 ?" z' a' F* L+ m
  105. /* USER CODE END 4 */
复制代码
) k& F4 o+ J  _3 O; X
4.3、编译烧录。
" s+ b+ S$ D1 w2 u* e5 V! z
$ Y5 Z4 _) q# e* b/ Z/ `
4 P. G9 B% t/ R- U9 L" }
收藏 评论0 发布时间:2021-11-8 15:32

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版