imx6ull裸机开发:UART

一、主要特性

1.兼容TIA/EIT-232F标准,速度最高可达5Mbit/s

2.支持串行IR接口,兼容lrDA,最高可达115.2kbit/s

3.支持9位或者多节点模式(RS485)

4.1或2位停止位

5.可编程奇校验和偶校验

6.自动波特率检测(最高支持115.2kbit/S)

二、115200 8 1 N 与电脑之间通信
UART 的时钟源是由寄存器 CCM_CSCDR1 的 UART_CLK_SEL(bit)位来选择的,当为 0 的时候 UART 的时钟源为 pll3_80m(80MHz),如果为 1 的时候 UART 的时钟源为 osc_clk(24M),一般选择 pll3_80m 作为 UART 的时钟源。寄存器 CCM_CSCDR1 的 UART_CLK_PODF(bit5:0)位是 UART 的时钟 分频值,可设置 0~63,分别对应 1~64 分频,一般设置为 1 分频,因此最终进入 UART 的时钟为 80MHz。
UART 几个重要的寄存器,IMX6UL有四个UART控制寄存器,
UART 的控制寄存器1,即UARTx_UCR1(x=1~8)手册第3618页,我们比较关心的有:

  1. ADBR(bit14):自动波特率检测使能位,为 0 的时候关闭自动波特率检测,为 1 的时候使能自动波特 率检测;
  2. UARTEN(bit0):UART 使能位,为 0 的时候关闭 UART,为 1 的时候使能 UART。
    UART 的控制寄存器 2,即:UARTx_UCR2,
  3. IRTS(bit14):为 0 的时候使用 RTS 引脚功能,为 1 的时候忽略 RTS 引脚;
  4. PREN(bit8):奇偶校验使能位,为 0 的时候关闭奇偶校验,为 1 的时候使能奇偶校验;
  5. PROE(bit7):奇偶校验模式选择位,开启奇偶校验以后此位如果为 0 的话就使用偶校验,此位为 1 的 话就使能奇校验。
  6. STOP(bit6):停止位数量,为 0 的话 1 位停止位,为 1 的话 2 位停止位;
  7. WS(bit5):数据位长度,为 0 的时候选择 7 位数据位,为 1 的时候选择 8 位数据位;
  8. TXEN(bit2):发送使能位,为 0 的时候关闭 UART 的发送功能,为 1 的时候打开 UART的发送功能;
  9. RXEN(bit1):接收使能位,为 0 的时候关闭 UART 的接收功能,为 1 的时候打开 UART的接收功能;
  10. SRST(bit0):软件复位,为 0 的是时候软件复位 UART,为 1 的时候表示复位完成。复位完成以后此位会自动置 1,表示复位完成。此位只能写 0,写 1 会被忽略掉。
    UARTx_UCR3 寄存器,该寄存器的第二位RXDMUXSEL必须始终为1,手册规定。
    UARTx_USR2是 UART 的状态寄存器 2:
  11. TXDC(bit3):发送完成标志位,为 1 的时候表明发送缓冲(TxFIFO)和移位寄存器为空,也就是发送完成,向 TxFIFO 写入数据此位就会自动清零;
  12. RDR(bit0):数据接收标志位,为 1 的时候表明至少接收到一个数据,从寄存器UARTx_URXD 读取数据接收到的数据以后此位会自动清零

最后的问题是关于波特率的问题,首先需要把UART的工作频率确定下来,PLL3时钟为480MHz, 经由一个静态6分频的分频器之后为80MHz。此后UART还有一个自己的分频器,由寄存器UARTx_UFCR(bit9:7决定分频值。我们需要1分频,即为101。


例如:波特率为115200,工作频率是80MHz,那么上面公式右边为(80000000)/(16*115200)=
43.403。就是说如果(UBIR+1)=1000的话,(UBMR+1)是43403。那么UBIR=999,UBMR=43402。

cpp 复制代码
#include "MCIMX6Y2.h"
#include "fsl_iomuxc.h"
#include "core_ca7.h"
#include "led.h"
#include "gpio.h"
#include "key.h"
#include "irq.h"
#include "clk.h"
#include "epit.h"
#include "gpt.h"
#include "uart.h"

void per_init(void)
{
    clk_init();
    irq_init();
    led_init();
    key_init();
    epit_init();
    gpt_init();
    uart_init(UART1);
}

void per_irq_init(void)
{
    request_irq(IRQ_GPIO1_18, led_on);
    request_irq(EPIT1_IRQn, led_nr);
}

int main(void)
{
    unsigned char data = 0;
    per_init();
    per_irq_init();
    while(1)
    {
        unsigned char data = uart_recv_byte(UART1);
        data += 1;
        uart_send_byte(UART1, data);
        //delay_ms(100);
        #if 0
        delay_ms(1000);
        led_on();
        delay_ms(1000);
        led_off();
        #endif
    }
    return 0;
}
相关推荐
辣知1 小时前
辣知·化智56 良渚神权与夏朝颠覆
学习
dadaobusi2 小时前
学习:三层交换机
学习
笨鸟先飞的橘猫2 小时前
树结构在游戏行业中的应用
学习·游戏
yangmu32033 小时前
从显像管到Micro-LED:屏幕的光之进化
学习·显示器
半生过往4 小时前
前端工程师学习智能体开发(一)
前端·学习·状态模式
m4Rk_6 小时前
【论文阅读】Agent 记忆机制(67):MemPO——用记忆级信用分配训练 Agent 主动管理长程上下文
论文阅读·人工智能·学习·开源·github
下辈子不要当码农6 小时前
ARM学习(1)
学习·arm
東隅已逝,桑榆非晚7 小时前
vector(模拟实现)
c++·笔记·学习
鱼听禅7 小时前
C# 学习笔记-使用 类型化客户端搭建HTTP客户端服务
学习·http·c#·工厂方法模式