blmem_control_setup @设置存储控制器

ldr sp, =4096 @设置栈指针,以下C函数调用前需要设好栈

bl init_clock@设置MPLL,改变FCLK、HCLK、PCLK

bl init_nand@初始化NandFlash

@将NandFlash中地址4096开始的代码复制到SDRAM中

ldrr0, =0x30000000@目标地址=0x30000000,SDRAM起始地址

movr1, #4096@源地址=4096,连接时代码在4096开始处

movr2, #16*1024@复制长度=16K,对于本实验足够

blread_nand @调用C函数read_nand

blclean_bss@清除bss段

msr cpsr_c, #0xd2 @进入中断模式

ldr sp, =0x31000000 @设置中断模式栈指针

msr cpsr_c, #0xdf@进入系统模式

ldr sp, =0x34000000 @设置系统模式栈指针

ldr lr, =ret_initirq @设置返回地址

ldr pc, =init_irq@初始化中断

ret_initirq:

msr cpsr_c, #0x5f @设置I-bit=0,开IRQ中断

ldr lr, =halt_loop@设置返回地址

ldr pc, =main@调用main函数

halt_loop:

b halt_loop

★main.c文件实现实现串口选择ADC和TouchScreen操作,主要代码:

#include

#include

#include

int main()

{

char c;

init_uart0();//波特率115200,8N1(8个数据位,无校验位,1个停止位)

while (1)

{

printf(“rn~~~~~~ Test ADC and Touch Screem ~~~~~~rn”);

printf(“[A] Test ADCnr”);

printf(“[T] Test Touch Screemnr”);

printf(“Enter your selection: ”);

c = getc();

putc(c);

switch (c)

{

case ‘a’:

case ‘A’:

{

Test_Adc();//操作ADC

break;

}

case ‘t’:

case ‘T’:

{

Test_Ts();//操作TouchScreen

break;

。..

}

★adc_ts.c ADC和触摸屏的测试函数,主要代码:

。..

/*

* 使用查询方式读取A/D转换值。

* 输入参数ch: 模拟信号通道,取值为0~7

*/

static int ReadAdc(int ch)

{

//选择模拟通道,使能预分频功能,设置A/D转换器的时钟 = PCLK/(49+1)

ADCCON = PRESCALE_EN | PRSCVL(49) | ADC_INPUT(ch);

//清除位[2],设为普通转换模式

ADCTSC &= ~(1《《2);

//设置位[0]为1,启动A/D转换

ADCCON |= ADC_START;

//当A/D转换真正开始时,位[0]会自动清0

while (ADCCON & ADC_START);

//检测位[15],当它为1时表示转换结束

while (!(ADCCON & ADC_ENDCVT));

//读取数据

return (ADCDAT0 & 0x3ff);

}

/*

* 测试ADC。通过A/D转换,测量可变电阻器的电压值

*/

void Test_Adc(void)

{

int vol0, vol1;

printf(“Measuring the voltage of AIN0 and AIN1, press any key to exitnr”);