原创 基于mini2440的ADC裸机程序

2011-6-28 20:03 2290 7 7 分类: 工程师职场

/*************************************************
Function name: 这是基础实验的一个模版
Parameter    : 无
Description  : 做基础实验,直接调用该模板即可
Return      : 无
Argument     : 无
Autor & date : Daniel
AIN0与电位器相接
**************************************************/
#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"


#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"

#define ADC_FREQ 2500000

volatile U32 preScaler;

void adc_init(void);
int ReadAdc(int channel);
static void cal_cpu_bus_clk(void);
void Set_Clk(void);
void beep_init(void);


void delay(int times)
{
 int i,j;
 for(i=0;i<times;i++)
  for(j=0;j<400;j++);
}

void Main(void)
{
 int a0=0,v1=0,i,tmp;
 float v0=0;
 int Scom=0;
 Set_Clk();
 beep_init();
 Uart_Init(0,115200);
 Uart_Select(Scom);
 Uart_Printf("\nI love jianlan!\n");
 adc_init();
 while(1)
 {
 
  a0=ReadAdc(0);
  Uart_Printf("AIN0:%d\n",a0);
  v0=((float)a0*3.3)/1024.0; //计算整数部分的值
  v1=(v0-(int)v0)*1000;  //计算小数部分的值
  Uart_Printf("voltage:%d.%3dv\n",(int)v0,v1);
  delay(1000);
 }
}


void adc_init(void)
{
 int channel=0;
 preScaler= ADC_FREQ;
 Uart_Printf("ADC conv,freq =%dHZ\n",preScaler);
 preScaler=50000000/ADC_FREQ-1;      //预分频系数值
 Uart_Printf("PRSCVL=PCLK/ADC_FREQ-1=%d\n",preScaler);
 
 rADCCON=(1<<14)|(preScaler<<6)|(channel<<3); //使用A/D时钟预分频,预分频值,通道0
 delay(1000);
}

int ReadAdc(int channel)

 
 rADCCON|=0x01;  //启动A/D转换
 while(rADCCON &0x1);  //此位清0,转换开始
 while(!(rADCCON &0x8000)); //直至转换结束,0:正在转换,1:转换结束
 return((int)rADCDAT0& 0x3ff);//返回转换值
 
 
}

void beep_init(void)
{
 rGPBCON &=~(0x3<<0);
 rGPBCON |= (0x1<<0);
}

void beep_run(void)
{
 rGPBDAT |=(0x1<<0);
 delay(5000);
 rGPBDAT &=(0x0<<0);
 delay(5000);
}


/*************************************************
Function name: Set_Clk()
Parameter    : void
Description  : 设置CPU的时钟频率
Return   : void
Argument     : void
Autor & date : Daniel
**************************************************/
void Set_Clk(void)
{
 int i;
 U8 key;
 U32 mpll_val = 0 ;
 i = 2 ;              //don't use 100M!
                   //boot_params.cpu_clk.val = 3;
 switch ( i ) {
 case 0: //200
  key = 12;
  mpll_val = (92<<12)|(4<<4)|(1);
  break;
 case 1: //300
  key = 13;
  mpll_val = (67<<12)|(1<<4)|(1);
  break;
 case 2: //400
  key = 14;
  mpll_val = (92<<12)|(1<<4)|(1);
  break;
 case 3: //440!!!
  key = 14;
  mpll_val = (102<<12)|(1<<4)|(1);
  break;
 default:
  key = 14;
  mpll_val = (92<<12)|(1<<4)|(1);
  break;
 }
 
 //init FCLK=400M, so change MPLL first
 ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);   //set the register--rMPLLCON
 ChangeClockDivider(key, 12);    //the result of rCLKDIVN [0:1:0:1] 3-0 bit
 cal_cpu_bus_clk();    //HCLK=100M   PCLK=50M
}
/*************************************************
Function name: cal_cpu_bus_clk
Parameter    : void
Description  : 设置PCLK\HCLK\FCLK的频率
Return   : void
Argument     : void
Autor & date : Daniel
**************************************************/
static void cal_cpu_bus_clk(void)
{
 static U32 cpu_freq;
    static U32 UPLL;
 
 U32 val;
 U8 m, p, s;
 
 val = rMPLLCON;
 m = (val>>12)&0xff;
 p = (val>>4)&0x3f;
 s = val&3;

 //(m+8)*FIN*2 不要超出32位数!
 FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;     //FCLK=400M  FIN=12000000
 
 val = rCLKDIVN;
 m = (val>>1)&3;
 p = val&1; 
 val = rCAMDIVN;
 s = val>>8;
 
 switch (m) {
 case 0:
  HCLK = FCLK;
  break;
 case 1:
  HCLK = FCLK>>1;
  break;
 case 2:
  if(s&2)
   HCLK = FCLK>>3;
  else
   HCLK = FCLK>>2;
  break;
 case 3:
  if(s&1)
   HCLK = FCLK/6;
  else
   HCLK = FCLK/3;
  break;
 }
 
 if(p)
  PCLK = HCLK>>1;
 else
  PCLK = HCLK;
 
 if(s&0x10)
  cpu_freq = HCLK;
 else
  cpu_freq = FCLK;
  
 val = rUPLLCON;
 m = (val>>12)&0xff;
 p = (val>>4)&0x3f;
 s = val&3;
 UPLL = ((m+8)*FIN)/((p+2)*(1<<s));
 UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
}

 

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条