Переписываю по-своему, унылая рутина. Читаю доку на чип, чтоб ни один бит конфигурации не пропустить. Вижу буквально следующее:
Bit 10 WRAPMOD: Wrapped burst mode support.
Defines whether the controller will or not split an AHB burst wrap access into two linear
accesses. Valid only when accessing memories in burst mode
0: Direct wrapped burst is not enabled (default after reset),
1: Direct wrapped burst is enabled.
Note: This bit has no effect as the CPU and DMA cannot generate wrapping burst
transfers.
По-моему, это прекрасно. Не ошибка, не фича, а просто хорошо описанный бит, который никакого функционала не несёт... зато его можно переключить!
Разница между низкоуровневым хардкором и использованием слишком умных библиотек вот в чём. Этот фрагмент написан с использованием прямолинейного доступа к нужным регистрам (стало удобнее, после того как я их правильно описал):
FSMC_BCR1 = ( FSMC_BCR1_MWID_0 | FSMC_BCR1_WREN | FSMC_BCR1_EXTMOD ); /* MWID = 01 (16 bits), MTYP = 00 (SRAM), WREN = 1, EXTMODE = 1 */ FSMC_BTR1 = ( FSMC_BTR_ACCMOD_B ) | ( 0x05 << 8 ) /* DATAST = 0x05, можно настроить точнее */ | ( 0x00 << 4 ) /* ADDHLD = 0x00, не используется в демультиплексированном режиме */ | ( 0x02 ) ; /* ADDSET = 0x02, можно настроить точнее */ FSMC_BWTR1 = ( FSMC_BWTR_ACCMOD_B ) | ( 0x05 << 8 ) /* DATAST = 0x05, можно настроить точнее */ | ( 0x00 << 4 ) /* ADDHLD = 0x00, не используется в демультиплексированном режиме */ | ( 0x02 ) ; /* ADDSET = 0x02, можно настроить точнее */ FSMC_BCR1 |= FSMC_BCR1_MBKEN;
А вот это библиотекчная форма, "скрывающая от программиста тонкости устройства регистров":
fsmc_timing.FSMC_AddressSetupTime = 0x02; //0x01; fsmc_timing.FSMC_AddressHoldTime = 0x00; fsmc_timing.FSMC_DataSetupTime = 0x05; //0x05; fsmc_timing.FSMC_BusTurnAroundDuration = 0x00; fsmc_timing.FSMC_CLKDivision = 0x00; fsmc_timing.FSMC_DataLatency = 0x00; fsmc_timing.FSMC_AccessMode = FSMC_AccessMode_B; fsmc_init.FSMC_Bank = FSMC_Bank1_NORSRAM1; fsmc_init.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; fsmc_init.FSMC_MemoryType = FSMC_MemoryType_NOR; //FSMC_MemoryType_SRAM; fsmc_init.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; fsmc_init.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; fsmc_init.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; fsmc_init.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; fsmc_init.FSMC_WrapMode = FSMC_WrapMode_Disable; fsmc_init.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; fsmc_init.FSMC_WriteOperation = FSMC_WriteOperation_Enable; fsmc_init.FSMC_WaitSignal = FSMC_WaitSignal_Disable; fsmc_init.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; fsmc_init.FSMC_WriteBurst = FSMC_WriteBurst_Disable; fsmc_init.FSMC_ReadWriteTimingStruct = &fsmc_timing; fsmc_init.FSMC_WriteTimingStruct = &fsmc_timing; FSMC_NORSRAMInit(&fsmc_init); /*!< Enable FSMC Bank1_NOR Bank */ FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
Клёво, чо. Я уж молчу про нагромождение неудобочитаемого кода ВНУТРИ этих функций... зато они все такие безопасные, аргументы на валидность проверяют.