stm32 uart fifo 接收例程 标准库
时间: 2023-08-05 20:09:10 浏览: 201
以下是使用STM32标准库实现UART接收FIFO缓存的一个例程,供参考:
首先,需要定义一个缓存数组和指针变量:
```
#define RX_BUF_SIZE 64
uint8_t rx_buf[RX_BUF_SIZE];
volatile uint16_t rx_rd_pos = 0;
volatile uint16_t rx_wr_pos = 0;
```
接下来,需要在UART的中断处理函数中实现数据的接收和存储:
```
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
rx_buf[rx_wr_pos++] = USART_ReceiveData(USART1);
if (rx_wr_pos >= RX_BUF_SIZE)
rx_wr_pos = 0;
if (rx_wr_pos == rx_rd_pos)
rx_rd_pos++;
}
}
```
在上述代码中,当UART接收到数据后,中断处理函数将数据存储到缓存数组中,并更新指针变量。如果缓存数组已满,则指针变量绕回到数组的开头,以实现FIFO缓存的效果。同时,如果缓存数组已满,则不再接收新的数据,避免数据溢出。
最后,需要添加一些辅助函数来实现数据的读取和清空:
```
uint16_t uart_available()
{
if (rx_rd_pos <= rx_wr_pos)
return rx_wr_pos - rx_rd_pos;
else
return RX_BUF_SIZE - rx_rd_pos + rx_wr_pos;
}
uint8_t uart_read()
{
if (rx_rd_pos == rx_wr_pos)
return 0;
uint8_t data = rx_buf[rx_rd_pos++];
if (rx_rd_pos >= RX_BUF_SIZE)
rx_rd_pos = 0;
return data;
}
void uart_flush()
{
rx_rd_pos = rx_wr_pos = 0;
}
```
在上述代码中,uart_available()函数用于返回当前缓存中可用的数据长度;uart_read()函数用于读取缓存中的一个字节数据,并移动指针变量;uart_flush()函数用于清空缓存中的所有数据。
以上就是一个简单的使用STM32标准库实现UART接收FIFO缓存的例程。需要注意的是,在使用中断来实现FIFO缓存时,需要开启相应的中断和DMA。同时,需要根据实际情况来调整缓存大小和中断处理函数的优先级等参数。
阅读全文