本人很久没有使用CUBEMX创建工程了,更新了CUBEMX6之后,就想着自己重新尝试搭建一个STM32的MDK工程,用于正点原子的阿波罗,实现的功能也十分简单,就是TIM6实现跑马灯和独立看门狗。如图1:
如上,配置后本来只应该使能对应LED驱动的GPIOB和配置HSE外部晶振输入的GPIOH的RCC时钟,但实际却多出了一行GPIOA的RCC时钟使能代码。如下代码:
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE(); //多出的GPIOA的RCC时钟使能函数
然后我就开始怀疑人生了,究竟是哪里需要使能GPIOB呢?
先去查看了芯片的时钟框图,发现GPIOB上挂载的只可能是对应的PB0-15,而我配置的外设中并没有使用到GPIOB的任何一个IO口。
实在想不到缘由后,尝试重新配置一个对比工程,不配置TIM6、GPIO和IWDG,而新建了工程后发现只初始化了GPIOH,这让我觉得就是因为IWDG和TIM6。
void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOH_CLK_ENABLE();
}
但是在新的对比工程中配置IWDG和TIM6,还是只有这一行代码,又再次抑郁了。
在朋友提醒下重新看了IO分配表,才发现了端倪。
对应的PA13/PA14/PA15/PB3/PB4是JTAG/SWD仿真接口所用,而我在新的对比工程中并没有使能JTAG调试功能。如下图,处于失能状态。
重新配置后终于舒服了,消失的GPIOA和GPIOB的RCC时钟使能函数又重新回来了。如下图及代码块。
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE(); //B和A口的RCC时钟使能代码重新出现。
__HAL_RCC_GPIOA_CLK_ENABLE();
通过JTAG下载程序到Flash上之后,系统存储器中的BootLoader会引导程序从flash中加载,启动后,若通过JTAG接口进行调试,则肯定需要使能对应的IO时钟,即上面对应的GPIOA和GPIOB的时钟。回顾最初的工程,因为配置的LED恰好对应GPIOB,以及忘记调试环节,错误认为下载后JTAG就没有必要链接。使得我一次次错过了这个正确答案。写这篇文章也是记录而且提醒一下自己以后不要犯对应的错误。
关于STM32的BootLoader下载,以下转载另一个博主的博文,感觉讲的比较详细易懂。
博主:qq_30479727