热度 16
2015-1-22 12:32
2216 次阅读|
0 个评论
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 )。