搜索
查看: 7178|回复: 8

[已解决] STM32H7 DCACHE日狗了

[复制链接]

该用户从未签到

1

主题

7

帖子

0

蝴蝶豆

初级会员

最后登录
2020-1-24
发表于 2018-4-22 17:33:57 | 显示全部楼层 |阅读模式
当开启了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配置的。有这么日狗的事情吗?真想咋了这板子的心都有了,原谅我菜




回复

使用道具 举报

该用户从未签到

1

主题

7

帖子

0

蝴蝶豆

初级会员

最后登录
2020-1-24
 楼主| 发表于 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.   }
复制代码
回复 支持 反对

使用道具 举报

该用户从未签到

13

主题

805

帖子

60

蝴蝶豆

金牌会员

最后登录
2023-1-18
发表于 2018-4-23 16:25:22 | 显示全部楼层

回帖奖励 +1 ST金币

论坛bug吗,文字超出了显示区域
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

50

帖子

29

蝴蝶豆

中级会员

最后登录
2018-8-25
发表于 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

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

7

帖子

0

蝴蝶豆

初级会员

最后登录
2020-1-24
 楼主| 发表于 2018-5-27 15:36:02 | 显示全部楼层
smallcsduck 发表于 2018-4-23 17:30
不是板子问题 是你真的菜
你要用dcache首先就要保证dcache和ram里的数据都一样的
你用dma接受数据 这个操 ...

请问您用过的刷新指令是什么?
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

7

帖子

0

蝴蝶豆

初级会员

最后登录
2020-1-24
 楼主| 发表于 2018-5-27 15:40:04 | 显示全部楼层
smallcsduck 发表于 2018-4-23 17:30
不是板子问题 是你真的菜
你要用dcache首先就要保证dcache和ram里的数据都一样的
你用dma接受数据 这个操 ...

或者在哪里可以查到CMSIS指令的解释呢?
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

50

帖子

29

蝴蝶豆

中级会员

最后登录
2018-8-25
发表于 2018-6-12 02:38:39 | 显示全部楼层
紫暮凝雨 发表于 2018-5-27 15:36
请问您用过的刷新指令是什么?

ARM Cortex-M7 Devices
Generic User Guide
fgh1.png
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

53

帖子

3

蝴蝶豆

中级会员

最后登录
2021-10-29
发表于 2019-11-12 09:49:02 | 显示全部楼层
楼主请教一下,我现在使用ADC+DMA双缓冲对一个信号进行采样,然后我把数据读取出来发现一直不正确,我降低采样率就行,我现在就是怀疑是CACHE的问题,但是按照我的方式改了CACHE还是不管用呀!请问一下,如何才能关闭CACHE呢?
2019-11-12 094819.png
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

7

帖子

0

蝴蝶豆

初级会员

最后登录
2020-1-24
 楼主| 发表于 2020-1-24 02:19:41 | 显示全部楼层
mvvm 发表于 2019-11-12 09:49
楼主请教一下,我现在使用ADC+DMA双缓冲对一个信号进行采样,然后我把数据读取出来发现一直不正确,我降低 ...

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

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-26 01:57 , Processed in 0.196333 second(s), 45 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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