打印
[STM32H7]

求H7的MPU配置进

[复制链接]
3888|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xiaofei558008 于 2021-7-20 11:26 编辑

最近使用H7都很顺手,除了MPU配置弄的有点不顺,使用了很多RAM,有些是专门计算,有些是采集数据需要DMA,USB等外设;
实际使用的是MPU老是配不对; 开Cache是为了加速计算,因此Cache肯定要开,不然影响效率、功耗(低功耗产品需要快速计算、休眠);

AXI RAM 128K打算用来DMA传输数据;这部分MPU配置不开启cache;
RAM shared between ITCM and AXI RAM 用来存储144K中间计算数据和默认全局、静态变量的存放,因此需要开cache;
DTCM 128K用来存储中间数据,stack、heap,


现在配置了AXI RAM 128K,后USB就不能正常工作了;关闭全局Dcache,USB 就可以正常工作;尝试将默认全局、静态变量的存放都放在128K的AXI RAM中,USB也不能工作起来;
en.DM00237416.pdf (5.11 MB)


感觉上面的文档也说的不是很清楚;我就算把AXI RAM 128K的
TEX C B S

位全设置成0,貌似USB也不能工作起来。

想想,继续把USB外设0x40040000开始的128K空间的
TEX C B S
MPU也配置成全0,USB也还是不能工作;




CubeMx配置如下:




现在没辙了,求大侠出手救场~~不胜感谢!












使用特权

评论回复
沙发
香水城| | 2021-7-23 15:34 | 只看该作者
本帖最后由 香水城 于 2021-7-23 16:01 编辑

你把AXI RAM 128K这块配置成透写属性[WT]会怎么样呢?
STM32 DMA应用中的几个常见问题@4、跟DCache有关的问题

使用特权

评论回复
板凳
xiaofei558008|  楼主 | 2021-7-26 06:49 | 只看该作者
尝试了很多种方法,就算同一份代码,不同时候,还出现有时能识别,有时又不能识别的情况:

解决如下:
1、配置 .icf 文件把USB相关的全局变量,全放在不开cache的 RAM空间(我用128K的AXI RAM来存)
2、cube 配置里关闭两个cache,外设初始化结束后,再手工开启两个cache;

另外,同一份代码,rebuild all 和单独编译main.c,表现结果不一样,偶尔能工作偶尔不能工作,usb 重新擦拔也会影响usb cdc 是否能识别;
操作步骤:
1)、擦除整片,下电,usb拔掉;
2)、工程先clean一下,再全部重新编译;
3)、下载,再上电;
4)、上电后,再插usb,这个时候usb工作正常;

上述步骤实际测试,比较靠谱,usb稳定工作,外设工作都正常,算法计算结果输出正确;



使用特权

评论回复
地板
xiaofei558008|  楼主 | 2021-7-26 06:51 | 只看该作者
尝试了很多种:
解决如下:
1、配置 .icf 文件把USB相关的全局变量全放在不开cache的 RAM空间
2、cube 配置里关闭两个cache,初始化结束后再手工开启两个cache;

另外,同一份代码,rebuild all 和单独编译main.c,表现结果不一样,偶尔能工作偶尔不能工作,usb 重新擦拔也会影响usb cdc 是否能识别;
操作步骤:
1)、擦除整片,下电,usb拔掉;
2)、工程先clean一下,再全部重新编译;
3)、下载,再上电;
4)、上电后,再插usb,这个时候usb工作正常;

上述步骤实际测试,比较靠谱;

使用特权

评论回复
5
xiaofei558008|  楼主 | 2021-7-27 16:48 | 只看该作者
uint8_t UserRxBuffer[APP_RX_DATA_SIZE] @ "RAM128K" = {0};/* Received Data over USB are stored in this buffer */
uint8_t UserTxBuffer[APP_TX_DATA_SIZE] @ "RAM128K" = {0};/* Received Data over UART (CDC interface) are stored in this buffer */
uint16_t g_UsbRxLen @ "RAM128K" = {0};                                                                         //usb接收PC发送的数据长度


icfw文件:
define region RAM128K_region  = mem:[from __ICFEDIT_region_RAM128K_start__   to __ICFEDIT_region_RAM128K_end__];
place in RAM128K_region     {section RAM128K};

使用特权

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

本版积分规则

137

主题

971

帖子

13

粉丝