FM33lc026n使用空闲中断+DMA实现数据接收代码
时间: 2024-05-13 12:20:02 浏览: 8
以下是使用空闲中断+DMA实现数据接收的示例代码:
```c
#include "fm33lc0xx_fl_dma.h"
#include "fm33lc0xx_fl_uart.h"
#include "fm33lc0xx_fl_rcc.h"
#include "fm33lc0xx_fl_exti.h"
#define UART_RX_BUF_SIZE 256
uint8_t rx_buf[UART_RX_BUF_SIZE];
volatile uint16_t rx_index = 0;
FL_DMA_InitTypeDef dma_init_struct;
FL_UART_InitTypeDef uart_init_struct;
FL_EXTI_InitTypeDef exti_init_struct;
void uart_rx_dma_init(void)
{
/* 使能DMA和UART时钟 */
FL_RCC_EnableGroup1BusClock(FL_RCC_GROUP1_BUSCLK_DMA);
FL_RCC_EnableGroup1BusClock(FL_RCC_GROUP1_BUSCLK_UART);
/* 配置UART */
FL_UART_StructInit(&uart_init_struct);
uart_init_struct.UART_BaudRate = 115200;
uart_init_struct.UART_WordLength = FL_UART_DATAWIDTH_8B;
uart_init_struct.UART_StopBits = FL_UART_STOPBITS_1;
uart_init_struct.UART_Parity = FL_UART_PARITY_NONE;
uart_init_struct.UART_HardwareFlowControl = FL_UART_FLOWCTRL_NONE;
uart_init_struct.UART_Mode = FL_UART_MODE_RX;
FL_UART_Init(UART, &uart_init_struct);
/* 配置DMA */
dma_init_struct.DMA_Channel = FL_DMA_CHANNEL_0;
dma_init_struct.DMA_PeripheralBaseAddr = (uint32_t)&UART->RBR;
dma_init_struct.DMA_MemoryBaseAddr = (uint32_t)rx_buf;
dma_init_struct.DMA_DIR = FL_DMA_DIR_PERIPHERAL_TO_MEMORY;
dma_init_struct.DMA_BufferSize = UART_RX_BUF_SIZE;
dma_init_struct.DMA_PeripheralInc = FL_DMA_PERIPHERAL_INC_DISABLE;
dma_init_struct.DMA_MemoryInc = FL_DMA_MEMORY_INC_ENABLE;
dma_init_struct.DMA_PeripheralDataSize = FL_DMA_PDATAWIDTH_BYTE;
dma_init_struct.DMA_MemoryDataSize = FL_DMA_MDATAWIDTH_BYTE;
dma_init_struct.DMA_Mode = FL_DMA_MODE_CIRCULAR;
dma_init_struct.DMA_Priority = FL_DMA_PRIORITY_HIGH;
FL_DMA_Init(&dma_init_struct);
/* 配置空闲中断 */
exti_init_struct.EXTI_Line = FL_EXTI_LINE_UART_RI;
exti_init_struct.EXTI_Trigger = FL_EXTI_TRIGGER_FALLING;
exti_init_struct.EXTI_LineCmd = ENABLE;
FL_EXTI_Init(&exti_init_struct);
FL_EXTI_EnableIT_FL_EXTI_LINE_UART_RI();
FL_IRQ_EnableIRQ_UART_RI();
/* 启动DMA */
FL_DMA_EnableChannel(FL_DMA_CHANNEL_0);
}
void UART_RI_IRQHandler(void)
{
/* 清除中断标志 */
FL_UART_ClearFlag_RXNE(UART);
FL_EXTI_ClearFlag_FL_EXTI_LINE_UART_RI();
/* 禁用DMA */
FL_DMA_DisableChannel(FL_DMA_CHANNEL_0);
/* 处理接收到的数据 */
rx_index = UART_RX_BUF_SIZE - FL_DMA_GetCurrDataCounter(FL_DMA_CHANNEL_0);
if (rx_index > 0) {
// do something with rx_buf
}
/* 重新启动DMA */
FL_DMA_EnableChannel(FL_DMA_CHANNEL_0);
}
```
在上面的代码中,首先需要初始化UART和DMA,并启动DMA传输。当接收到数据时,空闲中断会触发,此时需要禁用DMA,处理接收到的数据,并重新启动DMA传输。注意,空闲中断和DMA都要在初始化时启用并配置相应的参数。