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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 15:32
1.准备FreeRTOS源文件
1 F% v) h2 q5 S* b1.1、到freertos.org下载最新版本的源文件,链接地址& X" k3 ~. C0 ?9 P

( l1 q; Z+ a3 e/ L1.2、FreeRTOS 文件结构如下:9 p8 ], O  F3 |+ D
! J, c, t2 _. C% Q* D- N4 e8 J1 j
需要用到的是粉色的头文件和翠绿色c文件。8 }" V, B3 D  E5 A; b5 z

) x  V- Q% ~2 F* @4 E3 m
20210630230907158.jpg

$ R2 z4 a+ a4 B% e( ?( W8 _% }  j3 @( R( S. t
2、使用STM32CubeMX生成初始化代码(BSP_Init)
7 }, Z1 S" ^, N! H+ X2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)3 y6 g! T+ h0 s0 d6 ~
" [! R, O8 Y. F' {6 T
2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档
* f& z" c8 Y# b, w1 A$ l# O8 J! g% K" s$ d0 r
3、复制FreeRTOS文件到工程目录中! r: s! k0 u0 N* L" ~! s
3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹" U; }9 t5 F* y
" O# L- i2 A. L* ^
最后看起来目录结构是这样) O( s) g1 S" M  H- b  X( B

# `; U& J: B9 Y6 Q
20210630232103223.png
( C+ G8 s+ B- r+ A) k1 J) U

3 |% R3 `/ w; T8 Q" L- X9 A- a+FreeRTOS
. N/ o: a6 j6 j# `& |, R |+include7 M: m2 J2 f8 ]* r+ a" ^* d
|+source/ s- g- N: |- k

# {% P. ?0 ^( v  s- H$ U2 g3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中2 U$ U& b* f6 |( Y
1 D( |% p$ }* a: j/ A7 u$ y
3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中  E# `0 H7 D# Y5 ?

4 I1 I9 I# g2 Y# |6 s3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程
- H: H% w# F! e" r* v7 R) P+ I' ~% j. U7 a, {* u/ m
3.5、新建一个FreeRTOS/source,把所有的c文件添加进去
2 C; ~* C5 Z+ F& f* z, k1 V0 Z
; |9 Y+ r8 f. Z' L+ ~  M
20210630232815686.png
8 B' a2 b6 T2 w3 ]8 M: P4 X
- m3 u& @: ?: f# S
3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"
9 {4 @7 k) Y; n
. e' N& Y+ ]& T' p
20210630232918944.png

