SYSTICK定时器也是定时器,有两种使用方法——查询法、中断法。

SYSTICK定时器也是从“core_cm3.c”和“core_cm3.h”、“misc.c”和“misc.h”这四个文件中查找。

12M晶振的意思是1秒钟振动12*106次

SYSTICK定时器内部工作结构为

SYSTICK定时器的学习_SYSTICK

(摘自海创电子的PPT(^_-)db(-_^))

SYSTICK定时器的学习_寄存器_02

SYSTICK定时器重装的最大值为224

SYSTICK定时器的学习_寄存器_03

typedef struct
{
__IO uint32_t CTRL; //时钟
__IO uint32_t LOAD; //需要定时的数值
__IO uint32_t VAL; //递减计数器中的数
__IO uint32_t CALTB;
} SysTick_Type

SYSTICK定时器的学习_寄存器_04

SYSTICK定时器的学习_STM32_05

(编程手册在上一篇有链接)

//地址与属性相对应
((Systic_Type*)0xE000E010)->CTRL
((Systic_Type*)0xE000E010)->LOAD
((Systic_Type*)0xE000E010)->VAL

SYSTICK定时器编程思路

  1. 确定时钟:72MHz或者9MHz(一般使用)
  2. 重装数值:定时的数值,如果是1ms就是9000
  3. 清空计数器:把递减计数器数值清空
  4. 启动计数器
  5. 查询
  6. 关闭计数器
  7. 清空计数器

相关寄存器配置

//delay.c
#include"delay.c"

void delay_init(){
((Systic_Type*)0xE000E010)->CTRL &= ~(1<<2); //系统时钟的8分频
}

void delay_ms(u16 nums){
((Systic_Type*)0xE000E010)->LOAD = (u32)nums*9000; //重装数值
((Systic_Type*)0xE000E010)->VAL = 0x00; //清空计数器
((Systic_Type*)0xE000E010)->CTRL = 0x01; //启动计数器
do{
temp = ((Systic_Type*)0xE000E010)->CTRL; //查询
}while(~(temp$(1<<16)));
((Systic_Type*)0xE000E010)->CTRL &= ~(1<<0); //关闭计数器
((Systic_Type*)0xE000E010)->VAL = 0x00; //清空计数器
}