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
" 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
! |+ }( 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 _
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
; 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- /* USER CODE BEGIN Includes */# y( B. s# `! d, f# A$ P
- #include "FreeRTOS.h"9 B" U0 Z2 W9 N2 _: j
- #include "task.h" m# Q1 B. n0 y4 T3 D v
- #include "queue.h"
% A. S4 x: @; |* v. w - #include "semphr.h"3 I2 n, }; `7 \8 n
- #include "event_groups.h"& a0 L$ K; Y& [5 y* U1 w
- #include "timers.h"
, m* p t' `0 b9 H; g
' ^) `" x) M& g- /* USER CODE END Includes */
9 F; U, e8 t. n; Q7 u5 y( I - *
/ B3 W( T/ M _* M" F9 \ - *
+ b3 _! v% K7 _/ @. B - *
4 b/ d3 s. B) r" j1 Z" s8 O `4 h - /* USER CODE BEGIN PV */
8 x( ]) ^4 M0 }$ V5 `* z3 I7 Z - static void Send_Task(void* pvParameters);7 V% K, s; N8 v) z
- static void Callback_LEDTOGGLE(void* pvParameters);( w0 k( h% e' ?6 q/ |% s0 t
* |8 Y1 q4 A6 Z, y& B. _$ ^* d. H1 M- static void AppTaskCreate(void); ^2 {; j( ]+ q! p
" P: J0 Q: |6 Z0 v0 A3 S& X0 t3 H
: i0 M2 ]: R; [1 _* i- /*Task Handle*/4 r2 S8 C: G1 i5 X1 t& A% l; u
- static TaskHandle_t AppTaskCreate_Handle=NULL;
5 ?. ~8 ^- _$ U - static TaskHandle_t Send_Task_Handle=NULL; //PRO:3
7 O# p$ C% H% V* G
/ i \8 H: ]0 O0 F1 Q* s3 g- ) d1 e2 Z) c3 S6 f: f
- /*Timer handle*/2 B5 o! X9 \3 D1 O% ]% J
- static TimerHandle_t Timer1=NULL;2 J* C7 D |; B/ r- T, @. m
; J7 i( M1 A# J- static void Callback_LEDTOGGLE(void* pvParameters)
; a5 I" o1 r K" ^( v2 n - {3 i, y$ O; F8 a+ z! _" b' c
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
) r. ^& t: j- z: e. U/ U
( m J& a" w" V) \2 n% h- }; `9 _& o4 @4 X1 U# z
- /* USER CODE END PV */
+ S& p9 D. L" ~- T - *
. K+ z1 k6 B9 I - *: Y( k/ K' V6 }# o" X8 [
- *
* D6 p5 |! @# e - int main(void)8 V8 g% H+ q9 }! a/ M
- {
+ T. ~: r$ U9 f - /* USER CODE BEGIN 1 */) |1 o1 Z& E# Z, `: O
- BaseType_t xReturn =pdPASS;% z K9 U, ]0 q6 B! D
- /* USER CODE END 1 */. H1 [9 ~* t, ]' H. W$ C4 w" g
- *
n' V6 ]; r% r% ~5 R9 q, ]. K - *- A3 x K. X% k: T' C
- /* Infinite loop */
* {8 B! [/ {8 Z4 M - /* USER CODE BEGIN WHILE */- K8 n- |9 X$ }3 l% |- y5 t" r$ I
- xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\/ {: B: ?/ ^% s! v% H, C$ V6 Z
- (const char *)"APPTASKCREATE",\/ f3 C, d! w$ x6 M# D
- (uint16_t)512,(void*)NULL,(UBaseType_t)1,\+ j. [" F/ ]% L( r1 a' L5 h
- (TaskHandle_t*)&AppTaskCreate_Handle);5 l# X: Z$ ~" L* x/ Z" x1 D1 ^
- if(pdPASS==xReturn)
: k6 M/ a( ^* E4 n - vTaskStartScheduler();, ^+ Z; N. B4 C1 s
- else
8 }+ }) I( T0 Y7 Q+ `' n3 S/ k - return -1;
6 \4 T1 V1 R8 C6 M5 t1 h" N' ~8 V - while (1)4 D, @( p+ A5 \ L5 [9 J! _
- {
7 L. }) L9 W% L6 ]* O8 x7 n. Z - /* USER CODE END WHILE */
* V; H9 Q9 ^3 b# l! F4 { P! t - /* USER CODE BEGIN 3 */* ]1 ]: ]8 e1 o! _- j
- }- o- ^$ B" C% N5 ^
- /* USER CODE END 3 */$ l9 ?6 D$ Z/ K/ v
- }2 _8 _% `5 y( T9 W- e9 J I
- " {7 e1 s) q3 \8 ]
- *
2 @# a9 p% Y. l* r6 n8 @ - *
( `, T: `+ O" w7 W/ T
! K8 W" y. L; o |- /* USER CODE BEGIN 4 */
% d$ F R8 s1 M* { - /***********5 z, M, N7 h3 P* s, O5 n* b7 W5 K5 s
- *@Function name:SEND_Task
: f! \7 [! b# S d& L4 C - *@description:SEND_Task body
0 H: Y- I" ^. R - *@Parameter:None
6 N, h% ]8 e1 A. J3 L# d - *@return:None+ l9 O% _* [# X% t( h
- *************/# w. N% x8 ]. [& U* _0 f' U
- static void Send_Task(void* pvParameters)1 G B5 ]8 v4 d- [+ r) U
- {( y! v) B1 D' g T! d; A
, @0 E( G- ^+ o# W- while(1)' n) _7 [& [. j8 i) Y" J
- {
+ y- b. [* E( b3 p - vTaskDelay(100); //Just to demonstrate task switching.
. c4 O1 ]. n0 `+ ^; _ - }8 I1 E. W3 S6 R$ ~9 }
- }5 B$ G8 h2 |; ~7 Q) B5 E, c8 t* T
8 d- i4 r, R3 k, [' Q( a- static void AppTaskCreate(void)$ W% w/ T4 m9 Y
- {5 O7 q" Y1 b2 [! w4 O! |
- BaseType_t xReturn=pdPASS;7 g5 k5 [0 R5 y% G5 b' _
- taskENTER_CRITICAL();* Z8 j; w$ k8 M5 `" n- D8 s/ r9 B
- , m/ g: u$ X! m+ i
- /* Create Timer1 Handle*/
9 f/ v2 V, i9 C* P" ~' A - Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\3 o9 o% N. O. \: f+ h0 C; `/ ?
- (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);
8 y9 z. ^- Q- W5 L7 j8 ]2 `# U - if(NULL!=Timer1)
# v; @% ^: w- H/ Y - {}/ u( j- B0 }: H8 H6 {: m
- xTimerStart(Timer1,0);: e- b& x2 t& k
3 c: C2 B/ q4 C8 P( T8 u( b3 m% V- /*SEND task*/
7 ]" H8 Y+ x d - xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
( w( @. v& p& M2 A& ` - (const char*)"SEND_TASK",\" e/ n$ Z* l8 l! u
- (uint16_t)512,(void*)NULL,(UBaseType_t)3,\
/ M! ~; Z( m! i: L$ \3 b2 y - (TaskHandle_t*)&Send_Task_Handle);
3 k: j" V. W5 s4 m2 @) R8 z& ]$ [ - if(pdPASS==xReturn)0 X, H, M! k- I) L+ b0 |4 ^- J
- {}
1 v" ?9 O5 ^. u1 s6 @
7 W4 I0 b# a3 m7 W( t- vTaskDelete(AppTaskCreate_Handle);7 O5 |+ Z Q& G. g/ G! M
- taskEXIT_CRITICAL();; R' L6 z" k6 e
- }* G y& K; y; n
& y" O! \. a& b" P4 i: |; O& t- /* 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 `
|