Debugging STM8S103F3控制器中的TIM2模块在1U处未滴答作响

Debugging STM8S103F3控制器中的TIM2模块在1U处未滴答作响,debugging,microcontroller,stm8,Debugging,Microcontroller,Stm8,我在STM8S103F3上创建了一个程序,使用TIM2模块生成微秒范围内的延迟,但计时器没有按预期滴答作响,当我尝试使用它调用5秒延迟时,它给出了大约3秒的延迟。我使用的是16MHz HSI振荡器,定时器前置标量设置为16。请看下面我的代码。请帮我找出我的代码有什么问题 void clock_setup(void) { CLK_DeInit(); CLK_HSECmd(DISABLE); CLK_LSICmd(DISABLE); CLK_H

我在STM8S103F3上创建了一个程序,使用TIM2模块生成微秒范围内的延迟,但计时器没有按预期滴答作响,当我尝试使用它调用5秒延迟时,它给出了大约3秒的延迟。我使用的是16MHz HSI振荡器,定时器前置标量设置为16。请看下面我的代码。请帮我找出我的代码有什么问题

void clock_setup(void)
{
       CLK_DeInit();
       CLK_HSECmd(DISABLE);
       CLK_LSICmd(DISABLE);
       CLK_HSICmd(ENABLE);
       while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE);
       CLK_ClockSwitchCmd(ENABLE);
       CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
       CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
       CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI,
                            DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);
       CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, DISABLE);
       CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, DISABLE);
       CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, DISABLE);
       CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE);
       CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, DISABLE);
       CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, DISABLE);
       CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, DISABLE);
}

void delay_us(uint16_t us)
{
    volatile uint16_t temp;
    TIM2_DeInit(); 
    TIM2_TimeBaseInit(TIM2_PRESCALER_16, 2000); //Prescalar value 8,Timer clock 2MHz
    TIM2_Cmd(ENABLE);  
    do{
        temp = TIM2_GetCounter();
    }while(temp < us);
    TIM2_ClearFlag(TIM2_FLAG_UPDATE);
    TIM2_Cmd(DISABLE); 
} 

void delay_ms(uint16_t ms)
{
    while(ms--)
    {
        //delay_us(1000);
        delay_us(1000);
    }
}
void时钟设置(void)
{
CLK_DeInit();
CLK_HSECmd(禁用);
CLK_LSICmd(禁用);
CLK_HSICmd(启用);
while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY)==FALSE);
时钟开关CMD(启用);
时钟预分频器配置(时钟预分频器1);
CLK_系统CLKConfig(CLK_预分频器CPUDIV1);
时钟开关配置(时钟开关模式自动、时钟源HSI、,
禁用,CLK_CURRENTCLOCKSTATE_ENABLE);
CLK_外围设备时钟配置(CLK_外围设备SPI,禁用);
CLK_外围设备时钟配置(CLK_外围设备I2C,禁用);
CLK_外围设备时钟配置(CLK_外围设备ADC,禁用);
CLK_外围设备时钟配置(CLK_外围设备AWU,禁用);
CLK_外围设备时钟配置(CLK_外围设备UART1,禁用);
时钟外设时钟配置(时钟外设定时器1,禁用);
时钟外设时钟配置(时钟外设定时器2,禁用);
}
无效延迟(uint16)
{
挥发性uint16温度;
TIM2_Denit();
TIM2_TimeBaseInit(TIM2_预分频器_16,2000);//预分频值8,定时器时钟2MHz
TIM2_Cmd(启用);
做{
temp=TIM2_GetCounter();
}而(温度
最好使用10us的时基对延迟进行舍入。为了获得10us的时基,如果你使用16MHz的主时钟,你将TIM2预调为16,那么你会得到1us的增量时间,对吗?但我们希望TIM2溢出以生成名为16us事件的事件。因为我们知道计时器将每1U递增一次,如果我们使用重新加载值65536-10=65526,这将给我们一个10us溢出,因此,10us时基。如果我们在延迟代码中没有问题,我们只需检查TIM2更新标志,以了解它是否溢出。请参见下面的示例代码段

// Set up it once since our time base is a fixed 10us
void setupTIM2(){
    TIM2_DeInit(); 
    TIM2_TimeBaseInit(TIM2_PRESCALER_16, 65526); //Prescalar value 16,Timer clock 1MHz
}

void delay_us(uint16_t us)
{
    volatile uint16_t temp;
    
    TIM2_Cmd(ENABLE);
    const uint16_t count = us / 10; //Get the required counts for 10us time base
    // Loop until the temp reaches the required count value
    do{
        while(TIM2_GetFlagStatus(TIM2_FLAG_UPDATE) == RESET); //Wait for the TIM2 to overflow
        TIM2_ClearFlag(TIM2_FLAG_UPDATE); // Clear the overflow flag
        temp++;
    } while(temp < count);
    
    TIM2_Cmd(DISABLE); 
} 

void delay_ms(uint16_t ms)
{
    while(ms--)
    {
        //delay_us(1000);
        delay_us(1000);
    }
}

void main(void){
    ...
    setupTIM2();
    ...
    delay_ms(5000);
}
//设置一次,因为我们的时基是固定的10us
void setupTIM2(){
TIM2_Denit();
TIM2_TimeBaseInit(TIM2_预分频器_1665526);//预分频值16,定时器时钟1MHz
}
无效延迟(uint16)
{
挥发性uint16温度;
TIM2_Cmd(启用);
const uint16\u t count=us/10;//获取10us时基所需的计数
//循环,直到温度达到所需的计数值
做{
while(TIM2_GetFlagStatus(TIM2_FLAG_UPDATE)==RESET);//等待TIM2溢出
TIM2_ClearFlag(TIM2_FLAG_UPDATE);//清除溢出标志
temp++;
}而(温度<计数);
TIM2_Cmd(禁用);
} 
无效延迟毫秒(uint16毫秒)
{
而(ms--)
{
//延迟(1000);
延迟(1000);
}
}
真空总管(真空){
...
setupTIM2();
...
延迟(5000);
}

TIM2是一个16位宽的计时器。根据您的配置,您的计数时间似乎是1U。使用此配置,您无法生成大于(2^16 x 1us)的延迟,即65536毫秒。不要在do-while循环中读取计时器,只需检查它是否溢出,然后使用它的时基即可获得良好的延迟结果。在这种情况下,您的时基是65536毫秒,这是非常大的。您最好设置计时器,使其每1ms溢出一次,以产生1ms的时基。然后在这个时间基础上构建延迟。这会更有意义。并不是说你不能使用我的建议来处理少于1毫秒的延迟。Hi@Kozmotronik,这就是问题所在。我想创造最小的16uS延迟。