中级会员
 
- 积分
- 214
- 金钱
- 214
- 注册时间
- 2015-12-25
- 在线时间
- 65 小时
|
15金钱
我想根据网上《用STM32触发捕捉实现告诉、高精度测频》的方法做一个频率计,但是现在遇到了关于定时器内部触发上面的问题。原文链接:http://www.mesnet.com.cn/fileup/HTML/20130310.shtml
上面是选择将TIM4作为主模式定时器,TIM2作为从模式定时器,通过对TIM4->CR2,将主控模式设为输出溢出触发脉冲。然后通过设置TIM2的从模式控制寄存器(SMCR)的从模式选择(SMS[2:0])设为复位模式,同时选择TIM4内部触发。现在我遇到的问题是不能进入到TIM2的比较中断里面,想请教一下大家。
我的代码:
//配置TIM4
void TIM4_Int_Init(u16 arr,u16 psc) //9999,7199
{
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //
TIM4->ARR=arr; //
TIM4->PSC=psc; //
TIM4->SMCR |= 0<<14; //禁止外部时钟模式模式2
TIM4->SMCR |= 0<<0; //关闭从模式
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM3
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ
NVIC_Init(&NVIC_InitStructure); //
TIM4->DIER|=1<<0; //允许中断更新
TIM4->CR1|=0x01; //使能计数器
}
//定时器4中断
void TIM4_IRQHandler(void)
{
if(TIM4->SR&0X0001) //
{
TIM4->SR&=~(1<<0);//清除标志位
TIM4->CR2 |= 2<<4;//主控模式设为输出溢出触发脉冲
LED2_REV;//对LED2取反
}
}
//定时器计数器2的简单配置
void TIM2_Excnt_Init(u16 arr,u16 psc)
{
TIM2->ARR = arr;
TIM2->PSC = psc;
TIM2->SMCR = 3<<4;//TS=011;内部触发TIM4
TIM2->SMCR = 4<<0;//SMS=100;复位模式
TIM2->DIER|=1<<0;
TIM2->CR1|=1<<0;
}
void TIM2_IRQHandler(void)
{
if(TIM2->SR&0X0002)//
{
LED3_REV;
TIM2->SR&=~(1<<1); //
}
}
int main(void)
{
delay_init();
LED_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
TIM4_Int_Init(9999,7199);//1s中断
TIM2_Excnt_Init(0xffff,0);//
while(1)
{
//delay_ms(200);
}
}
代码有些不符合格式,还请见谅,这是我调试的。
现在是TIM4能进入中断,LED2能正常取反,但是LED3处于一直亮的状态,希望有知道的同学能帮我解答一下,谢谢了。
|
|