Манипуляция порта - Параллель ЖК -дисплеев

Wizarcl
Чт 06 августа 2015 г., 23:51
Всем привет.
Я пытаюсь портировать библиотеку adafruit_tftlcd (для 8 -битного параллельного ЖК -дисплея) и внутри в библиотеке линии управления контролируются макросами, используя манипуляции с портами, но STM32 имеет другой метод для этого. Использование AVR, библиотека делает управление с помощью DDRA и Porta, например, для управления направлением и значениями порта. Как я могу сделать эти манипуляции? Использование gpioa_base.CRL, GPIOA_BASE.CRH, GPIOA_BASE.IDR и GPIOA_BASE.ОДР?

Следуйте за кусочком кода в PIN_MAGIC.час:
#define write8inline(d) { \ PORTD = (PORTD & B00000011) | ((d) & B11111100); \ PORTB = (PORTB & B11111100) | ((d) & B00000011); \ WR_STROBE; } #define read8inline(result) { \ RD_ACTIVE; \ DELAY7; \ result = (PIND & B11111100) | (PINB & B00000011); \ RD_IDLE; } #define setWriteDirInline() { DDRD |= B11111100; DDRB |= B00000011; } #define setReadDirInline() { DDRD &= ~B11111100; DDRB &= ~B00000011; }

Rogerclark
Пт. 07 августа 2015 12:49
Аппаратное обеспечение не так сложно контролировать

Каждый порт имеет несколько регистров, но я думаю, что те, кто вас интересует, - это регистр выходных данных (ODR) (не существует также отдельный высокоскоростный регистр для установки битов, сброшенных битов)

Если вы посмотрите в систему/libmaple/include/libmaple/gpio.H есть функция, чтобы переключить один бит

static inline void gpio_toggle_bit (gpio_dev *dev, uint8 pin) {
девчонка->регс->Odr = dev->регс->ODR ^ (1U << приколоть);
}


Так что, если вы сделаете

девчонка->регс->ODR = 0x1234

Он установит любой порт на 0x1234

Примечание.глин. что -то вроде

девчонка->регс->BSRR = (Younum & 0x0f) | ~ (yournum & 0x0f)<<16;

Вам нужно дважды проверить этот код, но я думаю, что вы, вероятно, получите идею.

Устройство "Дев->"Уже определите в коде

GPIOA, GPIOB, GPIOC и т. Д


В любом случае, это должно дать вам старт ..

Wizarcl
Пт, 07 августа 2015 г. 15:57
Rogerclark написал:
В любом случае, это должно дать вам старт ..

ZMEMW16
Пт, 07 августа 2015 г., 8:02 вечера
Rogerclark написал: Примечание.глин. что -то вроде

девчонка->регс->BSRR = (Younum & 0x0f) | ~ (yournum & 0x0f)<<16;

Mrburnette
Пт, 07 августа 2015 г., 8:21 вечера
ZMEMW16 написал: <...>
Мой мозг нанесен перегружен, и это была долгая ночь/день, но где маски 0x0F и << 16 Приходите из?
0xff's и << 8 - это то, что я ожидал?

Стивен

Мадиас
Пт, 07 августа 2015 г., 8:25 вечера
Wizarcl, пожалуйста, обратитесь к моей библиотеке TFT ST7781. Используйте функцию поиска на этом форуме для моего URL -адреса Google Drive. Я сделал это для похожей, может быть, той же библиотеки, которая вам нужна

Wizarcl
Солнце 23 августа 2015 г. 15:35
Привет, друзья... Я попытался портировать библиотеку LCD Adafruit TFT для работы с STM32, но я не могу контролировать ЖК -дисплей. Эта библиотека управления 8 -битным параллельным ЖК -дисплеем. Я включаю для вас коды. Изменения:
В pin_magic.час: #elif defined(__STM32F1__) // Data pins is PA4 PA5 PA6 PA7 - PB12 PB13 PB14 PB15 #define write8inline(d) { \ GPIOA->regs->ODR = ((GPIOA->regs->ODR & 0xFF0F) | ((d << 4) & 0x00F0)); \ GPIOB->regs->ODR = ((GPIOB->regs->ODR & 0x0FFF) | ((d << 8) & 0xF000)); \ WR_STROBE; } #define read8inline(result) { \ RD_ACTIVE; \ delayMicroseconds(1); \ result = (((GPIOA->regs->IDR & 0x00F0) >> 4) | ((GPIOB->regs->IDR & 0xF000) >> 8)); \ RD_IDLE;} #define setWriteDirInline() { \ GPIOA->regs->CRL = ((GPIOA->regs->CRL &= 0xFFFF) | 0x33330000); \ GPIOB->regs->CRH = ((GPIOB->regs->CRH &= 0xFFFF) | 0x33330000); \ } #define setReadDirInline() { \ GPIOA->regs->CRL = ((GPIOA->regs->CRL &= 0xFFFF) | 0x44440000); \ GPIOB->regs->CRH = ((GPIOB->regs->CRH &= 0xFFFF) | 0x44440000); \ } // When using the TFT breakout board, control pins are configurable. #define RD_ACTIVE rdPort->regs->BRR |= rdPinSet //PIO_Clear(rdPort, rdPinSet) #define RD_IDLE rdPort->regs->BSRR |= rdPinSet //PIO_Set(rdPort, rdPinSet) #define WR_ACTIVE wrPort->regs->BRR |= wrPinSet //PIO_Clear(wrPort, wrPinSet) #define WR_IDLE wrPort->regs->BSRR |= wrPinSet //PIO_Set(wrPort, wrPinSet) #define CD_COMMAND cdPort->regs->BRR |= cdPinSet //PIO_Clear(cdPort, cdPinSet) #define CD_DATA cdPort->regs->BSRR |= cdPinSet //PIO_Set(cdPort, cdPinSet) #define CS_ACTIVE csPort->regs->BRR |= csPinSet //PIO_Clear(csPort, csPinSet) #define CS_IDLE csPort->regs->BSRR |= csPinSet //PIO_Set(csPort, csPinSet) // As part of the inline control, macros reference other macros...if any // of these are left undefined, an equivalent function version (non-inline) // is declared later. The Uno has a moderate amount of program space, so // only write8() is inlined -- that one provides the most performance // benefit, but unfortunately also generates the most bloat. This is // why only certain cases are inlined for each board. #define write8 write8inline #else

Мадиас
Sun 23 августа 2015 г., 19:53
...и что подключено к PC13?
Если это подсветка, чем подключить его к VCC, STM32 не может дать достаточную мощность для проведения подсветки для ЖК -дисплея через один вывод без дополнительного аппаратного обеспечения.

Wizarcl
Солнце 23 августа 2015 г., 21:36
Мадиас написал:...и что подключено к PC13?
Если это подсветка, чем подключить его к VCC, STM32 не может дать достаточную мощность для проведения подсветки для ЖК -дисплея через один вывод без дополнительного аппаратного обеспечения.

Rogerclark
Пн 24 августа 2015 г., 3:45
Вы имеете в виду, что вы питаете весь ЖК -дисплей из 5V, E.глин. включая чипсы и т. Д

Это может вызвать проблемы, потому что STM32 - 3.Устройство 3 В, а не 5 В.

Я рекомендую вам питать ЖК -дисплей с 3.3В

Wizarcl
Пн 24 августа 2015 г., 8:54 вечера
Rogerclark написал:Вы имеете в виду, что вы питаете весь ЖК -дисплей из 5V, E.глин. включая чипсы и т. Д

Это может вызвать проблемы, потому что STM32 - 3.Устройство 3 В, а не 5 В.

Я рекомендую вам питать ЖК -дисплей с 3.3В

Rogerclark
Пн 24 августа 2015 г., 21:47
Я не уверен, как вы сможете решить, что происходит, без логического анализатора и т. Д.

Wizarcl
Ср 26 августа 2015 г. 9:04
Rogerclark написал:Я не уверен, как вы сможете решить, что происходит, без логического анализатора и т. Д.

