SysTick不能准确延时

2019-10-15 17:42发布

我要使用DS18b20进行温度检测,需要us级别的延时,上网查了相关资料,看了相应的代码,然后把那些ucosII的去掉了,然后进行测试,发现延时很不准,温度也检测不了。。。
[mw_shl_code=c,true]#include "delay.h" void delay_init() { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8 } void delay_us(u32 nus) { u32 temp; SysTick->LOAD=nus*9; //时间加载 SysTick->VAL=0x00; //清空计数器 SysTick->CTRL|=SysTick_Counter_Enable ; //开始倒数 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16))); //等待时间到达 SysTick->CTRL&=~(SysTick_Counter_Enable); //关闭计数器 SysTick->VAL =0X00; //清空计数器 } void delay_ms(u16 nms) { u32 temp; SysTick->LOAD=nms*9000;//时间加载(SysTick->LOAD为24bit) SysTick->VAL =0x00; //清空计数器 SysTick->CTRL|=SysTick_Counter_Enable ; //开始倒数 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 SysTick->CTRL&=~(SysTick_Counter_Enable); //关闭计数器 SysTick->VAL =0X00; //清空计数器 } [/mw_shl_code] [mw_shl_code=c,true]#ifndef __DELAY_H #define __DELAY_H #include"stm32f10x_lib.h" void delay_init(void); void delay_ms(u16 nms); void delay_us(u32 nus); #endif[/mw_shl_code]
下面是测试的情况:

此时时间:

运行:


此时时间:

整整相差0.0775568,也就是78ms , 也是 77557us ,并不是750us 。。。。。

我是放在main函数里测试的。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
kai20151211
1楼-- · 2019-10-16 21:07
回复【6楼】远方:
---------------------------------
我看看
kai20151211
2楼-- · 2019-10-16 22:34


是72M.......
kai20151211
3楼-- · 2019-10-17 02:27
 精彩回答 2  元偷偷看……
kai20151211
4楼-- · 2019-10-17 03:49
回复【10楼】远方:
---------------------------------
回复很给力,谢谢!
BraveAction
5楼-- · 2019-10-17 06:25
我的F103板子HCLK是8M ,  后来在主函数加SystemInit();  就变好了,非常感谢本帖!!!!!!!!!!!

一周热门 更多>