当前位置: 首页 > news >正文

串口中断整理

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标志 | 发送移位寄存器为空且TXE=1时置1,读SR后写DR或直接写TC=0清除 | */ /* | RXNE标志 | 接收数据从移位寄存器转移到RDR时置1,读DR后自动清零 | */ /* | ORE标志 | RXNE=1时新数据到来置1,读SR后读DR清除 | */ /* | IDLE标志 | 检测到空闲线路置1,读SR后读DR清除 | */ /* | CTS标志 | CTS输入变化时置1,向CTS位写0清除 | */ /* | LBD标志 | 检测到LIN断开时置1,向LBD位写0清除 | */ /* =============================================================================== */
http://www.cnnetsun.cn/news/2138555.html

相关文章:

  • ESP32双天线开发板解析与物联网应用实践
  • LLaMA-Factory多轮对话训练详解(SFT流程拆解)-实战落地指南
  • SIT芯力特 SIT3490EESA SOP8 RS-485/RS-422芯片
  • TVA在集成电路芯片设计中的应用:以华为海思、紫光展锐为例(十六)
  • TVA在集成电路芯片设计中的应用:以华为海思、紫光展锐为例(十七)
  • 2025届毕业生推荐的十大AI写作网站实测分析
  • 别再手动标号了!用C#给SolidWorks工程图批量添加BOM球标(附完整源码)
  • ORB-SLAM3实战:如何用OpenCV轻松处理本地视频流并实时SLAM(CMake配置指南)
  • 【深度解析】Memo 2.5 Pro:面向长程 Agent 工作流的 MoE 大模型架构与实战接入
  • GetQzonehistory:你的QQ空间时光机,一键备份十年青春记忆
  • OpCore Simplify:智能配置黑苹果的终极指南,一键生成OpenCore EFI
  • YOLOv13实战入门:快速上手图片和视频中的物体识别
  • 告别PRM的平滑烦恼:用Drake中的GCS框架搞定带动力学约束的机器人轨迹规划
  • 移动设备与云计算能效优化技术解析
  • 进程和线程的区别和联系
  • 多线程同步并行查询-CompletableFuture完整落地方案
  • 3 分钟让网页“活”过来(底层+手写+AI提示词)
  • 【Unity 实用工具篇】 | Unity切割插件 Ezy-Slice
  • 37岁程序员转行大模型:挑战与机遇并存,你需要知道的关键策略
  • 3分钟搞定Dell G15散热控制:开源神器Thermal Control Center完全指南
  • 从零构建全栈AI对话应用:架构设计、核心模块与部署实践
  • 为AI Agent构建长期记忆:Orca Memory架构解析与集成实践
  • 我用 AI Agent 掀翻公司协作旧模式,从售后到研发,效率直接翻倍|技术老兵复盘
  • 对于docker相关的理解
  • 5分钟免费解锁PotPlayer实时字幕翻译:让外语视频秒变中文的终极教程
  • 量子优化新突破:约束感知QAOA与汉明权重算子
  • ColabFold蛋白质结构预测实战:从环境配置到性能调优的完整指南
  • LayerDivider:用AI智能分层技术,5分钟将插画变可编辑PSD图层
  • K8s调度策略实战:如何用Binpack和Spread优化你的集群资源利用率
  • 2026 年产品经理必备语音转文字工具:6 款产品需求沟通场景深度评测