2us延时
void sys_udelay(uint32_t us)
{
volatile int i;
uint32_t cnt;
cnt = SystemCoreClock / 1000000;
cnt = (cnt > 0) ? (cnt) : (1);
cnt = us / 1000 / cnt / 4;
for (i = 0; i < cnt; ++i)
__NOP();
}
us延时
1.滴答定时器 us延时, 1us为3us左右
如果使用滴答定时器做系统循环,不能使用这个
void delay_us(uint32_t nus)
{
int32_t temp;
SysTick->LOAD = 9 * nus;
SysTick->VAL = 0X00;//清空计数器
SysTick->CTRL = 0X01;//使能,减到零是无动作,采用外部时钟源
do
{
temp = SysTick->CTRL;//读取当前倒计数值
}
while((temp&0x01) && (!(temp&(1<<16))));//等待时间到达
SysTick->CTRL = 0x00; //关闭计数器
SysTick->VAL = 0X00; //清空计数器
}
2.定时器us延时
//也没有想象中的精准,在10us一下也有误差
uint16_t differ = 0xffff-nus-5; //设定定时器计数器起始值
__HAL_TIM_SET_COUNTER(&htim1, differ);
HAL_TIM_Base_Start(&htim1); //启动定时器
while(differ < 0xffff - 5) //补偿,判断
{
differ = __HAL_TIM_GET_COUNTER(&htim1); //查询计数器的计数值
}
HAL_TIM_Base_Stop(&htim1);
3.for循环实现延时us
/*
for循环实现延时us
*/
uint32_t delay = nus * 72/12;
do
{
__NOP();
}
while (delay --);