我要使用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函数里测试的。
准备执行"while(temp&0x01&&!(temp&(1<<16))); //等待时间到达"(你这一句的意思应当是systic打开 && 定时未到则一直循环)时如果突然被一个中断打断,等中断执行完成回过头来继续执行时val的值又等于load了,将继续执行循环,导致延时被延长,所以楼主应先将所有的中断关闭以后再进行测试才行。
但如果真是这种情况,那楼主的这个程序的实用性将大打折扣了。其实原子哥在他的例程中的us延时就已经很好了,完全可以参考。
相差5ms ??
---------------------------------
回复【2楼】ricefat:
---------------------------------
怎么调都不行啊!烦
RCC_ClocksTypeDef rcc_clocks;
RCC_GetClocksFreq(&rcc_clocks); //获取SYSCLK,HCLK,PCLK1,PCLK2,单位Hz
sysclk = rcc_clocks.SYSCLK_Frequency;
hclk = rcc_clocks.HCLK_Frequency;
pclk1 = rcc_clocks.PCLK1_Frequency;
pclk2 = rcc_clocks.PCLK2_Frequency;
如果hclk是72M,那说明时钟没问题,但按照你仿真的结果,貌似hclk是12M左右。
一周热门 更多>