最近使用极海的072VB开发一个简单的协控,这款芯片可以用CubeMX生成的代码调试,对于小项目还是很方便的。Flash够大,能装下主控的升级包,还有USB和CAN,目前用不到
代码烧进芯片直接就能运行仿真。但是每几次上电,总有一次芯片不工作,量电源引脚只有2.7V的电压,怎么回事?
先排查硬件,板子是参照开发板的原理图画的,BOOT0上电时接地--ok,VDD、VDDA、NRST的外围--ok,正常电压3.3V,失效时统一降到2.8V左右。
串口外接了蓝牙模块,会不会是它的影响?拆掉模块、关掉USART,问题还能测试出来,保守起见,在USART中断里增加了清除全部标志位的语句。
看来要上仿真器排查软件了,这颗芯片可以用J-Link和ST-Link,J-Link直接使用APM32的型号,ST-Link当然要选ST啦
Debug才知道,原来芯片在错误中断里卡着,一键生成的代码没有配置过这个中断,里面只是个死循环!
屏蔽while(1),正常了,但为什么会进错误中断,我还要调查一下
取中断服务函数的两个参数,char *file可以打印文件名, int line是所在行数,调用这个语句的代码都是这样式的:
_Error_Handler(__FILE__, __LINE__);
很轻松就找到了错误所在,是SystemClock_Config()里,配置Flash等待周期的语句(已被注释):
//if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
_Error_Handler(__FILE__,__LINE__);
}
原来Flash等待周期被配置成了0,按我现在的48MHz主频,有些时候这样的配置可以HAL_OK,有些时候就不OK了,进死循环。
换成FLASH_LATENCY_1,问题不再重现
同事说我HAL库的版本有些旧了,更新之后再按项目的配置生成代码,新版本的SystemClock_Config()已经按标准配置好了,新版的错误中断也增加了关全局中断的操作,靠谱~
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
Error_Handler();
}
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
附:关于072的等待周期
基地址 0x40022000,偏移地址 0x00,[2:0] bits:
000 - 0个等待周期,对应0<系统时钟≤24MHz;
001 - 1个等待周期,对应24MHz<系统时钟≤48MHz;
其他 - 保留;
APM手册的命名是FMC->CTRL1.WS (wait state)
ST的命名是FLASH_ACR,地址相同
|