时钟配置
/ M0 ~0 V, U, X( E# T1 U2 ]
$ X2 L q$ R% n# L8 ]
+ v/ O4 f8 b9 H/ `) G! OTIM配置
, ^$ Q1 [. Z4 j6 p2 P7 e1 P& `( T
8 T; u7 w' k* ~* |0 I
3s一次中断
/ j! G3 k4 _' D# r5 ~+ x# k. ?" l: X
中断配置 d; D+ V2 M/ P9 Z% {1 l$ t
4 l9 i2 ?3 o8 _
/ z z- l1 U9 ]0 T# [- h开启
& W" k1 c; j% ? - HAL_TIM_Base_Start_IT(&htim1);
复制代码- 任务中的临界区 ^ f5 |) K* S6 M
- static void vTaskLED(void *pvParameters)
8 K' b' d( { ^( j) @8 X - {
! x, Q5 q! i1 w. z; B5 }! F - while(1). U4 W" t; o/ L$ l8 u. e# R
- {
G( b9 V; R! |4 D* M7 ]1 F( j" v - uint8_t data[]="LED";
: k) [6 w1 e5 m. _" m9 l - taskENTER_CRITICAL(); /* 进入临界区 */
) M4 P& G# [/ U5 m+ W3 L - HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
+ @! q& R. ^% O - taskEXIT_CRITICAL(); /* 退出临界区 */
6 { j. l/ b& ` K# _ - HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
* S& z* p' w) x" d; R/ ~ - vTaskDelay(500);6 M. C z+ L R4 n4 g2 b
- }
. k5 c' N! O- V0 r4 ^ - }
复制代码- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim), _/ ]3 ^5 S( h2 \4 S+ Q5 L
- {
. m9 P" K( R' r% N - if(htim->Instance==TIM1)6 x/ @0 L1 G9 G: D$ {: ~1 W
- {
! e' U, Q3 P& ]3 b! ~7 d4 M - uint8_t data[]="TIM1 Interrupt";
3 I7 l$ N9 m0 _4 b& ?( C6 m - $ r5 _" L& W9 M7 C g: ^) ?9 s
- HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
, \$ g, f7 H& V' a) x
) M6 S' f& I7 X% b5 l N- }
复制代码
( v& D i, {& x7 ^带有FreeRTOS* E/ u. Z3 [7 H& Z s
中断的临界区
( x, o) c1 ^, G! ?6 S1 P. B- x7 ]* f. a8 \# @0 Q
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)* r8 W6 A( y6 t/ l2 P4 c5 D; l
- { S: ^. \2 ?( z( L7 |
7 l+ X% E2 Z) e7 D0 y0 d# M. j j-
# X" i% U" u0 t7 O! l) u7 ` - BaseType_t xYieldRequired;" T6 l/ M; a6 n6 ~) S0 g2 w
- UBaseType_t uxSavedInterruptStatus;
6 X7 l5 Z: r: |! Z - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); /* 进入临界区*/6 z n( _! I1 k( v; ?* Q
- {
) I! O4 n5 H _: X! X - /* 用户可以在这里添加临界段代码,我们这里暂时未用到*/% @$ E) w3 c7 O6 t% s3 A5 R
- if(htim->Instance==TIM1)
$ O8 _! H( L C& W - {* `$ [4 X7 O; D! i
- uint8_t data[]="TIM1 Interrupt";6 ?9 @8 \4 m# I! T! }
-
6 q( l' l# M: Z e; R& K - HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
1 f: i* q# _# Y5 U, D -
. s' @+ w. w5 { - }) A6 M. G: m* W5 W" E/ C& [
-
1 R" x" w) k- C, _/ I( R- i - }/ b/ |0 r3 `* V9 K2 N- B
- portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); /* 退出临界区*/
* \$ k1 o) I& a' W3 ]8 {) i& R6 J - /** 恢复挂起任务*/0 C' K/ }4 o0 X& \
- xYieldRequired = xTaskResumeFromISR(xHandleTaskLED);
! N9 t. k, |& v V' s/ ?1 Z3 T - /* 退出中断后是否需要执行任务切换*/
; U9 x4 v' F) ?: a, [" { - if( xYieldRequired == pdTRUE )' r- X* A9 p: r" g0 o1 S
- { y' Z- t& C) p9 p
- portYIELD_FROM_ISR(xYieldRequired);
$ v5 I3 G1 v& U1 W9 g# Y7 t - }
4 k! o) ]' E/ l8 ]# y5 e - }
0 `3 E0 @& x' s* n) D! w - " U) |" k. m! I7 p' w" `& g- T
复制代码
6 c. g# N7 Z, G' ?- r |