原创 efm32的leuart和dma的使用-1

2015-1-22 12:32 2198 16 16 分类: MCU/ 嵌入式

EFM32DMADMA回调的使用。

当我们需要从串口接收大量的数据时,

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条评论)

登录后参与讨论
我要评论
0
16
关闭 站长推荐上一条 /2 下一条