stm32F7,开启 cache 后,uart+idl+dma 接收失败?

2019-12-25 18:49发布

本帖最后由 hpdell 于 2017-3-30 12:05 编辑

F7的单片机,开启 cache 后,uart-idl+dma接收不到数据,中断可以进入,

SCB_EnableICache();   //使能I-Cache
SCB_EnableDCache();   //使能D-Cache    后,

使用usart+dma 接收就不行
屏蔽后uart+dam可以,但sd卡又不行

该如何处理啊 ??

sd卡使用 查询模式,

感觉这个f7的 cache 使用起来很麻烦,

其他的 mpu 保护还没有进行任何设置
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
27条回答
hpdell
2019-12-26 23:28
lusson 发表于 2017-3-30 14:18
不知道你的接收失败是什么失败?

可以进入 uart idl 空闲中断里面,接收到的数据字节数是对的,

相关代码如下:


/* 此函数需要在主循环中调用 */
void USART1_DMA_IDLE_TEST(void)
{
        if(g_tUsart1.RxCompleteFlag ==1)
        {
//                printf(" g_tUsart1.RxCnt = %d ",g_tUsart1.RxCnt);   // 这个地方输出接收到的字节数与发送的字节数目完全一致
               
                printf("%s" ,  g_tUsart1.RxBuff);                        // 这个地方是吧接收到的数据 发回到电脑显示,但是这个地方木有内容输出 ?????????????????问题就在此处

                g_tUsart1.RxCnt=0;
                g_tUsart1.RxCompleteFlag=0;
        }
        HAL_UART_Receive_DMA(&huart1,g_tUsart1.RxBuff,USART1_MAX_RX_SIZE);

}


// 中断函数
void USART1_IRQHandler(void)
{
                uint32_t tmp_flag = 0;
                uint32_t temp;
   
                tmp_flag =  __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE);
                if((tmp_flag != RESET))
                {
                                __HAL_UART_CLEAR_IDLEFLAG(&huart1);
        
        //先读SR后读DR清除Idle
                                temp = huart1.Instance->ISR;  
                                temp = huart1.Instance->RDR;
                                HAL_UART_DMAStop(&huart1);
                                temp  = hdma_usart1_rx.Instance->NDTR;
                                g_tUsart1.RxCnt =  USART1_MAX_RX_SIZE - temp;
        //                  printf(" g_tUsart1.RxCnt = %d",g_tUsart1.RxCnt);                        // test user
                                g_tUsart1.RxCompleteFlag = 1;                                 // 接收完成标志职位       
                }       
}

一周热门 更多>