EFM32的DMA的DMA回调的使用。
当我们需要从串口接收大量的数据时,
1)如果我们接收的数据具有固定的帧格式,则可以把LEUART配置成特殊帧触发中断的方式。当收到某个具体的帧后,触发中断,程序可以在LEUART中断中对数据进行分析。
设置成:
Void LEUART_Init(void)
{
LEUART_Init_TypeDef tLeuartInit =
{
.enable = leuartEnable,
.refFreq = 0,
.baudrate = 115200,
.databits = leuartDatabits8,
.parity = leuartNoParity,
.stopbits = leuartStopbits1
};
CMU_ClockSelectSet(cmuClock_LFB, cmuSelect_CORELEDIV2);//用内核时钟的一半
CMU_ClockEnable(cmuClock_CORELE,true);
CMU_ClockEnable(cmuClock_LEUART0,true);
CMU_ClockEnable(cmuClock_GPIO,true);
LEUART_Reset(LEUART0);
LEUART_Init(LEUART0, &tLeuartInit);
LEUART0->ROUTE = LEUART_ROUTE_TXPEN |
LEUART_ROUTE_RXPEN |
LEUART_ROUTE_LOCATION_LOC4;
GPIO_PinModeSet(BLE_TX_PORT,BLE_TX_PIN, gpioModePushPull, 1);
GPIO_PinModeSet(BLE_RX_PORT,BLE_RX_PIN, gpioModeInputPull, 1);
LEUART0->STARTFRAME = UART_DATA_START;
LEUART0->SIGFRAME = UART_DATA_STOP;
LEUART_IntEnable(LEUART0, LEUART_IEN_SIGF); // only the stop char int
NVIC_SetPriority(LEUART0_IRQn, LEUART0_INT_LEVEL);
NVIC_EnableIRQ(LEUART0_IRQn);
}
2)如果预知每次从串口来多少数据的话,则可以把串口配置成缓存区溢出中断,则当溢出时触发中断,在中断里对缓存区中的数据进行处理。
Void LEUART_Init(void)
{
LEUART_Init_TypeDef tLeuartInit =
{
.enable = leuartEnable,
.refFreq = 0,
.baudrate = 115200,
.databits = leuartDatabits8,
.parity = leuartNoParity,
.stopbits = leuartStopbits1
};
CMU_ClockSelectSet(cmuClock_LFB, cmuSelect_CORELEDIV2);//用内核时钟的一半
CMU_ClockEnable(cmuClock_CORELE,true);
CMU_ClockEnable(cmuClock_LEUART0,true);
CMU_ClockEnable(cmuClock_GPIO,true);
LEUART_Reset(LEUART0);
LEUART_Init(LEUART0, &tLeuartInit);
LEUART0->ROUTE = LEUART_ROUTE_TXPEN |
LEUART_ROUTE_RXPEN |
LEUART_ROUTE_LOCATION_LOC4;
GPIO_PinModeSet(BLE_TX_PORT,BLE_TX_PIN, gpioModePushPull, 1);
GPIO_PinModeSet(BLE_RX_PORT,BLE_RX_PIN, gpioModeInputPull, 1);
LEUART_IntEnable(LEUART0, LEUART_IEN_RXOF); // 缓存溢出时产生中断。
NVIC_SetPriority(LEUART0_IRQn, LEUART0_INT_LEVEL);
NVIC_EnableIRQ(LEUART0_IRQn);
}
还需要对DMA 进行初始化,然后配置成
DMA_ActivateBasic(DMA_CH_RX, /* Activate channel selected */
true, /* Use primary descriptor */
false, /* No DMA burst */
(void *)LEUARTRXBUFF, /* Destination address */
(void *) &LEUART0->RXDATA, /* Source address*/
RX_BUF_SIZE-1); /* Size of buffer minus1 */
这里需要配置DMA接收数据长度,要和实际想要接收的字节长度一致,这样当接收满了就会产生LEUART中断。(这种方式不好),例如到接收到RX_BUF_SIZE个字节就会产生溢出中断(针对efm32mcu)。
文章评论(0条评论)
登录后参与讨论