📄 experiment_2.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 + -