时钟配置* e" a3 w3 K* Y+ B
( p9 g. M" K& P% U5 z! O
8 G! r7 W6 B+ r, ]1 t- U; x+ b
TIM配置
+ d% A. v0 L" i- e7 v7 _; W7 d( F7 s+ ?+ X2 j* N" \) L. {) z
6 `' h$ h% h- l
3s一次中断" Q' H* U" P! m" A0 @! h
2 X: S1 s' [8 }6 L中断配置3 E* P# O: s* c' A0 r5 p9 l7 T
' y0 T* v/ q2 C5 T# m' I" c$ h# K f s0 J6 ~, ~
开启% L6 u) C* l z$ w9 f1 ?& o
- HAL_TIM_Base_Start_IT(&htim1);
复制代码- 任务中的临界区. K' g+ x) J2 J# c! s( d& p V; [
- static void vTaskLED(void *pvParameters)
- k0 O8 d: B3 g4 V* V1 k, W - {2 @0 _: [8 W9 f [) P
- while(1)3 P8 G, T# e- a. _
- {
- v9 X7 R+ y8 l* B8 r+ C5 i3 a - uint8_t data[]="LED";
% j, R0 }% V2 s6 z1 t; E7 b. h - taskENTER_CRITICAL(); /* 进入临界区 */
( c$ u7 b- `) p5 B4 b. ^; I1 W - HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
* d8 `4 N* Z! _* s; z( G! G, U - taskEXIT_CRITICAL(); /* 退出临界区 */ ; J# t6 u, S0 f) P' {
- HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
* s( B8 F! S7 M - vTaskDelay(500);
# z5 g! u: M: r, t4 I8 `( v& f - }
) o0 B4 v0 W" r9 @9 f* w6 C - }
复制代码- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)" A, `% w+ b% f4 d7 O1 r' C
- {
0 [/ C; V [* s9 k9 b& O& W; a - if(htim->Instance==TIM1)
7 {9 ^) M" \) M7 N7 ]- m. } - {
" @- v3 L& s. L" Q - uint8_t data[]="TIM1 Interrupt";
7 T6 C+ r8 ?) ^# G - & a" w& C9 k5 S; u# d# ]
- HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);; i: ^) B4 h5 P- f5 L! P$ r
- $ A H# I$ I$ l* ^8 l
- }
复制代码 8 @+ V* V& @" } D/ ?3 q
带有FreeRTOS
$ e" X$ g: R! v! q% d中断的临界区% u8 A9 d( `1 Y! l: B
4 q5 E7 c/ `; p1 t& l' f# j! c% R4 \- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)1 W1 T& H: ]- r; B" q7 P2 K2 t
- {5 E- P6 r% m( V9 ]0 p7 r
- 1 m4 c% a3 q$ G$ X0 M7 \" q
- 7 O2 X' X. k# t" F6 h
- BaseType_t xYieldRequired;
" Y* m' R3 S w d7 Y: K - UBaseType_t uxSavedInterruptStatus;
4 ~7 f" i3 f" G! p& F" l - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); /* 进入临界区*/* ]9 T9 d2 R1 D1 D
- {9 H5 h2 d& k+ N2 E/ k$ O. }
- /* 用户可以在这里添加临界段代码,我们这里暂时未用到*/4 k3 N# E* |! B. A4 \
- if(htim->Instance==TIM1)& f2 @, O0 m2 M3 ]
- {
" {1 v" ^# W& m J, C9 y - uint8_t data[]="TIM1 Interrupt";0 K" p6 {9 y3 `3 t; @, x y: ]
-
4 a4 S* U0 M3 I& x8 @& [ - HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);+ A) B V# u( w- S
-
, h |! @& E* ?; p+ c8 A+ l - }5 j: `7 D6 i* W* X4 D- I* m% ]
-
7 w, F- A5 ] W" M) | - }& \& E" U9 L1 U3 |: N6 \
- portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); /* 退出临界区*/0 r$ ^3 T7 n, V0 N4 b
- /** 恢复挂起任务*/) J8 i+ ?# B- H* A
- xYieldRequired = xTaskResumeFromISR(xHandleTaskLED);5 I; V! {& b. u! _, B7 W7 T
- /* 退出中断后是否需要执行任务切换*/
' z" ?4 e' F8 x. a - if( xYieldRequired == pdTRUE )
: {$ p2 h: o! h+ A- [6 j) B0 W - {
) s4 B4 @% P" d% Q) X: E - portYIELD_FROM_ISR(xYieldRequired);
; @' C- {: b7 z' k" S" ~ - }: e$ F: E1 w. Z2 S; X
- }3 _& M7 D. O, b
- ! k; r- {' e; ^
复制代码
/ `3 }' w& @3 q |