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

STM32G0学习手册——移植FreeRTOS v202107.00

[复制链接]
STMCU小助手 发布时间:2022-10-28 15:35
1.准备FreeRTOS源文件
+ D: i* p9 v" v% K# `5 l1.1、到freertos.org下载最新版本的源文件; a+ r+ m. @$ g3 K5 h+ c& ?
2 D( r# ?, u. _8 ~( w
1.2、FreeRTOS 文件结构如下:6 b: ^, e* V; t. f& V, F

( `8 Y& |+ Z1 S6 |  @3 R7 q. a需要用到的是粉色的头文件和翠绿色c文件。
0 f8 O- Q9 j" J( @
; ~3 [/ n, S5 X 20210630230907158.jpg " R. E7 t% ?4 ^8 T0 l* ?

" c/ l0 n/ m# [2、使用STM32CubeMX生成初始化代码(BSP_Init)  u& Z3 h$ E" b/ l2 M
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)% S$ e% W- Z: b
/ R& X, y* i! e
2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档- i7 P' C7 t3 u5 ^+ e

6 E1 ^3 r4 A: \3、复制FreeRTOS文件到工程目录中
. `: K, {: h% i+ u& l; s* T3 J8 {3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹( H1 E3 Y" g4 F
8 [' Y3 P" X0 y
最后看起来目录结构是这样
! Y- E$ ?; Y6 r* I% f0 [4 f# y- A/ b
2 p# k% p& H! u 20210630232103223.png
! |+ }( s# z- v; a- O0 Y7 m1 \( f$ d% S2 J6 U: \3 q* ~! _" S
+FreeRTOS
8 I9 f, ?9 I0 s7 a2 W% Q |+include5 ?0 A" B5 U$ ~) P9 I% Q4 N) }' t' N
|+source
, r+ W; i( q( a4 X' a8 v! l
6 v5 g) z7 B2 v5 c& ]  a( j4 c3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中; P- x% x0 C& E, G3 G; g
5 N" C! f/ p- e. |$ O& h
3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中
) f  ~  O' G# C7 J) L# F+ t
4 m. y. K4 ^. A( L8 E$ z$ i3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程5 `& u7 i, Q4 I: J3 f# u
: {& c# L+ N+ a% z& L) v1 r* z
3.5、新建一个FreeRTOS/source,把所有的c文件添加进去
, V( Y. f% Q4 x
) l% z2 M* k5 ~: S2 _ 20210630232815686.png 9 J2 _5 @4 g/ y* K. |

8 m. w: d* T6 I% S. X3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"0 ?1 ~! _2 r2 }7 s! @
: g- Z4 V- n3 O
20210630232918944.png ; Z/ }. O# O" A1 ~' {

7 p0 ]' P) ^6 g' E; d7 p6 k4、修改代码  x+ x) l; l/ ?% i
4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次3 l6 H+ R5 e* }! o* D3 I) [
& R3 Q/ g' e9 r3 z& u0 H
4.2、在main.c添加代码,添加任务# b( k6 d& t8 S# @4 P

. n: T: b! r6 g6 Y0 z  k
  1. /* USER CODE BEGIN Includes */# y( B. s# `! d, f# A$ P
  2. #include "FreeRTOS.h"9 B" U0 Z2 W9 N2 _: j
  3. #include "task.h"  m# Q1 B. n0 y4 T3 D  v
  4. #include "queue.h"
    % A. S4 x: @; |* v. w
  5. #include "semphr.h"3 I2 n, }; `7 \8 n
  6. #include "event_groups.h"& a0 L$ K; Y& [5 y* U1 w
  7. #include "timers.h"
    , m* p  t' `0 b9 H; g

  8. ' ^) `" x) M& g
  9. /* USER CODE END Includes */
    9 F; U, e8 t. n; Q7 u5 y( I
  10. *
    / B3 W( T/ M  _* M" F9 \
  11. *
    + b3 _! v% K7 _/ @. B
  12. *
    4 b/ d3 s. B) r" j1 Z" s8 O  `4 h
  13. /* USER CODE BEGIN PV */
    8 x( ]) ^4 M0 }$ V5 `* z3 I7 Z
  14. static void Send_Task(void* pvParameters);7 V% K, s; N8 v) z
  15. static void Callback_LEDTOGGLE(void* pvParameters);( w0 k( h% e' ?6 q/ |% s0 t

  16. * |8 Y1 q4 A6 Z, y& B. _$ ^* d. H1 M
  17. static void AppTaskCreate(void);  ^2 {; j( ]+ q! p

  18. " P: J0 Q: |6 Z0 v0 A3 S& X0 t3 H

  19. : i0 M2 ]: R; [1 _* i
  20. /*Task Handle*/4 r2 S8 C: G1 i5 X1 t& A% l; u
  21. static TaskHandle_t AppTaskCreate_Handle=NULL;
    5 ?. ~8 ^- _$ U
  22. static TaskHandle_t Send_Task_Handle=NULL;       //PRO:3
    7 O# p$ C% H% V* G

  23. / i  \8 H: ]0 O0 F1 Q* s3 g
  24. ) d1 e2 Z) c3 S6 f: f
  25. /*Timer handle*/2 B5 o! X9 \3 D1 O% ]% J
  26. static TimerHandle_t Timer1=NULL;2 J* C7 D  |; B/ r- T, @. m

  27. ; J7 i( M1 A# J
  28. static void Callback_LEDTOGGLE(void* pvParameters)
    ; a5 I" o1 r  K" ^( v2 n
  29. {3 i, y$ O; F8 a+ z! _" b' c
  30.   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
    ) r. ^& t: j- z: e. U/ U

  31. ( m  J& a" w" V) \2 n% h
  32. }; `9 _& o4 @4 X1 U# z
  33. /* USER CODE END PV */
    + S& p9 D. L" ~- T
  34. *
    . K+ z1 k6 B9 I
  35. *: Y( k/ K' V6 }# o" X8 [
  36. *
    * D6 p5 |! @# e
  37. int main(void)8 V8 g% H+ q9 }! a/ M
  38. {
    + T. ~: r$ U9 f
  39.   /* USER CODE BEGIN 1 */) |1 o1 Z& E# Z, `: O
  40.   BaseType_t xReturn =pdPASS;% z  K9 U, ]0 q6 B! D
  41.   /* USER CODE END 1 */. H1 [9 ~* t, ]' H. W$ C4 w" g
  42. *
      n' V6 ]; r% r% ~5 R9 q, ]. K
  43. *- A3 x  K. X% k: T' C
  44.   /* Infinite loop */
    * {8 B! [/ {8 Z4 M
  45.   /* USER CODE BEGIN WHILE */- K8 n- |9 X$ }3 l% |- y5 t" r$ I
  46.           xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\/ {: B: ?/ ^% s! v% H, C$ V6 Z
  47.               (const char *)"APPTASKCREATE",\/ f3 C, d! w$ x6 M# D
  48.               (uint16_t)512,(void*)NULL,(UBaseType_t)1,\+ j. [" F/ ]% L( r1 a' L5 h
  49.               (TaskHandle_t*)&AppTaskCreate_Handle);5 l# X: Z$ ~" L* x/ Z" x1 D1 ^
  50.   if(pdPASS==xReturn)
    : k6 M/ a( ^* E4 n
  51.     vTaskStartScheduler();, ^+ Z; N. B4 C1 s
  52.   else
    8 }+ }) I( T0 Y7 Q+ `' n3 S/ k
  53.     return -1;
    6 \4 T1 V1 R8 C6 M5 t1 h" N' ~8 V
  54.   while (1)4 D, @( p+ A5 \  L5 [9 J! _
  55.   {
    7 L. }) L9 W% L6 ]* O8 x7 n. Z
  56.     /* USER CODE END WHILE */
    * V; H9 Q9 ^3 b# l! F4 {  P! t
  57.     /* USER CODE BEGIN 3 */* ]1 ]: ]8 e1 o! _- j
  58.   }- o- ^$ B" C% N5 ^
  59.   /* USER CODE END 3 */$ l9 ?6 D$ Z/ K/ v
  60. }2 _8 _% `5 y( T9 W- e9 J  I
  61. " {7 e1 s) q3 \8 ]
  62. *
    2 @# a9 p% Y. l* r6 n8 @
  63. *
    ( `, T: `+ O" w7 W/ T

  64. ! K8 W" y. L; o  |
  65. /* USER CODE BEGIN 4 */
    % d$ F  R8 s1 M* {
  66. /***********5 z, M, N7 h3 P* s, O5 n* b7 W5 K5 s
  67. *@Function name:SEND_Task
    : f! \7 [! b# S  d& L4 C
  68. *@description:SEND_Task body
    0 H: Y- I" ^. R
  69. *@Parameter:None
    6 N, h% ]8 e1 A. J3 L# d
  70. *@return:None+ l9 O% _* [# X% t( h
  71. *************/# w. N% x8 ]. [& U* _0 f' U
  72. static void Send_Task(void* pvParameters)1 G  B5 ]8 v4 d- [+ r) U
  73. {( y! v) B1 D' g  T! d; A

  74. , @0 E( G- ^+ o# W
  75.   while(1)' n) _7 [& [. j8 i) Y" J
  76.   {  
    + y- b. [* E( b3 p
  77.     vTaskDelay(100);         //Just to demonstrate task switching.
    . c4 O1 ]. n0 `+ ^; _
  78.   }8 I1 E. W3 S6 R$ ~9 }
  79. }5 B$ G8 h2 |; ~7 Q) B5 E, c8 t* T

  80. 8 d- i4 r, R3 k, [' Q( a
  81. static void AppTaskCreate(void)$ W% w/ T4 m9 Y
  82. {5 O7 q" Y1 b2 [! w4 O! |
  83.   BaseType_t xReturn=pdPASS;7 g5 k5 [0 R5 y% G5 b' _
  84.   taskENTER_CRITICAL();* Z8 j; w$ k8 M5 `" n- D8 s/ r9 B
  85. , m/ g: u$ X! m+ i
  86.   /* Create Timer1 Handle*/
    9 f/ v2 V, i9 C* P" ~' A
  87.   Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\3 o9 o% N. O. \: f+ h0 C; `/ ?
  88.                      (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);
    8 y9 z. ^- Q- W5 L7 j8 ]2 `# U
  89.   if(NULL!=Timer1)
    # v; @% ^: w- H/ Y
  90.         {}/ u( j- B0 }: H8 H6 {: m
  91.   xTimerStart(Timer1,0);: e- b& x2 t& k

  92. 3 c: C2 B/ q4 C8 P( T8 u( b3 m% V
  93.   /*SEND task*/
    7 ]" H8 Y+ x  d
  94.   xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
    ( w( @. v& p& M2 A& `
  95.                       (const char*)"SEND_TASK",\" e/ n$ Z* l8 l! u
  96.                       (uint16_t)512,(void*)NULL,(UBaseType_t)3,\
    / M! ~; Z( m! i: L$ \3 b2 y
  97.                       (TaskHandle_t*)&Send_Task_Handle);
    3 k: j" V. W5 s4 m2 @) R8 z& ]$ [
  98.   if(pdPASS==xReturn)0 X, H, M! k- I) L+ b0 |4 ^- J
  99.         {}
    1 v" ?9 O5 ^. u1 s6 @

  100. 7 W4 I0 b# a3 m7 W( t
  101.   vTaskDelete(AppTaskCreate_Handle);7 O5 |+ Z  Q& G. g/ G! M
  102.   taskEXIT_CRITICAL();; R' L6 z" k6 e
  103. }* G  y& K; y; n

  104. & y" O! \. a& b" P4 i: |; O& t
  105. /* USER CODE END 4 */
复制代码
2 S# O4 D6 ~! F- J/ i- [

# \; f  e( f( }' r4.3、编译烧录。
3 @3 y! B+ F7 k3 B& U/ M/ W————————————————
. y+ }/ G3 d  {% V版权声明:SCCELE/ M8 w! {' \9 }4 Z2 N5 M/ p$ q( p% u
0 H2 ^; c: e. x* z5 `
收藏 评论0 发布时间:2022-10-28 15:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

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