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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 14:30
时钟配置: l2 E& y- z1 x- B
20210710145725120.png

8 R; h8 E3 ]6 Q$ s3 [) L
" }4 a3 f. B; \2 `# P% X+ m9 OTIM配置& P: b5 }4 _9 F4 }' {' G- M$ |
2021071014574973.png
. 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# ~
20210710145824733.png
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      
  1. HAL_TIM_Base_Start_IT(&htim1);
复制代码
  1. 任务中的临界区3 u$ A) R/ V8 N+ e+ n) @
  2. static void vTaskLED(void *pvParameters)
    # f; Q' P5 G: h7 m3 J1 P
  3. {
    % p, U( g, N0 W4 I% l
  4.     while(1)7 e! ^/ T3 s- K& \9 q" y$ Y- U
  5.     {                        
    3 J9 g( q; s* v; O# Y5 H! U
  6.                         uint8_t data[]="LED";7 C  X2 @. O/ y6 ?5 ~5 c, x
  7.                         taskENTER_CRITICAL();   /* 进入临界区 */
    / \* z$ A( J( k: j% a
  8.                         HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
    9 P6 H$ K3 H2 b3 K
  9.                         taskEXIT_CRITICAL();          /* 退出临界区 */        6 M" B2 G. ~0 x7 q7 ]- }- F
  10.                         HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);' C# n9 b" n1 K% n& O3 N% x3 n: D
  11.                                         vTaskDelay(500);
    + Y0 L# L* O* _# g7 u  U" j2 y1 l- a; b
  12.     }
    7 }* E0 L% F8 J- j  i# _# \2 D' _
  13. }
复制代码
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    0 J# t! `, `5 {1 w5 `
  2. {
    , q# `. |! N! l) o! ]1 f5 z  r6 r
  3.         if(htim->Instance==TIM1): k" u, D  K8 Z# A
  4.         {
    5 t4 c  j* N5 c. c
  5.                         uint8_t data[]="TIM1 Interrupt";0 b% X2 c, k7 Q! `0 [1 _5 e

  6.   [* \1 K, C6 N4 \
  7.                         HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
    9 y& @- [2 L7 z' U' V

  8. ( D0 G! M5 T0 [' K' t
  9.         }
复制代码

- \& ^& N% k: y3 ]. K0 C带有FreeRTOS, i( t; v; {) x5 S$ N
中断的临界区, G' L7 [& m  }( d; J% Y
, L8 }7 i( g3 u
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    & W0 C, _! ?$ r/ H8 @5 [
  2. {
    + z- a. O  }# x5 t$ r( M6 w' j
  3. 2 C1 H2 u: v: Y( j/ X9 U
  4.         ( M+ Y: _! L( B  T
  5.         BaseType_t xYieldRequired;
    . r6 }% ]3 J- S. Y$ f
  6.         UBaseType_t uxSavedInterruptStatus;
    - o& s# u/ G/ {! p: L6 e
  7.         uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); /* 进入临界区*/
    * |8 T# Q) _% m1 Y5 s( G
  8.         {% a7 @7 O+ [- F
  9.                 /* 用户可以在这里添加临界段代码,我们这里暂时未用到*/
    $ V$ C, S+ c; D$ j+ K4 x  e$ F
  10.                 if(htim->Instance==TIM1)
    $ g0 D8 _, S' A$ g/ U
  11.                 {
    ; y# Z- U& f; F, ~
  12.                         uint8_t data[]="TIM1 Interrupt";
    / t" D5 v' K1 K: @+ o4 `
  13.                 - S) J+ T5 h' N% U2 L
  14.                         HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
    4 e3 p! I8 O; T
  15.         
    / l% L  Y4 i7 a+ d9 a. \+ q
  16.                 }
    7 U% a  o1 m6 r
  17.         4 K. A4 r: ^( Z0 x6 U# i
  18.         }8 ^  m6 e/ k4 ]1 [( @1 J$ F8 v
  19.         portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); /* 退出临界区*/, u1 r- \7 o0 m! y, J" T$ x2 \
  20.         /** 恢复挂起任务*// T  Q" _% n; ]5 F# u. C3 g4 @
  21.         xYieldRequired = xTaskResumeFromISR(xHandleTaskLED);1 }/ _, d3 F3 ]' x0 S0 [& s
  22.         /* 退出中断后是否需要执行任务切换*/
    2 i. e/ [: k4 k* {
  23.         if( xYieldRequired == pdTRUE )! S; A  A/ X9 a. z* b
  24.         {
    0 D( H+ l; b& V
  25.                 portYIELD_FROM_ISR(xYieldRequired);
    9 T- i7 n& X% ~% T# C) E3 H
  26.         }1 J$ C& R( Y" u. I! w
  27. }
    5 c8 L: ~6 t5 T; b6 p' F, o0 n
  28.   o5 v4 M7 C2 b8 L7 B% j
复制代码

0 m5 |7 b- R8 R0 T
收藏 评论0 发布时间:2021-11-8 14:30

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版