Ахулл
Ср 26 августа 2015 12:20
Wizarcl написал:Rogerclark написал:Я не уверен, как вы сможете решить, что происходит, без логического анализатора и т. Д.

Wizarcl
Сб 05 сентября 2015 1:48
Ахулл написал:Wizarcl написал:Rogerclark написал:Я не уверен, как вы сможете решить, что происходит, без логического анализатора и т. Д.

Diger67
Чт 10 сентября 2015 г. 1:09
Привет. Вы не работали void write8 (значение uint8_t) из -за неправильного #define write8inline (d). Попробуйте это. Я думаю, ты поймешь.
// Data pins is PA4 PA5 PA6 PA7 - PB12 PB13 PB14 PB15 #define write8inline(d) { \ GPIOA->regs->BRR = ((GPIOA->regs->BRR & 0xFF0F) | ((d << 4) & 0x00F0)); \ GPIOA->regs->BSRR = ((GPIOA->regs->BSRR & 0xFF0F) | ((~d << 4) & 0x00F0)); \ GPIOB->regs->BRR = ((GPIOB->regs->BRR & 0x0FFF) | ((d << 8) & 0xF000)); \ GPIOB->regs->BSRR = ((GPIOB->regs->BSRR & 0x0FFF) | ((~d << 8) & 0xF000)); \ WR_STROBE; } void write8(uint8_t value) { write8inline(value); }

Diger67
Чт 10 сентября 2015 г. 1:47
Wizarcl написал:Привет, друзья... Я попытался портировать библиотеку LCD Adafruit TFT для работы с STM32, но я не могу контролировать ЖК -дисплей. Эта библиотека управления 8 -битным параллельным ЖК -дисплеем. Я включаю для вас коды. Изменения:
В pin_magic.час: #elif defined(__STM32F1__) // Data pins is PA4 PA5 PA6 PA7 - PB12 PB13 PB14 PB15 #define write8inline(d) { \ GPIOA->regs->ODR = ((GPIOA->regs->ODR & 0xFF0F) | ((d << 4) & 0x00F0)); \ GPIOB->regs->ODR = ((GPIOB->regs->ODR & 0x0FFF) | ((d << 8) & 0xF000)); \ WR_STROBE; } #define read8inline(result) { \ RD_ACTIVE; \ delayMicroseconds(1); \ result = (((GPIOA->regs->IDR & 0x00F0) >> 4) | ((GPIOB->regs->IDR & 0xF000) >> 8)); \ RD_IDLE;} #define setWriteDirInline() { \ GPIOA->regs->CRL = ((GPIOA->regs->CRL &= 0xFFFF) | 0x33330000); \ GPIOB->regs->CRH = ((GPIOB->regs->CRH &= 0xFFFF) | 0x33330000); \ } #define setReadDirInline() { \ GPIOA->regs->CRL = ((GPIOA->regs->CRL &= 0xFFFF) | 0x44440000); \ GPIOB->regs->CRH = ((GPIOB->regs->CRH &= 0xFFFF) | 0x44440000); \ } // When using the TFT breakout board, control pins are configurable. #define RD_ACTIVE rdPort->regs->BRR |= rdPinSet //PIO_Clear(rdPort, rdPinSet) #define RD_IDLE rdPort->regs->BSRR |= rdPinSet //PIO_Set(rdPort, rdPinSet) #define WR_ACTIVE wrPort->regs->BRR |= wrPinSet //PIO_Clear(wrPort, wrPinSet) #define WR_IDLE wrPort->regs->BSRR |= wrPinSet //PIO_Set(wrPort, wrPinSet) #define CD_COMMAND cdPort->regs->BRR |= cdPinSet //PIO_Clear(cdPort, cdPinSet) #define CD_DATA cdPort->regs->BSRR |= cdPinSet //PIO_Set(cdPort, cdPinSet) #define CS_ACTIVE csPort->regs->BRR |= csPinSet //PIO_Clear(csPort, csPinSet) #define CS_IDLE csPort->regs->BSRR |= csPinSet //PIO_Set(csPort, csPinSet) // As part of the inline control, macros reference other macros...if any // of these are left undefined, an equivalent function version (non-inline) // is declared later. The Uno has a moderate amount of program space, so // only write8() is inlined -- that one provides the most performance // benefit, but unfortunately also generates the most bloat. This is // why only certain cases are inlined for each board. #define write8 write8inline #else

