[Решен] FSMC LCD на STM32F407VET

Flyboy74
Пт 6 июля 2018 г. 6:52 утра
После игры The Blue Pill STM32F103 я решил сделать следующий шаг и перейти к STM32F4XX, и я обнаружил, что черная доска STM32F407VET действительно дешевой на AliexPress, так что теперь я играю с ним. Только что сделали некоторые основные мигание светодиодные вещи, написав в регистрах, чтобы настроить часы и булавки, а затем переключить булавку.

Основная причина, по которой я получил STM32F407VET, заключалась в том, чтобы научиться писать на ЖК -экране параллельно. У меня есть экран 320x240, который имеет 8 -битные параллельные контакты, вместе с RST, CS, RS, WR, RD, поэтому я предполагаю, что стандартный 8 -битный 8080 интерфейс.

Я нуб, но всегда быстрый ученик в таком роде. Может ли кто -нибудь указать мне на любые ссылки в блогах или учебных пособиях по настройке и использованию FSMC для написания ЖК -дисплея на STM32F4XX

Пито
Пт 06 июля 2018 г. 9:48
Поместите «FSMC» в «Поиск» - сверху справа на этой странице..

Flyboy74
Пт, 6 июля 2018 г., 14:40
Хорошо, это где -то, чтобы начать, но это в основном оставляет меня более запутанным, хахаха.

Сначала я не могу найти никаких документов, которые сообщают мне, какие контакты способны для FSMC, доска, которую я имею, использует булавки на порту D и E, но где документы от ST, которые сообщают вам об этом?? Могу ли я подключить ЖК -дисплей на любые булавки и установить их в режиме AF12??

Стивестронг
Пт, 6 июля 2018 г., 15:03
ViewTopic.PHP?F = 39&t = 2298

Flyboy74
Сб -7 июля 2018 г. 9:59 утра
Хорошо, я думаю, что у меня работает FSMC на моей доске, и моя область показывает все правильные результаты на всех булавках. На данный момент я использую самое медленное время и дает 615 кГц. Будет экспериментировать позже, чтобы увидеть, как быстро это может пойти.

Я не уверен, где сообщить об этом, но в документах есть небольшая опечатка http: // wiki.STM32duino.com/images/a/a8/ ... AG-TFT.PDF

Где он показывает булавку из ЖК -заголовка 1 булавок, указан как PD2, когда на самом деле это PD0.

Мой следующий шаг - заставить его работать с экраном. Я думаю, что экран, который у меня есть, использует чип драйвера ST7781. Если я правильно читаю лист данных, кажется, что он не использует Адрес памяти части передачи FSMC и использует только часть данных передачи FSMC. Это заставляет меня задуматься о том, могут ли более быстрые обновления ЖК -дисплея быть достигнуты битом, так как вы можете вырезать адресную часть и просто отправить данные, вы можете использовать 1 целый порт (16 контактов) и просто написать данные о ODR порта, тогда Пульсируйте штифт WR Low, затем высокий, чтобы отправлять данные, так как экран, кажется, просто считывает данные о подъеме линии WR, пока импульс больше 50 Н.

Flyboy74
Пн, 09 июля 2018 г., 6:44
Я не смог ничего написать на экране.

Когда я пытаюсь подключить свои сферу к разным булавкам и отправлять разные данные, моя область показывает, что булавки делают то, что я ожидал бы, но когда я подключаю их к экрану, попробовал оба ST7781 в 8 бит, а теперь HX8357 в 16 -битных. Но ничто не показывает на моем экране.

Я использовал и запрограммировал несколько различных типов экранов SPI (ILI9341, ST7735), используя Python очень успешно, и на этих параллельных экранах есть многие из тех же регистров, которые просто используют параллельные вместо SPI.

