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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 15:32
1.准备FreeRTOS源文件
6 Y, c( C. k0 R. T1.1、到freertos.org下载最新版本的源文件,链接地址
9 ~, H7 I2 @+ G- f0 m. @: t/ k4 t/ o# M  R/ g+ h7 P, ~
1.2、FreeRTOS 文件结构如下:4 a( S6 s- ]/ |5 S
; K3 o# G8 [1 ]' x' u  R
需要用到的是粉色的头文件和翠绿色c文件。
3 @, J7 v+ J0 g( r3 g: ?, F% O% l( ?; m6 Y" p6 g" l
20210630230907158.jpg
+ ]3 ?) ~  `2 k7 C

: L7 T, S, ]: \+ ^) k% `& N1 u2、使用STM32CubeMX生成初始化代码(BSP_Init)
, c" K: M  @( t' x/ K2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)
; v2 L$ U$ F! j! d8 R
5 q# {2 L: Q* g. T3 J% z7 h* o2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档* i( b. V2 G/ C: C9 k" l) R

8 F  C& B0 Z' K+ k& P3、复制FreeRTOS文件到工程目录中8 h7 }9 K! R! T" L* d, e0 M- @0 k
3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹/ H. w3 {$ @9 N+ H& u; p
2 y6 U) e0 s- Q& ?, C& ?7 I
最后看起来目录结构是这样  z4 x/ I- S* ]5 y% S1 _: a
0 [+ a9 H: y( b# L% ^
20210630232103223.png

  K0 T9 {# g) a# P+ Q
5 [  Q8 r2 h% N# l; Y( [+FreeRTOS- `1 o! s( C4 @8 f9 H3 I$ g& d
|+include
9 v) s$ s9 X$ L: B) F |+source
5 }; E/ l7 `+ L* |! ?3 p& D- X% z
3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中0 d4 Q3 D. R; `

: y& g' C/ B8 [2 L& a8 t3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中. `) K5 h" |, c6 M! A6 W
. d# F2 j6 }' z  r
3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程
) u1 @) g) `: {; T2 M" _7 a1 D7 f: R
% l5 y1 K  U* m5 e( G0 B8 U3 B9 C* W3 L3.5、新建一个FreeRTOS/source,把所有的c文件添加进去1 a5 U9 S2 @3 f" _/ M! J6 f% i

. J" h) Z: o8 K5 h! p$ E+ j, `$ X3 W
20210630232815686.png

) b3 Z/ M! Z9 T8 ]" \  r1 n- ~( y0 b# U
3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"  y5 R$ E' G: E- q/ @' S
, _2 s" e0 M$ x
20210630232918944.png
2 k  H! W* I% ]1 Z

