构建Systick初始化函数

LOAD 范围被钳位在 [ ticks – 1, 0xFFFFFF – 1 ]
VAL 被清零
CTRL 0 – 2 位 对应 时钟选择 | 是否采用中断 | 使能位

C
static uint32_t Init_SysTick(uint32_t ticks) {
    SysTick->LOAD = (ticks & SYSTICK_MAXCOUNT) - 1;
    SysTick->VAL = 0; 
    SysTick->CTRL = 0x5; //允许计数但未开启中断使能 
    return (0);
}
此图片的 alt 属性为空;文件名为 sys1.jpg

寄存器组成、
用法、
以及对应地址

Init函数、
Ticks设置

Systick寄存器不使用中断的Delay函数实现

for循环遍历毫秒次数
while内部temp取CTRL寄存器状态
当COUNTFLAG为1时即完成一次计时

C
static uint32_t Init_SysTick(uint32_t ticks) {
    SysTick->LOAD = (ticks & SYSTICK_MAXCOUNT) - 1;
    SysTick->VAL = 0; 
    SysTick->CTRL = 0x5;
    return (0);
}

void wait_Timeout1(unsigned int timeout1) {
    unsigned int temp = 0;
    for(int cnt = 0; cnt < timeout1; cnt++) {
         while(1) {
              temp = SysTick->CTRL;
              if(temp & (unsigned int)(1<<16)) {
                  break;
              }   
         }
    }
}

使用中断的Delay函数实现 – 递增/递减

将CTRL中断强制打开
等待中断处理cnt直到与timeout2相等 / 等于0

C
void wait_Timeout2(unsigned int timeout2) {
    if(!(SysTick->CTRL & 0x02)) {
        SysTick->CTRL |= 0x02;
    }
    system_int_cnt = 0;
    while(system_int_cnt < timeout2) {};
}	
 
void SysTick_Handler(void) {
    system_int_cnt++;
} 
C
void wait_Timeout3(unsigned int timeout3) {
    if(!(SysTick->CTRL & 0x02)) {
        SysTick->CTRL |= 0x02;  //中断使能开启中断
    }
    system_int_cnt = timeout3;
    while(system_int_cnt != 0) {};
}
			
void SysTick_Handler(void) {
    system_int_cnt--;
}