(3)Cache配置的选择,优先考虑的是WB,然后是WT和关闭Cache,其中WB和WT的使用中可以配合ARM提供的如下几个函数解决上面说到的隐患问题。但不是万能的,在不起作用的时候,直接暴力选择函数SCB_CleanInvlaidateDCache解决。关于这个问题,在分别配置以太网MAC的描述符缓冲区,发送缓冲区和接收缓冲区时尤其突出。
如果使用了可以使用DMA的SRAM,需要注意开启了CACHE,记得要配置MPU然后选择为MPU_ACCESS_NOT_CACHEABLE不可使用cahe,所以可以将DMA的数据单独指定到另一块SRAM上,然后将该RAM设置为MPU_ACCESS_NOT_CACHEABLE就可以了,否则DMA数据很有可能是不更新的。 开启CACHE的情况下操作内部flash的时候,也要注意清除D-CACHE,否则写...
如果一个存储系统中指令预取时使用的 cache 和数据读写时使用的 cache 是各自独立的,这是称系统使用了独立的 cache,反之则为统一的 cache。Cortex-M7 架构为我们配备了独立的高速指令缓存(I-Cache)和高速数据缓存(D-Cache)。 2.3 Cache line Cache 与主存储器之间以块(cache line)为单位进行数据交换,Cache 在...
DMA不能与DTCM 交互,只能与SRAM进行交互,传输数据,所以建议大家在刚开始使用时将Cache和MPU和DTCM地址先关掉,先使用SRAM地址,后续会说明如何配置Cache和MPU,还有将DMA相关变量搬运至SRAM,其他变量在DTCM上运行。 关于关闭Cache和MPU可以参考我第一期写的文章CubeMX的配置部分STM32H7系列FDCAN配置成经典CAN的经验教程和...
*/voidbsp_Init(void){/* 配置MPU */MPU_Config();/* 使能L1 Cache */CPU_CACHE_Enable();/* STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟: - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。 - 设置NVIV优先级分组为4。
CPU_CACHE_Enable(); /* STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟: - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。 - 设置NVIV优先级分组为4。 */ HAL_Init(); /* 配置系统时钟到400MHz - 切换使用HSE。 - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。
鉴于这个现象和所用芯片,估计是因为Cache使用方面的原因,客户也的确使能了Cache。具体怎么回事呢?我们一起来看看。 我这边使用H743Nucleo板和ST免费的STM32CubeIDE。STM32H743片内有个Vrefint信号,电压一般在1.2v左右,用它做ADC的输入信号来测试。用LPTIM触发ADC转换,每读到5个数据就求个平均值。
指令Cache开启。配置了AXI SRAM区(本例子未用AXI SRAM,FMC的扩展IO区。 代码语言:javascript 代码运行次数0 运行 AI代码解释 /* *** * 函数名: MPU_Config* 功能说明: 配置MPU * 形 : 无 * 返回值: 无 *** */ static voidMPU_Config( void ) { MPURegion_InitTypeDef MPUInitStruct; /* 禁止...
1.Cache一致性 使用D-Cache时需手动维护数据一致性,可通过 SCB_InvalidateDCache_by_Addr() 清除缓存 ;2.传输方向限制 存储器到存储器模式不支持循环传输,且必须启用FIFO ;3.中断优先级 高频率DMA传输需设置合理的中断优先级,避免阻塞关键任务;4.资源冲突检测 同一DMA流的多个通道需通过仲裁器协调,避免总线...