- UID
- 1029342
- 性别
- 男
|
上述寄存器是是和UART通信相关寄存器,使用简单的无FIFO,无自动流控AFC时,设置如下:
UFCON0 = 0x00; // 不使用FIFO
UMCON0 = 0x00; // 不使用流控
UBRDIV0 = 26; // 波特率为115200,PCLK=50Mhz
UBRDIV0 = 53; // 波特率为57600,PCLK=50Mhz
UBRDIV0 = 12; // 波特率为57600,PCLK=12Mhz
UTXH0和URXH0分别是数据发送和接收寄存器,发送数据时通过轮询方式判断发送状态寄存器的状态,当可以发送数据时,执行UTXH0寄存器写入操作,接收数据时,以轮询方式检测接收状态寄存器状态,当有数据到达时,读取URXH0寄存器里的数据即可取得串口数据。
#define TXD0READY (1<<2) //发送数据状态OK
#define RXD0READY (1) //接收数据状态OK
/* UART串口单个字符打印函数 */
extern void putc(unsigned char c)
{
while( ! (UTRSTAT0 & TXD0READY) );
UTXH0 = c;
}
/* UART串口接受单个字符函数 */
extern unsigned char getc(void)
{
while( ! (UTRSTAT0 & RXD0READY) );
return URXH0;
}
1.1.6 UART串口驱动实验init.s:本程序文件对看门狗,内存等基本硬件做初始化,然后跳入到xmain.c中的xmain函数执行。
;
; UART串口实验
;
GPBCON EQU 0x56000010
GPBDAT EQU 0x56000014
AREA Init, CODE, READONLY
ENTRY
start
; close watchdog
ldr r0, = 0x53000000 ; 将看门狗控制寄存器地址放入r0
mov r1, #0
str r1, [r0] ; 设置看门狗控制寄存器的值为0
bl initmem ; 跳转到initmem代码段,初始化内存
IMPORT xmain ; 引入main.c中的xmain函数
ldr sp, =0x34000000 ; 调用C程序之前先初始化栈指针
ldr lr, =loop ; 设置xmain函数的返回地址
ldr pc, =xmain ; 跳转到C程序中的xmain函数的入口处执行
loop
b loop ; 死循环
initmem ; 内存初始化
ldr r0, =0x48000000 ; 加载内存相关寄存器首地址r0
ldr r1, =0x48000034 ; 加载内存相关寄存器尾地址到r1
adr r2, memdata ; 将寄存器配置数据地址段首地址加载到r2
initmemloop
ldr r3, [r2], #4 ; 循环设置存寄存器
str r3, [r0], #4
teq r0, r1
bne initmemloop ; 循环到最后一个寄存器时退出函数
mov pc,lr
memdata
DCD 0x22000000 ;BWSCON
DCD 0x00000700 ;BANKCON0
DCD 0x00000700 ;BANKCON1
DCD 0x00000700 ;BANKCON2
DCD 0x00000700 ;BANKCON3
DCD 0x00000700 ;BANKCON4
DCD 0x00000700 ;BANKCON5
DCD 0x00018005 ;BANKCON6
DCD 0x00018005 ;BANKCON7
DCD 0x008e07a3 ;REFRESH
DCD 0x000000b1 ;BANKSIZE
DCD 0x00000030 ;MRSRB6
DCD 0x00000030 ;MRSRB7
END
xmain.c:uart_init函数对UART0进行初始化,然后进入死循环内,不停打印字符串“Uart串口打印试验”。
/* xmain.c */
/* GPIO registers */
#define GPHCON (*(volatile unsigned long *)0x56000070)
#define GPHDAT (*(volatile unsigned long *)0x56000074)
#define GPHUP (*(volatile unsigned long *)0x56000078)
/*UART registers*/
#define ULCON0 (*(volatile unsigned long *)0x50000000)
#define UCON0 (*(volatile unsigned long *)0x50000004)
#define UFCON0 (*(volatile unsigned long *)0x50000008)
#define UMCON0 (*(volatile unsigned long *)0x5000000c)
#define UTRSTAT0 (*(volatile unsigned long *)0x50000010)
#define UTXH0 (*(volatile unsigned char *)0x50000020)
#define URXH0 (*(volatile unsigned char *)0x50000024)
#define UBRDIV0 (*(volatile unsigned long *)0x50000028)
#define TXD0READY (1<<2) //发送数据状态OK
#define RXD0READY (1) //接收数据状态OK
/* UART串口初始化 */
void uart_init( )
{
GPHCON |= 0xa0; //GPH2,GPH3 used as TXD0,RXD0
GPHUP = 0x0; //GPH2,GPH3内部上拉
ULCON0 = 0x03; //8N1
UCON0 = 0x05; //查询方式为轮询或中断;时钟选择为PCLK
UFCON0 = 0x00; //不使用FIFO
UMCON0 = 0x00; //不使用流控
UBRDIV0 = 12; //波特率为57600,PCLK=12Mhz
}
/* UART串口单个字符打印函数 */
extern void putc(unsigned char c)
{
while( ! (UTRSTAT0 & TXD0READY) );
UTXH0 = c;
}
/* UART串口接受单个字符函数 */
extern unsigned char getc(void)
{
while( ! (UTRSTAT0 & RXD0READY) );
return URXH0;
}
/* UART串口字符串打印函数 */
extern int printk(const char* str)
{
int i = 0;
while( str[i] ){
putc( (unsigned char) str[i++] );
}
return i;
}
__inline void delay(int msec)
{
int i, j;
for(i = 1000; i > 0; i--)
for(j = msec*10; j > 0; j--)
/* do nothing */;
}
/* xmain通过UART串口打印字符串 */
int xmain()
{
uart_init();
while(1) {
delay(10);
printk("Uart串口打印试验/r/n");
}
return 0;
}
当编译并将生成Norflash,在->所有程序->通讯mini2440,在之后弹出的COM波特率1个停止位,PC串口(笔记本通常没有串口,可以买一个Uart串口打印试验”字符串。 |
|