本帖最后由 sonicll 于 2017-10-17 14:39 编辑
今天发现了一个关于开启F7 L1-cache导致DMA数据不更新的问题,电路板使用的是正点原子的apollo开发板,核心板是STM32F767IGT6,程序代码非常简单,使用cubeMX生成代码,开启USART1,使能DMA收发,循环发送指定的字符串,代码如下:
char DataBuffer[64] = {"1234567\r\n"};
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* Enable I-Cache-------------------------------------------------------------*/
SCB_EnableICache();
/* Enable D-Cache-------------------------------------------------------------*/
SCB_EnableDCache();
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
sprintf(DataBuffer, "ABCDEFG\r\n");
while(huart1.gState != HAL_UART_STATE_READY);
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)DataBuffer, strlen(DataBuffer));
HAL_Delay(200);
}
/* USER CODE END 3 */
}
运行结果是USART1循环发送1234567,而不是ABCDEFG。仿真状态下单步调试,能看到DataBuffer里的数据是ABCDEFG,但是实际发送的却是初始值1234567。只要把前面开启D-cache的语句屏蔽掉,运行结果就能正常发送ABCDEFG。看起来似乎是D-cache缓存了DataBuffer的初始值,但是没有按照sprintf语句更新数据。请手头上有F7板子的朋友测试一下,看看是不是这样?如果测试结果确实是这样,应该怎么操作才能既开启cache,又能正常更新数据呢?
编译环境是MDK5.22,代码优化等级为0
刚才又测试了一下,似乎和内存地址有关系,如果程序默认内存地址设置为0x20020000开始,即运行于SRAM1,才会出现这种现象。如果默认内存地址为0x20000000开始,即运行于DTCM,结果是正常的,开启D-cache也不会有问题。这下晕了,求高手解答
|