本帖最后由 xyc2690 于 2015-1-24 20:21 编辑 常常在论坛看到有关SysTick 不能实现1us延时的问题,晚上决定亲手用示波器测一下。 首先,我的板子是NucleoSTM32F072 ,没有外接晶振,设置使用内部晶振48M(HSI48)。 时钟频率:1/48M=0.0208333us 没有使用STM32的固件库,1us延时比较短,
不能实现1us延时。 ****************************************************************** 我尝试将 SysTick->VAL=0X00; 注释掉
除了第一次之后的Delay_us(1)有改观, 进一步,如果将 SysTick->LOAD=48*nTime; // 重装值;48个时钟周期=1us SysTick->CTRL=0x00000005;// 第0位:使能时钟 第3位:使用内部时钟 这两句在前面初始化,而不放进延时: 延时就比较精确了。 我的问题就是“SysTick->VAL=0X00; ” 为什么会有1us? |
中断响应考虑进去了,没有1us这么长的,当然这里延时1us gpio翻转一次,示波器显示的是1个周期其实是延时2us了。我的疑问是清空SysTick->VAL 相对与其他寄存器操作很费时间。。。
重装值可以在之前初始化,不必放进delay函数中。如果不执行”VAL清0“这条 就是1us,这样做的话所以只有第一次执行1us是未知、不精确的,因为VAL初值不知道,之后的1us延时都可以实现。
即然费时间,哪它有没有预加载的机制?
就是不清楚为什么费时间呀~
清除它需要多少时间 , 需要1u 的时间吗 ?
你现在设的值是 0, 但用外部示波器看到的是 2u, 是否说明清除它需要1u 的时间 ?