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

📄 ad.c

📁 武汉创维特ARM7实验箱的全部源代码
💻 C
字号:
/****************************************************************************/
/*                                                                          */
/* FILE NAME                                      VERSION                   */
/*                                                                          */
/* AD.C                                            1.0                      */
/*                                                                          */
/* DESCRIPTION                                                              */
/*                                                                          */
/*     JX44B0(S3C44B0X)AD采样实验                                           */
/*                                                                          */
/*                                                                          */
/* DATA STRUCTURES                                                          */
/*                                                                          */
/* FUNCTIONS :                                                              */
/*     在JX44B0教学实验箱进行AD采样实验                                     */
/*     主程序循环采集AD值保存到display_buffer中                             */
/*     开启一个定时器定时显示display_buffer中的值到数码管中                 */
/*                                                                          */
/* DEPENDENCIES                                                             */
/*     JX44B0-1                                                             */
/*     JX44B0-2                                                             */
/*     JX44B0-3                                                             */
/*                                                                          */
/*                                                                          */
/* NAME:                                                                    */
/* REMARKS:                                                                 */
/*                                                                          */
/*								Copyright (C) 2003 Wuhan CVTECH CO.,LTD     */
/****************************************************************************/

/****************************************************************************/
/* 学习S3C44B0X处理器中的AD采样方法:                                       */
/****************************************************************************/

/* 包含文件 */
#include "44b.h"

/* defines */
#define MAX_VALUE			0x3ff
#define MIN_VALUE			0x0

typedef (*ISR_ROUTINE_ENTRY)(void);

void Test_Adc(void);
char trans_input(int value);
void init_interrupt_handler(unsigned int irq_handler);
void install_isr_handler(int irq_no, void* irq_routine);

void timer0_isr(void);
void IsrIRQ() __attribute__ ((interrupt("IRQ")));

char display_buffer[6];
int  refresh_index = 0;

unsigned char seg7table[16] = 
{
    /* 0       1       2       3       4       5       6      7*/
    0xc0,   0xf9,   0xa4,   0xb0,   0x99,   0x92,   0x82,   0xf8,

    /* 8       9      A        B       C       D       E      F*/
    0x80,   0x90,   0x88,   0x83,   0xc6,   0xa1,   0x86,   0x8e,
};

/********************************************************************
// Function name	: Main
// Description	    : AD采样主函数
// Return type		: void
// Argument         : void
*********************************************************************/
void Main(void)
{
	rTCFG0=0x0;  		// prescaler=0,means "1" devider the same as timer0
	rTCNTB0=0x2000;  	//10ms

    rTCON= 0x00000202;
	
	rTCON= 0x00000009;	//T0,auto reload and start
	
    rINTCON=0x7;		/* Non-vect,IRQ disable,FIQ disable	*/
	
	init_interrupt_handler((unsigned int)IsrIRQ);
	install_isr_handler(HandleTIMER0, 	(void*)timer0_isr);

    rINTMOD=0x0;
    rINTMSK=0x07ffffff &~(BIT_GLOBAL|BIT_TIMER0);
    rINTCON=0x5;

	Test_Adc();
}

/********************************************************************
// Function name	: Test_Adc
// Description	    : test adc
// Return type		: void
// Argument         : void
*********************************************************************/
void Test_Adc(void)
{
	int loop_delay;
	
	int data = 0;
	
	int get_index;
	
    rCLKCON=0x7ff8;	
    
    while(1)
    {
    	char value;
		int rADCDAT_TEMP0,rADCDAT_TEMP1,rADCDAT_TEMP2,rADCDAT_TEMP3,
		    rADCDAT_TEMP4,rADCDAT_TEMP5,rADCDAT_TEMP6,rADCDAT_TEMP7;

		rADCPSR=0x0;
		
		data = 0;	
		
		for(get_index = 0; get_index < 16; get_index++)
		{
			rADCCON=0x1|(0x2<<2);	// AIN2
			while(!(rADCCON & 0x40));
			data+=rADCDAT;
			
			for(loop_delay=1000; loop_delay; loop_delay--);
		}
		
		data /= 32;
		
		value = trans_input(data);		
		display_buffer[0] = value / 10;
		display_buffer[1] = value % 10;

		data = 0;	
		
		for(get_index = 0; get_index < 16; get_index++)
		{
			rADCCON=0x1|(0x3<<2);	// AIN3
			while(!(rADCCON & 0x40));
			data+=rADCDAT;
			
			for(loop_delay=1000; loop_delay; loop_delay--);
		}
		
		data /= 32;
		
		value = trans_input(data);	
		
		display_buffer[3] = value / 10;
		display_buffer[4] = value % 10;
		
	    for(loop_delay=100000; loop_delay; loop_delay--);
    }
}

