Timer STM32定时器2倍慢

Timer STM32定时器2倍慢,timer,stm32,cpu-registers,Timer,Stm32,Cpu Registers,我正在使用,我想设置延时计时器,单位为µs。但是当我把所有的东西都设置好后,我会得到一个2倍大的。我正在寻找任何我可能错过的预分频器,但我没有找到任何东西 设置为: //enable peripheral clock for TIM17 RCC->APB2ENR |= (0x1U << 18); //Set HSI48 as clock source while((RCC->CR2 >> 17) & 0x01U != 0x01U){ //w

我正在使用,我想设置延时计时器,单位为µ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
}
//为TIM17启用外围时钟
RCC->APB2ENR |=(0x1U CR2>>17)和0x01U!=0x01U){//等待HSI48就绪
}
RCC->CR2 |=(0x1U CFGR |=0x00000003U;//将HSI48设置为时钟源
//为每0.1毫秒的刻度设置TIM17预分频器值
TIM17->PSC=4799;
//调用delay func->10000应该会导致1秒的延迟,但我得到2秒
无效提姆17_delayUs(10000);
无效TIM17\u延迟(uint16\u t延迟){
TIM17->CNT=0x0U;//空计数器
TIM17->CR1&=~(0x1U ARR=(48*延迟)/(预分频器+1);//设置延迟
TIM17->CR1 |=(0x1U CR1 |=(0x1U ARR=0xFFFFU;//重置ARR
while((TIM17->SR&0x1U)==0){//等待溢出事件
}

TIM17->CR1&=~(0x1U SR&=~(0x1U我找不到错误。但是如果
预分频器的值是4799,那么
TIM17->ARR=(48*延迟)/(预分频器+1);
行的计算结果是100,这似乎是错误的

此代码可以用更简单的方式编写。代码越少,错误发生的可能性越低。忘记ARR、TIM start&stop和中断标志。将ARR保持在max(0xffff,默认值)。换句话说,使TIM17成为一个自由运行的计时器,它始终处于启用状态

//TIM17设置
TIM17->PSC=4799;//设置预分频器
TIM17->CR1 |=TIM_CR1_CEN;//启动计时器
TIM17->EGR |=TIM_EGR_UG;//为预分频器更新生成更新事件
//延迟函数
延迟100us(uint16\u t us100){
uint16\u t start=TIM17->CNT;
而((TIM17->CNT-start)
好的,我有这个错误。那行
TIM17->ARR=(48*delay)/(预分频器+1);
有两个错误。首先,正如你所说,这是一个糟糕的公式,其次,我忘了在initFunc()中保存预分频器值。所以我一直在除以1。谢谢你的帮助:)