打印
[STM32F1]

延时不准

[复制链接]
888|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了,就不准了,。

使用特权

评论回复
5
heweibig| | 2021-10-9 23:37 | 只看该作者
溢出了吧。

使用特权

评论回复
6
dingy| | 2021-10-9 23:39 | 只看该作者
程序都不一样,正常

使用特权

评论回复
7
heweibig| | 2021-10-9 23:41 | 只看该作者
不准,要看相差大不大。

使用特权

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

使用特权

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

使用特权

评论回复
10
llljh| | 2021-10-9 23:48 | 只看该作者
用的内部时钟吗

使用特权

评论回复
11
xxrs| | 2021-10-9 23:50 | 只看该作者
用有源晶振试试呢

使用特权

评论回复
12
jiajs| | 2021-10-9 23:53 | 只看该作者
有点像是程序问题

使用特权

评论回复
13
jlyuan| | 2021-10-9 23:55 | 只看该作者
是不是循环溢出了

使用特权

评论回复
14
renyaq| | 2021-10-9 23:56 | 只看该作者
把时间改短一点

使用特权

评论回复
15
tian111|  楼主 | 2021-10-9 23:59 | 只看该作者

嗯,那我按大家的说法挨个排查一下,谢谢哈

使用特权

评论回复
16
tian111|  楼主 | 2021-10-10 09:50 | 只看该作者

哦,那我就知道怎么回事了,多谢大家

使用特权

评论回复
17
xiaoqizi| | 2021-11-2 15:27 | 只看该作者
能相差多少啊

使用特权

评论回复
18
wakayi| | 2021-11-2 15:29 | 只看该作者
当然了 并不是完全并行的

使用特权

评论回复
19
wowu| | 2021-11-2 15:30 | 只看该作者
不可避免的这是

使用特权

评论回复
20
tpgf| | 2021-11-2 15:32 | 只看该作者
时钟就不会是完全准确的

使用特权

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

本版积分规则

797

主题

8878

帖子

7

粉丝