这个‘随笔’来自公司一款成熟产品的BUG,它生产有6年左右了,最近改用GD32的对应型,有
GD32F(M3)和GD32E(M4),我们产品在STM32和GD32E通过PA0进入睡眠,再通过PA0唤
醒起来,能正常工作并测试良好!
但是在GD32F上,发现能进入睡眠,但是PA0唤醒不了CPU,为此用GD的固件库,独立测试
一下这个功能, 部份代码如下:
/* 【--利用PA0,唤醒GD32的测试--】 Firmware_Library_V2.1.2\Firmware\CMSIS下少文件, 可在之前的版本复制过来,进行使用 GD32发布的固件库V2.1.2有少文件现象,无语了!!! */ #include "main.h" int main(void) { gd_eval_com_init(USART0); //初始化串口0 printf("\r\n\r\n\r\nWAKEup PA0 TEST!\r\n"); //测试信息 gd_eval_key_init(KEY_TAMPER, KEY_MODE_GPIO); // PA0初化为普通按键KEY功能 led_config(); /* LED灯配置,RB8灯 */ long cont;//计数器 while(1){ if(SET == gpio_input_bit_get(TAMPER_KEY_GPIO_PORT, TAMPER_KEY_PIN))// PA0为高电平,进入待机模式 { printf("sleep\r\n"); gd_eval_led_off(LED2); // RB8灯灭 gd_eval_key_init(KEY_WAKEUP, KEY_MODE_EXTI);/* PA0脚重新初始化为PMU,外部中断唤醒功能 */ rcu_periph_clock_enable(RCU_PMU); /* 启用外围设备PMU时钟 */ pmu_wakeup_pin_enable(); /* 使能PA0唤醒 */ pmu_to_standbymode(WFI_CMD); /* 进入待机模式,等待PA0出现上升沿,程序会从MAIN()处执行 */ } else//PA0为低电平时,正常工作模式 { cont=0x1000000; while(cont--); gd_eval_led_on(LED2); // RB8灯亮 printf("RUNing\r\n"); } }// while() }// main()
这份代码在开发板上没有问题,但在产品上是有问题的,这肯定是一些硬件参数偏向临界值
,导致只在GD32F出现异常,或者GD32F就是容错性差一点.
最后找到问题了,PA0引脚的上升沿电平不是90度上升的,上升沿信号有斜坡,通过减小PA0脚上
的电容,减小上接电阻,已OK. 看来MCU的阻抗大小和电气兼容性,是换MCU要面对的重要问题。
光这问题就找了2天,不知道后面GD32F还会出现什么奇怪的问题.---啊门!!!