程序运行环境为选择从Nand flash启动,所以要先关闭好看门狗,并将系统时钟设置为533MHz, PCLK为66MHz.
/***************************usrt.S*******************************/ (实现了基本的寄存器配置和一个简单的mputc函数)
#include <uart.h> //此处头文件只是简单的将寄存器地址定义为宏,方便使用而已,并没有附上头文件。
#include <gpio.h>
.text
.align 2
.global uart_init
uart_init:
ldr r0, =GPACON //将GPA0和GPA1设置为UART RXD[0]和UART TXD[0]
ldr r1, [r0]
orr r1, r1, #0x22
str r1, [r0]
ldr r0, =ULCON0 //配置UART 0 通道行控制寄存器并设置数据格式为8N1
mov r1, #((3<<3)|3)
str r1, [r0]
ldr r0, =UCON0 //选择时钟源为PCLK
ldr r1, =(2<<10)
str r1, [r0]
ldr r0, =UBRDIV0 //设置波特率为115200
mov r1, #34
str r1, [r0]
ldr r0, =UDIVSLOT0
ldr r1, =0xdfdd
str r1, [r0]
ldr r0, =UCON0 //设置工作模式为轮询或中断
ldr r1, [r0]
orr r1, r1, #0x5
str r1, [r0]
mov pc, lr
.align 2
.global mputc
mputc: //mputc函数, r0为接受的参数。
ldr r1, =UTXH0
str r0, [r1]
ldr r0, =UTRSTAT0
1:
ldr r1, [r0]
tst r1, #(1<<2)
beq 1b
mov pc, lr
/***************************start.S******************************/ 向终端发出a-z字符
.text
.align 2
.global _start
_start:
bl set_port //通知协处理器外设地址
bl close_wtd //关闭看门狗
bl clock_init_533 //初始化系统时钟
bl uart_init
mov r4, #'a'
1:
cmp r4, #'z'
bgt 1f
mov r0, r4
bl mputc
add r4, #1
b 1b
1:
loop:
b loop
.align 2
.global set_port
set_port:
ldr r0, =0x70000013
mcr p15, 0, r0, c15, c2, 4
mov pc, lr
.text
.align 2
.global close_wtd
close_wtd:
ldr r0, =WTCON
ldr r1, [r0]
bic r1, r1, #1
str r1, [r0]
mov pc, lr
由于选择nand flash启动,所以必须关闭看门狗,设置系统时钟并通知CPU外设地址范围,设置系统时钟的代码并没有附上。编译成二进制文件后将其烧到nand flash并选择从nand flash启动即可看到终端上输出a-z(需连接minicom).