📄 timer.c
字号:
/****************************************Copyright (c)**************************************************/
/**
;** 西南科技大学计算机科学学院
;**
;** http://www.cs.suswt.edu.cn
;**
;** 日期: 2007/10/10
;** 描述: 西南科技大学计算机学院CS-II型实验板定时器驱动工作程序,包含定时器0,定时器1
;** 作者:
;**
;**--------------timer.c文件
;**------------------------------------------------------------------------------------------------------*/
/**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define _TIMER_C_
#ifdef _TIMER_C_
/************************************************
* Header File *
***********************************************/
#include"config.h"
#include"led.h"
#include"key.h"
#include"motor.h"
/************************************************
* Globale variable *
***********************************************/
uint32 div0 = 0;
uint32 div1 = 3;
uint32 overflow = 0;
extern uint8 motor_step_run_flag;
extern uint8 motor_step_speed;
extern uint8 motor_step_speed_flag;
extern uint8 key_up_flag;
extern uint8 motor_step_direction;
/**--------------------------------------------------------------------------**/
// 定时器0
#define TIMER0_ENABLE
#ifdef TIMER0_ENABLE
/*******************************************************************************
Function Name:void __irq IRQ_Timer0(void) *
Description : Timer0的中断服务函数,需要利用Timer0进行中断的程序都可以放在这个*
函数中 *
ads1.2 规定,在定义中断服务函数时,必须加入关键字__irq保证函数返*
回时会切换处理器模式 *
需要注意的是:注意在退出中断服务程序时,要清零相应外设的中断标志*
以及VICVectAddr,为响应下一次中断做好准备 *
*******************************************************************************/
void __irq IRQTimer0(void)
{
if(motor_step_speed_flag == FALSE)
{
switch(KEYScan())
{
case 0x00:motor_step_run_flag = TRUE;break;
case 0x08:motor_step_run_flag = FALSE;break;
case 0x01:motor_step_speed_flag = TRUE;break;
case 0x09:motor_step_speed_flag = FALSE;break;
case 0x02:motor_step_direction = CLOCKWISE;break;
case 0x0a:motor_step_direction = ANTICLOCKWISE;break;
default:break;
}
}
/* 上面添加需要定时器中断的代码*/
T0IR=0X01; //清除中断
VICSoftIntClear=0x00000010;
VICVectAddr=0x00; //清除地址
}
/*******************************************************************************
Function Name: void Timer0_InterruptSet(void) *
Description :对中断向量的设置,包括中断类型,中断优先级,中断服务地址 *
中断使能。 *
*******************************************************************************/
void TIMER0InterruptSet(void)
{
VICIntSelect &= 0xffffffef; //第4、5位分别代表定时计数器0、1 设置中断类型
VICVectCntl0 = 0x24; //为中断源分配向量IRQ的优先级 ,VICVectCntl n,n值越小优先级越高,0<=n<=15
//0010 0100 中断源序号为4 代表计数器0中断
VICVectAddr0 = (int)IRQTimer0; //向量地址寄存器 为该中断优先级设置服务程序入口地址
VICIntEnable = 0x00000010; //中断使能 允许相应中断源产生中断
}
/*******************************************************************************
Function Name: void Timer0_Init(void) *
Description : 定时器计数器0初始化设置,包括预分频值,匹配模式,启动复位等。 * *
*******************************************************************************/
void TIMER0Init(void) //另外一种写法 void Timer1_Init(uint32 Div,uint32 Ovf)
{
T0TC = 0;
T0PR = div0; //设置预分频值 定时器计数时钟频率 Fpclk/(PR+1)
T0MCR = 0x03; //设置匹配模式 匹配后复位T0TC,并产生中断标志
T0MR0 = Fpclk/1000; //设置匹配值 可以理解为计数器益出值 设置1ms匹配值
T0TCR = 0x03; //启动并复位
TIMER0InterruptSet();
}
/*******************************************************************************
Function Name: void Timer0_Start(void) *
Description : 定时器计数器0启动 *
*******************************************************************************/
void TIMER0Start(void)
{
T0TCR = 0x01; //定时器使能,相当与定时计数器的开关
}
#endif
/**--------------------------------------------------------------------------**/
// 定时器1
#define TIMER1_ENABLE
#ifdef TIMER1_ENABLE
/*******************************************************************************
Function Name:void __irq IRQ_Timer1(void) *
Description : Timer1的中断服务函数,需要利用Timer1进行中断的程序都可以放在这个*
函数中 *
ads1.2 规定,在定义中断服务函数时,必须加入关键字__irq保证函数返*
回时会切换处理器模式 *
需要注意的是:注意在退出中断服务程序时,要清零相应外设的中断标志*
以及VICVectAddr,为响应下一次中断做好准备 *
*******************************************************************************/
void __irq IRQTimer1(void)
{
if(motor_step_speed_flag==TRUE)
{
switch(KEYScan())
{
case 0x03:motor_step_speed = 0x00;break;
case 0x04:motor_step_speed = 0x01;break;
case 0x05:motor_step_speed = 0x02;break;
case 0x06:motor_step_speed = 0x03;break;
case 0x07:motor_step_speed = 0x04;break;
case 0x09:motor_step_speed_flag = FALSE;break;
case 0x0b:motor_step_speed = 0x05;break;
case 0x0c:motor_step_speed = 0x06;break;
case 0x0d:motor_step_speed = 0x07;break;
case 0x0e:motor_step_speed = 0x08;break;
case 0x0f:motor_step_speed = 0x09;break;
default:break;
}
}
LEDScan();
LEDPrint(motor_step_speed);
if(motor_step_run_flag == TRUE)
{
MOTORStepRun(motor_step_speed,motor_step_direction);
}
/* 上面添加需要定时器中断的代码*/
T1IR=0X01; //清除中断
VICSoftIntClear=0x00000010;
VICVectAddr=0x00; //清除地址
}
/*******************************************************************************
Function Name: void Timer1_InterruptSet(void) *
Description :对中断向量的设置,包括中断类型,中断优先级,中断服务地址中断使能 *
*******************************************************************************/
void TIMER1InterruptSet(void)
{
VICIntSelect &= 0xffffffdf; //第4、5位分别代表定时计数器0、1 设置中断类型
VICVectCntl1 = 0x25; //为中断源分配向量IRQ的优先级 ,VICVectCntl n,n值越小优先级越高,0<=n<=15
//0010 0100 中断源序号为4 代表计数器0中断
VICVectAddr1 = (int)IRQTimer1; //向量地址寄存器 为该中断优先级设置服务程序入口地址
VICIntEnable = 0x00000020; //中断使能 允许相应中断源产生中断
}
/*******************************************************************************
Function Name: void Timer1_Init(void) *
Description : 定时器计数器1初始化设置,包括预分频值,匹配模式,启动复位等。 * *
*******************************************************************************/
void TIMER1Init(void) //另外一种写法 void Timer1_Init(uint32 Div,uint32 Ovf)
{
T1TC = 0;
T1PR = div1; //设置预分频值 定时器计数时钟频率 Fpclk/(PR+1)
T1MCR = 0x03; //设置匹配模式 匹配后复位T0TC,并产生中断标志
T1MR0 = Fpclk/1000; //设置匹配值 可以理解为计数器益出值 设置1ms匹配值
T1TCR = 0x03; //启动并复位
TIMER1InterruptSet();
}
/*******************************************************************************
Function Name: void Timer0_Start(void) *
Description : 定时器计数器0启动 *
*******************************************************************************/
void TIMER1Start(void)
{
T1TCR = 0x01; //定时器使能,相当与定时计数器的开关
}
#endif
#endif
/*****************************************************************************
* End of Entire File *
****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -