历史上的今天
今天是:2025年08月21日(星期四)
2019年08月21日 | STM32 TIM1输入捕获配置
2019-08-21 来源:eefocus
最近做一个IRIG-B码对时的项目用到STM32的TIM1输入捕获功能,配置TIM1的输入捕获遇到很多坑,在这里总结下,希望对大家有帮助。
项目中用到的输入引脚为PE13,为TIM1_H3即TIM1的第3通道,这里提醒大家在使用引脚功能时最好查看引脚的重映象表,看是否要开启重映象,功能为捕获高电平脉宽,具体配置如下:
1.首先配置GPIO
/* GPIO引脚配置 */
void R_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);//开启引脚时钟
GPIO_PinRemapConfig(GPIO_FullRemap_TIM1,ENABLE); //开启TIM1重映象
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //PE13
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //引脚设置为上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
2.配置TIM1
/* TIM1输入捕获配置 */
void Time_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM1_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //TIM1 时钟使能
TIM_ClearITPendingBit(TIM1, TIM_IT_Update ); //清除TIM1更新中断标志
//定时器 TIM1 初始化
TIM_TimeBaseStructure.TIM_Period = 7199; //设置自动重装载寄存器的周期值,使100ms产生一次中断
TIM_TimeBaseStructure.TIM_Prescaler = 999; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分频系数
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //初始化 TIM1
//TIM1输入捕获参数配置
TIM1_ICInitStructure.TIM_Channel = TIM_Channel_3; //捕获通道IC3
TIM1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //直接映射
TIM1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //不分频,每个变化沿都捕获
TIM1_ICInitStructure.TIM_ICFilter = 0x00;//不滤波
TIM_ICInit(TIM1, &TIM1_ICInitStructure);
//中断优先级 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; //TIM1 捕获中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
NVIC_Init(&NVIC_InitStructure); //初始化 NVIC 寄存器
TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC3,ENABLE); //使能更新中断和捕获中断
TIM_Cmd(TIM1, ENABLE); //使能定时器
}
配置TIM1的时候有几点要很小心:
1.TIM1在APB2时钟总线上,所以应使用RCC_APB2PeriphClockCmd()函数使能TIM1时钟;
2.TIM1有多种中断,这里选择捕获比较中断,即TIM1_CC_IRQn;
3.引脚为TIM1_CH3,即TIM1的3通道,中断标志位TIM_IT_CC3。
3.中断服务函数配置
/* TIM1 中断服务程序 */
void TIM1_CC_IRQHandler(void)
{
if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查TIM1更新中断标志
{
overflow++;
}
else if (TIM_GetITStatus(TIM1, TIM_IT_CC3) != RESET) //检查TIM1通道3捕获中断标志
{
if(state == START) //初始状态
{
overflow = 0;
TIM_SetCounter(TIM1,0);
state = WAIT_FALLING;
TIM_OC3PolarityConfig(TIM1,TIM_ICPolarity_Falling); //设置为下降沿捕获
}
else if(state == WAIT_RISING) //捕获上升沿
{
// TIM1CH3_CAPTURE_VAL = TIM_GetCapture3(TIM1);
// value = TIM1CH3_CAPTURE_VAL + (overflow*7200);
overflow = 0;
TIM_SetCounter(TIM1,0);
state = WAIT_FALLING;
TIM_OC3PolarityConfig(TIM1,TIM_ICPolarity_Falling); //设置为下降沿触发
}
else // 捕获下降沿
{
TIM1CH3_CAPTURE_VAL = TIM_GetCapture3(TIM1);
value = TIM1CH3_CAPTURE_VAL + (overflow*7200);
overflow = 0;
TIM_SetCounter(TIM1,0);
state = WAIT_RISING;
TIM_OC3PolarityConfig(TIM1,TIM_ICPolarity_Rising); //设置为上升沿触发
}
}
TIM_ClearITPendingBit(TIM1, TIM_IT_Update|TIM_IT_CC3 ); //清除TIM1更新中断标志和捕获标志
}
这里需要注意几点:
1.TIM1的中断服务函数名要注意,此次用到的是TIM1的捕获比较中断,所以为void TIM1_CC_IRQHandler(void);
2.改变捕获极性的函数要注意,此处为改变通道3捕获极性的函数,所以为TIM_OC3PolarityConfig();
3.通道3获取捕获值函数为TIM_GetCapture3();
4.因为我只需要高电平脉宽,所以只需要在捕获上升沿的时候获取捕获值即可。
经过测试高电平脉宽为10毫秒时捕获值为720,5ms时捕获值为360。
公式为:脉宽=((1 + TIM_Prescaler)/系统时钟频率)*捕获值
史海拾趣
|
摘要:本文介绍典型的轻型客车电控燃油喷射系统方案的基本组成,主要传感器及其工作原理、自诊断系统,分析ECU 控制电路的工作过程。 关键词:电控燃油喷射系统 ECU 系统控制电路 自诊断系统 前言 随着世界环境保护的呼声越来越高,国家环保 ...… 查看全部问答> |
|
legacy SD Bus Driver和SD Bus Driver 求助!!! 最近在调试一个WinCE项目,学着玩的!~ 在选组件时,选到Device Drivers下sd及sdio时,sd下有两个单选项:legacy SD Bus Driver和SD Bus Driver,想问问他俩有啥区别啊? SDIO ...… 查看全部问答> |
|
一直没接触过操作系统, 程序中一直是一个while(1)循环, 顺序执行相应的任务, 突发时间就用中断处理, 如果用μC/OS-2, 有什么不一样了?… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 03:46 编辑 1、基本仪器清单 数字电桥 直流稳压电源 量角器 米尺 四位半数字万用表 0~200℃温度计 秒表 20MHz双路普通示波器 2、主要元器件清单 MSP430单片机 显示器件 小型电动车 晶体三极管 标准 ...… 查看全部问答> |
|
LCD通用时序设计: 原帖请见:http://www.cnblogs.com/fishplj2000/archive/2012/02/29/2373465.html 2012-02-29 15:08:34 一、水平扫描一行: parameter ||||| &nbs ...… 查看全部问答> |
|
9851要两个,80M1mv能得60分,AD不高速,需要变压器 本帖最后由 paulhyde 于 2014-9-15 03:04 编辑 四句话不相干的,别看岔了 [ 本帖最后由 huo_hu 于 2013-9-3 18:19 编辑 ] … 查看全部问答> |




