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

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

[复制链接]
STMCU小助手 发布时间:2022-1-30 01:00
  在STM32 的定时器,除了 TIM6 和 TIM7,就是通过检测 TIMx_CHx 上的/ {$ o* k) M! F. S$ K$ U3 M' S
边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候, 将当时定时器& C0 O8 L* ^& e4 Z- d' g/ E
的值(TIMx_CNT) 存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,1 _2 n0 E: Y) H1 T: }/ f9 P
完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等。
" h& w( B9 X' w) q# E
1)开启 TIM5 时钟和 GPIOA 时钟, 配置 PA0 为下拉输入。
  @! C8 [& b* T* [2 h. u
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能 TIM5 时钟
4 u6 O2 I; g8 o) j  D+ z  GRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能 GPIOA 时钟8 l3 ~& I+ _7 B8 r
2) 初始化 TIM5,设置 TIM5 的 ARR 和 PSC。5 e) D5 m5 k7 w) P
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;. n$ E( H2 h6 I, m1 [4 D$ ~
" a. G/ l5 Y3 r7 v" q
TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值* o+ y6 {' [+ F$ P! r5 i! X
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值% Z, Z$ m4 X& i: g8 P8 I3 \
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
& X5 a+ [0 w. |9 \2 w6 s6 Z% ~- MTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式: e: r0 f4 G( X4 \
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据指定的参数初始化 Tim5
% F' U3 J: S( r8 F: A2 U5 J
3)设置 TIM5 的输入比较参数,开启输入捕获
: }- \. `+ ^; L3 E. R7 v
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);8 y8 Q7 i) a# `% H3 n" V

4 |: b( }; o" V& S/ g+ V
TIM_ICInitTypeDef TIM5_ICInitStructure;
4 J. f% c; z. j& l% B6 \TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1 映射到 TI1 上
/ |3 C3 x; y* Q1 p* u5 y3 U- WTIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获+ p  j$ o0 y7 H0 ?1 j
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到 TI1 上; u/ v! r: k: S. B; i) Q
TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频8 J* v. v0 N+ G. ~9 r3 i; z5 S6 b9 F
TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
* i, @$ f& W. c2 p/ z6 ~9 G' nTIM_ICInit(TIM5, &TIM5_ICInitStructure);
& U( ^- B2 r) j! G
4)使能捕获和更新中断(设置 TIM5 的 DIER 寄存器)
; @0 v1 g+ W/ ~7 H- Z' P3 t5 ]
( I3 t1 t# M3 p2 Q5 z5 z
TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断和捕获中断
' b6 F9 `) _3 R+ z, l! s: m
if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET){}//判断是否为更新中断
9 v: ~6 _- @  N  w, uif (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET){}//判断是否发生捕获事件' [& R! o( X, m; O3 H6 q- Y5 f6 |* d
TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update);//清除中断和捕获标志位
. S3 p$ W2 E' ~; i& N1 H2 b
; m4 a6 J8 J1 o2 z+ }8 b
6)使能定时器(设置 TIM5 的 CR1 寄存器)* s6 f2 i% y, @2 ^- E6 B
TIM_Cmd(TIM5,ENABLE ); //使能定时器 5
2 ]. d; D8 q, K! a

- R) h8 _0 C! x, |) I3 ~* E
  1. //定时器 5 通道 1 输入捕获配置
    . F$ i- z2 V* v! [
  2. TIM_ICInitTypeDef TIM5_ICInitStructure;4 _5 Q7 U, i; }  A$ l' R
  3. void TIM5_Cap_Init(u16 arr,u16 psc)
    / j& k$ w, q4 T) [" h6 N
  4. {4 o- k& C& M3 T8 p; I+ _3 K
  5.     GPIO_InitTypeDef GPIO_InitStructure;4 I" Q: D: i0 t
  6.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    4 f8 J& z0 t* l# c
  7.     NVIC_InitTypeDef NVIC_InitStructure;( o3 `8 L  {5 o, p0 Q
  8.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //①使能 TIM5 时钟
    6 S! Y" C+ g0 j7 u% H9 X$ o
  9.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //①使能 GPIOA 时钟
    4 [8 R0 e5 E0 t. h
  10.   //初始化 GPIOA.0 ①
    # }2 p8 L) K4 g& I) ^
  11.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 设置
    & T' _. K' F: o6 x; j( u1 r3 i/ A
  12.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入
    0 k/ E+ l8 E# Y5 S! `
  13.   GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.0
    1 F$ c' b" U, x, D7 T  @, g' H3 i
  14.   GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0 下拉
    - {! P, n1 Y* U" l
  15.   //②初始化 TIM5 参数
    . I. {" n" i5 _2 D9 _* u
  16.     TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值0 \7 I5 j' o( f5 W, T
  17.     TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器
    , y7 {. R* O3 ]1 T7 n1 P1 h5 Y
  18.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim! k" j* l0 y! A7 ~& ?
  19.     TIM_TimeBaseStructure.TIM_CounterMode =         TIM_CounterMode_Up; //TIM 向上计数模式
    2 t0 P6 o0 b# s- t
  20.     TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //初始化 TIMx# Y* H3 I2 q, a* Q3 Z
  21.   //③初始化 TIM5 输入捕获通道 1
    ' H: h" j6 s  S. I* N+ Y
  22.     TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1 映射到 TI1 上
    ) n# ^" w' j$ T' a! u
  23.     TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
    - k* S; Q6 ]+ D5 L$ u2 G8 c5 W
  24.     TIM5_ICInitStructure.TIM_ICSelection =                 TIM_ICSelection_DirectTI; //映射到 TI1 上
    ! w  H( {: ~; o- z- s# k9 Y
  25.     TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频/ y) i3 b3 q% k
  26.     TIM5_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波
    7 B" B3 u( _1 b1 l
  27.     TIM_ICInit(TIM5, &TIM5_ICInitStructure); //初始化 TIM5 输入捕获通道 1( H$ c; |4 q( V9 ]
  28.   //⑤初始化 NVIC 中断优先级分组
    # h- e8 ~; T% [) x+ v
  29.     NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //TIM3 中断7 y' D" m$ ?- _" J; N" J. A
  30.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级 2 级9 }# G& o& Y5 y9 K* p) G! Y' X: @4 [
  31.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级 0 级0 ]) _! {: I  V7 O7 p! G+ S
  32.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
    $ {/ V0 e' y( v7 {( G% W. {! m1 d
  33.     NVIC_Init(&NVIC_InitStructure); //初始化 NVIC
    0 x2 x& E9 p& u7 F7 T" S8 g% [0 \
  34.     TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//④允许更新中断捕获中断$ w. P( i# v: v% W3 y  y! i
  35.     TIM_Cmd(TIM5,ENABLE ); //⑥使能定时器 5
    + _1 h' G( B: X3 d$ M1 K9 o( Y
  36. }
复制代码

/ w1 m! k: [7 F: I& H, K4 [* L
赞 收藏 评论0 发布时间:2022-1-30 01:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版