
我们知道,STM32一般可以通过BOOT0和BOOT1的不同组合来设置启动方式。 之前用过STM32G070CBT6,这个芯片的BOOT0是和PA14在一起的: 1 M" h: w, H4 f5 } ![]() ; `- n }: ?8 K6 g5 P1 ~ W 这个比较简单,我们知道PA13和PA14是芯片的SWD接口,我们只需要在这个引脚上下拉一个100K的电阻即可。这样,SWD功能和BOOT0的功能都兼顾到了,系统复位或者启动的时候,检测到PA14-BOOT0的电平为低电平,然后正常启动之后,这个引脚可以作为IO或者SWD功能使用。# W! H5 k6 O/ ^: Z4 u+ U 但是对于新使用的STM32G431KBU6来说,上述的方法就行不通了,如下图:$ ? e$ P% D* p% O. S0 s2 ]6 N $ ^$ c2 ^0 v! x9 T( n+ ^ ![]() 从上面CUBE MX 的引脚图中也可以看到,31脚的名称叫做PB8-BOOT0,我在一个设计中把PB7和PB8当作硬件IIC使用,这就需要给这两个引脚外挂4.7K上拉电阻。而按照通常的启动方式来看,我们要从主flash启动,需要启动时BOOT0引脚的电平为地电平,而IIC总线外挂了4.7K上拉电阻,使得无论如何都不能让启动瞬间这个引脚电平为低电平。) w5 S4 g# a5 P 这时候不要怕,我们翻看手册DS12589,可以看到:0 o2 W6 @4 s: X; t+ } ) ?- m* F2 p' H. y3 Z/ \: q ![]() ! I' Y0 n5 D, p& [3 k 也就是说BOOT0我们可以通过PB8-BOOT0这个引脚来设置,也可以通过Option Byte中的nBOOT0 option bit来设置,现在我们不能通过前者来设置,只能通过Option Byte中的nBOOT0 option bit来设置系统的启动方式了。7 z, T; r. o5 Y0 c" [" } + |9 J' u* T7 d1 c6 |3 h 我们在用户参考手册RM0440中可以看到: ![]() 需要通过把nSWBOOT0位设置为0来选择使用软件BOOT0而不是使用PB8-BOOT0来作为BOOT0的设置项,接下来把nBOOT0位设置为0就可以达到和使用PB8-BOOT0下拉到地一样的启动效果。5 I- T' t2 I9 R% A' E2 F 0 ~; [$ Q1 f8 r ^8 r 另外需要注意的地方是用户参考手册RM0440的这个位置:/ Z' l4 F ]- \7 ?% @0 I ![]() 以及 ![]() 以上是涉及到软件设置BOOT0的一些相关寄存器及说明,接下来说怎么设置。 ! E+ x% |+ S% t' l# O 有三个办法可以实现把BOOT0设置为软件BOOT0,这样PB8-BOOT0引脚就可以当作通用GPIO或者IIC或者其他用途来使用了。- p- x# c) U2 h* S L: ~ 0 ] k% A7 n& D/ M+ @# r; K 1、在程序中对Option Byte选项字的相关位进行编程,设置BOOT0为软件BOOT0,我看到HAL库中有相关操作,但是操作起来比较麻烦。+ k0 u' l0 p+ @9 z8 C 2、使用STM32CubeProgrammer来操作,这个软件可以通过STLINK\UART\USB\OTA来连接目标板来实现修改的功能。! \5 ^9 B0 G, ^% k1 r, ?" y$ a; o$ m% G . Z( F" ]7 u$ k" Y- x3 o2 _* U 3、使用STM32 ST-LINK Utility来操作,这个只能通过STLINK来连接目标板,连接上之后,点击Target,然后点击Option Bytes之后,按照下图修改即可实现目的:# e4 U- y, G) N! ~' o- I ![]() 4 l( F9 s$ h( r: `! L7 s |