1.systick简介
处理器有一个24位系统定时器SysTick,它从重新加载值倒计时到零,在下一个时钟沿重新加载(换行)LOAD寄存器中的值,然后对后续时钟倒计时。当处理器暂停调试时,计数器不会减少
2.systick相关寄存器
2.1 STK_CTRL
-
Bits 31:17保留,必须保持清除。
-
bit16 COUNTFLAG:如果计时器自上次读取以来计数为0,则返回1。
-
Bits 15:3保留,必须保持清除。
-
bit2 CLKSOURCE:时钟源选择
0:12M
1:48M -
bit1: TICKINT:SysTick异常请求启用0:倒计时到零不会断言SysTick异常要求1:倒计时到0以断言SysTicks异常要求。注意:软件可以使用COUNTFLAG来确定SysTick是否曾经计数为零。
-
bit0: 启用:计数器启用启用计数器。当ENABLE设置为1时,计数器从LOAD寄存器加载RELOAD值,然后倒计时。当达到0时,它将COUNTFLAG设置为1,并根据TICKINT的值可选地断言SysTick。然后,它再次加载RELOAD值,并开始计数。0:计数器已禁用1:计数器已启用
2.2 STK_LOAD
-
Bits 31:24保留,必须保持清除。
-
bits 23:0 RELOAD[23:0]:RELOAD值LOAD寄存器指定计数器启用时以及计数器达到0时加载到VAL寄存器的起始值。计算RELOAD值RELOAD可以是0x0000001-x00FFFFFF范围内的任何值。起始值为0是可能的,但没有效果,因为从1到0计数时,SysTick异常请求和COUNTFLAG被激活。RELOAD值根据其用途计算:
- l要生成具有N个处理器时钟周期的多触发定时器,请使用N-1的RELOAD数值。例如,如果每100个时钟脉冲需要SysTick中断,请将RELOAD设置为99。
- II要在延迟N个处理器时钟周期后传递单个SysTick中断,请使用值为N的RELOAD。例如,如果在400个时钟脉冲后需要SysTick打断,请将RELOAD设置为400。
2.3 STK_VAL
- Bits 31:24保留,必须保持清除。
- bits 23:0 CURRENT 23:0:当前计数器值VAL寄存器包含SysTick计数器的当前值。读取返回SysTick计数器的当前值。任何值的写入都会将字段清除为0,并将STK_CTRL寄存器中的COUNTFLAG位清除为0。
另外有一个校准用的寄存器,这里没有用上
3.MM32 SysTick时钟
可知systick可以使用最大48M频率时钟和12M 4分频时钟,时钟选择
4. 源码
#include "mm32g0001.h"
void Delay_Init(void)
{
//SysTick->CTRL|=SysTick_CTRL_CLKSOURCE_Msk; //Selects the clock source. //48M
SysTick->CTRL &= ~SysTick_CLKSource_HCLK; //12M
SysTick->CTRL&=~SysTick_CTRL_TICKINT_Msk; //not enable intterrupt
SysTick->CTRL&=~SysTick_CTRL_COUNTFLAG_Msk; //reset COUNTFLAG
}
void Delay_us(uint32_t time)
{
SysTick->LOAD=12;
SysTick->VAL=12;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //enable count
while(time)
{
if(SysTick->CTRL&0x00010000)
time--;
}
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //enable count
}
void Delay_ms(uint32_t time)
{
SysTick->LOAD=12000;
SysTick->VAL=12000;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //enable count
while(time)
{
if(SysTick->CTRL&0x00010000)
time--;
}
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //enable count
}
5.修改说明
- 2024/7/19 第一次编辑