标题: STM32F103用TIM2做计数器没进入中断 [打印本页]

作者: qingcaia    时间: 2018-10-26 15:25
标题: STM32F103用TIM2做计数器没进入中断
刚开始玩STM32,遇到一个问题,定时器做外部计数器用的时候没起作用。。。
while(1)
{
        delay_ms(100);
        CTR_Write_Config(Test_Address,CTR_Cap_Ceramic);                                        //打开通道
        CTR_Write_Config(COM_Address, CTR_Cap_TIM&CTR_L_GND);                        //打开振荡频率计数器,电感端接地
        CTR_Write_Config(Power_Address,CTR_Lo_GND);                                                //测试电容另一端接地
        delay_us(100);                                                                                                                                
                                       
                                               
        TIM2_Count_Init(5000,2);//TIM2初始化
        TIM2_ON();//打开TIM2
        while(1);
}
void TIM2_Count_Init(u16 arr,u16 psc)
{
                TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
                GPIO_InitTypeDef  GPIO_InitStructuer;
               
                TIM_DeInit(TIM2);        //初始化TIM2
                RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //①时钟 TIM2 使能
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
                //定时器 TIM2 初始化
                GPIO_InitStructuer.GPIO_Pin=GPIO_Pin_0;
                GPIO_InitStructuer.GPIO_Mode=GPIO_Mode_IN_FLOATING;
                GPIO_InitStructuer.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOA,&GPIO_InitStructuer);
               
                TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载寄存器周期的值
                TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置时钟频率除数的预分频值
                TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割
                TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数
                TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //②初始化 TIM2
                TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted, 0);//不使用采样滤波  外部时钟模式2
       
}

void TIM2_ON(void)
{
                TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位,避免第一次自动进入中断一次
                TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //③允许更新中断
                TIM_SetCounter(TIM2,0);//设置计数初值
                //中断优先级 NVIC 设置       
                NVIC_InitTypeDef NVIC_InitStructure;
                NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM8 中断
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级 1 级
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级 3 级
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
                NVIC_Init(&NVIC_InitStructure); //④初始化 NVIC 寄存器
               
                TIM_Cmd(TIM2, ENABLE); //⑤使能 TIM8
}


void TIM2_IRQHandler(void)   //TIM2计数器中断
{
                if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //检查TIM2更新中断发生与否
                {
                                TIM_ClearITPendingBit(TIM2, TIM_IT_Update);                  //清除TIMx更新中断标志
                                Register_over_count ++;                                                                                                                        //脉冲溢出计数
                                LED1 = ~LED1;
                }
                TIM_ClearITPendingBit(TIM2, TIM_IT_Update);                                  //清除TIMx更新中断标志
}


计数器程序参考的网上的,结果计数器完全没进过中断,PA0口的示波器信号量了没有问题。




捕获.PNG (15.58 KB, 下载次数: 28)

捕获.PNG

作者: CrlikenNN    时间: 2018-10-28 10:14
把tim2的初始化放在while(1)的外面




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1