liudingding 发表于 2023-3-15 16:10:52

帮忙看看为什么STM32F407定时器1比较1通道一直中断

本帖最后由 liudingding 于 2023-3-15 18:01 编辑

如题,STM32F407定时器半懂不懂,写了个程序,想比较通道1中断,通道1比较数据20000,远大于计数器达到的上限,不可能匹配,怎么中断函数一直响应呢?void TIM1_CC_IRQHandler(void) 函数一直响应,
//TIM1 PWM部分初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_init(u16 arr,u16 psc)      //通道4
{                                                      
        arr--;
        psc--;
        RCC->APB2ENR|=1<<0;      //使能定时器1的时钟时钟84MHz
        TIM1->CCR1   =20000;   //比较1通道
        arr=30;
        psc=30;
        TIM1->ARR    =arr;                       //设定计数器自动重装值
        TIM1->PSC    =psc;                       //预分频器不分频
        TIM1->CCMR1 |=6<<4;           //CH1 PWM1模式               
        TIM1->CCMR1 |=1<<3;            //CH1 预装载使能          
        TIM1->CR1   |=1<<7;          //ARPE使能
        TIM1->DIER|=3<<0;      //允许更新中断        允许比较1中断
        TIM1->CR1   |=0x01;      //使能定时器1
        TIM1->BDTR|=1<<15;   //主输出使能      比其它计数器多的一条
      MY_NVIC_Init(2,2,TIM1_UP_TIM10_IRQn,2);          //
      MY_NVIC_Init(1,2,TIM1_CC_IRQn,2);              //
}
//定时器1中断服务程序       
void TIM1_UP_TIM10_IRQHandler(void)
{                                                               
        if(TIM1->SR&0x0001)   //溢出中断
        {
                UH=0;
        }                                  
        TIM1->SR&=~(1<<0);    //清除中断标志位           
}

void TIM1_CC_IRQHandler(void)
{                                                               
        if(TIM1->SR&0x0002)   //比较1中断
       {
                UH=0;
       }                                  
           TIM1->SR&=~0x0002;    //清除中断标志位           
}

diego2003 发表于 2023-3-20 16:41:59

这个还是找寄存器配置高手吧,实在看不懂

Doding 发表于 2023-3-20 17:03:00

放弃标准库吧。
T1计数器和CCR寄存器都是16位的,20000<65535。

LL00 发表于 2023-3-20 18:05:20

从手册上找了个图,不确实是不是LZ要的模式
关注一下CCR值超过ARR后,OCREF一直为高,CCxIF标志位会保持,所以清了会再进。
页: [1]
查看完整版本: 帮忙看看为什么STM32F407定时器1比较1通道一直中断