打印
[APM32F0]

【已解决】HAL库异常进错误中断问题

[复制链接]
447|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近使用极海的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,地址相同

使用特权

评论回复
沙发
caigang13| | 2023-6-8 20:28 | 只看该作者
还能直接用ST的cubemx生成代码?

使用特权

评论回复
评论
专注于嵌入式 2023-6-9 08:39 回复TA
对,难道你不知道? 
板凳
chenjun89| | 2023-6-9 23:47 | 只看该作者
还能用STCubeMX来生成代码?

使用特权

评论回复
评论
joengchao 2023-6-13 17:26 回复TA
可以哟,单片机只认代码编译出的机器语言,CubeMX按外设需求一键生成代码,很方便,但封装的东西过多比较占空间~ 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

13

帖子

0

粉丝