Chinaunix首页 | 论坛 | 博客
  • 博客访问: 132718
  • 博文数量: 38
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 191
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-16 11:31
个人简介

嵌入式新人

文章分类

全部博文(38)

文章存档

2016年(38)

我的朋友

分类: 嵌入式

2016-06-06 23:04:40

    本文首先对 S5PV210的UART进行简单介绍,并给出常用三线制UART--->RS232的硬件原理图,接着对UART的寄存器进行简介,最后给出UART的初始化和发送实例代码。
1  S5PV210的UART简介   
    S5PV210有4个独立的UART,每个UART都可以工作于DMA模式或Interrupt模式。其中,UART0有256byte的Tx FIFO和256byte的Rx FIFO,UART1有64byte的Tx FIFO和64byte的Rx FIFO,UART2和UART3有16byte的Tx FIFO和16byte的Rx FIFO。发送数据时,数据写入到Tx FIFO,然后移入到Tx shifter中,最后从Tx管脚发送出去;接收数据时,从Rx管脚接收数据送入到Rx shifter中,再移入到 Rx FIFO中,完成数据的接收,可参考下图(From section 2-1 Figure 1-1      Block Diagram of UART )。
 

     通常UART转换成RS232作为对外接口,下图给出了一个示例原理图,使用DB9接口引出(请记住站在开发板角度,Pin2--Txd;Pin3--Rxd;Pin5--GND)。
    
   

S5PV210的 UART的寄存器

S5PV210的每个UART有15个寄存器,这里以UART0为例,列出了UART0的所有寄存器,通过设置寄存器,可以设定UART0的工作方式,这在后面的代码中会有所体现。

 

序号

寄存器

地址

作用

寄存器位定义

1

ULCON0

0xE290_0000

UART0 Line控制寄存器

ULCON0[6]=Infrared Mode

ULCON0[5:3]=Parity Mode

ULCON0[2]= Number of Stop Bit

ULCON0[1:0]=Word Length

2

UCON0

0xE290_0004

UART0控制寄存器

UCON0[20]= Tx DMA Burst Size

UCON0[16]= Rx DMA Burst Size

UCON0[10]=Clock Selection

UCON0[9]=Tx Interrupt Type

UCON0[8]=Rx Interrupt Type

UCON0[7]=Rx Time Out Enable

UCON0[6]=Rx Error Status Interrupt Enable

UCON0[5]= Loop-back Mode

UCON0[4]=Send Break Signal

UCON0[3:2]= Tx Mode

UCON0[1:0]= Rx Mode

3

UFCON0

0xE290_0008

UART0 FIFO控制寄存器

UFCON0[10:8]= Tx FIFO Trigger Level

UFCON0[6:4]= Rx FIFO Trigger Level

UFCON0[2]= Tx FIFO Reset

UFCON0[1]= Rx FIFO Reset

UFCON0[0]= FIFO Enable

4

UMCON0

0xE290_000C

UART0 Modem控制寄存器

UMCON0[7:5]= RTS Trigger Level

UMCON0[4]= Auto Flow Control (AFC)

UMCON0[3]=Modem Interrupt Enable

UMCON0[0]=Request to Send

5

UTRSTAT0

0xE290_0010

UART0 Tx/Rx状态寄存器

UTRSTAT0[2]= Tx Buffer & Tx shifter empty

UTRSTAT0[1]= Tx Buffer empty

UTRSTAT0[0]= Rx Buffer data ready

6

UERSTAT0

0xE290_0014

UART0 Error 状态寄存器

UERSTAT0[3]=Break Detect

UERSTAT0[2]=Frame Error

UERSTAT0[1]=Parity Error

UERSTAT0[0]=Overrun Error

7

UFSTAT0

0xE290_0018

UART0 FIFO 状态寄存器

UFSTAT0[24]= Tx FIFO Full

UFSTAT0[23:16]= Tx FIFO Count

UFSTAT0[9]= Rx FIFO Error

UFSTAT0[8]= Rx FIFO Full

UFSTAT0[7:0]= Rx FIFO Count

8

UMSTAT0

0xE290_001C

UART0 Modem状态寄存器

UMSTAT0[4]= Delta CTS

UMSTAT0[0]=Clear to Send

9

UTXH0

0xE290_0020

UART0 Tx Buffer寄存器

UTXH0[7:0]=Tx data for UART0

10

URXH0

0xE290_0024

UART0 Rx Buffer寄存器

URXH0[7:0]=Rx data for UART0

11

UBRDIV0

0xE290_0028

UART0 Baud Rate寄存器

