‮Сдвиг по фазе (kincajou) wrote,
‮Сдвиг по фазе
kincajou

Официальная документация ;)

Столкнулся с тем, что "штатный" вариант описания регистров модуля FSMC не слишком-то удобен - он рассчитан под библиотечные функции, оборачивающие доступ к этим регистрам в свои вызовы... мне проще как-то напрямую биты выставлять, тем более что я уже знаю, чё да где.

Переписываю по-своему, унылая рутина. Читаю доку на чип, чтоб ни один бит конфигурации не пропустить. Вижу буквально следующее:
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);


Клёво, чо. Я уж молчу про нагромождение неудобочитаемого кода ВНУТРИ этих функций... зато они все такие безопасные, аргументы на валидность проверяют.
Subscribe

  • Спохватились

    На Байконуре расследуют предполагаемую кражу деталей с дорогостоящими редкоземельными металлами. Она могла произойти на площадке №110, с которой…

  • Ну что.

    SN10 - первый прототип старшипа, взлетевший дважды с минимальным техническим обслуживанием между стартами, с отработкой метода быстрого избавления от…

  • Как выглядит хорошо аргументированное мнение?

    Это можно узнать на примере соломонова фотовладьки: Истерикой несгибаемого борца с мировым злом удовлетворён. Кстати, о синонимах

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 5 comments