帮忙看看为什么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; //清除中断标志位
}
这个还是找寄存器配置高手吧,实在看不懂 放弃标准库吧。
T1计数器和CCR寄存器都是16位的,20000<65535。 从手册上找了个图,不确实是不是LZ要的模式
关注一下CCR值超过ARR后,OCREF一直为高,CCxIF标志位会保持,所以清了会再进。
页:
[1]