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”);