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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 15:32
1.准备FreeRTOS源文件5 I; d1 u. t5 |: c" S
1.1、到freertos.org下载最新版本的源文件,链接地址9 A% O2 V4 A/ a5 u' A: K

7 ]. v$ t- d. L6 e/ q% [% ]( l1.2、FreeRTOS 文件结构如下:
6 f) g/ m; A' b- r
+ Z$ r, i3 B0 E3 H8 M3 w需要用到的是粉色的头文件和翠绿色c文件。. E/ E- \) }5 O: j; H' v

) G& r0 h+ y/ s2 U
20210630230907158.jpg
% o) ~0 {% p1 e" U4 e
* G0 G5 y+ J) R
2、使用STM32CubeMX生成初始化代码(BSP_Init)9 S: f7 g2 k( ~6 a+ f- P$ p
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)
( [3 @+ _  P% W! C. v9 t( y: j2 o9 d# \/ _" {$ {7 m
2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档
4 x! L) B9 Y; }7 F4 M6 u( u( M5 R$ c! \! `: a
3、复制FreeRTOS文件到工程目录中
: m  O/ W1 e- x& H3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹" q0 [6 r8 [, |% g9 G4 G

$ N$ H  P5 v2 k最后看起来目录结构是这样
( J3 Q2 U" f* L9 X- J
. Z3 n5 j$ ]* k
20210630232103223.png

5 k2 S) u- o) g' f) K5 I: l) h8 U( B; i& g2 B7 w! _$ t
+FreeRTOS" _8 b% [. y. P" y7 J
|+include
- H  _7 O$ G) Y  v7 ^3 B5 z |+source
8 W! F* T7 s7 \9 w
/ b4 s2 d) f( m  _/ ]3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中
9 y& g& h% Z- j8 t8 y; z% M) s& r; ^& k& A! L9 m3 U3 g9 g
3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中
+ e) C, a& H( D. s8 S8 T5 q( b) D. W( Q7 Z1 e. p
3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程* H7 d$ M) y( ^" Z3 B: Z2 F
! e8 J& l8 q3 r' u
3.5、新建一个FreeRTOS/source,把所有的c文件添加进去, f9 Z; r% ?0 b" u$ F/ F' |0 `/ |
7 w+ ~6 q" q: t9 `- A: F! {9 X# Q
20210630232815686.png

" C! e8 C# V. P+ L' E1 d* B3 l( \: [3 \8 J; t8 w4 m% y
3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"
3 O% ]! u; t) H/ e% [1 \2 v1 D; p, J1 [
20210630232918944.png

. N+ m% z% u8 n. Q$ q5 ]2 t3 v) q, y  A4 W
4、修改代码2 K  R5 G! v0 F, I, F" @6 b, ^) z
4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次
" ?: k  w6 D8 ?# z8 o% m; O" x  }( ]7 K( G
4.2、在main.c添加代码,添加任务
5 S. h( X( |. A0 H6 Y0 w8 b+ o: ~
9 d9 v% R: X" O. T$ v( l* a
  1. /* USER CODE BEGIN Includes */5 h7 [+ ?! C+ P/ B
  2. #include "FreeRTOS.h"
    0 ]( r7 j) W6 `2 `) |
  3. #include "task.h"
    ) q$ B- [0 v* L
  4. #include "queue.h"
    6 k6 E; `. R: I# t; x  k
  5. #include "semphr.h"
    2 l! s$ m' {. ~: f" q$ f
  6. #include "event_groups.h"
    + @& j8 G( Q) ]1 C8 f
  7. #include "timers.h", V! y3 z  T0 m3 _5 m+ {- M) F

  8. + F0 M3 [. G2 c0 i/ q5 N* i+ P
  9. /* USER CODE END Includes */
    : b, y2 S: H* D; D7 s
  10. *
    5 c  y5 w" y  Z0 \5 B. B) b
  11. *8 O5 _, D# J+ V( W; C
  12. *5 {) o9 V$ d8 K; x
  13. /* USER CODE BEGIN PV */. y) ~# I- Y/ j- Q! V' U3 V
  14. static void Send_Task(void* pvParameters);' X& G3 r  t  l( a9 b) J/ ~
  15. static void Callback_LEDTOGGLE(void* pvParameters);
    . I4 B& x8 D4 I' ^' |+ S
  16. & o4 K4 `$ K5 P5 j$ d
  17. static void AppTaskCreate(void);: O4 F  m1 D' ~: X9 Z& h

  18. 5 V9 P  l1 ~8 O: _* X
  19. ; |- q! [4 S" o+ ~; {1 b# X
  20. /*Task Handle*/
    & Y: G" @! o( O
  21. static TaskHandle_t AppTaskCreate_Handle=NULL;* F9 R+ J6 a( G* X+ I9 ?, e4 C
  22. static TaskHandle_t Send_Task_Handle=NULL;       //PRO:3
    + T/ X7 t8 `9 P0 s

  23. * u9 e# B* P! P6 u) W5 {
  24. 1 ^4 R" {- f( @; ^$ D6 L9 }
  25. /*Timer handle*/. \2 m( o; H" C) f2 _
  26. static TimerHandle_t Timer1=NULL;
    - y$ V# X. z4 @+ `6 Q) x  s7 y, Q
  27. 0 E" A2 ^9 q5 `3 D1 `# g
  28. static void Callback_LEDTOGGLE(void* pvParameters)) P/ \+ D/ [1 w
  29. {
    9 Y' ?5 |4 W( u/ n
  30.   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);1 Q. x" p+ H/ p
  31. ' W( W4 m/ ^2 k1 d
  32. }
    % V6 V1 M+ d/ Y, U
  33. /* USER CODE END PV */
    7 M/ E$ [0 j0 V' {# l
  34. *8 a8 R9 T% h% U- h  }4 A2 Y
  35. *
    + g, \& M+ V( m# G* K# c; G3 k# J+ O
  36. *! \: J; Q4 _( q- j& B  m
  37. int main(void)
      J% q0 q& P: `
  38. {
    . f) v( Y, C3 i' L
  39.   /* USER CODE BEGIN 1 */
    5 G- y% s, R2 ?
  40.   BaseType_t xReturn =pdPASS;
    " c4 [- Z! M+ \* G/ Q- V) h
  41.   /* USER CODE END 1 */8 q* s: M; n7 W1 u* v! [
  42. *
    1 F) L7 y1 F7 d
  43. *7 i. H9 M6 ^* A, n' H; r
  44.   /* Infinite loop */) G$ [: q& t  t4 l0 v( c0 T
  45.   /* USER CODE BEGIN WHILE *// p% ~  |9 k/ s- [) V
  46.           xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\6 i2 K' t. H  S* O( u  Z
  47.               (const char *)"APPTASKCREATE",\* H7 `. @# O/ \0 S+ f
  48.               (uint16_t)512,(void*)NULL,(UBaseType_t)1,\
    + b! n/ ^1 H8 z! b2 r
  49.               (TaskHandle_t*)&AppTaskCreate_Handle);2 \; F; I9 D# l# c0 I& U
  50.   if(pdPASS==xReturn)$ N% \7 M3 z: K$ U6 j6 {; r$ y
  51.     vTaskStartScheduler();# d8 G. a$ ?$ j" C1 b# t
  52.   else. B8 T9 m7 [" A8 D' k# l5 J
  53.     return -1;' `8 ^0 ?- `+ h. E
  54.   while (1)
    $ j& Z; ~( r! n  Z) K) r! Y
  55.   {
    . V3 k% [: x' D. C" w% E
  56.     /* USER CODE END WHILE */  _. ~! ]. ^2 L+ w5 v7 j+ _
  57.     /* USER CODE BEGIN 3 */
    7 E) W( k" P; m
  58.   }
    * T& ]0 H9 F  Q+ I# j: w9 K" h2 l
  59.   /* USER CODE END 3 */
    / s0 v2 C. r% q+ k
  60. }
    . n3 C( G: F! C6 I

  61. ' s6 _3 g2 u: J( t# R
  62. *. D! I  `) h7 h4 Z# E9 `
  63. *
    " p3 i3 Q! b/ @  }7 y' E( b2 s
  64. : Q; g( p- L3 u+ t) T
  65. /* USER CODE BEGIN 4 */) e9 D4 Z4 g+ O/ J
  66. /***********1 }# v( Z) F1 a& j
  67. *@Function name:SEND_Task' \0 F6 ~7 ?5 [& y7 h% n/ y; W
  68. *@description:SEND_Task body7 y8 c- Y! Y! B4 S$ i; Z% b0 \# Z
  69. *@Parameter:None
    2 p- y7 F: ?1 i0 o. c
  70. *@return:None
    5 w: c1 \; M+ m
  71. *************/7 W6 m  b* r4 I- h3 j
  72. static void Send_Task(void* pvParameters)
    - {4 p: B# b5 a  ]  W
  73. {
    0 y1 Q7 D8 L, N
  74. $ w$ J7 Q) ?/ x
  75.   while(1)( S7 [9 T( h, e
  76.   {  2 }; b% z4 T1 \7 X0 V/ \# H
  77.     vTaskDelay(100);         //Just to demonstrate task switching.
    : s; [5 c1 k' B0 T* F6 A6 G8 X1 z
  78.   }
    8 N5 \' i% F% r: }
  79. }4 @7 H2 x( T. Z! s

  80. 8 E. }0 V$ f! t$ C5 s5 B
  81. static void AppTaskCreate(void)
    0 }4 J  n: {3 D2 |* @
  82. {1 g& [+ @: _0 u( h" O
  83.   BaseType_t xReturn=pdPASS;5 s; r/ _  w5 m# ]; K6 f
  84.   taskENTER_CRITICAL();' `7 X2 j+ j) y; _5 L

  85. , m' J9 o; r+ q9 @( z
  86.   /* Create Timer1 Handle*/
    ) C! D7 e8 n" T% L2 m
  87.   Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\
    $ ]2 ?5 M' S! r4 g
  88.                      (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);4 W! w- \  z% l/ H9 D
  89.   if(NULL!=Timer1)/ `" E3 k: r0 n  e% Q, R. |
  90.         {}3 p# j; H/ t9 k* T' K
  91.   xTimerStart(Timer1,0);
    6 [+ F, p/ t$ w! [7 t1 B# C+ m& Z
  92. " [6 ?& A+ L% H* n
  93.   /*SEND task*/$ l0 S! w  Q) @* m6 p" \
  94.   xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
    & _; Q+ R: I- D/ |  e; z
  95.                       (const char*)"SEND_TASK",\
    5 X/ R, o7 `4 ~2 c' n
  96.                       (uint16_t)512,(void*)NULL,(UBaseType_t)3,\' f/ ]! S3 X  U. S7 M
  97.                       (TaskHandle_t*)&Send_Task_Handle);  @9 c9 k+ _6 P( ]! q
  98.   if(pdPASS==xReturn)
    / r8 T$ x0 d; E# @( |/ V
  99.         {}; ~$ c0 D5 z3 ~9 B5 o1 P* U

  100. ; X- k$ r0 w( I9 z. u9 B' R7 F
  101.   vTaskDelete(AppTaskCreate_Handle);' w2 O3 q7 g1 W* {& S- H
  102.   taskEXIT_CRITICAL();
    & D% f4 |  o4 d- H( G6 s0 B/ U
  103. }
    8 p! D3 d/ e& L8 |% F( s

  104.   ?# E; B  a6 q: {" T
  105. /* USER CODE END 4 */
复制代码

) K0 N4 |) f8 {1 Y- R& S$ y4 o# @( W4.3、编译烧录。
1 w/ i* {9 X3 P2 W: u& ^" J% u1 r  V9 J

8 |) `# D/ w  ^: [: b; E$ \
赞 收藏 评论0 发布时间:2021-11-8 15:32

举报

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