时钟配置
$ o5 T/ @5 `/ p4 R* v. E: x1 M# \
# E$ Z# o3 H# ]; s J7 h
TIM配置
% X' H# F# W+ A$ t8 O7 p J( l4 y% s6 u3 b
( v0 t) E& u# u9 w D$ V/ r+ e3s一次中断
9 l$ Y D# E- f: R2 K$ a. q* i& {" y- q4 j+ I' ?: l( ?- M0 C+ \1 @
中断配置6 m* ?: g3 K0 J8 d
. H- i! c7 W' A" x) h1 K& C4 D# |7 L8 h
开启
) C; d1 E4 `' b - HAL_TIM_Base_Start_IT(&htim1);
复制代码- 任务中的临界区
9 o9 |7 Z) B1 A3 f - static void vTaskLED(void *pvParameters)0 z# j' [8 G8 [3 p
- { m4 i. K. V3 Z2 c1 ?" b
- while(1)
$ I4 e/ X( W' T# H' w. j - { 4 c( w3 _% {* A: [
- uint8_t data[]="LED";7 R! C% S/ G: E3 U0 L4 m
- taskENTER_CRITICAL(); /* 进入临界区 */+ t3 L! @7 g' T4 b
- HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);. J1 t# `* I1 G! e! w' u" d
- taskEXIT_CRITICAL(); /* 退出临界区 */ 6 M$ l9 Y& y) }9 R
- HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);4 \0 i0 C& t4 ` _; i
- vTaskDelay(500);5 ?$ S) I/ _' |4 X8 O" X. |3 ~
- }2 H a( x% o6 J0 [# B- k7 p1 U- x
- }
复制代码- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)+ a% v) b$ y- L: w* M$ y2 A+ h
- {
4 _! i$ I1 E A( L% w - if(htim->Instance==TIM1)
0 s( S( E) N! B- D/ w1 | - {$ D$ \ c3 c6 V4 n3 X
- uint8_t data[]="TIM1 Interrupt";1 Y8 T7 H6 s1 y( L; K, B
- - o0 S4 @7 V/ t' ]7 n3 Q
- HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
+ b4 Q4 s2 x; f" L1 P/ n2 [/ T - 0 Q1 A7 S5 \9 w8 t& Y
- }
复制代码 6 y, A. M4 F* c7 K3 M
带有FreeRTOS
; f) b8 U( Q5 p# Z) ]. Q中断的临界区
. z+ {+ k& M4 q) U, m d
3 s, R% }* h, e3 R; @" {5 L @9 g- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)7 i9 b% B/ R: C1 _7 e9 ], o
- {2 A' H6 n4 F- b9 ~- G" ^) W
8 n' W2 ^. y8 f6 a: }7 z-
2 y6 r/ q4 g# E& W$ B/ T& _: b - BaseType_t xYieldRequired;
# x3 I1 A! s( l0 | - UBaseType_t uxSavedInterruptStatus;
7 }) \7 [5 K! v' U - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); /* 进入临界区*/
! ?" o& y2 {6 @* S. N( r4 D5 {3 S0 o - {- p/ c5 V, l4 V( ~7 C
- /* 用户可以在这里添加临界段代码,我们这里暂时未用到*/6 _$ y* V. Y6 F5 B. C
- if(htim->Instance==TIM1)8 R& v- i/ h2 p" I
- {9 S* @$ Q, Y& N! M
- uint8_t data[]="TIM1 Interrupt";+ R1 ?. C+ f6 H( n7 L
-
; X8 ] V$ D9 n3 f5 p - HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
0 c' r- K6 _0 O - , m% J) V$ z6 Y+ r) \) x
- }
, j6 J4 J8 G% l+ x7 v - # j% c1 S; E0 N" r! m( K
- }
. Z) Y1 h M$ K - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); /* 退出临界区*/
+ a+ v; N! I% C$ F - /** 恢复挂起任务*/2 J+ Y5 b y, l$ H1 X
- xYieldRequired = xTaskResumeFromISR(xHandleTaskLED);* C; L: K( @) s4 b
- /* 退出中断后是否需要执行任务切换*/( d( r5 @ s/ S" y
- if( xYieldRequired == pdTRUE )
3 B' ^7 x4 d* P* W( `7 _+ u+ \ - {1 U3 {# Z$ }" ^" C
- portYIELD_FROM_ISR(xYieldRequired);
* c+ d/ u' E: |7 c I. O - }
7 m3 F3 @2 l. ^1 [- c" q. i - }! L9 b0 W c n" Y% a3 @. P/ G+ C1 A
- * |2 z& k2 {+ \
复制代码
. L9 M* b+ y. I' |% N' x |