关于UART的原理就不再赘述了。本次帖子主要讲述S3C2416 UART的使用。
S3C2416的UART配有4个独立异步串行I/O口,每个都可以是基于中断或基于DMA模式的操作。该UART可以支持的比特率最高为3Mb/s。每个UART的通道包含了两个64字节收发FIFO存储器。下面以UART0为例,讲解S3C2416 UART的使用。
与UART0设置相关的寄存器:GPHCON、ULCON0、UCON0、UFCON0、UMCON0、UBRDIV0、UDIVSLOT0。
(1) 配置UART0的功能引脚:GPH0、GPH1。
(2) 设置线路控制寄存器寄存器:ULCON0
设置ULCON0为0x3,即普通模式操作、8位数据位、1位停止位、无奇偶校验位。
(3)设置UART控制寄存器UCON0
该寄存器主要设置:时钟选择、中断是否使能、中断类型及是否使用DMA
在这我们设置UCON0为:0x5,即时钟源为PCLK、禁止中断、使能UART发送与接收。
(4)设置FIFO控制寄存器:UFCON0
该寄存器主要设置Tx/Rx FIFO的触发深度、复位及FIFO的使能
注意:(i)在DMA模式下,FIFO Enable位应该为0。
(ii)当UART 未达到FIFO 触发深度或在带FIFO 的DMA 接收模式中3 字周期期间没有收到数据时,将发生Rx中断(接收超时),用户应该检查FIFO 状态并读出剩余部分。在这设置UFCON0为:0x01,即使能FIFO,Tx FIFO触发深度为空,Rx FIFO触发深度为1字节。
(5)设置UART MODEM控制寄存器UMCON0
该寄存器主要是自动流控制的相关设置
现在对自动流控制还不太清楚,所以就先设置UMCON0为0x00,即无自动流控制。
注意:(i)UART3不支持AFC功能,因为S3C2416没有nRTS3和nCTS3。
(ii)如果AFC位使能并且Time-out位失能,RTS的触发深度必须大于Rx FIFO的触发深度。
(6)设置波特率:UBRDIV0、UDIVSLOT0计算公式在光盘数据手册的第328页,以下是截图:
比如要设置波特率为:115200,已知:PCLK=66.6MHz所以:{66600000/(115200*16)}-1=UBRDIV0+(num of 1’s in UDIVSLOT0)/16
关于num of 1’s in UDIVSLOT0在数据手册上有一张表格,直接参考使用设置UDIVSLOT0寄存器。
所以UBRDIV0+(num of 1’s in UDIVSLOT0)/16=35.13设置UBRDIV0为35,UDIVSLOT0为0x0808。(UDIVSLOT0设置得不够精确好像也是可以的)。通过设置以上的寄存器就能把串口初始化了,接着讲解重定向C库函数printf到UART0。
- void Uart0_SendByte(char b)
- {
- //等待发送缓冲器为空,即数据发送完
- while (!(UTRSTAT0_REG & 0x2));
- //将要发送的数据送到发送缓冲寄存器
- UTXH0_REG = b;
- }
- int fputc(int c, FILE *f)
- {
- //重定向printf到UART0
- Uart0_SendByte(c);
- return c;
- }
复制代码串口初始化函数:
主函数:
- int Main(void)
- {
- Uart0_Init();
- while (1)
- {
- printf("\r\nbbs.eeworld.com\r\n");
- printf("\r\n您前进路上的铺路石——君益兴\r\n");
- delay();
- }
- }
复制代码程序在Keil MDK中写的,用J-Link仿真器,Debug—全速运行,就能看到串口打印的文字(也能设置断点,单步运行调试)
还有一点要注意的:在Keil MDK中要使用stdio.h头文件,应该先钩上Use Micro LIB,如下图
uart.rar
(211.75 KB, 下载次数: 13)
论坛ID:fjjjnk1234 提交时间:2014.08.03