UBRDIV0[15:0] =Baud Rate Division Value

12

UDIVSLOT0

0xE290_002C

UART0 Dividing Slot寄存器

UDIVSLOT0[15:0]= Select Divider Slot

13

UINTP0

0xE290_0030

UART0 Interrupt Pending寄存器

UINTP0[3]= Modem Interrupt

UINTP0[2]= Tx Interrupt

UINTP0[1]= Error Interrupt

UINTP0[0]= Rx Interrupt

14

UINTSP0

0xE290_0034

UART0 Interrupt Source Pending寄存器

UINTSP0[3]= Modem Interrupt

UINTSP0[2]= Tx Interrupt

UINTSP0[1]= Error Interrupt

UINTSP0[0]= Rx Interrupt

15

UINTM0

0xE290_0038

UART0 Interrupt Mask寄存器

UINTM0[3]= Modem Interrupt

UINTM0[2]= Tx Interrupt

UINTM0[1]= Error Interrupt

UINTM0[0]= Rx Interrupt

 



3 UART0的实例代码

代码分为3个部分:UART0的初始化,UART0的发送一个字符,UART0的接收一个字符。
初始化的步骤包括:
1.设置GPIOA0_0为UART0的接收管脚RxD0,GPIOA0_1为UART0的接收管脚TxD0
2.设置UART0的寄存器,确定数据方式如Normal Mode;No Parity;one stop bit;8-bit data
3.设置UART0的波特率为115200
 

点击(此处)折叠或打开

  1. #define GPA0CON        0xE0200000
  2. #define UCON0         0xE2900004
  3. #define ULCON0         0xE2900000
  4. #define UMCON0         0xE290000C
  5. #define UFCON0         0xE2900008
  6. #define UBRDIV0     0xE2900028
  7. #define UDIVSLOT0    0xE290002C
  8. #define UTRSTAT0    0xE2900010
  9. #define UTXH0        0xE2900020    
  10. #define URXH0        0xE2900024    

  11. #define rGPA0CON    (*(volatile unsigned int *)GPA0CON)
  12. #define rUCON0        (*(volatile unsigned int *)UCON0)
  13. #define rULCON0        (*(volatile unsigned int *)ULCON0)
  14. #define rUMCON0        (*(volatile unsigned int *)UMCON0)
  15. #define rUFCON0        (*(volatile unsigned int *)UFCON0)
  16. #define rUBRDIV0    (*(volatile unsigned int *)UBRDIV0)
  17. #define rUDIVSLOT0    (*(volatile unsigned int *)UDIVSLOT0)
  18. #define rUTRSTAT0    (*(volatile unsigned int *)UTRSTAT0)
  19. #define rUTXH0        (*(volatile unsigned int *)UTXH0)
  20. #define rURXH0        (*(volatile unsigned int *)URXH0)


  21. void uart_init(void)
  22. {
  23.     // Config GPIOA0 to UART0 Function
  24.     rGPA0CON &= ~(0xff<<0);            // Clear GPACON[7:0]
  25.     rGPA0CON |= 0x00000022;            // set TxD0 & RxD0
  26.     
  27.     // Config UART0 Register
  28.     rULCON0 = 0x3; //Normal Mode;No Parity;one stop bit;8-bit data
  29.     rUCON0 = 0x5; //PCLK;Polling Mode
  30.     rUMCON0 = 0; //Disable Modem
  31.     rUFCON0 = 0; //Disable FIFO
  32.     
  33.     // set Baud Rate =115200 ; DIV_VAL = (PCLK / (bps x 16))-1=34.8
  34.     //rUBRDIV0 = 34;    // PCLK_PSYS=66MHz
  35.     //rUDIVSLOT0 = 0xdfdd; //From tabel in Page 880
  36.     
  37.     
  38.     // DIV_VAL = (66700000/(115200*16)-1) = 35.18
  39.     rUBRDIV0 = 35; // PCLK_PSYS=66.7MHz
  40.     rUDIVSLOT0 = 0x0888;    //From tabel in Page 880
  41. }



  42. void uart_putc(char c)
  43. {     
  44.     while (!(rUTRSTAT0 & (1<<1)));
  45.     rUTXH0 = c;
  46. }


  47. char uart_getc(void)
  48. {
  49.     while (!(rUTRSTAT0 & (1<<0)));
  50.     return (rURXH0 & 0x0f);
  51. }

 


 
 
 
 

     
阅读(1923) | 评论(0) | 转发(0) |
0

上一篇:bic和orr指令

下一篇:ARM的字对齐

给主人留下些什么吧!~~