0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MIMXRT1060 FLEXIO UART波特率

li1756686189 来源:嵌入式 MCU 2023-01-29 10:02 次阅读

ad650948-9797-11ed-bfe3-dac502259ad0.png-

OSR 最小值是 4,因此24Mhz时钟模式下,LPUART最大波特率是 24/5 = 4.8Mbps,手册中硬件的 LPUART最大的波特率是 80Mhz/4=20Mbps。80/13= 6.15Mbps波特率,这样相对于 6Mhz就有 2.5%的误差。

ad8e38cc-9797-11ed-bfe3-dac502259ad0.png

ada2576c-9797-11ed-bfe3-dac502259ad0.png

adbb17de-9797-11ed-bfe3-dac502259ad0.png

那如果用 FlexIO外设实现 UART波特率可以达到 6Mbps么?

将FlexIO用于UART RX时,RM参考手册的注意事项:“FlexIO数据只在每个位的中间采样一次。可以使用另一个定时器对传入数据进行毛刺过滤”。保持FlexIO时钟与RM参考手册中的波特率的倍数相同。RM参考手册中的UART接收和UART发射配置表将所使用的每个FlexIO定时器的TIMCMP设置为0xF01。这意味着波特率是FlexIO时钟频率的1/4。FlexIO不支持奇偶校验位的自动验证。

使用了SDK中的Flexio_uart示例,并使用了flexio_uart驱动程序,只对这些频率/波特率进行了一些细微的更改。示例使用480MHz的PLL3作为FlexIO的时钟源。将FLEXIO2_CLK_PRED除法器设置为(4+1),将FLEXIO2_CLK_PODF除法器设为(3+1),从而提供 24MHz(480/5/4)的FlexIO时钟。对于驱动程序,将flexio_uart_config_t.baudRate_Bps设置为6000000。然后,驱动程序计算两个定时器的TIMCMP寄存器=0xF01。

ade78d46-9797-11ed-bfe3-dac502259ad0.png

它在IMXRT1060-EVKB板上运行,SDK v2.12.1,如下代码简单修改。SDK_2_12_1_MIMXRT1062xxxxBoardsevkbmimxrt1060driver_examplesflexiouartedma_transfer 此应用程序仅在引脚GPIO_B0_05上传输,RX设置在引脚GPIO_B0_06上。

IOMUXC_SetPinMux(IOMUXC_GPIO_B0_05_FLEXIO2_FLEXIO05, 0U);

IOMUXC_SetPinMux(IOMUXC_GPIO_B0_06_FLEXIO2_FLEXIO06, 0U);

IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_05_FLEXIO2_FLEXIO05, 0x10B0U);

IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_06_FLEXIO2_FLEXIO06, 0x10B0U);

#include "pin_mux.h"

#include "clock_config.h"

#include "board.h"

#include "fsl_flexio_uart_edma.h"

#include "fsl_dmamux.h"

#define BOARD_FLEXIO_BASE FLEXIO2

#define FLEXIO_UART_TX_PIN 5U

#define FLEXIO_UART_RX_PIN 6U

/* Select USB1 PLL (480 MHz) as flexio clock source */

#define FLEXIO_CLOCK_SELECT (3U)

/* Clock pre divider for flexio clock source */

#define FLEXIO_CLOCK_PRE_DIVIDER (4U)

/* Clock divider for flexio clock source */

#define FLEXIO_CLOCK_DIVIDER (3U)

#define FLEXIO_CLOCK_FREQUENCY

(CLOCK_GetFreq(kCLOCK_Usb1PllClk) / (FLEXIO_CLOCK_PRE_DIVIDER + 1U) / (FLEXIO_CLOCK_DIVIDER + 1U))

#define FLEXIO_DMA_REQUEST_BASE kDmaRequestMuxFlexIO2Request0Request1

#define EXAMPLE_FLEXIO_UART_DMAMUX_BASEADDR DMAMUX

#define EXAMPLE_FLEXIO_UART_DMA_BASEADDR DMA0

#define FLEXIO_UART_TX_DMA_CHANNEL 0U

#define FLEXIO_UART_RX_DMA_CHANNEL 1U

