嵌入式学习第38天——裸机imx6ull(uart接口;配置波特率为115200,8位数据位,无校验,一位停止位)

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);
}
相关推荐
qeen871 小时前
【Linux】操作系统之进程介绍(一)
linux·笔记·学习·进程
smartpi_ai2 小时前
CI-73T 的三个串口怎么分?下载口固定的引脚账本、词条 150 条的“词数“口径与硬 PWM 控舵机的性能边界
单片机·嵌入式硬件·语音识别
艾芯微科技2 小时前
ESDUNL24VC1 单向 ESD 静电保护二极管参数、电路设计与 PCB 防护布局
网络·单片机·嵌入式硬件·集成测试·51单片机
Kuakewei8882 小时前
OVP/OCP过压过流保护芯片设计指南:过压关断、限流与短路保护
嵌入式硬件
佳児素花痴╮2 小时前
STM32(中断)
stm32·单片机·嵌入式硬件
传奇开心果编程2 小时前
【Rust入门知识点学与练】第36课:所有权——移动、借用、Copy、切片
开发语言·学习·rust
传奇开心果编程2 小时前
【Rust入门知识点学与练】第35课:工具链与反馈环——先学会读编译器在说什么
开发语言·学习·rust
ZLG_zhiyuan3 小时前
示波器探头选型指南:5大分类,3步正确适配(附避坑清单)
单片机·嵌入式硬件
优化Henry3 小时前
学习笔记之关于MME不通问题归纳
运维·网络·学习·5g·信息与通信