STM32CubeMX的设置变化
+ K+ L7 ?" r5 J4 `& J' Y1.Pinout 中使能 FreeRTOS
5 ~4 J8 p8 ?5 g0 B5 R: u3 A. L- I3 o. R6 t
: d& h( d" T( y: |2 s9 p: j9 r. i% I' t. p
2.Configuration 中配置 FreeRTOS3 O+ p T L9 O/ e y: N' [% b* O6 l
/ {, e/ w) b. V1 ^# w: @6 N
+ {. v; W" g. F3.添加任务& J/ w8 F, H( h. g4 Y$ w+ @' K0 T
9 F' j2 N; Z' |- t0 m r1 d |$ w; q
8 F8 G, Z2 q* f8 @; L1 m
6 {" M/ c# x( Q8 c: t' Q4.生成代码
0 X* a/ C! ^; Z- w# H% a
9 N* a1 b! W; l! S2 d* h4 ^& _
5 i+ C: a* C/ m0 B, KKeil5 中编辑代码
`: O6 _5 u+ o) Jmain 函数
6 Z& y& }' V& q- g; B5 t- d1 @% \- int main(void)' y3 ?! j2 \- S6 J4 b2 g
- {
6 e" w; ~$ W0 _5 H - /* USER CODE BEGIN 1 */) f% @$ G. S ?: K) D( L8 h5 s
" s+ B* y* q, f9 P- /* USER CODE END 1 */
6 ~5 P% i# a+ S$ q- W
; a2 ^7 Z4 j0 S9 V& o- {- /* MCU Configuration----------------------------------------------------------*/
; x6 X- c5 y8 \6 m1 z
, i# [0 v7 a9 p' v! n- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */8 l! y7 I1 T% }! T
- HAL_Init(); /* 硬件抽象层 */' c; R7 S( t+ E/ z: y% B7 T* T7 w
$ q/ T( F; d1 [9 Q- /* USER CODE BEGIN Init */0 s# p) ]# D2 \0 _0 F. w
* c. u3 I% y' o# y) Z0 o- /* USER CODE END Init */
! }* W k7 J& n( b& h$ Z - ! n" P# v; ^: e1 o, D3 w( R% Y# a0 H
- /* Configure the system clock */
( B/ n i' c1 }: _" u - SystemClock_Config(); /* 时钟 *// k: m* _# t% f2 v( f
3 p Q4 m. t. C! s& R$ \1 s; z' j- /* USER CODE BEGIN SysInit */3 S! o$ @' L; _- J+ c+ F
- 1 E, Q2 ~6 k7 d6 P2 j4 {, z
- /* USER CODE END SysInit */
4 D+ ?8 ~! g; I) C: x8 u2 V - /* Initialize all configured peripherals */
* C+ [" E! @+ ~& V' Z) G - MX_GPIO_Init(); /* STM32CubeMX生成的GPIO初始化函数 */
" g7 u \, b4 c, D" g - MX_USART1_UART_Init(); /* STM32CubeMX生成的USART1初始化函数 */! v9 K0 h! j8 Y# z# F2 b8 f
- MX_USART2_UART_Init(); /* STM32CubeMX生成的USART2初始化函数 */
; Q2 i5 v! S9 T u8 L! Z - /* USER CODE BEGIN 2 */
! l5 @. m0 S) W ]) L% c* A' K+ J - printf("\n\r Creating Task1 \n\r"); /* 我添加的语句。在串口初始化结束后从串口输出的字符。*/
2 | o& s- h3 N2 z5 |! f% v$ l - /* USER CODE END 2 */+ v$ q- @4 j- I4 B& u6 a$ u
- * k* U4 k4 C7 h* `
- /* Call init function for freertos objects (in freertos.c) */
" V5 U8 ~0 \! g& m# N/ [ - MX_FREERTOS_Init(); /* STM32CubeMX生成的操作系统内核初始化函数 */
+ P$ Q3 m2 ?$ D' B0 e) Z3 p8 ` - 3 _7 }: l( z4 p9 L% u
- /* Start scheduler */
8 B4 G0 `5 i, r! z/ y, b - osKernelStart(); /* 启动调度器 , 由调度器控制任务执行。下面的 while() 语句是走不到了*/
0 T- g0 X' O3 A% K& b- ?0 P
5 }; f) B6 c( {- /* We should never get here as control is now taken by the scheduler */
3 ~, s& {2 V) `7 k
O( d0 x& `/ P0 n! r" G- /* Infinite loop */1 X" P$ `( ], r
- /* USER CODE BEGIN WHILE */, Z' A$ a) \0 H' Z) q# c
- while (1)$ l) e& B. N* u. o9 s$ l9 |) H; {# T
- {. k0 G$ S0 O" U3 {2 {. s
( _" S9 A$ b: ]3 T0 H- /* USER CODE END WHILE */$ `9 |" T6 c! Y" h( \+ {: q7 l, c
4 e& ?5 K% J# l, ]5 S" o- /* USER CODE BEGIN 3 */
7 B0 K/ n- G0 B% S( ]3 p7 l
4 O5 M, Z m1 V' B0 W- }$ ]) ]/ S) K# Q5 i. O
- /* USER CODE END 3 */& J! {9 E! b4 V2 `
- / Z7 n) u$ J! [
- }
复制代码
6 d7 \2 Z1 }6 \6 r2 x4 Afreertos.c
5 a! x( M8 _- M7 H增加包含头文件
0 C! f0 ~% T$ o$ E9 H- /* Private includes ----------------------------------------------------------*/; J/ \3 P( S/ e/ D* r% w' n) h4 n
- /* USER CODE BEGIN Includes */ / F. W; ]3 x. x% D, m; }% _6 C
- #include "stm32f0xx_hal.h" /* 我增加的,否则不认识 printf */
0 e @5 g1 d7 |8 d' I7 d% b - 1 k7 V! C6 b$ v; B
- /* USER CODE END Includes */
复制代码 8 y% @- e4 t' [1 E
STM32CubeMX 定义的任务句柄$ _/ I2 O5 }1 R' r) S0 Z1 g8 ]4 @4 {
- osThreadId defaultTaskHandle; /* 缺省的空闲任务句柄 */
5 [( q n# L4 b) H- w/ X - osThreadId myTask1Handle; /* 我需要的 myTask 1 任务句柄 */
复制代码 ; x7 R# e# u+ j9 l1 W
STM32CubeMX 声明的任务函数原型. u1 ^) h. [9 C0 A! V R$ Q7 m7 K
- void StartDefaultTask(void const * argument);4 L$ _" t3 C1 f1 y0 g, ?# i; T( R
- void StartTask1(void const * argument);
复制代码 % n- Y5 E! o4 P( T. x
STM32CubeMX 定义和创建的任务8 R# {+ C2 |+ M# K( q8 x: K- R) d# m
- /* definition and creation of defaultTask */
& k1 R) f3 ^/ p1 I9 S/ m" Y - osThreadDef(defaultTask, StartDefaultTask, osPriorityIdle, 0, 128); 1 y$ Z5 [( [, l* c$ Q7 X( D/ R' q
- defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
1 l' h! J% k9 S - 6 B9 k u3 S6 ^# B# C
- /* definition and creation of myTask1 */& T4 N- B; H/ [
- osThreadDef(myTask1, StartTask1, osPriorityNormal, 0, 128);( `0 N0 u; \9 j& w' D0 s" H
- myTask1Handle = osThreadCreate(osThread(myTask1), NULL);
/ }' K9 h$ X, T
复制代码
k( ~; [6 _2 ^' T- ?空闲任务啥也没干7 K- G* m2 K! d% u/ L: V& ~/ V
- void StartDefaultTask(void const * argument)$ ~$ {. g9 o' \
- {) {% d8 b7 g5 `5 ?2 v
: T) ^9 k5 T' Z2 p+ t6 C6 V- /* USER CODE BEGIN StartDefaultTask */ P+ o! Z0 u' w1 X' U
2 ^: G7 R# e. \, x. z- /* Infinite loop */# o& ]0 q: a6 C, u v: ~6 Y7 G
- for(;;)( W* E; M2 z% s
- {
) b( E; D+ Y, ]. G2 U - / V- G+ r+ e/ k y) ~
- osDelay(1);
4 [- {1 {- a/ d7 @6 ^. M( L - }/ V# h& d; A" L+ V( B
- /* USER CODE END StartDefaultTask */+ a |; \9 ~3 Z! a" h% k6 V- \! Z1 o
- }
复制代码 0 v$ O: r V- z' m
任务1输出字符串3 {4 B: S2 a) Y/ c. L
- void StartTask1(void const * argument)' P$ V& F8 k" ^1 e- Y
- {
9 g6 t; u& }+ l - /* USER CODE BEGIN StartTask1 */
1 M- a4 |& B$ s# c" ` - /* Infinite loop */
" }4 t. v" C; m4 g - for(;;)
8 T3 a: z& _: C- R - {
/ r( [3 h, C2 O - 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>) */! i& e2 S5 b& R6 b
- osDelay(3000); /* 延时3s */
& d6 b% S# S3 `1 O/ l - }% w* Z$ d. _# z0 m
- /* USER CODE END StartTask1 */
, z3 s& t5 K ~/ W) w - }
复制代码
/ R8 G, I5 ^. Q N6 U7 x8 t5 j编译链接 Project/Build Target# @7 r$ b, M6 x% J) k: H$ L# F* E
1 A* S7 X0 a: h
$ `* r" m$ h2 S* S5 p, b8 T
+ g6 e: t6 r& ~' w烧录程序 Flash/Download0 }5 w( S6 M3 Y8 A6 K# K
4 H8 h" H/ u. M) r
) j3 b6 V6 Y6 F& E4 J+ Y2 _2 X3 b6 y9 y
运行效果
/ l( Y F+ A' }% K, ]0 o5 q+ y% X/ g2 E K0 B
r0 ^& b; V: q4 b6 I* j
5 n9 { g: j2 m" X4 @+ F9 F, ~. p! T9 s3 M3 D$ B
|