MX_Master 1 5 марта, 2019 Опубликовано 5 марта, 2019 · Жалоба А тактирование SRAM1 в F722 включается отдельно? А то я помню тоже перенёс один из буферов в ранее не используемый блок SRAM. И удивлялся битым данным после записи. Пока принудительно не включил тактирование этого блока. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 5 марта, 2019 Опубликовано 5 марта, 2019 · Жалоба В RCC_AHB1ENR есть только включение DTCM, но оно по умолчанию стоит включено. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UniSoft 15 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба Всем спасибо, проблему решил. Избавился полностью от 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба Модель ситуации: стартап заполнил нулями bss… оно частично осело в кэше данных. Выполнчете чтение, потом clean кэша - поверх только что считанных данных ложится то что в память буфера писалось. Оно модет и само - при недостатке строк в кэше для новых данных. Потому чистим ДО. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба 5 minutes ago, GenaSPB said: Модель ситуации: стартап заполнил нулями bss… оно частично осело в кэше данных. Выполнчете чтение, потом clean кэша - поверх только что считанных данных ложится то что в память буфера писалось. Оно модет и само - при недостатке строк в кэше для новых данных. Потому чистим ДО. В коде ТС используется Invalidate, а не Clean. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба без разницы в данном случае. после завершения DMA операции кэш может выгрузится поверх свежесчитанных данных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UniSoft 15 7 марта, 2019 Опубликовано 7 марта, 2019 · Жалоба On 3/6/2019 at 8:30 PM, GenaSPB said: Модель ситуации: стартап заполнил нулями bss… оно частично осело в кэше данных. Выполнчете чтение, потом clean кэша - поверх только что считанных данных ложится то что в память буфера писалось. Оно модет и само - при недостатке строк в кэше для новых данных. Потому чистим ДО. Интересное объяснение. И что-то в этом есть... но ведь стартап и инициализация памяти выполняется до входа в main, а D-кэш включается именно в начале main. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 7 марта, 2019 Опубликовано 7 марта, 2019 · Жалоба Вы сомневаетесь... у меня пока других объяснений нет для вас. В работающей системе иной порядок приводит к сбоям. В системе и чтения и записи. Ну проект видели - запись звука через fatfs. Это работает и на h7 и на renesas cortex-a9. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nicks1980 0 8 марта, 2019 Опубликовано 8 марта, 2019 (изменено) · Жалоба Вот 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 смотри может ли память с этой периферией работать Изменено 8 марта, 2019 пользователем nicks1980 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться