Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Разные устройства на одном FSMC STM32

Пт янв 10, 2014 05:45:22

Добрый день, уважаемые коллеги.
Назрел такой вопрос: можно ли подключить к одному модулю FSMC STM32 разные типы памяти? Мне нужно подключить SRAM + NAND Flash + LCD ILI9325.
Имея 144-выводной корпус, где 4 ChipSelect-а, думаю, можно. Но, когда захожу в MicroXplorer от ST, там предлагается один из 4 режимов работы FSMC:
1) FSMC_CF
2) FSMC_CF_IDE
3) FSMC_NOR_RAM
4) FSMC_NOR_MUX
5) FSMC_NAND16,
при этом, выбирая один из режимов, остальные режимы становятся недоступными. А зачем тогда нам 4 ChipSelect-а?

Планируется подключить NAND Flash K9F2G08U0B (2GB), какую-нибудь FRAM (еще не определился) и LCD на ILI9325.
Благодарю за внимание!

Re: Разные устройства на одном FSMC STM32

Пт янв 10, 2014 09:53:52

У STM32 один FSMC, и работать он может только в одном режиме. 4 чипселекта нужны для того, чтоб подключить 4 устройства одного типа, например 4 микросхемы FLASH.
Теоретически, можно подключить и разные устройства, а потом переключать режимы FSMC программно. Надо пробовать, тк неизвестно - как себя поведут подключенные устройства в момент переключения режима работы?

Re: Разные устройства на одном FSMC STM32

Пт янв 10, 2014 10:41:11

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

Re: Разные устройства на одном FSMC STM32

Вс янв 12, 2014 00:37:27

coredumped писал(а):У STM32 один FSMC, и работать он может только в одном режиме. 4 чипселекта нужны для того, чтоб подключить 4 устройства одного типа, например 4 микросхемы FLASH.

Не вводите человека в заблуждение. FSMC у STM действительно один, но имеет 4 банка, каждый из которых конфигурируется отдельно. Это дает возможность использовать все 4 типа устройств одновременно без никаких программных переопределений назначения FSMC. Вот, пример того, как конфигурируется FSMC с помощью StdPeriphDriver-а. Это получится, что банк 1 будет асоциироваться с четвертым cs-ом, на котором будет висеть NOR SRAM. Соответственно, чтобы сконфигурировать другой банк FSMC, нужно повторить процедуру с другим значением FSMC_NORSRAMInitStructure.FSMC_Bank. В конце надо не забыть включить выбранный банк.
Спойлер
Код:
        FSMC_NORSRAMTimingInitTypeDef  p;
   FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;

        p.FSMC_AddressSetupTime = 2;   
   p.FSMC_AddressHoldTime = 1;   
   p.FSMC_DataSetupTime = 2;      
   p.FSMC_BusTurnAroundDuration = 1;   
   p.FSMC_CLKDivision = 0;
   p.FSMC_DataLatency = 0;
   p.FSMC_AccessMode = FSMC_AccessMode_A;

        FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;                              //Вот тут мы выбираем конфигурируемый банк и сразу же тип устройства, который к нему присоединен и номер cs. Предопределенные константы можно посмотреть в файле stm32fxxx_fsmc.h, там же можно найти и другие полезные функции.
   FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
   FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;   
   FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
   FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
   FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
   FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_High;
   FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
   FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
   FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
   FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
   FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable;
   FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
   FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
   FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
   
   FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); 
   /* BANK 4 (of NOR/SRAM Bank 1~4) is enabled */
   FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);

Re: Разные устройства на одном FSMC STM32

Чт янв 16, 2014 19:30:07

РадиоЛоматель, благодарю за помощь!
Не совсем понятен следующий момент. Всего банка 4. Каждый банк - свой тип памяти и доступ к каждому банку осуществляется соответствующим CS. А что за надпись тогда 4x64MB? Я так понимаю 4 банка по 64 Мбайт. Но ими тоже отдельно каждым надо управлять?
Изображение
И еще: в даташите указано, что TFT к FSMC подключается в режиме NOR/SRAM. Но для SRAM выведен один банк памяти (первый) а туда уже будет подключена SRAM (т.е. ее CS будет уже занят)...
Я хотел подключить следующим образом:
банк 1 - TFT, SRAM;
банк 2 - NAND Flash.

Re: Разные устройства на одном FSMC STM32

Чт янв 16, 2014 20:17:46

Arlleex писал(а):И еще: в даташите указано, что TFT к FSMC подключается в режиме NOR/SRAM. Но для SRAM выведен один банк памяти (первый) а туда уже будет подключена SRAM (т.е. ее CS будет уже занят)...

Да, это так. Но если прочитать внимательно документ AN2784 Using the high-density STM32F10xxx FSMC peripheral to drive external memories, можно найти там следующее:
From the FSMC point of view, the external memory is divided into four fixed-size banks of
256 Mbytes each, as shown in Figure 2:
● Bank 1 used by the NOR Flash/SRAM controller to address up to 4 memory devices.
This bank is split into 4 regions with 4 dedicated Chip Select signals.
● Banks 2 and 3 used by the NAND Flash/PC Card controller to address NAND Flash
devices.
● Bank 4 used by the NAND Flash/PC Card controller to address a PC Card device.
For each bank, the type of memory to be used is user-defined in the Configuration register.
AHB bus

