
通常我们认为,STM32G0 MCU从上电到GPIO口初始化之前,它们都处于analog mode状态,这种状态下的GPIO既没有输出功能,也没有输入功能,是切断了外设连接的高阻态。但直到有一次测试,产品在上电后,PA6脚所控制的电磁阀被意外打开了,引起了我们的疑问。我们的电磁阀需要GPIO的PA6脚产生PP推挽输出高电平,持续50ms以上才能打开,而且PA6接了下拉电阻到GND,绝不可能是引脚耦合电能的影响。此时芯片还是空片,更不可能是用户软件控制的。那到底是什么原因,让PA6持续输出高电平呢?为此我们做了一些研究,并最终锁定了原因。
上电时,MCU会自行判断0x8000 0000地址(即用户Flash起始地址)是否为FF,如果是,则表示该片是空片;如果不是,则表示该片有程序。
空片时,程序会进入System memory,即系统自带的ISP BootLoader。
当片区非空时,程序会进入主闪存运行。
所以在空片上电后1~2秒,系统会进入系统内存,也就是我们俗称的MCU自带的BootLoader(ISP)程序。一旦进入ISP BootLoader,这套固化的程序会对部分IO口进行初始化,具体内容可以参考手册AN2606的详细讲解。
为了让用户可以通过UART/I2C/SPI/CAN等方式下载程序,BootLoader里会对很多GPIO口进行初始化。
而PA6就不幸被初始化了,被初始化成了上拉下拉模式,且最终会输出3.3V。
以上就是为什么GPIO PA6在空片上电时会输出高电平的原因。总结来说,这是因为芯片会进行空片自检,当空片时会自动进入ISP BootLoader,从而改变了一些GPIO口的输入输出状态。由于STM32G0 ISP的特殊性,它的默认启动选择(即上电后是进入主闪存还是系统内存)不是由boot0引脚决定的,而是由optionbyte中的nboot几个位决定的。所以在未修改的情况下,即使将boot0引脚拉低,也不会进入主闪存。这一点与之前的MCU完全不同,也让工程师感到有些不习惯。此外,进入ISP后,会初始化较多的GPIO,例如PA5、PA7、PB10、PB11等,因此在开发时一定要注意。
来源:大联大工程师社区
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。