#define FLEXIO_TX_SHIFTER_INDEX 0U

#define FLEXIO_RX_SHIFTER_INDEX 2U

#define EXAMPLE_TX_DMA_SOURCE kDmaRequestMuxFlexIO2Request0Request1

#define EXAMPLE_RX_DMA_SOURCE kDmaRequestMuxFlexIO2Request2Request3

#define ECHO_BUFFER_LENGTH 8

void FLEXIO_UART_UserCallback(FLEXIO_UART_Type *base,

flexio_uart_edma_handle_t *handle,

status_t status,

void *userData);

flexio_uart_edma_handle_t g_uartHandle;

FLEXIO_UART_Type uartDev;

edma_handle_t g_uartTxEdmaHandle;

edma_handle_t g_uartRxEdmaHandle;

AT_NONCACHEABLE_SECTION_INIT(uint8_t g_tipString[]) =

"Flexio uart edma example Board receives 8 characters then sends them out Now please input: ";

AT_NONCACHEABLE_SECTION_INIT(uint8_t g_txBuffer[ECHO_BUFFER_LENGTH]) = {0};

AT_NONCACHEABLE_SECTION_INIT(uint8_t g_rxBuffer[ECHO_BUFFER_LENGTH]) = {0};

volatile bool rxBufferEmpty = true;

volatile bool txBufferFull = false;

volatile bool txOnGoing = false;

volatile bool rxOnGoing = false;

/* UART 用户回调函数*/

void FLEXIO_UART_UserCallback(FLEXIO_UART_Type *base,

flexio_uart_edma_handle_t *handle,

status_t status,

void *userData)

{

userData = userData;

if (kStatus_FLEXIO_UART_TxIdle == status)

{

txBufferFull = false;

txOnGoing = false;

}

if (kStatus_FLEXIO_UART_RxIdle == status)

{

rxBufferEmpty = false;

rxOnGoing = false;

}

}

int main(void)

