Systick :24位 只 能递减,存在于内核 所有Cortex-Mnei内核的单片机都有这个定时器
重载寄存器 STK_LOAD
↓ 中断
STK_CLK(时钟) ----> 递减寄存器 STK_VAL (当寄存器值为0会产生中断---开启中断)
值为零后可以改变 STK_CLK STK_LOAD的值 每次递减1使用 1/STK_CLK
秒的时间
STD库实现:
systick.c:
//触发中断次数 每次中断时间间隔为
//Systick_Init 中设置
__IO u32 Timing;
//SysTick_Type core_cm4.h(misc.c)
void Systick_Init(void)
{
// SysTick_Config 该函数为设置计数值
// 同时开启中断,当计数值为0 时 触发中断
// 最大为:SysTick_LOAD_RELOAD_Msk
//(uint32_t SystemCoreClock = 180000000) / 100000 = 1800
// 1800 / 180Mhz(主频) = 10us
if (SysTick_Config(SystemCoreClock / 100000))
{
/* Capture error */
while (1);
}
}
void Delay_us(__IO u32 nTime)
{
Timing = nTime;
while(Timing != 0);
}
stm32f4xx_it.c
extern __IO u32 Timing;
void SysTick_Handler(void)
{
if (Timing != 0x00)
{
Timing--;
}
}
man.c
LED_GPIO_Config();
Systick_Init();
LED1_ON;
Delay_us(100000);
LED2_ON;
Delay_us(100000);
LED3_ON;
这里可以设置
SysTick_Config(SystemCoreClock / 100000(这个值小些 可以减少频繁进入中断)