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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 15:32
1.准备FreeRTOS源文件
+ s; _5 D4 c, Q  J* I/ x) U1.1、到freertos.org下载最新版本的源文件,链接地址
0 r. Y$ w: m& n' A9 B
( b9 E; @( E" E$ O* K. F1.2、FreeRTOS 文件结构如下:
" {6 [/ a1 I/ z0 Z' |0 N7 Y$ {) S3 _8 a. R, H& _
需要用到的是粉色的头文件和翠绿色c文件。5 Z* a, u/ t  J- n
4 [) S4 ~4 B/ C
20210630230907158.jpg
. y7 v) a  [2 d' l

9 V% c" I/ g( w3 ]2、使用STM32CubeMX生成初始化代码(BSP_Init)  f% c6 z7 D5 ~/ x7 D! @
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)' d) P4 y+ ~0 ]

% w0 y( d* S! o) I: V$ ~2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档; i9 C: ]5 k) `5 B# }6 L8 U

- i0 v# c' x3 L$ }3、复制FreeRTOS文件到工程目录中5 j- s6 o5 p# e
3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹
( Z8 S5 v4 c) y5 s
. C+ l. ~+ |9 V最后看起来目录结构是这样
" b4 I4 E9 F- h/ [; v# e9 c- f4 s6 O; A$ [
20210630232103223.png
% p8 Z! G) _: J4 W3 {; E  a

! D" y2 b. |* Q. w( G: \# j3 J+FreeRTOS: c% Z% l  ^# F0 y
|+include: I- @9 x" C- x/ h! A9 s& h5 ?
|+source
( i0 A3 ?( u: y) y" z" e& R/ @: G- n( [% O
3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中* v, n0 D! E8 v1 y" B. d

7 {7 k" v, S5 ^) M. c3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中
& ~, q5 E. d1 x9 s5 K- c* L1 G3 @) D5 g
3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程2 e: M. j5 H1 F! w

) k8 m. f. t- J; ~: V& F3.5、新建一个FreeRTOS/source,把所有的c文件添加进去, i) A6 U  X5 U% o' B7 h
0 ]1 s& G6 q$ z% B! r
20210630232815686.png
0 n# s0 i9 o# p: ]
- L3 L0 E6 ^% }4 @
3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"1 P; b3 x0 J  x' P  r, y! p  j

/ z( f( Q* Z, r' ^% [( Q0 z8 S
20210630232918944.png
+ r# B& S/ a4 H$ i" @8 U

+ {+ B) n4 u5 o) n& ~  C  o4、修改代码) B2 k+ z; }6 q; I! Z. m4 m
4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次
" ~- @* {  p1 A0 t  I7 R9 D6 W' ]; N$ A6 m$ p1 `
4.2、在main.c添加代码,添加任务
4 {0 |  V5 F. H. s4 }1 ?
3 v% N. s4 m. E: q4 r
  1. /* USER CODE BEGIN Includes */8 |0 ~/ k1 p3 j
  2. #include "FreeRTOS.h": @; t  B' _" P/ a( u* o$ D. v& S# u; J
  3. #include "task.h"- i* X6 U% Z  k' ^. d( z
  4. #include "queue.h". B9 [) t0 N, A* t* M2 l
  5. #include "semphr.h". _" g' c% b! v; x6 @. m
  6. #include "event_groups.h"
    # [# G8 v6 C% d
  7. #include "timers.h"6 O1 I, Y5 B' o+ H% z

  8. : p4 a% D! x" [3 p
  9. /* USER CODE END Includes */
    ! V. ]; r' g0 a9 a
  10. *; j5 ?$ H, R5 y3 V
  11. *2 D% c0 {2 z, W& G( b7 o9 @
  12. *
    & l$ b$ J# P) a/ ]* N6 t! a
  13. /* USER CODE BEGIN PV */; O; _% p/ k- Z# t9 V
  14. static void Send_Task(void* pvParameters);
    6 @' b) v0 v6 `+ p! Z! A' ^0 p' M5 ^
  15. static void Callback_LEDTOGGLE(void* pvParameters);
    " ~& d( E7 t' {# W5 T, f' p) U

  16. ' i" z( s/ ?) \" r4 d4 t" J
  17. static void AppTaskCreate(void);
    4 X# ?4 t8 O0 t9 q* u: M

  18. ( Y* j+ t1 G3 `# \# o

  19. + h& m, S/ M$ Q/ r' g
  20. /*Task Handle*/% C" C4 j+ _# V0 \
  21. static TaskHandle_t AppTaskCreate_Handle=NULL;
    6 f, U- [' ^! h" v6 R, K6 A0 |$ U
  22. static TaskHandle_t Send_Task_Handle=NULL;       //PRO:38 d: t1 C& n& R8 h; t) F

  23. , D- t7 {1 \9 k! D7 C# }

  24. 7 c7 O8 S0 V  n2 }5 ~' e
  25. /*Timer handle*/% j9 E% s' ?4 U
  26. static TimerHandle_t Timer1=NULL;2 `  p9 @+ z- \6 S" Y9 p" ~
  27. + w" |+ n; Z( c# U5 j
  28. static void Callback_LEDTOGGLE(void* pvParameters)1 V- ?( Z. S/ \/ ]1 r- Q
  29. {& `. p- r" Z2 R/ I& ~" t
  30.   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
    " O; n7 ^) e! s; C: n  O0 N% W

  31. ( h, |: J: v/ i, F: x$ {$ E. J
  32. }8 r7 g  D+ Y5 M3 ?
  33. /* USER CODE END PV */
    + Y( `7 }1 `9 k
  34. *9 a5 O. n. p. H7 E9 [- h) m, K
  35. *0 S, [7 i) v- w
  36. *
    * p7 K( b) |( z) x, F+ g1 v* R3 j
  37. int main(void)
    ) K  @5 w& g; |; h/ P
  38. {5 L7 I" P9 Y& g& Z
  39.   /* USER CODE BEGIN 1 */5 H6 M, c) Y0 u( q" p4 o% V
  40.   BaseType_t xReturn =pdPASS;0 l* y7 T1 c/ F- n2 r. u" P+ s
  41.   /* USER CODE END 1 */, |) w& h3 a$ G- a* m* t3 i
  42. *+ |+ g, j, ?6 D- t# `
  43. *8 w7 |+ x: ]. J8 \, k+ u& |3 |% K  Y
  44.   /* Infinite loop */
    ' O5 w; W4 u, N/ G
  45.   /* USER CODE BEGIN WHILE */
    - h6 P: O2 i* K. M) j6 i; U3 U
  46.           xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\7 _6 C- [9 K9 s  a
  47.               (const char *)"APPTASKCREATE",\" d5 V! {+ v9 M
  48.               (uint16_t)512,(void*)NULL,(UBaseType_t)1,\
    . b! K7 |: n' H
  49.               (TaskHandle_t*)&AppTaskCreate_Handle);+ N% r, t  p, h5 N! @8 {
  50.   if(pdPASS==xReturn)+ R# Q9 Q- ]8 I' u$ m. E3 I6 [0 H
  51.     vTaskStartScheduler();
    # S6 j4 D" T! }$ a& `
  52.   else
    7 ~) U& I' ]4 s2 q
  53.     return -1;
    6 p$ E8 u: O# S# v: E, N3 y
  54.   while (1)) U# }& Z2 {9 @
  55.   {* x: Y9 b/ Q4 c8 n% @# t+ c6 J& {
  56.     /* USER CODE END WHILE */
    : I* {, T6 q9 t6 m: y
  57.     /* USER CODE BEGIN 3 */
    2 K; N2 R) w  m* c( v) u! i
  58.   }
    9 }5 U: x- b: @) g4 H5 [3 d
  59.   /* USER CODE END 3 */
    : ~6 a1 _- h7 J! T$ Q4 A' X
  60. }" H+ X0 u/ S+ r& Z
  61. ) y- D+ A, O0 d' M; S( f! m
  62. *. r8 }/ q1 d0 ]7 J) s
  63. *6 a; v- p5 S& T0 {# M" S+ ]- X

  64.   j- }" E& ]/ e/ ?) Z
  65. /* USER CODE BEGIN 4 */
    4 D& D! S* H' p. d; z
  66. /***********: V! c. d9 e1 g4 H0 u1 |$ Y
  67. *@Function name:SEND_Task
    ; t% X- X/ b% F$ _# F
  68. *@description:SEND_Task body
    ! K( e5 l  q/ f2 |
  69. *@Parameter:None% Y) a% P' p% S" O, ^/ b5 s6 k5 f
  70. *@return:None
    & L  B' k& R6 W8 ]8 d, [
  71. *************/( P- `, }" X" v0 k& b$ ?8 w, H8 x
  72. static void Send_Task(void* pvParameters)7 `$ |9 d$ c' t% v+ m
  73. {
      S  K5 t5 X/ A  f
  74. , [" i8 X: |- h3 z" H
  75.   while(1)
    * c$ e3 B1 k3 Z, ~
  76.   {  2 b# ^9 i) E  X3 Y
  77.     vTaskDelay(100);         //Just to demonstrate task switching.% ?1 k; M; [. C, u( N  ]
  78.   }" {5 u  {2 U  w, P7 N
  79. }0 m8 ?  I/ \* q, V+ N7 s
  80. $ H5 i0 N* ]3 N/ e5 X" [& [3 ^
  81. static void AppTaskCreate(void)- I9 a9 G2 O6 r# ^6 A* o5 [
  82. {
    # h, e  @8 z+ ^: h
  83.   BaseType_t xReturn=pdPASS;$ ?$ _! B4 X: I! W
  84.   taskENTER_CRITICAL();
    , Z0 P9 x. _7 r7 M1 S9 k

  85. # E/ W3 P" [! ?  p3 f# D8 @
  86.   /* Create Timer1 Handle*/! Q  U; T. W7 n8 {6 O8 s  c
  87.   Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\
    % q8 J7 w3 g2 V9 \; x
  88.                      (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);; J& A4 s% k7 z1 B, ~
  89.   if(NULL!=Timer1)" W* }) P) r' o2 c* C8 f2 ^3 O
  90.         {}
    ; F- n, Y/ k1 a& n! K/ T7 l
  91.   xTimerStart(Timer1,0);
    2 G0 R+ y3 C" l2 b
  92. ; r" b7 z7 _# N+ q  E/ q
  93.   /*SEND task*/
    - J/ h0 L+ U( _  H6 _0 j  [8 y
  94.   xReturn=xTaskCreate((TaskFunction_t)Send_Task,\  f( ^, g% J" M+ z" ~+ f
  95.                       (const char*)"SEND_TASK",\
    2 t! \% H, Y' o3 g) D9 c; S* p# z3 q
  96.                       (uint16_t)512,(void*)NULL,(UBaseType_t)3,\
    5 ^$ U$ D* U0 N2 I# g6 K6 `
  97.                       (TaskHandle_t*)&Send_Task_Handle);
    ; Z2 H2 s" c0 K5 @
  98.   if(pdPASS==xReturn)
    + k. W+ b" _+ I
  99.         {}
    / a, e: q8 D- @2 W
  100. . M1 {  I0 P" E4 d- M4 c
  101.   vTaskDelete(AppTaskCreate_Handle);) D  q2 |' Z) Z; a! I
  102.   taskEXIT_CRITICAL();# }& ^$ J4 S- [
  103. }" Y! n/ r0 B1 L, k
  104. & ^1 _) J4 C) N1 [& x
  105. /* USER CODE END 4 */
复制代码
9 Y# j/ `$ |! y9 _
4.3、编译烧录。# v* n0 ?9 n  F. ]' t) ?1 n

: F! Z+ S: `' r  u7 ^" ?# p! Y% K1 g. @5 i
收藏 评论0 发布时间:2021-11-8 15:32

举报

0个回答

所属标签

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