ARM裸机程序设计—ADC驱动程序设计
2011-06-02 21:42
381 查看
对ADC裸机程序设计做个总结:
首先是程序设计流程:
一、时钟频率设置
二、ADC初始化
1、转换通道选择(ADCCON寄存器中的[5:3]位)
2、转换频率设置(主要是设置预分频器的值)(ADCCON寄存器中的[13:6]位)
3、预分频器使能(ADCCON寄存器中的第14位)
三、读取AD转换值
1、转换启动(ADCCON寄存器中的第0位)
2、判断转换是否启动(若果启动了,那么第0位会被清0)
3、判断转换是否结束(ADCCON寄存器中的第15位,如果结束了,此位会被置1)
4、读取转换的值(ADCDAT0寄存器的[9:0]位,且数值范围在0-0x3FF之间)
下面是寄存器的具体信息:
注释:其他包含文件全部采用国嵌例程里面的文件,也就是说只需更改主函数即可。想要查看转换后的值,我是采用AXD+jlink仿真调试,全速运行后,采集到数据之后,停止,然后把鼠标放在获取的那个值上即可查看出转换后的实际值是多少。
源程序:
//Main.c
/*********************************************
实现功能:对开发板自带的电压进行AD转换,得到数字量
*********************************************/
#define GLOBAL_CLK 1
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"
void delay(int times);
void SET_CLK(void);
void ADC_INIT(void);
int Read_ADC(int channel);
int adc_value=0;
/**********************************************
主函数
***********************************************/
int Main(void)
{
/****时钟频率初始化******/
SET_CLK();
//MMU_Init();
/****ADC初始化***********/
ADC_INIT();
/****读取AD转换的值****/
while(1)
{
adc_value=Read_ADC(0);
delay(100);
}
}
/**********************************************
延时函数
***********************************************/
void delay(int times)
{
int x,y;
for(x=times;x>0;x--)
for(y=400;y>0;y--);
}
/**********************************************
时钟频率的设置
***********************************************/
void SET_CLK(void) //时钟频率的设置
{
//LOCKTIME不需要设置,如没设置,系统将自动选择LOCKTIME
rMPLLCON = 0;
rMPLLCON = (0x7f<<12)|(0x2<<4)|(0x2<<0); //设置FCLK的频率为405MHZ
rCLKDIVN = (0x1<<2)|(0x1<<0); //设置FCLK:HCLK:PCLK=1:4:8 PCLK=50MHZ
}
/*************************************************
ADC初始化
**************************************************/
void ADC_INIT(void)
{
rADCCON = (0<<3)|(0x31<<6)|(0x1<<14); //转换通道选择和转换频率设置 ADC转换频率=PCLK/(转换预分频值+1)
delay(100); //主要作用是给一点时间去设置频率
}
/*************************************************
读取AD转换后的值
**************************************************/
int Read_ADC(int channel)
{
/****转换启动************/
rADCCON |= 1<<0; //转换启动
while(rADCCON & 0x01); //判断转换是否启动
/****判断转换是否结束****/
while(!(rADCCON & 0x8000));
return((int)(rADCDAT0 &0x3ff)); //返回获取的值
}
首先是程序设计流程:
一、时钟频率设置
二、ADC初始化
1、转换通道选择(ADCCON寄存器中的[5:3]位)
2、转换频率设置(主要是设置预分频器的值)(ADCCON寄存器中的[13:6]位)
3、预分频器使能(ADCCON寄存器中的第14位)
三、读取AD转换值
1、转换启动(ADCCON寄存器中的第0位)
2、判断转换是否启动(若果启动了,那么第0位会被清0)
3、判断转换是否结束(ADCCON寄存器中的第15位,如果结束了,此位会被置1)
4、读取转换的值(ADCDAT0寄存器的[9:0]位,且数值范围在0-0x3FF之间)
下面是寄存器的具体信息:
注释:其他包含文件全部采用国嵌例程里面的文件,也就是说只需更改主函数即可。想要查看转换后的值,我是采用AXD+jlink仿真调试,全速运行后,采集到数据之后,停止,然后把鼠标放在获取的那个值上即可查看出转换后的实际值是多少。
源程序:
//Main.c
/*********************************************
实现功能:对开发板自带的电压进行AD转换,得到数字量
*********************************************/
#define GLOBAL_CLK 1
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"
void delay(int times);
void SET_CLK(void);
void ADC_INIT(void);
int Read_ADC(int channel);
int adc_value=0;
/**********************************************
主函数
***********************************************/
int Main(void)
{
/****时钟频率初始化******/
SET_CLK();
//MMU_Init();
/****ADC初始化***********/
ADC_INIT();
/****读取AD转换的值****/
while(1)
{
adc_value=Read_ADC(0);
delay(100);
}
}
/**********************************************
延时函数
***********************************************/
void delay(int times)
{
int x,y;
for(x=times;x>0;x--)
for(y=400;y>0;y--);
}
/**********************************************
时钟频率的设置
***********************************************/
void SET_CLK(void) //时钟频率的设置
{
//LOCKTIME不需要设置,如没设置,系统将自动选择LOCKTIME
rMPLLCON = 0;
rMPLLCON = (0x7f<<12)|(0x2<<4)|(0x2<<0); //设置FCLK的频率为405MHZ
rCLKDIVN = (0x1<<2)|(0x1<<0); //设置FCLK:HCLK:PCLK=1:4:8 PCLK=50MHZ
}
/*************************************************
ADC初始化
**************************************************/
void ADC_INIT(void)
{
rADCCON = (0<<3)|(0x31<<6)|(0x1<<14); //转换通道选择和转换频率设置 ADC转换频率=PCLK/(转换预分频值+1)
delay(100); //主要作用是给一点时间去设置频率
}
/*************************************************
读取AD转换后的值
**************************************************/
int Read_ADC(int channel)
{
/****转换启动************/
rADCCON |= 1<<0; //转换启动
while(rADCCON & 0x01); //判断转换是否启动
/****判断转换是否结束****/
while(!(rADCCON & 0x8000));
return((int)(rADCDAT0 &0x3ff)); //返回获取的值
}
相关文章推荐
- arm 驱动进阶:usb驱动程序设计过程与实现
- LCD裸机--驱动程序设计
- 【PCB设计】第22天,毕业设计PCB部分画完:ARM-A9+CYCLONE5+双32位deltasigmaADC
- ARM裸机程序设计—触摸屏程序设计
- LCD裸机驱动程序设计 .
- 【ARM&Linux】按键中断驱动程序设计
- ARM裸机程序设计—LCD程序设计
- ARM裸机之ADC
- arm裸机程序--LED程序设计
- ARM裸机——FS2410操作ADC
- lcd裸机驱动程序设计
- ARM裸机开发(四):bootloader的设计
- 嵌入式软件设计(4)--ARM程序设计
- arm 驱动进阶:块设备驱动程序程序设计之用内存模拟磁盘
- ARM学习笔记13——LED驱动程序设计
- arm 驱动进阶:nand flash 驱动程序设计
- Linux arm9260 ADC驱动程序
- ARM裸机程序设计—按键中断程序设计
- arm 驱动基础:查询方式的按键驱动程序
- ubuntu下使用qemu模拟ARM(六)------驱动程序编译进内核方法