新手上路
- 积分
- 34
- 金钱
- 34
- 注册时间
- 2014-10-12
- 在线时间
- 0 小时
|
5金钱
PA0是原例子程序的输入端,用TIM2的通道1进行捕获,我想加一路PA2输入,用TIM5通道3进行捕获,我想计算两个上升沿的时间差(默认PA0的上升沿先到)
下面是依葫芦画瓢 写的部分代码
TIM_ICInitTypeDef TIM2_ICInitStructure;
TIM_ICInitTypeDef TIM5_ICInitStructure;
void TIM2_Cap_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM5, ENABLE); //使能TIM2 TIM5时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 清除之前设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0 下拉
GPIO_ResetBits(GPIOA,GPIO_Pin_2); //PA2 下拉
//初始化定时器2和定时器5 TIM2 &TIM5
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(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIM2的时间基数单位
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIM5的时间基数单位
//初始化TIM2&TIM5输入捕获参数
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 选择输入端 IC1映射到TI1上
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
TIM_ICInit(TIM2, &TIM2_ICInitStructure);
TIM5_ICInitStructure.TIM_Channel = TIM_Channel_3; //
TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //
TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
TIM_ICInit(TIM5, &TIM5_ICInitStructure);
//中断分组初始化
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级0级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断
TIM_Cmd(TIM2,ENABLE ); //使能定时器2
}
我遇到的问题是:1、这里的中断分组初始化是只要TIM2的通道1有上升沿产生就中断,那么TIM5的通道3产生上升沿时该如何处理?可以在中断服务程序里面处理TIM5的通道3的上升沿不?
2、TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE) 、TIM_Cmd(TIM2,ENABLE )这两个函数的意思没太弄懂,是使能TIM2要产生中断?
3、TIM2有四个通道,可以同时用不?比如我用TIM2的通道1捕获一个上升沿,TIM2的通道3捕获另外一路信号的上升沿
|
最佳答案
查看完整内容[请看2#楼]
1,这就和统计高电平脉宽是类似的思路。 第一次上升沿的时候,先清零CNT,然后记录溢出次数,然后第二次上升沿时,记录CNT值。第二次记录到的值+溢出次数,就是两次上升沿的时间差(还要根据定时器频率换算下)。
2,同一个中断函数即可。
回复【4楼】wei555:
---------------------------------
判断有没有更新中断、捕获中断。
|