SysTick:
功能框图系统定时器,24位,只能递减,存在于内核中,嵌套在NVIC中,所有的Cortex-M内核的单片机都有这个定时器.
Counter(计数器)(STK_VAL)在时钟的驱动下,从reload(STK_LOAD)初值开始往下递减计数到0,产生中断和置位COUTFLAG标志,然后又从reload的值开始重新递减技术,如此循环.
相关寄存器
16:COUTFLAG:
倒计时到0时会被置1,读取后会被清0
2:CLKSOURCE:
0 = AHB/8
1 = 处理器时钟AHB
1:TICKINT:
1:倒计数到0时产生SysTick异常请求
0:无动作
0:ENABLE
使能或失能定时器
23:0RALOAD:24位
23:0CURRENT
读取时返回当前倒计数的值,写它则使之清0
T = reload × (1/clk)
SysTick寄存器结构体
core_cm3.h
typedef struct
{
//控制及状态寄存器
__IO uint32_t CTRL;
//重装载数值寄存器
__IO uint32_t LOAD;
//当前数值寄存器
__IO uint32_t VAL;
//校准寄存器
__IO uint32_t CALIB;
}SysTick_Type;
系统滴答定时器
void SysTick_Delay_us(uint32_t us)
{
uint32_t i;
SysTick_Config(72);
for(i=0; i<us; i++)
{
//16:COUTFLAG:倒计时到0时会被置1,读取后会被清0
while( !((SysTick->CTRL) & (1<<16)) );
}
//关闭定时器,(可以不关闭)
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
void SysTick_Delay_ms(uint32_t ms)
{
uint32_t i;
SysTick_Config(72000);
for(i=0; i<ms; i++)
{
while( !((SysTick->CTRL) & (1<<16)) );
}
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
网友评论