ARM裸机程序设计—ADC驱动程序设计

 对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
#include
#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裸机程序设计)