(续接上篇)
5. UART
5.1 基本概念
通信:
- 嵌入式系统中的通信是指两个或两个以上的主机之间的数据互交
异步、同步:
- 异步:通信双方不共享一根时钟线规定的传输频率传输数据;
- 同步:通信双方共享一根时钟线规定的传输频率传输数据。

串行、并行:
- 串行:通过一根信号线逐字节传输数据;
- 并行:通过多跟信号线多个字节同时发送。

单工、半双工、全双工:
- 单工:接收方和发送方固定,通过1根信号线单向传输数据;
- 半双工:通信双方既可以当接收方也可以当发送方,通过1根信号线,同时刻一方只能发送,另一方只能接收;
- 全双工:通信双方既可以是接收方也可以是发送方,双方通过2根信号线可同时接收和发送数据。

TTL、RS232、RS485:电器标准
差分传输:
- 差分传输是一种信号传输方式,通过一对反向平行导线传输幅度相等、极性相反的同源信号,接收端通过检测两信号的差值还原原始信息,可有效抑制共模干扰、提升抗干扰能力与传输距离。
5.2 原理图分析
USB USART&USB POWER模块
注意:不建议USB作为电源供电,板子发热
- USB接口(USB_TTL)
- CH340(U8)
CH340 的核心功能是 USB 转串口(TTL) - DCDC电源稳压模块(U12 U13)
- 防抖、抗干扰
5.3 代码编写
5.3.1 时钟初始化
基准80MHz预分频: 1分频
5.3.2 引脚初始化
IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX, 0);
IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX,0x10B0);
IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX, 0);
IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX,0x10B0);
5.3.3 寄存器配置
UART Receiver Register (Uart 接收寄存器)
-
UARTx_URXD: 只读寄存器
-
RX_DATA\] b0-7: 已接收数据。保存接收到的字符。在7位模式下,最高有效位(MSB)被强制为0。在8位模式下,所有位都处于活动状态。
-
UARTx_UTXD:
-
TX_DATA\] b0-7:需要发送的数据,当软件向 TX_DATA 字段执行写入操作时,UART 硬件会自动开始一个新字符的发送过程。
-
UARTx_UCR1:
-
UARTEN\] b0:UARTEN 位是整个 UART(通用异步收发传输器)模块的总开关。它控制着 UART 模块的核心功能是开启还是关闭。
UARTx_UCR2:
-
UARTEN\]b0:软件复位 软件复位将保持有效 4 个模块时钟周期;
-
TXEN\] b2:发送器使能;
-
STPB\] b6:停止位数量。控制每个字符后发送的停止位数量;
-
IRTS\] b14:忽略 RTS 引脚流控;
UARTx_UCR3:
-
RXDMUXSEL\] b2:注意: 在此芯片中,UART 工作于多路复用 (MUXED) 模式,因此此位应始终设置为 1
UARTx_UFCR:
-
RFDIV\] b7-b9:参考时钟分频器。控制参考时钟的分频比 1分频;
UARTx_USR2:
-
TXDC\] b3:发送完成;
波特率配置寄存器
UART BRM Incremental Register (UARTx_UBIR)
-
INC\] b0-b15:UBIR;
-
MOD\] b0-b15:UBMR;
输出
void putc(unsigned char d)
{
while ((UART1->USR2 & (1 << 3)) == 0);
UART1->UTXD = d;
}
void puts(const char *pStr)
{
while (*pStr)
{
putc(*pStr++);
}
putc('\n');
}
输入
unsigned char getc(void)
{
while ((UART1->USR2 & (1 << 0)) == 0);
return (unsigned char)UART1->URXD & 0XFF;
}
5.5 移植stdio
- 需要在uart.c中添加一个函数:void raise(int n);函数体为空即可,否则会报错;
- 如果之前编写的project/start.s文件扩展名为小写s,则需改成大写。即start.S。对于汇编文
- 件来说,扩展名S和s说不一样的,S会先做预处理,在进行编译而s则省略预处理步骤;
- 由于增加了新的源码和头文件,所以Makefile也需要修改。
libpath = -lgcc -L/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/lib/gcc/arm-linux-gnueabihf/4.9.4
incdirs = bsp imx6ull stdio/include
srcdirs = bsp project stdio/lib