资讯动态

串口中断整理

发布时间:2026/9/28 20:33:10 来源:尧图企业网站定制
void USART1_IRQHandler(void) { unsigned char USART1_GetChar; unsigned char i; volatile uint32_t temp; if (USART_GetITStatus(USART1, USART_IT_IDLE) SET) { IDLE_FLAGE 1; IDLE_COUNT; //USART_ClearITPendingBit(USART1, USART_IT_IDLE);//不能使用这个函数清除空闲中断,清除不了 // 第一步读取SR寄存器 temp USART1-SR; // 第二步读取DR寄存器 temp USART1-DR; } if (USART_GetITStatus(USART1, USART_IT_RXNE) SET) // 串口接收数据触发中断 { // USART_ClearITPendingBit(USART1, USART_IT_RXNE); // 清空接收中断标志此行代码不需要因为在执行USART_ReceiveData(USART1)这一函数时会由硬件自动清除RXNE 中断挂起标志位 USART1_GetChar USART_ReceiveData(USART1); if (USART1_GetChar 0xA) // 接收到LF结束符(\n) { } else if (USART1_GetChar 0xD) // 接收到CR结束符(\r) { if (USARTStructure1.RX_TMEP_Len 2) { for (i 0; i USARTStructure1.RX_TMEP_Len; i) { USARTStructure1.RX_BUFF[i] USARTStructure1.RX_TEMP_BUFF[i]; } USARTStructure1.RX_BUFF[i] \0; USARTStructure1.RX_Len USARTStructure1.RX_TMEP_Len; USARTStructure1.RX_TMEP_Len 0; USARTStructure1.RX_Flag 1; } else { USARTStructure1.RX_BUFF[0] \0; USARTStructure1.RX_Len 0; USARTStructure1.RX_TMEP_Len 0; USARTStructure1.RX_Flag 0; } } else { USARTStructure1.RX_TEMP_BUFF[USARTStructure1.RX_TMEP_Len] USART1_GetChar; USARTStructure1.RX_TMEP_Len; } // 清当前计数 } else if (USART_GetITStatus(USART1, USART_IT_TC) SET) // USART_IT_TC:发送完成中断,(代码不起作用因为未使能相关中断) { // printf(hello world\r\n) // 发送过程h → e → l → l → o → → w → o → r → l → d → \r → \n // ↑ // TC中断在这里触发! \n的停止位从TX引脚完全发出 → TC标志置1 → 触发TC中断 USART_ClearITPendingBit(USART1, USART_IT_TC); // TC置1后必须手动清除不会因为连续发生自动清零 } else if (USART_GetITStatus(USART1, USART_IT_ORE) SET) // 检测是否有接收溢出(代码不起作用因为未使能相关中断) { //USART_GetFlagStatus USART_ReceiveData(USART1); // 清接收溢出标志只能用读数据的方式来清溢出标志 } else if (USART_GetITStatus(USART1, USART_IT_TXE) SET) // 串口发送数据触发中断,(代码不起作用因为未使能相关中断) { } else { } /* 结论:不推荐在串口中断使用USART_GetFlagStatus() USART_GetFlagStatus() 轮询模式下使用 USART_GetITStatus() 中断下使用 上面两个函数的差异 1.如果在中断中使用USART_GetITStatus()就必须使能相应的中断类型如USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); 如果未使能USART_IT_RXNE中断即使中断程序中有相关程序也不起作用。 2.如果在中断中使用USART_GetFlagStatus()即使不使能相关中断也能使用这可能会对其他类型的中断产生影响 调试中发现的现象: 1.USART_ClearITPendingBit(USART1, USART_IT_IDLE);不能使用这个函数清除空闲中断 2.中断中使用USART_GetFlagStatus() 用USART_GetFlagStatus判断时发现空闲中断即使不清除标志位也能正常运行 else if (USART_GetFlagStatus(USART1, USART_IT_ORE) SET) // 检测是否有接收溢出即使不开启相关中断也会起作用 { USART_ClearFlag(USART1, USART_FLAG_ORE); USART_ReceiveData(USART1); // 清接收溢出标志只能用读数据的方式来清溢出标志, 这个清除方式对空闲中断标志也产生了影响所以空闲中断即使不清除也正常运行 } */ } /* */ /* 标志 全称 触发条件 核心含义 适用场景 /* TXE 发送寄存器空 数据转入移位寄存器 缓存空可发下一字节 连续发送字符串、数组 /* TC 发送完成 引脚全部 bit 发送完毕 整帧发完总线空闲 发送最后 1 个字节后、休眠、切换总线模式 /* *//* */ /* | 标志位 | 寄存器位 | 所属寄存器 | 具体意义和说明 | */ /* | USART_IT_TXE | TXE | SR(状态寄存器) | 发送数据寄存器空标志。0:数据未传输到移位寄存器1:数据已传输TDR可写入新数据 | */ /* | USART_IT_TC | TC | SR(状态寄存器) | 发送完成标志。0:发送未完成1:发送完成包括停止位 | */ /* | USART_IT_RXNE| RXNE| SR(状态寄存器) | 接收数据寄存器非空。0:未收到数据1:收到数据可读取 | */ /* | USART_IT_ORE | ORE | SR(状态寄存器) | 溢出错误。0:无溢出1:检测到溢出RDR已有数据时新数据到来 | */ /* | USART_IT_FE | FE | SR(状态寄存器) | 帧错误。0:无帧错误1:检测到帧错误停止位为0 | */ /* | USART_IT_PE | PE | SR(状态寄存器) | 奇偶校验错误。0:无校验错误1:校验错误 | */ /* | USART_IT_IDLE| IDLE| SR(状态寄存器) | 线路空闲检测。0:无空闲1:检测到线路空闲接收线为高电平超1帧时间| */ /* | USART_IT_NE | NE | SR(状态寄存器) | 噪声错误标志。0:无噪声1:在帧起始/停止位检测到噪声 | */ /* | USART_IT_CTS | CTS | SR(状态寄存器) | CTS状态变化标志。0:无变化1:CTS引脚状态发生变化 | */ /* | USART_IT_LBD | LBD | SR(状态寄存器) | LIN断开检测标志。0:无断开1:检测到LIN总线断开 | */ /* */ /* */ /* | 中断使能位 | 所属寄存器 | 具体意义和说明 | */ /* | TXEIE | CR1(控制1) | 发送缓冲区空中断使能。0:禁止中断1:允许TXE中断 | */ /* | TCIE | CR1(控制1) | 发送完成中断使能。0:禁止中断1:允许TC中断 | */ /* | RXNEIE | CR1(控制1) | 接收中断使能。0:禁止中断1:允许RXNE中断 | */ /* | PEIE | CR1(控制1) | 奇偶错误中断使能。0:禁止中断1:允许PE中断 | */ /* | IDLEIE | CR1(控制1) | 空闲线路中断使能。0:禁止中断1:允许IDLE中断 | */ /* */ /* */ /* | 相关寄存器 | 地址偏移 | 主要功能 | */ /* | SR | 0x00 | 状态寄存器包含所有状态标志位 | */ /* | DR | 0x04 | 数据寄存器用于发送/接收数据 | */ /* | BRR | 0x08 | 波特率寄存器设置通信波特率 | */ /* | CR1 | 0x0C | 控制寄存器1包含中断使能、字长、奇偶控制等 | */ /* | CR2 | 0x10 | 控制寄存器2包含停止位、LIN模式、时钟控制等 | */ /* | CR3 | 0x14 | 控制寄存器3包含DMA使能、硬件流控制等 | */ /* */ /* */ /* | 特殊说明 | 详细描述 | */ /* | TXE标志 | 写入DR后自动清零当数据从TDR转移到移位寄存器时自动置1 | */ /* | TC标志 | 发送移位寄存器为空且TXE1时置1读SR后写DR或直接写TC0清除 | */ /* | RXNE标志 | 接收数据从移位寄存器转移到RDR时置1读DR后自动清零 | */ /* | ORE标志 | RXNE1时新数据到来置1读SR后读DR清除 | */ /* | IDLE标志 | 检测到空闲线路置1读SR后读DR清除 | */ /* | CTS标志 | CTS输入变化时置1向CTS位写0清除 | */ /* | LBD标志 | 检测到LIN断开时置1向LBD位写0清除 | */ /* */

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