Diger67
Сб 12 сентября 2015 г. 18:39
Существует предложение попытаться использовать процессор и функции fsmc adafruit. Это значительно облегчает процессор. Во -первых, есть только FSMC в более старой STM.
Вот пример, чтобы начать ILI9341.
/********************************************************************/ #include "stm32f10x_gpio.h" #include "stm32f10x_fsmc.h" #include "stm32f10x_rcc.h" #include "stm32f10x.h" /*******************************************************************/ #define LCD_DATA ((uint32_t)0x60020000) #define LCD_REG ((uint32_t)0x60000000) /*******************************************************************/ void delay(uint32_t delayTime) { uint32_t i; for(i = 0; i < delayTime; i++); } /*******************************************************************/ /*void writeLCDCommand(unsigned int reg,unsigned int value) { *(uint16_t *) (LCD_REG) = reg; *(uint16_t *) (LCD_DATA) = value; }*/ /*******************************************************************/ void LCD_Write_COM(unsigned int reg) { *(uint16_t *) (LCD_REG) = reg; //*(uint16_t *) (LCD_DATA) = value; } /*******************************************************************/ //void writeLCDData(unsigned int data) void LCD_Write_DATA(unsigned int data) { *(uint16_t *) (LCD_DATA)= data; } /*******************************************************************/ void Lcd_data_start(void) { LCD_Write_COM(0x2c); } /*******************************************************************/ void Global_reset(void) { GPIO_ResetBits(GPIOE, GPIO_Pin_1); delay(0x0FFFFF); GPIO_SetBits(GPIOE, GPIO_Pin_1 ); delay(0x0FFFFF); } /*******************************************************************/ void initAll() { FSMC_NORSRAMInitTypeDef fsmc; FSMC_NORSRAMTimingInitTypeDef fsmcTiming; GPIO_InitTypeDef gpio; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE , ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15; gpio.GPIO_Mode = GPIO_Mode_AF_PP; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &gpio); gpio.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; gpio.GPIO_Mode = GPIO_Mode_AF_PP; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &gpio); gpio.GPIO_Mode = GPIO_Mode_Out_PP; gpio.GPIO_Pin = GPIO_Pin_6; GPIO_Init(GPIOD, &gpio); // Здесь у нас Reset gpio.GPIO_Pin = GPIO_Pin_1 ; GPIO_Init(GPIOE, &gpio); // CS gpio.GPIO_Mode = GPIO_Mode_AF_PP; gpio.GPIO_Pin = GPIO_Pin_7; GPIO_Init(GPIOD, &gpio); // RS gpio.GPIO_Pin = GPIO_Pin_11 ; GPIO_Init(GPIOD, &gpio); // CS -> 1 // Reset -> 0 // RD -> 1 // RW -> 1 GPIO_SetBits(GPIOD, GPIO_Pin_7); GPIO_ResetBits(GPIOE, GPIO_Pin_1); GPIO_SetBits(GPIOD, GPIO_Pin_4); GPIO_SetBits(GPIOD, GPIO_Pin_5); fsmcTiming.FSMC_AddressSetupTime = 0x02; fsmcTiming.FSMC_AddressHoldTime = 0x00; fsmcTiming.FSMC_DataSetupTime = 0x05; fsmcTiming.FSMC_BusTurnAroundDuration = 0x00; fsmcTiming.FSMC_CLKDivision = 0x00; fsmcTiming.FSMC_DataLatency = 0x00; fsmcTiming.FSMC_AccessMode = FSMC_AccessMode_B; fsmc.FSMC_Bank = FSMC_Bank1_NORSRAM1; fsmc.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; fsmc.FSMC_MemoryType = FSMC_MemoryType_NOR; fsmc.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; fsmc.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; fsmc.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; fsmc.FSMC_WrapMode = FSMC_WrapMode_Disable; fsmc.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; fsmc.FSMC_WriteOperation = FSMC_WriteOperation_Enable; fsmc.FSMC_WaitSignal = FSMC_WaitSignal_Disable; fsmc.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; fsmc.FSMC_WriteBurst = FSMC_WriteBurst_Disable; fsmc.FSMC_ReadWriteTimingStruct = &fsmcTiming; fsmc.FSMC_WriteTimingStruct = &fsmcTiming; fsmc.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; FSMC_NORSRAMInit(&fsmc); FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); } /*******************************************************************/ void initLCD() { Global_reset(); LCD_Write_COM(0x01); //reset delay(15); LCD_Write_COM(0x11);//sleep out delay(20); LCD_Write_COM(0x28); //display off delay(5); LCD_Write_COM(0xCF); //power control b LCD_Write_DATA(0x00); LCD_Write_DATA(0xC1); //83 81 AA LCD_Write_DATA(0x30); LCD_Write_COM(0xED); //power on seq control LCD_Write_DATA(0x64); //64 67 LCD_Write_DATA(0x03); LCD_Write_DATA(0x12); LCD_Write_DATA(0x81); LCD_Write_COM(0xE8); //timing control a LCD_Write_DATA(0x85); LCD_Write_DATA(0x00); // 01 LCD_Write_DATA(0x78); //79 78 LCD_Write_COM(0xCB); //power control a LCD_Write_DATA(0x39); LCD_Write_DATA(0X2C); LCD_Write_DATA(0x00); LCD_Write_DATA(0x34); LCD_Write_DATA(0x02); LCD_Write_COM(0xF7); //pump ratio control LCD_Write_DATA(0x20); LCD_Write_COM(0xEA); //timing control b LCD_Write_DATA(0x00); LCD_Write_DATA(0x00); LCD_Write_COM(0xC0); //power control 2 LCD_Write_DATA(0x23); //26 25 LCD_Write_COM(0xC1); //power control 2 LCD_Write_DATA(0x10);// 11 LCD_Write_COM(0xC5); //vcom control 1 LCD_Write_DATA(0x3E);// 35 LCD_Write_DATA(0x28);// 3E LCD_Write_COM(0xC7); //vcom control 2 LCD_Write_DATA(0x86); //BE 94 LCD_Write_COM(0xB1); //frame control LCD_Write_DATA(0x00); LCD_Write_DATA(0x18); //1B 70 LCD_Write_COM(0xB6); //display control LCD_Write_DATA(0x08);// 0A LCD_Write_DATA(0x82); LCD_Write_DATA(0x27); LCD_Write_DATA(0x00); LCD_Write_COM(0xB7); //emtry mode LCD_Write_DATA(0x07); LCD_Write_COM(0x3A); //pixel format LCD_Write_DATA(0x55); //16bit LCD_Write_COM(0xE0); LCD_Write_DATA(0x0F); LCD_Write_DATA(0x31); LCD_Write_DATA(0x2B); LCD_Write_DATA(0x0C); LCD_Write_DATA(0x0E); LCD_Write_DATA(0x08); LCD_Write_DATA(0x4E); LCD_Write_DATA(0xF1); LCD_Write_DATA(0x37); LCD_Write_DATA(0x07); LCD_Write_DATA(0x10); LCD_Write_DATA(0x03); LCD_Write_DATA(0x0E); LCD_Write_DATA(0x09); LCD_Write_DATA(0x00); LCD_Write_COM(0x36); //mem access //LCD_Write_DATA((1<<3)|(1<<6)); LCD_Write_DATA((1<<3)|(1<<7)); //rotate 180 LCD_Write_COM(0x29); //display on LCD_Write_COM(0x2C); delay(5); /*writeLCDCommand(0x0015,0x0030); writeLCDCommand(0x0011,0x0040); writeLCDCommand(0x0010,0x1628); writeLCDCommand(0x0012,0x0000); writeLCDCommand(0x0013,0x104d); delay(10); writeLCDCommand(0x0012,0x0010); delay(10); writeLCDCommand(0x0010,0x2620); writeLCDCommand(0x0013,0x344d); delay(10); writeLCDCommand(0x0001,0x0100); writeLCDCommand(0x0002,0x0300); writeLCDCommand(0x0003,0x1030); writeLCDCommand(0x0008,0x0604); writeLCDCommand(0x0009,0x0000); writeLCDCommand(0x000A,0x0008); writeLCDCommand(0x0041,0x0002); writeLCDCommand(0x0060,0x2700); writeLCDCommand(0x0061,0x0001); writeLCDCommand(0x0090,0x0182); writeLCDCommand(0x0093,0x0001); writeLCDCommand(0x00a3,0x0010); delay(10); writeLCDCommand(0x30,0x0000); writeLCDCommand(0x31,0x0502); writeLCDCommand(0x32,0x0307); writeLCDCommand(0x33,0x0305); writeLCDCommand(0x34,0x0004); writeLCDCommand(0x35,0x0402); writeLCDCommand(0x36,0x0707); writeLCDCommand(0x37,0x0503); writeLCDCommand(0x38,0x1505); writeLCDCommand(0x39,0x1505); delay(10); writeLCDCommand(0x0007,0x0001); delay(10); writeLCDCommand(0x0007,0x0021); writeLCDCommand(0x0007,0x0023); delay(10); writeLCDCommand(0x0007,0x0033); delay(10); writeLCDCommand(0x0007,0x0133);*/ } /*******************************************************************/ int main() { initAll(); delay(100); initLCD(); while(1) { int i; /*writeLCDCommand(0x0050, 0); writeLCDCommand(0x0051, 239); writeLCDCommand(0x0052, 0); writeLCDCommand(0x0053, 319); writeLCDCommand(32, 0); writeLCDCommand(33, 0);*/ LCD_Write_COM(0x51); LCD_Write_DATA(0x00); *(uint16_t *) (LCD_REG) = 0x2C; for (i = 0; i < 76800; i++) { LCD_Write_DATA(0xF800); } delay(0xFFFFFF); for (i = 0; i < 76800; i++) { LCD_Write_DATA(0x07E0); } delay(0xFFFFFF); for (i = 0; i < 76800; i++) { LCD_Write_DATA(0x001F); } delay(0xFFFFFF); for (i = 0; i < 76800; i++) { LCD_Write_DATA(0x03EF); } delay(0xFFFFFF); for (i = 0; i < 76800; i++) { LCD_Write_DATA(0xFFE0); } delay(0xFFFFFF); } } /*******************************************************************/

