最近使用STM32F205芯片遇到一个奇怪的问题。将TIM2当做普通定时器使用,系统时钟120M,PCLK1:30M,定时器TIM2_INT默认60M,预分频1KHz:PSC=60000-1,定时时间1分钟:ARR=60000,使能自动重装载:ARPE=1,只允许更新中断:URS=1。问题就来了,定时器CNT的值在第一次更新之前,完全乱跳啊。 配置程序如下:
NVIC_SetPriority(TIM2_IRQn,NVIC_TIM2_PRIO); //TIM2优先级设置
NVIC_EnableIRQ(TIM2_IRQn); //启用TIM2中断通道
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; //使能定时器2时钟
TIM2->CR1 = TIM_CR1_ARPE | TIM_CR1_URS; //使能重装载寄存器,仅允许更新中断
TIM2->CR2 = 0x00; //主模式为复位模式
TIM2->DIER = TIM_DIER_UIE; //只使能更新中断请求
/* 由于APB1PRESC = 4,因此硬件自动设置从APB1到定时器的时钟CK_INT = PCLK1 * 2
即,输入TIM2预分频器的时钟为60MHz*/
TIM2->PSC = 60000 - 1; //预分频 CK_CNT = 1K
TIM2->ARR = 60000; //自动重装载寄存器
TIM2->CR1 |= TIM_CR1_CEN; //使能定时器
观察到CNT的值有点像PSC和ARR在第一次溢出(从0XFFFFFFFF到0x00000000)之前没有起到作用,第一次溢出之后,或者软件设置UG之后,CNT就正常了。请问有人遇到这个问题了吗?PSC和ARR除了设置UG之外,还有别的办法立即生效吗?前提是需要开启自动重装载预装载寄存器。 |