Chinaunix首页 | 论坛 | 博客
  • 博客访问: 75583
  • 博文数量: 33
  • 博客积分: 1422
  • 博客等级: 上尉
  • 技术积分: 280
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-22 21:11
个人简介

学无止境

文章存档

2011年(13)

2010年(20)

我的朋友

分类: 嵌入式

2010-08-02 12:36:13

    MINI2440只接了UART0出来所以这里选择UART0做实验。参照数据手册我们要设置的寄存器值如下:
    ULCON0线性控制寄存器,ULCON0=0x03 ,8个数据位一个停止位无校验。
    UCON0控制寄存器,UCON0=0x245, (看vivi是这样设的,2410完全开发流程直接设成0x05)。
    UFCON0 FIFO控制寄存器,UFCON0 =0x0,禁止FIFO。
    UMCON0 MODEM控制寄存器  ,UMCON0 = 0x0 ,不使用MODEM。
    UBRDIV0 波特率除数寄存器,
UBRDIV0 = (INT)(PCLK/(BUADRATE*16)) - 1 =(INT)51000000/(115200*16) - 1 = 28 - 1 =27
注意数据手册有句话:round to the nearest whole number 所以取28-1=27
所以UBRDIV0 =27。
    UTRSTAT0接收发送状态寄存器:
    发送数据:bit【2】:无数据发送时自动设为1。当我们发送数据时先读此位一判断是否有数据正在占用发送口。bit【1】:发送FIFO是否为空,不使用。bit【0】:接收缓冲区是否有数据,若有,此位设为1,本实验要不断查询此位以判断是否有数据已经被接收。
    引脚设置:GPH2-3对应TDX0 RX0  设置 GPHCON |=(10<<4) | (10<<6).GPHUP
 
uart.c代码如下:

#define rULCON0 (*(volatile unsigned *)0x50000000)    //UART 0 Line control
#define rUCON0 (*(volatile unsigned *)0x50000004)    //UART 0 Control
#define rUFCON0 (*(volatile unsigned *)0x50000008)    //UART 0 FIFO control
#define rUMCON0 (*(volatile unsigned *)0x5000000c)    //UART 0 Modem control
#define rUTRSTAT0 (*(volatile unsigned *)0x50000010)    //UART 0 Tx/Rx status
#define rUBRDIV0 (*(volatile unsigned *)0x50000028)    //UART 0 Baud rate divisor
#define rUTXH0 (*(volatile unsigned char *)0x50000020)    //UART 0 Transmission Hold
#define rURXH0 (*(volatile unsigned char *)0x50000024)    //UART 0 Receive buffer
#define rGPHCON (*(volatile unsigned char *)0x56000070)    
#define rGPHUP (*(volatile unsigned char *)0x56000078)    



void uart_init(void)
{
     rGPHCON |=(10<<4)|(10<<6);
     rGPHUP = 0x00;
    
        rULCON0 = 0x03 ;
        rUCON0 = 0x245;
        rUFCON0 = 0x00;
        rUMCON0 = 0x00;
        rUBRDIV0=27;
}

void putc(unsigned char c)
{
     while(!(rUTRSTAT0&(1<<2)));
     rUTXH0=c;
}

unsigned char getc(void)
{
         while(!(rUTRSTAT0&(1<<0)));
     return rURXH0;
}

void putstr(char *str)
{
        while (*str)
         {
                putc(*str++);
            }
}

int main()
{
        uart_init();
        putstr("test uart\r\n");
        putstr("test uart\r\n");
        putstr("test uart\r\n");
        while(1)
        {
            char c;
            c=getc();
            putc(c);
        }

        return 0;
}

head.s的代码和clock的一样。编译下载到开发板上运行成功。从串口输出信息来看整个系统是不断的重启。这是因为在head.s中没有把看门狗关掉。添加如下代码:

@关闭看门狗
            mov r0, #0x53000000
            mov r1, #0x0
            str r1, [r0]


编译运行OK。
阅读(462) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~