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”.
|