公司的同事发现了这个问题,现在还原一下相关的情况:
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
陈工:
出现这个问题后,我们也做了相关的实验,发现更多莫名其妙的情况。
其中一个实验是 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