https://static.assets-stash.eet-china.com/album/old-resources/2009/2/28/6a167467-0ac0-438b-ad4c-4fdc7276c61e.rar这是源程序。
https://static.assets-stash.eet-china.com/album/old-resources/2009/2/28/7ec096e7-42f4-4ffd-9078-b2ccbbd37b6a.rar这是UART的中文数据手册。
https://static.assets-stash.eet-china.com/album/old-resources/2009/2/28/9217d358-4bbd-465d-aa4b-74cdac4aec6d.rar串口调试助手。
今天想试着调一下串口,因为这是最基本的接口之一,我决定一个接口一个接口的学习。S3C2440的UART功能还是很丰富的。但是由于是刚开始学习,对很多东西还不是很明了,我就找了个最简单的例程,没有使用FIFO,AFC和DMA以及中断的功能。
先说一下,波特率的设定吧。这是基本的元素嘛。S3C2440的波特率发生器可以选择内部时钟或外部UEXTCLK来做源时钟。也就是说,被除数可以设定UCONn中的时钟选择来选择。波特率时钟通过16和有UART波特率除数寄存器(UBRDIVn)中定义的16位除数来分频源时钟(PCLK,FCLK/n)or EXTCLK)产生。其中
UBRDIVn=(int)(UART clock/(buad rate*16))-1
(UART clock:PCLK,FCLK/n or UEXTCLK)
UBRDIVn应该是从1到2^16-1,当使用小于PCLK的外部时钟UEXTCLK时应该设置0。
例如:UART clock为40M,波特率是115200bps,那么
UBRDIVn=(int)(40000000/(115200*16))-1=(int)(21.7-1)=22-1=21
关于波特率的设定方面我觉得在编程时采用一下方式会更好一些。
#define PCLK 50000000 // clock_init函数设置PCLK为50MHz
#define UART_CLK PCLK // UART0的时钟源设为PCLK
#define UART_BAUD_RATE 115200 // 波特率
#define UART_BRD ((UART_CLK / (UART_BAUD_RATE * 16)) - 1)
这样在修改起来会方便很多。
而且在使用时只需一句: UBRDIV0 = UART_BRD; // 波特率为115200
即可。
接下来就是对于寄存器的设置了。因为这个程序是最简单的,所以设置的内容也非常少。
void uart0_init(void)
{
GPHCON |= 0xa0; // GPH2,GPH3用作TXD0,RXD0
GPHUP = 0x0c; // GPH2,GPH3内部上拉
ULCON0 = 0x03; // 8N1(8个数据位,无较验,1个停止位)
UCON0 = 0x05; // 查询方式,UART时钟源为PCLK
UFCON0 = 0x00; // 不使用FIFO
UMCON0 = 0x00; // 不使用流控
UBRDIV0 = UART_BRD; // 波特率为115200
}
关于I/O口的设置就不说了。后5个寄存器是关于UART的。可以看到,使用的功能非常基本。
有关发送接收部分:
void putc(unsigned char c)
{
/* 等待,直到发送缓冲区中的数据已经全部发送出去 */
while (!(UTRSTAT0 & TXD0READY));
/* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */
UTXH0 = c;
}
/*
* 接收字符
*/
unsigned char getc(void)
{
/* 等待,直到接收缓冲区中的有数据 */
while (!(UTRSTAT0 & RXD0READY));
/* 直接读取URXH0寄存器,即可获得接收到的数据 */
return URXH0;
}
这是最基本的串口程序了,我决定接下来再研究一下FIFO和DMA的使用。
文章评论(0条评论)
登录后参与讨论