Diger67
Вторник 15 сентября 2015 г., 17:00
Разработка темы адаптации к библиотеке Adafruit STM32. Библиотека для 16 -битной шины с использованием FSMC. Легко выполнить работу для 8-битного автобуса. /*******************************************************************/ #include "stm32f10x_gpio.h" #include "stm32f10x_fsmc.h" #include "stm32f10x_rcc.h" #include "stm32f10x.h" #include "reg_9341.h" #define DELAY_TIME 1 #define TFTWIDTH 240 #define TFTHEIGHT 320 uint8_t rotation; const uint16_t WIDTH, HEIGHT; uint16_t _width, _height; /*******************************************************************/ // Определяем адреса, по которым будем записывать данные // Для записи данных #define LCD_DATA ((uint32_t)0x60020000) // Для записи команд #define LCD_REG ((uint32_t)0x60000000) /*******************************************************************/ // Простенькая функция задержки void delay(uint32_t delayTime) { uint32_t i; for(i = 0; i < delayTime; i++); } /*******************************************************************/ // Так мы будем писать команды в регистры LCD /*void writeLCDCommand(unsigned int reg,unsigned int value) { *(uint16_t *) (LCD_REG) = reg; *(uint16_t *) (LCD_DATA) = value; }*/ /*******************************************************************/// Так мы будем писать команды в регистры LCD void LCD_Write_COM(unsigned int reg) { *(uint16_t *) (LCD_REG) = reg; //*(uint16_t *) (LCD_DATA) = value; } /*******************************************************************/ // А так данные.. //void writeLCDData(unsigned int data) void LCD_Write_DATA(unsigned int data) { *(uint16_t *) (LCD_DATA)= data; } /*******************************************************************/ void Lcd_data_start(void) { LCD_Write_COM(0x2c); } /*******************************************************************/ void Global_reset(void) { GPIO_ResetBits(GPIOE, GPIO_Pin_1); delay(0x0FFFFF); GPIO_SetBits(GPIOE, GPIO_Pin_1 ); delay(0x0FFFFF); } /*******************************************************************/ void initAll() { FSMC_NORSRAMInitTypeDef fsmc; FSMC_NORSRAMTimingInitTypeDef fsmcTiming; GPIO_InitTypeDef gpio; // Включаем тактирование портов RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE , ENABLE); // И тактирование FSMC RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); // Инициализация пинов, задейстованных в общении по FSMC gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15; gpio.GPIO_Mode = GPIO_Mode_AF_PP; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &gpio); gpio.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; gpio.GPIO_Mode = GPIO_Mode_AF_PP; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &gpio); gpio.GPIO_Mode = GPIO_Mode_Out_PP; gpio.GPIO_Pin = GPIO_Pin_6; GPIO_Init(GPIOD, &gpio); // Здесь у нас Reset gpio.GPIO_Pin = GPIO_Pin_1 ; GPIO_Init(GPIOE, &gpio); // CS gpio.GPIO_Mode = GPIO_Mode_AF_PP; gpio.GPIO_Pin = GPIO_Pin_7; GPIO_Init(GPIOD, &gpio); // RS gpio.GPIO_Pin = GPIO_Pin_11 ; GPIO_Init(GPIOD, &gpio); // CS -> 1 // Reset -> 0 // RD -> 1 // RW -> 1 GPIO_SetBits(GPIOD, GPIO_Pin_7); GPIO_ResetBits(GPIOE, GPIO_Pin_1); GPIO_SetBits(GPIOD, GPIO_Pin_4); GPIO_SetBits(GPIOD, GPIO_Pin_5); // Настройка FSMC fsmcTiming.FSMC_AddressSetupTime = 0x02; fsmcTiming.FSMC_AddressHoldTime = 0x00; fsmcTiming.FSMC_DataSetupTime = 0x04;//0x05 fsmcTiming.FSMC_BusTurnAroundDuration = 0x00; fsmcTiming.FSMC_CLKDivision = 0x00; fsmcTiming.FSMC_DataLatency = 0x00; fsmcTiming.FSMC_AccessMode = FSMC_AccessMode_B; fsmc.FSMC_Bank = FSMC_Bank1_NORSRAM1; fsmc.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; fsmc.FSMC_MemoryType = FSMC_MemoryType_NOR; fsmc.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; fsmc.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; fsmc.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; fsmc.FSMC_WrapMode = FSMC_WrapMode_Disable; fsmc.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; fsmc.FSMC_WriteOperation = FSMC_WriteOperation_Enable; fsmc.FSMC_WaitSignal = FSMC_WaitSignal_Disable; fsmc.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; fsmc.FSMC_WriteBurst = FSMC_WriteBurst_Disable; fsmc.FSMC_ReadWriteTimingStruct = &fsmcTiming; fsmc.FSMC_WriteTimingStruct = &fsmcTiming; fsmc.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; FSMC_NORSRAMInit(&fsmc); FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); rotation = 1; _width = TFTWIDTH; _height = TFTHEIGHT; } /*******************************************************************/ void initLCD() { // Глобальный Reset дисплея Global_reset(); // Пляски с бубном от китайских товарищей LCD_Write_COM(0x01); //reset delay(15); LCD_Write_COM(0x11);//sleep out delay(20); LCD_Write_COM(0x28); //display off delay(5); LCD_Write_COM(0xCF); //power control b LCD_Write_DATA(0x00); LCD_Write_DATA(0xC1); //83 81 AA LCD_Write_DATA(0x30); LCD_Write_COM(0xED); //power on seq control LCD_Write_DATA(0x64); //64 67 LCD_Write_DATA(0x03); LCD_Write_DATA(0x12); LCD_Write_DATA(0x81); LCD_Write_COM(0xE8); //timing control a LCD_Write_DATA(0x85); LCD_Write_DATA(0x00); // 01 LCD_Write_DATA(0x78); //79 78 LCD_Write_COM(0xCB); //power control a LCD_Write_DATA(0x39); LCD_Write_DATA(0X2C); LCD_Write_DATA(0x00); LCD_Write_DATA(0x34); LCD_Write_DATA(0x02); LCD_Write_COM(0xF7); //pump ratio control LCD_Write_DATA(0x20); LCD_Write_COM(0xEA); //timing control b LCD_Write_DATA(0x00); LCD_Write_DATA(0x00); LCD_Write_COM(0xC0); //power control 2 LCD_Write_DATA(0x23); //26 25 LCD_Write_COM(0xC1); //power control 2 LCD_Write_DATA(0x10);// 11 LCD_Write_COM(0xC5); //vcom control 1 LCD_Write_DATA(0x3E);// 35 LCD_Write_DATA(0x28);// 3E LCD_Write_COM(0xC7); //vcom control 2 LCD_Write_DATA(0x86); //BE 94 LCD_Write_COM(0xB1); //frame control LCD_Write_DATA(0x00); LCD_Write_DATA(0x18); //1B 70 LCD_Write_COM(0xB6); //display control LCD_Write_DATA(0x08);// 0A LCD_Write_DATA(0x82); LCD_Write_DATA(0x27); LCD_Write_DATA(0x00); LCD_Write_COM(0xB7); //emtry mode LCD_Write_DATA(0x07); LCD_Write_COM(0x3A); //pixel format LCD_Write_DATA(0x55); //16bit LCD_Write_COM(0xE0); LCD_Write_DATA(0x0F); LCD_Write_DATA(0x31); LCD_Write_DATA(0x2B); LCD_Write_DATA(0x0C); LCD_Write_DATA(0x0E); LCD_Write_DATA(0x08); LCD_Write_DATA(0x4E); LCD_Write_DATA(0xF1); LCD_Write_DATA(0x37); LCD_Write_DATA(0x07); LCD_Write_DATA(0x10); LCD_Write_DATA(0x03); LCD_Write_DATA(0x0E); LCD_Write_DATA(0x09); LCD_Write_DATA(0x00); LCD_Write_COM(0x36); //mem access LCD_Write_DATA((1<<3)|(1<<6)); //LCD_Write_DATA((1<<3)|(1<<7)); //rotate 180 LCD_Write_COM(0x29); //display on LCD_Write_COM(0x2C); delay(5); /*writeLCDCommand(0x0015,0x0030); writeLCDCommand(0x0011,0x0040); writeLCDCommand(0x0010,0x1628); writeLCDCommand(0x0012,0x0000); writeLCDCommand(0x0013,0x104d); delay(10); writeLCDCommand(0x0012,0x0010); delay(10); writeLCDCommand(0x0010,0x2620); writeLCDCommand(0x0013,0x344d); delay(10); writeLCDCommand(0x0001,0x0100); writeLCDCommand(0x0002,0x0300); writeLCDCommand(0x0003,0x1030); writeLCDCommand(0x0008,0x0604); writeLCDCommand(0x0009,0x0000); writeLCDCommand(0x000A,0x0008); writeLCDCommand(0x0041,0x0002); writeLCDCommand(0x0060,0x2700); writeLCDCommand(0x0061,0x0001); writeLCDCommand(0x0090,0x0182); writeLCDCommand(0x0093,0x0001); writeLCDCommand(0x00a3,0x0010); delay(10); // Настройки гаммы writeLCDCommand(0x30,0x0000); writeLCDCommand(0x31,0x0502); writeLCDCommand(0x32,0x0307); writeLCDCommand(0x33,0x0305); writeLCDCommand(0x34,0x0004); writeLCDCommand(0x35,0x0402); writeLCDCommand(0x36,0x0707); writeLCDCommand(0x37,0x0503); writeLCDCommand(0x38,0x1505); writeLCDCommand(0x39,0x1505); delay(10); // Включение дисплея writeLCDCommand(0x0007,0x0001); delay(10); writeLCDCommand(0x0007,0x0021); writeLCDCommand(0x0007,0x0023); delay(10); writeLCDCommand(0x0007,0x0033); delay(10); writeLCDCommand(0x0007,0x0133);*/ } /*******************************************************************/ int main() { initAll(); delay(100); initLCD(); //setRotation(0); while(1) { int i; // Начальный и конечный адреса по горизонтали /*writeLCDCommand(0x0050, 0); writeLCDCommand(0x0051, 239); // Начальный и конечный адреса по вертикали writeLCDCommand(0x0052, 0); writeLCDCommand(0x0053, 319); writeLCDCommand(32, 0); writeLCDCommand(33, 0);*/ //drawPixel(30, 40, 0xFFFF); //LCD_Write_COM(0x51); //LCD_Write_DATA(0x00); //*(uint16_t *) (LCD_REG) = 0x2C; // Красный //fillScreen(0xF800); /*for (i = 0; i < 76800; i++) { LCD_Write_DATA(0xF800); //drawPixel(30, 40, 0x0000); }*/ //drawPixel(30, 40, 0x0000); //delay(0xFFFFFF); // Зеленый //fillScreen(0x07E0); /*for (i = 0; i < 76800; i++) { LCD_Write_DATA(0x07E0); }*/ //delay(0xFFFFFF); //Синий //fillScreen(0x001F); /*for (i = 0; i < 76800; i++) { LCD_Write_DATA(0x001F); //drawPixel(30, 40, 0x0000); }*/ //delay(0xFFFFFF); //Серый //fillScreen(0x03EF); /*for (i = 0; i < 76800; i++) { LCD_Write_DATA(0x03EF); //drawPixel(30, 40, 0x0000); }*/ //delay(0xFFFFFF); //fillScreen(0xFFE0); /*for (i = 0; i < 76800; i++) { LCD_Write_DATA(0xFFE0); //drawPixel(30, 40, 0x0000); }*/ //delay(0xFFFFFF); //fillScreen(0x0000); /*for (i = 0; i < 76800; i++) { LCD_Write_DATA(0x0000); //drawPixel(30, 40, 0x0000); }*/ //delay(0xFFFFFF); for(i = 0; i < 4; i++) { setRotation(i); fillScreen(0x03EF); fillRect(20, 30, 50, 70, 0xF800); delay(0x0FFFFF); } } } /*void Adafruit_GFX(int16_t w, int16_t h) { WIDTH(w), HEIGHT(h); }*/ void Rotation(uint8_t x) { rotation = (x & 3); switch(rotation) { case 0: case 2: _width = TFTWIDTH; _height = TFTHEIGHT; break; case 1: case 3: _width = TFTHEIGHT; _height = TFTWIDTH; break; } } void setRotation(uint8_t x) { Rotation(x); uint16_t t; switch (rotation) { case 2: //Rotation(x); t = ILI9341_MADCTL_MX | ILI9341_MADCTL_BGR; break; case 3: //Rotation(x); t = ILI9341_MADCTL_MV | ILI9341_MADCTL_BGR; break; case 0: //Rotation(x); t = ILI9341_MADCTL_MY | ILI9341_MADCTL_BGR; break; case 1: //Rotation(x); t = ILI9341_MADCTL_MX | ILI9341_MADCTL_MY | ILI9341_MADCTL_MV | ILI9341_MADCTL_BGR; break; } LCD_Write_COM(ILI9341_MADCTL); // MADCTL LCD_Write_DATA(t); // For 9341, init default full-screen address window: setAddrWindow(0, 0, _width - 1, _height - 1); } void setAddrWindow(int x1, int y1, int x2, int y2) { uint32_t t; t = x1; t <<= 16; t |= x2; writeRegister32(ILI9341_COLADDRSET, t); // HX8357D uses same registers! t = y1; t <<= 16; t |= y2; writeRegister32(ILI9341_PAGEADDRSET, t); // HX8357D uses same registers! } void fillRect(int16_t x1, int16_t y1, int16_t w, int16_t h, uint16_t fillcolor) { int16_t x2, y2; // Initial off-screen clipping if( (w <= 0 ) || (h <= 0 ) || (x1 >= _width) || (y1 >= _height) || ((x2 = x1+w-1) < 0 ) || ((y2 = y1+h-1) < 0 )) return; if(x1 < 0) { // Clip left w += x1; x1 = 0; } if(y1 < 0) { // Clip top h += y1; y1 = 0; } if(x2 >= _width) { // Clip right x2 = _width - 1; w = x2 - x1 + 1; } if(y2 >= _height) { // Clip bottom y2 = _height - 1; h = y2 - y1 + 1; } setAddrWindow(x1, y1, x2, y2); flood(fillcolor, (uint32_t)w * (uint32_t)h); } void fillScreen(uint16_t color) { setAddrWindow(0, 0, _width - 1, _height - 1); flood(color, (long)TFTWIDTH * (long)TFTHEIGHT); } void flood(uint16_t color, uint32_t len) { uint16_t blocks; int i; LCD_Write_COM(0x2c); LCD_Write_DATA(color); len--; blocks = (uint16_t)(len / 64); // 64 pixels/block while(blocks--) { i = 16; // 64 pixels/block / 4 pixels/pass do { LCD_Write_DATA(color); LCD_Write_DATA(color); LCD_Write_DATA(color); LCD_Write_DATA(color); } while(--i); } for(i = (uint8_t)len & 63; i--; ) { LCD_Write_DATA(color); } } void drawPixel(int16_t x, int16_t y, uint16_t color) { setAddrWindow(x, y, _width-1, _height-1); *(uint16_t *) (LCD_REG) = 0x2C; LCD_Write_DATA(color); } void writeRegister32(uint16_t r, uint32_t d) { //CS_ACTIVE; //CD_COMMAND; LCD_Write_COM(r); //write8(r); //CD_DATA; delay(DELAY_TIME); LCD_Write_DATA(d>>24); //write8(d >> 24); delay(DELAY_TIME); LCD_Write_DATA(d>>16); //write8(d >> 16); delay(DELAY_TIME); LCD_Write_DATA(d>>8); //write8(d >> 8); delay(DELAY_TIME); LCD_Write_DATA(d); //CS_IDLE; } /*******************************************************************/

