时钟配置: l2 E& y- z1 x- B
8 R; h8 E3 ]6 Q$ s3 [) L
" }4 a3 f. B; \2 `# P% X+ m9 OTIM配置& P: b5 }4 _9 F4 }' {' G- M$ |
. k6 q" f; o, f0 @& M1 B# y4 z
/ [% t. s' I1 u5 M- x9 r
3s一次中断
! w4 @+ z2 M' I7 U
' q) @9 h2 v; E) V7 m中断配置 m5 _! x: T) P% W1 W# ~
7 z* u9 M- c9 |4 |5 }/ m, Z
* C% f/ V M: A1 B开启
4 M& ], K7 P. E6 C/ K' i, `8 j - HAL_TIM_Base_Start_IT(&htim1);
复制代码- 任务中的临界区3 u$ A) R/ V8 N+ e+ n) @
- static void vTaskLED(void *pvParameters)
# f; Q' P5 G: h7 m3 J1 P - {
% p, U( g, N0 W4 I% l - while(1)7 e! ^/ T3 s- K& \9 q" y$ Y- U
- {
3 J9 g( q; s* v; O# Y5 H! U - uint8_t data[]="LED";7 C X2 @. O/ y6 ?5 ~5 c, x
- taskENTER_CRITICAL(); /* 进入临界区 */
/ \* z$ A( J( k: j% a - HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
9 P6 H$ K3 H2 b3 K - taskEXIT_CRITICAL(); /* 退出临界区 */ 6 M" B2 G. ~0 x7 q7 ]- }- F
- HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);' C# n9 b" n1 K% n& O3 N% x3 n: D
- vTaskDelay(500);
+ Y0 L# L* O* _# g7 u U" j2 y1 l- a; b - }
7 }* E0 L% F8 J- j i# _# \2 D' _ - }
复制代码- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
0 J# t! `, `5 {1 w5 ` - {
, q# `. |! N! l) o! ]1 f5 z r6 r - if(htim->Instance==TIM1): k" u, D K8 Z# A
- {
5 t4 c j* N5 c. c - uint8_t data[]="TIM1 Interrupt";0 b% X2 c, k7 Q! `0 [1 _5 e
[* \1 K, C6 N4 \- HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
9 y& @- [2 L7 z' U' V
( D0 G! M5 T0 [' K' t- }
复制代码
- \& ^& N% k: y3 ]. K0 C带有FreeRTOS, i( t; v; {) x5 S$ N
中断的临界区, G' L7 [& m }( d; J% Y
, L8 }7 i( g3 u
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
& W0 C, _! ?$ r/ H8 @5 [ - {
+ z- a. O }# x5 t$ r( M6 w' j - 2 C1 H2 u: v: Y( j/ X9 U
- ( M+ Y: _! L( B T
- BaseType_t xYieldRequired;
. r6 }% ]3 J- S. Y$ f - UBaseType_t uxSavedInterruptStatus;
- o& s# u/ G/ {! p: L6 e - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); /* 进入临界区*/
* |8 T# Q) _% m1 Y5 s( G - {% a7 @7 O+ [- F
- /* 用户可以在这里添加临界段代码,我们这里暂时未用到*/
$ V$ C, S+ c; D$ j+ K4 x e$ F - if(htim->Instance==TIM1)
$ g0 D8 _, S' A$ g/ U - {
; y# Z- U& f; F, ~ - uint8_t data[]="TIM1 Interrupt";
/ t" D5 v' K1 K: @+ o4 ` - - S) J+ T5 h' N% U2 L
- HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
4 e3 p! I8 O; T -
/ l% L Y4 i7 a+ d9 a. \+ q - }
7 U% a o1 m6 r - 4 K. A4 r: ^( Z0 x6 U# i
- }8 ^ m6 e/ k4 ]1 [( @1 J$ F8 v
- portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); /* 退出临界区*/, u1 r- \7 o0 m! y, J" T$ x2 \
- /** 恢复挂起任务*// T Q" _% n; ]5 F# u. C3 g4 @
- xYieldRequired = xTaskResumeFromISR(xHandleTaskLED);1 }/ _, d3 F3 ]' x0 S0 [& s
- /* 退出中断后是否需要执行任务切换*/
2 i. e/ [: k4 k* { - if( xYieldRequired == pdTRUE )! S; A A/ X9 a. z* b
- {
0 D( H+ l; b& V - portYIELD_FROM_ISR(xYieldRequired);
9 T- i7 n& X% ~% T# C) E3 H - }1 J$ C& R( Y" u. I! w
- }
5 c8 L: ~6 t5 T; b6 p' F, o0 n - o5 v4 M7 C2 b8 L7 B% j
复制代码
0 m5 |7 b- R8 R0 T |