历史上的今天
返回首页

历史上的今天

今天是:2025年03月05日(星期三)

正在发生

2020年03月05日 | STM8L在中断中写IO异常的问题

2020-03-05 来源:eefocus

今天使用STM8L152的串口通信,串口模式为RS485模式,MAX485芯片的使能端有PC4来控制 。

串口发送采用中断方式,发送前PC4置高,发送完毕后在TC中断中将PC4置低。但是通信十来分钟后,发现数据通信中断,测量的结果是PC4没有得到置低,而处于高电平状态,导致485总线被占用了。


设备接收不到数据,所以也不可能应答数据,就不能再次进入TC中断进行PC置低。


排查了好久,以为程序哪个环节写错了,最后实在没找出原因,只好用排除法,将其他程序模块禁用后观察,结果发现有个非标的IIC接口应用程序打开的时候导致了通信异常。


分析的结果:IIC程序频繁操作GPIO,且IIC引脚所在的IO可也为PC口,得出的结论为:


1. 因为IIC写某个引脚的时候,先将整个PC口读出,再进行与、或后,最后写入。


  assert_param(IS_GPIO_PIN(GPIO_Pin));

  assert_param(IS_STATE_VALUE(GPIO_BitVal));

 

  if (GPIO_BitVal != RESET)

  {

    GPIOx->ODR |= GPIO_Pin;

 

  }

  else

  {

    GPIOx->ODR &= (uint8_t)(~GPIO_Pin);

  }

以上程序等价于:


第一步:读出GPIO整个端口的数据。


第二步,对要写的PIN为进行与、或运算。


第三步,重新写入。


2. 如果在上述第一步后,且第三步完成前的中间时刻,串口中断正好来了,则进入中断,在中断中对PC4进行了写操作,然后退出了中断。

3. 退出中断后,返回到程序总指定第2步指令,这是PC4已经被改动了,但是IO操作读出来的值没有得到更新,并把之前的PC4又重新写了回去,导致PC4无法置低,引发485总线死锁的情况。


4. 解决办法,在IIC应用程序进行IO操作前先禁用中断,IO操作完之后再打开中断,问题解决。或者采用一个独占的GPIO组中的某个引脚进行RS485的使能操作,例如我的板子上正好有个PF,且只有PF0可用,使用其作为RS485使能最好不过了。

推荐阅读

史海拾趣

川土(Chipanalog)公司的发展小趣事

随着业务的不断发展,川土微电子开始在全国范围内进行战略布局。公司不仅在上海设立了总部和研发中心,还在其他地区设立了办事处和生产基地。此外,川土微电子还积极与多家封测厂合作建立了封测专线,确保了产品的质量和供应的稳定性。

Anvo-Systems公司的发展小趣事

Anvo-Systems深知人才是企业发展的核心动力。因此,公司一直注重与高校和研究机构的合作,共同开展电子技术的研发与创新。通过与高校合作开展科研项目、设立奖学金等方式,Anvo-Systems吸引了大批优秀的人才加入公司。同时,公司还建立了完善的培训体系,为员工的职业发展提供了有力支持。这些举措不仅提升了公司的研发实力,也为公司的未来发展储备了丰富的人才资源。

亿佰特(EBYTE)公司的发展小趣事

亿佰特在技术创新的基础上,积极拓展市场。公司凭借优质的产品和服务,成功打开了国内外市场的大门。产品远销美国、加拿大、德国等50多个国家和地区,覆盖了物联网、消费电子、工控医疗等多个行业。亿佰特通过深入了解市场需求,不断优化产品结构和市场策略,实现了市场的快速扩张。

AW Industries Inc公司的发展小趣事

AW Industries Inc成立之初,正值电子行业的快速发展期。公司创始人凭借对市场的敏锐洞察,决定专注于生产高精度电子元件。然而,初创期的资金短缺和技术难题成为公司发展的两大障碍。创始人通过多方筹资,成功引入了第一批投资,并聘请了一支技术团队进行研发。在团队的不懈努力下,公司成功推出了首款产品,并迅速获得了市场的认可。

