关于STM8中断与主函数调用同组IO所出现的问题

博客讨论了在STM8中遇到的中断与主函数同时操作同一组IO导致的异常问题。实验表明,直接操作寄存器比调用库函数更稳定,特别是当库函数涉及未使用的GPIO初始化时。通过添加缓冲机制的函数,成功解决了高频率中断下的问题。
摘要由CSDN通过智能技术生成

公司的同事发现了这个问题,现在还原一下相关的情况:


》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

陈工:

出现这个问题后,我们也做了相关的实验,发现更多莫名其妙的情况。

其中一个实验是 10ms中断里PE6翻转,主程序中PE0和PE1翻转。

宏定义采用两种写法,一种是直接操作寄存器,一种是调用库函数。

发现采用直接操作寄存器比调用库函数好。概率大大降低,貌似没有。

调用库函数写法 做了实验,如果GPIO初始化时初始化了其他IO口,这里是GPIOD,即使我没有用它,那么PE6误动作的概率大大增加。但是如果初始化时加上GPIO_DeInit(GPIOD);那么貌似一切又正常了。但非常奇怪的是,上述情况GPIOD程序中根本就没有使用。

中断和主程序操作同一个寄存器都会有此问题的话,现在不知道只是GPIO有这样的问题,还是TIMER等其他外设也会有此问题。

感觉就是定时炸弹,所以我们现在也是如履薄冰,您发的代码我们会先测试,

更深层次的原因希望继续查下去,确认是编译器的问题(汇编的代码我也看过,正常),还是MCU本身的硬伤。


static void GPIO_Config(void)

{

    /* Initialize output */                

  GPIO_DeInit(GPIOE);  

  GPIO_Init(GPIOE,GPIO_PIN_0,GPIO_MODE_OUT_PP_LOW_SLOW); 

  GPIO_Init(GPIOE,GPIO_PIN_1,GPIO_MODE_OUT_PP_LOW_SLOW);

  GPIO_Init(GPIOE,GPIO_PIN_6,GPIO_MODE_OUT_PP_LOW_SLOW);   

  

 //  GPIO_DeInit(GPIOD);

   GPIO_Init(GPIOD,GPIO_PIN_0,GPIO_MODE_OUT_PP_LOW_SLOW);

   GPIO_Init(GPIOD,GPIO_PIN_1,GPIO_MODE_OUT_PP_LOW_SLOW);

   GPIO_Init(GPIOD,GPIO_PIN_6,GPIO_MODE_OUT_PP_LOW_SLOW);    

}

 

INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)

{

  /* In order to detect unexpected events during development,

     it is recommended to set a brea

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值