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

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

[复制链接]
STMCU小助手 发布时间:2022-1-30 01:00
  在STM32 的定时器,除了 TIM6 和 TIM7,就是通过检测 TIMx_CHx 上的
边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候, 将当时定时器
的值(TIMx_CNT) 存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,
完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等。

1)开启 TIM5 时钟和 GPIOA 时钟, 配置 PA0 为下拉输入。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能 TIM5 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能 GPIOA 时钟
2) 初始化 TIM5,设置 TIM5 的 ARR 和 PSC。
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据指定的参数初始化 Tim5
3)设置 TIM5 的输入比较参数,开启输入捕获
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

TIM_ICInitTypeDef TIM5_ICInitStructure;
TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1 映射到 TI1 上
TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到 TI1 上
TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
TIM_ICInit(TIM5, &TIM5_ICInitStructure);
4)使能捕获和更新中断(设置 TIM5 的 DIER 寄存器)

TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断和捕获中断
if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET){}//判断是否为更新中断
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET){}//判断是否发生捕获事件
TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update);//清除中断和捕获标志位

6)使能定时器(设置 TIM5 的 CR1 寄存器)
TIM_Cmd(TIM5,ENABLE ); //使能定时器 5

  1. //定时器 5 通道 1 输入捕获配置
  2. TIM_ICInitTypeDef TIM5_ICInitStructure;
  3. void TIM5_Cap_Init(u16 arr,u16 psc)
  4. {
  5.     GPIO_InitTypeDef GPIO_InitStructure;
  6.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  7.     NVIC_InitTypeDef NVIC_InitStructure;
  8.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //①使能 TIM5 时钟
  9.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //①使能 GPIOA 时钟
  10.   //初始化 GPIOA.0 ①
  11.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 设置
  12.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入
  13.   GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.0
  14.   GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0 下拉
  15.   //②初始化 TIM5 参数
  16.     TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
  17.     TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器
  18.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
  19.     TIM_TimeBaseStructure.TIM_CounterMode =         TIM_CounterMode_Up; //TIM 向上计数模式
  20.     TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //初始化 TIMx
  21.   //③初始化 TIM5 输入捕获通道 1
  22.     TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1 映射到 TI1 上
  23.     TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
  24.     TIM5_ICInitStructure.TIM_ICSelection =                 TIM_ICSelection_DirectTI; //映射到 TI1 上
  25.     TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
  26.     TIM5_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波
  27.     TIM_ICInit(TIM5, &TIM5_ICInitStructure); //初始化 TIM5 输入捕获通道 1
  28.   //⑤初始化 NVIC 中断优先级分组
  29.     NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //TIM3 中断
  30.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级 2 级
  31.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级 0 级
  32.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
  33.     NVIC_Init(&NVIC_InitStructure); //初始化 NVIC
  34.     TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//④允许更新中断捕获中断
  35.     TIM_Cmd(TIM5,ENABLE ); //⑥使能定时器 5
  36. }
复制代码

收藏 评论0 发布时间:2022-1-30 01:00

举报

0个回答

所属标签

相似分享

官网相关资源

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