野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12568|回复: 6

定时器计数,进不去中断

[复制链接]
发表于 2016-5-18 17:00:08 | 显示全部楼层 |阅读模式
我在使用定时器计数的时候,当外部有脉冲的时候,没办法进去定时器中断。使用STM32的计数器外部时钟功能,来对外部脉冲信号进行计数。
TM2_CH2为脉冲输入口,配置GPIOB_PIN3输入,TM2计数器在TI2端的上升沿计数
下面是我的代码

void TIM2_External_Clock_CountingMode(void)
{      
       GPIO_InitTypeDef GPIO_InitStructure;
       TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/*输入管脚*/
       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);  
       GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_TIM2);
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
/*计数器*/
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
       TIM_DeInit(TIM2);                        
       TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
       TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
       TIM_TimeBaseStructure.TIM_ClockDivision = 0x00;//TIM_CKD_DIV1
       TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
       TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x00;
       TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);  //

       TIM_TIxExternalClockConfig(TIM2, TIM_TIxExternalCLK1Source_TI2, TIM_ICPolarity_Rising, 0);
        TIM_SetCounter(TIM2, 0);
      TIM_ClearFlag(TIM2, TIM_FLAG_Update);   
      TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
      TIM_Cmd(TIM2, ENABLE);              
      TIMx_NVIC_Configuration();   
}
static void TIMx_NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

int main(void)   
{
        TIM2_External_Clock_CountingMode();//     
while(1)
     {      
         
     }   
}      


回复

使用道具 举报

发表于 2016-5-18 17:25:18 | 显示全部楼层
没用过,
不过看你这里配置的是TIM_IT_Update中断,TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
而周期为 TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
所以应该是收到0xFFFF个脉冲才会进入一次中断吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-18 17:44:03 | 显示全部楼层
你的意思是说我把这个地方的0xffff改成1是不是就会,一个脉冲就进中断一次啊
我试一试啊 谢谢。
回复 支持 反对

使用道具 举报

发表于 2016-5-18 18:02:12 | 显示全部楼层
松子玲叶 发表于 2016-5-18 17:44
你的意思是说我把这个地方的0xffff改成1是不是就会,一个脉冲就进中断一次啊
我试一试啊 谢谢。

嗯,我猜是这样,你试下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-19 08:27:59 | 显示全部楼层
我试过了 ,数字变小可以进去中断,但是如何计这个脉冲数啊,TIM_GetCounter(TIM3)这个函数貌似不能直接用了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-19 08:37:50 | 显示全部楼层
flyleaf 发表于 2016-5-18 18:02
嗯,我猜是这样,你试下

用定时器完成外部计数,请问我设置了重载值IM_TimeBaseStructure.TIM_Period = 0xFFFF;当重载值变成0的时候,我进入中断,此时是不是外部出发了65536个脉冲,跳出中断后是不是就是65536+TIM_GetCounter(TIM2)累计脉冲;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-19 08:38:13 | 显示全部楼层
flyleaf 发表于 2016-5-18 18:02
嗯,我猜是这样,你试下

用定时器完成外部计数,请问我设置了重载值IM_TimeBaseStructure.TIM_Period = 0xFFFF;当重载值变成0的时候,我进入中断,此时是不是外部出发了65536个脉冲,跳出中断后是不是就是65536+TIM_GetCounter(TIM2)累计脉冲;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-25 03:39 , Processed in 0.025263 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表