谈STM32G0 MCU空片上电时,GPIO口还是analog mode模式吗?

關鍵字 :空片ISP bootloader初始化

通常我们认为,STM32G0  MCU从上电到GPIO口初始化之前,它们都处于analog mode状态,这种状态下的GPIO既没有输出功能,也没有输入功能,是切断了外设连接的高阻态。但直到有一次测试,产品在上电后,PA6脚所控制的电磁阀被意外打开了,引起了我们的疑问。我们的电磁阀需要GPIO的PA6脚产生PP推挽输出高电平,持续50ms以上才能打开,而且PA6接了下拉电阻到GND,绝不可能是引脚耦合电能的影响。此时芯片还是空片,更不可能是用户软件控制的。那到底是什么原因,让PA6持续输出高电平呢?为此我们做了一些研究,并最终锁定了原因。

上电时,MCU会自行判断0x8000 0000地址(即用户flash起始地址)是否为FF,是则表示该片时空片,否表示该片有程序
1. 空片时,程序会进入System memory,即系统自带的ISP BootLoader
2.非空片时,程序会进入main flash运行

所以空片上电后1~2s,系统会进入system memory,就是我们俗称的MCU自带的BootLoader(ISP)程序里面。一旦进入ISP BootLoader里,那这套固化的程序会对部分IO口初始化,手册AN2606有详细讲解

为了让用户可以通过UART/I2C/SPI/CAN等方式下载程序,BootLoader里会对很多GPIO口进行初始化

 

而PA6就不幸被初始化了,被初始化成了上拉下拉模式,且最终会输出3.3V。

以上就是GPIO PA6在空片上电时为何会输出高电平的原因。总结就是因为芯片会做空片自检,当空片时自动进入了ISP BootLoader,从而改变了一些GPIO口的输入输出状态。由于STM32G0 ISP的特殊性,它的默认启动选择(即上电后是进入main flash或system memory)不是由boot0 pin引脚决定的,而是由optionbyte里的nboot几个位决定的,所以在没改的情况下,即使把boot0 pin脚拉低,也不会进入main flash,这一点和之前的MCU完全不同,也让工程师有点不习惯。而且,进入ISP后,被初始化的GPIO比较多,如PA5/PA7/PB10/PB11等,所以在开发时一定要注意。

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

參考來源

:

評論