嵌入式学习第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);
}
相关推荐
sunshine22 girl33 分钟前
Java学习七 Java 项目实战2-注册业务
java·学习
sunshine22 girl2 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
传奇开心果编程3 小时前
【SwiftUI提高练中学】第8课 网络层架构:拦截器、重试、缓存与离线优先
学习·macos·ui·ios·swiftui
一条破秋裤3 小时前
内核驱动的意义与课程学习规划
学习
Bug收容所4 小时前
学习LangChain day1
学习·langchain·llm·agent
传奇开心果编程4 小时前
【现代声明式UI学与练】第7课 组件通信——父传子、子传父、跨层级通信、状态提升与 Context
学习·flutter·react native·ui·swiftui·android jetpack
SuperByteMaster4 小时前
allegro 布线规则管理器
嵌入式硬件
我命由我123455 小时前
Photoshop - Photoshop 矢量蒙版
学习·职场和发展·产品运营·求职招聘·职场发展·产品经理·photoshop
女神下凡6 小时前
芯参谋(41):DDR2_电路设计指南
arm开发·单片机·嵌入式硬件·设计规范
熊猫钓鱼>_>6 小时前
越顺,越空:当 AI 把学习 “优化“ 到消失
人工智能·学习·ai·llm·agent·ai编程·metaai