请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 14:30
时钟配置* e" a3 w3 K* Y+ B
20210710145725120.png
( 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( F
2021071014574973.png
7 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
20210710145824733.png

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

/ `3 }' w& @3 q
收藏 评论0 发布时间:2021-11-8 14:30

举报

0个回答

所属标签

相似分享

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