针对对象:STM32F407ZGT6
简介:
CM3与CM4包含一个系统计数器SysTick,是一个24位倒计数定时器,当计数到0 时,将从RELOAD寄存器中自动重装载定时初值,只要把它在SysTick->CTRL中的使能位清楚,则一直存在。
寄存器介绍:
对应代码位于core_cm4.h中
typedef struct
{
__IO uint32_t CTRL;
__IO uint32_t LOAD;
__IO uint32_t VAL;
__IO uint32_t CALIB;
}SysTick_Type
SysTick控制及状态寄存器(0xE000_E010):
该寄存器第0位:表示SysTick使能位,0表示关;1表示开;SysTick_CTRL_ENABLE_Mask;
第1位:表示SysTIck中断使能位,0,表示关闭中断;1表示打开中断;SysTick_CTRL_TICKINT_Mask
第2位:表示时钟源选择位,0,表示HCLK/8;1表示HCLK作为时钟源;SysTick_CTRL_SOURCE_Mask;
第16位:表示计数比较标志,如果上次读取本寄存器,计算到了0,则该位置1,如果读取该位,该位将自动清零。
SysTick的LOAD寄存器:
为递减计数,是24位寄存器,最大值为0xFFFFFF;
SysTick的VAL寄存器:
24位寄存器,读取时返回当前计数值,写它则使其清零,同时会清零CTRL寄存器中的COUNTFLAG标志。
实例程序:
#define SYSCLK 168
void delay_us(uint32_t nus) //用于延时微妙级时间
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
static u8 fac_us = SYSCLK/8;
uint32_t midtime;
SysTick->LOAD = nus*fac_us; //时间加载
SysTick->VAL = 0x00; //清空计数器
do
{
midtime = SysTick->CTRL;
}
while((midtime&0x01)&&!(midtime&(1<<16)));
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Mask;
SysTick->VAL = 0x00;
}