STM32H7 DCACHE日狗了
当开启了Dcache后,使用DMA循环模式传输ADC的值,结果出现了只要一读数组中的值,如ADC_buff,只要做i = ADC_buff;立马ADC_buff到ADC_buff都会是0,就像ADC的值不再往里面传了一样,关闭Dcache或者不读值,接收正常,这不是日了狗了吗?Dcache这么难用,而且用Cube开启MPU,立马Hardfault,唉。程序如下:ALIGN_32BYTES (static uint16_t aADCxConvertedData);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; i++; HAL_Delay(500);}}
图1:开启Dcache,ADC的DMA循环传输一个端口的ADC值,只要一读立马附近都GG。
图2:开启Dcache,不读ADC的值(注释掉i = ADC_buff),一切正常。
各位大神,求教,就究竟怎么了,而且,官方的例程,也开启了Dcache,读值,没问题可以!!!反复看了N遍,除了用的端口不一样,其他配置一模一样,Cube配置的。有这么日狗的事情吗?真想咋了这板子的心都有了,原谅我菜
ALIGN_32BYTES (static uint16_t aADCxConvertedData);
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++;
HAL_Delay(500);
}
论坛bug吗,文字超出了显示区域 不是板子问题 是你真的菜
你要用dcache首先就要保证dcache和ram里的数据都一样的
你用dma接受数据 这个操作是不通过cpu的
简单的说就是dma改变了ram里的数据 但是cpu不知道 还以为ram数据是他缓存在dcache里的 cpu操作的还是dcache里的数据 能不出错么?
你cpu在读dma传输的数据的时候 加上dcahce刷新指令 自己去查CMSISI接口里的函数 ARM都提供给你了
smallcsduck 发表于 2018-4-23 17:30
不是板子问题 是你真的菜
你要用dcache首先就要保证dcache和ram里的数据都一样的
你用dma接受数据 这个操 ...
请问您用过的刷新指令是什么? smallcsduck 发表于 2018-4-23 17:30
不是板子问题 是你真的菜
你要用dcache首先就要保证dcache和ram里的数据都一样的
你用dma接受数据 这个操 ...
或者在哪里可以查到CMSIS指令的解释呢? 紫暮凝雨 发表于 2018-5-27 15:36
请问您用过的刷新指令是什么?
ARM Cortex-M7 Devices
Generic User Guide
楼主请教一下,我现在使用ADC+DMA双缓冲对一个信号进行采样,然后我把数据读取出来发现一直不正确,我降低采样率就行,我现在就是怀疑是CACHE的问题,但是按照我的方式改了CACHE还是不管用呀!:'(请问一下,如何才能关闭CACHE呢? mvvm 发表于 2019-11-12 09:49
楼主请教一下,我现在使用ADC+DMA双缓冲对一个信号进行采样,然后我把数据读取出来发现一直不正确,我降低 ...
直接使用库函数提供的对应函数关闭,如果是CubeMX配置的,直接在CUBEMX中关闭
页:
[1]