UART配置的相关寄存器如下(按s3c2440手册中的顺序列出):
1. ULCONn寄存器:线性控制寄存器
功能:设置奇偶校验,停止位, 数据位(5-8位)
注意:一般设置为无校验,一个停止位,数据位为8位,也就是常说的“8N1”,此时寄存器值为0x3。(bit[6]=0为正常模式,否则为红外模式);
2. UCONn寄存器:通道n控制器
功能:选择UART时钟源、设置UART中断方式
注意:可选择PCLK、UEXTCLK或FCLK/n。bit[5]=1为回送模式,用于测试;bit[3:2]和bit[1:0]分别控制传输和接收模式,初学者常设置为中断请求或查询模式,bit[3:2]=bit[1:0]=01。
3. UFCONn寄存器:FIFO控制寄存器
功能:用于设置是否使用FIFO,设置各FIFO的触发阙值,即发送FIFO中有多少个数据时产生中断、接收FIFO中有多少个数据时产生中断。并可以通过设置UFCONn寄存器来复位各个FIFO。读取UFSTATn寄存器可以知道各个FIFO是否已经满,其中有多少个数据。
注意:bit[0]=1时,FIFO使能,否则禁止。初学者可不使用FIFO
4. UMCONn寄存器:UART MODEM控制寄存器
注意:bit[4]=0,AFC无效
5.UBRDIVn寄存器:波特率除数寄存器
功能:设置波特率除数
注意:UBRDIVn=(int)(UART时钟/(波特率*16))-1;
UART时钟:PCLK,FCLK/n或者UEXTCLK,例如,如果波特率为115200bps并且UART时钟为40MHz,则UBRDIVn为:
UBRDIVn=(int)(40000000/(115200*16))-1=(int)(21.7)-1(取最接近的整数)=22-1=21。
5. UTRSTATn寄存器:接收/发送状态寄存器
功能:显示接收/发送缓存寄存器状态
注意:在非FIFO模式时,bit[0]=1表明接收到数据;bit[1]=1表明发送缓存寄存器为空。在FIFO模式时,UFSTAT寄存器的相关位,具体见手册。
6. UERSTATn寄存器:错误状态寄存器
功能:表示各种错误是否发生
注意:初学者可以不关注其状态,待深入学习时,再查相关资料
7. UFSTATn寄存器:FIFO状态寄存器
功能:表明FIFO的相关状态
注意:bit[14]=1,表明发送FIFO已满,暂时不能再发送数据。Bit[6]=0,表明接收FIFO中有数据(个人理解,不过不太严谨)。
8. UMSTATn寄存器:UART MODEM 状态寄存器
注意:初学者可以不管
9. UTXHn寄存器:发送缓存寄存器
功能:UART即会将它保存到缓冲区中,并自动发送出去
注意:bit[7:0]=发送数据。
10. URXHn寄存器:接收缓存寄存器
功能:当UART接收到数据时,CPU读取这个寄存器,即可获得数据。
注意:bit[7:0]=接收数据;
注:URXHn与UTXHn有大、小端之分,定义寄存器时要注意,不过一般都是用小端法。
以串口0为例:FCLK=400M,FCLK:HCLK:PCLK=1:4:8;波特率为115200
注:特别重要的一点,与串口通讯有关的GPHCON要进行配置;这是初学者容易忽略的,我就忽略过,导致不能实现串口通讯,最后才找到原因。
void Port_Init(void)
{
GPHCON = 0x00faaa;
GPHUP = 0x7ff;
}
void Uart_Init(void)
{
//模式一
/******PCLK is used as uart's clock****************/
/***no FIFO---*************************************/
#if 1
ULCON0 = 0x3; //8N1
UCON0 = 0x245; //PCLK作为串口时钟
UFCON0 = 0x0; //no FIFO
UMCON0 = 0x0; // AFC disable
UBRDIV0=26;
/**************************************************/
#endif
//模式二
/**********************loop_uart-pclk—noFIFO*************/
#if 0
ULCON0 = 0x3; //8N1
UCON0 = 0x265; //bit[5] control loop mode: 1 is valid
UFCON0 = 0x0; //no FIFO
UMCON0 = 0x0; // AFC disable
UBRDIV0=26;
/**********************loop_uart********************/
#endif
//模式三
/**********************uart--FIFO--PCLK*******************/
#if 0
ULCON0 = 0x3; //8N1
UCON0 = 0x245; // PCLK作为串口时钟
UFCON0 = 0x31; //bit0]=1表示使能FIFO
UMCON0 = 0x0; // AFC disable
UBRDIV0=26;
/******************************************/
#endif
}
注:有定义如下
#define WrUTXH0(ch) (*(volatile unsigned char *)0x50000020)=(unsigned char)(ch)
#define RdURXH0() (*(volatile unsigned char *)0x50000024)
使用模式一和模式二时,输入和输出函数可如下形式
char Uart_Get_Char(void)
{
while(!(UTRSTAT0 & 0x1)); //Receive data ready
return (char)(RdURXH0());
}
char Uart_Put_Char(char ch)
{
while(!(UTRSTAT0 & 0x2)); //Wait until THR is empty.
WrUTXH0(ch);
return ch;
}
使用模式三时,输入和输出函数可用形式如下:
char Uart_FIFO_Put_Char(char ch)
{
while((UFSTAT0 & 0x4000));
WrUTXH0(ch);
return ch;
}
char Uart_FIFO_Get_Char(void)
{
while(!(UFSTAT0 & 0x1f));
eturn (char)(RdURXH0());
}
上一篇:S3C2440开发板LED驱动——ioremap 映射
下一篇:S3C2440定时器相关配置
推荐阅读最新更新时间:2024-11-06 10:55
设计资源 培训 开发板 精华推荐
- 英集芯-IP2326评估板(OEM)
- NCV6323DGEVB:3 MHz、2 A、高效率、低纹波、可调输出电压、同步降压转换器
- STCS1 1.5 A 最大恒流 LED 驱动器的典型应用
- LT1190 的典型应用 - 超高速运算放大器
- 基于过温检测的 LTC1531 比较器
- 具有最大功率点跟踪功能的 LTC4162EUFD-FSTM 太阳能供电 3 节 3.2A 充电器的典型应用
- 差分输入 24 位 A/D 转换器,具有双极性输入信号的半标度零
- 用于 MC9S08DZ128 微控制器的 EVB9S08DZ128、S08D 系列评估板
- SP6641B、3.3V 带 SuperCap 开关、DC/DC 升压稳压器的典型应用
- AM2G-4815DZ ±15V 2 瓦 DC-DC 转换器的典型应用