os_systick.c
1> 程序代码
#define SYS_CLK 22118400L // SYS_CLK = 22.1184MHz;
#define TickPerSencond 100 // 100 指没秒100次,也就是10ms一次;
/**
* @brief Tim2 for system tick
* @note config 10ms once interrupt
*/
void SysTick_Init(void)
{
ushort16_t val;
T2CON = 0x00; // Tim2模式:16位模式
/*configure不要出现小数*/
val = 0x10000 - (SYS_CLK / 12 / TickPerSencond);
TH2 = val >> 8;
TL2 = val & 0xFF;
RCAP2H = TH2;
RCAP2L = TL2; // 重装载值
PT2 = 0;
SET_BIT(IPH, 5); // 设置中断优先级2
T2MOD = 0x00;
TR2 = 1; // 启动Tim2
ET2 = 1; // 使能Tim2
EA = 1; // 使能中断
}
/**
* @brief This function handles Tim2 interrupt
*/
void SysTick_Handler(void) interrupt 5
{
KEY_Task();
LED_RUN_Task();
/* 填充任务例程 */
Timer_Task();
TF2 = 0;
}
2> 定时器 Timer 2
使用定时器2,作为系统嘀嗒定时器;
配置为:16位自动重装载模式,初始化为【10ms】中断;
3> 中断处理 SysTick_Handler()
10ms执行1次SysTick_Handler(),有些任务执行后,比如KEY_Task(),发出消息
结束,这个消息在大循环while(1){ }中执行;
10ms执行1次SysTick_Handler(), 也就是每秒执行100次;
里面执行按键扫描任务,LED任务,定时器任务;
根据项目添加;
注意:
SysTick_Handler()中断执行的任务,要小于滴答定时器时间10ms;
否则可能导致系统无法正常运行;