问题具体分析
1、尝试再次刷写程序,刷写后正常,然后再次断电复位,问题复现。
2、断电后用jflash工具connect一下,然后disconnect,发现两个IO的信号都正常,于是怀疑是复位的问题,手动把RESET引脚拉低复位,复位后,问题存在。
3、最后,我们怀疑是硬件电路导致的。刚开始上电,IO电平被钳住了,于是把串联在IO上面的电阻拆掉,发现问题依然存在,然后我利用板子上的另外两个GPIO的测试点来模拟,发现断电重启没有这个现象,于是怀疑原来使用的GPIO是否还有其他功能,如在用jflash工具调试的时候,还是通过SWD发送了一些命令,这些命令使得芯片进入某种模式,进入这个模式后,对应的GPIO就能正常操作了。

4、观察硬件电路:
发现PTB4有一个功能是NMI不可屏蔽中断,而且这个IO的默认功能就是NMI功能而不是GPIO:
这个就相当于SWD JTAG类似的引脚,我们需要先使能复用?才能正常使用这个IO,在网上搜索S9KEAZ64的NMI,在这里https://blog.csdn.net/bjxdbz/article/details/109909037找到了答案:需要先屏蔽NMI中断,才能正常使用PTB4的GPIO功能:
于是在main函数最前面加上相关代码:SIM_SOPT0 &= ~(1<<1);// 屏蔽NMI中断,这样PTB4才能作为GPIO使用
再次编译下载,一切正常。
问题解决方案首先检查代码中有哪些初始化操作没有完成,如有什么断开了,但是没有中断服务函数。
然后排查硬件问题,在开发板上面验证相关功能,或者把IO独立出来,排除硬件问题。
在使用特殊GPIO的时候,比如SWD JTAG NMI相关的GPIO,一定要先使能其复用?功能。
总结和建议遇到问题先冷静思考下,否则在问题解决后,再来回想自己的解决过程,发现很多过程都是没有依据的。