0 r" N8 G' K- q
! z0 U( C6 }% u+ f  g. G4、修改代码4 `4 R" K/ D: b. o  j6 Y
4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次
) u" K6 x  \% X) p$ X: O+ ^3 ?) y* d/ |0 Q. b
4.2、在main.c添加代码,添加任务8 S% x" s+ _4 b- h6 S+ k$ p

, F4 `0 C* ], @
  1. /* USER CODE BEGIN Includes */
    ) ^" E- H  |; l& ]3 j
  2. #include "FreeRTOS.h"
    1 v' b9 ^% A& n! }1 ^
  3. #include "task.h"% E5 l! S- Q/ `2 e+ u
  4. #include "queue.h"$ I0 e  ]% P4 {. p9 y
  5. #include "semphr.h"
    * N: y, R5 o, F8 Q- c
  6. #include "event_groups.h"
    6 x: V- ?! K. M4 d+ \
  7. #include "timers.h"
    $ p) G: P4 ~$ Y5 _- l' K
  8. 1 }' G% G5 P" [  Z; w
  9. /* USER CODE END Includes */& |: U  U; x" M/ e8 R/ d5 h
  10. *6 |9 }% ]( Q2 {6 k( d
  11. *) t/ ^! o& I& P9 ]- Z
  12. *
    # T6 L: W/ M' n7 M
  13. /* USER CODE BEGIN PV */7 U, K- x+ a0 z' F1 Q& z' g
  14. static void Send_Task(void* pvParameters);
    . y. g3 L# g5 e2 @4 a; b
  15. static void Callback_LEDTOGGLE(void* pvParameters);( P9 i; b$ k! v4 S  \7 J0 K- j9 r8 Z

  16. # f/ K! K( l7 G1 J0 W
  17. static void AppTaskCreate(void);. _- e' p5 S  v

  18. / ?/ c) W0 `" U2 e+ l

  19. 5 Q* s: N! K, v# G- z6 q  Y/ l
  20. /*Task Handle*/
    & ]7 p: c5 T( |  [" ?, ]2 \
  21. static TaskHandle_t AppTaskCreate_Handle=NULL;- q6 a% ?7 o: j0 [: A" e
  22. static TaskHandle_t Send_Task_Handle=NULL;       //PRO:3/ {1 A& r' f: S/ q, Y+ w2 R: D

  23.   ?9 J# a: S/ p. m
  24. 7 t, q! K) Y0 X
  25. /*Timer handle*/
    , k$ w6 ]- C, X
  26. static TimerHandle_t Timer1=NULL;$ p$ A% d8 y* y  e  y! `8 c

  27. 0 g5 f; v9 p) n& |! o8 r
  28. static void Callback_LEDTOGGLE(void* pvParameters)
    ( d* L4 Z& C5 a; v$ q  U! T
  29. {; f9 Y2 w. \( m) M
  30.   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);& X& {4 X  ^& p: I
  31. 8 H! P9 ?. p& e! Z( C; m
  32. }4 z8 v& S7 }, U# y
  33. /* USER CODE END PV */
    : _, V- a/ f" ~
  34. *, r3 p* S! U+ x" _, J
  35. *0 l! p* e  F5 f  U
  36. *
    6 ]" h$ i6 h) o% Q# j
  37. int main(void)
    ! \& D2 f* _4 T6 l0 l) Z9 h
  38. {
    7 O# N) P9 A5 c1 A% r! \2 m
  39.   /* USER CODE BEGIN 1 */
      ~$ @9 Y  G3 c& O( S. Q
  40.   BaseType_t xReturn =pdPASS;* c7 K9 L3 A/ y( K- O
  41.   /* USER CODE END 1 */7 y  L9 ?" u9 P. }; R- Q( D- l* q7 ^* A
  42. *1 `0 |0 l4 B' w! j- [6 w
  43. *
    % k! K& \" b" V( _1 e, k: G
  44.   /* Infinite loop */+ ^% l) E9 u, O1 G, Z% D
  45.   /* USER CODE BEGIN WHILE */6 G( T  N; E1 s1 B& v
  46.           xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\" q' W" K# [1 c/ H* v* i; w
  47.               (const char *)"APPTASKCREATE",\
    $ b2 X( A1 z3 J& w# {
  48.               (uint16_t)512,(void*)NULL,(UBaseType_t)1,\
    1 x5 H2 M6 S& I0 M& @4 w" r# p
  49.               (TaskHandle_t*)&AppTaskCreate_Handle);) S$ h+ H7 [4 ?( n
  50.   if(pdPASS==xReturn)
    3 G% y! M/ w$ }4 @/ X
  51.     vTaskStartScheduler();
    / k6 x2 `. W% I. B* u8 g
  52.   else% ?  E4 L! e, A2 d0 ]
  53.     return -1;
    : y5 |% A+ q, \9 O) S$ l9 O; R: `) t
  54.   while (1), s# t: ^/ J3 _4 O2 d5 F
  55.   {) z7 ^- p# w( b6 p8 J; G# u
  56.     /* USER CODE END WHILE */7 O4 v" _  A& N  \2 l
  57.     /* USER CODE BEGIN 3 */
    $ n  i. _* N; ~& J
  58.   }
    / g4 h: p; v6 q% I
  59.   /* USER CODE END 3 */+ g- X8 l- n: S3 w+ H  e9 W
  60. }! X6 g, R9 q+ Z" d$ x/ m  i' v
  61. 6 Q' M/ H. f- A7 j
  62. *3 a* z0 a9 s7 F0 E& o0 |# l
  63. *
    4 W3 C2 D: x( l" x) x* V) Y

  64. 3 |6 k/ D) Q; Q. a0 A
  65. /* USER CODE BEGIN 4 */
    . g8 A  v7 ^- o. z8 q$ [) S  ?
  66. /***********
    6 ^& ^) x* p$ s; Y
  67. *@Function name:SEND_Task
    + I5 X' m' }, |2 j1 J
  68. *@description:SEND_Task body" o* y* H1 ~1 J2 d% n! s
  69. *@Parameter:None
    7 j/ v& U( G" X/ \& L
  70. *@return:None0 N6 T) M' G1 H5 M. P# [
  71. *************/2 {5 T; h7 r# r' X- n& _
  72. static void Send_Task(void* pvParameters)) A" O  v- U9 {  o' s, d
  73. {# F. G  I7 h3 ^8 r' V
  74. 7 h5 [- B4 y5 @
  75.   while(1)
    ' X8 B% \4 ]5 e
  76.   {  
    9 a( b# S. U: a7 a  c
  77.     vTaskDelay(100);         //Just to demonstrate task switching.$ \) M4 _7 }. R1 x. S. Q
  78.   }8 r( G$ {  T, N2 m
  79. }
    9 d* E/ {2 U) {

  80. $ p+ O" I) s$ Z! n7 y
  81. static void AppTaskCreate(void)
    " ^6 _# F8 t, F0 _5 O& A5 E
  82. {
    ( {0 N2 j- ~' D' }4 h
  83.   BaseType_t xReturn=pdPASS;  o8 e3 T4 L* Z- `% h5 P
  84.   taskENTER_CRITICAL();6 F: j+ L( v+ V4 A  l7 f
  85. 5 P/ ?( d( o; H( H* v' z9 z8 U
  86.   /* Create Timer1 Handle*/. w) P1 t. \1 A% H
  87.   Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\+ H% r/ g8 _- [; b, J; m6 C
  88.                      (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);5 r0 @7 ]7 }9 W' N9 I: m
  89.   if(NULL!=Timer1)+ \/ G: {$ o/ A9 d0 T! N
  90.         {}
    3 U4 R" n/ R: B+ l
  91.   xTimerStart(Timer1,0);
    % [2 ]" ^& M, B( o
  92. ) E( X& N8 C* F  }1 I
  93.   /*SEND task*/) w+ ]) N8 B6 l* O8 y+ @
  94.   xReturn=xTaskCreate((TaskFunction_t)Send_Task,\+ V3 _$ k- ^7 Q8 c, ]- y. D
  95.                       (const char*)"SEND_TASK",\
    3 R$ y) q5 N0 M0 J& n2 P
  96.                       (uint16_t)512,(void*)NULL,(UBaseType_t)3,\( {/ g, Q' l/ I* m8 @6 _# o
  97.                       (TaskHandle_t*)&Send_Task_Handle);
    & M0 `' U4 i3 t4 \4 Z; y
  98.   if(pdPASS==xReturn)9 u; c! k0 x0 k  x' ]: E) `
  99.         {}
    / R$ j0 q7 J5 G4 _" E. m& d- S# _

  100. / [$ B. a# \+ K- d) h+ G+ ^" ?/ ?" X
  101.   vTaskDelete(AppTaskCreate_Handle);
    ! `; \2 U% g' k, x
  102.   taskEXIT_CRITICAL();  R2 v3 q2 P1 M- k, c; Y7 @8 S2 @; _
  103. }+ U1 O  i, B( q# H! t

  104. 5 y# V7 j% w9 F; `9 `9 b
  105. /* USER CODE END 4 */
复制代码
! W! h. l+ P0 L/ }! G& V
4.3、编译烧录。. ?  K/ P. n9 X0 d

1 m9 q8 _7 D. G3 k) X) k! \
* E3 [6 B& ^! I1 K+ d. S6 {
收藏 评论0 发布时间:2021-11-8 15:32

举报

0个回答

所属标签

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