& {( p  w6 Z3 O9 A3 l' Y( G4、修改代码1 p$ ?  j  C- d9 M" Q
4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次
0 z% b$ u8 O4 T2 ~8 k5 L
" y, L# n& G2 W' Y  j  t7 Q3 I3 W2 A4.2、在main.c添加代码,添加任务' i; R+ o8 R' y

% t1 i/ z6 R- i6 L0 O* h
  1. /* USER CODE BEGIN Includes */
    * E9 u& Q" H' Q/ S3 [4 S& I2 T
  2. #include "FreeRTOS.h"
    ' |/ d. ^* d9 o2 {
  3. #include "task.h"
    . ~+ D0 T, H8 P' N: v
  4. #include "queue.h"$ r) j0 n9 Z$ j, b0 J) w
  5. #include "semphr.h"/ l3 L/ D2 f8 C' G, G
  6. #include "event_groups.h"' m" K/ ?6 f. j, m
  7. #include "timers.h"
    + D; \# u  t4 I
  8. $ o: ?2 W6 \) u0 O) x3 T
  9. /* USER CODE END Includes */
      S0 M$ _( m5 A: }/ ~
  10. *
    * [' `4 i% M. ]/ q$ i
  11. *
    6 Z5 X" J! `+ N3 O5 k$ D7 h
  12. *
    1 K1 m7 e% X( \+ L
  13. /* USER CODE BEGIN PV */
    " x) V9 f; A/ a+ ?5 n4 t* i/ u4 w
  14. static void Send_Task(void* pvParameters);
    , ~7 e, I& n4 G1 w& Q* S
  15. static void Callback_LEDTOGGLE(void* pvParameters);
    3 w) q% ~& ^  a  K* a7 W2 G

  16. " }' j* U- m8 j- ?& }
  17. static void AppTaskCreate(void);. H: B9 g% D" d9 c( Y

  18. 7 @# p1 w  r# F# {6 m
  19. % ]. P2 h& t" c( a  T3 T: j: y
  20. /*Task Handle*/
    ! @  c' P3 U- q1 n0 M0 R
  21. static TaskHandle_t AppTaskCreate_Handle=NULL;
      h+ e7 @  L3 o/ F# x- |( t
  22. static TaskHandle_t Send_Task_Handle=NULL;       //PRO:3
    8 x7 e. U# g8 I) b; ^' m0 g

  23. * [0 ^2 d: [4 K+ p3 G, L

  24. 6 N( w) ~) |, x* T& C  Q/ {2 o# Z
  25. /*Timer handle*/
    . I4 C( z# k8 o, F: H! a4 Y  i
  26. static TimerHandle_t Timer1=NULL;
    6 ~$ ?6 S! Q6 q% i6 i! x
  27. 5 e: B+ ^, A& ~8 e7 K
  28. static void Callback_LEDTOGGLE(void* pvParameters)
    7 m9 o7 m6 `& P2 [& m8 X9 m3 e- ~
  29. {
    % r" r7 o1 e- R% v. s8 D
  30.   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
    ; @& P. s) e0 Z% Y. p
  31. + F& i+ x/ }& {7 J" x2 x
  32. }
    8 [( e$ G# r7 W; _% |  B
  33. /* USER CODE END PV */0 s  b% j. c1 Q/ o
  34. *0 Y! d# {, {. E8 Y3 {
  35. *
    8 Y# o, O' b) `4 j
  36. */ a: n" b& A$ T8 n9 o
  37. int main(void)
    ' J5 I% F* {. }1 v: e
  38. {
    # E. N& C/ o9 f0 G- {: I
  39.   /* USER CODE BEGIN 1 */" m6 v9 @$ o+ ]) S
  40.   BaseType_t xReturn =pdPASS;# [" |/ m9 s  w6 \$ }0 X
  41.   /* USER CODE END 1 */# n8 c# C' ?$ L$ \( E
  42. *
    7 _7 e& |( y( Q5 h1 ]' U3 Z
  43. *
    # {5 K) E+ ]9 t( {9 f0 {' K2 Q) B% h
  44.   /* Infinite loop */
    + Y% ^; U! F7 E8 m- V5 }1 S; \7 `
  45.   /* USER CODE BEGIN WHILE */8 `- s* I  s" U7 ]8 m
  46.           xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\
    ) q$ r: s% {7 w. a# l/ }, i
  47.               (const char *)"APPTASKCREATE",\
    + {" n8 D( M" u; b4 S& f; Z7 g
  48.               (uint16_t)512,(void*)NULL,(UBaseType_t)1,\2 ~, O  ?+ H! v$ H3 v
  49.               (TaskHandle_t*)&AppTaskCreate_Handle);* I2 O! B7 Q* W+ j. T! f
  50.   if(pdPASS==xReturn)8 }$ y/ b& K2 n0 `; n
  51.     vTaskStartScheduler();
    4 A. W8 \- E- ?/ O& ~8 P
  52.   else8 e) Z: i, c5 T/ z5 Z
  53.     return -1;2 s! d# e/ T9 s) h. k+ @% P
  54.   while (1)
    9 Z- I# _& Y% G. p
  55.   {) Y7 i; O% G  Z7 K$ o$ V  \
  56.     /* USER CODE END WHILE */. U. K9 D: O2 L: o3 G/ K5 T1 z# f
  57.     /* USER CODE BEGIN 3 */
    5 `7 B1 v& @% e0 S5 ~' w( V
  58.   }
    0 G% ?/ o0 a: l* ~
  59.   /* USER CODE END 3 */
    / q4 J8 F% p1 y5 h  r- B
  60. }
    - l0 l5 }* f* u/ H, {; A

  61. 4 D' _% m* t# U6 }8 M! X( G
  62. *
    - }5 Z* g/ u5 t9 l
  63. *
    # H7 e1 K% O. G9 S
  64. - v2 b: z9 r! b3 q
  65. /* USER CODE BEGIN 4 */) k2 X5 p" f' b! g0 W0 C
  66. /***********
    8 h7 [9 O- ^' u# J* g# o& ]
  67. *@Function name:SEND_Task3 f+ K3 t+ U0 J5 T5 `
  68. *@description:SEND_Task body! _6 D7 Y6 G8 }9 x. R, w
  69. *@Parameter:None
    6 m) b) [# M0 S0 e6 s& N# n  ]% u
  70. *@return:None
    & V2 b/ H3 v: d' R# k
  71. *************/% _. m% t% }) n0 a% u! c* f. c
  72. static void Send_Task(void* pvParameters)
      B% A5 k. S) `; Y
  73. {$ y$ @2 R3 y3 S, O8 }6 R; x( @
  74. ) n+ l9 j- ]9 ~# \7 u+ U
  75.   while(1)6 r0 C9 a/ M' \4 K; x( I
  76.   {  
    % c  J3 _. L5 b) g
  77.     vTaskDelay(100);         //Just to demonstrate task switching.0 @. L" w8 A8 _& f* [
  78.   }9 U0 ]) n& W% T; c3 B2 Q
  79. }
    " R! p8 J& a+ K/ K: W

  80. : u5 X6 _  Z3 O' V. T& v9 H
  81. static void AppTaskCreate(void)
    , Y9 r) l3 D" ^% z, s
  82. {
    1 x2 n/ T" f. J# b" T1 T; n
  83.   BaseType_t xReturn=pdPASS;
    " v+ {& j+ h4 R- g
  84.   taskENTER_CRITICAL();
    ' z& v0 K8 Y. V6 q+ L

  85. $ b' }" y- _* f/ J! H' n
  86.   /* Create Timer1 Handle*/
    . h8 u# T2 {) H
  87.   Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\+ B4 m* x/ x- }
  88.                      (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);
    ! b0 h* l. C  N* \! x7 h
  89.   if(NULL!=Timer1)
    " S5 D  w$ R: V
  90.         {}0 X' A" B) ?# P2 ^4 J
  91.   xTimerStart(Timer1,0);
    + c& }; p/ |( m6 I8 D

  92. : H+ N6 [! `/ i5 t/ S- C; ~
  93.   /*SEND task*/
    7 {1 b; d4 A/ n: ^
  94.   xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
    5 v9 Y/ O) u2 p5 R% c$ e
  95.                       (const char*)"SEND_TASK",\1 v" ~" k5 @2 ]; U* H. k/ y
  96.                       (uint16_t)512,(void*)NULL,(UBaseType_t)3,\- Y- P; p$ `$ I5 k( B: q4 n
  97.                       (TaskHandle_t*)&Send_Task_Handle);
    ' F9 G  Q" W) U" w; n, t( G1 u
  98.   if(pdPASS==xReturn)
    9 _/ |1 I* }) j' S7 S* X' b
  99.         {}' ?1 `4 i" G: B) u# V2 Q8 ^

  100. ! ]4 H; k! r+ B. b1 i  V7 T; R
  101.   vTaskDelete(AppTaskCreate_Handle);7 h' u$ I" E3 P. e2 I( @
  102.   taskEXIT_CRITICAL();* D0 ^6 q) t" R% f8 A
  103. }3 g$ W6 t& |' ]( y( k' |

  104. % O# i4 S! F6 k8 l: V& @# m
  105. /* USER CODE END 4 */
复制代码

2 _' N% o6 r* j+ U1 l! ^4 Z" @4.3、编译烧录。
$ x/ E4 J( D7 s/ n4 Y3 z
4 k' h  V2 _% g3 s4 C3 g% ~; d8 C: i2 f0 R
收藏 评论0 发布时间:2021-11-8 15:32

举报

0个回答

所属标签

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