void Delay_us(uint32_t xus) { SysTick->LOAD = 72 * xus; //设置定时器重装值 SysTick->VAL = 0x00; //清空当前计数值 SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器 while(!(SysTick->CTRL & 0x00010000)); //等待计数到0 SysTick->CTRL = 0x00000004; //关闭定时器 } 解释上述代码,与执行的功能
时间: 2023-12-30 11:06:54 浏览: 163
STM32F407单片机16bit_DAC_AD5689模拟量(-10V~10V)电压输出实验KEIL工程源码.zip
5星 · 资源好评率100%
上述代码是一个用于进行微秒级延时的函数`Delay_us`。下面是代码的功能解释:
1. `SysTick->LOAD = 72 * xus;`:设置SysTick定时器的重装值,即定时器计数器减到0时重新加载的值。这里假设系统时钟频率为72MHz,乘以 `xus`(延时时间,单位为微秒)是为了将微秒转换为定时器的计数值。
2. `SysTick->VAL = 0x00;`:清空当前计数值,将计数器的初始值设置为0。
3. `SysTick->CTRL = 0x00000005;`:配置控制寄存器,使SysTick定时器开始工作。其中,`0x00000005` 的二进制表示为 `0000 0000 0000 0000 0000 0000 0000 0101`,对应以下功能:
- Bit 0:使能SysTick定时器
- Bit 1:使用外部时钟源(HCLK)作为计数时钟
4. `while(!(SysTick->CTRL & 0x00010000));`:在循环中等待SysTick定时器的计数器到达0。这里使用位与运算 `&` 和位取反运算 `!` 来检查SysTick定时器控制寄存器的 Bit 16(COUNTFLAG)位是否为1。只有当计数器到达0时,Bit 16 才会置位。
5. `SysTick->CTRL = 0x00000004;`:关闭SysTick定时器。将控制寄存器的 Bit 0(ENABLE)位置0,即禁用SysTick定时器。
综上所述,该函数的功能是使用SysTick定时器实现微秒级的延时。根据提供的延时时间,函数设置定时器的重装值、启动定时器、等待计数器到达0,最后关闭定时器。这样可以实现指定微秒级的延时。
阅读全文