OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 487|回复: 2

HAL库 初始化段落【如何写 二进制 常数】? 网上照抄 仍然报错

[复制链接]

103

主题

671

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1057
金钱
1057
注册时间
2014-9-30
在线时间
194 小时
发表于 2026-8-10 18:14:01 | 显示全部楼层 |阅读模式
15金钱
请看 截图 —— 不想 写 16进制 加 人工 注释 , 网上 照抄 的 0b 字头 字尾 都报错 。
在 STM32  HAL 库  的 C 语音里  【如何写 二进制 常数】? ?? ?
888.png

最佳答案

查看完整内容[请看2#楼]

在STM32 HAL库的C语言中,若想正确编写二进制常数(避免使用0b前缀导致的编译错误),可参考以下解决方案: 问题分析 编译器兼容性:部分旧版编译器(如C11)不支持二进制字面量(0b前缀),需升级至C18或更高版本。 位数限制:二进制字面量的有效位数受类型限制(如uint16_t最多支持32位,但实际有效位数为31位),超限会触发截断警告。 语法错误:如Ob1000应为0b1000,末尾的b需紧跟数字。 解决方案 方法一:启用C18/C23 ...
回复

使用道具 举报

0

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
623
金钱
623
注册时间
2026-1-29
在线时间
44 小时
发表于 2026-8-10 18:14:02 | 显示全部楼层
在STM32 HAL库的C语言中,若想正确编写二进制常数(避免使用0b前缀导致的编译错误),可参考以下解决方案:

问题分析
编译器兼容性:部分旧版编译器(如C11)不支持二进制字面量(0b前缀),需升级至C18或更高版本。
位数限制:二进制字面量的有效位数受类型限制(如uint16_t最多支持32位,但实际有效位数为31位),超限会触发截断警告。
语法错误:如Ob1000应为0b1000,末尾的b需紧跟数字。
解决方案
方法一:启用C18/C23标准
若编译器支持,可通过设置启用二进制字面量:

// 示例(需确保编译器标准≥C18)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wimplicit-integer-overflow"
uint16_t Bias3 = 0b1000010100100000;  // 正确写法
#pragma clang diagnostic pop

      
方法二:使用十六进制替代
若无法升级编译器标准,可用十六进制表示二进制值:

uint16_t Bias3 = 0x8288;  // 对应二进制:1000 0010 1000 1000

      
方法三:通过移位操作构造常量
利用位移运算符手动组合二进制位:

      

     
uint16_t Bias3 = (1 << 9) | (1 << 7) | (1 << 5);  // 组合二进制:1000 0101 0010 0000

      
关键注意事项
编译器设置:在STM32CubeIDE中,进入Project Settings > Toolchain Editor,将C Compiler标准设为ISO C18。
类型匹配:确保二进制字面量的类型与变量类型一致(如uint16_t)。
避免截断:若二进制字面量超过类型允许范围,改用移位操作或拆分为多个变量。
示例修正代码

/ $\ast$ USER CODE REGIN PV $\ast$ /
uint8_t GetFirst = 0b10000000;  // 修正Ob→0b,补全末尾无空格
uint16_t SysEn = 0x8020;        // 原写法正确
uint16_t Bias3 = 0b1000010100100000;  // 补全前缀,移除多余空格
uint16_t Lcdon = 0b1000000001100000;   // 正确写法
uint16_t TestM = 0b1001110000000000;    // 补全前缀,末尾无空格
/ $^{\ast }$ USER CODE END PV $^{\ast }$ /

   通过以上方法,可在保持代码简洁的同时规避编译错误。若仍需使用二进制字面量,请优先升级编译器标准并验证兼容性。
回复

使用道具 举报

103

主题

671

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1057
金钱
1057
注册时间
2014-9-30
在线时间
194 小时
 楼主| 发表于 2026-8-12 16:15:37 | 显示全部楼层
664929323 发表于 2026-8-10 18:14
在STM32 HAL库的C语言中,若想正确编写二进制常数(避免使用0b前缀导致的编译错误),可参考以下解决方案: ...

  谢谢  谢谢 , 只不过  懒得 升级 软件 , 能用 就 凑合 用 着  。。。
—— 核实 之后 : 俺就 只好 安安心心 的 16进制 加 注释 了事  ——
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-8-25 19:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表