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