[STM32F1] 延时不准

[复制链接]
1205|21
 楼主| tian111 发表于 2021-10-9 23:24 | 显示全部楼层 |阅读模式
两种系统滴答定时器,延时效果明显不同,Systick滴答时钟延时不准
 楼主| tian111 发表于 2021-10-9 23:30 | 显示全部楼层

//系统时钟SysTick        即滴答定时器
/*第一个明显正常

if (SysTick_Config(CMU_ClockFreqGet(cmuClock_CORE) / 1000))while (1);//内核时钟

volatile uint32_t msTicks;

void SysTick_Handler(void)
{
          msTicks++;
}

void Delay(uint32_t dlyTicks)
{
        uint32_t curTicks;
        curTicks = msTicks;
        while ((msTicks - curTicks) < dlyTicks)
}

*/



/*这个明显快了
unsigned long usDelay;
unsigned long msDelay;


void Systick_Delay_Init(void)
{
    SystemCoreClockUpdate();

    usDelay = SystemCoreClock / 1000000;
    msDelay = SystemCoreClock / 1000;

    SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
    SysTick->CTRL &= ~(SysTick_CTRL_COUNTFLAG_Msk | SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);
}


void Systick_Delay_Cycle(unsigned long ulCycle)
{
    SysTick->LOAD = ulCycle;
    SysTick->VAL = 0;
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;

    while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk))WDOG_Feed();
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}

void Systick_Delay_uS(unsigned long uluS)
{
    uluS = usDelay * uluS;

    SysTick->LOAD = uluS;
    SysTick->VAL = 0;
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;

    while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk))WDOG_Feed();
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}


void Systick_Delay_mS(unsigned long ulmS)
{
    ulmS = msDelay * ulmS;

    SysTick->LOAD = ulmS;
    SysTick->VAL = 0;
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;

    while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk))WDOG_Feed();
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
*/
 楼主| tian111 发表于 2021-10-9 23:32 | 显示全部楼层
500ms以下延时是正常的,但是500ms以上就不正常了,特别奇怪
jlyuan 发表于 2021-10-9 23:34 | 显示全部楼层
应该是绕到了前面了,这个定时器就像一个圆环一样,比如总共有0到9十个编号,你现在定时在5只能读取6到9的数据,如果跑到了9之后就又是0~9了,就不准了,。
heweibig 发表于 2021-10-9 23:37 | 显示全部楼层
溢出了吧。
dingy 发表于 2021-10-9 23:39 | 显示全部楼层
程序都不一样,正常
heweibig 发表于 2021-10-9 23:41 | 显示全部楼层
不准,要看相差大不大。
renyaq 发表于 2021-10-9 23:43 | 显示全部楼层
systick定时器是24位,最大值是16777215,即如果产生1s中断最大系统时钟是16.7mHz,半秒即500ms就是33.4mHz,所以如果你系统时钟配置超过这个时钟就不准了
 楼主| tian111 发表于 2021-10-9 23:46 | 显示全部楼层
EFM32的时钟配置实在是看不懂了,//CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFXO); //配置时钟分支的时钟源,参数分别是时钟分支和时钟源,返回参数为当前频率、单位HZ,高频内核时钟//该语句加上之后会导致系统滴答时钟不正常,屏蔽了之后就可以了
llljh 发表于 2021-10-9 23:48 | 显示全部楼层
用的内部时钟吗
xxrs 发表于 2021-10-9 23:50 | 显示全部楼层
用有源晶振试试呢
jiajs 发表于 2021-10-9 23:53 | 显示全部楼层
有点像是程序问题
jlyuan 发表于 2021-10-9 23:55 | 显示全部楼层
是不是循环溢出了
renyaq 发表于 2021-10-9 23:56 | 显示全部楼层
把时间改短一点
 楼主| tian111 发表于 2021-10-9 23:59 | 显示全部楼层

嗯,那我按大家的说法挨个排查一下,谢谢哈
 楼主| tian111 发表于 2021-10-10 09:50 | 显示全部楼层

哦,那我就知道怎么回事了,多谢大家
xiaoqizi 发表于 2021-11-2 15:27 | 显示全部楼层
能相差多少啊
wakayi 发表于 2021-11-2 15:29 | 显示全部楼层
当然了 并不是完全并行的
wowu 发表于 2021-11-2 15:30 | 显示全部楼层
不可避免的这是
tpgf 发表于 2021-11-2 15:32 | 显示全部楼层
时钟就不会是完全准确的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

797

主题

8878

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部