Может кто -нибудь поправит меня, если я не ошибаюсь в понимании, это работает так работает. Вы тянете Pin Low RS, затем отправляете команду через FSMC, затем вы даете RS высоко, затем отправляете данные через FSMC. Кулак вам нужно отправить все команды для настройки экрана, затем отправляете команду Ramwr, а затем сняли данные Pixel, и он должен отображаться на экране.

Я переключился на Eclipse, чтобы написать код и компиляцию, а затем вспыхивать со ST-Link. #include "stm32f4xx.h" //used for coutn down in Delay __IO uint32_t TimmingDelay; void SysTick_Handler(void) { if(TimmingDelay !=0) { TimmingDelay --; } } void Delay(__IO uint32_t time) { TimmingDelay = time; while(TimmingDelay !=0); } //pointer used to write to start address of FSMC volatile uint16_t* fsmc = (uint16_t*)0x60000000; void FSMC_setup(void){ //enable RCC for FSMC and both GPIO ports RCC->AHB3ENR |= RCC_AHB3ENR_FSMCEN; RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOEEN; //setup RS (PD13) and RST (PD12) pin as output GPIOD->MODER |= GPIO_MODER_MODER13_0 | GPIO_MODER_MODER12_0; //setup other pins as AF GPIOD->MODER |= GPIO_MODER_MODER0_1 | GPIO_MODER_MODER1_1 | GPIO_MODER_MODER4_1 | GPIO_MODER_MODER5_1 | GPIO_MODER_MODER7_1 | GPIO_MODER_MODER8_1 | GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1 | GPIO_MODER_MODER14_1 | GPIO_MODER_MODER15_1; GPIOE->MODER |= GPIO_MODER_MODER7_1 | GPIO_MODER_MODER8_1 | GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1 | GPIO_MODER_MODER11_1 | GPIO_MODER_MODER12_1 | GPIO_MODER_MODER13_1 | GPIO_MODER_MODER14_1 | GPIO_MODER_MODER15_1; //setup pins as PP GPIOD->OTYPER = 0x00000000; GPIOE->OTYPER = 0x00000000; //set speed to 100MHz GPIOD->OSPEEDR = 0xFFFFFFFF; GPIOE->OSPEEDR = 0xFFFFFFFF; //set NO pull-up or pull-down GPIOD->PUPDR = 0x00000000; GPIOE->PUPDR = 0x00000000; //set other pins to AF12 i.e as FSMC pins GPIOD->AFR[0] |= (GPIO_AF12_FSMC << (0 * 4)) | (GPIO_AF12_FSMC << (1 * 4)) | (GPIO_AF12_FSMC << (4 * 4)) | (GPIO_AF12_FSMC << (5 * 4)) | (GPIO_AF12_FSMC << (7 * 4)); GPIOD->AFR[1] |= (GPIO_AF12_FSMC << ((8 - 8) * 4)) | (GPIO_AF12_FSMC << ((9 - 8) * 4)) | (GPIO_AF12_FSMC << ((10 - 8) * 4)) | (GPIO_AF12_FSMC << ((14 - 8) * 4)) | (GPIO_AF12_FSMC << ((15 - 8) * 4)); GPIOE->AFR[0] |= (GPIO_AF12_FSMC << (7 * 4)); GPIOE->AFR[1] |= (GPIO_AF12_FSMC << ((8 - 8) * 4)) | (GPIO_AF12_FSMC << ((9 - 8) * 4)) | (GPIO_AF12_FSMC << ((10 - 8) * 4)) | (GPIO_AF12_FSMC << ((11 - 8) * 4)) | (GPIO_AF12_FSMC << ((12 - 8) * 4)) | (GPIO_AF12_FSMC << ((13 - 8) * 4)) | (GPIO_AF12_FSMC << ((14 - 8) * 4)) | (GPIO_AF12_FSMC << ((15 - 8) * 4)); //setup FSMC on Bank1 NORSRAM1 //disable ASYNCWAIT: FSMC_Bank1->BTCR[0] &= ~FSMC_BCR1_ASYNCWAIT; //disable Extended mode FSMC_Bank1->BTCR[0] &= ~FSMC_BCR1_EXTMOD; //disable the wait for NWAIT signal FSMC_Bank1->BTCR[0] &= ~FSMC_BCR1_WAITEN; //write enable FSMC_Bank1->BTCR[0] |= FSMC_BCR1_WREN; //disable wrap mode FSMC_Bank1->BTCR[0] &= ~FSMC_BCR1_WRAPMOD; //disable Burst mode FSMC_Bank1->BTCR[0] &= ~FSMC_BCR1_BURSTEN; //enable Flash access FSMC_Bank1->BTCR[0] |= FSMC_BCR1_FACCEN; //set data bus width to 16 bit FSMC_Bank1->BTCR[0] |= FSMC_BCR1_MWID_0; //set to SRAM type FSMC_Bank1->BTCR[0] &= ~FSMC_BCR1_MTYP; //disable Address/data multiplexing FSMC_Bank1->BTCR[0] &= ~FSMC_BCR1_MUXEN; //enable Memory bank FSMC_Bank1->BTCR[0] |= FSMC_BCR1_MBKEN; //setup timings //set access mode A FSMC_Bank1->BTCR[1] &= ~FSMC_BTR1_ACCMOD; //set short bus turn around FSMC_Bank1->BTCR[1] &= ~(FSMC_BTR1_BUSTURN_0 | FSMC_BTR1_BUSTURN_1 | FSMC_BTR1_BUSTURN_2 |FSMC_BTR1_BUSTURN_3); } void TFT_write_cmd(uint16_t command){ //set RS pin low GPIOD->ODR &= ~GPIO_ODR_ODR_13; Delay(10); *fsmc = command; //set RS pin high GPIOD->ODR |= GPIO_ODR_ODR_13; Delay(10); } //sets up a HX8357B TFT void TFT_setup(void){ //hardware reset GPIOD->ODR &= ~GPIO_ODR_ODR_12; Delay(200); GPIOD->ODR |= GPIO_ODR_ODR_12; Delay(120); //software reset TFT_write_cmd(0x01); Delay(120); //sleep out TFT_write_cmd(0x11); Delay(120); //Normal Display Mode On) TFT_write_cmd(0x13); //Display On TFT_write_cmd(0x29); //CASET (Column Address Set) TFT_write_cmd(0x2A); *fsmc = 0000; *fsmc = 320; //PASET (Page Address Set) TFT_write_cmd(0x2B); *fsmc = 0000; *fsmc = 320; //Exit_idle_mode TFT_write_cmd(0x38); //Set_pixel_format RGR565 16 bit TFT_write_cmd(0x3A); *fsmc = 0b01010101; //RAMWR (Memory Write) TFT_write_cmd(0x2C); } void main(void){ // At this stage the system clock should have already been configured // at high speed. //set systick for 1 MS used in Delay interrupt SysTick_Config(SystemCoreClock/1000); FSMC_setup(); TFT_setup(); for (uint32_t i = 0; i < 102400; ++i ){ *fsmc = 0xff00; fsmc += 2; } // Infinite loop while (1){ // Add your code here. } }

