初级会员
- 积分
- 157
- 金钱
- 157
- 注册时间
- 2019-9-10
- 在线时间
- 47 小时
|
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延时后
最佳答案
查看完整内容[请看2#楼]
原子哥是设置问题,debug->setting-trace->core 那里默认10m没被改成72m所以是这样
|