Перейти к содержанию
    

А тактирование SRAM1 в F722 включается отдельно? А то я помню тоже перенёс один из буферов в ранее не используемый блок SRAM. И удивлялся битым данным после записи. Пока принудительно не включил тактирование этого блока. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В RCC_AHB1ENR есть только включение DTCM, но оно по умолчанию стоит включено.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо, проблему решил.

Избавился полностью от HAL, надергал функции в свой файл, что-то убрал, что-то оптимизировал, в общем весь драйвер получился в одном файле.

Сначала правда тоже не работало, но как только раскомментировал очистку кэша до чтения (которую ранее пробовал и закомментировал, так как не помогало), так сразу все и заработало.

Так что @GenaSPB был прав, нужна очистка кэша до вызова процедуры чтения, хоть и выглядит это совершенно нелогично.  Как только ее убираю, перестает работать.

И почему об этот нет никакого упоминания в примерах, а код частично брался как раз из них (с самого последнего - STM32Cube_FW_F7_V1.15.0), и там еще есть косяки

ну например, найдите ошибку

          timer = osKernelSysTick() + SD_TIMEOUT;
          /* block until SDIO IP is ready or a timeout occur */
          while(timer > osKernelSysTick())
          {
            if (BSP_SD_GetCardState() == SD_TRANSFER_OK)
            {
              res = RES_OK;
              break;
            }
          }

Ну во первых так писать категорически нельзя (хотя и довольно часто такое видел, и в HAL такое тоже есть)

ведь при "osKernelSysTick() + SD_TIMEOUT" возможно переполнение..

ну да ладно, косяк не в этом, а в osKernelSysTick(), в дебрях RTX5 это:

#define  osKernelSysTick osKernelGetSysTimerCount

И функция osKernelGetSysTimerCount() возвращает далеко не SysTick и не время в миллисекундах, а как видно по имени скорее время в тактах SysTick таймера,

а вот SD_TIMEOUT время в миллисекундах, таким образом этот цикл в моем случае крутился менее 1/20 ms.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Модель ситуации: стартап заполнил нулями bss… оно частично осело в кэше данных. Выполнчете чтение, потом clean кэша - поверх только что считанных данных ложится то что в память буфера писалось. Оно модет и само - при недостатке строк в кэше для новых данных. Потому чистим ДО.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, GenaSPB said:

Модель ситуации: стартап заполнил нулями bss… оно частично осело в кэше данных. Выполнчете чтение, потом clean кэша - поверх только что считанных данных ложится то что в память буфера писалось. Оно модет и само - при недостатке строк в кэше для новых данных. Потому чистим ДО.

В коде ТС используется Invalidate, а не Clean.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

без разницы в данном случае. после завершения DMA операции кэш может выгрузится поверх свежесчитанных данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/6/2019 at 8:30 PM, GenaSPB said:

Модель ситуации: стартап заполнил нулями bss… оно частично осело в кэше данных. Выполнчете чтение, потом clean кэша - поверх только что считанных данных ложится то что в память буфера писалось. Оно модет и само - при недостатке строк в кэше для новых данных. Потому чистим ДО.

Интересное объяснение. И что-то в этом есть...

но ведь стартап и инициализация памяти выполняется до входа в main, а D-кэш включается именно в начале main.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы сомневаетесь... у меня пока других объяснений нет для вас. В работающей системе иной порядок приводит к сбоям. В системе и чтения и записи. Ну проект видели - запись звука через fatfs. Это работает и на h7  и на renesas cortex-a9. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот ARM6 scater KEIL

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00200000  
{    ; load region size_region
  ER_IROM1 0x08000000 0x00200000 
  {  ; load address = execution address
     *.o (RESET, +First)
     *(InRoot$$Sections)
      .ANY (+RO)
      .ANY (+XO)
  }
  RW_ITCM_RAM 0x00000000 0x00010000  
  {  ;  ITCM_RAM (64K)  accessible  only core and MDMA (even in sleep mode ) max speed 400mhz
     ; D1 domain
      *(.ITCM_RAM)
  }
  RW_DTCM_RAM 0x20000000 0x00020000  
  { ; DTCM_RAM (128K)  accessible  only core and MDMA  max speed 400mhz
    ; D1 domain
   *(.DTCM_RAM)
    .ANY (+RW +ZI)
  }
  RW_AXI_SRAM 0x24000000 0x00080000
  { ; AXI_SRAM  (512k) cpu and D1 and D2 domain acces not D3 accces max speed 200mhz
   *(.AXI_SRAM)
  }
  RW_SRAM1 0x30000000 0x00020000
  { ; 128k  in D2 , cpu D1 and D2 (max speed 200mhz)
   *(.SRAM1)
  }
  RW_SRAM2 0x30020000 0x00020000
  { ; 128k  in D2 , cpu D1 and D2 (max speed 200mhz)
   *(.SRAM2)
  }
  RW_SRAM3 0x30040000 0x00008000
  {  ; 32k   in D2 , cpu D1 and D2 (max speed 200mhz)
      *(.SRAM3)
  }
  RW_SRAM4 0x38000000 0x00010000
  {  ; 64k  in D3, cpu MDMA D1 D3 (max speed 200mhz)
      *(.SRAM4)
  }
  RW_BACKUP_SRAM 0x38800000 0x00001000
  {  ; 4k  in D3, cpu SMMC1 DMA2D LTDC (max speed 200mhz)
      *(.BACKUP_SRAM)
  }    
}
#define ALIGN32_SIZE(SIZE_ALIGN)    (((SIZE_ALIGN+31)/32)*32)

