-
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多少容量
阿牛巴流量计测量不准的原因
深度解析展示面是什么,大神教你拍摄最强展示面素材的干货!