历史上的今天
今天是:2024年10月08日(星期二)
2018年10月08日 | STM8单片机莫名进入外部中断的原因
2018-10-08 来源:eefocus
如题!
这两天在做一个项目,用的是STM8L152的单片机,调试的时候一直出现一个问题,就是每次都在一个地方停住了,用仿真器仿真调试的时候一直会死在一个地方,后来发现产生了莫名的中断。
具体是这样的,我使用了IO口模拟I2C通信,一开始把IO口初始化为输出用了以下语句:
GPIO_Init(GPIOC, GPIO_Pin_1, GPIO_Mode_Out_OD_HiZ_Fast);//SCL引脚置为输出
GPIO_Init(GPIOC, GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Fast);//SDA引脚置为输出
然后模拟I2C的时候需要把SDA引脚时常设置为输出,时常设置为输入,所以用了以下两个语句:
#define SDA_OUT() (GPIOC->DDR |= 0x01)
#define SDA_IN() (GPIOC->DDR &= ~(0x01))
然后这样的话,每次我调用SDA_IN()的时候就会产生PC0中断,并且一直死在里面出不来,让我头痛了好久,我并没有开启这个中断啊,经过几天的调试终于发现原因,如下:
![[转载]STM8单片机莫名进入外部中断的原因! [转载]STM8单片机莫名进入外部中断的原因!](https://8.eewimg.cn/news/uploadfile/2018/1008/20181008100212746.jpg?imageView2/2/w/550)
在执行GPIO_Init(GPIOC, GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Fast)的时候,会将DDR寄存器置为1,以此设置为输出模式,并且由于设置了Fast模式,所以由上图CR2寄存器会设置为1,以此设置为10MHz。问题就出在这里,当我再执行SDA_IN()时,DDR寄存器相应位置为0,设置为输入。此时CR寄存器值为1就变成使能外部中断了,所以在I2C时序中一直会产生中断。
所以大家用寄存器编程的时候注意一下。
史海拾趣
|
前言 随着市场的发展,现在的MP3播放器品种越来越多,价钱也越来越实惠。也越来越多的MP3进入了用户的口袋。可以说是MP3随身听丰富了个人的世界,能随时随地随心所欲地欣赏美妙音乐。作为随身听,MP3的最终目的是还原真实的音乐。作为音响爱好者, ...… 查看全部问答> |
|
windows xp 与 windows ce 嵌入式系统的usb通信 现有一个条形码识别掌机, 掌机系统为 windows ce.net 6.0, 有usb接口。 将掌机usb接口直接与windows vista电脑相接,不需要任何操作就可以实现通信。 但将掌机与windows xp相接,用了很多方法都不行,比如安装一个activesync 4.5,在连接 ...… 查看全部问答> |
|
可用于主控制的接口有CH375,SL811,还有吗?用于从控制的就多了,如PDIUSBD12,还有MCU内置,如C8051F340就内置USB控制器. 这写USB从控制器能用作主控制器吗?谢谢!… 查看全部问答> |
|
库文件完全一样,示例代码能运行,但是即使把示例代码完全复制到自己的工程中都不能输出正确的结果。复制到自己的项目中后,完全相同的代码但是编译后的大小要比demo工程直接编译的大一点点。一直到不到哪里出了问题。有人遇到过吗?或者给点查错的 ...… 查看全部问答> |
|
美国Robei公司开发了一套全新的FPGA设计仿真工具,现在在教育界和工业界引起巨大的反响。 下面是这个软件的简单介绍: Robei FPGA仿真软件是一款世界上最小的FPGA仿真工具。该软件具备先进的图形化设计工具,代码修改,Verilog编译仿真和波形分析 ...… 查看全部问答> |