ALIGN_32BYTES(volatile uint8_t Sd_pReadDMABuffer[ALIGN32_SIZE(512)]           __attribute__((section(".SRAM4"))));
ALIGN_32BYTES(volatile uint8_t Sd_pWriteDMABuffer[ALIGN32_SIZE(512)]          __attribute__((section(".SRAM4"))));
ALIGN_32BYTES(volatile uint8_t Sd_pWriteDMABufferDummy0xFF[ALIGN32_SIZE(512)] __attribute__((section(".SRAM4"))));

    memset((void *)Sd_pWriteDMABufferDummy0xFF,0xFF,512); /// Dummy for reading
    HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 14, 0);
    HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn);
    ///DMA1_Stream5_IRQn interrupt configuration
    HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 14, 0);
    HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);    
    HAL_NVIC_SetPriority(SPI3_IRQn, 14, 0);
    HAL_NVIC_EnableIRQ(SPI3_IRQn);

void SPI3_IRQHandler(void)
{
    if(SD_TaskDMANotifyTx)
    {
        printf("SD_TaskDMANotifyTx\n\r");
        BaseType_t xHigherPriorityTaskWoken = pdFALSE;
        vTaskNotifyGiveFromISR( SD_TaskDMANotifyTx, &xHigherPriorityTaskWoken );
        portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); /// speed up;        
        SD_TaskDMANotifyTx = NULL;
    }
    if(SD_TaskDMANotifyRx)
    {
        printf("SD_TaskDMANotifyRx\n\r");
        BaseType_t xHigherPriorityTaskWoken = pdFALSE;
        vTaskNotifyGiveFromISR( SD_TaskDMANotifyRx, &xHigherPriorityTaskWoken );
        portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); /// speed up;        
        SD_TaskDMANotifyRx = NULL;
    }    
    HAL_SPI_IRQHandler(&hspi3);    
}


uint8_t Sd_WriteDma(uint8_t *pSrc,uint16_t Count)
{    
    //printf("Sd_WriteDma\n\r");    
    SD_TaskDMANotifyTx = xTaskGetCurrentTaskHandle();
    memcpy((void*)Sd_pWriteDMABuffer,(void*)pSrc,Count);
    SCB_CleanDCache_by_Addr ((uint32_t *)Sd_pWriteDMABuffer,ALIGN32_SIZE(Count));
    HAL_SPI_TransmitReceive_DMA(&hspi3,(uint8_t *) Sd_pWriteDMABuffer,(uint8_t *) Sd_pReadDMABuffer,Count);    
    ulTaskNotifyTake(pdTRUE,500);
    return 0;
}

uint8_t Sd_ReadDma(uint8_t *pDest,uint16_t Count)
{
    printf("Sd_ReadDma\n\r");
    SD_TaskDMANotifyRx = xTaskGetCurrentTaskHandle();
    SCB_CleanDCache_by_Addr ((uint32_t *)Sd_pWriteDMABufferDummy0xFF,ALIGN32_SIZE(Count));    
    HAL_SPI_TransmitReceive_DMA(&hspi3,(uint8_t *) Sd_pWriteDMABufferDummy0xFF,(uint8_t *)Sd_pReadDMABuffer,Count);    
    ulTaskNotifyTake(pdTRUE,500);
    SCB_InvalidateDCache_by_Addr((uint32_t *)Sd_pReadDMABuffer,ALIGN32_SIZE(Count));
    memcpy((void*)pDest,(void*)Sd_pReadDMABuffer,Count);
    return 0;
}

Вот так, ось можно выкинуть.Тесты все проходят с потоками.

Только общение по SPI. на SDIO другая флешка висит до нее руки еще не дошли.

при распределении памяти под dma смотри может ли память с этой периферией работать

Изменено пользователем nicks1980

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...