stm32 G4 串口中断
时间: 2025-01-07 14:07:58 浏览: 17
### STM32 G4 串口中断实现
#### 中断初始化设置
为了使能并处理STM32 G4系列微控制器上的UART/USART中断,需先通过标准外设库或HAL库配置好相应的参数。这通常涉及开启特定端口的时钟、设定波特率、字长以及校验位等属性,并注册回调函数来响应接收到的数据。
```c
// 初始化结构体定义
static void MX_USARTx_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600; // 设置波特率为9600bps
huart1.Init.WordLength = UART_WORDLENGTH_8B; // 字符长度为8位
huart1.Init.StopBits = UART_STOPBITS_1; // 停止位数为1
huart1.Init.Parity = UART_PARITY_NONE; // 不使用奇偶校验
huart1.Init.Mode = UART_MODE_TX_RX; // 启用发送和接收模式
HAL_UART_Init(&huart1); // 调用API完成硬件资源分配及寄存器写入操作
}
```
当上述初始化完成后,还需要进一步激活所需的中断源,比如RXNE(读取非空中断),以便能够在接收到新字符时触发ISR(Interrupt Service Routine)。此过程可通过调用`__HAL_UART_ENABLE_IT()`宏命令轻松达成[^1]。
#### 接收缓冲区管理
对于实际应用而言,在每次进入中断服务程序之前应当检查状态标志以确认确实发生了预期事件。针对串行通信中的数据接收情况来说,可以利用变量如`USART_RX_STA`跟踪当前消息的状态;一旦检测到该标记内的最高有效位被置高,则意味着一帧完整的报文已被捕获完毕[^3]。
```c
void USARTx_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET){
uint8_t ch = (uint8_t)(huart1.Instance->DR & (uint8_t)0xFF);
if ((USART_RX_STA&0x8000)==0){ // 如果还没有结束
if(ch=='\n'){ // 判断是否遇到回车键
USART_RX_STA|=0x8000; // 结束标志位置1
}else{ // 继续累加计算已接受的有效字节数目
USART_RX_BUF[USART_RX_STA&0X7FFF]=ch;
USART_RX_STA++;
}
}
__HAL_UART_CLEAR_IDLEFLAG(&huart1);// 清除IDLE线空闲中断标志位
}
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
```
这里展示了一个简化版的例子,其中包含了对接收到的新字符进行判断的过程:如果发现换行符(`'\n'`)则认为一次传输结束并将相应的位置上;否则就继续存储传入的信息直到满足条件为止[^2]。
阅读全文