关于stm32f103 systick小实验

在测试stm32 systick延时函数时,用的keil软件仿真测试时间中发现延时500ms以内基本准确,当大于这个数值延时总是保持在500ms,出现问题,本着发现问题解决问题的思想,做如下实验。

实验代码

static uint8_t  fac_us=0;//us延时倍乘数
static uint16_t fac_ms=0;//ms延时倍乘数

//初始化延时倍乘数
void delay_init()  
{
fac_us=SystemCoreClock/8000000; //(,即SysTick时钟频率==HCLK/8==SystemCoreClock/8,因此,SysTick一个计数时长     //(1/(SystemCoreClock/8)),1us需要计数次数为 //10^-6÷[1/(SystemCoreClock/8)]=SystemCoreClock/8000000
fac_ms=(uint16_t)fac_us*1000;


}
//nus延时函数        
void delay_us(uint32_t nus)
{
uint32_t 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;       //清空计数器 
}
//
//<=1864 
void delay_ms(uint16_t nms)
{     
uint32_t temp;    
SysTick->LOAD=(uint32_t)nms*fac_ms;
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;     

测试前设置 

option->target->72MHz   option->debug->trace-> enable core clock = 72MHz   

keil软件测试时间

delay_init();      //time =  
delay_us(100);           //time = 0.00113824
delay_us(100);   //time =  0.00124268
delay_us(100);   //time =  0.00134714
delay_ms(100);   //time = 0.00145176
delay_ms(100);   //time = 0.10145617  
delay_ms(100);   //time =  0.20146068
delay_ms(1000);   //time =  0.71950460

总结:500ms以内计时基本准确,1s计时出错

手动秒表测试      

delay_init();            //time = 
delay_ms(500); //time =  1.08
delay_ms(500); //time =  2.10
delay_ms(500); //time =  3.32
delay_ms(1000); //time =  4.65
delay_ms(1000); //time =  6.19
delay_ms(1000); //time =  7.75
delay_ms(1500); //time =  9.74
delay_ms(1500); //time =  11.76
delay_ms(1500); //time =  13.77

总结:本人手速为0.5s左右,除去手速,个延时基本对应,也就是延时程序没有问题,那么问题来了,keil软件有问题???(但是keil这个大的公司应该不会出现这种简单的问题,估计是软件本身哪里没有设置对,继续探究~)



你可能感兴趣的:(小实验)