打印
[STM32F1]

延时不准

[复制链接]
434|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tian111|  楼主 | 2019-10-18 17:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
两种系统滴答定时器,延时效果明显不同,Systick滴答时钟延时不准

使用特权

评论回复
沙发
tian111|  楼主 | 2019-10-18 17:09 | 只看该作者

//系统时钟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|  楼主 | 2019-10-18 17:11 | 只看该作者

500ms以下延时是正常的,但是500ms以上就不正常了,特别奇怪

使用特权

评论回复
地板
juventus9554| | 2019-10-18 17:16 | 只看该作者
应该是绕到了前面了,这个定时器就像一个圆环一样,比如总共有0到9十个编号,你现在定时在5只能读取6到9的数据,如果跑到了9之后就又是0~9了,就不准了,。

使用特权

评论回复
5
houcs| | 2019-10-18 17:21 | 只看该作者
溢出了吧。

使用特权

评论回复
6
dingy| | 2019-10-18 17:25 | 只看该作者
程序都不一样,正常

使用特权

评论回复
7
pengf| | 2019-10-18 17:28 | 只看该作者

不准,要看相差大不大。

使用特权

评论回复
8
renyaq| | 2019-10-18 17:32 | 只看该作者
systick定时器是24位,最大值是16777215,即如果产生1s中断最大系统时钟是16.7mHz,半秒即500ms就是33.4mHz,所以如果你系统时钟配置超过这个时钟就不准了

使用特权

评论回复
9
tian111|  楼主 | 2019-10-18 17:35 | 只看该作者

EFM32的时钟配置实在是看不懂了,//CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFXO); //配置时钟分支的时钟源,参数分别是时钟分支和时钟源,返回参数为当前频率、单位HZ,高频内核时钟//该语句加上之后会导致系统滴答时钟不正常,屏蔽了之后就可以了

使用特权

评论回复
10
观海| | 2019-11-14 09:40 | 只看该作者
用的内部时钟吗

使用特权

评论回复
11
八层楼| | 2019-11-14 09:42 | 只看该作者
用有源晶振试试呢

使用特权

评论回复
12
晓伍| | 2019-11-14 09:45 | 只看该作者
有点像是程序问题

使用特权

评论回复
13
磨砂| | 2019-11-14 09:49 | 只看该作者
是不是循环溢出了

使用特权

评论回复
14
木木guainv| | 2019-11-14 09:52 | 只看该作者
把时间改短一点

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

797

主题

8878

帖子

7

粉丝