Стивестронг
Пн, 09 июля 2018 г., 9:49
[Flyboy74 - Пн июля 09, 2018 6:44] - Может кто -нибудь поправит меня, если я не ошибаюсь в понимании, это работает так работает. Вы тянете Pin Low RS, затем отправляете команду через FSMC, затем вы даете RS высоко, затем отправляете данные через FSMC. Кулак вам нужно отправить все команды для настройки экрана, затем отправляете команду Ramwr, а затем сняли данные Pixel, и он должен отображаться на экране.
Это верно.
Чтобы проверить свою проводку, вы можете использовать этот набросок: https: // github.com/prentiedavid/mcufri ... eadreg.Ино. Просто адаптируйте булавки.

В качестве альтернативы, вы можете посмотреть на мою реализацию здесь: https: // github.com/stevstrong/adafruit_ ... it_stm32.час, в сочетании с базовым файлом FSMC: https: // github.com/stevstrong/arduino_s ... ple/fsmc.в

Flyboy74
Вт 10 июля 2018 г., 4:12 утра
@stevestrong

Спасибо за ответ.

Цель состоит в том, чтобы иметь возможность использовать экран с FSMC и DMA, но, поскольку я не могу получить что -либо, чтобы показать на экране, я собираюсь использовать бит -удары и привлечь это к работе, а затем вернитесь к FSMC.

