MIMXRT1060 FLEXIO UART波特率

-
    osr 最小值是 4,因此24mhz时钟模式下,lpuart最大波特率是 24/5 = 4.8mbps,手册中硬件的 lpuart最大的波特率是 80mhz/4=20mbps。80/13= 6.15mbps波特率,这样相对于 6mhz就有 2.5%的误差。
那如果用 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。
它在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;
        }
    }
}


电磁离合器说明书-STEKI堂奕
什么是二极管的反向恢复时间
西门子2019工业网络专家计划生态系统的大型会议方案发展路径
低功耗设计单元汇总
中国正在成为全球太阳能产业中心
MIMXRT1060 FLEXIO UART波特率
5G与AI联手将创造3.9万亿美元价值
电路板上一般什么胶水_电路板封胶用什么胶
2019年欧洲电动汽车投资额达600亿欧元,今明两年市场将迎来爆点
物联网给我们的生活带来了哪些实质性改变?
基于MAX232实现PC机与CPU通信
Digi-Key 庆祝产品配送中心扩建工程开业剪彩
品牌厂有意将UVC LED纳入规格 未来有望成为家电标准配备
苹果发布全新 iWork 办公三件套:精致新设计,针对 macOS Big Sur
台积电7nm已完成 只等流片让高通考量派单
人工智能和深度学习分析已经成为实体安防行业的必然选择
将振动精确与特定声音匹配的加速度传感器
电容822j多少容量
阿牛巴流量计测量不准的原因
深度解析展示面是什么,大神教你拍摄最强展示面素材的干货!