⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 experiment_2.c

📁 使用定时器Timer5
💻 C
字号:
/****************************************************************
实验二  定时器实验(中断方式 )

*****************************************************************/     
#include <string.h>
#include "..\inc\option.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\def.h"
#include "..\inc\timer.h"


U8 i;

void Isr_Init(void);
void HaltUndef(void);
void HaltSwi(void);
void HaltPabort(void);      
void HaltDabort(void);
/****************************************************************************
Timer5 初始化
入口参数:Timing_count=定时时间常数,定时时间=定时时间常数*0.02ms
		  T5_int_Enable=1,T5 中断方式,T5_int_Enable=0,T5 查询方式

Timer input clock Frequency = MCLK / {prescaler value + 1} / {divider value}
{prescaler value} = 0-255
{divider value} = 2, 4, 8, 16, 32	
rTCFG0 [23:16]:These 8 bits determine prescaler value for Timer 4 & 5
Timer input clock Frequency = MCLK / {prescaler value + 1} / {divider value}
							=40 MHz/(199+1)/4=0.05 MHz 
1/0.05 MHz=0.02 ms 
定时时间=定时时间常数*0.02ms
延时1s   定时时间常数=1s/0.02ms= 50000
rTCFG1 [23:20]:MUX 5  Select MUX input for PWM Timer5.
        0000 = 1/2 0001 = 1/4 0010 = 1/8
        0011 = 1/16 01xx = EXTCLK
rTCFG1 [23:20]=0001, DIV=4
******************************************************************************/

void Timer_Init(U16 timing_count,U8 T5_int_Enable)
	{
		rINTMSK |=BIT_GLOBAL|BIT_TIMER5;  
		rTCFG0=0X0c70101;	//prescaler=199  rTCFG0=0X010101;prescaler=1
		rTCFG1=0X0100000; 	// DIV=4        

		rTCNTB5=timing_count;
		//rTCMPB5=(timing_count/2); havn't rTCMPB5!!! but T0--T4 have.
		
		rTCON=0X2000000;	//bit[25]=1,手动更新TCNTB5
		rTCON=0X5000000;	//bit[26]=1,自动重装,bit[24]=1,启动T5计时

		if(T5_int_Enable)
		{
/*INTCON bit[2]	This bit disables/enables vector mode for IRQ
		     0 = Vectored interrupt mode
		     1 = Non-vectored interrupt mode
INTMOD bit[8]:INT_TIMER5,=0: IRQ mode, =1: FIQ mode
INTMSK bit[8]:INT_TIMER5,0 = Service available 1 = Masked
		 bit[26]:Global,0 = Service available 1 = Masked	
*/
		rINTCON=0X05;  					//非向量中断模式
		rINTMOD=0X0;   					//IRQ mode
		rINTMSK &=~(BIT_GLOBAL|BIT_TIMER5);//开T5中断
		}
	}



/***************************************************
led 显示程序
      入口参数:unsigned char data= 要显示的数字
***************************************************/

void Led_Display(unsigned char data)
{
    unsigned char * ledbuffer = (unsigned char *)led_Address;
    
    switch(data){
    case 0:
    	*ledbuffer=0x12;
    	break;
    case 1:
    	*ledbuffer=0x9F;
    	break;
    case 2:
    	*ledbuffer=0x31;
    	break;
    case 3:
    	*ledbuffer=0x15;
    	break;
    case 4:
    	*ledbuffer=0x9C;
    	break;
    case 5:
    	*ledbuffer=0x54;
    	break;
    case 6:
    	*ledbuffer=0x50;
    	break;
    case 7:
    	*ledbuffer=0x1F;
    	break;
    case 8:
    	*ledbuffer=0X10;
    	break;
    case 9:
    	*ledbuffer=0x14;
    	break;
    case 0xa:
    	*ledbuffer=0x8;
    	break;
    case 0xb:
    	*ledbuffer=0xC0;
    	break;
    case 0xc:
    	*ledbuffer=0x62;
    	break;
    case 0xd:
    	*ledbuffer=0x81;
    	break;
    case 0xe:
    	*ledbuffer=0x60;
    	break;
    case 0xf:
    	*ledbuffer=0x68;
    	break;
   }
}

/*******************************************************
Timer5中断服务程序      显示i (i="0"或 ...."9").
********************************************************/
void Timer5_ISR(void)
 	{
		rI_ISPC |=BIT_TIMER5; //清中断标志位
		Led_Display(i);		//显示i (i="0"或 ...."f").
		i++;
		if(i==10)
			i=0;
	}



void Isr_Init(void)
{
    U32 i;
    
    pISR_UNDEF=(unsigned)HaltUndef;
    pISR_SWI  =(unsigned)HaltSwi;
    pISR_PABORT=(unsigned)HaltPabort;
    pISR_DABORT=(unsigned)HaltDabort;
    
     for(i=_RAM_STARTADDRESS;i<(_RAM_STARTADDRESS+0x20);i+=4)
    {
	*((volatile unsigned *)i)=0xEA000000+0x1FFE;
    }
/*    rINTCON=0x5;	  // Non-vectored,IRQ enable,FIQ disable    
    rINTMOD=0x0;	  // All=IRQ mode
    rINTMSK|=BIT_GLOBAL|BIT_EINT3;	  // All interrupt is masked.*/
}

void HaltUndef(void)
{
   // Uart_Printf("Undefined instruction exception!!!\n");
    while(1);
}

void HaltSwi(void)
{
  //  Uart_Printf("SWI exception!!!\n");
    while(1);
}

void HaltPabort(void)
{
   // Uart_Printf("Pabort exception!!!\n");
    while(1);
}

void HaltDabort(void)
{
   // Uart_Printf("Dabort exception!!!\n");
    while(1);
}










/****************************************************
主程序循环显示"0",...."f",间隔时间:1s
******************************************************/ 
void Main(void)
{
	i=0;
	Isr_Init();

	rSYSCFG=SYSCFG_8KB;

    rI_ISPC |=BIT_TIMER5;			//clear pending_bit
	pISR_TIMER5=(unsigned)Timer5_ISR; //装载中断服务程序
	Timer_Init(50000,1);			  //TIMER5初始化,中断方式,定时时间 1s. 			  
 	while(1)
	asm("nop");  

}
























⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -