首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

S3C2440串口驱动(4)

S3C2440串口驱动(4)

上述寄存器是是和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串口打印试验”字符串。
继承事业,薪火相传
返回列表