STM32CubeMX的设置变化! G" @0 ^2 T$ H' s4 \
1.Pinout 中使能 FreeRTOS
2 \6 w6 f- V* ]) z: o1 }5 @& i7 h* l+ N4 a3 k
) y8 b! Y8 W. r9 Z
% Q2 S \$ x# e# |, k8 C. }2.Configuration 中配置 FreeRTOS
- x9 m2 g1 p6 G! W4 W! J1 A! y% m5 G5 D
6 w. @6 H# W/ v% H3.添加任务0 v% \. }4 ~ ^& [
1 B [( u' T0 C1 w+ R% W( T! {' u% y8 C
+ J+ x5 S$ H$ z
( w+ \ I0 t4 X6 L4 R. J, I: i4.生成代码* C: s5 e3 P+ u- w# Z% e
# G4 A! ]3 P/ Y. e, N8 j
4 s7 X7 e) g8 \( i, e$ IKeil5 中编辑代码
. \+ m7 k# K% X+ f5 U. i& dmain 函数2 }6 | `/ k0 D$ q; [" ]
- int main(void)# A( m7 S, f9 `) n" ]$ I) ^$ p
- {
6 E/ i. ^! k% L: A+ f7 G. d - /* USER CODE BEGIN 1 */
/ d8 |. C* ^5 i! `8 H - 8 ]9 K2 a$ {- o8 X* Q% N* K
- /* USER CODE END 1 */ u6 S: ^( W0 M' Y
- 8 X4 y3 A7 G. ~7 Y- k' I) C. t
- /* MCU Configuration----------------------------------------------------------*// J% f* [( l" p. o* n- S" ~
# |% k( Z9 M/ O* v& I5 A: Z* m- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
6 m8 q/ B- p7 O! G) L* {6 r - HAL_Init(); /* 硬件抽象层 */+ C' j2 T5 L3 ]9 s7 z- @
1 b7 A; ?! q# v6 H9 ~2 Z- /* USER CODE BEGIN Init */
) d1 W0 ~# q! }# w5 s - 3 r; {6 e) x% [; M
- /* USER CODE END Init */
5 [- \: F7 X+ v' R4 L* W6 Z4 Z- b8 p - 8 I/ ?1 T4 j( X$ J/ u1 S
- /* Configure the system clock */
- q0 d( p; x% \* a - SystemClock_Config(); /* 时钟 */
9 d5 `9 q9 W4 |; N6 S) Q
# |6 a( U4 j% A- /* USER CODE BEGIN SysInit */
( V5 M# P2 C5 o! o8 g, @' ?
0 H" T7 _; u/ o1 n% y* ?1 x% m: K- /* USER CODE END SysInit */4 l7 P, D9 n9 v$ g8 g2 G3 ^% y
- /* Initialize all configured peripherals */
7 Z- }# d2 X' r) h& H+ i - MX_GPIO_Init(); /* STM32CubeMX生成的GPIO初始化函数 */$ u X* V5 R0 P3 B
- MX_USART1_UART_Init(); /* STM32CubeMX生成的USART1初始化函数 */
; E- v7 _. E3 q" ?# k! F - MX_USART2_UART_Init(); /* STM32CubeMX生成的USART2初始化函数 */$ @( l. ?) G( K# p* I3 |$ Z
- /* USER CODE BEGIN 2 */
; j9 m0 Z3 t) t8 k: H& | Q - printf("\n\r Creating Task1 \n\r"); /* 我添加的语句。在串口初始化结束后从串口输出的字符。*/
0 I" e" C* N/ b6 q - /* USER CODE END 2 */
) G; G6 ~8 c. ?5 k) {& V
' v \3 I: Q3 Y6 @4 x3 n- /* Call init function for freertos objects (in freertos.c) *// @* ]( I) `* Y+ I' l- M; \3 ~
- MX_FREERTOS_Init(); /* STM32CubeMX生成的操作系统内核初始化函数 */
, L2 I. `! V% g1 q( t
6 \" _. w) M4 U0 R- k: K, ]- /* Start scheduler */4 S7 R2 w- O$ W& x g
- osKernelStart(); /* 启动调度器 , 由调度器控制任务执行。下面的 while() 语句是走不到了*/
1 a& E! w: C' B8 G - % d( p7 Z4 `# s9 f8 ?3 }2 M
- /* We should never get here as control is now taken by the scheduler */
& y& _( G+ T5 t2 ? - * g$ m, \4 L+ b/ p/ Q/ t5 U( `+ X
- /* Infinite loop */
% o* M% b. O: }) W - /* USER CODE BEGIN WHILE */! r6 m9 s' N, _1 u* d7 I
- while (1)
) g9 j; @# a% G! P% ~% n - {# H3 r, m* N# o. T1 h. y
' b. s, q! H2 Q+ z* D- /* USER CODE END WHILE */
4 W1 b6 K3 u1 V$ ]7 }" k - * n. Q& q f7 P
- /* USER CODE BEGIN 3 */) {! \' K: O/ o0 u8 W# ^
- . D L. b6 J+ f4 T
- }
- I. o+ J) J% |( R2 H - /* USER CODE END 3 */
9 ~( [5 J9 M0 ?2 u, @& h
1 C3 i9 `1 t- h) J# a- }
复制代码 : ~/ a& i, ~5 t6 w: Q# @2 e* I
freertos.c
3 H9 N5 M! s( t% e* \5 ?增加包含头文件
/ F4 H u2 ^0 @/ r' |9 k- /* Private includes ----------------------------------------------------------*/4 m$ Q4 }( p& _
- /* USER CODE BEGIN Includes */
& ~" q4 ^" k& M( }' ? q - #include "stm32f0xx_hal.h" /* 我增加的,否则不认识 printf */
$ k5 |8 ~+ f% [; n1 c/ \ - ) ?2 Y: V; Y. u
- /* USER CODE END Includes */
复制代码 - x2 E! M/ H6 x3 v% k1 h# f
STM32CubeMX 定义的任务句柄
3 F5 g* t6 S2 R. Q. {! A* @- osThreadId defaultTaskHandle; /* 缺省的空闲任务句柄 */6 p8 g) Z6 {! Y
- osThreadId myTask1Handle; /* 我需要的 myTask 1 任务句柄 */
复制代码 0 o4 e+ i4 ~( J% Q
STM32CubeMX 声明的任务函数原型) N$ _' w+ _/ q/ l# Y( S
- void StartDefaultTask(void const * argument);' k) r# ~& Y1 k( V
- void StartTask1(void const * argument);
复制代码
* A/ l& }3 h! m, t1 E) QSTM32CubeMX 定义和创建的任务$ Y, u( Y4 Z" K& H$ j
- /* definition and creation of defaultTask */: I- |( z) v4 `
- osThreadDef(defaultTask, StartDefaultTask, osPriorityIdle, 0, 128); 7 L8 Z: y! V9 s8 N2 X$ D
- defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);8 w: q) u) {. R7 I
+ }# |, b7 ]0 p/ s( Z- /* definition and creation of myTask1 */5 z: f# H w5 o1 w2 O! C+ u
- osThreadDef(myTask1, StartTask1, osPriorityNormal, 0, 128);8 `( z- A1 U+ L: l# F5 K
- myTask1Handle = osThreadCreate(osThread(myTask1), NULL);. D o5 I& z O) L! F
复制代码 s# S& C/ k" B; N2 ?7 Q
空闲任务啥也没干
& H4 q, H' r0 T9 g2 L- void StartDefaultTask(void const * argument)4 m* p# b; O, y0 b/ R
- {9 l. _% r* w; `" \
: H+ S! m0 }: t- n, g- /* USER CODE BEGIN StartDefaultTask */
3 @' Q& b2 Q9 ]6 B9 z
! c) b5 _9 }& L+ }, X$ z- /* Infinite loop */8 \) h" O! e2 b. A' `# U
- for(;;)3 Y3 x A- J. e r. K9 I
- {. q( Y" L' x; R- w5 B, W z
-
4 z% s$ b( h! J - osDelay(1);
: ]0 q$ @ f( G( L; \& M - }
a4 L% B6 C7 Y7 g - /* USER CODE END StartDefaultTask */
' y2 H* P, k# O* c2 p8 D- Z - }
复制代码
5 Q0 V4 F! a( g% p8 F任务1输出字符串7 h) G8 P( I* _+ N- d) w
- void StartTask1(void const * argument)
8 f' g% s) M K1 |( l- ]- ~ - {
+ v8 t, t8 r; z6 D5 S2 ^ - /* USER CODE BEGIN StartTask1 */
- a- x& h L: Q. G Z/ i* U - /* Infinite loop */
. x5 G' N- y( ?9 K! E" b$ B - for(;;)
5 a7 n1 B0 X& S5 g! H - {8 r# d1 N, d; y4 _+ L7 A$ 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>) */' a6 g( }+ Q; q/ }9 X& L
- osDelay(3000); /* 延时3s */
3 o6 Z" G6 j* w ? - }
9 c" m8 i6 F4 ^" F, P7 p5 | - /* USER CODE END StartTask1 */) Y$ m" T$ f q7 x. x
- }
复制代码 6 F- d& c9 h" B- ^
编译链接 Project/Build Target
" U! r/ V/ N8 U" L4 U# o% ^, A& |+ z& L6 G# f8 A
4 W# g2 t$ K* `$ o+ M. M/ q
- J" n/ M; U% N6 {+ l4 o烧录程序 Flash/Download. G. F* n; H' L* u7 c$ e+ L
6 i! Y* O; k4 j, }* @; t9 |4 M( _, W: w
8 N1 E5 j3 D& b- `) r9 B2 v: d
运行效果! Z) K* L v/ h. Q# {7 Q+ h6 ?* x
7 g0 X- \4 `) z. {* o
$ ~# l' F& I/ p5 A( m9 _1 x4 O
. C7 i' Z' H9 Z0 `# n; Z9 ~
3 u3 Q3 X; [5 r) N0 l
|