历史上的今天
今天是: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使能最好不过了。
史海拾趣
|
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\" 的值,但 ...… 查看全部问答> |
|
大家好! 我在BSP驱动文件夹下添加了SDHC文件夹,其下包含SDHC和SDHCBASE子文件夹,两个子文件夹中source文件最后如下 SOURCES = SDIOController.cpp \\ SOURCES = SDHCMain.cpp \\ SDIOControllerBase.c ...… 查看全部问答> |
|
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1。(提示:Big_endian模式和Little_endian模式对操作数的存放方式) … 查看全部问答> |
|
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 。有用这个 ...… 查看全部问答> |




