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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 15:32
1.准备FreeRTOS源文件7 X5 P6 i  _2 t2 Y( M4 `
1.1、到freertos.org下载最新版本的源文件,链接地址* C1 X. D4 a$ ~7 s' K; `# S

# d5 M3 n: m" j$ }  J1.2、FreeRTOS 文件结构如下:
5 [! Y3 i. K7 m0 o* X
& q+ m3 Y+ k; T8 i  s! o. Q" [需要用到的是粉色的头文件和翠绿色c文件。! L4 `  @2 R5 e* h3 c/ {
" T4 V  T1 X( R- F" ~6 ]$ c5 j
20210630230907158.jpg
2 c, j& A0 K$ W

* I- k: z; t) u2、使用STM32CubeMX生成初始化代码(BSP_Init)- w: @6 e, W: N; A: ^
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)
' z! X* |( `  {6 p; n7 f
; G) o/ Z% h) H. u  @( }* V2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档
: p, l1 [5 F: C1 t) n' x& H, \, x) `$ s; O& S3 A7 s  `# K$ T( [- W
3、复制FreeRTOS文件到工程目录中
5 Y. F1 c) d. s& A3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹; C! p' ^* O' s8 ~

9 a4 c" a' ^+ V; p" U( s7 V最后看起来目录结构是这样
  r# s( p% l" c% r. `  j. P- n/ k* a1 b- w; Q* Q
20210630232103223.png

% T- U$ M% ?4 }! K) H$ c2 r* F7 g4 Z% t6 B/ Y# d" [
+FreeRTOS
* ~. e, N- q2 M) j! k  X |+include
9 j0 Q. d& v' w% z2 x9 h% O |+source2 Y$ d. e) C5 z! D) x

- _+ I: W3 w. @3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中- [9 w; U; E; O+ D) f

& z6 M4 ^3 X  E9 h; W3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中7 J. B; k; ^- p+ X' q' E. J$ K

  J$ c/ ]' L( L# I  h3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程
9 j' N1 o4 @8 Q+ h4 V- \+ }- f/ D/ \- S, z: a- O
3.5、新建一个FreeRTOS/source,把所有的c文件添加进去9 M7 N0 @7 @' h* V

