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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 15:32
1.准备FreeRTOS源文件
* g  o. ~% N2 Z+ F$ B3 W1.1、到freertos.org下载最新版本的源文件,链接地址
8 _. K  v% Y# p. b9 B$ K; S2 w8 V1 \  t
7 w. s8 ], h$ P/ n% F6 X; }( h1.2、FreeRTOS 文件结构如下:$ d; p+ [' U% u# `

3 }1 _8 w" r! F+ O2 X8 e需要用到的是粉色的头文件和翠绿色c文件。9 P) y/ g! @3 k1 B5 E+ M3 l

9 b6 a$ ]0 h0 w
20210630230907158.jpg

; E$ o, W3 N* }6 \: N+ _6 F6 d' Z4 n3 A/ Q
2、使用STM32CubeMX生成初始化代码(BSP_Init)+ B6 `# \, ^4 @
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)
9 x; ~* Z9 n) u" g4 J/ d
  |1 k# Q, n: \; m2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档
' u3 y/ y0 m( x$ R- R
% s* b+ q4 O* \$ `3、复制FreeRTOS文件到工程目录中
' q5 ^3 s  [2 N' P* B- \3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹
$ T* _' k7 \( P6 l. P% H/ p/ u& r; l8 W6 e: X! f8 i% D  t
最后看起来目录结构是这样! T0 F) R* x7 s

) s0 z0 O! v8 g" v# h- g1 Y$ e
20210630232103223.png

) R/ u  T8 t( M4 Z; R- w/ d# z+ a) e; r9 R+ d" r# h- k
+FreeRTOS! z1 [. \* `1 F" Y7 b6 m3 y
|+include* z3 T: {  U8 b2 L) n; ~5 p
|+source
8 x! e7 v2 ~. z- t: ^5 Y4 \8 R4 A
  P) r- p# b$ F* U2 \7 L7 m0 ^3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中
9 I* c& h! z7 v* k/ l8 b* }5 Q) z0 D3 q9 a" i
3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中; X, D  X" u( _, M3 `2 j

% a% ~( v: U' I, M3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程
0 t! n" a- w/ U- r9 o) P
% j+ w: `: U, x3.5、新建一个FreeRTOS/source,把所有的c文件添加进去
3 w  [  _, W) |/ t0 x; c
/ P/ b5 Y# j% [; Q9 e3 J, Q
20210630232815686.png

* y$ h# U9 M( q, f" e: b
4 E) k6 L1 ~. q; O3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"
1 b2 x9 C: @) q* g6 b) J. }' W( r! C& ]& {
20210630232918944.png

. [' s! V7 y* c* h, W- W- Y1 @  ^
0 I7 S- `" j) v0 n$ d, G, h- G4、修改代码, z/ _3 t" ?- o5 o1 o1 N- k
4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次9 z# _7 \; j6 x& m( u" s$ l
4 e! O' u' F1 q) N3 T
4.2、在main.c添加代码,添加任务$ i& _+ P. g: y! U

9 \4 ^) p0 A5 ~# u
  1. /* USER CODE BEGIN Includes */
    : [0 Q. f' t( i1 r
  2. #include "FreeRTOS.h"
    ) Z" K& p  j% e% S8 G/ t
  3. #include "task.h"/ v5 r9 w. e* E
  4. #include "queue.h"
    ) F" g' @' \2 \) g
  5. #include "semphr.h"/ l# h" W: X3 Q1 b
  6. #include "event_groups.h"9 A2 d8 f" z: x% }. s
  7. #include "timers.h"# I4 Q/ c: Q! |$ l! m0 r$ V, F
  8. % P, c! J6 z& J: I
  9. /* USER CODE END Includes */
    * s% D7 s! K) Q- u# X! W
  10. *
    / Y' W% j" D/ m/ C4 f0 w  P
  11. *
    " @* y4 ?" B% j; c* i
  12. *
    7 i$ b. y1 e4 E2 V2 L
  13. /* USER CODE BEGIN PV */
    ; T1 s! d9 C5 A& v/ m/ S: `! Q
  14. static void Send_Task(void* pvParameters);( ^5 Q* S7 g) [) g$ ~
  15. static void Callback_LEDTOGGLE(void* pvParameters);. T2 Q" S% S' ?: p' O$ t. i
  16. % N( o5 R8 H# u) V3 d6 _
  17. static void AppTaskCreate(void);
    , L+ K. h' y! S- Q$ I; q
  18. # X: {/ ]4 K8 g  I
  19. 2 j, E3 J! W* z% G* N( l4 v
  20. /*Task Handle*/  x; x: D! j3 h& v$ C2 Z" \2 a6 P
  21. static TaskHandle_t AppTaskCreate_Handle=NULL;
    9 e9 b$ r' F0 j6 t3 `( e+ x& `! Y
  22. static TaskHandle_t Send_Task_Handle=NULL;       //PRO:38 }& x4 I( v  b; v. E+ e/ Z; r- v

  23. # D" b- _+ U- E3 V
  24. : w) D# ^( @2 n$ s. o' j
  25. /*Timer handle*/
    1 h1 @+ A" C& l% s$ j$ E) Q+ j
  26. static TimerHandle_t Timer1=NULL;
    ) J' a/ o. S! f' M
  27. . Q7 H& Z8 i2 F: D
  28. static void Callback_LEDTOGGLE(void* pvParameters)5 B! v, [! F2 ~( Z  `
  29. {9 {+ b  c+ e  g& r) v3 u: S
  30.   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
    . B6 z0 [2 ^( P) L9 K

  31. 7 M$ O. D8 k( X8 Q9 s
  32. }& k/ D2 S9 J; a9 a) g$ _! }
  33. /* USER CODE END PV */
    ( ]# H- |; Q* g. t) W
  34. *% p1 K) z9 P4 i' {" E! L. c
  35. *5 g; F- n* c, e0 m) W1 `
  36. *  o- S' g9 v1 }; Y- v
  37. int main(void)! c( \" j; s# H+ L) y0 x  I0 }
  38. {
    6 B& W, \* X4 ^# |8 p) G% j
  39.   /* USER CODE BEGIN 1 */! a  l  k- J0 {3 {
  40.   BaseType_t xReturn =pdPASS;
    + B( k; j. C8 V
  41.   /* USER CODE END 1 */2 E! c/ ^8 e5 S1 E
  42. ** Q6 q; g) v" y  I
  43. *( g! P2 o9 c0 r- J; Z. P9 f
  44.   /* Infinite loop */' \1 D# t/ C, Y4 f
  45.   /* USER CODE BEGIN WHILE */- x) t9 t0 C! R3 Y' L9 D
  46.           xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\2 d% O8 p, x  K: M
  47.               (const char *)"APPTASKCREATE",\
    8 Q3 P3 o1 N9 z; \0 X1 s
  48.               (uint16_t)512,(void*)NULL,(UBaseType_t)1,\$ [  g& S1 j$ g
  49.               (TaskHandle_t*)&AppTaskCreate_Handle);
    ! D( J+ H' r7 R2 s5 G
  50.   if(pdPASS==xReturn)
    " I) c% v  J( v; h7 B, Y/ w" H! A6 ]
  51.     vTaskStartScheduler();/ l# C" ^2 `$ Y& Q# N
  52.   else
    / W: P9 B$ z  @! [4 a
  53.     return -1;
    6 [# G3 U4 n) J
  54.   while (1)
    & ]9 D( {4 J+ Z1 Y1 [+ n
  55.   {  Z2 Z( P7 U; k0 n- C
  56.     /* USER CODE END WHILE */
    7 {2 V) ^& K& \
  57.     /* USER CODE BEGIN 3 */
    - O2 o+ Z) `7 h
  58.   }
    & y5 t! k6 X5 l3 ]' V
  59.   /* USER CODE END 3 */
    2 O0 P1 o0 k/ k2 z" L* p/ T
  60. }2 L+ Y, u9 t4 D+ `" T  n$ P/ L, ~
  61. / {$ u8 [3 ~+ [( \
  62. *! w- R. g0 C+ u+ D9 L
  63. *
    , p% q5 ]7 w+ j/ j& R3 @  ?+ D9 R* A
  64. / W' {- _7 n8 r( Y& z
  65. /* USER CODE BEGIN 4 */
    ' h0 G, u+ z2 f/ y; B
  66. /***********
    , H" W+ k/ p0 d+ [
  67. *@Function name:SEND_Task1 |8 E" N0 N! ?# n0 f% `; `
  68. *@description:SEND_Task body- U, F9 X" p- w/ {& `4 l' u( m
  69. *@Parameter:None0 v- \) D2 ?+ d
  70. *@return:None
    7 R0 ~( u- f5 r5 @" g/ x+ Y
  71. *************/
    / Q5 O0 p! r: w' w
  72. static void Send_Task(void* pvParameters)1 T9 n% X# o: G6 T+ S1 }3 Y% a
  73. {
    . V' N: G8 \: n  H! T' M
  74. , B/ ]0 T# w5 Z" a: H# D: g
  75.   while(1)
      q, a" G% ]8 E7 D
  76.   {  6 A5 w/ r6 Q8 J6 \: N) r
  77.     vTaskDelay(100);         //Just to demonstrate task switching.- F3 c, `" b0 R% S2 W
  78.   }
    ' E3 f8 z# }" d& A$ O! ~" U5 d! m
  79. }0 G. q7 o* l% X! \; Z, z+ W

  80. 9 ]9 t* E6 w. ?  Z7 @: |2 l/ e, w
  81. static void AppTaskCreate(void)
      w8 X8 y5 Q3 E0 U( j! A
  82. {$ y. c* a( R! K- n* }7 V  z4 S, g
  83.   BaseType_t xReturn=pdPASS;9 P2 o# f2 F0 n+ Y% J0 Q
  84.   taskENTER_CRITICAL();
    3 W/ J% m2 C, e6 t0 _. W0 O
  85. ; H% O/ y/ A! a# [. a  o
  86.   /* Create Timer1 Handle*/' h9 \0 i' _/ B2 y
  87.   Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\4 q, |8 _0 s$ N( f8 g
  88.                      (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);, X3 }( {  H) n& u. n+ c3 k
  89.   if(NULL!=Timer1)/ {9 t/ [" j. T. W8 ]2 E
  90.         {}
    $ C  M2 I  B/ X; i8 M) \
  91.   xTimerStart(Timer1,0);
    & t: x# H; \: f# ^  ^! _
  92. : {. j# D5 H9 \+ S' Z
  93.   /*SEND task*/+ _/ u! V& @. K8 h- z
  94.   xReturn=xTaskCreate((TaskFunction_t)Send_Task,\' ~1 q( l2 f/ C0 U7 g' }
  95.                       (const char*)"SEND_TASK",\! K! a. X; q; B5 m1 R; y! S
  96.                       (uint16_t)512,(void*)NULL,(UBaseType_t)3,\( M* ^; `/ W# f- G0 U$ v; \' w  Q
  97.                       (TaskHandle_t*)&Send_Task_Handle);+ D  a- Y! Q# I4 T, v+ v1 c
  98.   if(pdPASS==xReturn)
    . \# s% C, U$ U- m
  99.         {}0 E$ A: S5 D  @: d$ v

  100. ' \/ ^( U. d) a
  101.   vTaskDelete(AppTaskCreate_Handle);
    * p/ X; U4 L% c* u; S
  102.   taskEXIT_CRITICAL();
    + A- V2 v  |  E4 A
  103. }. _1 C7 n* c% u; m% Y" E0 l
  104. 2 U' E5 U) `! A: v2 p) Y
  105. /* USER CODE END 4 */
复制代码
# k! o. \, v. X; B- x
4.3、编译烧录。
" J& C* _$ j) Q) Z$ s, z$ m' o5 h, {3 X; L9 n; e, w1 [
; t5 T+ l" h& m) s4 M- e
收藏 评论0 发布时间:2021-11-8 15:32

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版