使用ST和华大芯片在中断中操作IO口遇到的异常问题

昨天做一个项目,在中断中调用配置IO口的输出接口修改IO口输出状态,输出波形偶尔出现预期不符的情况。

用示波器检查通过检查IO口波形,发现中断中将IO口电平更改后,但10us后电平又会变回去。检查程序逻辑测试都没有发现问题,包括用另一个IO口跟这个IO同步变化,屏蔽所有其他地方更改这个IO口状态的函数都没发现问题。问芯片厂反馈是不清楚。于是陷入死局。

使用程序屏蔽大法测试,发现屏蔽一段模拟IIC的程序就不会出现这个问题。但这个地方操作的IO口和中断里操作的并不是同一个IO口,进一步检查这个地方的代码,发现这里是操作整个输出寄存器(PxOUT寄存器,对应ST的ODR寄存器),函数为PxOUT |= 1 <<pin。

这个函数执行的时候,应该是有三个步骤,首先读出PxOUT寄存器的值,然后将值某一位改为1,然后再赋值回PxOUT寄存器。

因此,我怀疑是不是因为这个地方操作IO口时,程序执行读PxOUT值时进入中断,中断退出后这里程序继续执行,于是就将IO口状态改回去了。

于是将这里的函数修改为使用置位和清空寄存器来操作IO口,中断里继续使用直接操作PxOUT寄存器方式,测试后问题解决。

以前学习ST时,一直不明白操作IO口的置位清空寄存器的使用场景,经过这次调试后,终于明白这个寄存器的价值了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值