S3C6410串口可以中作在三种模式:中断,轮询,DMA;按是否使用FIFO又分为两类。
UART模块使用的IO参见下图,具体的IO配置参考【OK6410裸机程序】点亮LED
1. 轮询模式,使用FIFO
/************UART.c********************************************/
#define ULCON0 (*((volatile unsigned long *)0x7F005000))
#define UCON0 (*((volatile unsigned long *)0x7F005004))
#define UFCON0 (*((volatile unsigned long *)0x7F005008))
#define UMCON0 (*((volatile unsigned long *)0x7F00500C))
#define UTRSTAT0 (*((volatile unsigned long *)0x7F005010))
#define UFSTAT0 (*((volatile unsigned long *)0x7F005018))
#define UTXH0 (*((volatile unsigned char *)0x7F005020))
#define URXH0 (*((volatile unsigned char *)0x7F005024))
#define UBRDIV0 (*((volatile unsigned short *)0x7F005028))
#define UDIVSLOT0 (*((volatile unsigned short *)0x7F00502C))
#define GPACON (*((volatile unsigned long *)0x7F008000))
void init_uart(void)
{
GPACON &= ~0xff;
GPACON |= 0x22;
/* ULCON0 */
ULCON0 = 0x3; /* 数据位:8, 无较验, 停止位: 1, 8n1 */
UCON0 = 0x5; /* 使能UART发送、接收 */
UFCON0 = 0x01; /* FIFO ENABLE */
UMCON0 = 0;
/* 波特率 */
/* DIV_VAL = (PCLK / (bps x 16 ) ) - 1
* bps = 115200
* DIV_VAL = (50000000 / (115200 x 16 ) ) - 1
* = 26.12673611
*/
UBRDIV0 = 26;
/* x/16 = 0.12673611
* x = 2
*/
UDIVSLOT0 = 0x0808;
}
char getchar(void)
{
while ((UFSTAT0 & 0x7f) == 0); /*RX_FIFO EMPTY,等待*/
return URXH0;
}
void putchar(char c)
{
while (UFSTAT0 & (1<<14)); /* TX_FIFO_FULL=1,等待*/
UTXH0 = c;
}
/***********************main.c************************************/
#include "uart.h"
int main()
{
char c;
init_uart();
while (1)
{
c = getchar();
putchar(c+1);
}
return 0;
}
配置顺序:1.IO配置;2.数据位/较验/停止位配置(ULCONx);3.波特率配置;4.使能FIFO(UFCONx);5.使能RX/TX并设置轮询模式(UCONx).
使用FIFO时查询UFSTATx寄存器中的收发状态。
不使用FIFO时查询UTRSTATx寄存器中的收发状态。