[STM32F1] STM32F103RBT6 SPI 问题

[复制链接]
94|5
地瓜patch 发表于 2026-3-21 21:47 | 显示全部楼层 |阅读模式
遇到一个问题:当我将编译器优化等级从None改为Optimize for speed甚至仅O1时,SPI 功能无法正常工作.
在读取模式下返回的全是 0。有人知道问题出在哪里吗?


maxking 发表于 2026-4-17 09:16 | 显示全部楼层
速率改低一些试试。
 楼主| 地瓜patch 发表于 2026-4-17 11:49 | 显示全部楼层
maxking 发表于 2026-4-17 09:16
速率改低一些试试。

编译优化,有用么?现在不敢用优化了
jcky001 发表于 2026-4-23 10:42 | 显示全部楼层
优化等级高了,编译器觉得你那些等待标志位的循环是废话,直接给你优化没了
classroom 发表于 2026-4-23 11:43 | 显示全部楼层
检查一下SPI读写函数里的变量有没有加volatile,尤其是状态标志位
cr315 发表于 2026-4-23 14:43 | 显示全部楼层
读DR寄存器清零RXNE标志时,如果用了个临时变量但没用它,O1以上可能把这行代码直接删了
duo点 发表于 2026-4-23 15:44 | 显示全部楼层
官方例程跑O0没问题不代表代码严谨,开优化就现原形了
elephant00 发表于 2026-4-23 10:44 | 显示全部楼层
用(void)SPI1->DR这种写法,比定义个临时变量更安全,优化也不会被删
flycamelaaa 发表于 2026-4-23 18:45 | 显示全部楼层
看看while循环里的标志位读取是不是被优化成只读一次了,加volatile能解决
onlycook 发表于 2026-4-23 19:46 | 显示全部楼层
一个经典bug:while(!SPI_I2S_GetFlagStatus(SPI2, RXNE)); 优化后可能变成死循环
powerantone 发表于 2026-4-23 20:47 | 显示全部楼层
调试时开O0正常,开O1就不行——八成是指针或volatile的问题
probedog 发表于 2026-4-23 21:47 | 显示全部楼层
把SPI相关的寄存器指针都定义成volatile
solty 发表于 2026-4-23 22:48 | 显示全部楼层
函数内联也可能出问题,优化后代码执行顺序和你写的不一样了
stormwind123 发表于 2026-4-23 11:08 | 显示全部楼层
检查一下读取函数里有没有未初始化的局部变量,O0碰巧是0,O1就不一定了
七毛钱 发表于 2026-4-23 14:09 | 显示全部楼层
把SPI读写操作单独放一个.c文件编译,不要跨文件内联优化
内政奇才 发表于 2026-4-23 17:19 | 显示全部楼层
GPIO速度配置太低,配合高优化后的时序,采样点可能刚好错位
又见江南雨 发表于 2026-4-23 16:20 | 显示全部楼层
优化后循环展开可能导致读取时序被打乱,试试用-Og而不是-O1
才没有脸红 发表于 2026-4-23 19:21 | 显示全部楼层
在关键变量前加volatile关键字是最快的修法,不用改优化等级
故里说长安 发表于 2026-4-23 21:18 | 显示全部楼层
读取数据前如果没等RXNE标志就取值,优化后时序偏差问题会放大
甜心puppy 发表于 2026-4-23 22:21 | 显示全部楼层
IAR老版本也有这问题,后来才修了,不一定是编译器bug
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

2839

主题

17659

帖子

30

粉丝
快速回复 在线客服 返回列表 返回顶部
0