Flyboy74
Пт 6 июля 2018 г. 6:52 утра
После игры The Blue Pill STM32F103 я решил сделать следующий шаг и перейти к STM32F4XX, и я обнаружил, что черная доска STM32F407VET действительно дешевой на AliexPress, так что теперь я играю с ним. Только что сделали некоторые основные мигание светодиодные вещи, написав в регистрах, чтобы настроить часы и булавки, а затем переключить булавку.
Основная причина, по которой я получил STM32F407VET, заключалась в том, чтобы научиться писать на ЖК -экране параллельно. У меня есть экран 320x240, который имеет 8 -битные параллельные контакты, вместе с RST, CS, RS, WR, RD, поэтому я предполагаю, что стандартный 8 -битный 8080 интерфейс.
Я нуб, но всегда быстрый ученик в таком роде. Может ли кто -нибудь указать мне на любые ссылки в блогах или учебных пособиях по настройке и использованию FSMC для написания ЖК -дисплея на STM32F4XX
Основная причина, по которой я получил 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??
Сначала я не могу найти никаких документов, которые сообщают мне, какие контакты способны для FSMC, доска, которую я имею, использует булавки на порту D и E, но где документы от ST, которые сообщают вам об этом?? Могу ли я подключить ЖК -дисплей на любые булавки и установить их в режиме AF12??
Стивестронг
Пт, 6 июля 2018 г., 15:03
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 Н.
Я не уверен, где сообщить об этом, но в документах есть небольшая опечатка 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.
Когда я пытаюсь подключить свои сферу к разным булавкам и отправлять разные данные, моя область показывает, что булавки делают то, что я ожидал бы, но когда я подключаю их к экрану, попробовал оба 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
Спасибо за ответ.
Цель состоит в том, чтобы иметь возможность использовать экран с 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??
Так что 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
Видеть 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
Я следовал приведенной выше ссылке в другой поток, затем последовал эту ссылку на переполнение стека и получил эту настройку 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;