S3C2440之UART
来源:互联网 发布:网络摄像头相关知识 编辑:程序博客网 时间:2024/06/06 18:03
UART(Universal Asynchronous Receiver/Transmitter,通用异步接收/发送装置)用于异步通信,可以实现全双工发送和接收。s3c2440提供了三个UART端口,它们都可以通过查询、中断和DMA方式传输数据。下面通过超级终端发送字符到2440,2440返回该字符的例子来简要介绍一下s3c2440中UART的用法:
用到的寄存器:
GPHCON :端口配置引脚寄存器
GPHUP:使能上拉禁止寄存器
ULCON0:线路控制寄存器
UCON0:通道控制寄存器
UTRSTAT0:发送/接收状态寄存器
UBRDIV0:波特率分频寄存器
UTXTH0:通道0发送缓冲寄存器
URXTH0:通道0接收缓冲寄存器
编程流程如下:
1,UART的初始化:包括串口的选择,IO口的初始化,UART的UFCONn, UMCONn,ULCONn,UCONn及波特率的初始化
其中波特率的具体计算公式为:时钟源频率÷(波特率×16)-1。
如图:
具体相关寄存器的配置如下:
- rGPHCON = rGPHCON & (~(0xffff)) ;
- rGPHCON = rGPHCON | (0xaaa0) ;//除GPH0,GPH1以外的脚都是第二功能,urt0的9个脚
- rGPHUP = 0x0; // 使用内部上拉电阻。
- rUFCON0=0x00; //不使用FIFO
- rUMCON0=0x00; //不使用自动流控制
- rULCON0=0x03; //不采用红外线传输模式,无奇偶校验位,1个停止位,8个数据位
- rUCON0=0x245; //发送中断为电平方式,接收中断为边沿方式,禁止超时中断,允许产生错误状态中断,禁止回送模式,禁止中止
- //信号,传输模式为中断请求模式,接收模式也为中断请求模式。
- rUBRDIV0=( (int)(PCLK/16./baud+0.5) -1 );//?为什么要加0.5?
2,要发送数据时,等待直到发送缓冲区UTRSTAT0[1]为空.再把数据放入发送缓存器UTXHn中。
要发送的数据,首先被写入FIFO,然后拷贝到发送移位寄存器,接着它从数据输出端(TxDn)依次被移位输出
- while(!(rUTRSTAT0 & 0x2)); //等待,直到发送缓冲区为空
- Delay(100);
- WrUTXH0(ch); //串口0发送字符
UART的接收数据:被接收的数据也同样从数据接口RxDn移位输入到移位寄存器,然后拷贝到FIFO中
- while(!(rUTRSTAT0 & 0x1)); //检查串口状态寄存器0,是否有数据到来,启动接收过程
- return RdURXH0(); //URXH0串口接收缓存寄存器0
实现查询发式串口的收发功能,接收来自串口的字符,并将接收到的字符发送到超级终端:
- static int UartNum=0; //串口选择的标志位,可以省略,只是方便多个串口选择
- //===============================================================
- //对Uart进行初始化,以所需要的波特率为输入参数
- void myUart_Init(int whichuart, int baud)
- {
- if(whichuart==0) //判断是否选择串口0,假如选择串口1,则应该初始化串口1的寄存器
- {
- UartNum=0; //串口选择的标志位
- rGPHCON = rGPHCON & (~(0xffff)) ;
- rGPHCON = rGPHCON | (0xaaa0) ;//除GPH0,GPH1以外的脚都是第二功能,urt0的9个脚
- rGPHUP = 0x0; // 使用内部上拉电阻。
- rUFCON0=0x00; //不使用FIFO
- rUMCON0=0x00; //不使用自动流控制
- rULCON0=0x03; //不采用红外线传输模式,无奇偶校验位,1个停止位,8个数据位
- rUCON0=0x245; //发送中断为电平方式,接收中断为边沿方式,禁止超时中断,允许产生错误状态中断,禁止回送模式,禁止中止
- //信号,传输模式为中断请求模式,接收模式也为中断请求模式。
- rUBRDIV0=( (int)(PCLK/16./baud+0.5) -1 );//?为什么要加0.5?
- Delay(10);
- }
- }
- /*******************************************************************/
- void myUart_SendByte(char ch)
- {
- if (UartNum ==0) //判断是否选择串口0,在这里也可以不用这句,
- //只是方便多个串口选择时用
- {
- if(ch=='\n') //判断是否是换行字符,如果是换行字符,发送一个回车符
- {
- while(!(rUTRSTAT0 & 0x2)); //等待,直到发送缓冲区为空
- //Delay(10); //超级中断的响应速度较慢
- WrUTXH0('\r'); //发送回车符
- }
- while(!(rUTRSTAT0 & 0x2)); //等待,直到发送缓冲区为空
- Delay(100);
- WrUTXH0(ch); //串口0发送字符
- }
- }
- /********************************************************************/
- void Uart_Send (char *str)
- {
- myUart_Init(0,115200);
- while (*str)
- myUart_SendByte(*str++);
- }
- /********************************************************************/
- char myUart_ReceiveByte(void) //接收字符函数
- {
- if(UartNum==0) //选择串口0
- {
- while(!(rUTRSTAT0 & 0x1)); //检查串口状态寄存器0,是否有数据到来,启动接收过程
- return RdURXH0(); //URXH0串口接收缓存寄存器0
- }
- return 0;
- }
- /********************************************************************/
- void Uart_receive(char *string) //接收函数
- {
- char *string2 = string;
- char c;
- myUart_Init(0,115200); //串口的选择与波特率的选择
- while((c = myUart_ReceiveByte())!='\n') //循环判断接收字符函数返回的字符是不是换行字符\r是换行符?\n?
- {
- if(c=='\b')//\b回退符
- {
- if( (int)string2 < (int)string )
- {
- Uart_Printf("\b \b");
- string--;
- }
- }
- else
- {
- *string++ = c;
- myUart_SendByte(c);
- }
- }
- *string='\0'; //接收完毕后执行空格
- myUart_SendByte('\n'); //如果接收完毕后,补充一个回车
- }
- int Main(void)
- {
- char *str;
- char *string;
- ChangeClockDivider(3,1); //1:3:6
- ChangeMPllValue(127,2,1); //405MHZ
- Port_Init();
- Isr_Init();
- Uart_Send("Please Input a string:\n"); //超级终端提示输入一串字符
- Uart_receive(string); //2440接收字符
- *str=*string; //发送的跟接收的字符相等
- Delay(500);
- Uart_Send(str); //2440发送字符显示到超级终端上
- while(1);
- }
效果图:
0 0
- S3C2440数据资料之UART
- S3C2440之UART
- S3C2440之UART
- S3C2440之UART
- linux驱动之S3C2440 Uart
- S3C2440-UART
- S3C2440之UART操作(FIFO模式)
- S3C2440之UART操作(FIFO中断模式)
- S3C2440之UART操作(FIFO中断模式)
- S3C2440之UART操作(FIFO中断模式)
- ARM Linux S3C2440 之UART分析
- S3C2440之UART操作(FIFO中断模式)
- 学习uboot前奏之hardware-uart[s3c2440]
- ARM-Linux s3c2440 之UART分析(一)
- ARM-Linux s3c2440 之UART分析(二)
- ARM-Linux s3c2440 之UART分析(三)
- ARM-Linux s3c2440 之UART分析(四)
- ARM-Linux s3c2440 之UART分析(五)
- 集合差集算法
- 只能努力,才有方向
- ITFriend开发日志20140611
- iOS开发-NSLog不打印设置
- 随笔录—2014.6.11
- S3C2440之UART
- HTTP Session
- Android耳机按键监听
- 第1次实验——NPC问题(回溯算法、聚类分析)
- php连接mssql数据库的几种方式
- 各种常用的网站链接
- 黑马程序员_正则表达式
- VS.net中快捷键收缩和展开代码段 + 快捷键一览表
- cocos2d-x andriod Box2D.h 找不到,"Box2D.h" 改成 <Box2D/Box2D.h> 即可