/*************************************************
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条评论)
登录后参与讨论