stm32G0 usart3 hal数据位9 中断接收例子
时间: 2024-04-30 14:22:42 浏览: 90
STM32串口中断接收(HAL库)
下面是一个使用HAL库的STM32G0的USART3串口数据位为9位的中断接收例子:
```c
#include "stm32g0xx_hal.h"
// 定义USART3句柄
UART_HandleTypeDef huart3;
// 定义接收缓冲区和缓冲区指针
uint16_t usart3_rx_buffer[100];
uint8_t *rx_ptr;
// USART3中断处理函数
void USART3_IRQHandler(void)
{
// 判断中断来源是否为接收中断
if(__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE))
{
// 读取接收数据寄存器
uint16_t rx_data = (uint16_t)(huart3.Instance->RDR & (uint16_t)0x01FF);
// 将数据存入接收缓冲区
*rx_ptr++ = rx_data;
// 判断缓冲区是否已满
if(rx_ptr >= &usart3_rx_buffer[100])
{
// 缓冲区已满,重置缓冲区指针
rx_ptr = usart3_rx_buffer;
}
}
}
int main(void)
{
// 初始化HAL库
HAL_Init();
// 配置USART3
huart3.Instance = USART3;
huart3.Init.BaudRate = 9600;
huart3.Init.WordLength = UART_WORDLENGTH_9B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_EVEN;
huart3.Init.Mode = UART_MODE_RX_INTERRUPT;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart3);
// 使能USART3中断
HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART3_IRQn);
// 启动USART3接收
HAL_UART_Receive_IT(&huart3, (uint8_t *)usart3_rx_buffer, 1);
while (1)
{
// 处理接收缓冲区中的数据
// ...
}
}
```
在上述代码中,我们首先定义了一个接收缓冲区和缓冲区指针,然后在`main`函数中配置了USART3的参数,并使能了中断。在USART3中断处理函数中,我们读取接收数据寄存器的数据,并将其存入接收缓冲区中。最后,在`main`函数中启动了USART3接收,并在主循环中处理接收缓冲区中的数据。
注意,在使用9位数据位时,需要使用`uint16_t`类型来存储接收数据。此外,需要将`HAL_UART_Receive_IT`函数的第二个参数指定为`usart3_rx_buffer`的地址,因为该函数会将每个接收的字节存储在一个`uint8_t`类型的变量中,而在此处我们需要使用`uint16_t`类型的变量。
阅读全文