OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5743|回复: 4

为什么用SysTick做的ms和us延时,运行下来是实际的7.2倍

[复制链接]

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2019-9-10
在线时间
47 小时
发表于 2019-12-3 16:12:07 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 yes杰sir 于 2019-12-3 16:13 编辑

采用的原子哥的SysTick延时程序,但是debug的时候看到,500ms的延时实际跑了3.6s,实际延时比设定多了7.2倍,这是为什么?


延时源程序:
#include "delay.h"


static u8  fac_us=0;                                                        //us延时倍乘数                           
static u16 fac_ms=0;                                                        //ms延时倍乘数,在ucos下,代表每个节拍的ms数


//初始化延迟函数
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void delay_init(void)
{

        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //选择外部时钟  72MHz/8=9MHz
        fac_us=SystemCoreClock/8000000;                                //为系统时钟的1/8  
        fac_ms=(u16)fac_us*1000;                                //代表每个ms需要的systick时钟数   

}                                                                    


// 精确微妙级延时程序
// 利用SysTick时钟

void delay_us(u32 nus)
{               
        u32 temp;                     
        SysTick->LOAD=nus*fac_us;                                         //时间加载                           
        SysTick->VAL=0x00;                                                //清空计数器
        //SysTick->CTRL=0X01; ;        //使能,减到零是无动作,采用外部时钟源         
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
        do
        {
                temp=SysTick->CTRL;//读取当前倒计数值
        }while((temp&0x01)&&!(temp&(1<<16)));                //等待时间到达   
        //SysTick->CTRL=0x00;        //关闭计数器
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
        SysTick->VAL =0X00; //清空计数器         
}

//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{                                    
        u32 temp;                  
        SysTick->LOAD=(u32)nms*fac_ms;                                //时间加载(SysTick->LOAD为24bit)
        SysTick->VAL =0x00;                                                        //清空计数
        //SysTick->CTRL=0X01;        //开始倒数  
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
        do
        {
                temp=SysTick->CTRL;
        }while((temp&0x01)&&!(temp&(1<<16)));                //等待时间到达   
        //SysTick->CTRL=0x00;        //关闭计数器
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
        SysTick->VAL =0X00;                                               //清空计数器                     
}




debug结果如下:


500ms延时后.png

500ms延时后

500ms延时后

最佳答案

查看完整内容[请看2#楼]

原子哥是设置问题,debug->setting-trace->core 那里默认10m没被改成72m所以是这样
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2014-10-22
在线时间
135 小时
发表于 2019-12-3 16:12:08 | 显示全部楼层
正点原子 发表于 2019-12-4 02:35
用示波器测试,软件仿真不一定准确,尤其是你设置有误的时候。

原子哥是设置问题,debug->setting-trace->core 那里默认10m没被改成72m所以是这样
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
发表于 2019-12-4 02:35:16 | 显示全部楼层
用示波器测试,软件仿真不一定准确,尤其是你设置有误的时候。
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2019-9-10
在线时间
47 小时
 楼主| 发表于 2019-12-5 08:46:35 | 显示全部楼层
I is alun 发表于 2019-12-3 16:12
原子哥是设置问题,debug->setting-trace->core 那里默认10m没被改成72m所以是这样

确实是这个问题,多谢多谢
回复

使用道具 举报

6

主题

1127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1656
金钱
1656
注册时间
2019-8-15
在线时间
102 小时
发表于 2019-12-5 10:53:10 | 显示全部楼层
帮顶                       
成功没有捷径
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-1 04:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表