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.час:
Я пытаюсь портировать библиотеку 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 и т. Д
В любом случае, это должно дать вам старт ..
Каждый порт имеет несколько регистров, но я думаю, что те, кто вас интересует, - это регистр выходных данных (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;
девчонка->регс->BSRR = (Younum & 0x0f) | ~ (yournum & 0x0f)<<16;
Mrburnette
Пт, 07 августа 2015 г., 8:21 вечера
ZMEMW16 написал:
<...>
Мой мозг нанесен перегружен, и это была долгая ночь/день, но где маски 0x0F и << 16 Приходите из?
0xff's и << 8 - это то, что я ожидал?
Стивен
Мой мозг нанесен перегружен, и это была долгая ночь/день, но где маски 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.час:
В 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 не может дать достаточную мощность для проведения подсветки для ЖК -дисплея через один вывод без дополнительного аппаратного обеспечения.
Если это подсветка, чем подключить его к VCC, STM32 не может дать достаточную мощность для проведения подсветки для ЖК -дисплея через один вывод без дополнительного аппаратного обеспечения.
Wizarcl
Солнце 23 августа 2015 г., 21:36
Мадиас написал:...и что подключено к PC13?
Если это подсветка, чем подключить его к VCC, STM32 не может дать достаточную мощность для проведения подсветки для ЖК -дисплея через один вывод без дополнительного аппаратного обеспечения.
Если это подсветка, чем подключить его к VCC, STM32 не может дать достаточную мощность для проведения подсветки для ЖК -дисплея через один вывод без дополнительного аппаратного обеспечения.
Rogerclark
Пн 24 августа 2015 г., 3:45
Вы имеете в виду, что вы питаете весь ЖК -дисплей из 5V, E.глин. включая чипсы и т. Д
Это может вызвать проблемы, потому что STM32 - 3.Устройство 3 В, а не 5 В.
Я рекомендую вам питать ЖК -дисплей с 3.3В
Это может вызвать проблемы, потому что STM32 - 3.Устройство 3 В, а не 5 В.
Я рекомендую вам питать ЖК -дисплей с 3.3В
Wizarcl
Пн 24 августа 2015 г., 8:54 вечера
Rogerclark написал:Вы имеете в виду, что вы питаете весь ЖК -дисплей из 5V, E.глин. включая чипсы и т. Д
Это может вызвать проблемы, потому что STM32 - 3.Устройство 3 В, а не 5 В.
Я рекомендую вам питать ЖК -дисплей с 3.3В
Это может вызвать проблемы, потому что 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.час:
В 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.
Вот пример, чтобы начать 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: нет такого файла или каталога
Я пытался копировать этот файл повсюду, но не повезло.
Помощь была бы очень оценена.
Этот код выглядит многообещающе, но я получаю ошибку: 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-модулы/
Стивен
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, или, возможно, напрямую манипулировать аппаратным обеспечением.
Ядро Libmaple не использует CMSIS из -за исторических вопросов лицензирования.
Вам нужно будет прокомментировать, которые включают, а затем посмотреть, какие функции вызываются, и они изменяют библиотеку, чтобы использовать эквивалентные функции Libmaple, или, возможно, напрямую манипулировать аппаратным обеспечением.
ZMEMW16
Пн 20 июня 2016 г. 11:59 вечера
Martinayotte написал:F108 на самом деле F103 с закрытым ртом ...
Rogerclark
Вт 21 июня 2016 г. 12:20 утра
Я не уверен, что это поможет (мне нужно это проверить)
Но я работал над HAL как библиотеку.
Я не уверен, может ли одна библиотека включить еще одну библиотеку, но это может быть способ перенести какой -то код на основе CMSIS, хотя и до тех пор, пока этот код совместим с CMSIS, который генерируется кубом STM
Но я работал над HAL как библиотеку.
Я не уверен, может ли одна библиотека включить еще одну библиотеку, но это может быть способ перенести какой -то код на основе CMSIS, хотя и до тех пор, пока этот код совместим с CMSIS, который генерируется кубом STM
Mrburnette
Вт 21 июня 2016 12:18
Rogerclark написал:
<...>
Я не уверен, может ли одна библиотека включить другую библиотеку<...>
Я не уверен, может ли одна библиотека включить другую библиотеку<...>
Rogerclark
Вт 21 июня 2016 г. 22:47
Спасибо, Рэй.
Библиотека HAL, на самом деле не библиотека, это просто способ заставить IDE скомпилировать и связать файлы STM HAL и прочитать во всех заголовках, чтобы функции HAL можно было вызвать внутри эскиза.
HAL записано в C и, кажется, просто нагрузка разрозненных файлов, каждый из которых имеет сгруппированный набор функций в них.
Но это много файлов, я их не считал, но это выглядит как 100'ish и занимает несколько мегабайт.
Во всяком случае, это довольно экспериментально в данный момент, но может быть полезен для некоторых людей.
Библиотека HAL, на самом деле не библиотека, это просто способ заставить IDE скомпилировать и связать файлы STM HAL и прочитать во всех заголовках, чтобы функции HAL можно было вызвать внутри эскиза.
HAL записано в C и, кажется, просто нагрузка разрозненных файлов, каждый из которых имеет сгруппированный набор функций в них.
Но это много файлов, я их не считал, но это выглядит как 100'ish и занимает несколько мегабайт.
Во всяком случае, это довольно экспериментально в данный момент, но может быть полезен для некоторых людей.
Mrburnette
Ср 22 июня 2016 12:47
Rogerclark написал:
<...>
Библиотека HAL, на самом деле не библиотека, это просто способ заставить IDE скомпилировать и связать файлы STM HAL и прочитать во всех заголовках, чтобы функции HAL можно было вызвать внутри эскиза.
<...>
Но это много файлов, я их не считал, но это выглядит как 100'sh, и занимает несколько мегабайт.
<....
Библиотека HAL, на самом деле не библиотека, это просто способ заставить IDE скомпилировать и связать файлы STM HAL и прочитать во всех заголовках, чтобы функции HAL можно было вызвать внутри эскиза.
<...>
Но это много файлов, я их не считал, но это выглядит как 100'sh, и занимает несколько мегабайт.
<....
Rogerclark
Ср 22 июня 2016 г., 21:41
Привет, Рэй,
Эта путаница моя вина.
Я играю быстро и свободно с парадигмой библиотеки Ардуино.
В прошлом я немного согнул правила с системой библиотек, создавая пустую библиотеку, просто чтобы поместить наши примеры; Таким образом, они могут быть достигнуты через систему меню.
Но в этом случае заголовок действительно включает в себя некоторые файлы, и IDE действительно должен компилировать целые файлы LoadMOF, но ни один из них, AFIK, не является классами.
Я могу даже удалить фиктивный класс HAL, который я сделал, так как он может вообще не понадобиться, в зависимости от того, должен ли какой -либо код инициализации необходимо выполнить - и на данный момент, похоже, выполнение функции HAL_INIT () по умолчанию вводит, Поскольку он либо испортит PLL, либо, возможно, делает что -то странное для Systick, (у меня не было времени, чтобы точно исследовать, на что это влияет, поэтому я не вызываю hal_init () из библиотеки в настоящее время)
Эта путаница моя вина.
Я играю быстро и свободно с парадигмой библиотеки Ардуино.
В прошлом я немного согнул правила с системой библиотек, создавая пустую библиотеку, просто чтобы поместить наши примеры; Таким образом, они могут быть достигнуты через систему меню.
Но в этом случае заголовок действительно включает в себя некоторые файлы, и 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
С вашей помощью 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}; Я не думаю, что смогу получить много скоростной оптимизации ...
В моем случае с 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?
Действительно очень любопытно
@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, которые не используются.
И дальнейшие улучшения скорости могут быть достигнуты там, где есть отдельные данные и адресные порты.
Я посмотрел на некоторые предыдущие сообщения на форуме 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, я думаю, чтобы оптимизировать текст, новая функция должна быть обнародована, что не идеально, но не то, что я Схлал сон
Функция 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), эталон лучше, чем мод Курта!! Может быть, есть место для еще большего улучшения, но я думаю, это довольно хорошо.
Однако на рисунке линии, заполнении экрана и т. Д., При написании много данных, было место для улучшения переключения и переключения 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 и т. Д. Для каждого пикселя, или вы оптимизировали ее?
Перевернает ли параллельная версия CS и т. Д. Для каждого пикселя, или вы оптимизировали ее?
Iwalpola
Sun 3 июля 2016 г., 11:39
Rogerclark написал:Да. Я имел в виду версию SPI
Перевернает ли параллельная версия CS и т. Д. Для каждого пикселя, или вы оптимизировали ее?
Перевернает ли параллельная версия CS и т. Д. Для каждого пикселя, или вы оптимизировали ее?
Rogerclark
Пн июля, 4 июля 2016 г., 12:43
Iwalpola написал:
Он делал CS переключать для каждого пикселя ранее (моя глупая идея). Теперь я исправил это.
Я волновался, что он мешает выходу с прикосновением дигитизатора, доступным в том же модуле (TFT и Touch Share 4 Pins).
Я волновался, что он мешает выходу с прикосновением дигитизатора, доступным в том же модуле (TFT и Touch Share 4 Pins).
Martinayotte
Пн июля, 4 июля 2016 г., 2:09
Я начинаю неправильно понимать всю ветку здесь:
При каждой параллельной передаче 8BIS должен быть импульс CS.
Итак, как это можно пропустить для оптимизации ?
При каждой параллельной передаче 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)
Другая строка, которую нужно много переключать, - это 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 раз.
Демо (почти слишком быстро, чтобы увидеть):
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 на самом деле не поможет
Re: Версия SPI
Да.
Теперь я смотрю на код, есть много места для улучшения, и, как вы сказали, даже несколько нас сбрили здесь и там в функциях низкого уровня, имеют большое значение.
Что еще медленнее для вас, так это заполнение, так как вы не можете извлечь выгоду из DMA. Что ж, если бы булавки были рядом с началом порта, вы могли бы использовать DMA, поскольку вы можете DMA к GPIO (но у нас нет никакого демонстрационного кода для этого)
Но когда вы используете булавки по всему доску, DMA на самом деле не поможет
Ахулл
Пн июля, 04, 2016, 10:03 утра
Iwalpola написал:Еще одно усиление производительности, внедряя функцию write8special ().
Демо (почти слишком быстро, чтобы увидеть):
https: // youtu.be/sgu_wwx20hm
@Roger, наверняка должен быть потенциал для улучшения в коде SPI. Сегодня я узнал, что даже задержка за задержку с микросекундами наносится быстро, когда вы повторяете ее 10000 раз.
Демо (почти слишком быстро, чтобы увидеть):
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 (но у нас нет никакого демонстрационного кода для этого)
Re: Версия SPI
Да.
Теперь я смотрю на код, есть много места для улучшения, и, как вы сказали, даже несколько нас сбрили здесь и там в функциях низкого уровня, имеют большое значение.
Что еще медленнее для вас, так это заполнение, так как вы не можете извлечь выгоду из DMA. Что ж, если бы булавки были рядом с началом порта, вы могли бы использовать DMA, поскольку вы можете DMA к GPIO (но у нас нет никакого демонстрационного кода для этого)
Rogerclark
Пн, 04 июля 2016 г., 21:28
Спасибо
Rogerclark
Пн, 04 июля 2016 г., 22:38
@iwalpola
Можете ли вы опубликовать код в свой эскиз, который вы используете для этих результатов времени, так как я не думаю, что это тот же набросок, который я использую для сравнения скорости SPI
(Или опубликуйте ссылку на исходный код эскиза)
Спасибо
Роджер
Можете ли вы опубликовать код в свой эскиз, который вы используете для этих результатов времени, так как я не думаю, что это тот же набросок, который я использую для сравнения скорости 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
http: // www.STM32duino.com/viewtopic.PHP?F = 18&t = 1042
Diger67
Ср. 03 августа 2016 г., 21:23
Привет!
Я не работаю в среде с Arduino STM. Но может ли кто -нибудь пригодиться. Вот несколько определений. Их работа проверяется в Keil. Привязывающие выводы, сделанные для стандартных выводов местоположения Shild TFT для Arduino. Новое определение write8inline (d) быстрее, чем предыдущая версия.
Я не работаю в среде с 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)
Или, может быть, я неправильно понимаю, что вы там делаете.
-рик
#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)
Или, может быть, я неправильно понимаю, что вы там делаете.
-рик
Вы пытаетесь очистить регистр APB2ENR с &= ((RCC->Apb2enr &= 0xffffffff) ?
Вероятно, легче установить его на ноль или использовать &= ((RCC->Apb2enr &= ~ 0xffffffff)
Или, может быть, я неправильно понимаю, что вы там делаете.
-рик
Стивестронг
Пт 26 августа 2016 г., 11:14
Что ж, мне пришлось заново изобрести колесо и адаптировать оригинальный либеральный либера.
Кроме того, мне пришлось придерживаться цифровых функций записи и чтения, потому что чистый регистр пишет для переключения булавки, был слишком быстрым, и экран пролетел!
Здесь мой эталон с использованием оригинального графического теста Adafruit INO:
Кроме того, мне пришлось придерживаться цифровых функций записи и чтения, потому что чистый регистр пишет для переключения булавки, был слишком быстрым, и экран пролетел!
Здесь мой эталон с использованием оригинального графического теста 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_ ();}
=================================================
строка 84
#define Read8 (x) {x = read8_ ();}
=================================================
Стивестронг
Сб 03 сентября 2016 г., 19:03
Вадимель написал:Adafruit_tftlcd_8bit_stm32.час
строка 84
#define Read8 (x) {x = read8_ ();}
строка 84
#define Read8 (x) {x = read8_ ();}
Итудилла
Ср. 15 февраля 2017 г. 7:32 утра
Большое спасибо за то, что сообщили нам об этих манипуляциях, они облегчают жизнь рабочих!