一、主要特性
1.兼容TIA/EIT-232F标准,速度最高可达5Mbit/s
2.支持串行IR接口,兼容lrDA,最高可达115.2kbit/s
3.支持9位或者多节点模式(RS485)
4.1或2位停止位
5.可编程奇校验和偶校验
6.自动波特率检测(最高支持115.2kbit/S)
二、115200 8 1 N 与电脑之间通信
UART 的时钟源是由寄存器 CCM_CSCDR1 的 UART_CLK_SEL(bit)位来选择的,当为 0 的时候 UART 的时钟源为 pll3_80m(80MHz),如果为 1 的时候 UART 的时钟源为 osc_clk(24M),一般选择 pll3_80m 作为 UART 的时钟源。寄存器 CCM_CSCDR1 的 UART_CLK_PODF(bit5:0)位是 UART 的时钟 分频值,可设置 0~63,分别对应 1~64 分频,一般设置为 1 分频,因此最终进入 UART 的时钟为 80MHz。
UART 几个重要的寄存器,IMX6UL有四个UART控制寄存器,
UART 的控制寄存器1,即UARTx_UCR1(x=1~8)手册第3618页,我们比较关心的有:
- ADBR(bit14):自动波特率检测使能位,为 0 的时候关闭自动波特率检测,为 1 的时候使能自动波特 率检测;
- UARTEN(bit0):UART 使能位,为 0 的时候关闭 UART,为 1 的时候使能 UART。
UART 的控制寄存器 2,即:UARTx_UCR2, - IRTS(bit14):为 0 的时候使用 RTS 引脚功能,为 1 的时候忽略 RTS 引脚;
- PREN(bit8):奇偶校验使能位,为 0 的时候关闭奇偶校验,为 1 的时候使能奇偶校验;
- PROE(bit7):奇偶校验模式选择位,开启奇偶校验以后此位如果为 0 的话就使用偶校验,此位为 1 的 话就使能奇校验。
- STOP(bit6):停止位数量,为 0 的话 1 位停止位,为 1 的话 2 位停止位;
- WS(bit5):数据位长度,为 0 的时候选择 7 位数据位,为 1 的时候选择 8 位数据位;
- TXEN(bit2):发送使能位,为 0 的时候关闭 UART 的发送功能,为 1 的时候打开 UART的发送功能;
- RXEN(bit1):接收使能位,为 0 的时候关闭 UART 的接收功能,为 1 的时候打开 UART的接收功能;
- SRST(bit0):软件复位,为 0 的是时候软件复位 UART,为 1 的时候表示复位完成。复位完成以后此位会自动置 1,表示复位完成。此位只能写 0,写 1 会被忽略掉。
UARTx_UCR3 寄存器,该寄存器的第二位RXDMUXSEL必须始终为1,手册规定。
UARTx_USR2是 UART 的状态寄存器 2: - TXDC(bit3):发送完成标志位,为 1 的时候表明发送缓冲(TxFIFO)和移位寄存器为空,也就是发送完成,向 TxFIFO 写入数据此位就会自动清零;
- RDR(bit0):数据接收标志位,为 1 的时候表明至少接收到一个数据,从寄存器UARTx_URXD 读取数据接收到的数据以后此位会自动清零
最后的问题是关于波特率的问题,首先需要把UART的工作频率确定下来,PLL3时钟为480MHz, 经由一个静态6分频的分频器之后为80MHz。此后UART还有一个自己的分频器,由寄存器UARTx_UFCR(bit9:7决定分频值。我们需要1分频,即为101。

例如:波特率为115200,工作频率是80MHz,那么上面公式右边为(80000000)/(16*115200)=
43.403。就是说如果(UBIR+1)=1000的话,(UBMR+1)是43403。那么UBIR=999,UBMR=43402。
cpp
#include "MCIMX6Y2.h"
#include "fsl_iomuxc.h"
#include "core_ca7.h"
#include "led.h"
#include "gpio.h"
#include "key.h"
#include "irq.h"
#include "clk.h"
#include "epit.h"
#include "gpt.h"
#include "uart.h"
void per_init(void)
{
clk_init();
irq_init();
led_init();
key_init();
epit_init();
gpt_init();
uart_init(UART1);
}
void per_irq_init(void)
{
request_irq(IRQ_GPIO1_18, led_on);
request_irq(EPIT1_IRQn, led_nr);
}
int main(void)
{
unsigned char data = 0;
per_init();
per_irq_init();
while(1)
{
unsigned char data = uart_recv_byte(UART1);
data += 1;
uart_send_byte(UART1, data);
//delay_ms(100);
#if 0
delay_ms(1000);
led_on();
delay_ms(1000);
led_off();
#endif
}
return 0;
}