硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2482|回复: 11
收起左侧

[STM32H7] 使能CACHE下载程序收会提示CORTEX_M 报错

[复制链接]

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2019-9-16 19:17:31 | 显示全部楼层 |阅读模式
程序移植了RT_THREAD,在开发板上的MCU是743IIT6,自己的板子是743VIT6,看程序system_stm32h743xx.c和startup_stm32h743xx.s不需要更换,同属于743系列,只是修改了时钟初始化部分和外设部分不开启CACHE的情况话,测试PIN SPI FDCAN功能可正常运行。在743IIT6开启了CACHE程序可以正常运行,在743VIT6中下载程序后会提示程序就飞了,而且再次下载就是显示
14.png 这种情况下只能在板子上电后立即下载程序才能下载程序,不然无法下载。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-9-16 19:46:58 | 显示全部楼层
尝试修改了编译优化等级,还是一样的情况。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2019-9-17 00:15:20 | 显示全部楼层
一般这种诡异的问题,原因往往比较简单,这次估计是你的硬件有问题。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-9-17 08:54:20 | 显示全部楼层
eric2013 发表于 2019-9-17 00:15
一般这种诡异的问题,原因往往比较简单,这次估计是你的硬件有问题。

请问硬汉大佬,这种问题可能是硬件哪里除了问题呢?
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-9-17 12:00:17 | 显示全部楼层
本帖最后由 王海靖 于 2019-9-17 14:21 编辑

系统是RT_THREAD,在系统运行前配置MPU使能CACHE,AXI SRAM作为系统堆使用
  1. int mpu_init(void)
  2. {
  3.     MPU_Region_InitTypeDef MPU_InitStruct;

  4.     /* Disable the MPU */
  5.     HAL_MPU_Disable();

  6.     /* Configure the MPU attributes as WT for AXI SRAM */
  7.     MPU_InitStruct.Enable            = MPU_REGION_ENABLE;
  8.     MPU_InitStruct.BaseAddress       = 0x24000000;
  9.     MPU_InitStruct.Size              = MPU_REGION_SIZE_512KB;
  10.     MPU_InitStruct.AccessPermission  = MPU_REGION_FULL_ACCESS;
  11.     MPU_InitStruct.IsBufferable      = MPU_ACCESS_NOT_BUFFERABLE;
  12.     MPU_InitStruct.IsCacheable       = MPU_ACCESS_CACHEABLE;
  13.     MPU_InitStruct.IsShareable       = MPU_ACCESS_NOT_SHAREABLE;
  14.     MPU_InitStruct.Number            = MPU_REGION_NUMBER0;
  15.     MPU_InitStruct.TypeExtField      = MPU_TEX_LEVEL0;
  16.     MPU_InitStruct.SubRegionDisable  = 0X00;
  17.     MPU_InitStruct.DisableExec       = MPU_INSTRUCTION_ACCESS_ENABLE;

  18.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
  19.    
  20.     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

  21.     return 0;
  22. }
复制代码
如果注释掉24000000部分的MPU配置,程序会隔几分钟跑飞,跑飞不是进入硬错误,MDK直接提示cortex_M错误。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2019-9-17 14:31:32 | 显示全部楼层
王海靖 发表于 2019-9-17 12:00
系统是RT_THREAD,在系统运行前配置MPU使能CACHE,AXI SRAM作为系统堆使用如果注释掉24000000部分的MPU配置 ...

这样的话,就先不跑系统,仅跑个简单的Demo,开Cache是否正常
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-9-17 16:36:54 | 显示全部楼层
eric2013 发表于 2019-9-17 14:31
这样的话,就先不跑系统,仅跑个简单的Demo,开Cache是否正常

裸机开CACHE正常。现在还是上了系统
  1.     MPU_Region_InitTypeDef MPU_InitStruct;

  2.     /* Disable the MPU */
  3.     HAL_MPU_Disable();

  4.     /* Configure the MPU attributes as Device not cacheable
  5.      for ETH DMA descriptors */
  6.     MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  7.     MPU_InitStruct.BaseAddress = 0x30040000;
  8.     MPU_InitStruct.Size = MPU_REGION_SIZE_512B;
  9.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  10.     MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
  11.     MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  12.     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  13.     MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  14.     MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  15.     MPU_InitStruct.SubRegionDisable = 0x00;
  16.     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

  17.     HAL_MPU_ConfigRegion(&MPU_InitStruct);

  18.     /* Configure the MPU attributes as Cacheable write through
  19.      for LwIP RAM heap which contains the Tx buffers */
  20.     MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  21.     MPU_InitStruct.BaseAddress = 0x30044000;
  22.     MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
  23.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  24.     MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  25.     MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  26.     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  27.     MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  28.     MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  29.     MPU_InitStruct.SubRegionDisable = 0x00;
  30.     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

  31.     HAL_MPU_ConfigRegion(&MPU_InitStruct);

  32. //    /* Configure the MPU attributes as WB for AXI SRAM */
  33. //    MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  34. //    MPU_InitStruct.BaseAddress = 0x24000000;
  35. //    MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
  36. //    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  37. //    MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  38. //    MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  39. //    MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  40. //    MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  41. //    MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  42. //    MPU_InitStruct.SubRegionDisable = 0X00;
  43. //    MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

  44. //    HAL_MPU_ConfigRegion(&MPU_InitStruct);

  45.     /* Enable the MPU */
  46.     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

  47.     SCB_EnableICache();

  48.     /* Enable D-Cache---------------------------------------------------------*/
  49.     SCB_EnableDCache();

  50.     return 0;
复制代码
MPU这样配置的情况下,注释了24000000的MPU,程序已经正常运行超过1个小时了

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2019-9-18 00:26:32 | 显示全部楼层
王海靖 发表于 2019-9-17 16:36
裸机开CACHE正常。现在还是上了系统MPU这样配置的情况下,注释了24000000的MPU,程序已经正常运行超过1个 ...

你不配置的话,他有一个上电后的默认Cache属性的
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-9-18 14:07:21 | 显示全部楼层
eric2013 发表于 2019-9-18 00:26
你不配置的话,他有一个上电后的默认Cache属性的

测试了MPU的配置是24040000开始的256K就没问题的。从24000000开始配置多大的都会跑飞
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-9-19 19:33:47 | 显示全部楼层
eric2013 发表于 2019-9-18 00:26
你不配置的话,他有一个上电后的默认Cache属性的

后来经过测试发现,设置为heap的区域不配置mpu就可以。
但是在ZIT6 和 IIT6 把HEAP配置MPU确实没问题的。
回复

使用道具 举报

10

主题

140

回帖

170

积分

初级会员

积分
170
发表于 2019-9-20 09:22:32 | 显示全部楼层
王海靖 发表于 2019-9-19 19:33
后来经过测试发现,设置为heap的区域不配置mpu就可以。
但是在ZIT6 和 IIT6 把HEAP配置MPU确实没问题的 ...

H7最难的地方就是MPU配备,此外RAM太分散了,搞得太麻烦了,BUG查找太耗时间。官方有没有一个综合的文档讲述这方面的问题???
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2019-9-20 10:32:36 | 显示全部楼层
王海靖 发表于 2019-9-19 19:33
后来经过测试发现,设置为heap的区域不配置mpu就可以。
但是在ZIT6 和 IIT6 把HEAP配置MPU确实没问题的 ...

不配置的话,这个是上电后默认的Cache和MPU属性


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 14:36 , Processed in 0.330011 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表