前提:使用STM32系列MCU很强大的辅助工具,最直接的图形配置和最新的库函数支持,最简单KEIL工程的建立。STM32CubeMX最新版增加了对STM32F1系列MCU的支持,我的例程是以STM32F4077IGXX为准,其他的STM32系列的MCU设置也是大同小异的。本文乃闲时兴起所作,多有瑕疵,让大家见笑了。Step1:工程建立打开STM32CubeMX,点击NewProject,并选择对应的MCU:双击MCU进入工程界面,如图:1.点击新建2.选择MCU双击MCU外设功能选择MCU管脚图,在这里可以设置GPIO的基本功能Step2:外设功能选择(Pinout)1.RCC设置:选择使能RCC之后,右边的MCU相对应的管脚会自动变成绿色,说明该管脚已经被使用:因为我们这里只是点灯一个简单动作,所以外设功能选择RCC。2.GPIO口功能选择GPIO口的功能选择在这里面使用起来很简单。比如说我的板子是PG6,PG8,PC7作为LED1,LED2,LED3的IO口,那么我直接找到相对应的IO口,则会弹出该IO口所能设置的所有选项:RCC,选择HSE,我用的板子是外接晶振,所以选择第三项。1.Disable:使能外部时钟2.BYPASSClockSource:旁路时钟3.Crystal/CeramicResonator:晶体/陶瓷谐振器左边功能选择后,管脚会变成绿色选择GPIO_Output即可。同理将PG6,PG8设置成GPIO_Output即可。左边的黄色警告指的是该功能的GPIO已经被映射作用其他功能了,可以忽略。Step3:时钟配置(ClockConfiguration)ClockConfiguration配置完全采用图形方式,只要了解了RCC的配置原理你会觉得这种方式实在是太强大了,后面会有介绍。具体框图如下:左键点击GPIO口,会弹出功能选择。这里选择GPIO_Output模式A:InputFrequencyB:PLLSourceMuxC:PLLMD:PLLNE:PLLPF:SystemClockMuxG:APB1/APB2Perscaler为什么要这样设置,自己可以去看STM32F4系列参考手册。我在后面会详细说明。Step4:深入配置(Configuration)在这里我们只用到GPIO口,点击进入GPIO详细设置。如图:系统功能细化设置。包括NVIC,GPIO详细设置等等ABCDEEFGGPIOmode:OutputPushPull推挽输出(已选择)OutputOpenDrain开漏输出GPIOPull-up/Pull-dowm:NOpull-upandnopull-down没有上下拉pull-up上拉(已选择)pull-down下拉Maximumoutputspeed:Low慢Medium中Fast快High高(已选择)大家可以根据自己的板子情况设置相关参数。上面是我的GPIO口详细设置,因为忘记将设置的界面截图了。Step5:低功耗计算(powerconsumptioncalculator)该功能针对F0,L系列低功耗MCU,这里不需要理会。点击Modified选项下面会出现IO口的详细信息GPIO模式选择GPIO上拉下拉选择GPIO输出速度GPIO详细设置Step6:保存配置和输出到工程目录1.保存配置(两个保存图标功能一样)2.根据用户的设置生成的源代码该选项不需要任何设置3.代码生成设置Keil工程名字Keil项目位置图形配置文件位置重要,生成编译器选项请选择编译平台,不能低于选项中的版本号按照上面的勾选即可。用上面设置的编译器打开即可生成过程有点久,我是不是该换电脑了…至此,用STMCubeMX新建一个点灯工程到此结束。虽然上面的步骤看起来很多,实际上我们只需要用鼠标点击几下即可。生成的工程文件里面,时钟和GPIO相关配置代码已经自动生成,是不是很强大很省心呢。在配置正确的情况下,我们的精力得到了释放,可以更加专注了具体功能的实现了。附录:TMcubeMX设置STM32F407系列RCC说明HighSpeedClock(HSE):外部高速时钟,其中有三个选项,分别是:1.Disable:使能外部时钟2.BYPASSClockSource:旁路时钟3.Crystal/CeramicResonator:晶体/陶瓷谐振器(一般选择该选项)LowSpeedClock(LSE):外部低速时钟。分别是:Disable:使能外部时钟BYPASSClockSource:旁路时钟Crystal/CeramicResonator:晶体/陶瓷谐振器总体框图如下:如上图所示:M表示PLLM;N表示PLLN;P表示PLLP;那么我们来看看数据手册来确认一下它们为什么要设置成这些数字,设置其他的可不可呢?下面是RCCPLL配置寄存器的相关说明:由上面我们得出这些结论:PLLM:主PLL(PLL)和音频PLL(PLLI2S)输入时钟的分频系数,PLL的设置是对PLL输入时钟源HSE进行分频系数,而这个系数在寄存器说明里面特别强调说来了,HSE进入PLL的频率(VCO输入频率)要介于1和2MHz之间:VCO输入频率=PLL输入时钟频率/PLLM并且2PLLM63从这里我们就很清楚为啥PLLM要设置成25了,HSE输入频率25MHz经过25分频变成了1MHz,同理,如何用户的外部晶振为16MHz,那么PLLM则选择16或者8都可以,建议尽量让PLL的输入频率为1MHz,这样方便产生精确的震荡方波。PLLN:适用于VCO的主PLL(PLL)倍频系数。这里的计算公式为:VCO输出频率=VCO输入频率×PLLN并且192PLLN432。从这里我们只能单纯地知道PLLN的范围,但是不知道为什么是336而不是其他的。为了解决这个问题,我们还得了解PLLP。PLLP:适用于主系统时钟的主PLL(PLL)分频系数。它的计算公式为:PLL输出时钟频率=VCO频率/PLLP并且PLLP=2、4、6或8。事实上,大家可以从框图看出来,经过PLLP之后就是系统时钟了。。根据数据手册得知STM32F407系列,系统时钟HCLK最大值=168MHz。即SYSCLK=168M。这里我们倒推回去,168=X/PLLP(单位:MHz),并且PLLP=2、4、6或8。当PLLP=8是,VCO=1344=1*PLLN,并且192PLLN432,显然不成立。我们依次将PLLP=6、4、2带入上面的公式进行计算,唯有2是满足条件的。当PLLP为2是,PLLN=336.至此我们得知M、N、P的值了。上面的所有公式在STM32F4用户手册都有详细的说明,大家可以自行对照推算一下那么下面的图示,大家可以根据上面的思路去思考一下。APB1Divider为啥要4分频,APB2Divider为何要2分频,请对照用户手册来比较推算一下。这些总线数值都可以在复位和时钟控制(RCC)这部分可以找到答案。