项目场景:
使用的开发板:STM32G431RB(蓝桥杯嵌入式比赛版)
开发环境:KeilV5,CUBEMX6.4(5)
问题描述
在做往年练习的时候发现下载程序后板子一点反应都没有。DEBUG调试发现程序先是跑到了
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
然后跑到了
while (READ_BIT(RCC->CR, RCC_CR_HSERDY) == 0U)
{
if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE)
{
return HAL_TIMEOUT;
}
之后查看RCC->CR发现好像RCC寄存器坏了一样,寄存器的值一直为空。
而且这个时候再去下其他程序也会出现这样的问题。但是程序能下载证明芯片其实并没有坏,即使是芯片坏了也不会单单只坏RCC一个寄存器。
一般这样的和时钟有关的损坏,要么是晶振坏了,要么是外围电路坏了,要么就是和基础配置有关。晶振可以用示波器测(也可以用万用表调到电容档测),一边接地一边接晶振的某个引脚即可。外围电路测起来麻烦只能用手摸摸烫不烫来判断。如果排除了这两个问题。
那么就是基础配置的问题了。在阅读完https://blog.t123yh.xyz:2/index.php/archives/922https://blog.t123yh.xyz:2/index.php/archives/922
这篇文章后,在初始化HAL_Init();前加上下面两行代码就可以正常运行了
原因在于在之前的程序中配置了以HSE加PLL为主时钟源,但是配置中有错误,如果用下面这两行程序确实是能解决问题,之后的时钟配置理应会切换回HSE,但是实测下来板子的运行速度确实是以HSI为时钟源的速度,而且如果有RTC的初始化还是会卡住。问题也不出在这上面(当然如果加了这两行就正常运行的兄弟就可以不用往下看了),考虑到RTC用的时钟源是HSE所以返回去检查和HSE有关的地方。
__HAL_RCC_HSI_ENABLE();
__HAL_RCC_SYSCLK_CONFIG(RCC_SYSCLKSOURCE_HSI);
细细检测了代码和CUBEMX之后发现
发现HSE设置成了旁路时钟源,噢,这才是问题的根源所在,如果板子上接的是晶振,如果将时钟源设成旁路时钟源则板子将无法正常工作。算是吃一堑长一智了。