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

【经验分享】STM32 输入捕获配置

[复制链接]
STMCU小助手 发布时间:2022-1-30 01:00
  在STM32 的定时器,除了 TIM6 和 TIM7,就是通过检测 TIMx_CHx 上的
4 g3 t: G% X) X' w7 |6 a1 U边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候, 将当时定时器; k8 t6 Q& u: x# `) l! U( t
的值(TIMx_CNT) 存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,. l, r* E/ W7 s6 I+ k- s
完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等。
* K! Y5 G: A% I+ J
1)开启 TIM5 时钟和 GPIOA 时钟, 配置 PA0 为下拉输入。( S4 W/ F- B6 u, G3 V' V8 V' Y
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能 TIM5 时钟
: w& z0 y( z4 @* G! B5 O  @RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能 GPIOA 时钟' r4 D( O* x% h0 D
2) 初始化 TIM5,设置 TIM5 的 ARR 和 PSC。% \# ~+ y. S7 m) v# ]; O4 ?. h# o
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
4 H5 [9 p" s; R
8 I) k* N3 ^- {
TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
/ W' p" T: \5 U. L" e- fTIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
; G* J! F% Q1 v" Y8 T+ y* LTIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
  I' q" x' f4 _! R6 MTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式
$ A' @% ]. S4 w3 c  T* fTIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据指定的参数初始化 Tim5
" S5 h0 w3 i* E" V. o( ]" K
3)设置 TIM5 的输入比较参数,开启输入捕获
/ @1 |* L; u0 _7 J: D
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
' ~' @  Q1 m- j* Z
2 c( J+ u3 I* B8 l/ v2 y, h: s
TIM_ICInitTypeDef TIM5_ICInitStructure;
& ?! t6 R3 t/ I5 M5 ^8 X& vTIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1 映射到 TI1 上7 N5 y* e3 @) M8 a0 B3 e# _8 k  b
TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获* A3 D  ^) `/ ]6 l) E( C
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到 TI1 上
% z; I/ D5 b* F" j9 D/ DTIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频9 E! F% R; L( y) ]. A  E
TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波! Z; D: G  v4 T7 P1 A8 W
TIM_ICInit(TIM5, &TIM5_ICInitStructure);
; R; W5 s9 N) h# Z
4)使能捕获和更新中断(设置 TIM5 的 DIER 寄存器)
/ c! U* v( P$ I; T, }

. _$ l, K3 |' X% q. F; I2 F9 x
TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断和捕获中断# C! A1 ~9 k/ d# T  p" E  ^& X$ j
if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET){}//判断是否为更新中断
. \4 ~- D# O9 N- [0 C# qif (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET){}//判断是否发生捕获事件1 }" T6 k1 \& z
TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update);//清除中断和捕获标志位
: q1 D6 k" v! \  G5 G( z6 E' o
+ G8 f4 X. `5 o/ \. Y# F- W, z
6)使能定时器(设置 TIM5 的 CR1 寄存器)+ R. u& v& v4 `: V) U4 Z
TIM_Cmd(TIM5,ENABLE ); //使能定时器 53 ^7 ]" N9 f4 m  r; U4 k

3 a0 O, M( r8 l) w* E( M
  1. //定时器 5 通道 1 输入捕获配置
    % O/ x( Q3 g9 x2 x( W
  2. TIM_ICInitTypeDef TIM5_ICInitStructure;
    ; [5 h  t, J' F5 }; Z& S, L- P) h
  3. void TIM5_Cap_Init(u16 arr,u16 psc)
    4 @: T4 `8 ~" H* q$ V3 T7 ~" ]+ F, v; S
  4. {
    ; S  B* {. l  u. p$ p3 N
  5.     GPIO_InitTypeDef GPIO_InitStructure;3 |* s8 Z9 G) k
  6.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    1 U9 ^. X# N/ q5 ^* P
  7.     NVIC_InitTypeDef NVIC_InitStructure;/ q+ k1 B2 M  H6 N
  8.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //①使能 TIM5 时钟7 q" |1 P& r; R4 e. Z+ p
  9.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //①使能 GPIOA 时钟
    + s; w7 u% k& C" P4 P5 V
  10.   //初始化 GPIOA.0 ①1 I/ Z; ~+ ]6 O1 c# O3 }
  11.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 设置
    ) y; \$ T$ C3 Z  }5 P$ Y2 j
  12.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入4 H( m4 @6 b5 B9 H
  13.   GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.0
      I' T2 n- s1 q
  14.   GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0 下拉
    - h% k0 n' s: Q
  15.   //②初始化 TIM5 参数& S- r- I& Q; T! Q
  16.     TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
    # q3 D# |; a4 Q/ n9 }
  17.     TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器. E% w) Y( Q& @- r
  18.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
    5 i: J6 f' S. \" B' P
  19.     TIM_TimeBaseStructure.TIM_CounterMode =         TIM_CounterMode_Up; //TIM 向上计数模式
    6 E, ]! g8 w4 \. j1 |
  20.     TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //初始化 TIMx
    + b& k9 j/ K/ \' h5 g* ?
  21.   //③初始化 TIM5 输入捕获通道 1
    # O/ K, ~! B5 p8 @
  22.     TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1 映射到 TI1 上
    6 t: W# [' y+ P1 K
  23.     TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获- m6 V/ G, K3 O
  24.     TIM5_ICInitStructure.TIM_ICSelection =                 TIM_ICSelection_DirectTI; //映射到 TI1 上6 O" m4 k9 x2 K  c
  25.     TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频- o& x7 y0 V' ?
  26.     TIM5_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波( [( k& d/ l; ?) r  p
  27.     TIM_ICInit(TIM5, &TIM5_ICInitStructure); //初始化 TIM5 输入捕获通道 1
    " M9 Y6 g, t6 X) G5 u' y7 t& v1 C
  28.   //⑤初始化 NVIC 中断优先级分组
    & q1 \: ~/ I: ~9 B
  29.     NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //TIM3 中断
    ' E+ X) K. q8 @" ~1 d" V) j
  30.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级 2 级. C$ U* A2 R* \% y2 m: |+ I
  31.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级 0 级
    3 L9 J  C3 N5 K' D5 a' z
  32.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能6 e. R3 o% R( g3 w' Z
  33.     NVIC_Init(&NVIC_InitStructure); //初始化 NVIC
    + f& N" U' C8 Y! [2 @
  34.     TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//④允许更新中断捕获中断8 K! s; ^  k& V& e+ @$ M, ^
  35.     TIM_Cmd(TIM5,ENABLE ); //⑥使能定时器 5' i* m$ u. Q4 q* n. Y$ C" T
  36. }
复制代码

+ B! C: `7 T- A8 C7 C* h+ L( S
收藏 评论0 发布时间:2022-1-30 01:00

举报

0个回答

所属标签

相似分享

官网相关资源

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