FM33lc026n使用空闲中断+DMA实现数据接收代码
时间: 2024-05-12 16:15:29 浏览: 158
以下是FM33lc026n使用空闲中断+DMA实现数据接收的代码示例:
```c
#include "fm33lc0xx_fl_dma.h"
#include "fm33lc0xx_fl_uart.h"
#define BUFFER_SIZE 256
uint8_t rx_buffer[BUFFER_SIZE];
uint16_t rx_counter = 0;
void uart_idle_irq_handler(void)
{
if (FL_UART_IsRXFIFOEmpty(COM_UART))
{
return;
}
// 读取 UART 接收数据
uint8_t data = FL_UART_ReceiveData8(COM_UART);
rx_buffer[rx_counter++] = data;
// 重置计数器
if (rx_counter == BUFFER_SIZE)
{
rx_counter = 0;
}
}
void dma_irq_handler(void)
{
// 清除 DMA 中断标志位
FL_DMA_ClearFlag_TransferComplete(DMA_CH1);
// 复位 DMA 传输计数器
FL_DMA_SetTransferCounter(DMA_CH1, BUFFER_SIZE);
// 启动 DMA 传输
FL_DMA_EnableChannel(DMA_CH1);
}
int main(void)
{
// 初始化 UART
FL_UART_InitTypeDef uart_init_struct;
uart_init_struct.BaudRate = 115200;
uart_init_struct.DataWidth = FL_UART_DATA_WIDTH_8B;
uart_init_struct.StopBits = FL_UART_STOP_BIT_1;
uart_init_struct.Parity = FL_UART_PARITY_NONE;
uart_init_struct.Mode = FL_UART_MODE_RX;
FL_UART_Init(COM_UART, &uart_init_struct);
// 初始化 DMA
FL_DMA_InitTypeDef dma_init_struct;
dma_init_struct.Channel = DMA_CH1;
dma_init_struct.Direction = FL_DMA_DIR_P2M;
dma_init_struct.PeriphAddress = (uint32_t)&(COM_UART->DR);
dma_init_struct.MemoryAddress = (uint32_t)rx_buffer;
dma_init_struct.DataWidth = FL_DMA_DATA_WIDTH_BYTE;
dma_init_struct.TransferCount = BUFFER_SIZE;
dma_init_struct.IncPeriphAddr = FL_DMA_PERIPH_ADDR_NO_CHANGE;
dma_init_struct.IncMemAddr = FL_DMA_MEM_ADDR_INCREMENT;
dma_init_struct.Mode = FL_DMA_MODE_NORMAL;
dma_init_struct.Priority = FL_DMA_PRIORITY_HIGH;
FL_DMA_Init(&dma_init_struct);
// 配置空闲中断
FL_UART_ClearFlag_IDLE(COM_UART);
FL_UART_EnableIT_IDLE(COM_UART);
NVIC_EnableIRQ(UART0_IRQn); // 修改为实际使用的 UART 中断号
// 配置 DMA 中断
FL_DMA_EnableIT_TransferComplete(DMA_CH1);
NVIC_EnableIRQ(DMA1_Channel1_IRQn); // 修改为实际使用的 DMA 中断号
// 启动 DMA 传输
FL_DMA_EnableChannel(DMA_CH1);
while (1)
{
// do something
}
return 0;
}
```
在上述代码中,通过使用空闲中断和 DMA,实现了对 UART 数据的接收。当 UART 接收到数据后,空闲中断被触发,然后将数据存储到缓冲区中。当 DMA 传输完成时,DMA 中断被触发,然后再次启动 DMA 传输。需要注意的是,此处仅为示例代码,实际使用时需要根据具体应用进行相应的修改。
阅读全文