-
OSR 最小值是 4,因此24Mhz時(shí)鐘模式下,LPUART最大波特率是 24/5 = 4.8Mbps,手冊(cè)中硬件的 LPUART最大的波特率是 80Mhz/4=20Mbps。80/13= 6.15Mbps波特率,這樣相對(duì)于 6Mhz就有 2.5%的誤差。
那如果用 FlexIO外設(shè)實(shí)現(xiàn) UART波特率可以達(dá)到 6Mbps么?
將FlexIO用于UART RX時(shí),RM參考手冊(cè)的注意事項(xiàng):“FlexIO數(shù)據(jù)只在每個(gè)位的中間采樣一次。可以使用另一個(gè)定時(shí)器對(duì)傳入數(shù)據(jù)進(jìn)行毛刺過(guò)濾”。保持FlexIO時(shí)鐘與RM參考手冊(cè)中的波特率的倍數(shù)相同。RM參考手冊(cè)中的UART接收和UART發(fā)射配置表將所使用的每個(gè)FlexIO定時(shí)器的TIMCMP設(shè)置為0xF01。這意味著波特率是FlexIO時(shí)鐘頻率的1/4。FlexIO不支持奇偶校驗(yàn)位的自動(dòng)驗(yàn)證。
使用了SDK中的Flexio_uart示例,并使用了flexio_uart驅(qū)動(dòng)程序,只對(duì)這些頻率/波特率進(jìn)行了一些細(xì)微的更改。示例使用480MHz的PLL3作為FlexIO的時(shí)鐘源。將FLEXIO2_CLK_PRED除法器設(shè)置為(4+1),將FLEXIO2_CLK_PODF除法器設(shè)為(3+1),從而提供 24MHz(480/5/4)的FlexIO時(shí)鐘。對(duì)于驅(qū)動(dòng)程序,將flexio_uart_config_t.baudRate_Bps設(shè)置為6000000。然后,驅(qū)動(dòng)程序計(jì)算兩個(gè)定時(shí)器的TIMCMP寄存器=0xF01。
它在IMXRT1060-EVKB板上運(yùn)行,SDK v2.12.1,如下代碼簡(jiǎn)單修改。SDK_2_12_1_MIMXRT1062xxxxBoardsevkbmimxrt1060driver_examplesflexiouartedma_transfer 此應(yīng)用程序僅在引腳GPIO_B0_05上傳輸,RX設(shè)置在引腳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 用戶回調(diào)函數(shù)*/
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 時(shí)鐘設(shè)置*/
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 設(shè)置 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);
/* 發(fā)送g_tipString */
xfer.data = g_tipString;
xfer.dataSize = sizeof(g_tipString) - 1;
txOnGoing = true;
FLEXIO_UART_TransferSendEDMA(&uartDev, &g_uartHandle, &xfer);
/* 等待發(fā)送完成 */
while (txOnGoing)
{
}
/* 開始應(yīng)答 */
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;
}
}
}
-
寄存器
+關(guān)注
關(guān)注
31文章
5421瀏覽量
123306 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3287瀏覽量
117197 -
uart
+關(guān)注
關(guān)注
22文章
1265瀏覽量
103228 -
波特率
+關(guān)注
關(guān)注
2文章
310瀏覽量
34722 -
SDK
+關(guān)注
關(guān)注
3文章
1065瀏覽量
47670
原文標(biāo)題:MIMXRT1060 FLEXIO UART 波特率
文章出處:【微信號(hào):嵌入式 MCU,微信公眾號(hào):嵌入式 MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
can波特率計(jì)算

什么是串口波特率?串口波特率的分類及應(yīng)用詳解

基于FPGA的波特率連續(xù)可調(diào)UART接口
根據(jù)SCI輸入信號(hào)自動(dòng)校準(zhǔn)波特率

關(guān)于UART/CAN/PLL時(shí)鐘計(jì)算波特率的方法
串口通訊波特率出現(xiàn)誤差的因素
MIMXRT1060 FLEXIO SPI速率
MIMXRT1060 EVK JTAG接口修改方法

什么是波特率?為什么要設(shè)置波特率?

什么是波特率?波特率是如何影響CAN總線長(zhǎng)度的?

什么是串口波特率?串口通信為什么要設(shè)置波特率?

uart波特率和傳輸頻率的關(guān)系 UART串口的常用波特率為多少

評(píng)論