硬汉嵌入式论坛

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

[STM32H7] HAL_DMA_Start_IT多次存储到一个内存,不能正常存储

[复制链接]

16

主题

18

回帖

66

积分

初级会员

积分
66
发表于 2021-10-31 18:36:31 | 显示全部楼层 |阅读模式
我用定时器触发DMA去搬运GPIO的寄存器里的数据。DMA处于NORMAL模式,方向为外设到内存,定时器触发。
搬运一次数据可以正常搬运,可是搬运第二次时,如果再次指定同一片地址,那么数据不会存入。但是如果换一片存储区就可以正常存储,但是也不能被指定第二次。
同时发现,关闭cache可以正常采集。问题应该在cache,但是不知道如何处理。

程序如下:

__attribute__((section(".RAM_D2"))) uint16_t adc_buff[100];
__attribute__((section(".RAM_D2"))) uint16_t adc_buff2[100];

比如这样采集,第二次的采集可以正常运行,但是adc_buff里面的数据没有更新,还是第一次采集到的数据
  HAL_DMA_Start_IT(htim4.hdma[TIM_DMA_ID_UPDATE], (uint32_t)(&GPIOD->IDR), (uint32_t)adc_buff, sizeof(adc_buff) / sizeof(adc_buff[0]));//此一次采集正常

...
  HAL_DMA_Start_IT(htim4.hdma[TIM_DMA_ID_UPDATE], (uint32_t)(&GPIOD->IDR), (uint32_t)adc_buff, sizeof(adc_buff) / sizeof(adc_buff[0]));//第二次采集能运行,甚至进入中断,但是没有更新数据

这样就可以正常采集,但是每片区域也不能存放第二次
  HAL_DMA_Start_IT(htim4.hdma[TIM_DMA_ID_UPDATE], (uint32_t)(&GPIOD->IDR), (uint32_t)adc_buff, sizeof(adc_buff) / sizeof(adc_buff[0]));//此一次采集正常
...
  HAL_DMA_Start_IT(htim4.hdma[TIM_DMA_ID_UPDATE], (uint32_t)(&GPIOD->IDR), (uint32_t)adc_buff2, sizeof(adc_buff2) / sizeof(adc_buff2[0]));//第二次采集正常



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2021-11-1 00:17:32 | 显示全部楼层
直接关闭使用的RAM控件的读Cache和写Cache即可,也就是下面帖子里面的最低性能配置。

使用STM32H7的AXI SRAM,SRAM1到SRAM4对应的Cache最高性能和最低性能配置
http://www.armbbs.cn/forum.php?m ... id=99322&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 16:15 , Processed in 0.235950 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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