基于mini2440的ADC操作(裸机)

ADC转换器在s3c2440有集成,我在闲暇之余写的代码,有普通的轮询模式和中断模式,很多人疑问在芯片手册中只有触摸屏中断但没有说明ADC中断的相关设置位,其实是ADC中断是在转换完成了才产生中断,并不是中断了才开始转换,只要允许了ADC中断在转换完成了产生中断,这点需要区分。在完成中断后需要清除相关的标志位等待下一次中断。

值得注意的是在使用中断之前需要重新映射中断地址才能使用即先调用MMU_Init();//映射中断地址。

mini2440上运行通过:

代码如下:

ADC.c

#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "profile.h" 

extern void __irq ADC_handle(void);

int save; // 定义全局变量

void delay(int time)
{
	unsigned int i,j;
	for(i=0;i<100;++i)
	for(j=0;j<time;j++);
}

void ADC_init(void)
{
	//选择通道AIN0、正常操作模式、禁止读操作、无转换操作
	rADCCON = (0<<14 | 0xff<<13 | 0<<5 | 0<<2 | 0<<1 | 0<<0);
	rADCDLY = 50;//转换延时设置为50
}

//轮询ADC模式
int ADC_read(void)
{
	unsigned int tmp;
	int data;
	
	rADCCON |= (1<<0);//开始ADC转换
	delay(500);//等待
	tmp = rADCCON;
	tmp &= (1<<15);//检测A/D转换是否结束
	if(tmp){
		rADCCON |= (1<<1);//允许读数据
		data = (rADCDAT0 & 0x3ff);//保存A/D的数据
		rADCCON |= (0<<1);//禁止读数据
		return data;//返回ADC转换值
	}
	else return -1;//转换失败返回-1
}


//中断模式
void ADC_req_init(void)
{
	MMU_Init();//映射中断地址
	//选择通道AIN0、正常操作模式、禁止读操作、无转换操作
	rADCCON = (0<<14 | 0xff<<13 | 0<<5 | 0<<2 | 0<<1 | 0<<0);
	rADCDLY = 50;//转换延时设置为50
	rINTMSK	&= ~(1<<31);//允许ADC总中断
	rINTSUBMSK &= ~(1<<10);//允许ADC子中断
	pISR_ADC = (unsigned int)ADC_handle;//设置中断向量表
}

main.c

#define  GLOBAL_CLK 1

#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "profile.h"
#include "mmu.h"


extern void ADC_init(void);
extern int ADC_read(void);
extern void ADC_req_init(void);
extern int save;

/*
void Main(void)
{

    int data=0;
	rGPBCON=(01<<00);//关闭蜂鸣器
    rGPBDAT=0x00;
	
	ADC_init();

	while(1){
	Uart_Printf("X=%d\n",data);
	data = ADC_read();
	}

}
*/

void Main(void)
{

    int data=0;
	rGPBCON=(01<<00);//关闭蜂鸣器
    rGPBDAT=0x00;
	
	ADC_req_init();
	
	while(1){
		rADCCON |= (1<<0);//开始ADC转换
		Uart_Printf("X=%d\n",save);
	}
}

void __irq ADC_handle(void)
{
	unsigned int tmp;
	
	if((rSUBSRCPND<<4)>>14){
		if(rSRCPND>>31){
			if(rINTPND>>31){
				tmp = rADCCON;
				tmp &= (1<<15);//检测A/D转换是否结束
				if(tmp){
					rADCCON |= (1<<1);//允许读数据
					save = (rADCDAT0 & 0x3ff);//保存A/D的数据
					rADCCON |= (0<<1);//禁止读数据
					
					rSUBSRCPND |= 1<<10; //清除中断
					rSRCPND |= 1<<31;
					rINTPND |= 1<<31;
				}
			}
		}
	}
}


代码压缩包地址:http://download.csdn.net/detail/a16839678/5900677
注意:由于疏忽压缩包的ADC.c中需加上语句extern void __irq ADC_handle(void);并删除main.c中extern void __irq ADC_handle(void);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值