imux6ull的UART1模块如下

从底板原理图里可以看到imx6ull的UART1的收发数据都是通过sgm3157模块接到CH340C上,这样我们就可以使用一根USB typec线进行串口的连接了;
首先要配置好串口的引脚复用和电气属性;
通过原理图我们只需要在fsliomuxc.h里搜索URAT_RX和URAT_TX(这里两个代表的是引脚);我们在配置引脚复用时就是使用了fsliomuxc.h里面的 IOMUXC_SetPinMux;他是一个结构体。

它的参数对应的都是手册里的第32章节IOMUXC部分的每个引脚;就说说这个引脚是什么,用来实现什么功能;从结构体我们不难发现,configregister(电气属性)我们是没有配置的;因为害怕出现错乱;我们单独把电气属性写成另一个结构体来实现

从这个结构体我们不难看出,只需要给它一个值就能直接给他的电气属性配置好;但具体怎么配置(就是这个值给什么)还是要去看参考手册;毕竟我们引脚有些时候做输入,有些时候做输出等等;
下面我们来看参考手册的第55章UART;再配置这个串口的时候我们需要用到的寄存器以及它用到的位如下
UART_UCR2




IRTS------忽略RTS;RTS相当于是一个硬件流控;
IRTS=0:UART发送模块会读取RTS_B(_B代表的是低电平有效);如果为低电平,那么这个时候TX才可以发送
IRTS=1:忽略RTS_B的值,这个时候RTS相当于一个普通的GPIO;本质上是因为UART的发送模块强制把他拉为低,这样TX就可以一直发送;
显然这个位我们要置为1;
PREN:校验使能;
0:不使能
1:使能
这里我们不用到校验位,置为0;
6:STPB------停止位的位数;
0:一位
1:两位
这里我们只要一位,所以为0;
WS------数据位的个数
0:7位数据位
1:8位数据位
这里显然置为1;
TXEN------发送使能位
0:发送不使能
1:发送使能(显然这里为1)
RXEN------接收使能位
0:接收不使能
1:接收使能(显然为1)
SRST------软件复位
0:USR1, USR2, UBIR, UBMR, UBRC , URXD, UTXD and UTS6-3这些都会恢复默认值
1:不复位
显然在初始化的最开始我们让他复位,然后等待它为一再进行配置;
UART_UCR3
RXDMUXSEL------多路复用选择位
0:不启动多路复用模式
1:启动多路复用
这个位控制的是UART的接收端的输入是来自哪一路输入源;在本芯片中,UART工作在MUXED模式,该位始终为1;
UART_UFCR

RFDIV------时钟的分频选择(0为1分频,1为2分频...)

在时钟树里我们不难发现UART的时钟来自于PLL3(480Mhz),它中间会经过一个6分频的PFD,所以UART_CLK_ROOT的时钟为80Mhz;在这里我们选择1分频101;
UART_UBIR
波特率的计算公式为

我们要实现115200的波特率,计算得到
的值约为43403;所以我们不妨把UBMR的值设置为43402,UBIR的值为999,这样的精确度就很高了。
UART_UCR1

UARTEN------UART使能位
0:不使能
1:使能
显然这里为1,而且放在初始化最后。
代码为
cs
include "MCIMX6Y2.h"
#include "fsl_iomuxc.h"
#include "core_ca7.h"
#include "gpt.h"
void uart_init(UART_Type * base)
{
if (base == UART1)
{
IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX, 0);
IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX, 0);
IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX, 0x1079);
IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX, 0x1079);
}
base->UCR2 &= ~(1 << 0);
delay_us(1);
unsigned int tmp = base->UCR2;
tmp |= (1 << 14);
tmp &= ~(1 << 8);
tmp &= ~(1 << 6);
tmp |= (1 << 5);
tmp |= (1 << 2);
tmp |= (1 << 1);
base->UCR2 = tmp;
base->UCR3 |= (1 << 2);
tmp = base->UFCR;
tmp &= ~(0x7 << 7);
tmp |= (0x5 << 7);
base->UFCR = tmp;
base->UBIR = 999;
base->UBMR = 43402;
base->UCR1 |= (1 << 0);
}