Стевех
Вторник 15 сентября 2015 г. 20:08
В библиотеках HAL есть FSMC с кодом драйвера DMA - вы можете использовать это или адаптировать или просто изучить его.

Diger67
Ср. 16 сентября 2015 г. 12:50
Стевех написал:В библиотеках HAL есть FSMC с кодом драйвера DMA - вы можете использовать это или адаптировать или просто изучить его.

Дэвидж
Пн 20 июня 2016 г., 14:29
Я ищу Adafruit Libary для STM32F108, чтобы взаимодействовать с 8 -битным ILI9325.
Этот код выглядит многообещающе, но я получаю ошибку: STM32F10X_GPIO.H: нет такого файла или каталога
Я пытался копировать этот файл повсюду, но не повезло.
Помощь была бы очень оценена.

ZMEMW16
Пн 20 июня 2016 г., 19:55
Попробуйте поиск STM32F108 на сайте STM, ничего подобного

Simple Google для ILI9325 дает 2 -ю ссылку как
https: // www.Адафрут.com/продукт/335
и третья ссылка как
http: // tronixstuff.com/2013/04/26/репетитор ... D-модулы/

Стивен

Martinayotte
Пн 20 июня 2016 г., 8:48 вечера
F108 на самом деле F103 с закрытым ртом ... :ржу не могу:

