你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H7 DCACHE日狗了

[复制链接]
紫暮凝雨 提问时间:2018-4-22 17:33 /
当开启了Dcache后,使用DMA循环模式传输ADC的值,结果出现了只要一读数组中的值,如ADC_buff[200],只要做i = ADC_buff[160];立马ADC_buff[160]到ADC_buff[175]都会是0,就像ADC的值不再往里面传了一样,关闭Dcache或者不读值,接收正常,这不是日了狗了吗?Dcache这么难用,而且用Cube开启MPU,立马Hardfault,唉。程序如下:
ALIGN_32BYTES (static uint16_t   aADCxConvertedData[192]);int main(void){  SCB_EnableICache();  SCB_EnableDCache();  HAL_Init();  SystemClock_Config();  MX_GPIO_Init();  MX_DMA_Init();  MX_USART3_UART_Init();  MX_ADC1_Init();  MX_TIM2_Init();  if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)  {    Error_Handler();  }  HAL_Delay(500);  HAL_ADC_Start_DMA(&hadc1,(uint32_t *)aADCxConvertedData,192);  HAL_TIM_Base_Start(&htim2);  while (1)  {     i = aADCxConvertedData[160];        i++;        HAL_Delay(500);  }}
QQ截图20180422172604.jpg 图1:开启Dcache,ADC的DMA循环传输一个端口的ADC值,只要一读立马附近都GG。

2.jpg 图2:开启Dcache,不读ADC的值(注释掉i = ADC_buff[160]),一切正常。
各位大神,求教,就究竟怎么了,而且,官方的例程,也开启了Dcache,读值,没问题可以!!!反复看了N遍,除了用的端口不一样,其他配置一模一样,Cube配置的。有这么日狗的事情吗?真想咋了这板子的心都有了,原谅我菜




收藏 评论8 发布时间:2018-4-22 17:33

举报

8个回答
紫暮凝雨 回答时间:2018-4-22 17:34:54
  1. ALIGN_32BYTES (static uint16_t   aADCxConvertedData[192]);

  2. int main(void)
  3. {
  4.   SCB_EnableICache();
  5.   SCB_EnableDCache();
  6.   HAL_Init();
  7.   SystemClock_Config();
  8.   MX_GPIO_Init();
  9.   MX_DMA_Init();
  10.   MX_USART3_UART_Init();
  11.   MX_ADC1_Init();
  12.   MX_TIM2_Init();
  13.   if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
  14.   {
  15.     Error_Handler();
  16.   }
  17.   HAL_Delay(500);
  18.   HAL_ADC_Start_DMA(&hadc1,(uint32_t *)aADCxConvertedData,192);
  19.   HAL_TIM_Base_Start(&htim2);
  20.   while (1)
  21.   {
  22.                 i++;
  23.                 HAL_Delay(500);
  24.   }
复制代码
springvirus 回答时间:2018-4-23 16:25:22
论坛bug吗,文字超出了显示区域
smallcsduck 回答时间:2018-4-23 17:30:57
不是板子问题 是你真的菜
你要用dcache首先就要保证dcache和ram里的数据都一样的
你用dma接受数据 这个操作是不通过cpu的
简单的说就是dma改变了ram里的数据 但是cpu不知道 还以为ram数据是他缓存在dcache里的 cpu操作的还是dcache里的数据 能不出错么?
你cpu在读dma传输的数据的时候 加上dcahce刷新指令 自己去查CMSISI接口里的函数 ARM都提供给你了

评分

参与人数 2ST金币 +1 蝴蝶豆 +3 收起 理由
happyavr128 + 1 很给力!
zero99 + 3

查看全部评分

紫暮凝雨 回答时间:2018-5-27 15:36:02
smallcsduck 发表于 2018-4-23 17:30
不是板子问题 是你真的菜
你要用dcache首先就要保证dcache和ram里的数据都一样的
你用dma接受数据 这个操 ...

请问您用过的刷新指令是什么?
紫暮凝雨 回答时间:2018-5-27 15:40:04
smallcsduck 发表于 2018-4-23 17:30
不是板子问题 是你真的菜
你要用dcache首先就要保证dcache和ram里的数据都一样的
你用dma接受数据 这个操 ...

或者在哪里可以查到CMSIS指令的解释呢?
smallcsduck 回答时间:2018-6-12 02:38:39
紫暮凝雨 发表于 2018-5-27 15:36
请问您用过的刷新指令是什么?

ARM Cortex-M7 Devices
Generic User Guide
fgh1.png
Love_ST 回答时间:2019-11-12 09:49:02
楼主请教一下,我现在使用ADC+DMA双缓冲对一个信号进行采样,然后我把数据读取出来发现一直不正确,我降低采样率就行,我现在就是怀疑是CACHE的问题,但是按照我的方式改了CACHE还是不管用呀!请问一下,如何才能关闭CACHE呢?
2019-11-12 094819.png
紫暮凝雨 回答时间:2020-1-24 02:19:41
mvvm 发表于 2019-11-12 09:49
楼主请教一下,我现在使用ADC+DMA双缓冲对一个信号进行采样,然后我把数据读取出来发现一直不正确,我降低 ...

直接使用库函数提供的对应函数关闭,如果是CubeMX配置的,直接在CUBEMX中关闭

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版