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);