Rogerclark
Пн 20 июня 2016 г., 21:54
GOOGLLED для этого файла показывает, что его часть STMS Old CMSIS.

Ядро Libmaple не использует CMSIS из -за исторических вопросов лицензирования.

Вам нужно будет прокомментировать, которые включают, а затем посмотреть, какие функции вызываются, и они изменяют библиотеку, чтобы использовать эквивалентные функции Libmaple, или, возможно, напрямую манипулировать аппаратным обеспечением.

ZMEMW16
Пн 20 июня 2016 г. 11:59 вечера
Martinayotte написал:F108 на самом деле F103 с закрытым ртом ... :ржу не могу:

Rogerclark
Вт 21 июня 2016 г. 12:20 утра
Я не уверен, что это поможет (мне нужно это проверить)

Но я работал над HAL как библиотеку.

Я не уверен, может ли одна библиотека включить еще одну библиотеку, но это может быть способ перенести какой -то код на основе CMSIS, хотя и до тех пор, пока этот код совместим с CMSIS, который генерируется кубом STM

Mrburnette
Вт 21 июня 2016 12:18
Rogerclark написал: <...>
Я не уверен, может ли одна библиотека включить другую библиотеку<...>

Rogerclark
Вт 21 июня 2016 г. 22:47
Спасибо, Рэй.

Библиотека HAL, на самом деле не библиотека, это просто способ заставить IDE скомпилировать и связать файлы STM HAL и прочитать во всех заголовках, чтобы функции HAL можно было вызвать внутри эскиза.

HAL записано в C и, кажется, просто нагрузка разрозненных файлов, каждый из которых имеет сгруппированный набор функций в них.

Но это много файлов, я их не считал, но это выглядит как 100'ish и занимает несколько мегабайт.

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

Mrburnette
Ср 22 июня 2016 12:47
Rogerclark написал: <...>
Библиотека HAL, на самом деле не библиотека, это просто способ заставить IDE скомпилировать и связать файлы STM HAL и прочитать во всех заголовках, чтобы функции HAL можно было вызвать внутри эскиза.
<...>
Но это много файлов, я их не считал, но это выглядит как 100'sh, и занимает несколько мегабайт.
<....

Rogerclark
Ср 22 июня 2016 г., 21:41
Привет, Рэй,

Эта путаница моя вина.

Я играю быстро и свободно с парадигмой библиотеки Ардуино.

В прошлом я немного согнул правила с системой библиотек, создавая пустую библиотеку, просто чтобы поместить наши примеры; Таким образом, они могут быть достигнуты через систему меню.

Но в этом случае заголовок действительно включает в себя некоторые файлы, и IDE действительно должен компилировать целые файлы LoadMOF, но ни один из них, AFIK, не является классами.

Я могу даже удалить фиктивный класс HAL, который я сделал, так как он может вообще не понадобиться, в зависимости от того, должен ли какой -либо код инициализации необходимо выполнить - и на данный момент, похоже, выполнение функции HAL_INIT () по умолчанию вводит, Поскольку он либо испортит PLL, либо, возможно, делает что -то странное для Systick, (у меня не было времени, чтобы точно исследовать, на что это влияет, поэтому я не вызываю hal_init () из библиотеки в настоящее время)

Iwalpola
Сб 2 июля 2016 г. 15:12
Рабочая библиотека

С вашей помощью Martinayotte, посты Wardfcat и Diger67 в http: // www.STM32duino.com/viewtopic.PHP?f = 9&t = 474 Мне удалось перенести версию SPI библиотеки ILI9341 для работы с 8 -битной параллельной.

ViewTopic.PHP?F = 44&t = 637&P = 15438#P15438

GitHub:
https: // github.com/iwalpola/adafruit_ili9341_8bit_stm/
Демонстрация:
https: // www.YouTube.com/watch?v = makmazyzmwm

Rogerclark
Сб 2 июля 2016 г., 21:33
У вас есть вывод отладки от отладывания времени Milliseconds от Demo Adafruit Graphics, в вашем видео на YouTube, чтобы мы могли сравнить скорость со SPI?

Martinayotte
Sun 3 июля 2016 г. 1:55 утра
Отличная работа, @iwalpola !

В моем случае с NetDuino2plus Pinouts как uint8_t dpins [] = {PC7, PC6, PA3, PA2, PB12, PB8, PB9, PA1, PA0, PA6}; Я не думаю, что смогу получить много скоростной оптимизации ...

Iwalpola
Sun 3 июля 2016 г., 3:25 утра
Rogerclark написал:У вас есть вывод отладки от отладывания времени Milliseconds от Demo Adafruit Graphics, в вашем видео на YouTube, чтобы мы могли сравнить скорость со SPI?

Mrburnette
Sun 3 июля 2016 г. 14:39
Iwalpola написал: Мне также любопытно узнать производительность по сравнению со SPI.

Iwalpola
Sun 3 июля 2016 г., 17:16
Новый эталон после замены Regs->ODR с рег->BSRR и рег->Борьба
Benchmark Time (microseconds) Screen fill 1478774 Text 43997 Lines 376454 Horiz/Vert Lines 101883 Rectangles (outline) 65100 Rectangles (filled) 3070377 Circles (filled) 419900 Circles (outline) 285285 Triangles (outline) 90139 Triangles (filled) 713698 Rounded rects (outline) 131807 Rounded rects (filled) 3324904 Done!

Ахулл
Sun 3 июля 2016 г., 19:54
Iwalpola написал:Новый эталон после замены Regs->ODR с рег->BSRR и рег->Борьба
Benchmark Time (microseconds) Screen fill 1478774 Text 43997 Lines 376454 Horiz/Vert Lines 101883 Rectangles (outline) 65100 Rectangles (filled) 3070377 Circles (filled) 419900 Circles (outline) 285285 Triangles (outline) 90139 Triangles (filled) 713698 Rounded rects (outline) 131807 Rounded rects (filled) 3324904 Done!

Martinayotte
Sun 3 июля 2016 г., 8:10 вечера
Энди, даже если ЖК-дисплей параллелен, если код должен назначать GPIOS один за другим, особенно в случае щита с D2-D9, где эти GPIO не являются последовательными (особенно на NetDuino2plus), производительность ввода/вывода трудно достичь.

Iwalpola
Sun 3 июля 2016 г., 8:36 вечера
@И библиотека Курта кажется довольно быстрой в некоторых операциях, и мне любопытно понять, почему. Я буду отдавать.
@Martin, возможно, все сводится к функциям библиотеки GFX?
Действительно очень любопытно

Ахулл
Sun 3 июля 2016 г., 8:51 вечера
Martinayotte написал:Энди, даже если ЖК-дисплей параллелен, если код должен назначать GPIOS один за другим, особенно в случае щита с D2-D9, где эти GPIO не являются последовательными (особенно на NetDuino2plus), производительность ввода/вывода трудно достичь.

Rogerclark
Sun 3 июля 2016 г., 22:27
Интересный.

Я посмотрел на некоторые предыдущие сообщения на форуме e.глин. http: // www.STM32duino.com/viewtopic.PHP?t = 862&начало = 40

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

Из того, что я помню, библиотека, основанная на ADAfruit SPI, не очень эффективна при написании отдельных пикселей, и я подозреваю, что улучшения могут быть внесены в версию SPI, которая может улучшить скорость доступа к одному пикселю в версии SPI.
(Я думаю, что у Teensy есть оптимизированная библиотека с быстрым доступом к пикселю)


Там, где это действительно входит в свои собственные, на платах, которые используют F103V или F103Z, которые имеют целые порты GPIO, которые не используются.
И дальнейшие улучшения скорости могут быть достигнуты там, где есть отдельные данные и адресные порты.

Rogerclark
Sun 3 июля 2016 г., 11:02 вечера
Просто быстрое продолжение медленных скоростей пикселя в версии SPI, и если я не посмотрел не в неправильном файле...

