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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 15:32
1.准备FreeRTOS源文件
" t3 _5 f* m  Y8 b4 q- y6 a1.1、到freertos.org下载最新版本的源文件,链接地址
+ q& S1 `/ c$ ]3 @6 e# L
5 _6 b& H; J) I* @! D+ u! [* r1.2、FreeRTOS 文件结构如下:
8 k7 [) |" b1 }; N( o3 l' m$ S
/ W; w! g( M! ~; V6 n( D( n1 B需要用到的是粉色的头文件和翠绿色c文件。! M3 {  ]8 g6 b. @  Z

/ U1 X" C! k/ n2 k  z
20210630230907158.jpg

& z* {" |& C2 |7 a8 W) K' z, o
, u5 D  K$ E& R. x" o8 b! W2、使用STM32CubeMX生成初始化代码(BSP_Init)4 C6 z' x4 M) f, f/ D3 I
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)! O  ^- w5 ?+ _7 a6 W) m  k/ f7 Q
) g; n1 D6 j) i: X0 u# o0 }% A) B! K
2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档$ q, L. n" Y, i% O1 }4 I; N
7 ~7 Q9 J, b# b: v  a
3、复制FreeRTOS文件到工程目录中
7 A2 w9 b0 u* y9 U/ h/ G5 L3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹
% `; Y; I5 |% n) p  n! d7 ^7 U7 ]% Z
最后看起来目录结构是这样& F2 ]! \, D- a( c( L

  T) a! o( i0 _% U; q5 t
20210630232103223.png
6 x: c; z+ Z- i
! J& V' \2 Z% H$ ~+ p$ ?: n
+FreeRTOS
( `% d7 ?# Q5 |0 t3 K; | |+include1 S$ o4 ]! l# O) k. R4 N, |1 a
|+source
6 g! }. Y) e1 j1 y8 y( J
, V3 z; b  z. d  L3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中& k+ N2 B6 k6 @
1 h2 p5 D) `- c
3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中
$ m! `  t4 X5 G1 [
- a- q  W; o' ?6 B2 Q- f) {3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程' f6 e0 H  V: d

% X- S: b8 W, D1 M$ q( y+ H3.5、新建一个FreeRTOS/source,把所有的c文件添加进去, K' x  }5 G( H+ z3 {$ b* f6 y

4 l9 D7 e; y; c3 m9 q
20210630232815686.png

, e4 M6 z3 b8 f: d2 m
% n+ q1 q0 u+ w/ Z0 P0 W" @6 s3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"+ O9 T6 Q3 y) @/ s/ Y

, J1 K6 _" k% Z7 ]+ s: d3 @
20210630232918944.png

3 {) u" z# `0 i" v/ G4 n4 A5 @: w# O9 v& Y' `' g
4、修改代码
3 e0 \0 z, }3 d. W, v# M/ ]4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次; \' c% m% X- b" ?0 w

; P$ o* |4 ^2 x7 a/ Z. ]4.2、在main.c添加代码,添加任务" H" @( k! ^+ f& d, o

. h& R: D( T% U" q8 ?& l; W
  1. /* USER CODE BEGIN Includes */
    8 T, m% D9 k4 _, X, h
  2. #include "FreeRTOS.h"
    1 _! H& y* M; s$ p
  3. #include "task.h"; A% `/ T+ I" q& u/ _: m
  4. #include "queue.h"; x, {8 j5 l, Y& {4 c+ \0 c+ w
  5. #include "semphr.h"
    & _" J& C9 y1 ~$ @$ e6 [
  6. #include "event_groups.h"6 |2 q/ @5 W5 F3 W
  7. #include "timers.h"
    % @* f, D8 x3 }, a/ q& N: p

  8. * }2 g8 |+ h5 c: t
  9. /* USER CODE END Includes */
    9 _& Q" k9 q. E* J: d. h6 p) E
  10. *$ T& I5 k. F( h+ _6 h7 Y
  11. *" x9 N( C" v1 ]6 ~+ _. n/ G, x
  12. *
    $ l( g! n( p2 L, {
  13. /* USER CODE BEGIN PV */
    # a1 a$ s# M5 D( |, R
  14. static void Send_Task(void* pvParameters);
    8 S- L% G/ C, ~; ^6 d! A
  15. static void Callback_LEDTOGGLE(void* pvParameters);# S+ ]+ Z2 |7 g; C" T9 Y

  16. / d: A2 G1 ^! Q6 m; {  @
  17. static void AppTaskCreate(void);! i9 H+ a3 x# H) g  g5 K" O3 T

  18. ! |! f" }( v$ i' e* I6 t

  19. - P, S: J% b! r9 o
  20. /*Task Handle*/7 M' U: W1 r! O+ K2 P
  21. static TaskHandle_t AppTaskCreate_Handle=NULL;
    8 g" Z, x" ]$ F0 m- X; U) U/ A' G
  22. static TaskHandle_t Send_Task_Handle=NULL;       //PRO:3
    + f) F& C! T" z) i. X2 A
  23. ( y# n0 e+ m3 _( v) ~. t: D! o

  24.   f1 a( B" b) B- Q& M! m
  25. /*Timer handle*/, X. g, u8 m$ O
  26. static TimerHandle_t Timer1=NULL;
    5 h$ o; I1 b" V

  27. % S/ c' G( |$ p8 C- e
  28. static void Callback_LEDTOGGLE(void* pvParameters)
    % S. t' s2 I1 R+ U9 U
  29. {
    7 x. y1 I7 x' G' g/ O3 R3 ?9 r8 Q$ j
  30.   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
    ( B3 U; S4 n, }" [. t

  31. 5 O( `' d  k# J
  32. }7 |- m* Q3 Q2 j2 f& r2 O( Q
  33. /* USER CODE END PV */) S4 f8 I, v: w
  34. *
    9 v; g; p: z7 e7 ?. D1 b$ y
  35. *# G+ I9 m. V' {# ]& c% [/ j% z
  36. *, O! D( @( n: Q6 H. b  |: H
  37. int main(void). G+ z, Q7 j3 s4 I/ Y) ~0 J( Y
  38. {! o; a8 K( f  c% G' u+ T
  39.   /* USER CODE BEGIN 1 */4 i0 q; @, K& \) g8 Y% H
  40.   BaseType_t xReturn =pdPASS;  P9 H" ?* y  p( o
  41.   /* USER CODE END 1 */. S3 r( Z: u- G/ G4 }) v4 r$ z
  42. *7 q! s( T0 v; b  u: n4 ?' y- F
  43. *  e6 M/ x. A& \6 p0 N& F( J3 d8 w
  44.   /* Infinite loop */
    / m" I$ M6 X- S9 p' u
  45.   /* USER CODE BEGIN WHILE */
    3 i) ?5 _" l1 j9 s! T
  46.           xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\
    : T7 [- }0 Z: ~. k2 n) L( i+ X3 N
  47.               (const char *)"APPTASKCREATE",\* q: l" g4 y  J9 o
  48.               (uint16_t)512,(void*)NULL,(UBaseType_t)1,\. n$ v) M! d! y  h
  49.               (TaskHandle_t*)&AppTaskCreate_Handle);
    % F: h$ d) Y6 Z3 \
  50.   if(pdPASS==xReturn)7 b  l0 g, @. d. L5 @
  51.     vTaskStartScheduler();9 I, `- Y+ M# H3 `# l5 E5 P
  52.   else' K2 i: F- U0 Y# D
  53.     return -1;( }' l' W% [1 f. a* q* J/ K* w1 w
  54.   while (1)
    6 \2 E! x" K9 N1 }, E' e7 l
  55.   {
    & _( s9 q3 S8 v0 y8 a
  56.     /* USER CODE END WHILE */
    , @9 r( a  m+ n0 Z9 a
  57.     /* USER CODE BEGIN 3 */# {. i" u! b0 N4 ~& k( C
  58.   }4 I' D& F5 Y* p) z2 B
  59.   /* USER CODE END 3 */  I  q6 ]+ F' j" _
  60. }
    3 B  @% I) ^+ J! E8 ^+ @; w- g

  61.   v0 F3 i8 x" }3 V4 x
  62. *  g7 ^5 e  b% P9 O- M
  63. *
    2 X6 g/ @; j6 t* m, \

  64. , r  W. V( x, O# j) W3 K9 N, p
  65. /* USER CODE BEGIN 4 */% ]! B; X5 L8 ^& y1 ~$ }! v
  66. /***********2 }! J% q9 b% h; f& q% z' \$ W
  67. *@Function name:SEND_Task: r, {3 d1 w0 q* a9 A
  68. *@description:SEND_Task body
    : j1 T# `0 [9 }) l5 T
  69. *@Parameter:None1 E$ g0 C" t/ ]- W8 j
  70. *@return:None
    7 g/ H( K9 }, h# Q: p
  71. *************/
    , P8 \# {: A2 r9 a
  72. static void Send_Task(void* pvParameters)
    6 C0 [" ]4 ?0 e& ?% @* A
  73. {& i( i( m+ s1 z4 e: }; H* w. B
  74. 3 {* F# Q+ p' K( [) H# ?4 m) ?
  75.   while(1)5 h) P+ K* s' C; h( V: |5 O* D
  76.   {  
    ' `& k1 e$ k7 d8 a+ v
  77.     vTaskDelay(100);         //Just to demonstrate task switching.
    6 |( s8 I- R" N( ~1 p7 L4 y
  78.   }. X; j9 k  |" A) B
  79. }
    " M4 z' Z1 T( {$ P$ A1 w& l) G

  80. ! O  r# h( n4 n! i" G& R) Q1 `0 L
  81. static void AppTaskCreate(void)$ B, B5 e1 Y) ^, a* v& L0 E
  82. {
    $ D; d% W; P9 \9 g1 b
  83.   BaseType_t xReturn=pdPASS;
    ( C- q6 A8 R1 P2 W6 S
  84.   taskENTER_CRITICAL();
    ) m7 B4 P  y8 G* h
  85. 1 z# ]& ^1 [8 d4 n6 S; H: ?6 j
  86.   /* Create Timer1 Handle*/  \' [& D2 s/ T6 f% C
  87.   Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\% w( v! T$ E4 m
  88.                      (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);
      L/ `' O1 }" ]0 ?0 [. R
  89.   if(NULL!=Timer1)
    1 W. @! C7 x$ l7 @6 j
  90.         {}
    + U( j$ H5 z. e4 M& Y* ?
  91.   xTimerStart(Timer1,0);
    ; L  P2 Q& F& ^& K* ^+ `
  92. " f9 u# I6 t7 {. f$ M1 p0 c
  93.   /*SEND task*/$ C+ M/ M+ S* I; Y# d; N
  94.   xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
    9 K/ L, A5 [) D$ j4 D$ L+ d; K
  95.                       (const char*)"SEND_TASK",\
    1 o$ w. {& ~  R8 Z& n: C
  96.                       (uint16_t)512,(void*)NULL,(UBaseType_t)3,\
    # H7 c5 [: n+ [$ ?- V* E9 y
  97.                       (TaskHandle_t*)&Send_Task_Handle);7 b, l0 ^6 O( \2 ^$ H4 ^7 t
  98.   if(pdPASS==xReturn)3 o# u" [& E' G. Q) m+ D
  99.         {}# e: l! u# E( D$ @5 L

  100. ) I% |' O5 U+ F- i1 x/ V( i& A# K
  101.   vTaskDelete(AppTaskCreate_Handle);2 R* i9 J5 B9 `* Z
  102.   taskEXIT_CRITICAL();0 `/ V, T* D) ^6 Q1 U( l9 ^
  103. }9 e8 a) X) S. K. B/ q
  104. $ l6 O) I& J; Q* D" r
  105. /* USER CODE END 4 */
复制代码
8 ]. X$ X2 R" F7 c
4.3、编译烧录。3 D* l( S, b0 n* v  i. I& Z

) J6 i" t9 T5 Y9 t$ L/ ~! z8 J3 M: C( k3 m% v  a9 o. ~
收藏 评论0 发布时间:2021-11-8 15:32

举报

0个回答

所属标签

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