3 S7 Q9 j$ D! e: [" b
20210630232815686.png

' L- d( f, v' g% b, f, Q$ W9 z
/ Q2 V+ M  Y+ F& K4 N2 G3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"( d/ Z4 i0 U/ h7 H6 c0 t5 `
) w& P5 _$ p% n" m
20210630232918944.png
6 x) Z& C1 o/ H  u4 ~3 A$ {* u$ u# G
: S' X4 F) ~  {, ?
4、修改代码
2 I4 e5 h; r+ s% K0 M8 L4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次
0 p# e8 A' X* R
' ~$ V7 L# h, x2 y5 o' K" H% @4.2、在main.c添加代码,添加任务* z' p* o2 C6 ~  o$ i2 x

. v0 [- Z6 G: R/ j$ |
  1. /* USER CODE BEGIN Includes */, q3 H+ t& d# P% F* h1 ]4 S) b# \
  2. #include "FreeRTOS.h"
    # A2 E. h, V; n
  3. #include "task.h"; l5 M0 q0 [; w0 L, n$ V
  4. #include "queue.h"1 `& i2 M9 q* O. Z& V
  5. #include "semphr.h"- ^7 t$ P5 D6 l" j0 G
  6. #include "event_groups.h"+ S/ X5 U5 C! V, H, T) S* {9 j
  7. #include "timers.h"; ~$ {7 t* t0 q* ]. H' y

  8. 8 I8 l$ k' C) B
  9. /* USER CODE END Includes */# x0 R) z" l0 @& ?
  10. *+ [# K4 t# c# x0 x
  11. *
    2 N6 G4 g) O  r; p, R  ^
  12. *3 {) `( @4 h" \2 ^* ?, X8 Z
  13. /* USER CODE BEGIN PV */1 q" B. c6 \$ H8 J: n4 G# x7 [2 N
  14. static void Send_Task(void* pvParameters);- ]: j8 E; ?& ^) P0 @+ z! q
  15. static void Callback_LEDTOGGLE(void* pvParameters);
    $ @( F6 B( j# E, U1 i- u

  16. 3 g: `7 c1 _: t
  17. static void AppTaskCreate(void);& k& s' S  S) b  ?9 y
  18. 3 o3 s7 f  W0 A; ?. w' x

  19. 5 p4 R! a3 |7 p0 d, {
  20. /*Task Handle*/  Z  f+ {7 I9 i  q' A8 U& g
  21. static TaskHandle_t AppTaskCreate_Handle=NULL;) M1 E8 {9 O$ f( j: j
  22. static TaskHandle_t Send_Task_Handle=NULL;       //PRO:3, Z, ?9 Z; e3 I8 A6 W/ r6 Y
  23. / K$ S- q/ Q4 l" j2 P( o
  24. 4 N% z# G7 h) J) G" f
  25. /*Timer handle*/
    + D0 G3 k. D7 C6 ]
  26. static TimerHandle_t Timer1=NULL;
    ; ?; D; x4 d' ^% E8 R

  27. & e: z" k) W7 F2 T2 j: o# M
  28. static void Callback_LEDTOGGLE(void* pvParameters)( I& ^; |+ x' u$ D7 Z
  29. {8 Y; R$ C! j) o9 z0 b: j/ `
  30.   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
    : B8 p) K# n& v% g
  31. " [6 r8 U" p' Y) T
  32. }1 a  Z6 l: z; C- m7 @% x& F
  33. /* USER CODE END PV */2 @. s+ q4 H, j4 n. x; B4 l, ?
  34. *
    + C/ M- e0 s/ m+ _$ ]. x7 J7 e
  35. *
    " J" A$ ^4 Z9 d* ^/ k% Z
  36. *8 s* ~& H) P- L$ a$ {! ~, m
  37. int main(void)
    1 I+ a$ j+ g4 O! h& m# D9 S' M0 j
  38. {6 r7 z  x0 x0 p3 X" ?
  39.   /* USER CODE BEGIN 1 */( u5 F' ?2 E, ?6 E6 v
  40.   BaseType_t xReturn =pdPASS;
    ' {. i3 o8 m. Y( J5 s1 E
  41.   /* USER CODE END 1 */- N" H* g7 o1 }$ N
  42. *
    4 V! ?2 C1 g. x2 a" _
  43. *
    1 u6 L1 l5 u8 Z& M3 X, \
  44.   /* Infinite loop */
    ( A' s7 E! W0 X. w& K% p1 e. R/ T
  45.   /* USER CODE BEGIN WHILE */
    7 U  J$ }) h5 G8 |  z
  46.           xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\8 k6 }" a! @$ l, S7 u; J5 l7 c1 d
  47.               (const char *)"APPTASKCREATE",\" [+ ?: `$ y7 E  D2 j1 x
  48.               (uint16_t)512,(void*)NULL,(UBaseType_t)1,\
    . Z4 B( R% B, M7 N( o* ^. Z9 L
  49.               (TaskHandle_t*)&AppTaskCreate_Handle);
      P! C8 I1 P' g8 I, x2 Q% e7 g1 u
  50.   if(pdPASS==xReturn)! p5 h* l( K4 B
  51.     vTaskStartScheduler();9 S% }, G6 @+ w7 f+ O6 ^* ^
  52.   else3 ?7 s: F9 Q! V6 |1 p. a
  53.     return -1;) V% J8 C4 u/ ]
  54.   while (1)6 _* e% b- o+ W
  55.   {. d, d8 Q* Q. l, Z: T
  56.     /* USER CODE END WHILE */% V: E# |9 s6 N: B/ y) \- \
  57.     /* USER CODE BEGIN 3 */
    9 Z9 X5 J  x! G4 r/ N/ g2 k
  58.   }: p! |! u% e( E- T* ]& {
  59.   /* USER CODE END 3 */# [3 e# Q2 X, t6 }6 L; S+ b2 B8 _1 R
  60. }
    . U% L) r! |9 {( R

  61. 5 M+ K5 z3 K  e* m4 Q0 _
  62. *
    ) ~) H1 `: B, r4 Z, f# L
  63. *
    ; t$ e4 X6 j/ [/ Q) ?+ d

  64. 6 ~+ L" w  l: g$ T* |
  65. /* USER CODE BEGIN 4 */- k- D, v- }2 Q) X$ K% O0 ~
  66. /***********
    1 _% @: v. t1 m: w- F3 a" V5 y2 h3 u
  67. *@Function name:SEND_Task. j* l; n6 p+ v- y
  68. *@description:SEND_Task body; Z1 |+ ]! I$ s, B3 \# `1 j
  69. *@Parameter:None4 N+ V0 ]  K; o+ v
  70. *@return:None( z/ V7 I+ J: ~
  71. *************/
    " o4 k. n" A' t& b  y
  72. static void Send_Task(void* pvParameters)4 i& |0 j- Y9 X6 v% Z7 I
  73. {
    6 f8 ^; O* q( ?! z1 h& H

  74. ; [! P3 @" L5 E4 M2 |) [5 L# N
  75.   while(1)
    , a$ K# R  d2 n
  76.   {  + K# W0 T+ X7 |+ Y
  77.     vTaskDelay(100);         //Just to demonstrate task switching.8 L) m6 a7 r7 n3 I$ P( N
  78.   }; J# i) s+ h8 s# u
  79. }( D5 u, ]9 w& ?4 \% D
  80. " M* N4 |" j: D
  81. static void AppTaskCreate(void)3 d* b: a6 b( z/ N5 k$ Q+ s( N
  82. {  C) M) E, m8 T( [0 D3 v- J
  83.   BaseType_t xReturn=pdPASS;4 Z& Q( ?& B( P5 H2 o6 J
  84.   taskENTER_CRITICAL();0 k/ n+ d& x: s; r/ R6 B

  85. # I+ W3 E) A% c% B+ i
  86.   /* Create Timer1 Handle*/- _  |3 T- A  s8 p# y9 V. @
  87.   Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\2 Y4 F7 V" m. D2 w) Y6 a
  88.                      (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);& H) d6 \+ f9 v$ q  c
  89.   if(NULL!=Timer1)) U( B/ `1 C# m/ x' U0 e4 i
  90.         {}/ g' P. p, Z4 b, Z! D! d
  91.   xTimerStart(Timer1,0);: i2 s+ t$ J, C) Y$ W, U$ [/ J9 q
  92. , i+ X  e6 U3 a" r! X3 s
  93.   /*SEND task*/
    9 ~; P  r/ o& V3 S1 o: P6 h9 V
  94.   xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
    9 a" z+ j! X1 @- F" R, i! `  B" {' e
  95.                       (const char*)"SEND_TASK",\
    5 E( e! X  _' J  q( H
  96.                       (uint16_t)512,(void*)NULL,(UBaseType_t)3,\% w. k( i: ^; H) ^3 h) j. ?
  97.                       (TaskHandle_t*)&Send_Task_Handle);
    2 y) v) k& @- q3 }
  98.   if(pdPASS==xReturn)  u0 F9 Y6 q: N3 d- L
  99.         {}9 |+ e6 C$ U5 N* {6 I& R1 ]- _

  100. * _9 @5 M9 }& O1 }4 K; e6 L4 i
  101.   vTaskDelete(AppTaskCreate_Handle);* |  g. N+ r: Q; t3 h
  102.   taskEXIT_CRITICAL();
    8 m5 E/ l# n( v
  103. }: k: N1 Y& S: K% K
  104. 8 R7 C* a# c$ E) X) g
  105. /* USER CODE END 4 */
复制代码

  G& j" s# G" D4.3、编译烧录。
( |5 s0 f' [7 W$ I* u+ j- Z; f! M) z' r4 e. Q6 A& k2 Q! Y
8 `) T: i, Z3 p6 E; k6 i
收藏 评论0 发布时间:2021-11-8 15:32

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版