{

flexio_uart_config_t userconfig;

flexio_uart_transfer_t xfer;

flexio_uart_transfer_t sendXfer;

status_t result = kStatus_Success;

edma_config_t config;

BOARD_ConfigMPU();

BOARD_InitPins();

BOARD_BootClockRUN();

/* Flexio 时钟设置*/

CLOCK_SetMux(kCLOCK_Flexio2Mux, FLEXIO_CLOCK_SELECT);

CLOCK_SetDiv(kCLOCK_Flexio2PreDiv, FLEXIO_CLOCK_PRE_DIVIDER);

CLOCK_SetDiv(kCLOCK_Flexio2Div, FLEXIO_CLOCK_DIVIDER);

/*

* config.enableUart = true;

* config.enableInDoze = false;

* config.enableInDebug = true;

* config.enableFastAccess = false;

* config.bitCountPerChar = kFLEXIO_UART_8BitsPerChar;

*/

FLEXIO_UART_GetDefaultConfig(&userconfig);

userconfig.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;

userconfig.enableUart = true;

uartDev.flexioBase = BOARD_FLEXIO_BASE;

uartDev.TxPinIndex = FLEXIO_UART_TX_PIN;

uartDev.RxPinIndex = FLEXIO_UART_RX_PIN;

uartDev.shifterIndex[0] = FLEXIO_TX_SHIFTER_INDEX;

uartDev.shifterIndex[1] = FLEXIO_RX_SHIFTER_INDEX;

uartDev.timerIndex[0] = 0U;

uartDev.timerIndex[1] = 1U;

result = FLEXIO_UART_Init(&uartDev, &userconfig, FLEXIO_CLOCK_FREQUENCY);

if (result != kStatus_Success)

{

return -1;

}

/*初始化 DMA*/

DMAMUX_Init(EXAMPLE_FLEXIO_UART_DMAMUX_BASEADDR);

EDMA_GetDefaultConfig(&config);

EDMA_Init(EXAMPLE_FLEXIO_UART_DMA_BASEADDR, &config);

/* 为 TX&RX 设置 DMA 通道*/

DMAMUX_SetSource(EXAMPLE_FLEXIO_UART_DMAMUX_BASEADDR, FLEXIO_UART_TX_DMA_CHANNEL, EXAMPLE_TX_DMA_SOURCE);

DMAMUX_SetSource(EXAMPLE_FLEXIO_UART_DMAMUX_BASEADDR, FLEXIO_UART_RX_DMA_CHANNEL, EXAMPLE_RX_DMA_SOURCE);

DMAMUX_EnableChannel(EXAMPLE_FLEXIO_UART_DMAMUX_BASEADDR, FLEXIO_UART_TX_DMA_CHANNEL);

DMAMUX_EnableChannel(EXAMPLE_FLEXIO_UART_DMAMUX_BASEADDR, FLEXIO_UART_RX_DMA_CHANNEL);

EDMA_CreateHandle(&g_uartTxEdmaHandle, EXAMPLE_FLEXIO_UART_DMA_BASEADDR, FLEXIO_UART_TX_DMA_CHANNEL);

EDMA_CreateHandle(&g_uartRxEdmaHandle, EXAMPLE_FLEXIO_UART_DMA_BASEADDR, FLEXIO_UART_RX_DMA_CHANNEL);

FLEXIO_UART_TransferCreateHandleEDMA(&uartDev, &g_uartHandle, FLEXIO_UART_UserCallback, NULL, &g_uartTxEdmaHandle,&g_uartRxEdmaHandle);

/* 发送g_tipString */

xfer.data = g_tipString;

xfer.dataSize = sizeof(g_tipString) - 1;

txOnGoing = true;

FLEXIO_UART_TransferSendEDMA(&uartDev, &g_uartHandle, &xfer);

/* 等待发送完成 */

while (txOnGoing)

{

}

/* 开始应答 */

sendXfer.data = g_txBuffer;

sendXfer.dataSize = ECHO_BUFFER_LENGTH;

while (1)

{

/* If TX is idle and g_txBuffer is full, start to send data. */

if ((!txOnGoing) && txBufferFull)

{

txOnGoing = true;

FLEXIO_UART_TransferSendEDMA(&uartDev, &g_uartHandle, &sendXfer);

}

/* 如果 g_txBuffer为空,加载 g_txBuffer */

if (!txBufferFull)

{

memcpy(g_txBuffer, "UUUUUUUU", ECHO_BUFFER_LENGTH);

txBufferFull = true;

}

}

}

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5390

    浏览量

    121888
  • 定时器
    +关注

    关注

    23

    文章

    3259

    浏览量

    115882
  • uart
    +关注

    关注

    22

    文章

    1245

    浏览量

    102143
  • 波特率
    +关注

    关注

    2

    文章

    309

    浏览量

    34436
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1050

    浏览量

    46656

原文标题:MIMXRT1060 FLEXIO UART 波特率

