在用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);
}
}
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 ...的准。
一周热门 更多>