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

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

[复制链接]
STMCU小助手 发布时间:2022-1-30 01:00
  在STM32 的定时器,除了 TIM6 和 TIM7,就是通过检测 TIMx_CHx 上的
2 e4 N' d8 K2 c; ?' x边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候, 将当时定时器. M5 E9 n) f3 }0 K
的值(TIMx_CNT) 存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,
% Q2 o5 ?1 R9 n0 G; F' c- T完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等。

5 |2 [7 A( l- F* _! s1)开启 TIM5 时钟和 GPIOA 时钟, 配置 PA0 为下拉输入。
9 I1 F' A) B4 u* l
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能 TIM5 时钟
* g. m0 |! X  z0 N2 E6 x8 wRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能 GPIOA 时钟& X, D+ B( R- G1 k" \
2) 初始化 TIM5,设置 TIM5 的 ARR 和 PSC。% O8 L/ c$ Q9 D1 M6 _8 D4 A' K
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;- e6 X4 q% v- y; z  r" l8 t
/ `7 T# k+ \- [- H+ n; i
TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值" p2 I+ E% Y. X/ l. I
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
* a6 a  |3 n( @( OTIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
6 _, q8 ?" i% n! nTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式/ X0 b+ ]# y9 F. o/ T
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据指定的参数初始化 Tim5' ]& H2 t! R/ C; M! i4 j/ c
3)设置 TIM5 的输入比较参数,开启输入捕获
, o, Q% h# p1 N) E% R
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);3 _$ x5 j# H& [

* l* ^4 b7 K6 L# ~
TIM_ICInitTypeDef TIM5_ICInitStructure;; B% |6 J4 k$ k( I& |* f  g- L
TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1 映射到 TI1 上! L7 c7 ~, t7 X5 W
TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
0 T& Z0 B2 R: Y  Z# LTIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到 TI1 上
8 \" _. Z1 ]( X( J/ z5 ZTIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
) E7 j$ F3 a- `0 T6 s; V& VTIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波2 U0 @8 Y# b3 J  N+ v6 i
TIM_ICInit(TIM5, &TIM5_ICInitStructure);
2 M5 p7 M! e! x" T
4)使能捕获和更新中断(设置 TIM5 的 DIER 寄存器)
5 l" b# d- z) f6 I2 T: {# q" }- [
1 [! |6 ^+ [8 p; r3 S8 O& P
TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断和捕获中断- H2 @" ^$ P6 D7 o, [' a6 l$ E
if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET){}//判断是否为更新中断& ?/ u5 A/ N4 J# d2 d" e9 k# l4 ~4 Z7 V
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET){}//判断是否发生捕获事件
" s$ x$ ?6 i' p3 {& @4 n* ]TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update);//清除中断和捕获标志位$ U4 u. y( j5 Q& g
- W$ }9 X4 x" O' h' w! ?
6)使能定时器(设置 TIM5 的 CR1 寄存器)
3 n3 u8 X; |2 h2 P$ I% K* b9 t
TIM_Cmd(TIM5,ENABLE ); //使能定时器 5* s$ h1 k) b' P7 J% G: ]; T2 `
* f2 N( x. b- Q* L: e% T
  1. //定时器 5 通道 1 输入捕获配置
      N8 u: [. w( s
  2. TIM_ICInitTypeDef TIM5_ICInitStructure;
    , v2 M7 `) B+ z' x( Q8 y, r
  3. void TIM5_Cap_Init(u16 arr,u16 psc). F) @* K0 y. Q3 J( c
  4. {2 N8 T$ E; Q  j& e
  5.     GPIO_InitTypeDef GPIO_InitStructure;
    % S3 k. y5 v" r6 K3 r
  6.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    9 x3 S' g' W: p5 I: q) g2 b+ A  ^  R/ o
  7.     NVIC_InitTypeDef NVIC_InitStructure;
    $ O) I. z5 i9 o$ n, o
  8.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //①使能 TIM5 时钟
    % a, R4 w: I/ [5 ?5 U6 K
  9.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //①使能 GPIOA 时钟3 j1 f/ x/ P0 v: ?
  10.   //初始化 GPIOA.0 ①" s; H9 f1 h- J/ X0 v$ H
  11.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 设置
    5 F9 ^$ B- _3 P! K
  12.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入
    . k$ P3 u4 I. \( L/ V9 v9 O3 q* n
  13.   GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.0$ G: n- m% `; g! X
  14.   GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0 下拉$ j6 p  B7 }! J4 {0 e4 Z2 F6 x) O
  15.   //②初始化 TIM5 参数
    5 r- H4 M. [2 w8 z6 H
  16.     TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
    ! W4 k9 Z! X/ o
  17.     TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器
    - N( B3 a! |2 R) F0 j. ~/ y9 q  K
  18.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
    " d7 x2 x6 ]2 \& w1 g+ H" U' g' z
  19.     TIM_TimeBaseStructure.TIM_CounterMode =         TIM_CounterMode_Up; //TIM 向上计数模式( M  R$ f7 E' {+ ?9 k5 [( o
  20.     TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //初始化 TIMx4 @: @; l" g+ G* K: y
  21.   //③初始化 TIM5 输入捕获通道 1
    + O7 ^1 `& n# ~$ u7 h& N+ h
  22.     TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1 映射到 TI1 上# o! G  h$ l# y! [  W9 B
  23.     TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获- R8 q- \# }2 k- y; u/ `& h
  24.     TIM5_ICInitStructure.TIM_ICSelection =                 TIM_ICSelection_DirectTI; //映射到 TI1 上
    , \  f# W3 Z* T9 q! J: v+ w
  25.     TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
    9 G" X; K+ c% {' r: P# D( {3 K
  26.     TIM5_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波$ k! k: V" r6 c" @3 |; T- ~
  27.     TIM_ICInit(TIM5, &TIM5_ICInitStructure); //初始化 TIM5 输入捕获通道 10 H  `& V! s! h1 d6 o. W* R
  28.   //⑤初始化 NVIC 中断优先级分组6 R# V6 j7 [' p
  29.     NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //TIM3 中断
    # [! y: u" F1 R6 D2 f. C
  30.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级 2 级; w1 o0 R1 A$ M$ n& s6 F  D
  31.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级 0 级: D5 o' l6 V+ d3 T8 G/ X. I
  32.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能! O$ _2 `, ^9 O
  33.     NVIC_Init(&NVIC_InitStructure); //初始化 NVIC1 w+ y/ i% A+ n
  34.     TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//④允许更新中断捕获中断+ @" Y+ h, s& e* W
  35.     TIM_Cmd(TIM5,ENABLE ); //⑥使能定时器 5
    2 q( U! q. S: h/ F1 `" j
  36. }
复制代码
* {9 r" m% T4 N7 Z) K, \8 W! l
收藏 评论0 发布时间:2022-1-30 01:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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