Electromagnetic Industries Llp公司的发展小趣事

EMI公司成立于20世纪80年代初,当时正值电子行业的快速发展期。创始人李先生凭借对电磁技术的深厚理解和市场洞察,决定投身电磁产品的研发与生产。初创时期,公司面临着资金短缺、技术难题和市场认可度低等多重挑战。然而,李先生和他的团队并没有放弃,他们通过夜以继日的研发,不断攻克技术难关,同时积极寻找合作伙伴,拓展销售渠道。经过几年的努力,EMI公司逐渐在市场上站稳了脚跟。

CDI-DIODE公司的发展小趣事

随着市场需求的不断增长,CDI-DIODE公司意识到单凭自身力量难以满足所有客户的需求。于是,公司积极寻求与其他企业的合作,通过共同研发、生产和销售,实现了业务的快速拓展。这种合作模式不仅提升了公司的产能和效率,也加强了与合作伙伴之间的紧密联系。

问答坊 | AI 解惑

wince oal层函数调用如OALIntrDisableIrqs,需要链接那些库文件?

我采用vs2005 编写一个wince5.0的驱动,调用到OALIntrDisableIrqs关中断,编译出现error LNK2019: 无法解析的外部符号 BSPIntrInit,该符号在函数 OALIntrInit 中被引用,请问需要添加那些库文件进去啊?…

查看全部问答>

触摸屏校验 注册表中的CalibrationData的键值是如何计算出来的

想做一个类似WINCE触摸屏校验的小程序,基本思路就是通过5点校验来修改注册表中的[HKEY_LOCAL_MACHINE\\Hardware\\DeviceMap\\Touch]      \"CalibrationData\"=\"1484,1168 584,536 568,1820 2356,1812 2356,488\" 的值,但 ...…

查看全部问答>

SDHC驱动添加问题

大家好! 我在BSP驱动文件夹下添加了SDHC文件夹,其下包含SDHC和SDHCBASE子文件夹,两个子文件夹中source文件最后如下 SOURCES = SDIOController.cpp \\ SOURCES = SDHCMain.cpp \\           SDIOControllerBase.c ...…

查看全部问答>

什么是通用1#总线?

什么是通用1#总线?什么是通用2#总线?比如三星ARM7 44B0是什么是通用1#总线还是什么是通用2#总线?…

查看全部问答>

【为C2000做贡献】基于matlab的dsp调试方法

这篇文章介绍了基于MATLAB的DSP调试方法~~~~~~~~~~~如图: …

查看全部问答>

为什么论坛里没有专门的C语言这个版快

现在写程序大家大多都用C写了(高手也有用汇编什么的,不要骂我啊我只是觉得大家都在用C),为什么没有专门的C语言这个版块呢…

查看全部问答>

05.11【每日一问】C语言问题

请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1。(提示:Big_endian模式和Little_endian模式对操作数的存放方式)  …

查看全部问答>

RS232C串行通信接口概述

RS232C是1969年有电子工业协会(EIA)公布的标准,RS是推荐标准(RecommendedStandard)的缩写,232是标识号,C表示修改的次数。该标准的用途是定义数据终端设备(DTE)与数据通信设各(DOE)接口的电气特性。目前在IBM PC机上的COM1、COM2接口,就 ...…

查看全部问答>

STM8S105C4 T1 PWM输出引脚无法重映射到备选引脚

默认的引脚被LED占用了,所以想要把T1 三个通道的PWM输出引脚映射到备选引脚上,引脚为PB0-PB2,但是设置了选项字节无效,设置了后默认的引脚仍然有输出,备选引脚无输出。选项字节00 00 FF 30 CF 00 FF 00 FF 00 FF 00 FF 00 FF 55 AA 。有用这个 ...…

查看全部问答>

求指导逆变器制作

有人会做逆变器么?请教导,谢谢,本人qq364182124…

查看全部问答>