Функция Drawpixel тратит много времени, так как предполагает, что ее призывают к команде с одной вне.

Простое решение состоит в том, чтобы иметь 2 функции, чтобы написать пиксель, который работает отдельно и инициализированным SPI для его E E.G Chip Select Pins и т. Д.
Затем получите функции треугольника, чтобы вызвать неэндилоновую версию.

В идеале функция нестандартного уровня была бы частной для класса, но, поскольку генератор текста находится в отдельном CPP, я думаю, чтобы оптимизировать текст, новая функция должна быть обнародована, что не идеально, но не то, что я Схлал сон ;-)
void Adafruit_ILI9341_STM::drawPixel(int16_t x, int16_t y, uint16_t color) { if ((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) return; if (hwSPI) spi_begin(); setAddrWindow(x, y, x + 1, y + 1); *dcport |= dcpinmask; *csport &= ~cspinmask; spiwrite(color >> 8); spiwrite(color); *csport |= cspinmask; if (hwSPI) spi_end(); }

Iwalpola
Sun 3 июля 2016 г., 11:13
@ Roger, вы почти правы, и вы ссылаетесь на код SPI, а не 8 -битный параллель. Функции чертежа треугольника вызывают функции, которые рисуют линии (горизонтальные, вертикальные или наклонные). Эти функции, в свою очередь, вызывают функцию рисования пикселя, но только если длина линии составляет 1px.

Однако на рисунке линии, заполнении экрана и т. Д., При написании много данных, было место для улучшения переключения и переключения RS PIN -кода (которые решают, являются ли данные, написанные командами или данными).

Таким образом, после корректировки (после того, как вы делаете GIT Diff), эталон лучше, чем мод Курта!! Может быть, есть место для еще большего улучшения, но я думаю, это довольно хорошо.
Benchmark Time (microseconds) Screen fill 784951 Text 27277 Lines 242789 Horiz/Vert Lines 66034 Rectangles (outline) 42204 Rectangles (filled) 1630078 Circles (filled) 240487 Circles (outline) 180967 Triangles (outline) 58242 Triangles (filled) 563808 Rounded rects (outline) 84634 Rounded rects (filled) 1777583

Rogerclark
Sun 3 июля 2016 г., 11:25
Да. Я имел в виду версию SPI

Перевернает ли параллельная версия CS и т. Д. Для каждого пикселя, или вы оптимизировали ее?

Iwalpola
Sun 3 июля 2016 г., 11:39
Rogerclark написал:Да. Я имел в виду версию SPI

Перевернает ли параллельная версия CS и т. Д. Для каждого пикселя, или вы оптимизировали ее?

Rogerclark
Пн июля, 4 июля 2016 г., 12:43
Iwalpola написал: Он делал CS переключать для каждого пикселя ранее (моя глупая идея). Теперь я исправил это.

Я волновался, что он мешает выходу с прикосновением дигитизатора, доступным в том же модуле (TFT и Touch Share 4 Pins).

Martinayotte
Пн июля, 4 июля 2016 г., 2:09
Я начинаю неправильно понимать всю ветку здесь:
При каждой параллельной передаче 8BIS должен быть импульс CS.
Итак, как это можно пропустить для оптимизации ?

Rogerclark
Пн июля, 04, 2016, 2:17 утра
CS может, вероятно, пропустить, если на SPI находится только одно устройство, но его жестко закодировано в Adafruit ILI9341 LIB.

Другая строка, которую нужно много переключать, - это PIN -код данных / командный

Похоже, главная причина, по которой написание отдельных пикселей является медленной, - это не линия CS, а ненужное призвание SPI начинает транзакцию перед написанием каждого пикселя, что занимает огромное количество времени, поскольку все устройство SPI должно быть отключено и все такое Настройки обновляются и т. д. и т. Д

Некоторые минимальные изменения приведут к значительному улучшению скорости в некоторых функциях e.глин. Рисование диагональных линий, но Adafruit Graphics Lib также должна быть обновлена, чтобы получить более быстрые скорости текста.

Если у меня будет время сегодня вечером, я быстро посмотрю на существующий код в ADAFRIT_ILI9341_STM LIB (для F1)

Iwalpola
Пн июля, 4 июля 2016 г., 2:36 утра
Еще одно усиление производительности, внедряя функцию write8special ().
Демо (почти слишком быстро, чтобы увидеть):
https: // youtu.be/sgu_wwx20hm

@Roger, наверняка должен быть потенциал для улучшения в коде SPI. Сегодня я узнал, что даже задержка за задержку с микросекундами наносится быстро, когда вы повторяете ее 10000 раз.
Benchmark Time (microseconds) Screen fill 320577 Text 14869 Lines 129592 Horiz/Vert Lines 25437 Rectangles (outline) 16493 Rectangles (filled) 666012 Circles (filled) 104502 Circles (outline) 96406 Triangles (outline) 30358 Triangles (filled) 230338 Rounded rects (outline) 41103 Rounded rects (filled) 709046 Done!

Rogerclark
Пн июля, 4 июля 2016 г., 4:03
Спасибо за публикацию обновленного видео

Re: Версия SPI

Да.
Теперь я смотрю на код, есть много места для улучшения, и, как вы сказали, даже несколько нас сбрили здесь и там в функциях низкого уровня, имеют большое значение.

Что еще медленнее для вас, так это заполнение, так как вы не можете извлечь выгоду из DMA. Что ж, если бы булавки были рядом с началом порта, вы могли бы использовать DMA, поскольку вы можете DMA к GPIO (но у нас нет никакого демонстрационного кода для этого)
Но когда вы используете булавки по всему доску, DMA на самом деле не поможет :-(

Ахулл
Пн июля, 04, 2016, 10:03 утра
Iwalpola написал:Еще одно усиление производительности, внедряя функцию write8special ().
Демо (почти слишком быстро, чтобы увидеть):
https: // youtu.be/sgu_wwx20hm

@Roger, наверняка должен быть потенциал для улучшения в коде SPI. Сегодня я узнал, что даже задержка за задержку с микросекундами наносится быстро, когда вы повторяете ее 10000 раз.
Benchmark Time (microseconds) Screen fill 320577 Text 14869 Lines 129592 Horiz/Vert Lines 25437 Rectangles (outline) 16493 Rectangles (filled) 666012 Circles (filled) 104502 Circles (outline) 96406 Triangles (outline) 30358 Triangles (filled) 230338 Rounded rects (outline) 41103 Rounded rects (filled) 709046 Done!

Racemaniac
Пн, 04 июля 2016 г., 13:54
Rogerclark написал:Спасибо за публикацию обновленного видео

Re: Версия SPI

Да.
Теперь я смотрю на код, есть много места для улучшения, и, как вы сказали, даже несколько нас сбрили здесь и там в функциях низкого уровня, имеют большое значение.

Что еще медленнее для вас, так это заполнение, так как вы не можете извлечь выгоду из DMA. Что ж, если бы булавки были рядом с началом порта, вы могли бы использовать DMA, поскольку вы можете DMA к GPIO (но у нас нет никакого демонстрационного кода для этого)

Rogerclark
Пн, 04 июля 2016 г., 21:28
Спасибо

Rogerclark
Пн, 04 июля 2016 г., 22:38
@iwalpola

Можете ли вы опубликовать код в свой эскиз, который вы используете для этих результатов времени, так как я не думаю, что это тот же набросок, который я использую для сравнения скорости SPI

(Или опубликуйте ссылку на исходный код эскиза)

Спасибо

Роджер

Iwalpola
Втюж 5 июля 2016 г., 21:12
Rogerclark написал:Post Code

Ахулл
Втюж 5 июля 2016 г., 22:03
Benchmark Time (microseconds) Screen fill 320577 ...

Rogerclark
Втюж 5 июля 2016 г. 22:27
SPI в настоящее время дает мне эти результаты
Benchmark Time (microseconds) Screen fill 170787 Text 22869 Lines 241990 Horiz/Vert Lines 15802 Rectangles (outline) 11547 Rectangles (filled) 355060 Circles (filled) 142830 Circles (outline) 173697 Triangles (outline) 59139 Triangles (filled) 165883 Rounded rects (outline) 59967 Rounded rects (filled) 415460

Ахулл
Вторник 05 июля 2016 г. 22:32
Интересно отметить, что не все улучшено с помощью DMA, например, линейного рисунка и текста, кажется, медленнее.
Знаем ли мы, каковы абсолютные пределы дисплея, с точки зрения скорости?

Iwalpola
Ср. 06 июля 2016 г. 6:18
Ахулл написал:Примерно сколько параллельных записей в секунду, как вы думаете, вы можете управлять?

Iwalpola
Ср. 06 июля 2016 г. 6:59
Реданьяк написал: да, мы делаем: P
http: // www.STM32duino.com/viewtopic.PHP?F = 18&t = 1042

Diger67
Ср. 03 августа 2016 г., 21:23
Привет!
Я не работаю в среде с Arduino STM. Но может ли кто -нибудь пригодиться. Вот несколько определений. Их работа проверяется в Keil. Привязывающие выводы, сделанные для стандартных выводов местоположения Shild TFT для Arduino. Новое определение write8inline (d) быстрее, чем предыдущая версия.

//Port data |D7 | D6 |D5 |D4 |D3 | D2 |D1 |D0 | //Pin stm32 |PA8|PB10|PB4|PB5|PB3|PA10|PC7|PA9| //control port |RST| CS | RS | WR| RD| //Pin stm32 |PC0|PB0|PA4|PA1|PA0| #define write8inline(d) {\ GPIOA->BSRR = (data & (1<<0)) ? GPIO_BSRR_BS9 : GPIO_BSRR_BR9;\ GPIOC->BSRR = (data & (1<<1)) ? GPIO_BSRR_BS7 : GPIO_BSRR_BR7;\ GPIOA->BSRR = (data & (1<<2)) ? GPIO_BSRR_BS10 : GPIO_BSRR_BR10;\ GPIOB->BSRR = (data & (1<<3)) ? GPIO_BSRR_BS3 : GPIO_BSRR_BR3;\ GPIOB->BSRR = (data & (1<<4)) ? GPIO_BSRR_BS5 : GPIO_BSRR_BR5;\ GPIOB->BSRR = (data & (1<<5)) ? GPIO_BSRR_BS4 : GPIO_BSRR_BR4;\ GPIOB->BSRR = (data & (1<<6)) ? GPIO_BSRR_BS10 : GPIO_BSRR_BR10;\ GPIOA->BSRR = (data & (1<<7)) ? GPIO_BSRR_BS8 : GPIO_BSRR_BR8;\ WR_STROBE;\ } #define enportrcc() {\ RCC->APB2ENR |= ((RCC->APB2ENR &= 0xFFFFFFFF) | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN);\ AFIO->MAPR |= ((AFIO->MAPR &= 0xFFFFFFFF) | AFIO_MAPR_SWJ_CFG_JTAGDISABLE);\ GPIOA->CRL = ((GPIOA->CRL &= 0xFFF0FF00) | 0x00030033); \ GPIOC->CRL = ((GPIOC->CRL &= 0xFFFFFF0F) | 0x00000030); \ GPIOB->CRL = ((GPIOB->CRL &= 0xFFFFFFF0) | 0x00000003); \ } #define setWriteDirInline() { \ GPIOA->CRH = ((GPIOA->CRH &= 0xFFFFF000) | 0x00000333); \ GPIOC->CRL = ((GPIOC->CRL &= 0x0FFFFFFF) | 0x30000000); \ GPIOB->CRL = ((GPIOB->CRL &= 0xFF000FFF) | 0x00333000); \ GPIOB->CRH = ((GPIOB->CRH &= 0xFFFFF0FF) | 0x00000300); \ } #define setReadDirInline() { \ GPIOA->CRH = ((GPIOA->CRH &= 0xFFFFF000) | 0x00000444); \ GPIOC->CRL = ((GPIOC->CRL &= 0x0FFFFFFF) | 0x40000000); \ GPIOB->CRL = ((GPIOB->CRL &= 0xFF000FFF) | 0x00444000); \ GPIOB->CRH = ((GPIOB->CRH &= 0xFFFFF0FF) | 0x00000400); \ }

Рик Кимбалл
Ср. 03 августа 2016 г., 22:57
... эта строка:
#define enportrcc () {\
RCC->Apb2enr | = ((RCC->Apb2enr &= 0xffffffff) | Rcc_apb2enr_iopaen | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | Rcc_apb2enr_afioen); \
Афио->Mapr | = ((afio->Mapr &= 0xffffffff) | Afio_mapr_swj_cfg_jtagdisable); \
Вы пытаетесь очистить регистр APB2ENR с &= ((RCC->Apb2enr &= 0xffffffff) ?

Вероятно, легче установить его на ноль или использовать &= ((RCC->Apb2enr &= ~ 0xffffffff)

Или, может быть, я неправильно понимаю, что вы там делаете.

-рик

Diger67
Ср. 03 августа 2016 г., 11:22
Рик Кимбалл написал:
Вы пытаетесь очистить регистр APB2ENR с &= ((RCC->Apb2enr &= 0xffffffff) ?

Вероятно, легче установить его на ноль или использовать &= ((RCC->Apb2enr &= ~ 0xffffffff)

Или, может быть, я неправильно понимаю, что вы там делаете.

-рик

Стивестронг
Пт 26 августа 2016 г., 11:14
Что ж, мне пришлось заново изобрести колесо и адаптировать оригинальный либеральный либера.
Кроме того, мне пришлось придерживаться цифровых функций записи и чтения, потому что чистый регистр пишет для переключения булавки, был слишком быстрым, и экран пролетел!
Здесь мой эталон с использованием оригинального графического теста Adafruit INO: TFT LCD test TFT size is 240x320 Found ILI9328 LCD driver Benchmark Time (microseconds) Screen fill 1019555 Text 115645 Lines 719977 Horiz/Vert Lines 96056 Rectangles (outline) 69857 Rectangles (filled) 2155387 Circles (filled) 843279 Circles (outline) 313036 Triangles (outline) 228363 Triangles (filled) 993928 Rounded rects (outline) 146794 Rounded rects (filled) 2514008 Done!

Стивестронг
Сб 03 сентября 2016 12:50
После того, как я сброс LCD для правильной работы, это то, чего я достигаю, используя Adafruit Lib, перенесенный на STM32: TFT LCD test TFT size is 240x320 Found ILI9328 LCD driver Benchmark Time (microseconds) Screen fill 65561 Text 24708 Lines 141805 Horiz/Vert Lines 8723 Rectangles (outline) 7335 Rectangles (filled) 155516 Circles (filled) 134162 Circles (outline) 60283 Triangles (outline) 45012 Triangles (filled) 115087 Rounded rects (outline) 24511 Rounded rects (filled) 206878 Done! rotation: 0, text runtime: 24708 rotation: 1, text runtime: 24972 rotation: 2, text runtime: 24973 rotation: 3, text runtime: 24985

Вадимель
Сб 03 сентября 2016 г., 17:44
C: \ Documents and Settings \ vadim \ omoti okumentы \ arduino \ ardware \ arduino_stm32 \ stm32f1 \ libraries \ adafruit_tftlcd_8bit_stm32 \ adafruit_tftlcd_8bit_stm32.час

строка 84
#define Read8 (x) {x = read8_ ();}
=================================================

Стивестронг
Сб 03 сентября 2016 г., 19:03
Вадимель написал:Adafruit_tftlcd_8bit_stm32.час
строка 84
#define Read8 (x) {x = read8_ ();}

Итудилла
Ср. 15 февраля 2017 г. 7:32 утра
Большое спасибо за то, что сообщили нам об этих манипуляциях, они облегчают жизнь рабочих!