打印
[应用方案]

【NuMaker-M471测评】+systick的讨论

[复制链接]
3772|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CM4核带有systick时钟,M471也不例外。就想用systick做为一个延时函数的时钟源。
找了半天,发现M471的BSP包里面CM4.H,这个函数的配置被屏蔽了。

我去,这是这么鬼,不可能啊,赶紧继续查找,原来新唐把它重新封装成几个函数了。放置“clk.h”和“clk.c”
里面。
时钟选择及中断频率配置:



甚至做了一个基于查询的us级别的延时,很不错。

这样我的us,ms延时甚至都不要自己写了。
void delay_us(u32 nus)
{
  CLK_SysTickDelay(nus);
}


void delay_ms(u16 nms)
{
  while(nms--)
  {
    CLK_SysTickDelay(1000);
  }
}
那么STSTICK到底是如何配置的呢:
我们先看它的时钟框图:

我们发现它的时钟原大类有2种选择:CPUCLK及外部时钟,外部时钟又分5类(
其他家的没有新唐细分的这么多,也是2大类,CPUCLK和CPUCLK+分频器)。
我们的SYSTICK节拍是跟时钟源关联的,不同时钟源,对应的1us的节拍数也不一致:
我们这里选择CPUCLK:
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
其实就是SysTick的CTRL寄存器的BIT2位置1,与框图对应
这里时钟源为系统时钟,那就是96M(这里用的是内部HSI);
那么1us需要CyclesPerUs=96000000/1000000个节拍;
这样我们需要的节拍数就可以计算出来了,假设延时nus,
那么总节拍为nus*CyclesPerUs,把这个赋给SysTick的LOAD寄存器就可以了。
SysTick为递减计时器,当减到0时,SysTick的CTRL寄存器的BIT16就会置1,
读取会清0。
那么整个程序就有了
SysTick_CTRL_CLKSOURCE_Msk 1>>2
SysTick_CTRL_ENABLE_Msk  1>>0
SysTick_CTRL_COUNTFLAG_Msk 1>>16:
void CLK_SysTickDelay(uint32_t us)
{
    SysTick->LOAD = us * CyclesPerUs;
    SysTick->VAL  = (0x00);
    SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;

    /* Waiting for down-count to zero */
    while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0);

    /* Disable SysTick counter */
    SysTick->CTRL = 0;
}
DS提到一些,但并不具体,但DS里面提到可去参考手册具体查看STSTICK更多内容。
For more detailed information, please refer to the “Arm® Cortex®-M4 Technical Reference Manual” and “Arm® v6-M Architecture Reference Manual”.

使用特权

评论回复
沙发
玛尼玛尼哄| | 2021-8-11 21:57 | 只看该作者
新唐的库函数clk.h一直有这个函数的。

使用特权

评论回复
板凳
carpsnow| | 2021-8-12 15:59 | 只看该作者
很赞,今刚想了解下时钟,就有这么个帖子
哈哈哈哈,
棒极了

使用特权

评论回复
地板
carpsnow| | 2021-8-14 11:16 | 只看该作者
非常好,又回来看看

使用特权

评论回复
5
sadicy| | 2021-8-18 19:45 | 只看该作者
时钟是基础,很多人都不怎么关心时钟,直接拿别人弄好的。
楼主的这种分享很棒

使用特权

评论回复
6
dongnanxibei| | 2023-9-27 19:52 | 只看该作者
滴答定时器。

使用特权

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

本版积分规则

111

主题

627

帖子

2

粉丝