STM32 定时器慢 2 倍

STM32 timer 2x slower

我正在使用 STM32F042C4 并且我想设置以 µs 为单位的延迟计时器。但是当我设置所有内容时,我得到了 2 倍大。我正在寻找任何我可能会错过的预分频器,但我还没有找到任何东西。

设置为:

//enable peripheral clock for TIM17
RCC->APB2ENR |= (0x1U << 18);

//Set HSI48 as clock source
while((RCC->CR2 >> 17) & 0x01U != 0x01U){      //wait for HSI48 ready
}
RCC->CR2 |= (0x1U << 16);                      //Enable HSI48
RCC->CFGR |= 0x00000003U;                      //Set HSI48 as clock source

//set TIM17 prescaler value for tick every 0,1 ms
TIM17->PSC = 4799;

//call delay func -> 10 000 should result in 1 sec delay, BUT I GET 2 SECONDS
void TIM17_delayUs(10000);

void TIM17_delayUs(uint16_t delay){
    TIM17->CNT = 0x0U;                                      //null counter
    TIM17->CR1 &= ~(0x1U << 7);                             //ARR buffer disable
    TIM17->ARR = (48*delay)/(prescaler+1);                  //set delay
    TIM17->CR1 |= (0x1U << 7);                              //ARR buffer enable

    TIM17->CR1 |= (0x1U << 0);                              //enable counter
    TIM17->ARR = 0xFFFFU;                                   //reset ARR

    while((TIM17->SR & 0x1U) == 0){                         //wait for overflow event
    }
    TIM17->CR1 &= ~(0x1U << 0);                             //disable timer
    TIM17->SR &= ~(0x1U << 0);                              //clear event flag
}

如果我查看寄存器,我可以看到 AHB 和 APB 预分频器是 1,所以定时器的时钟源应该是 48Mhz。而且我在定时器计数器之前看不到另一个预分频器,所以那个问题在哪里?

Clock diagram for STM32F042

TIM17 block diagram

我找不到错误。但是,如果 prescaler 值为 4799,则 TIM17->ARR = (48*delay)/(prescaler+1); 行的计算结果为 100,这似乎是错误的。

这段代码本可以用更简单的方式编写。更少的代码意味着更低的错误可能性。忘记 ARR、TIM 启动和停止以及中断标志。将 ARR 保持在最大值(0xffff,默认值)。换句话说,使 TIM17 成为一个免费的 运行 计时器,它始终处于启用状态。

// TIM17 Settings
TIM17->PSC = 4799; // Set prescaler
TIM17->CR1 |= TIM_CR1_CEN; // Start timer
TIM17->EGR |= TIM_EGR_UG; // Generate update event for prescaler update

// Delay Function
delay100us(uint16_t us100) {
    uint16_t start = TIM17->CNT;
    while ((TIM17->CNT - start) < us100);
}