📄 timer0.c
字号:
/*********************************************************************
* Copyright (c) 2011-2012,李士伟
* All rights reserved.
*文 件 名:timer0.c
*描 述:timer0驱动源文件
*当前版本:V1.00
*作 者:李士伟
*创建日期:2011.09.30
**********************************************************************/
#include <drivers\lpc2103\target.h>
#include <drivers\lpc2103\timer0.h>
#include <drivers\lpc2103\LPC2103.h>
#include <drivers\lpc2103\vic.h>
#include <kernel\asm.h>
#include <kernel\time.h>
#include <kernel\flag.h>
/*********************************************************************
*函 数 名:Timer0_Init
*描 述:初始化timer0,并注册VIC中断,中断优先级为0(最高IRQ优先级)
*输入参数:无
*输出参数:无
*返 回 值:无
*注 意:timer0为系统时钟中断源,不能作其它用途
* 《中断周期计算》
*
* T0PC计数频率:
F_t0pc = Fpclk (Hz)
*
* T0TC计数频率:
* F_t0pc
* F_t0tc = --------- (Hz)
* T0PR + 1
*
* 当T0TC == T0MR0 时产生中断
* T0MR0
* 中断周期 = ------- (s)
* F_t0tc
*
* 《硬件动作伪代码》
* 每个APB时钟 T0PC++;
* if (T0PC == (T0PR + 1))
* {
* 下个APB时钟复位T0PC;
* T0TC++;
* if (T0TC == T0MR0) 这个步骤需设置T0MCR[1:0] = 3
* {
* 复位T0TC;
* 产生中断标志;--
* } |
* } |
* 下个APB时钟<-----------
**********************************************************************/
void Timer0_Init(void)
{
T0IR = 0xff; /* 清除中断标志 */
T0PR = 0; /* 预分频计数器为0,则定时分辨率为1 */
T0PC = 0; /* 清零预分频计数器 */
T0TC = 0; /* 清零定时计数器 */
T0MCR = 0x03; /* T0TC == T0MR0 时产生中断,并复位T0TC */
/* 中断周期 = 1/OS_TICKS_PER_SECOND (s)*/
T0MR0 = (Fpclk/(T0PR + 1))/(OS_TICKS_PER_SECOND);
/* 注册Timer0中断服务例程*/
VIC_RegisterIRQ(Timer0_Handler, TIMER0_INTR_NUM, TIMER0_INTR_PRIO);
T0TCR = 0x01; /* 使能计数 */
}
/*********************************************************************
*函 数 名:Timer0_ISR
*描 述:timer0中断服务程序
*输入参数:无
*输出参数:无
*返 回 值:无
*注 意:
**********************************************************************/
void Timer0_ISR(void)
{
T0IR = 0x01; /* 清除中断标志 */
VICVectAddr = 0x00; /* 通知VIC中断处理结束 */
OS_TimeTick();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -