STM32F103C8T6的USART2接收中断 不要用hal库来写
时间: 2024-09-16 18:04:57 浏览: 49
STM32F103C8T6 HAL库 USART1加DMA方式传输数据,解决了串口会卡死的问题
STM32F103C8T6的USART2(通用同步异步收发器)是一个串行通信模块,用于全双工通信。要设置USART2接收中断,你需要直接操作其寄存器,这里我们将基于GPIO、USART控制器以及中断管理的基本原理来说明。
首先,你需要配置USART2的接收模式和数据长度。设置发送端口的工作模式为接收,波特率为你所需的速率,并且打开RXNE(接收就绪)中断:
```c
// 设置USART2为接收模式
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 启动USART2时钟
// 配置USART2的数据寄存器位宽
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = YOUR_BAUD_RATE; // 替换为实际的波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8位字长
USART_InitStructure.USART_StopBits = USART_StopBits_1; // 1位停止位
USART_InitStructure.USART_Parity = USART_Parity_No; // 无校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 自动重传
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE); // 开启USART2
// 配置USART2接收中断
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // 启用接收就绪中断
```
然后,你需要设置一个中断服务函数(ISR),当接收到数据时会被系统自动调用:
```c
void USART2_IRQHandler(void) {
if (USART_GetITStatus(USART2, USART_IT_RXNE)) { // 检查是否收到了新的数据
uint8_t receivedData = USART_ReceiveData(USART2); // 接收新数据
// 在这里处理接收到的数据...
}
}
```
最后,启用全局中断并注册USART2中断到你的应用程序的中断向量表:
```c
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; // 替换为你系统的中断号
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 优先级设为0(低)
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级设为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 打开中断
NVIC_Init(&NVIC_InitStructure);
enableGlobalInterrupt(); // 根据你的系统启用全局中断
```
阅读全文