И в первом пункте мы видим, что первый банк разделен на 4 региона, каждому из которых соответствует свой сигнал CS. К сожалению, я не могу вам уверенно подсказать, как конфигурировать банк в этом случае. У меня дальше одного устройства на FSMC не заходило. Похоже, что я соврал в предыдущем посте про выбор cs-a, ассоциируемого с банком. Это не номер, а количество задействованных cs в этом банке. В общем, смело можете подключать свои устройства к первому банку, пользуясь картинкой Figure 1. FSMC block diagram из упомянутого документа.

Re: Разные устройства на одном FSMC STM32

Чт янв 16, 2014 21:40:31

Еще раз спасибо, в дополнение надо будет еще посмотреть примеры схем отладочных плат :)

Re: Разные устройства на одном FSMC STM32

Пт май 15, 2020 14:02:59

Здравствуйте!
Контроллер stm32f765, fmc lcd не заработал. Подключал так
/** FMC GPIO Configuration
PE7 ------> FMC_D4
PE8 ------> FMC_D5
PE9 ------> FMC_D6
PE10 ------> FMC_D7
PE11 ------> FMC_D8
PE12 ------> FMC_D9
PE13 ------> FMC_D10
PE14 ------> FMC_D11
PE15 ------> FMC_D12
PD8 ------> FMC_D13
PD9 ------> FMC_D14
PD10 ------> FMC_D15
PD11 ------> FMC_A16
PD14 ------> FMC_D0
PD15 ------> FMC_D1
PG6 ------> FMC_NE3
PD0 ------> FMC_D2
PD1 ------> FMC_D3
PD4 ------> FMC_NOE
PD5 ------> FMC_NWE.
Команды прописал так:
#define LCD_COMM_ADD *(volatile unsigned short *) 0x68000000 // RS = 0
#define LCD_DATA_ADD *(volatile unsigned short *) 0x68020000 // RS = 1
0x60020000 - тоже не дало результата.
До этого все работало на 407 контроллере.
Программная реализация на тех же пинах запустила дисплей но очень медленно.
Возможно сделать программную реализацию быстрее,если штатный fmc не запустится?
В хедере прописал пины для работы.
Вот кусок кода;
void Buf_Data(uint16_t data)
{
if (((data>>15)&0x01) == 0x01){D15_HI;}else {D15_LO;}
if (((data>>14)&0x01) == 0x01){D14_HI;}else {D14_LO;}
if (((data>>13)&0x01) == 0x01){D13_HI;}else {D13_LO;}
if (((data>>12)&0x01) == 0x01){D12_HI;}else {D12_LO;}
if (((data>>11)&0x01) == 0x01){D11_HI;}else {D11_LO;}
if (((data>>10)&0x01) == 0x01){D10_HI;}else {D10_LO;}
if (((data>>9)&0x01) == 0x01){D9_HI;} else {D9_LO;}
if (((data>>8)&0x01) == 0x01){D8_HI;} else {D8_LO;}

if (((data>>7)&0x01) == 0x01){D7_HI;} else {D7_LO;}
if (((data>>6)&0x01) == 0x01){D6_HI;} else {D6_LO;}
if (((data>>5)&0x01) == 0x01){D5_HI;} else {D5_LO;}
if (((data>>4)&0x01) == 0x01){D4_HI;} else {D4_LO;}
if (((data>>3)&0x01) == 0x01){D3_HI;} else {D3_LO;}
if (((data>>2)&0x01) == 0x01){D2_HI;} else {D2_LO;}
if (((data>>1)&0x01) == 0x01){D1_HI;} else {D1_LO;}
if (((data>>0)&0x01) == 0x01){D0_HI;} else {D0_LO;}
}

void LCD_WriteCommand(uint16_t cmd)
{
RS_LO;
//CS_LO;
Buf_Data(cmd);
WR_LO;
WR_HI;
//CS_HI;
}

void LCD_WriteData(uint16_t data)
{
RS_HI;
//CS_LO;
Buf_Data(data);
WR_LO;
WR_HI;
//CS_HI;
}

Re: Разные устройства на одном FSMC STM32

Пт май 15, 2020 15:04:09

#define LCD_COMM_ADD *(volatile unsigned short *) 0x68000000 // RS = 0
#define LCD_DATA_ADD *(volatile unsigned short *) 0x68020000 // RS = 1

Прописано правильно, но volatile - это указание компилятору не выбрасывать "лишние" обращения к памяти, а у F7 еще есть кеш, причем атрибуты памяти по этим адресам такие же как у SRAM, т.е. нужно при помощи MPU этот регион памяти сделать некешируемым или отключить кеш вообще.

Возможно сделать программную реализацию быстрее,если штатный fmc не запустится?

Конечно, некоторые С++ либы это делают автоматически, но можно и вручную взять сразу 9 бит, сдвинуть и записать за раз в GPIOE->BSRR, вместо того чтобы делать 9 проверок...

Re: Разные устройства на одном FSMC STM32

Пт май 15, 2020 16:08:11

Спасибо большое.Сам являюсь любителем самоучкой в этой области.Все примеры взяты из интернета.
Поможете в этом деле с FMC?
Настраивал через программу STM32 cube
Заранее большое спасибо.

Re: Разные устройства на одном FSMC STM32

Сб май 16, 2020 18:05:24

Разобрался спасибо.
Вложения
настройка FMC.jpg
(184.51 KiB) Скачиваний: 348
Ответить