欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ARM A9,三星猎户座4412学习笔记

程序员文章站 2022-06-04 08:51:28
...

终于把ADC实验解决了

以下是部分代码

// GPIO
 #define GPM4CON 	 	(*(volatile unsigned int *)0x110002E0)
 #define GPM4DAT 		(*(volatile unsigned int *)0x110002E4)
#define GPA0CON 		(*(volatile unsigned int *)0x11400000)
// MPLL
#define MPLL_CON0 		(*(volatile unsigned int *)0x10040108)
#define CLK_SRC_DMC 	(*(volatile unsigned int *)0x10040200)
#define CLK_SRC_TOP1 	(*(volatile unsigned int *)0x1003C214)
// system clock
#define CLK_SRC_PERIL0 	(*(volatile unsigned int *)0x1003C250)
#define CLK_DIV_PERIL0 	(*(volatile unsigned int *)0x1003C550)
// UART
#define UFCON0 			(*(volatile unsigned int *)0x13800008)
#define ULCON0 			(*(volatile unsigned int *)0x13800000)
#define UCON0 			(*(volatile unsigned int *)0x13800004)
#define UBRDIV0 		(*(volatile unsigned int *)0x13800028)
#define UFRACVAL0 		(*(volatile unsigned int *)0x1380002c)
#define UTXH0           (*(volatile unsigned int *)0x13800020)
#define URXH0           (*(volatile unsigned int *)0x13800024)
#define UTRSTAT0        (*(volatile unsigned int *)0x13800010)
//ADC 
#define ADCCON         	(*(volatile unsigned int *)0x126C0000)
#define ADCDAT         	(*(volatile unsigned int *)0x126C000C)
#define ADCMUX         	(*(volatile unsigned int *)0x126C001C)

void UartInit()
{
/* 1.设置相应的GPIO用于串口功能 */
unsigned long tmp = 0;
 
tmp = GPA0CON;
tmp &= ~(0xff); //设置UART0对应的GPIO为UART功能
tmp |= 0x22;
GPA0CON = tmp;
MPLL_CON0 = (1<<31 | 0x64<<16 | 0x3<<8 | 0x0);  //设置MPLL 输出 800MHz,FOUT = MDIV x FIN / (PDIV x 2 ^ SDIV) = 0x64 x 24MHz / (3 x 2^ 0) = 800MHz
CLK_SRC_DMC = 0x00011000; //bit[12]即MUX_MPLL_SEL=1, SCLKMPLLL使用MPLL的输出
CLK_SRC_TOP1 = 0x01111000; //bit[12]即MUX_MPLL_USER_SEL_T=1, MUXMPLL使用SCLKMPLLL
CLK_SRC_PERIL0 = ((0 << 24) | (0 << 20) | (6 << 16) | (6 << 12) | (6<< 8) | (6 << 4) | (6)); //bit[3:0]即UART0_SEL=6, MOUTUART0使用SCLKMPLL_USER_T,所以, MOUTUART0即等于MPLL的输出, 800MHz
CLK_DIV_PERIL0 = ((7 << 20) | (7 << 16) | (7 << 12) | (7 << 8) | (7 << 4) | (7)); //bit[3:0]即UART0_RATIO=7,所以SCLK_UART0=MOUTUART0/(7+1)=100MHz
 
/* 3.设置串口0相关 */
/* 设置FIFO中断触发阈值
* 使能FIFO
*/
UFCON0 = 0x00;
/* 设置数据格式: 8n1, 即8个数据位,没有较验位,1个停止位 */
ULCON0 = 0x3;
/* 工作于中断/查询模式
* 另一种是DMA模式,本章不使用
*/
UCON0 = 0x5;
 /* SCLK_UART0=100MHz, 波特率设置为115200
* 寄存器的值如下计算:
* DIV_VAL = 100,000,000 / (115200 * 16) - 1 = 53.25
* UBRDIVn0 = 整数部分 = 53
* UFRACVAL0 = 小数部分 x 16 = 0.25 * 16 = 4
*/
UBRDIV0 = 53;
UFRACVAL0 = 4;
}
void ADC_init()
{
  ADCCON=0;
  ADCCON=(1<<16|1<<14|65<<6|0);
  ADCMUX=0x0; 
}
char getc(void)
{
	char c;
	/* 查询状态寄存器,直到有有效数据 */
	while (!(UTRSTAT0 & (1<<0)));
	 
	c = URXH0; /* 读取接收寄存器的值 */
	 
	return c;
}
void putc(const char c)
{
	/* 查询状态寄存器,直到发送缓存为空 */
	while (!(UTRSTAT0 & (1<<2)));
	 
	UTXH0 = c; /* 写入发送寄存器 */
}
void puts(char *s)
{
	while (*s)
	{
		putc(*s);
		s++;
	}
}
/*获取ADC的数值*/
int get_ADC()
{
	int Value;
	 ADCCON = ADCCON |0x1;
		 puts("start \n");
		/*等待转换完成  ADCCON[15]=1转换完成*/
         while(!(ADCCON& (1 << 15))); 
		//转换完成,读取转换结果
		 Value = ADCDAT & 0xfff;
		 return Value;   
}
/*int转换成char型*/
char int_to_char(unsigned int data)
{
	return data+48
}
void main(void)
{ 
  UartInit();  
  char rec;
  char bit3,bit2,bit1;
  unsigned int ADC_Value=0;
 
  while(!getc()); 
  rec = getc(); //接收一个字符
  putc(rec);    //发送字符		
  putc('\r');   //回车换行
  putc('\n');
  puts("UART is  ok!\n");
	while(1)
	  { 
		while(getc()!='y');
		/*触发一次转换  ADCCON[0]*/
         ADC_Value=get_ADC();  
		 ADC_Value=ADC_Value*1800/4096;//电压为1.8V即1800mv,4096为2^12,之前使用的位数是12位,因此计算出来的是具体的电压                                                           
		 puts("ADC_Value is \n");
		 bit3=int_to_char(ADC_Value/(100));
		 bit2=int_to_char((ADC_Value%100)/10);
		 bit1=int_to_char(ADC_Value%10);
		 putc(bit3);
         putc(bit2);
         putc(bit1);
         putc('\r');
         putc('\n');		 
	  }

}

由于之前一直没有搞懂ADC转换,这一次终于解决的,exsion4412芯片的adc支持12位和10位转换,这里用的是12为转换,因为根据三星所给的芯片手册,其电压为1.8v和1v,这里使用1.8v,因此对应的mv即位1800mv*对应的比值,即ADC_Value/2^12(如果是10位则使用ADC_Value/2^10)

相关标签: ARM