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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 15:32
1.准备FreeRTOS源文件9 u' Z# i; q' p* c. p  S
1.1、到freertos.org下载最新版本的源文件,链接地址
' ^9 P4 x' F6 g* @* |' s. F" I! e" E6 A
1.2、FreeRTOS 文件结构如下:  @$ u6 i) X* U% X9 U! A

. d6 D) G" I  f需要用到的是粉色的头文件和翠绿色c文件。
! R! J" P6 @2 U# E* R: Y( Q1 `, N% Q7 }8 }" e0 T' X# r
20210630230907158.jpg
) |8 ?1 I$ O! o2 p. F5 M
& @; g. A. v4 X( ~3 G
2、使用STM32CubeMX生成初始化代码(BSP_Init)
+ ?. ?# ?  C4 {( y6 N+ u  b( q& M( E2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)
2 p2 ?3 N/ G1 u7 y
8 a9 f5 P$ M8 _4 g2 M& x1 u, U2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档
: |+ P/ [( O6 `1 r" x
  o, X5 @  }% L; U/ p3 t3、复制FreeRTOS文件到工程目录中
' w# [0 P( l  H$ O) Z. j- r1 {+ `3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹
/ a0 l4 i* R! X, N8 G- Z! ?& ]) M$ b* Z5 Y
最后看起来目录结构是这样
7 ^' A5 U& x/ p& K7 m7 @
0 k4 [! C5 n& R" `$ ?
20210630232103223.png

. s* `. I6 ^. @, k4 F6 I9 J2 y
$ D9 A$ ]9 F9 G; [+FreeRTOS3 s3 Y" b  u2 d9 N. H! s* H
|+include
  Y. s/ \# s( |8 U |+source
: F0 d7 s6 T4 k% O" Q5 T9 i) q; ]' d; V$ y0 l* }0 }4 z
3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中
0 ~4 E+ I3 y# l$ `% E! r" L  m( M1 e7 E' a
3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中* P8 ?( n( ]0 u$ L" {

/ f; e9 J6 n1 K2 S2 m- m1 M( L3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程
! n  R2 B) g3 U* A( E' Q0 K$ g4 O8 P8 W2 L# ~7 e% K
3.5、新建一个FreeRTOS/source,把所有的c文件添加进去8 g. e9 j8 Q0 Y7 @) \5 h
7 d3 r' C* C* I
20210630232815686.png
4 E7 ?# C, b* b: T9 ?* k' l. h/ g
! o4 Y, D4 m. ^+ D
3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run". a) {9 o4 U' ~, _5 u0 L# ?) H
' W4 ^6 i0 R" s
20210630232918944.png
% Z/ G; q4 D/ L6 G) @

4 |$ @6 b) l3 }& ^8 p7 w  h$ V4、修改代码
1 ~7 v* A% N4 z3 L5 S0 T4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次( m& t1 {* W0 v; I

  X! Q; p0 I" Y& d4.2、在main.c添加代码,添加任务7 j/ \( z6 d2 ]* a& K4 C5 R$ e

& |9 W5 B1 r" E$ u8 H0 }
  1. /* USER CODE BEGIN Includes */
    " e. n5 O: ^5 Q
  2. #include "FreeRTOS.h"
    , i, z: h0 p: G9 S2 _4 o
  3. #include "task.h"
    : H) A9 x( J- R! Z
  4. #include "queue.h"
    : O: J* ^5 w: E
  5. #include "semphr.h"
    + _- C' H+ S5 B- d# S7 ]9 Z
  6. #include "event_groups.h"
    & F7 w% X# z  X" O& X6 G
  7. #include "timers.h"
    ' {8 i+ x5 v9 ^$ H3 A

  8. ) ]! c/ |9 Y8 ~" B" {7 F* b
  9. /* USER CODE END Includes */
    # W  ~5 _, A: j
  10. *
    3 j) u& `& n) p  y6 ?0 \8 l! G
  11. *
    4 x' A3 C7 F+ s8 P/ w
  12. *
    ' x  q; i6 H# }6 I3 T0 j* b
  13. /* USER CODE BEGIN PV */; [; Q( T. N* F  F6 R1 p- _8 X
  14. static void Send_Task(void* pvParameters);
    5 j! z; N6 v4 V  Y' ?. g) P2 M
  15. static void Callback_LEDTOGGLE(void* pvParameters);
    / s$ Y& T8 i, @2 W  L& h0 e3 X
  16. / D* V, N4 G( i  p7 S7 t! k
  17. static void AppTaskCreate(void);
    ) D+ \% A) u* \/ E1 \
  18. 7 D! N3 t8 _* @4 Y

  19. 5 T/ }# n/ w* `( p
  20. /*Task Handle*/
    % m- p. o( {& b4 L
  21. static TaskHandle_t AppTaskCreate_Handle=NULL;0 }) g( c- e+ a8 `. o3 ?
  22. static TaskHandle_t Send_Task_Handle=NULL;       //PRO:36 c+ q( Q& J. P; N% t# O  p, ], G

  23. 4 [7 U( s9 x! Q9 P# Y( c4 S
  24. * c0 \: b5 S2 o# Q9 y0 P
  25. /*Timer handle*/6 s5 `- G( E0 Q9 s+ P+ n0 ]0 I( I
  26. static TimerHandle_t Timer1=NULL;
    - |: x$ T  o3 h! H% K0 Q0 _

  27. 4 @4 s# B  s$ \7 o* x4 b' \2 O' f4 v
  28. static void Callback_LEDTOGGLE(void* pvParameters)
    $ T9 G: N, T& R* j( X7 g# t/ F: D
  29. {6 L/ {7 _& I" h  ^8 {: {7 m# V7 U, S
  30.   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);% B# D7 }2 s$ i( x: H

  31. , v/ [, t8 p1 B: T9 y
  32. }
    1 k: o  |7 N; q1 t
  33. /* USER CODE END PV */
    # n9 Q- ~$ |+ e1 H
  34. *
    6 j/ X0 Q  \+ y, i2 a
  35. *
    ; m3 t; b; R; R, O# Y
  36. *! J  p7 B, a; y3 v- J* X: o5 e  B
  37. int main(void)
      C* X! c4 K. @& g
  38. {
    8 c" \& U  z8 [: i0 P
  39.   /* USER CODE BEGIN 1 */
    7 V3 l2 E- ~7 O% N7 \* \3 H
  40.   BaseType_t xReturn =pdPASS;
    9 T; ?+ |4 |- O0 u. m0 p9 a9 D  M
  41.   /* USER CODE END 1 */
    ) E% ]9 P# U( M. H6 [
  42. *4 [5 |: }' ]  \/ m6 o8 a) o
  43. *
    & Q, d+ w% s! K9 M! g& z
  44.   /* Infinite loop */* @; X6 o: h, x4 T' a
  45.   /* USER CODE BEGIN WHILE */
    & P" m. T- C3 W/ Z' ]0 p, v
  46.           xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\
    9 L( L" Q7 I& z/ L; V8 H5 S
  47.               (const char *)"APPTASKCREATE",\4 n0 _( h$ P: V) m
  48.               (uint16_t)512,(void*)NULL,(UBaseType_t)1,\- V3 P, O  Q* Y2 b# N
  49.               (TaskHandle_t*)&AppTaskCreate_Handle);
    ' W  d) {$ \0 Q8 X! Q4 f
  50.   if(pdPASS==xReturn)
    , v7 V% \7 p5 |  n
  51.     vTaskStartScheduler();4 f. G: S+ Q9 R% k
  52.   else9 P% J2 J8 \6 G: T, S) ]
  53.     return -1;
    ) d+ t. A& I+ k/ e% j
  54.   while (1)
    3 E1 f2 p: ^+ \8 y3 v. i
  55.   {. {' ~. |/ Y, x1 A4 T. Y' q( W
  56.     /* USER CODE END WHILE */: c7 V6 W( S* C0 L, j: n
  57.     /* USER CODE BEGIN 3 */
    ; A, G9 t- X/ L) R' S. Z2 G% Y
  58.   }7 Z5 y% S' [* _, M6 ~
  59.   /* USER CODE END 3 */
    2 C- R. R; H6 p& ]4 Q5 M4 K
  60. }
    7 u  l, a% S' h7 h) t5 Z8 c
  61. 7 o& T% i/ @5 I0 ]
  62. *. v% ]. j$ j0 r# F1 A% H
  63. *
    5 m$ \' E4 w4 K* a

  64. * R+ ?5 ^7 D' H$ K, O& z
  65. /* USER CODE BEGIN 4 */
    & G9 F: b* o7 p+ k' y+ ^! N
  66. /***********; V4 i+ s8 u  v& i7 d
  67. *@Function name:SEND_Task
    $ ^5 C" l: s8 s" F' e# P4 @
  68. *@description:SEND_Task body& f- ]/ e$ X! L& r. G
  69. *@Parameter:None. z) S: Z2 [3 G& n0 H) b
  70. *@return:None+ n! l$ K/ q6 P; Q' i% b
  71. *************/
    # B  e6 ?$ i$ ?0 v
  72. static void Send_Task(void* pvParameters)
    ) Q' K; x" e' j6 C. k+ Y0 b7 H
  73. {* i) }; }9 ]. Q; [9 }

  74. - T; z* z0 M; c
  75.   while(1)$ o( u% d6 J  T$ f3 q
  76.   {  ! i2 N% V/ D6 h  w9 W$ ~
  77.     vTaskDelay(100);         //Just to demonstrate task switching.  S8 a4 D3 I% N
  78.   }
    ) |& k1 @8 Z+ S8 t3 V# ^/ S1 s
  79. }! g" N% g6 l, B; l& O; `
  80. + ^0 T" R$ \1 h- ?
  81. static void AppTaskCreate(void)2 L/ Q6 l- ]9 H2 V" v7 z# O2 t
  82. {
    $ r$ U, w/ P' z
  83.   BaseType_t xReturn=pdPASS;' }( ~. j! ^/ P8 J6 e
  84.   taskENTER_CRITICAL();8 E% N- b" L; G& n

  85. + W: m0 }; q$ c# i0 M) d
  86.   /* Create Timer1 Handle*/
    " {* o; m, v; d# Z4 E7 I% t- P
  87.   Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\
    % u5 H" b# t5 t/ y, Z9 e/ e- v
  88.                      (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);
    : x2 a' Q, L- f% d. J
  89.   if(NULL!=Timer1)
    2 K, K# h3 ~# h! i
  90.         {}
    , j" i. \: M; _) ~
  91.   xTimerStart(Timer1,0);+ P6 l7 V0 ?+ Q% s( n) c& a. {) R$ n

  92. / z- y# d# ?/ D+ S/ d7 n9 Y
  93.   /*SEND task*/
    5 i+ D9 B, D! M/ Z/ c  O/ D
  94.   xReturn=xTaskCreate((TaskFunction_t)Send_Task,\: y8 H% A& ^- ~% L3 X' T' K
  95.                       (const char*)"SEND_TASK",\0 Y+ _% s8 N- i4 u
  96.                       (uint16_t)512,(void*)NULL,(UBaseType_t)3,\
    ( z4 \4 N2 _% `
  97.                       (TaskHandle_t*)&Send_Task_Handle);
      O  m+ K" J- E$ L, y# n) K
  98.   if(pdPASS==xReturn)
    ! U! V, q+ H6 ~
  99.         {}/ J) S9 `: P# O/ \  v+ v/ l" K

  100. 4 @  P/ w, `# h
  101.   vTaskDelete(AppTaskCreate_Handle);
    - m4 S% J+ J0 I$ ~, H# t1 Q
  102.   taskEXIT_CRITICAL();( v  @0 {4 ~+ A! n9 n  q+ q
  103. }
    . ^. U$ u4 I) g* v4 E7 c2 }

  104. 8 }; |! o  ]1 F' c! U) f+ C
  105. /* USER CODE END 4 */
复制代码
/ }0 W9 n+ E# e9 [7 J( j
4.3、编译烧录。/ d1 s" u# o2 K: s9 q- G7 h  J
+ d1 v" ~7 N7 |( h' {7 k
/ Q7 t% i0 ^" }" `5 |/ A# T
收藏 评论0 发布时间:2021-11-8 15:32

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版