求教 stm8 微秒精确延时问题

2019-07-14 22:26发布

在用ds18b20温度传感器,微妙级别要求。
求教
我设置的一分频 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
用下边的微秒延时,总是都不出来,有点怀疑是延时问题,哪位大神帮忙分析下
void delay_us(u16 z)     //微秒延时
{
  while(z--)
  {
    nop();nop();nop();nop();
  }
}

下边的us延时行得通吗?
/****stm2查询法***/
void delay_us(u16 i)  
{
tiM2_DeInit();
TIM2_TimeBaseInit(TIM2_PRESCALER_1,16);
while (i--)
{
TIM2_Cmd(ENABLE);
while (TIM2_GetFlagStatus(TIM2_FLAG_UPDATE )!=1);
TIM2_ClearFlag(TIM2_FLAG_UPDATE);
TIM2_Cmd(DISABLE);
}
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
maozi108
2019-07-15 06:38
哈哈,好像没人回答我来扯两句,
1、先说18B20,它的延迟可以多不可以少不需要灰常精确。
2、这个延迟函数void delay_us(u16 z)     //微秒延时
{
  while(z--)
  {
    nop();nop();nop();nop();
  }
}我在最新版本的IAR for STM8 2.20.1上仿真了下,每个while循环需要11个时钟周期,进出函数需要20个时钟周期。也就是说delay_us(2)需要20+11*2=42个时钟周期8M的晶振就是42/8=5.25us。同理delay_us(100)需要20+100*11=1120个周期建议去掉只保留1个nop好计算。
3.中断,stm8刚点亮了第一个LED不是很懂,但是考虑进出函数的压栈用时肯定不止一两us,如果延迟都在10us以上没问题如果想精确延迟就1个us还是宏定义nop nop ...的准。

一周热门 更多>