STM32CubeMX的设置变化' D" {1 ]8 p. E0 A
1.Pinout 中使能 FreeRTOS
/ g3 d( l0 v3 I; [
1 C, u) P0 j. j% u( ?2 ~
* T m- d. g( s3 h
( D6 l# G( h, f' v1 _! ~2.Configuration 中配置 FreeRTOS8 A2 p* t* P7 q# [6 Y& A7 T
7 N: u8 ~# F# s2 k; w- \% U
( p9 H2 p9 @" y* G( z5 v. }3 ~
3.添加任务1 L4 @3 @- k0 |! O* U4 p
9 h( b' S" J9 ~4 }) E& `$ P
+ f; A k0 U+ t% i! s
$ ~8 v: L O: s- Y1 j7 A9 A4.生成代码3 `: R7 i) @9 X( G
! j5 o5 G! ]2 G% K9 }: I
6 N# S, e& [; g7 ^- sKeil5 中编辑代码' U% N" U0 V6 t* d
main 函数
- C) S7 d9 ]9 t; k- int main(void)
0 |! z ~( e( W - {# K& m5 X1 |" N2 R. _, ]
- /* USER CODE BEGIN 1 */- X3 w9 Y1 i6 ]- `! y
- " h& b# f5 C9 q% G" p+ I7 j
- /* USER CODE END 1 */
; b. W- ^7 z; `$ ~6 c7 d - 5 q! _# p# i5 ?5 D; r# Z
- /* MCU Configuration----------------------------------------------------------*/4 {4 r* d) Z7 O$ ^3 C
. J, U% V5 c0 Q- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */) N9 w: s2 J& G
- HAL_Init(); /* 硬件抽象层 */
! s7 e9 _( U) }, W' p - 2 x) s* H, t6 M: @9 g
- /* USER CODE BEGIN Init */
3 f0 W: K! |! f5 U5 \5 } - : U% A9 r# O* }* B. o( Z8 G1 \
- /* USER CODE END Init */$ B, Z5 J1 T$ x) W/ U
- 7 x$ h* a) Q+ A8 Y; T1 `
- /* Configure the system clock */
4 } J2 p: o/ {* {% C0 x - SystemClock_Config(); /* 时钟 */
# f, e( w& v& Q# F5 J/ W+ ?
+ V! {. Z+ P1 `! q1 H1 D$ I& |, m- /* USER CODE BEGIN SysInit */, p7 s# J% u$ E$ w* k
- : I- h1 t, j; ]( {5 I, j5 h, H9 E# a
- /* USER CODE END SysInit */5 F8 F. ~( c$ \8 L3 J
- /* Initialize all configured peripherals */- E: D4 \1 z4 ~% a7 Y5 h7 I
- MX_GPIO_Init(); /* STM32CubeMX生成的GPIO初始化函数 */- w( }0 ^7 Y9 W3 }
- MX_USART1_UART_Init(); /* STM32CubeMX生成的USART1初始化函数 */
. D, s: w6 n4 t" r9 Z( P - MX_USART2_UART_Init(); /* STM32CubeMX生成的USART2初始化函数 */
5 S% ?& P- y5 D o - /* USER CODE BEGIN 2 */
+ p& I' y9 q7 a4 L - printf("\n\r Creating Task1 \n\r"); /* 我添加的语句。在串口初始化结束后从串口输出的字符。*/6 o# i; t' A4 G: S. L
- /* USER CODE END 2 */
0 v/ k1 d; j5 ? W - : Q& ^6 i/ w) n1 S$ v: `
- /* Call init function for freertos objects (in freertos.c) */
9 a- T# p% U( t# ] - MX_FREERTOS_Init(); /* STM32CubeMX生成的操作系统内核初始化函数 */
( H5 R1 Y9 l) [3 y3 G - 6 E$ t) I; K! N( g' o. Q6 w
- /* Start scheduler */* t: i4 J# y4 Z2 _3 g& Y J
- osKernelStart(); /* 启动调度器 , 由调度器控制任务执行。下面的 while() 语句是走不到了*/
8 t6 a# E" s1 z$ Y - ( C' g1 J1 f c( O% }
- /* We should never get here as control is now taken by the scheduler */
' I/ `0 g, _0 M
8 q0 Q |$ H1 ^& {" d% Y- /* Infinite loop */3 j/ g. H) }' P- E6 a! R
- /* USER CODE BEGIN WHILE */
" s5 f) a/ s1 M+ D7 X - while (1)8 @$ e% E/ W- U" p2 H
- {6 e! h& ^3 C1 W U: u/ Y
) V% C- C; ~4 ^+ F* |9 R3 z- /* USER CODE END WHILE */
) l6 @1 ~2 R- i7 b b - 3 L; M% `- }6 n- x
- /* USER CODE BEGIN 3 */
~0 L8 A4 N+ q) K
! m2 n: N: v1 x0 q& O- }; L# B/ S# O) S1 K3 m
- /* USER CODE END 3 */
( I" Y+ i2 E: M3 U$ v" W
! z5 h6 ?4 T- Z A# {- }
复制代码
0 `: f9 o; f# J3 y+ W& r8 Ifreertos.c
, ^5 ^9 I" n% D1 T) T; `4 e增加包含头文件
5 n. t+ _: O+ ^; h' `- /* Private includes ----------------------------------------------------------*/
: X6 j+ @* N1 F& u' C$ D; Z/ H- r - /* USER CODE BEGIN Includes */ ( {3 V c: p4 M& ?! x8 s0 X/ O
- #include "stm32f0xx_hal.h" /* 我增加的,否则不认识 printf */
2 @" B2 j7 Y% L - 0 d. C D7 m1 L* o3 b8 F
- /* USER CODE END Includes */
复制代码
! i: \% l7 ~: ]+ U8 }STM32CubeMX 定义的任务句柄
) {; B' Z! S( A7 h$ Z [: R- osThreadId defaultTaskHandle; /* 缺省的空闲任务句柄 */, j- r6 a, X1 Y1 f; z
- osThreadId myTask1Handle; /* 我需要的 myTask 1 任务句柄 */
复制代码 / V! a! d: u. q( `# Y& n) y. U1 I
STM32CubeMX 声明的任务函数原型
' G: o' [& c9 T2 ]+ w1 v5 e- void StartDefaultTask(void const * argument); b' [) R4 n% q: z5 L! l4 J1 p
- void StartTask1(void const * argument);
复制代码 8 N) l6 w! Z- L: e' g: D- Y
STM32CubeMX 定义和创建的任务
+ A; H. b$ a( U8 L9 w+ ~2 Z& o- /* definition and creation of defaultTask */
" T& H9 T2 n v$ E) F; D4 A; k8 ? - osThreadDef(defaultTask, StartDefaultTask, osPriorityIdle, 0, 128);
0 P3 R. w2 v; H - defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
* P7 y8 O5 f) n' `
/ R. {" d$ L9 A- f" c- /* definition and creation of myTask1 */- x/ a( c5 P" g1 K
- osThreadDef(myTask1, StartTask1, osPriorityNormal, 0, 128);
. l9 H# l/ x* y; }* W5 Y - myTask1Handle = osThreadCreate(osThread(myTask1), NULL);
' j1 X0 |7 B7 U( Z' m3 t; V
复制代码 ; C3 ~7 o6 @/ Z" \) c# r0 r+ ]
空闲任务啥也没干6 p1 f9 m3 o- ]" h2 W6 u# h
- void StartDefaultTask(void const * argument)7 K; {4 A- N7 L8 y% m3 c( l* o. p- o5 l
- {
( J, t+ y9 Y4 o& S7 [! B( ~
. l# I0 Z1 g6 [/ _3 d) O+ L- /* USER CODE BEGIN StartDefaultTask */
$ T8 G4 o% Z( M% T N! T; G
! z2 Y2 C! h2 `) w4 d* E- /* Infinite loop */
( G5 y1 B3 J" D4 y! _1 Q# S - for(;;)
: ^- E/ J* v/ a- |6 h. z' W* g - {
8 k& X$ v% z) K A - - R0 y' @/ J! O$ s j! w2 I: \
- osDelay(1);6 v* H) y# p0 W
- }
; j1 k0 z& k' T8 b - /* USER CODE END StartDefaultTask */1 Q* `9 r" Z( R- _% D( O
- }
复制代码 5 z% I2 N6 W3 `- w
任务1输出字符串
n! S0 f/ f u) x- void StartTask1(void const * argument); o- C, w; V7 d" V
- {9 k) c' `( n y5 p0 T1 ^
- /* USER CODE BEGIN StartTask1 */8 F$ J3 z. c( b+ ]2 v
- /* Infinite loop */
! d4 S3 d% P( D) z7 R1 e - for(;;)
- F3 m# N( J: u- c1 ? - {
; `3 x* B8 _! E% o$ O* p - printf("Task 1 is runing \r\n"); /* 已经重定向printf到USART2,参见《用STM32Cube+Keil5对STM32F0编程之通过USART发送数据》](<a href="https://blog.csdn.net/aLife2P6/article/details/82918298" target="_blank">https://blog.csdn.net/aLife2P6/article/details/82918298</a>) */
+ u9 S" h! H. ~+ ^( W- { - osDelay(3000); /* 延时3s */) k- Y8 z. r V- U
- }7 U/ m2 }1 f* Z, ?7 ?& A h
- /* USER CODE END StartTask1 */
$ ]1 ~4 S+ a5 {4 D9 A/ b: x0 f - }
复制代码
. U b9 M( n0 H& f6 S编译链接 Project/Build Target% V! f$ D4 r4 [8 {% {7 G
. f# o2 }( v% e. T- w" ]5 I
5 @% t2 |2 ?- T8 w1 n a8 t7 y, c' h+ l# @1 w
烧录程序 Flash/Download. p( b" A! ^- B8 f/ \2 R7 t
" ^) j$ d9 b2 g$ T v
: l+ b7 P, o3 o- f" N. n5 p; C, j# ^, S* w1 p
运行效果8 I/ |: W: Z. m) Y: U
' j, q: r% \/ D! E! W% Y) ?6 U
) r }7 Q( J1 H: ?9 A; a- N5 _: H5 i$ a. s( {* F7 E5 }" E2 l% Z
, q* b% a @$ d3 [# }# ^ |