SYSTICK定时器也是定时器,有两种使用方法——查询法、中断法。
SYSTICK定时器也是从“core_cm3.c”和“core_cm3.h”、“misc.c”和“misc.h”这四个文件中查找。
12M晶振的意思是1秒钟振动12*106次。
SYSTICK定时器内部工作结构为
(摘自海创电子的PPT(^_-)db(-_^))
SYSTICK定时器重装的最大值为224。
typedef struct
{
__IO uint32_t CTRL; //时钟
__IO uint32_t LOAD; //需要定时的数值
__IO uint32_t VAL; //递减计数器中的数
__IO uint32_t CALTB;
} SysTick_Type
(编程手册在上一篇有链接)
//地址与属性相对应
((Systic_Type*)0xE000E010)->CTRL
((Systic_Type*)0xE000E010)->LOAD
((Systic_Type*)0xE000E010)->VAL
SYSTICK定时器编程思路
- 确定时钟:72MHz或者9MHz(一般使用)
- 重装数值:定时的数值,如果是1ms就是9000
- 清空计数器:把递减计数器数值清空
- 启动计数器
- 查询
- 关闭计数器
- 清空计数器
相关寄存器配置
//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; //清空计数器
}