初级会员

- 积分
- 70
- 金钱
- 70
- 注册时间
- 2021-12-8
- 在线时间
- 12 小时
|
想用定时器2的通道1对外部脉冲计数,但无反应,有没有大佬指点一二
定时器代码
void TIM2_Int_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能PA端口时钟
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM2);
GPIO_Init(GPIOA,&GPIO_InitStructure);
//定时器设置-------------------------------------------------------------
TIM_TimeBaseInitStructure.TIM_Period = 65535; //重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=0; //预分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分割
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//初始化TIM2
//TIM_ETRClockMode1Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);//外部计数
TIM_TIxExternalClockConfig(TIM2,TIM_TIxExternalCLK1Source_TI2,TIM_ICPolarity_Rising,0);
//溢出中断设置--------------------------------------------------------------
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
//Reset counter-----------------------------------------------
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //允许TIM2溢出中断
TIM_SetCounter(TIM2,0); //TIM2->CNT=0
TIM_Cmd(TIM2, ENABLE);
}
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ///使能TIM3时钟
TIM_TimeBaseInitStructure.TIM_Period = arr; //自动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断
TIM_Cmd(TIM3,ENABLE); //使能定时器3
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_SetCounter(TIM3,0);
}
int COUNT=0;
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位
COUNT++;
}
}
//定时器3中断服务函数
unsigned char i=0;
u32 frq;//连续存取10次的测频法得到的频率
unsigned int pul_num;//标准时间内的脉冲数量
unsigned int cnt;//读取当前计数值
unsigned int last_cnt=0;//上一次的计数值
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
{
// cnt = TIM_GetCounter(TIM2);//读取定时器2对外部脉冲的计数结果
// if(cnt >= last_cnt)//如果发生过溢出,当前计数结果就有可能比上次的计数结果还小
// pul_num = (unsigned int)(COUNT<<16)+ (unsigned int)(cnt - last_cnt);
// else
// pul_num = (unsigned int)((COUNT-1)<<16) + (unsigned int)(65536 + cnt - last_cnt);
// last_cnt = cnt;//将当前计数结果复制到上次的复制结果寄存,方便下次计算
// frq = pul_num * 100;//由于定时器3是1/100秒溢出一次,所以频率时脉冲个数的100倍
// COUNT=0;
cnt = TIM_GetCounter(TIM2);
pul_num=COUNT*65535+cnt;
frq = pul_num * 100;
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位
}
|
|