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

STM32G0学习手册——移植FreeRTOS v202107.00

[复制链接]
STMCU小助手 发布时间:2022-10-28 15:35
1.准备FreeRTOS源文件& r( A: t( a3 q" {0 j1 W
1.1、到freertos.org下载最新版本的源文件
, C* |# }7 k+ O
2 t2 m4 ]7 f8 G4 e+ N2 X1.2、FreeRTOS 文件结构如下:+ b4 Y- t0 }/ U6 ]: _/ C2 M

0 N3 e4 s! _. f' ]需要用到的是粉色的头文件和翠绿色c文件。
$ [6 m1 a) m' J& X0 p0 p
' P& U! b7 X3 `/ j  @ 20210630230907158.jpg
- v: O$ J( v: ]2 I
0 W, S! k7 |* F+ |! ~2、使用STM32CubeMX生成初始化代码(BSP_Init). ?/ T" L5 A4 l2 A% r
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)
/ ?- p; x3 O) x! z! S' f4 k9 X( x1 E8 e7 C/ w9 c) w& R
2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档7 ]/ b( A& T4 b' [
! R: B, v! T* d
3、复制FreeRTOS文件到工程目录中5 f* W' t3 v! i( i+ K
3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹! I% K! y5 w2 f6 v2 q# _+ u

) h* a8 r8 A" N# h8 g9 ]最后看起来目录结构是这样; r4 w  @9 h1 R4 u% ^( x
2 h' O  D' G- Z2 `2 A$ @( ~
20210630232103223.png
' m- H" F/ p5 o, a% `: G
% Y) I% W; w% K( M+FreeRTOS
1 e; P" c/ U* F |+include0 u8 K. X' _( H* c
|+source
  p6 L8 t% b$ S" ?" n) U& C
