STM32CubeMX的设置变化2 K5 A, {* {: a5 E8 \
1.Pinout 中使能 FreeRTOS- y+ k8 x1 V' R2 o3 @1 Z
. R# S8 H% L. w- \! U; k: V: h/ e/ N0 t& [
: \; _$ X; h7 z7 N
2.Configuration 中配置 FreeRTOS
! Q; v$ o4 e, [- t/ U5 I& I& D- F! A" H- K+ r T: Q; r7 k
' F, [) G, r6 r: M5 ~) }! @8 ]3.添加任务
6 C; E& ]% o( `' |3 p; J# F+ J/ P/ X
4 @0 \# @& S8 M
$ B$ n6 N1 e& H) v( B$ x
4.生成代码
9 S. ~9 a) x9 O6 c) p
9 l" i' v$ u- r, ` 7 W( c0 C- {. _9 M5 \7 f
Keil5 中编辑代码+ o! V6 D: A: v3 d; n8 z5 d
main 函数3 o/ b4 L, L% `' k; i
- int main(void)
9 F1 E2 X$ B7 A* M8 U4 @2 H w - {
1 n5 K! g, i. S - /* USER CODE BEGIN 1 */
" A- q7 t% Z# z9 n, Y
6 e' W- d- ^3 \) t- /* USER CODE END 1 */
$ G- V9 q0 ^$ S+ }2 _; O, C - ( C; O1 d" f/ h# q& o, C
- /* MCU Configuration----------------------------------------------------------*/. \6 X/ q5 F0 m" P
- - c% B. S! X* D
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */# d- w/ Y4 S/ U( | A
- HAL_Init(); /* 硬件抽象层 */- e% g7 x8 F) v
- 1 h# t( U0 N$ k( h
- /* USER CODE BEGIN Init */
/ h( j3 z1 u. c4 c a& V! [
$ |% o0 f: o" [( \6 Z- /* USER CODE END Init */
- o1 N* O! ~9 Z9 ]
% b: s7 P( o5 x+ C- /* Configure the system clock */1 t% z7 f: ?6 |4 }0 D/ y4 n0 x
- SystemClock_Config(); /* 时钟 */0 H1 {( I/ C" y5 P. m# p% S
" M2 _4 p# T( ~- /* USER CODE BEGIN SysInit */
4 f* p. @! l+ i# A - - d4 C W2 U* M
- /* USER CODE END SysInit */( d2 d% \- ?! `
- /* Initialize all configured peripherals */9 z) Q8 n. m, n9 I
- MX_GPIO_Init(); /* STM32CubeMX生成的GPIO初始化函数 */: C: R4 e; b \: r# F- a7 K( o4 k
- MX_USART1_UART_Init(); /* STM32CubeMX生成的USART1初始化函数 */0 O1 u0 i$ P; Y( i+ D4 i
- MX_USART2_UART_Init(); /* STM32CubeMX生成的USART2初始化函数 */8 b! a" k" d" }
- /* USER CODE BEGIN 2 */
' g+ b0 f) g5 z P5 H( q/ A# A - printf("\n\r Creating Task1 \n\r"); /* 我添加的语句。在串口初始化结束后从串口输出的字符。*/3 I0 G" j* ]2 f5 C N( I1 q9 y+ p
- /* USER CODE END 2 */
& d6 \- |# }/ T* m
" y+ f5 H$ D: `3 ^- /* Call init function for freertos objects (in freertos.c) */
5 \7 ]8 s% k4 s8 W) D; r - MX_FREERTOS_Init(); /* STM32CubeMX生成的操作系统内核初始化函数 */7 X6 S0 _7 T" W- s3 R/ g1 J
- / d. v8 _" G) O0 q" N
- /* Start scheduler */" `* ^1 K2 l7 X: X, I+ {
- osKernelStart(); /* 启动调度器 , 由调度器控制任务执行。下面的 while() 语句是走不到了*/
1 y% V# W& ?/ [1 w% b! V I0 f - 3 T6 u A" M$ K8 K% m+ Q' Q
- /* We should never get here as control is now taken by the scheduler */ W O7 Y1 k8 ~" l5 m8 k
0 R8 G" W' v7 P- h; F6 [9 E8 \- /* Infinite loop */
7 b& l+ ]; V) z9 O' u, t5 n! { - /* USER CODE BEGIN WHILE */
1 I3 u) v! Z" \ l- S4 r - while (1)- t( `" [. u, a1 h* C# N
- {4 s( \) t& y9 G
5 B4 m8 @4 h. I8 P( c* ?# k- /* USER CODE END WHILE */
1 \! p/ Y! ?2 M, S i x0 P - 9 ]% ~! f' V1 p
- /* USER CODE BEGIN 3 *// j' m; H" N' z6 B+ K
- $ s! E6 C+ I4 q6 M2 p# u
- }) L5 @* B# P) o' x5 d) I6 `
- /* USER CODE END 3 */
2 A8 V: ]' D: w$ v' T - 3 }8 Z0 y9 n7 ^! s0 V
- }
复制代码
8 O5 I( v6 g; B6 Wfreertos.c2 L. f* R: b' t9 _" M
增加包含头文件% f" O& I" Y! c- q. V$ o
- /* Private includes ----------------------------------------------------------*/
9 N7 J" j( r2 ~ - /* USER CODE BEGIN Includes */
) @6 s& t0 l: i: v% ~+ t - #include "stm32f0xx_hal.h" /* 我增加的,否则不认识 printf */2 s; q. l; ~/ Y4 b% J& H
- o1 k) M" n" A0 g6 ^6 u- /* USER CODE END Includes */
复制代码
' \, M0 [7 c: d3 L* \$ t tSTM32CubeMX 定义的任务句柄
+ b% | _# E" _3 Q3 w6 a8 _+ |- osThreadId defaultTaskHandle; /* 缺省的空闲任务句柄 */% V8 \$ B9 V; r4 e) g6 ^8 Z
- osThreadId myTask1Handle; /* 我需要的 myTask 1 任务句柄 */
复制代码
; f) S9 w) B c# ~STM32CubeMX 声明的任务函数原型% p0 Q& {" D$ R5 O" F7 `: s" i
- void StartDefaultTask(void const * argument);
! b! v q7 h$ e3 E3 |5 n* n0 F+ O: t, p - void StartTask1(void const * argument);
复制代码
t* v# j2 ]0 ~& y* F1 v, A& ESTM32CubeMX 定义和创建的任务
/ C5 h. @. N! Y. Q8 D8 `& d$ q9 k/ m- /* definition and creation of defaultTask */3 Q: R' w) I- n8 m) E
- osThreadDef(defaultTask, StartDefaultTask, osPriorityIdle, 0, 128);
2 y& g: J9 u' B% u - defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
+ T w8 J/ e* }( ] - 7 X# @& W1 m9 ~% e) @# j* C- m& _/ N
- /* definition and creation of myTask1 */
$ B8 N% T; z, [9 R$ w; {) ]9 L - osThreadDef(myTask1, StartTask1, osPriorityNormal, 0, 128);
/ P8 v8 e. o+ x3 S - myTask1Handle = osThreadCreate(osThread(myTask1), NULL);' k2 ^# a7 P3 P$ D# y2 P3 [- q
复制代码 8 t) W. f/ @. Q3 s
空闲任务啥也没干4 B. S/ k) {' ?' x6 z+ j0 N
- void StartDefaultTask(void const * argument)" _+ {. f4 z/ I$ O2 X4 f: K. I, u! L8 Z) v4 S
- {
8 E% u; Z2 ^9 Y/ G
) o- r+ T6 u2 }1 p7 I- /* USER CODE BEGIN StartDefaultTask */, y& e1 g1 R7 u5 Z E m
& R5 M- [" p' l3 D- /* Infinite loop */
# H; }! I! V; X - for(;;)
8 ? b" J: Q+ ]9 A ` - {6 d4 A) T' g4 s8 t# h
-
/ D* }- O- x/ T7 R, X - osDelay(1);
]& o. {0 j, k6 c3 ]) \1 } - }
$ b! W( o" O6 n- s* q( m) H" R - /* USER CODE END StartDefaultTask */
: o' F/ K1 J% ? - }
复制代码
5 w( b$ c' l. h! n0 S$ k任务1输出字符串
8 G. s* w6 p( N' o- void StartTask1(void const * argument)3 ~$ W! _& `* F4 |* E( O
- {
f6 {; X, u: P1 |9 N - /* USER CODE BEGIN StartTask1 */
' g2 W1 |% S7 g7 g1 }9 f/ O$ A. C - /* Infinite loop */
$ c1 d) f ^- }% E0 h- L- A - for(;;)' g7 ~, C, A3 o3 y4 D' S7 l
- {
$ _) r9 q. N: T - 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>) */# ^/ o" a+ R; J$ N) [! n( E: l" g9 ^ \
- osDelay(3000); /* 延时3s */
' J4 X6 s0 D \ - }
; r. V7 k- }# l% U - /* USER CODE END StartTask1 */( q/ P1 q0 K" M f# X1 X
- }
复制代码 ; ?' c8 C: l- Q% e/ Y$ I
编译链接 Project/Build Target
7 T. v8 ?) h# \; G p) {5 L
2 j1 d/ E6 s) v3 e, m6 e5 m( F) R' e0 F* K: R; r1 r# ~
' ~4 }/ }( i) g' _3 O+ e+ l烧录程序 Flash/Download+ E( [3 r( z U0 ^% b3 ]2 t
0 t& o8 p/ `8 C2 A1 n* }
6 n! K4 ?, z: S2 `; {: {! R' m2 p: J0 ~5 H- |
运行效果+ A1 C) y7 G9 G5 ^+ |+ N
$ G0 N6 Y. j- _8 Y. w: c/ f& p! @5 Z/ g/ z, `& r$ ?6 r8 x9 q
# i. r/ x' x, H2 J3 p+ C+ m/ A* O, w
|