文章出处:【微信号:嵌入式 MCU,微信公众号:嵌入式 MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    can波特率计算

    can波特率其实并不难计算,这里给出了can波特率的简单计算,并给出了实例STM32的CAN波特率计算。讲解CAN波特率计算原理。
    发表于 12-14 17:02 1.3w次阅读
    can<b class='flag-5'>波特率</b>计算

    什么是串口波特率?串口波特率的分类及应用详解

    什么是串口波特率串口波特率是指串口通信系统中传输数据的速率。在UART串口通信中,数据以位(bit)的形式传输,波特率是指每秒钟传输的位数。在串口通信中,
    的头像 发表于 08-08 10:09 6337次阅读
    什么是串口<b class='flag-5'>波特率</b>?串口<b class='flag-5'>波特率</b>的分类及应用详解

    如何为单个uart配置不同的波特率

    自动检测输入波特率。D然后可以根据波特率来相应地起作用所以有人能告诉我如何为相同的UART组件配置不同的波特率吗?注:实际上,如果我设置单独的波特率
    发表于 10-31 10:00

    基于FPGA的波特率连续可调UART接口

    在FPGA上设计了一种波特率连续可调的UART接口,该接口符合RS-232C通信协议。将波特率转换为比特持续时间,在固定工作时钟频率下通过改变比特持续时间来实现波特率的连续可调,并将比
    发表于 06-01 09:56 10次下载

    根据SCI输入信号自动校准波特率

    作者:Terry Deng 本文档概述了一种基于 SCI/UART 输入信号,可以自动校准本设备SCI/UART波特率的方法,该方法适用与所有第三代C2000芯片,比如F2807x/37x
    的头像 发表于 01-12 13:56 2767次阅读
    根据SCI输入信号自动校准<b class='flag-5'>波特率</b>

    关于UART/CAN/PLL时钟计算波特率的方法

    SWM系列关于UART/CAN/PLL等时钟相关模块,计算波特率的方法。
    的头像 发表于 03-18 16:52 8211次阅读

    MIMXRT1060 FLEXIO SPI速率

    FlexIO 支持 1/2/4/8/16/32位并行传输,参考寄存器 SHIFTCFT[PWIDTH]进行设置。
    的头像 发表于 01-29 10:12 1586次阅读

    MIMXRT1060 EVK JTAG接口修改方法

    MIMXRT1060 EVK是NXP官方基于MIMXRT1062DVL6A芯片的开发板,该开发板带有板载的CMSIS-DAP的仿真器,也留出了可以外接外部仿真器的20脚JTAG口。芯片
    的头像 发表于 05-04 10:48 1453次阅读
    <b class='flag-5'>MIMXRT1060</b> EVK JTAG接口修改方法

    波特率是什么?波特率设计

    从宏观理解,波特率表征了串口的传输速度。
    的头像 发表于 06-05 15:19 2.8w次阅读
    <b class='flag-5'>波特率</b>是什么?<b class='flag-5'>波特率</b>设计

    什么是波特率?为什么要设置波特率

    欢迎来到东用知识小课堂!一、什么是波特率波特率(BaudRate)单位bps是用于衡量串口通信速度的单位,它表示每秒钟发送的比特数。如果一个串口的波特率为9600,就表示该串口在一秒钟内可以发送
    的头像 发表于 04-08 00:00 7343次阅读
    什么是<b class='flag-5'>波特率</b>?为什么要设置<b class='flag-5'>波特率</b>?

    什么是波特率波特率是如何影响CAN总线长度的?

    信息在通信通道中传输的速率被称为波特率。通俗地说,波特率是数据在网络上传输的速度/速率。这是以比特/秒表示的。因此,一秒钟内在通信网络上传输的比特数就是波特率
    的头像 发表于 08-14 15:23 6906次阅读
    什么是<b class='flag-5'>波特率</b>?<b class='flag-5'>波特率</b>是如何影响CAN总线长度的?

    CW32单片机UART波特率设置介绍

    CW32单片机UART波特率设置介绍
    的头像 发表于 10-24 17:35 1042次阅读
    CW32单片机<b class='flag-5'>UART</b><b class='flag-5'>波特率</b>设置介绍

    什么是串口波特率?串口通信为什么要设置波特率

    在电子设备的世界中,数据是通过各种方式进行传输的。其中,串口通信是一种常见的数据传输方式,它以其简单、可靠和广泛的特性,成为了电子设备间通信的重要手段。而在串口通信中,有一个非常重要的参数——波特率
    的头像 发表于 11-03 08:21 5860次阅读
    什么是串口<b class='flag-5'>波特率</b>?串口通信为什么要设置<b class='flag-5'>波特率</b>?

    uart波特率和传输频率的关系 UART串口的常用波特率为多少

    UART(Universal Asynchronous Receiver/Transmitter)是一种广泛使用的异步串行通信技术,它允许两台设备之间进行双向数据传输。在UART通信中,波特率和传输
    的头像 发表于 10-06 16:12 4501次阅读
    <b class='flag-5'>uart</b><b class='flag-5'>波特率</b>和传输频率的关系 <b class='flag-5'>UART</b>串口的常用<b class='flag-5'>波特率</b>为多少

    波特率的定义和计算方法 波特率与数据传输速度的关系

    波特率的定义 波特率(Baud Rate),又称调制速率或传符号,是指每秒传输的符号数目,单位为波特(Bd)。它是一个数字信号通信中重要的参数,在串行通信协议中经常被用作衡量串行数据
    的头像 发表于 11-22 09:49 5299次阅读