打印
[STM32F1]

两种系统滴答定时器,延时效果明显不同,Systick滴答时钟延时不准

[复制链接]
3394|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
考试卷100|  楼主 | 2017-12-22 00:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


//系统时钟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;
}
*/
沙发
考试卷100|  楼主 | 2017-12-22 10:37 | 只看该作者
500ms以下延时是正常的,但是500ms以上就不正常了,特别奇怪

使用特权

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

使用特权

评论回复
地板
fengfeng的恒| | 2017-12-22 11:53 | 只看该作者
溢出了吧。

使用特权

评论回复
5
mmuuss586| | 2017-12-22 21:43 | 只看该作者
程序都不一样,正常

使用特权

评论回复
6
734774645| | 2017-12-22 22:06 | 只看该作者
不准,要看相差大不大。

使用特权

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

使用特权

评论回复
8
考试卷100|  楼主 | 2018-4-4 11:59 | 只看该作者
EFM32的时钟配置实在是看不懂了,//CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFXO); //配置时钟分支的时钟源,参数分别是时钟分支和时钟源,返回参数为当前频率、单位HZ,高频内核时钟//该语句加上之后会导致系统滴答时钟不正常,屏蔽了之后就可以了

使用特权

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

本版积分规则

3

主题

12

帖子

0

粉丝