[应用方案] 【NuMaker-M471测评】+systick的讨论

[复制链接]
4078|5
 楼主| qjp1988113 发表于 2021-8-11 15:27 | 显示全部楼层 |阅读模式
CM4核带有systick时钟,M471也不例外。就想用systick做为一个延时函数的时钟源。
找了半天,发现M471的BSP包里面CM4.H,这个函数的配置被屏蔽了。
A1.png
我去,这是这么鬼,不可能啊,赶紧继续查找,原来新唐把它重新封装成几个函数了。放置“clk.h”和“clk.c”
里面。
时钟选择及中断频率配置:
A2.png
A3.png
A4.png
甚至做了一个基于查询的us级别的延时,很不错。
A5.png
这样我的us,ms延时甚至都不要自己写了。
  1. void delay_us(u32 nus)
  2. {
  3.   CLK_SysTickDelay(nus);
  4. }


  5. void delay_ms(u16 nms)
  6. {
  7.   while(nms--)
  8.   {
  9.     CLK_SysTickDelay(1000);
  10.   }
  11. }
那么STSTICK到底是如何配置的呢:
我们先看它的时钟框图:
A7.png
我们发现它的时钟原大类有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:
  1. void CLK_SysTickDelay(uint32_t us)
  2. {
  3.     SysTick->LOAD = us * CyclesPerUs;
  4.     SysTick->VAL  = (0x00);
  5.     SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;

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

  8.     /* Disable SysTick counter */
  9.     SysTick->CTRL = 0;
  10. }
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 | 显示全部楼层
非常好,又回来看看
sadicy 发表于 2021-8-18 19:45 | 显示全部楼层
时钟是基础,很多人都不怎么关心时钟,直接拿别人弄好的。
楼主的这种分享很棒
dongnanxibei 发表于 2023-9-27 19:52 | 显示全部楼层
滴答定时器。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

627

帖子

2

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