STM32一个简单有效精确的延时方法

2019-12-14 12:19发布

           看到有些人延时还整定时器,for循环里面放__NOP()就好了,一个__NOP()就是一个时钟周期,比如72MHZ的时钟,要放72个__NOP();延时一次就是1us,精确可靠简单
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
41条回答
maimaige
1楼-- · 2019-12-16 16:33
wctmdgcd 发表于 2018-9-25 15:58
不同的应用场景有不同的写法,像达拉斯协议的延时,还用定时器来延时,是不是麻烦了点。 ...

达拉斯协议 主要用在哪里?
wctmdgcd
2楼-- · 2019-12-16 20:17
 精彩回答 2  元偷偷看……
huarana
3楼-- · 2019-12-17 01:31
zqf441775525 发表于 2018-9-25 14:31
如果要延时10mS呢?难道要放720000个__NOP();?

ms延时有库的。就是us延时比较头疼
No.5
4楼-- · 2019-12-17 06:14
stm32靠循环延时好像不精确
pengshicao
5楼-- · 2019-12-17 06:44
#define FAC_US        4
#define OW_DELAY480US        479//480.05
void ow_delay_480us(void) {//479.958us
        vu32 temp;
        SysTick->LOAD = OW_DELAY480US * FAC_US - 5; //时间加载,Delay12us5=112:26.50khz,Delay12us5=54:39.919KHZ
        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; //清空计数器

}
wye11083
6楼-- · 2019-12-17 06:51
wctmdgcd 发表于 2018-9-25 17:29
大名鼎鼎的 DS18B20就是达拉斯协议啊,

这货有人用双向uart搞定。。

一周热门 更多>