你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G0 TIM中断使用

[复制链接]
STMCU小助手 发布时间:2021-11-8 14:30
时钟配置3 s% d  h1 z, x1 U1 {7 t
20210710145725120.png

; {5 ~1 p5 ~( X6 M+ ]( e7 F$ s' b+ h( c/ K0 a; \; L4 g
TIM配置
9 V  g7 k$ T; A" V, [! t% }: U3 z$ W( k
2021071014574973.png

8 W. n; o6 @8 f$ J& D+ J6 ~: J9 x' @: P
3s一次中断0 z" o# y0 _0 ?6 z. S
4 f& ~" T) G4 C& m$ K
中断配置! d" k% q8 U8 u8 D3 ^
20210710145824733.png

% z, Z& v8 X  m: j7 `, u: K, x6 a0 r2 p- Q1 Y. A# w
开启
6 d7 g9 ^7 O' S, e/ \      
  1. HAL_TIM_Base_Start_IT(&htim1);
复制代码
  1. 任务中的临界区# I2 B7 B5 F% T: O# c# L0 w
  2. static void vTaskLED(void *pvParameters)
    5 X! V% @- o& b+ N6 A
  3. {
    $ C: H4 K$ ?  y. v/ T1 B
  4.     while(1)4 V( r( w1 y' U3 W6 B9 T. k
  5.     {                        : R3 z: |. o# j  x; M
  6.                         uint8_t data[]="LED";
    & W) Y' J; \5 B. ^, t  }
  7.                         taskENTER_CRITICAL();   /* 进入临界区 */
    * v& j+ f  k6 }* b9 X; g  k" R
  8.                         HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
    % c6 V4 g( ?) V  t8 A
  9.                         taskEXIT_CRITICAL();          /* 退出临界区 */        
    " O8 }8 T/ v; R* ^3 q. Y/ x: @
  10.                         HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
    ' b5 d! O8 j# I7 w7 w
  11.                                         vTaskDelay(500);# s. C) b4 w( w3 o! Z+ r: y& \
  12.     }
    7 ?3 {) e" X8 t
  13. }
复制代码
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    " ]7 o" K+ a2 x7 K! b. {5 Q1 {# \
  2. {# K7 X# V! ?4 {5 f5 s" G
  3.         if(htim->Instance==TIM1)5 a, m: z. u1 m$ Y
  4.         {1 d( @! m6 ^( H; M- i
  5.                         uint8_t data[]="TIM1 Interrupt";. U4 x& w# ^( i$ ?2 J) l# _" P; a
  6. 4 J* d% x; j7 Q" v3 u4 W
  7.                         HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
    ' K, c* r9 `2 i4 S/ R
  8. & D* y! R) C; v9 s& x+ z+ L8 N0 S! E
  9.         }
复制代码
: n+ R' t( P4 l  u, o
带有FreeRTOS
6 j' G1 H7 K6 D  ]* l$ ]中断的临界区
1 Z% `$ R& c1 j0 M
8 I6 n- X! w+ i9 l4 v
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)( O, F5 q; p( a( j1 h
  2. {
    ' ^* r6 d, g  m& s- h1 c

  3. 6 `* b' o8 x* }+ v, @0 K
  4.         & C! K7 t1 b; A6 X- C
  5.         BaseType_t xYieldRequired;
    / Z: @/ x+ L) k; q
  6.         UBaseType_t uxSavedInterruptStatus;0 \- G9 Z9 o- j* _, G6 J3 w
  7.         uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); /* 进入临界区*/) l9 U; V7 Z" q: q2 z- K
  8.         {
      q5 f3 L" n( H( [, j. k
  9.                 /* 用户可以在这里添加临界段代码,我们这里暂时未用到*/; F2 w% y! s8 j# @$ {* c! M2 `
  10.                 if(htim->Instance==TIM1)
    3 j9 i% l) e0 N9 P( l( r
  11.                 {
    / U- N, c- o+ A. C6 R! e
  12.                         uint8_t data[]="TIM1 Interrupt";
    9 G/ [5 l  f: g2 r$ F+ U7 S
  13.                
    5 j, h( O" `. x. a, _  |% H
  14.                         HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);. S: L2 L5 T5 [# g* N1 y: B, w
  15.         0 }/ E+ C, D' u& Y
  16.                 }
    , _9 p' M7 e" v* @
  17.         - \. N1 v. ^3 n3 q$ W+ ?
  18.         }* B' u* G) t2 p& j
  19.         portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); /* 退出临界区*/
    / K/ t+ E) z4 z
  20.         /** 恢复挂起任务*/( K9 _3 {# c& z/ g4 M3 F( t
  21.         xYieldRequired = xTaskResumeFromISR(xHandleTaskLED);) S& \# y" O0 r% z6 }
  22.         /* 退出中断后是否需要执行任务切换*/1 s% v; X! B/ \4 O3 v9 K# a+ Y* c7 Z4 X
  23.         if( xYieldRequired == pdTRUE )9 k9 _8 }' R) W3 Y, h. _
  24.         {" D7 r3 U2 B6 \# C) H& p
  25.                 portYIELD_FROM_ISR(xYieldRequired);7 e% t1 g3 Z% x
  26.         }, V/ K2 b0 H! W6 W2 [$ |, x) M
  27. }
    7 Q: W( @! }6 x6 g2 Y

  28. 2 i# r0 u* m# {% L
复制代码
7 R& J% O: n, i
收藏 评论0 发布时间:2021-11-8 14:30

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版