Я написал простой бит, но получил то же самое, приходите: экран просто остался белым, как будто он не запускался. Задний свет, конечно, всегда происходит с силой. При воспроизведении с экраном SPI, даже если данные не записываются на грамм, когда запускается экран, вы не получаете белый, вы получаете случайные пиксели. Экраны SPI дают только чистый белый экран, если он не запустил.

Эта ветка о FSCM, поэтому я запустил еще одну ветку в общей дискуссии, чтобы спросить об использовании экрана битом взрыва. @stevestrong Можете ли вы посмотреть на простой код, который я опубликовал в этом ветке, и посмотрите, заметите ли вы что -нибудь о том, почему он не работает ViewTopic.PHP?f = 3&t = 3841

Flyboy74
Вт 10 июля 2018 г. 7:11
Итак, теперь у меня есть экран для работы, используя бит, так что это означает, что вывод, который я использую, верен, и экран работает, и я использую правильные команды для его управления. Так что это вызывающе проблема с тем, как я использую FSMC

Так что 1 вещь, которая, кажется, заставила меня в замешательстве, глядя на ваш код, это то, что вы настраиваете PIN -код RS (FSMC_A18) в качестве штифта AF, так же, как и остальные выводы. Я настраиваю его как обычный выходной штифт и управляю его вручную.

Как кто -то, использующий ваш код, выдает команду и как писать данные???


Является ли периферийная пластина FSMC, чтобы иметь возможность управлять PIN -код LCD RS??

Стивестронг
Вт 10 июля 2018 г. 7:36 утра
[Flyboy74 - Вторник 10 июля 2018 г. 7:11] - Как кто -то, использующий ваш код, выдает команду и как писать данные???
Посмотрите на файл заголовка, который я опубликовал выше.
[Flyboy74 - Вторник 10 июля 2018 г. 7:11] - Является ли периферийная пластина FSMC, чтобы иметь возможность управлять PIN -код LCD RS??
Да.

Flyboy74
Вт 10 июля 2018 г. 8:34 утра
У вас также есть линия кода fsmc_nor_psram_bank_enable(FSMC_NOR_PSRAM1_BASE);

Стивестронг
Вторник 10 июля 2018 г. 8:42 утра
Действительно ли так сложно выполнить поиск в исходных файлах?

Видеть https: // github.com/stevstrong/arduino_s ... #L303-L305 static inline void fsmc_nor_psram_bank_enable(fsmc_nor_psram_reg_map *regs) { regs->BCR |= FSMC_BCR_MBKEN; }

Flyboy74
Вт 10 июля 2018 г. 9:40 утра
Хорошо, что все за их терпение у меня сейчас работают, не уверен, почему сейчас это работает, но это :)

Я следовал приведенной выше ссылке в другой поток, затем последовал эту ссылку на переполнение стека и получил эту настройку FSMC int FSMC_Bank = 0; FSMC_Bank1->BTCR[FSMC_Bank+1] = FSMC_BTR1_ADDSET_1 | FSMC_BTR1_DATAST_1; // Bank1 NOR/SRAM control register configuration FSMC_Bank1->BTCR[FSMC_Bank] = FSMC_BCR1_MWID_0 | FSMC_BCR1_WREN | FSMC_BCR1_MBKEN;

SPI на F4

STM32F4 Проблема загрузки

STM32F407 Discovery Comploun