嵌入式学习第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);
}
相关推荐
学长毕设6 小时前
基于SpringBoot的青少年编程学习平台系统-附源码
spring boot·学习·青少年编程
wuyk5557 小时前
防逆向基础:在量产固件中关闭调试接口并设置读保护(RDP)的正确姿势
stm32·单片机·嵌入式硬件·性能优化·重构
小小de风呀10 小时前
de风——【从零开始学习Linux】(九):进程基础 —— 从冯诺依曼体系到 fork 创建进程
linux·学习
李某学编程10 小时前
基于ARM的微机原理学习笔记(一)
arm开发·笔记·学习
zhangrelay11 小时前
单片机原理与接口技术-2026融合版-从MEGA2560-ESP32与Wokwi到ROS2-Lyrical与具身智能栈
单片机·嵌入式硬件
Song_RsHt11 小时前
Redis 与微服务,什么场景下无可替代
java·redis·后端·学习·微服务
艾络迅Acceleronix12 小时前
环境监测终端:STM32+EG800Z AT+ 艾络迅平台实战|多传感器采集联动全流程
c语言·stm32·单片机·嵌入式硬件·物联网·1024程序员节
涂山苏苏⁠12 小时前
stm32复习总结
stm32·单片机·嵌入式硬件
苏格拉真没有底13 小时前
ESP32 AI MCP调试器
stm32·单片机·嵌入式硬件
~kiss~14 小时前
PRO-LONG: Programmatic Memory Enables Long-Horizon Reasoning 程序式记忆赋能长程推理
学习