本帖最后由 liusheng1998 于 2023-2-25 19:44 编辑
#每日话题#
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
这是正点原子的代码,作微秒级别延迟,我把它用作CAN报文发送的延时功能,
delay_us(200)可以完美实行次延时,报文发送的时间是平均170us。
但是设置270微秒就出问题了,飘忽不定 200~300us
不知道是不是因为不能做10us级别的判断!
但是函数里面确实是按照us来的,并且200us 能准,不出现210us 190us,就很奇怪
这是定时250的效果。
-------------------------------------------------------------------------------------------------------
1 0000060B 8 17 50 C4 28 7C EE 44 8F 757.706210 R
1 0000060B 8 17 50 C4 28 7C EE 44 82 757.706520 R
1 0000060B 8 17 50 C4 28 7C EE 44 81 757.706720 R
1 0000060B 8 17 50 C4 28 7C EE 44 8C 757.707030 R
1 0000060B 8 17 50 C4 28 7C EE 44 8C 757.707240 R
---------------------------------------------------------------------------------------------------------------
1 0000060B 8 17 50 C4 28 7C EE 44 8F 771.714530 R
1 0000060B 8 17 50 C4 28 7C EE 44 82 771.714740 R
1 0000060B 8 17 50 C4 28 7C EE 44 81 771.715040 R
1 0000060B 8 17 50 C4 28 7C EE 44 8C 771.715250 R
1 0000060B 8 17 50 C4 28 7C EE 44 8C 771.715560 R
可以看到 延时分别为200us 300us。
并不是设置的250us?
说明只能做百微秒的延迟操作。这只是我的一孔之见。请大家不良赐教,拜谢各位大神。
|