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 保护还没有进行任何设置
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
26条回答
lusson
1楼-- · 2019-12-26 18:18
hpdell 发表于 2017-3-30 14:11
你好,我现在的 sd 也是没有使用dma

不知道你的接收失败是什么失败?
hpdell
2楼-- · 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;                                 // 接收完成标志职位       
                }       
}
lusson
3楼-- · 2019-12-27 04:18
 精彩回答 2  元偷偷看……
hpdell
4楼-- · 2019-12-27 07:03
lusson 发表于 2017-3-30 14:52
%s,数据不会是0x00开头了吧。不是可以调试吗?直接在这个地方打断点看看啊 ...

因为我使用上位机发送的是字符,所以输出的也是字符,这个程序在以前的其他芯片上使用过,是没有问题的,

现在也不知道是怎么回事,每次仿真,iar 编译器就停止了,哎,悲催
lusson
5楼-- · 2019-12-27 12:41
加了cache的话,在使用DMA的数据前加上  SCB_InvalidateDCache_by_Addr((u32*)addr, size);试试看。
hpdell
6楼-- · 2019-12-27 13:29
本帖最后由 hpdell 于 2017-3-30 19:10 编辑
lusson 发表于 2017-3-30 16:02
加了cache的话,在使用DMA的数据前加上  SCB_InvalidateDCache_by_Addr((u32*)addr, size);试试看。 ...


你好,

只找到这个函数
/**
  rief   Clean & Invalidate D-Cache
  details Cleans and Invalidates D-Cache
  */
__STATIC_INLINE void SCB_CleanInvalidateDCache (void)
{
  #if (__DCACHE_PRESENT == 1U)
    uint32_t ccsidr;
    uint32_t sets;
    uint32_t ways;

    SCB->CSSELR = (0U << 1U) | 0U;          /* Level 1 data cache */
    __DSB();

    ccsidr = SCB->CCSIDR;

                                            /* clean & invalidate D-Cache */
    sets = (uint32_t)(CCSIDR_SETS(ccsidr));
    do {
      ways = (uint32_t)(CCSIDR_WAYS(ccsidr));
      do {
        SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) |
                       ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk)  );
        #if defined ( __CC_ARM )
          __schedule_barrier();
        #endif
      } while (ways--);
    } while(sets--);

    __DSB();
    __ISB();
  #endif
}


没有找到你所说的函数




仿真仿着放着就出现如下图片的内容:

14.png (7.97 KB, 下载次数: 0)

下载附件

2017-3-30 19:09 上传



我发送了40个Byte, 再加上回车换行,总共应该是 42个Byte,但是接收到的数据就是没有内容





一周热门 更多>