( d! R5 V4 f  l4 j% Y& R. x5 x# \3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中
( I: K" x4 M3 M; P, o
' d1 j0 E: O, C! w1 e: U3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中
% H, l3 _9 T% c/ ~2 y3 [/ b; W; |. x
6 i6 Z- a0 m4 V' ^% J, i8 {3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程1 U* I0 }8 F4 E* I
, l) h0 O0 l7 \- R) H% e2 |# t
3.5、新建一个FreeRTOS/source,把所有的c文件添加进去
4 ~( G# N6 ?9 T3 q! {: H
' d* k2 d2 l& Z+ a7 [1 q 20210630232815686.png
9 y% @8 s- e% Q2 A& i( Y4 m: G8 V# _" T- ~2 _6 n' x3 P  D8 W
3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"- d; W( V3 V' {9 r+ ^! c9 G
+ {. Q" X0 N! Y+ g( r
20210630232918944.png
1 ~, U5 \2 t4 k* D' c
7 O6 L$ P5 C+ j4 h4、修改代码
9 |: b( `2 \* D4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次
$ K5 k) t' i/ X+ B# a0 Z: Y  Y( N
+ s, h' a3 l! @8 e5 s" M; [; V) x2 o- k4.2、在main.c添加代码,添加任务6 c- o' {/ B* f6 _- ?; n/ O6 w  b

2 h, h* K7 M8 w+ N" K; c, e( G
  1. /* USER CODE BEGIN Includes */
    - d: u, O5 i. j
  2. #include "FreeRTOS.h"0 X0 T6 H( k- B# J$ e
  3. #include "task.h"/ \7 d+ u) C, S2 l' }% K
  4. #include "queue.h"
    ; ]- h0 j5 h1 N( ?9 P
  5. #include "semphr.h"
    2 v# r  r& e8 Z/ q+ G& P; Z
  6. #include "event_groups.h") u) L  v. p& x8 d# W
  7. #include "timers.h"
    + R3 \( n+ G& v
  8.   t: Q% F% t# J& b! O6 ?& u% P( I
  9. /* USER CODE END Includes */& E4 d0 n) @3 {& j: q
  10. *% ?$ Q& d; ?  _
  11. *
    9 T# D- k, I1 J" j
  12. *
    ) [- V& X5 G! }
  13. /* USER CODE BEGIN PV */
    + r0 b, `2 B; f1 v* e0 R6 o
  14. static void Send_Task(void* pvParameters);
    ! O( \8 _) V3 l0 z3 g2 T
  15. static void Callback_LEDTOGGLE(void* pvParameters);) W: x' [; m, @3 f
  16. : C3 v! q2 l' q
  17. static void AppTaskCreate(void);2 n1 R! L2 I  e# Q1 d
  18. + \$ ]4 i7 w/ D' z% K

  19. & p) P  q% b) X
  20. /*Task Handle*/+ O, S% @! n% [5 X* {9 f
  21. static TaskHandle_t AppTaskCreate_Handle=NULL;
    7 T6 K9 a; R: R$ }" C  r+ _
  22. static TaskHandle_t Send_Task_Handle=NULL;       //PRO:3
    - m" F+ x" c# X7 Z  |

  23. . t# `0 _- R% X  T
  24. + w! Y' Q) B5 u. P% ], f' T- ^
  25. /*Timer handle*/. F: m. F+ z/ ]6 c" H
  26. static TimerHandle_t Timer1=NULL;
    8 L  g9 v; o( B0 \

  27. : L( o* U  I; J# f  Z) t' a, R/ Q' P, X1 I
  28. static void Callback_LEDTOGGLE(void* pvParameters)" j* U) ]( p5 S
  29. {
    + W2 y5 y- h5 K/ C
  30.   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
    0 O& s) X$ f, y4 C7 J4 @
  31. 0 |9 j% I: h2 F0 \; p! ~9 h6 Z4 n
  32. }4 \6 O0 k& K! y+ }, d* ]
  33. /* USER CODE END PV */
    3 b0 e  m, M! M. k  z( G6 ~
  34. *
    ) x& `2 p; I1 }- @0 |
  35. *
    - V$ u4 N8 g, @: y1 G( q6 e8 W+ h
  36. *% k7 L* B  a. V3 M# `: e2 ]
  37. int main(void)5 _. q& O' [6 L' I5 P, b0 \
  38. {
      t6 U+ f2 u+ |; Y5 q
  39.   /* USER CODE BEGIN 1 */  O0 p, t' l0 [5 R
  40.   BaseType_t xReturn =pdPASS;
    " A# H0 u* {$ x: K1 ^2 h
  41.   /* USER CODE END 1 */7 h( V- f1 R1 M+ [9 c+ a5 V/ G, h1 i- Q# {
  42. *
    1 Q) R, _; q* _6 ~( E% K
  43. *
    # Z2 E9 c5 S+ d. [  N
  44.   /* Infinite loop */( W3 \; b0 g9 x- m
  45.   /* USER CODE BEGIN WHILE */
    / S  ]7 p: r, V% M( B9 w/ A
  46.           xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\4 z1 Y; E0 X1 T8 u
  47.               (const char *)"APPTASKCREATE",\
    ) ?* U2 `8 C! I: G* G
  48.               (uint16_t)512,(void*)NULL,(UBaseType_t)1,\
    0 C6 _) v# R! g# s( w
  49.               (TaskHandle_t*)&AppTaskCreate_Handle);& |& }# R. o: F: N) v0 D/ x
  50.   if(pdPASS==xReturn)
    1 l' b+ x. P, l2 L1 O* B
  51.     vTaskStartScheduler();" c3 e* M+ P% @3 A) x; l' [# B
  52.   else
    # ?0 _! ]8 g; B" b, n& L- {
  53.     return -1;
    ) {! m! s( m% R" X- {
  54.   while (1)
    * b/ Z4 T+ N4 O. c8 X
  55.   {
    ' [" A! W5 t0 z, O& h, q
  56.     /* USER CODE END WHILE */
    4 Z/ ^4 l. P; J, W9 J3 s. W
  57.     /* USER CODE BEGIN 3 */3 ]( G. g9 k" u5 I  O  }) u
  58.   }
    0 z, {: I: W0 J/ M- ^
  59.   /* USER CODE END 3 */$ b4 u$ j0 l/ f$ E& s: X$ B7 O
  60. }4 m' d, T0 O% @6 ?4 H7 }
  61. 8 ^( U  E; Z7 i% p/ r
  62. *2 F, a9 k" |8 f, z
  63. *% k1 H' ~# y! V6 A( [
  64. 5 R  E9 [; G) O4 D4 l& T: J
  65. /* USER CODE BEGIN 4 */5 E- F, L! P* x; b
  66. /***********  y2 _* y- p2 E% r7 X0 s/ x: h
  67. *@Function name:SEND_Task
    / }* @9 ~4 N- e. l9 b/ v& v3 |- b
  68. *@description:SEND_Task body
    4 f7 R9 W1 i1 |7 O
  69. *@Parameter:None
    7 z! r" I7 l1 h
  70. *@return:None
    7 m' f( i& N1 n1 e' o
  71. *************/; _; f- v: d* V0 ~
  72. static void Send_Task(void* pvParameters)! T0 v6 V; ]0 E( t
  73. {+ q) p" y; U! Z' {8 N8 q+ l4 _

  74. # S2 @. B+ C+ ^; w) d2 ^% x
  75.   while(1)7 z$ ]% _' e' x! X: U4 K
  76.   {  
    % f% F9 a( F, k
  77.     vTaskDelay(100);         //Just to demonstrate task switching.
    9 y( C8 Q6 K1 {3 x0 p: ?
  78.   }& K  u0 k9 p, P- V: Y
  79. }8 E! q0 w/ a3 ]2 e, U

  80. ' p$ Z' b5 L' J) g, t( ]. x& s
  81. static void AppTaskCreate(void)
    9 `7 c3 ?  O" E6 d  a( H, f. m, O
  82. {! A" h: `/ W8 `9 F! _
  83.   BaseType_t xReturn=pdPASS;
    / R" C. Z9 H; n, g3 |/ k
  84.   taskENTER_CRITICAL();! M) V0 [0 S1 s$ S
  85. 6 t( T5 B% x8 b& {* r
  86.   /* Create Timer1 Handle*/1 Q4 c5 e) ~4 y4 v2 k. ~( C' `; |5 z
  87.   Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\4 R4 D1 K6 X* }5 ^2 u; F! N
  88.                      (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);' U, L! ~' U+ L. |, s  e' c
  89.   if(NULL!=Timer1)
    # \. |4 M" I2 U/ f; {
  90.         {}. n6 r6 y0 F: U  z
  91.   xTimerStart(Timer1,0);
    0 e# ]+ Y, e% {$ {* D1 z; e
  92. 4 m1 g# l6 i, I  g9 Z
  93.   /*SEND task*/! ^9 W4 M6 ~) a8 K2 R
  94.   xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
    4 A+ n  J) g  ^+ y
  95.                       (const char*)"SEND_TASK",\
    ! x- S* C$ [  F
  96.                       (uint16_t)512,(void*)NULL,(UBaseType_t)3,\
    7 Q6 c0 m$ T1 X, }
  97.                       (TaskHandle_t*)&Send_Task_Handle);0 i8 j  _9 Y4 O9 h6 b
  98.   if(pdPASS==xReturn)/ F$ [3 ~. P2 n
  99.         {}8 W) g4 D, t' f& a

  100. 5 A1 h" e, E; f5 g/ R! q
  101.   vTaskDelete(AppTaskCreate_Handle);% v( r6 }/ u8 G4 R+ h6 T& e
  102.   taskEXIT_CRITICAL();
    * s, F; i1 T. X* q% N
  103. }! M2 E1 S9 ]8 f1 ^$ w5 [2 m

  104. 8 A" R* M; l9 C1 k. u* |
  105. /* USER CODE END 4 */
复制代码

) s' u1 d: o+ _" X+ `" h
/ T  U; L- l9 a6 [4.3、编译烧录。, ?8 P- k& a" R0 a  J# g
————————————————
) p) u3 ]: R! F4 N! B: {7 w7 u版权声明:SCCELE2 [1 _- m0 b6 e7 }
$ S$ N1 I. Q. y* D, s9 E  q
赞 收藏 评论0 发布时间:2022-10-28 15:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

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