char trans_input(int value)
{
	if(value == MAX_VALUE) return 50;
	
	return (char)(value * 50 / (MAX_VALUE-MIN_VALUE));
}

/*****************************************************************************
// Function name	: rtc_tick_isr
// Description	    : TICK中断处理程序
// Return type		: int
// Argument         : void
*****************************************************************************/
void timer0_isr(void)
{
    rI_ISPC=BIT_TIMER0;

	if(refresh_index==2) refresh_index++;
	if(refresh_index==5) refresh_index = 0;

	/* 设置数码管段选 */
	*((unsigned char*) 0x02000006) = 0x3f & ~(0x01 << refresh_index);
    *((unsigned char*) 0x02000004) = seg7table[display_buffer[refresh_index]];
    
    refresh_index++;
}

/*****************************************************************************
// Function name	: IsrIRQ
// Description	    : 非矢量方式下中断的查表处理
//					  中断地址表位于0x0c7fff00开始的256字节
// Return type		: void
// Argument         : void
*****************************************************************************/
void IsrIRQ()
{
	int count = 0;
	unsigned int isr_pending;
	unsigned int isr_mask = 0x00000001;
	
	unsigned int isr_mask_set = rINTMSK;
	
	ISR_ROUTINE_ENTRY isr_routine_entry = (ISR_ROUTINE_ENTRY)0x0;
	
	__asm__	(
		"STMFD  	SP!, {r1,r4-r8}	@ SAVE r1,r4-r10 \n"
		"nop \n");
	
	isr_pending = (rINTPND & ~isr_mask_set);
	
	while(isr_mask)
	{
		if(isr_pending&isr_mask)
		{
			isr_routine_entry = (ISR_ROUTINE_ENTRY)(*(int*)(HandleADC+count));
			break;
		}
		
		count+=4;
		isr_mask <<= 1;
	}
	
	if(isr_routine_entry) (*isr_routine_entry)();
	
	__asm__ (
		"LDMFD  	SP!, {r1,r4-r8}	@ RESTORE r1,r4-r10 \n"
		"nop \n");
}

/*****************************************************************************
// Function name	: init_interrupt_handler
// Description	    : 非矢量方式下中断向量表初始化处理
// Return type		: void
// Argument         : irq_handler
//					  中断处理函数入口
*****************************************************************************/
void init_interrupt_handler(unsigned int irq_handler) 
{
	int i;
	
	rINTPND = 0x00000000;							/* 清除所有未决的中断	*/
	rI_ISPC = 0x03FFFFFF; 
	
	for( i = 0; i < 256; i+=4)						/* 清除中断表			*/
		*(unsigned int*)(_ISR_STARTADDRESS+i) = 0;

	*(unsigned int*)(HandleIRQ) = irq_handler;		/* 设置IRQ模式处理函数	*/
}

/*****************************************************************************
// Function name	: install_isr_handler
// Description	    : 非矢量方式下中断向量的安装
// Return type		: void
// Argument         : irq_no, 中断号
//					  irq_routine, 中断处理函数地址
*****************************************************************************/
void install_isr_handler(int irq_no, void* irq_routine)
{
	*(unsigned int*)(irq_no) = (unsigned int)irq_routine;
}

⌨️ 快捷键说明

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