打印
[AT32F421]

AT32F421的内置FLASH在IAR上可能存在驱动BUG

[复制链接]
2689|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vhuanyou|  楼主 | 2023-5-22 15:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在编译优化等级选择NODE或是Low时反而出现这种问题HardFault_Handler,如果选择Medium 或 High 优化确没问题。
以上出现问题定位点再库中,为了防止堆栈溢出或者自己代码本身的问题,在极精简的工程代码上与官方代码工程上均测试过!

MDK没试过,因为公司涉及到版权

微信截图_20230522150112.png (47.97 KB )

微信截图_20230522150112.png

使用特权

评论回复
沙发
sheltonyu| | 2023-5-22 15:36 | 只看该作者
你好,采用at32f421 bsp,测试flash代码用的bsp中 project/at_start_f421/examples/flash/flash_wirte_read,将main.c及flash.c拷到template下进行。优先级配置项NONE和Low都在IAR8.2及IAR9.3版本上进行了测试,运行正常。
请问:你用的官方demo是哪一份呢?或者方便给一下你的测试工程或代码吗?

使用特权

评论回复
板凳
caizhiwei| | 2023-5-22 22:12 | 只看该作者
这里的技术支持非常给力的哦

使用特权

评论回复
地板
wangshujun| | 2023-5-23 09:07 | 只看该作者
这个说法很奇怪,好像iar是free软件似的,iar抓起来比keil厉害多了

使用特权

评论回复
5
vhuanyou|  楼主 | 2023-5-26 17:08 | 只看该作者
本帖最后由 vhuanyou 于 2023-5-26 17:09 编辑
sheltonyu 发表于 2023-5-22 15:36
你好,采用at32f421 bsp,测试flash代码用的bsp中 project/at_start_f421/examples/flash/flash_wirte_read ...

IAR上,执行这句直接HardFault_Handler
int main(){
u32 v=0;

v=(u32)(FLASH->sts_bit.obf);
}

使用特权

评论回复
6
vhuanyou|  楼主 | 2023-5-26 17:34 | 只看该作者
sheltonyu 发表于 2023-5-22 15:36
你好,采用at32f421 bsp,测试flash代码用的bsp中 project/at_start_f421/examples/flash/flash_wirte_read ...

下面红色段被注视的为官方代码,改为绿色代码,此时IAR上仿真运行不再产生:HardFault_Handler


flash_status_type flash_operation_status_get(void)
{
  flash_status_type flash_status = FLASH_OPERATE_DONE;
   if((FLASH->sts & 0x1) != RESET)     // if(FLASH->sts_bit.obf != RESET)      
  {
    flash_status = FLASH_OPERATE_BUSY;
  }
  else if(FLASH->sts_bit.prgmerr != RESET)
  {
    flash_status = FLASH_PROGRAM_ERROR;
  }
  else if(FLASH->sts_bit.epperr != RESET)
  {
    flash_status = FLASH_EPP_ERROR;
  }
  else
  {
    flash_status = FLASH_OPERATE_DONE;
  }
  /* return the flash status */
  return flash_status;
}

使用特权

评论回复
7
084425| | 2023-5-29 10:43 | 只看该作者
vhuanyou 发表于 2023-5-26 17:34
下面红色段被注视的为官方代码,改为绿色代码,此时IAR上仿真运行不再产生:HardFault_Handler[/backcolo ...

从描述来看,不是你改了驱动就好了,而是你改后根本就没有调这个语句。你在main中直接变量赋值等于这个位域就出错,所以猜测库本身是OK的,是否你改到了库里的东西导致。
可以将你使用的BSP版本和IAR版本给出来,或者将工程发出来参考

使用特权

评论回复
8
vhuanyou|  楼主 | 2023-5-30 11:42 | 只看该作者
084425 发表于 2023-5-29 10:43
从描述来看,不是你改了驱动就好了,而是你改后根本就没有调这个语句。你在main中直接变量赋值等于这个位 ...

编译无优化,仿真仿真有变量内存分配,会犯这种低级错误?

官方库是没有问题,官方库代码在Visual C++上移植并调试正常。

结论IAR7.2 NODE等级编译问题,其它等级编译优化正常,待其它版本IAR的NODE到时候测试。

使用特权

评论回复
9
084425| | 2023-5-30 22:29 | 只看该作者
vhuanyou 发表于 2023-5-30 11:42
编译无优化,仿真仿真有变量内存分配,会犯这种低级错误?

官方库是没有问题,官方库代码在Visual C++上 ...

IAR版本7.2是吗?BSP 版本是多少?这边也确认一下

使用特权

评论回复
10
vhuanyou|  楼主 | 2023-5-31 09:20 | 只看该作者
084425 发表于 2023-5-30 22:29
IAR版本7.2是吗?BSP 版本是多少?这边也确认一下

最新的版本,\project\at_start_f421\examples\flash\flash_write_read\mdk_v5, 这个目录的工程用IAR7.2替换

使用特权

评论回复
11
vhuanyou|  楼主 | 2023-5-31 09:29 | 只看该作者
084425 发表于 2023-5-30 22:29
IAR版本7.2是吗?BSP 版本是多少?这边也确认一下

IAR 7.2 测试工程附上了,多谢了

AT32F421_FLASH_TEST.zip

8.5 MB

使用特权

评论回复
12
vhuanyou|  楼主 | 2024-9-12 20:05 | 只看该作者
AT32F403A也出现了这个问题,IAR 7.2 工程官方代码读写FLASH就产生了 HardFault_Handler。

使用特权

评论回复
13
vhuanyou|  楼主 | 2024-9-12 20:19 | 只看该作者
为了方便测试用FLASH指针指向一个数组仿真发现测试通过说明IAR没问题,一旦将FLASH指针指向硬件物理地址FLASH就产生HardFault_Handler。当然这个问题通过这个办法if(FLASH->sts & 0x00000001)也可以通过,困扰很长时间了

void main(void)
{
        u8 buf[512]={0};

        flash_type *FLASH=(flash_type *)buf;
       
        if(FLASH->sts_bit.obf != 1); //测试通过
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

61

帖子

1

粉丝