数码相框项目模块【二】 UART

来源:互联网 发布:周杰伦和吴宗宪 知乎 编辑:程序博客网 时间:2024/06/02 17:19

如果要想在串口工具DWN上显示打印信息,使用C语言的标准库是没有效果的,必须利用开发板上的串口,经过CPU来进行输出打印信息,UART模块可以实现输入和输出的功能

(一)配置I /0 寄存器
要在原理图上找到串口,这里我们使用串口0 ( U12 ),需要在原理图上找到接收数据信号 XRXD0 和 传送数据信号 XTXD0 两条信号线,然后在核心板上找到对应的输入输出端口GPH2和GPH3,由此,找到相应的控制寄存器GPHCON,设置为特定功能 RXD[0] 和 TXD[0]

(二)配置特殊寄存器
由规格书可知我们需要配置的特殊寄存器有 ULCON、UCON、UFCON 和 UBRDIV 
ULCON0寄存器:8-bit data,no parity,one stop bit
UCON0寄存器: PCLK,polling mode
UFCON0寄存器:Non-FIFO mode
UMCON0寄存器:disable the MODEM mode
UBRDIV寄存器的设置:按照波特率为115200,PCLK=50MHz,根据规格书上的公式计算可得数值为 27 -1

(三)输入输出原理,如下图:



接收字符:当从键盘接受一个字符时,通过URXH0寄存器进行返回,若缓冲区没有字符,则需要一直进行等待
传送字符:直到缓冲区为空时,才进行传送字符,否则就一直进行等待

UART0.C 代码如下

Code:
  1. #include "2440addr.h"   
  2. #include "uart.h"   
  3. #include "string.h"   
  4. #include <stdarg.h>   
  5. #include "stdio.h"   
  6.   
  7. /*  
  8. Function  name  :   uart0_init  
  9. Description     :   Uart 0 init  
  10. Input parameter :   none  
  11. Return          :   none          
  12. Others          :   Disable FIFO function                                            
  13. */  
  14. void uart0_init(void)   
  15.   
  16. {   
  17.     volatile unsigned int val;   
  18.        
  19.     val = rGPHCON;   
  20.        
  21.     val &= ~((3<<6)|(3<<4));    
  22.        
  23.     val |= (2<<6)|(2<<4);   
  24.        
  25.     rGPHCON = val;   
  26.        
  27.     rULCON0  = 0x03;     /*8-bit data , no parity , one stop bit */  
  28.   
  29.     rUCON0   = 0x05;     /*PCLK, polling mode*/  
  30.   
  31.     rUFCON0  = 0x00;     /*Non-FIFO mode*/  
  32.   
  33.     rUMCON0  = 0x00;     /* disable the MODEM mode */  
  34.   
  35.     rUBRDIV0 = UART_BRD;  /*  baud-rate  115200 */  
  36.   
  37. }     
  38.   
  39. /*  
  40. Function  name  :   uart0_putchar  
  41. Description     :   Output  a  char from Uart 0 port  
  42. Input parameter :   the char value  
  43. Return          :   none          
  44. Others          :   Disable FIFO function                                            
  45. */  
  46.   
  47. void uart0_putchar(unsigned char c)     /*transmit a char value*/  
  48.   
  49. {   
  50.     while (!(rUTRSTAT0 & 2)) ; /* wait until the whole data has been transmited */  
  51.   
  52.     /* write the data  to the UTXH0 register , and UART will auto  transmit it */  
  53.        
  54.     rUTXH0 = c;   
  55. }   
  56.   
  57.   
  58. /*  
  59. Function  name  :   uart0_getchar  
  60. Description     :   get  a  char from Uart 0 port  
  61. Input parameter :   none   
  62. Return          :   the char          
  63. Others          :   Disable FIFO function                                            
  64. */  
  65.   
  66. unsigned char uart0_getchar(void)       /*receive a char value*/  
  67.   
  68. {   
  69.     /* wait until the whole data has been received */  
  70.   
  71.     while (!(rUTRSTAT0 & 1)) ;   
  72.   
  73.     /* read from URXH0 register directly , and receive the data */  
  74.   
  75.     return rURXH0;   
  76.   
  77. }   
  78.   
  79. /*  
  80. Function  name  :   uart0_puts  
  81. Description     :   Output  a  char string from Uart 0 port  
  82. Input parameter :   the char string   
  83. Return          :   none          
  84. Others          :   Disable FIFO function                                            
  85. */  
  86.   
  87. void uart0_puts(char *p)  //输出一串字符  
  88. {   
  89.   
  90.         while(*p)   
  91.         {   
  92.             uart0_putchar(*p);   
  93.             p++;   
  94.         }              
  95. }   
  96.   
  97.   
  98. void Uart_Printf(char *fmt,...)    
  99. {   
  100.             va_list ap;              /* point to the address of parameter-list */  
  101.             char string[256];   
  102.             va_start(ap,fmt);       /*ap point to the address of parameter-list*/  
  103.             vsprintf(string,fmt,ap);/*将参数fmt、ap指向的可变参数一起转换成格式*/  
  104.             uart0_puts(string);     /*把格式化字符串从开发板串口送出去*/  
  105.             va_end(ap);             /*ap=0 */  
  106. }  


UART0.H 代码

Code:
  1. #ifndef _UART_H   
  2. #define _UART_H   
  3.   
  4. #define PCLK         50000000    // init.c中的clock_init函数设置PCLK为50MHz  
  5.   
  6. #define UART_CLK     PCLK        //  UART0的时钟源设为PCLK  
  7.   
  8. #define UART_BAUD_RATE  115200      // 波特率   
  9.   
  10. #define UART_BRD        ((UART_CLK  / (UART_BAUD_RATE * 16)) - 1)  
  11.   
  12. extern void uart0_init(void);   
  13.   
  14. extern void uart0_putchar(unsigned char c);   
  15.   
  16. extern unsigned char uart0_getchar(void);   
  17.   
  18. void uart0_puts(char s[]);   
  19.   
  20. void Uart_Printf(char *fmt,...) ;   
  21.   
  22. #endif  

 

原创粉丝点击