1.准备FreeRTOS源文件9 u' Z# i; q' p* c. p S
1.1、到freertos.org下载最新版本的源文件,链接地址
' ^9 P4 x' F6 g* @* |' s. F" I! e" E6 A
1.2、FreeRTOS 文件结构如下: @$ u6 i) X* U% X9 U! A
. d6 D) G" I f需要用到的是粉色的头文件和翠绿色c文件。
! R! J" P6 @2 U# E* R: Y( Q1 `, N% Q7 }8 }" e0 T' X# r
) |8 ?1 I$ O! o2 p. F5 M
& @; g. A. v4 X( ~3 G
2、使用STM32CubeMX生成初始化代码(BSP_Init)
+ ?. ?# ? C4 {( y6 N+ u b( q& M( E2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)
2 p2 ?3 N/ G1 u7 y
8 a9 f5 P$ M8 _4 g2 M& x1 u, U2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档
: |+ P/ [( O6 `1 r" x
o, X5 @ }% L; U/ p3 t3、复制FreeRTOS文件到工程目录中
' w# [0 P( l H$ O) Z. j- r1 {+ `3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹
/ a0 l4 i* R! X, N8 G- Z! ?& ]) M$ b* Z5 Y
最后看起来目录结构是这样
7 ^' A5 U& x/ p& K7 m7 @
0 k4 [! C5 n& R" `$ ?
. s* `. I6 ^. @, k4 F6 I9 J2 y
$ D9 A$ ]9 F9 G; [+FreeRTOS3 s3 Y" b u2 d9 N. H! s* H
|+include
Y. s/ \# s( |8 U |+source
: F0 d7 s6 T4 k% O" Q5 T9 i) q; ]' d; V$ y0 l* }0 }4 z
3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中
0 ~4 E+ I3 y# l$ `% E! r" L m( M1 e7 E' a
3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中* P8 ?( n( ]0 u$ L" {
/ f; e9 J6 n1 K2 S2 m- m1 M( L3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程
! n R2 B) g3 U* A( E' Q0 K$ g4 O8 P8 W2 L# ~7 e% K
3.5、新建一个FreeRTOS/source,把所有的c文件添加进去8 g. e9 j8 Q0 Y7 @) \5 h
7 d3 r' C* C* I
4 E7 ?# C, b* b: T9 ?* k' l. h/ g
! o4 Y, D4 m. ^+ D
3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run". a) {9 o4 U' ~, _5 u0 L# ?) H
' W4 ^6 i0 R" s
% Z/ G; q4 D/ L6 G) @
4 |$ @6 b) l3 }& ^8 p7 w h$ V4、修改代码
1 ~7 v* A% N4 z3 L5 S0 T4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次( m& t1 {* W0 v; I
X! Q; p0 I" Y& d4.2、在main.c添加代码,添加任务7 j/ \( z6 d2 ]* a& K4 C5 R$ e
& |9 W5 B1 r" E$ u8 H0 }- /* USER CODE BEGIN Includes */
" e. n5 O: ^5 Q - #include "FreeRTOS.h"
, i, z: h0 p: G9 S2 _4 o - #include "task.h"
: H) A9 x( J- R! Z - #include "queue.h"
: O: J* ^5 w: E - #include "semphr.h"
+ _- C' H+ S5 B- d# S7 ]9 Z - #include "event_groups.h"
& F7 w% X# z X" O& X6 G - #include "timers.h"
' {8 i+ x5 v9 ^$ H3 A
) ]! c/ |9 Y8 ~" B" {7 F* b- /* USER CODE END Includes */
# W ~5 _, A: j - *
3 j) u& `& n) p y6 ?0 \8 l! G - *
4 x' A3 C7 F+ s8 P/ w - *
' x q; i6 H# }6 I3 T0 j* b - /* USER CODE BEGIN PV */; [; Q( T. N* F F6 R1 p- _8 X
- static void Send_Task(void* pvParameters);
5 j! z; N6 v4 V Y' ?. g) P2 M - static void Callback_LEDTOGGLE(void* pvParameters);
/ s$ Y& T8 i, @2 W L& h0 e3 X - / D* V, N4 G( i p7 S7 t! k
- static void AppTaskCreate(void);
) D+ \% A) u* \/ E1 \ - 7 D! N3 t8 _* @4 Y
5 T/ }# n/ w* `( p- /*Task Handle*/
% m- p. o( {& b4 L - static TaskHandle_t AppTaskCreate_Handle=NULL;0 }) g( c- e+ a8 `. o3 ?
- static TaskHandle_t Send_Task_Handle=NULL; //PRO:36 c+ q( Q& J. P; N% t# O p, ], G
4 [7 U( s9 x! Q9 P# Y( c4 S- * c0 \: b5 S2 o# Q9 y0 P
- /*Timer handle*/6 s5 `- G( E0 Q9 s+ P+ n0 ]0 I( I
- static TimerHandle_t Timer1=NULL;
- |: x$ T o3 h! H% K0 Q0 _
4 @4 s# B s$ \7 o* x4 b' \2 O' f4 v- static void Callback_LEDTOGGLE(void* pvParameters)
$ T9 G: N, T& R* j( X7 g# t/ F: D - {6 L/ {7 _& I" h ^8 {: {7 m# V7 U, S
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);% B# D7 }2 s$ i( x: H
, v/ [, t8 p1 B: T9 y- }
1 k: o |7 N; q1 t - /* USER CODE END PV */
# n9 Q- ~$ |+ e1 H - *
6 j/ X0 Q \+ y, i2 a - *
; m3 t; b; R; R, O# Y - *! J p7 B, a; y3 v- J* X: o5 e B
- int main(void)
C* X! c4 K. @& g - {
8 c" \& U z8 [: i0 P - /* USER CODE BEGIN 1 */
7 V3 l2 E- ~7 O% N7 \* \3 H - BaseType_t xReturn =pdPASS;
9 T; ?+ |4 |- O0 u. m0 p9 a9 D M - /* USER CODE END 1 */
) E% ]9 P# U( M. H6 [ - *4 [5 |: }' ] \/ m6 o8 a) o
- *
& Q, d+ w% s! K9 M! g& z - /* Infinite loop */* @; X6 o: h, x4 T' a
- /* USER CODE BEGIN WHILE */
& P" m. T- C3 W/ Z' ]0 p, v - xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\
9 L( L" Q7 I& z/ L; V8 H5 S - (const char *)"APPTASKCREATE",\4 n0 _( h$ P: V) m
- (uint16_t)512,(void*)NULL,(UBaseType_t)1,\- V3 P, O Q* Y2 b# N
- (TaskHandle_t*)&AppTaskCreate_Handle);
' W d) {$ \0 Q8 X! Q4 f - if(pdPASS==xReturn)
, v7 V% \7 p5 | n - vTaskStartScheduler();4 f. G: S+ Q9 R% k
- else9 P% J2 J8 \6 G: T, S) ]
- return -1;
) d+ t. A& I+ k/ e% j - while (1)
3 E1 f2 p: ^+ \8 y3 v. i - {. {' ~. |/ Y, x1 A4 T. Y' q( W
- /* USER CODE END WHILE */: c7 V6 W( S* C0 L, j: n
- /* USER CODE BEGIN 3 */
; A, G9 t- X/ L) R' S. Z2 G% Y - }7 Z5 y% S' [* _, M6 ~
- /* USER CODE END 3 */
2 C- R. R; H6 p& ]4 Q5 M4 K - }
7 u l, a% S' h7 h) t5 Z8 c - 7 o& T% i/ @5 I0 ]
- *. v% ]. j$ j0 r# F1 A% H
- *
5 m$ \' E4 w4 K* a
* R+ ?5 ^7 D' H$ K, O& z- /* USER CODE BEGIN 4 */
& G9 F: b* o7 p+ k' y+ ^! N - /***********; V4 i+ s8 u v& i7 d
- *@Function name:SEND_Task
$ ^5 C" l: s8 s" F' e# P4 @ - *@description:SEND_Task body& f- ]/ e$ X! L& r. G
- *@Parameter:None. z) S: Z2 [3 G& n0 H) b
- *@return:None+ n! l$ K/ q6 P; Q' i% b
- *************/
# B e6 ?$ i$ ?0 v - static void Send_Task(void* pvParameters)
) Q' K; x" e' j6 C. k+ Y0 b7 H - {* i) }; }9 ]. Q; [9 }
- T; z* z0 M; c- while(1)$ o( u% d6 J T$ f3 q
- { ! i2 N% V/ D6 h w9 W$ ~
- vTaskDelay(100); //Just to demonstrate task switching. S8 a4 D3 I% N
- }
) |& k1 @8 Z+ S8 t3 V# ^/ S1 s - }! g" N% g6 l, B; l& O; `
- + ^0 T" R$ \1 h- ?
- static void AppTaskCreate(void)2 L/ Q6 l- ]9 H2 V" v7 z# O2 t
- {
$ r$ U, w/ P' z - BaseType_t xReturn=pdPASS;' }( ~. j! ^/ P8 J6 e
- taskENTER_CRITICAL();8 E% N- b" L; G& n
+ W: m0 }; q$ c# i0 M) d- /* Create Timer1 Handle*/
" {* o; m, v; d# Z4 E7 I% t- P - Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\
% u5 H" b# t5 t/ y, Z9 e/ e- v - (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);
: x2 a' Q, L- f% d. J - if(NULL!=Timer1)
2 K, K# h3 ~# h! i - {}
, j" i. \: M; _) ~ - xTimerStart(Timer1,0);+ P6 l7 V0 ?+ Q% s( n) c& a. {) R$ n
/ z- y# d# ?/ D+ S/ d7 n9 Y- /*SEND task*/
5 i+ D9 B, D! M/ Z/ c O/ D - xReturn=xTaskCreate((TaskFunction_t)Send_Task,\: y8 H% A& ^- ~% L3 X' T' K
- (const char*)"SEND_TASK",\0 Y+ _% s8 N- i4 u
- (uint16_t)512,(void*)NULL,(UBaseType_t)3,\
( z4 \4 N2 _% ` - (TaskHandle_t*)&Send_Task_Handle);
O m+ K" J- E$ L, y# n) K - if(pdPASS==xReturn)
! U! V, q+ H6 ~ - {}/ J) S9 `: P# O/ \ v+ v/ l" K
4 @ P/ w, `# h- vTaskDelete(AppTaskCreate_Handle);
- m4 S% J+ J0 I$ ~, H# t1 Q - taskEXIT_CRITICAL();( v @0 {4 ~+ A! n9 n q+ q
- }
. ^. U$ u4 I) g* v4 E7 c2 }
8 }; |! o ]1 F' c! U) f+ C- /* USER CODE END 4 */
复制代码 / }0 W9 n+ E# e9 [7 J( j
4.3、编译烧录。/ d1 s" u# o2 K: s9 q- G7 h J
+ d1 v" ~7 N7 |( h' {7 k
/ Q7 t% i0 ^" }" `5 |/ A# T
|