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

网站开发售后工作代理记账 营销型网站

网站开发售后工作,代理记账 营销型网站,中山技术支持中山网站建设,上海韵茵网站建设STM32 GPIO读取某一位时#xff0c;为什么判断总是失败#xff1f; 在 STM32 的嵌入式开发中#xff0c;很多初学者都遇到过这样的现象#xff1a; 明明某个 GPIO 引脚是高电平#xff0c;我却判断它是否等于 1#xff0c;结果却不成立。 比如 I2C 软件模拟通信中#…STM32 GPIO读取某一位时为什么判断总是失败 在 STM32 的嵌入式开发中很多初学者都遇到过这样的现象 明明某个 GPIO 引脚是高电平我却判断它是否等于 1结果却不成立。 比如 I2C 软件模拟通信中经常用宏读取 SDA 数据线电平 #define IIC_SDA_R (GPIOB-IDR (17))然后判断 if(IIC_SDA_R 1)结果却发现程序逻辑根本不对判断永远失败。但如果改成 if(IIC_SDA_R ! 0) 就成功了。很多人可能就此跳过实际上这背后藏着非常关键的位操作逻辑。 本文就将通过详细理论实际代码演示结论总结彻底解释这个问题并引申出 GPIO 输入读取时的标准写法。 一、错误示例分析你以为你在判断“高电平”实际上不是 先来看这一段典型的代码 #define IIC_SDA_R (GPIOB-IDR (17)) // 读取 PB7 的电平if(IIC_SDA_R 1) {// 高电平逻辑 }这段代码从表面上看没毛病但运行时你会发现 明明引脚为高电平IIC_SDA_R 1 却不成立如果你改为 if(IIC_SDA_R ! 0) 就又能正常识别高电平了。 很多初学者被这个现象搞懵原因其实非常简单 宏返回值并不是你想象的“0 或 1” 表达式 (GPIOB-IDR (17)) 实际返回的是 当 PB7 为低电平时返回值为 0当 PB7 为高电平时返回值为 128也就是 0x80。 因此 IIC_SDA_R 1 判断根本不可能为真因为它实际是 if(128 1) // 永远不成立正确的理解它返回的是“第7位是否置位”而不是“值是否为1” IDR 是一个 16 位或 32 位的寄存器每一位对应一个 GPIO 引脚的当前输入电平。 (17) 是一个掩码表示我们要读取第 7 位。IDR (17) 如果返回 0x80说明第 7 位是高电平。 但这个结果是 0x80不是 1。这也就是为什么用 1 判断会失败。 二、标准写法推荐永远使用右移掩码归一化 写法一直接进行非0判断适合快速判断 if((GPIOB-IDR (17)) ! 0) {// 高电平逻辑 }这种写法通俗易懂不要求值一定是 1只要非0就算高电平。 写法二标准位提取适合宏定义和严谨判断 #define IIC_SDA_R ((GPIOB-IDR 7) 0x01) // 结果严格为 0 或 1if(IIC_SDA_R 1) {// 高电平逻辑 }解释 先将 GPIOB-IDR 右移 7 位使得 PB7 位移到最低位再 0x01只保留最低位其它高位屏蔽最终结果只可能是 0 或 1符合布尔判断逻辑。 注意不加 0x01 有可能高位还有数据残留导致判断错误 三、真实案例I2C 软件模拟踩坑现场 某位开发者在写 I2C 软件模拟时定义了如下宏 #define SDA_IN() {GPIOB-MODER ~(3 (7 * 2));} // 输入模式 #define SDA_OUT() {GPIOB-MODER | (1 (7 * 2));} // 推挽输出 #define SDA_READ (GPIOB-IDR (1 7))然后在接收数据时使用 if(SDA_READ 1)data | 0x01;结果发现所有接收到的字节全是 0。 经过修改为 if(SDA_READ ! 0)data | 0x01;或者 #define SDA_READ ((GPIOB-IDR 7) 0x01)才恢复正常。 教训I2C 是时序敏感协议一位错误整个通信都失败。 四、进一步理解你以为的“值”其实是“掩码” 我们来看看下表 代码PB7低PB7高GPIOB-IDR (17)0x000x80(GPIOB-IDR 7) 0x0101 可以清楚看到如果不右移并归一化那么返回值在高电平时是 0x80并不等于 1。因此直接 1 判断会失败。 这正是新手常犯的“位判断逻辑错乱”问题 五、再扩展不仅是输入输出也要注意 有些同学在配置 GPIO 输出电平的时候也喜欢写 if(GPIOB-ODR (17) 1)还是一样的问题 GPIOB-ODR (17) 返回的是 0x80 或 0x001 判断会失败 所以结论也一样 if(((GPIOB-ODR 7) 0x01) 1)才是标准严谨写法。 六、总结写嵌入式必须严谨不能“想当然” 必须牢记的标准写法 ((GPIOx-IDR n) 0x01)保证返回值是 0 或 1可以放心与 1、0 判断不受端口位数干扰 踩坑原因总结 错误点原因GPIOx-IDR (1n) 1实际返回值可能是 2ⁿ不是1误以为 (1n) 结果只有 0 或 1实际是位掩码不是布尔值用 1 判断只有结果正好是 1 才成立太严苛 建议 宏定义时就规范右移并掩码成 0 或 1判断 GPIO 状态时统一只对“结果位”进行判断不要对“原始寄存器值”做等值判断 七、结语 这类问题看似细微但在嵌入式开发中却经常造成“通信失败”、“按键不响应”、“逻辑错误”等莫名其妙的 bug耗费大量时间排查。 掌握一行标准位操作胜过一堆调试打印 你踩过这个坑吗是否还有其它寄存器位操作的问题也困扰你欢迎留言交流别让自己在简单问题上反复绕圈。 —— 想写可靠代码先搞懂 0 和 1。 (完)
http://www.hkea.cn/news/14435795/

相关文章:

  • wordpress与微信小程序成都seo技术
  • 企智网站建设怎样做网络销售平台
  • 网站绑定多个域名常州网站建设外包
  • 没内涵网站源码企业开发网站建设
  • 知乎 上海做网站的公司易点租电脑租赁官网
  • 可以做ps的网站仿站酷网站模板
  • 美容网站制作网站建设套餐表
  • 怎样做自己的的社交网站wordpress 多久
  • 实惠的制作网站装修黑榜第一名
  • 资溪县建设局网站化学药品购买网站
  • 即墨做网站的台州网站制作价格
  • 怎么开个人网站赚钱网站的维护及建设
  • 小区网站建设有什么网站可以接手工加工做
  • 营销网站建设培训企业网站建设 信息安全
  • 北京建设银行网站家具东莞网站建设0769
  • 开发网站建设方案做网站项目主要技术
  • 做渔船的网站广东省石油化工建设集团公司网站
  • wordpress子目录网站服务器与虚拟主机
  • 建设银行网站会员网上代做论文的网站好
  • 郑州seo网站有优化网站设计制作要多少钱
  • 信息服务类网站怎么做旅游网页设计图
  • php网站后台制作教程网站建设情况通报
  • 国外网站的设计风格东莞网站建设营销网站
  • 官方网站开发哪家好ftp如何上传网站
  • 利辛做网站马关县网站建设
  • 网站流量分析怎么做在线代理app
  • 网站开发课程意见和建议免费浏览的网站
  • wordpress+标题简码深圳网站优化最好的方法
  • 百度网站认证官网嘉兰图设计有限公司
  • 网站建设哪里实惠wordpress wowslider