Таймер не работает
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755558#p3755558"]Есть же способ обратится к функциям находящимся в low_level_init.cpp из майна основного?[/uquote]Не надо в low_level_init.cpp ничего кроме __low_level_init() пихать! Внутри __low_level_init() делай самую необходимую инициализацию железа (тактовые, GPIO, FSMC и т.д.) и всё.
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755558#p3755558"]Так не выходит, при попытке приинклудить low_level_init.cpp он ошибку кидает([/uquote]Кто тебя учил .c и .cpp файлы инклудить?
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755558#p3755558"]Я полазил по англоязычным сайтам и нашел несколько регистровых настроек FSMC, одна из них подошла, FFFFFFFFF мне тоже не понравились([/uquote]Да прекращай ты копипастить всякую дурь. Ну есть же RM. Неужели так трудно сесть, внимательно прочитать и заполнить правильными параметрами два-три регистра FSMC?
Добавлено after 4 minutes 8 seconds:
[uquote="bevice",url="/forum/viewtopic.php?p=3755554#p3755554"]* не нужно пропускать volatile там где он нужен и с оптимизацией-по умолчанию ничего страшного не случится. Если иар позволяет такие фокусы даже со включенной на полную оптимизацией - оптимизатор у него не работает.[/uquote]Не надо рубить шашкой. Я имею в виду достаточно неочевидные для новичка случаи, которые даже для меня с двумя десятками лет эмбеддерского опыта являются спорными. У меня есть несколько примеров, когда IAR разруливает их в сторону пользователя, а GCC в сторону "я тут наоптимизоровал, работать перестало, но формально хрен подкопаешься". Но тут это будет жёсткий оффтопик.
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755558#p3755558"]Так не выходит, при попытке приинклудить low_level_init.cpp он ошибку кидает([/uquote]Кто тебя учил .c и .cpp файлы инклудить?
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755558#p3755558"]Я полазил по англоязычным сайтам и нашел несколько регистровых настроек FSMC, одна из них подошла, FFFFFFFFF мне тоже не понравились([/uquote]Да прекращай ты копипастить всякую дурь. Ну есть же RM. Неужели так трудно сесть, внимательно прочитать и заполнить правильными параметрами два-три регистра FSMC?
Добавлено after 4 minutes 8 seconds:
[uquote="bevice",url="/forum/viewtopic.php?p=3755554#p3755554"]* не нужно пропускать volatile там где он нужен и с оптимизацией-по умолчанию ничего страшного не случится. Если иар позволяет такие фокусы даже со включенной на полную оптимизацией - оптимизатор у него не работает.[/uquote]Не надо рубить шашкой. Я имею в виду достаточно неочевидные для новичка случаи, которые даже для меня с двумя десятками лет эмбеддерского опыта являются спорными. У меня есть несколько примеров, когда IAR разруливает их в сторону пользователя, а GCC в сторону "я тут наоптимизоровал, работать перестало, но формально хрен подкопаешься". Но тут это будет жёсткий оффтопик.
Последний раз редактировалось VladislavS Сб дек 14, 2019 13:00:48, всего редактировалось 1 раз.
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755558#p3755558"]Я полазил по англоязычным сайтам и нашел несколько регистровых настроек FSMC, одна из них подошла, FFFFFFFFF мне тоже не понравились([/uquote]Да прекращай ты копипастить всякую дурь. Ну есть же RM. Неужели так трудно сесть, внимательно прочитать и заполнить правильными параметрами два-три регистра FSMC?[/uquote]
Я не поленился все регистры выписать, перевести, почитать, вникнуть. Но они мягко говоря не однозначные, рассчитаны на людей хорошо знающих архитектуру FSMC, а надо заметить в интернете про FSMC информации либо вообще нет либо я им не умею пользоваться. Я и книжечки на озоне искал и статейки гуглил, а в ответ тишина. Одни статьи как кубом дисплей прикрутить
Я не поленился все регистры выписать, перевести, почитать, вникнуть. Но они мягко говоря не однозначные, рассчитаны на людей хорошо знающих архитектуру FSMC, а надо заметить в интернете про FSMC информации либо вообще нет либо я им не умею пользоваться. Я и книжечки на озоне искал и статейки гуглил, а в ответ тишина. Одни статьи как кубом дисплей прикрутить
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755568#p3755568"]Но они мягко говоря не однозначные, рассчитаны на людей хорошо знающих архитектуру FSMC,[/uquote]Ну так на то и форум, спрашивай какие параметры непонятны. Думаешь не расскажут?
Ну просто когда я вижу вот такое, то о качестве остального кода у меня складывается определённое негативное впечатление.
Ну просто когда я вижу вот такое, то о качестве остального кода у меня складывается определённое негативное впечатление.
Код: Выделить всё
((LCTDef *)(uint32_t)(0x60000000 | 0x00000000))->RAM- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
Это я собирал по библиотекам HAL, в надежде упростить потом
Добавлено after 10 minutes 28 seconds:
Вот если создать дополнительный файл с иницилизацией и настройкой контроллера дисплея, это канонично сделать и .h & .c или в одном .h работать не будет?
Добавлено after 10 minutes 28 seconds:
Вот если создать дополнительный файл с иницилизацией и настройкой контроллера дисплея, это канонично сделать и .h & .c или в одном .h работать не будет?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755573#p3755573"]Вот если создать дополнительный файл с иницилизацией и настройкой контроллера дисплея, это канонично сделать и .h & .c или в одном .h работать не будет?[/uquote]В .h делаешь объявление функций, а в .c определение. Соответственно .h инклудишь, а .c включаешь в проект. Вроде как эти вещи должны у любого программиста от зубов отлетать.
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
а .cpp он же без пары? Если в таком же сделать все это?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755580#p3755580"]а .cpp он же без пары?[/uquote]Ну какой такой "пары". Кто тебе запрещает делать сколько угодно *.c, *.cpp и *.h?
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755580#p3755580"]Если в таком же сделать все это?[/uquote]Делать можно всё что не противозаконно
Только не трогай low_level_init. Это фактически часть стартапа (то же что и SystemInit() в других тулчейнах) и там надо себя вести аккуратно.
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755580#p3755580"]Если в таком же сделать все это?[/uquote]Делать можно всё что не противозаконно
Только не трогай low_level_init. Это фактически часть стартапа (то же что и SystemInit() в других тулчейнах) и там надо себя вести аккуратно.
Последний раз редактировалось VladislavS Сб дек 14, 2019 12:08:17, всего редактировалось 1 раз.
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
Да, low_level_init мне очень понравился, он выполняется даже раньше чем плей нажимаешь в иар
Добавлено after 1 minute 8 seconds:
Дык я бы с удовольствием не городил бы два файла а сделал бы в одном .cpp, только как их связать чтобы можно было функции глобально использовать из него
Добавлено after 1 minute 8 seconds:
Дык я бы с удовольствием не городил бы два файла а сделал бы в одном .cpp, только как их связать чтобы можно было функции глобально использовать из него
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755586#p3755586"]Дык я бы с удовольствием не городил бы два файла а сделал бы в одном .cpp,[/uquote]В общем случае, при классическом построении программы/проекта это невозможно. Да и зачем? Обратное, кстати, когда вся библиотека в .h - вполне обычное дело. Но ты к этому ещё не готов, лучше научись сначала всё по классике делать.
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755586#p3755586"]только как их связать чтобы можно было функции глобально использовать из него[/uquote]Ну так .h для этого и есть.
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755586#p3755586"]только как их связать чтобы можно было функции глобально использовать из него[/uquote]Ну так .h для этого и есть.
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
Сделал по классике, заработало)
Re: Таймер не работает
Тогда уж лучше EmBitz. Среда на основе Code::Block и оптимизирована под STM32.bevice писал(а):Но если так не нравится - Code::Block почти без настроек работает. Буквально вчера пробовал.
При создании проекта автоматически в него добавляется CMSIS, а при необходимости и SPL.
Компилятор GCC входит в состав дистрибутива.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
Мурик был бы не Мурик, если бы про "лучшие шпингалеты выпускается на фабрике №3 по адресу улица Цурюпа 15 телефон 9-18 факс 4-12 добавочный 03, самовывоз из Нижнего Тагила" не ввернул.
Серьёзный продукт, даже по оффсайту виндно

Спойлер
- Вложения
-
- em.png
- (53.25 КБ) 305 скачиваний
Re: Таймер не работает
[uquote="Мурик",url="/forum/viewtopic.php?p=3755690#p3755690"]
При создании проекта автоматически в него добавляется CMSIS, а при необходимости и SPL.
Компилятор GCC входит в состав дистрибутива.[/uquote]
У меня специфика работы такая, что есть программисты, которые прошивки пишут, и есть совсем другие люди, которые эти прошивки потом используют. Есть билд-сервера, которые эти прошивки с нужными параметрами собирают. Я остановился на CMake+gcc, сборка продакшена автоматизированная - пушим код в продакшен ветку гита - дальше билдсервер подтягивает нужные конфиги и сам собирает и выкладывает прошивки с документацией.
Мне кажется это удобным, что исходники никоим образом не привязаны к IDE и могут собираться отдельно.
Я использую Clion, чуть ли не с бета-версии, поскольку не ровно дышу продуктам JetBrains. Но у нас в команде есть люди которые работают в Sublime Text, vim+ctags, есть которые работают в Code::Blocks, даже кто-то в EMACS что-то писал. И это никак не мешает всему процессу.
Плюс в работе используем в основном MacOS и Linux, под Windows слишком много проблем из-за подписи драйверов. Это тоже накладывает свой отпечаток.
Создание проекта - это одна команда, что-то вроде (для stm32F103C8) при этом в шаблоне уже есть CMSIS/LL/HAL в виде подключаемых библиотек, есть конфигурационные файлы для OpenOCD, все настроено и готово к использованию в Clion. Для остальных еще нужно сделать что-то вроде но у ребят это тоже автоматизировано скриптами.
Ну и как я говорил, есть возможность собирать через docker-сборщик, так же одной командой без установок любых IDE, или без докера, но тогда придется иметь arm-none-eabi-gcc+make+cmake
Тогда уж лучше EmBitz. Среда на основе Code::Block и оптимизирована под STM32.bevice писал(а):Но если так не нравится - Code::Block почти без настроек работает. Буквально вчера пробовал.
При создании проекта автоматически в него добавляется CMSIS, а при необходимости и SPL.
Компилятор GCC входит в состав дистрибутива.[/uquote]
У меня специфика работы такая, что есть программисты, которые прошивки пишут, и есть совсем другие люди, которые эти прошивки потом используют. Есть билд-сервера, которые эти прошивки с нужными параметрами собирают. Я остановился на CMake+gcc, сборка продакшена автоматизированная - пушим код в продакшен ветку гита - дальше билдсервер подтягивает нужные конфиги и сам собирает и выкладывает прошивки с документацией.
Мне кажется это удобным, что исходники никоим образом не привязаны к IDE и могут собираться отдельно.
Я использую Clion, чуть ли не с бета-версии, поскольку не ровно дышу продуктам JetBrains. Но у нас в команде есть люди которые работают в Sublime Text, vim+ctags, есть которые работают в Code::Blocks, даже кто-то в EMACS что-то писал. И это никак не мешает всему процессу.
Плюс в работе используем в основном MacOS и Linux, под Windows слишком много проблем из-за подписи драйверов. Это тоже накладывает свой отпечаток.
Создание проекта - это одна команда, что-то вроде
Код: Выделить всё
git clone git@github.com:bevice/stm32_hal_template.gitКод: Выделить всё
cmake -G "CodeBlocks - Unix Makefiles" src/pathНу и как я говорил, есть возможность собирать через docker-сборщик, так же одной командой без установок любых IDE, или без докера, но тогда придется иметь arm-none-eabi-gcc+make+cmake
После нас - хоть потоп (с) Лойсо
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
Дисплей работает STM32F412G-Disco, без левых библиотек, выложу, может кто то подскажет что сократить, может кто скопирует, мне по крайней мере очень надо было.
main.h
#include "stm32f412zx.h"
#include "disp.h"
int main()
{
initdisp();
// uint8_t parameter1[4];
int fl, x,y;
while (1){
/* CASET: Comumn Addrses Set */
if ( fl == 0 )
{
y=0;
while( y < 240)
{
x=0;
while( x < 240)
{
WritePixel(x, y , 0xFFE0-x);
x++;
}
y++;
}
fl=1;
}
else
{
y=0;
while( y < 240)
{
x=0;
while( x < 240)
{
WritePixel(x, y , x+y);
x++;
}
y++;
}
fl=0;
}
}// while 1
}
disp.c
#include "stm32f412zx.h"
#define FMC_BANK1 ((LCTDef *)(uint32_t)(0x60000000 | 0x00000000))
typedef struct
{
__IO uint16_t REG;
__IO uint16_t RAM;
}LCTDef;
static uint8_t flag = 1;
void initTIM2()
{
TIM2->PSC = 10000- 1;
TIM2->DIER |= TIM_DIER_UIE;
__enable_irq ();
NVIC_EnableIRQ(TIM2_IRQn);
}
void delay(uint32_t _delay){
initTIM2();
TIM2->ARR = _delay;
TIM2->CR1 |= TIM_CR1_CEN;
flag = 1;
while(flag);
}
extern "C" void TIM2_IRQHandler(void)
{
TIM2->SR &= ~TIM_SR_UIF;
TIM2->CR1 &= ~TIM_CR1_CEN;
flag = 0;
}
void WriteReg(uint8_t Command, uint8_t *Parameters, uint8_t NbParameters)
{
uint8_t i;
/* Send command */
FMC_BANK1->REG = Command;//LCD_IO_WriteReg(Command);
__DSB();
/* Send command's parameters if any */
for (i=0; i<NbParameters; i++)
{
//FMC_BANK1_WriteData(Parameters[i]);
FMC_BANK1->RAM = Parameters[i];//LCD_IO_WriteData(Parameters[i]);
__DSB();
}
}
void WriteData(uint8_t Command)
{
FMC_BANK1->RAM = Command;//LCD_IO_WriteData(Parameters[i]);
//__DSB();
}
void WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode)
{
/* Set Cursor */
uint8_t parameter1[4];
parameter1[0] = 0x00;
parameter1[1] = 0x00 + Xpos;// +X
parameter1[2] = 0x00;
parameter1[3] = 0xEF + Xpos;// +x
WriteReg(0x2A, parameter1, 4);
/* RASET: Row Addrses Set */
parameter1[0] = 0x00;
parameter1[1] = 0x00 + Ypos;// +y
parameter1[2] = 0x00;
parameter1[3] = 0xEF + Ypos;// +y
WriteReg(0x2B, parameter1, 4);
/* Prepare to write to LCD RAM */
WriteReg(0x2C, (uint8_t*)NULL, 0); /* RAM write data command */
/* Write RAM data */
FMC_BANK1->RAM = RGBCode;
__DSB();
}
void initdisp()
{
uint8_t parameter[14];
/* Sleep In Command */
WriteReg(0x10, (uint8_t*)NULL, 0);
delay(10);
/* SW Reset Command */
WriteReg(0x01, (uint8_t*)NULL, 0);
/* Wait for 200ms */
delay(200);
/* Sleep Out Command */
WriteReg(0x11, (uint8_t*)NULL, 0);
/* Wait for 120ms */
delay(120);
/* Normal display for Driver Down side */
parameter[0] = 0x00;
WriteReg(0x36, parameter, 1);
/* Color mode 16bits/pixel */
parameter[0] = 0x05;
WriteReg(0x3A, parameter, 1);
/* Display inversion On */
WriteReg( 0x21, (uint8_t*)NULL, 0);
/* Set Column address CASET */
parameter[0] = 0x00;
parameter[1] = 0x00;
parameter[2] = 0x00;
parameter[3] = 0xEF;
WriteReg(0x2A, parameter, 4);
/* Set Row address RASET */
parameter[0] = 0x00;
parameter[1] = 0x00;
parameter[2] = 0x00;
parameter[3] = 0xEF;
WriteReg(0x2B, parameter, 4);
/*---------- ST7789H2 Frame rate setting ----------*/
/* PORCH control setting */
parameter[0] = 0x0C;
parameter[1] = 0x0C;
parameter[2] = 0x00;
parameter[3] = 0x33;
parameter[4] = 0x33;
WriteReg(0xB2, parameter, 5);
/* GATE control setting */
parameter[0] = 0x35;
WriteReg(0xB7, parameter, 1);
/*---------- ST7789H2 Power setting ----------*/
/* VCOM setting */
parameter[0] = 0x1F;
WriteReg(0xBB, parameter, 1);
/* LCM Control setting */
parameter[0] = 0x2C;
WriteReg(0xC0, parameter, 1);
/* VDV and VRH Command Enable */
parameter[0] = 0x01;
parameter[1] = 0xC3;
WriteReg(0xC2, parameter, 2);
/* VDV Set */
parameter[0] = 0x20;
WriteReg(0xC4, parameter, 1);
/* Frame Rate Control in normal mode */
parameter[0] = 0x0F;
WriteReg(0xC6, parameter, 1);
/* Power Control */
parameter[0] = 0xA4;
parameter[1] = 0xA1;
WriteReg(0xD0, parameter, 1);
/*---------- ST7789H2 Gamma setting ----------*/
/* Positive Voltage Gamma Control */
parameter[0] = 0xD0;
parameter[1] = 0x08;
parameter[2] = 0x11;
parameter[3] = 0x08;
parameter[4] = 0x0C;
parameter[5] = 0x15;
parameter[6] = 0x39;
parameter[7] = 0x33;
parameter[8] = 0x50;
parameter[9] = 0x36;
parameter[10] = 0x13;
parameter[11] = 0x14;
parameter[12] = 0x29;
parameter[13] = 0x2D;
WriteReg(0xE0, parameter, 14);
/* Negative Voltage Gamma Control */
parameter[0] = 0xD0;
parameter[1] = 0x08;
parameter[2] = 0x10;
parameter[3] = 0x08;
parameter[4] = 0x06;
parameter[5] = 0x06;
parameter[6] = 0x39;
parameter[7] = 0x44;
parameter[8] = 0x51;
parameter[9] = 0x0B;
parameter[10] = 0x16;
parameter[11] = 0x14;
parameter[12] = 0x2F;
parameter[13] = 0x31;
WriteReg(0xE1, parameter, 14);
/* Display ON command */
WriteReg(0x29, (uint8_t*)NULL, 0);
/* Sleep Out command */
WriteReg(0x11, (uint8_t*)NULL, 0);
/* Tearing Effect Line On: Option (00h:VSYNC Interface OFF, 01h:VSYNC Interface ON) */
parameter[0] = 0x00;
WriteReg(0x35, parameter, 1);
///////////////////////////////////////////////////////
parameter[0] = 0x00;
WriteReg(0x36, parameter, 1);
///////////////////////////////////////////////////////
}
low_level_init.cpp
extern "C" {
#endif
#include <stddef.h>
#include "stm32f412zx.h"
int __low_level_init(void)
{
RCC->AHB3ENR |= RCC_AHB3ENR_FSMCEN; //Тактирование FSMC
RCC->AHB1ENR |= ( RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOEEN | RCC_AHB1ENR_GPIOFEN ); //Тактирование порта FSMC
RCC->APB1ENR |= RCC_APB1ENR_TIM5EN;//Тактирование таймера PF5 LCD TIM5_CN3 1-5kHz
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
GPIOF->MODER |= ( GPIO_MODER_MODER5_1 | GPIO_MODER_MODER0_1); //Выход LCD LED//Выход FSMC - A0
GPIOF->MODER &= ~ ( GPIO_MODER_MODER14_0 | GPIO_MODER_MODER15_0 ); //Вход
GPIOD->MODER |= ( GPIO_MODER_MODER15_1 | GPIO_MODER_MODER14_1 | GPIO_MODER_MODER8_1 | GPIO_MODER_MODER10_1 //Выход FSMC
| GPIO_MODER_MODER1_1 | GPIO_MODER_MODER11_0 | GPIO_MODER_MODER4_1 | GPIO_MODER_MODER0_1 | GPIO_MODER_MODER5_1
| GPIO_MODER_MODER7_1 | GPIO_MODER_MODER9_1);
GPIOE->MODER |=( GPIO_MODER_MODER0_0 | GPIO_MODER_MODER1_0 | GPIO_MODER_MODER2_0 | GPIO_MODER_MODER3_0
| GPIO_MODER_MODER14_1 | GPIO_MODER_MODER12_1 | GPIO_MODER_MODER10_1 | GPIO_MODER_MODER8_1 | GPIO_MODER_MODER15_1
| GPIO_MODER_MODER13_1 | GPIO_MODER_MODER11_1 | GPIO_MODER_MODER9_1 | GPIO_MODER_MODER7_1 );
GPIOG->MODER |= GPIO_MODER_MODER4_1; //Выход FSMC - LCD TE FSMC_A14 ?
GPIOD->OTYPER &= ~ ( GPIO_OTYPER_OT_15 | GPIO_OTYPER_OT_14 | GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_10 | GPIO_OTYPER_OT_1
| GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_4 | GPIO_OTYPER_OT_0 | GPIO_OTYPER_OT_5 | GPIO_OTYPER_OT_7 | GPIO_OTYPER_OT_9);
GPIOE->OTYPER &= ~ ( GPIO_OTYPER_OT_14 | GPIO_OTYPER_OT_12 | GPIO_OTYPER_OT_10 | GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_15
| GPIO_OTYPER_OT_13 | GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_7 );
GPIOF->OTYPER &= ~GPIO_OTYPER_OT_0;
GPIOG->OTYPER &= ~GPIO_OTYPER_OT_4;
GPIOD->PUPDR &= ~ ( GPIO_PUPDR_PUPDR15 | GPIO_PUPDR_PUPDR14 | GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR10 | GPIO_PUPDR_PUPDR1
| GPIO_PUPDR_PUPDR11 | GPIO_PUPDR_PUPDR4 | GPIO_PUPDR_PUPDR0 | GPIO_PUPDR_PUPDR5 | GPIO_PUPDR_PUPDR7 | GPIO_PUPDR_PUPDR9);
GPIOE->PUPDR &= ~ ( GPIO_PUPDR_PUPDR14 | GPIO_PUPDR_PUPDR12 | GPIO_PUPDR_PUPDR10 | GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR15
| GPIO_PUPDR_PUPDR13 | GPIO_PUPDR_PUPDR11 | GPIO_PUPDR_PUPDR9 | GPIO_PUPDR_PUPDR7 );
GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR0;
GPIOG->PUPDR &= ~GPIO_PUPDR_PUPDR4;
GPIOD->OSPEEDR |= ( GPIO_OSPEEDER_OSPEEDR15 | GPIO_OSPEEDER_OSPEEDR14 | GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR10
| GPIO_OSPEEDER_OSPEEDR1 | GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR4 | GPIO_OSPEEDER_OSPEEDR0 | GPIO_OSPEEDER_OSPEEDR5
| GPIO_OSPEEDER_OSPEEDR7 | GPIO_OSPEEDER_OSPEEDR9 );
GPIOE->OSPEEDR |= ( GPIO_OSPEEDER_OSPEEDR15 | GPIO_OSPEEDER_OSPEEDR14 | GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR10
| GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR13 | GPIO_OSPEEDER_OSPEEDR5 | GPIO_OSPEEDER_OSPEEDR7 | GPIO_OSPEEDER_OSPEEDR9);
GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR0;
GPIOG->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR4;//вход
GPIOD->AFR[0] = 0xC0CC00CC;
GPIOD->AFR[1] = 0xCC000CCC;
GPIOE->AFR[0] = 0xC0000000;
GPIOE->AFR[1] = 0xCCCCCCCC;
GPIOF->AFR[0] = 0x20000C;
GPIOG->AFR[0] = 0xC0000;
TIM5->CCER |= TIM_CCER_CC3E;//
TIM5->CCMR2|=(TIM_CCMR2_OC3M_0 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2); //ССМР2 наш канал 3
TIM5->CR1 |= TIM_CR1_CEN;
TIM5->CCR1 = 1000; // Скваженность
GPIOD->ODR |= 0x800; //D11 reset
FSMC_Bank1->BTCR[0] &= 0x00000000;
FSMC_Bank1->BTCR[0] |= 1 << 14| 1 << 12 | 0x01 << 4 | 0x00 << 2 | 1 << 0;
FSMC_Bank1->BTCR[1] &= 0x00000000;
FSMC_Bank1->BTCR[1] |= 0x00 << 28 | 0x0000 << 20 | 0x0f << 8 | 0x01;
FSMC_Bank1E->BWTR[0] &= 0x00000000;
FSMC_Bank1E->BWTR[0] |= 0x00 << 28 | 0x0000 << 20 | 0x03 << 8 | 0x00;
return 1;
}
#ifdef __cplusplus
}
#endif
main.h
Спойлер
#include <stddef.h>#include "stm32f412zx.h"
#include "disp.h"
int main()
{
initdisp();
// uint8_t parameter1[4];
int fl, x,y;
while (1){
/* CASET: Comumn Addrses Set */
if ( fl == 0 )
{
y=0;
while( y < 240)
{
x=0;
while( x < 240)
{
WritePixel(x, y , 0xFFE0-x);
x++;
}
y++;
}
fl=1;
}
else
{
y=0;
while( y < 240)
{
x=0;
while( x < 240)
{
WritePixel(x, y , x+y);
x++;
}
y++;
}
fl=0;
}
}// while 1
}
disp.c
Спойлер
#include <stddef.h>#include "stm32f412zx.h"
#define FMC_BANK1 ((LCTDef *)(uint32_t)(0x60000000 | 0x00000000))
typedef struct
{
__IO uint16_t REG;
__IO uint16_t RAM;
}LCTDef;
static uint8_t flag = 1;
void initTIM2()
{
TIM2->PSC = 10000- 1;
TIM2->DIER |= TIM_DIER_UIE;
__enable_irq ();
NVIC_EnableIRQ(TIM2_IRQn);
}
void delay(uint32_t _delay){
initTIM2();
TIM2->ARR = _delay;
TIM2->CR1 |= TIM_CR1_CEN;
flag = 1;
while(flag);
}
extern "C" void TIM2_IRQHandler(void)
{
TIM2->SR &= ~TIM_SR_UIF;
TIM2->CR1 &= ~TIM_CR1_CEN;
flag = 0;
}
void WriteReg(uint8_t Command, uint8_t *Parameters, uint8_t NbParameters)
{
uint8_t i;
/* Send command */
FMC_BANK1->REG = Command;//LCD_IO_WriteReg(Command);
__DSB();
/* Send command's parameters if any */
for (i=0; i<NbParameters; i++)
{
//FMC_BANK1_WriteData(Parameters[i]);
FMC_BANK1->RAM = Parameters[i];//LCD_IO_WriteData(Parameters[i]);
__DSB();
}
}
void WriteData(uint8_t Command)
{
FMC_BANK1->RAM = Command;//LCD_IO_WriteData(Parameters[i]);
//__DSB();
}
void WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode)
{
/* Set Cursor */
uint8_t parameter1[4];
parameter1[0] = 0x00;
parameter1[1] = 0x00 + Xpos;// +X
parameter1[2] = 0x00;
parameter1[3] = 0xEF + Xpos;// +x
WriteReg(0x2A, parameter1, 4);
/* RASET: Row Addrses Set */
parameter1[0] = 0x00;
parameter1[1] = 0x00 + Ypos;// +y
parameter1[2] = 0x00;
parameter1[3] = 0xEF + Ypos;// +y
WriteReg(0x2B, parameter1, 4);
/* Prepare to write to LCD RAM */
WriteReg(0x2C, (uint8_t*)NULL, 0); /* RAM write data command */
/* Write RAM data */
FMC_BANK1->RAM = RGBCode;
__DSB();
}
void initdisp()
{
uint8_t parameter[14];
/* Sleep In Command */
WriteReg(0x10, (uint8_t*)NULL, 0);
delay(10);
/* SW Reset Command */
WriteReg(0x01, (uint8_t*)NULL, 0);
/* Wait for 200ms */
delay(200);
/* Sleep Out Command */
WriteReg(0x11, (uint8_t*)NULL, 0);
/* Wait for 120ms */
delay(120);
/* Normal display for Driver Down side */
parameter[0] = 0x00;
WriteReg(0x36, parameter, 1);
/* Color mode 16bits/pixel */
parameter[0] = 0x05;
WriteReg(0x3A, parameter, 1);
/* Display inversion On */
WriteReg( 0x21, (uint8_t*)NULL, 0);
/* Set Column address CASET */
parameter[0] = 0x00;
parameter[1] = 0x00;
parameter[2] = 0x00;
parameter[3] = 0xEF;
WriteReg(0x2A, parameter, 4);
/* Set Row address RASET */
parameter[0] = 0x00;
parameter[1] = 0x00;
parameter[2] = 0x00;
parameter[3] = 0xEF;
WriteReg(0x2B, parameter, 4);
/*---------- ST7789H2 Frame rate setting ----------*/
/* PORCH control setting */
parameter[0] = 0x0C;
parameter[1] = 0x0C;
parameter[2] = 0x00;
parameter[3] = 0x33;
parameter[4] = 0x33;
WriteReg(0xB2, parameter, 5);
/* GATE control setting */
parameter[0] = 0x35;
WriteReg(0xB7, parameter, 1);
/*---------- ST7789H2 Power setting ----------*/
/* VCOM setting */
parameter[0] = 0x1F;
WriteReg(0xBB, parameter, 1);
/* LCM Control setting */
parameter[0] = 0x2C;
WriteReg(0xC0, parameter, 1);
/* VDV and VRH Command Enable */
parameter[0] = 0x01;
parameter[1] = 0xC3;
WriteReg(0xC2, parameter, 2);
/* VDV Set */
parameter[0] = 0x20;
WriteReg(0xC4, parameter, 1);
/* Frame Rate Control in normal mode */
parameter[0] = 0x0F;
WriteReg(0xC6, parameter, 1);
/* Power Control */
parameter[0] = 0xA4;
parameter[1] = 0xA1;
WriteReg(0xD0, parameter, 1);
/*---------- ST7789H2 Gamma setting ----------*/
/* Positive Voltage Gamma Control */
parameter[0] = 0xD0;
parameter[1] = 0x08;
parameter[2] = 0x11;
parameter[3] = 0x08;
parameter[4] = 0x0C;
parameter[5] = 0x15;
parameter[6] = 0x39;
parameter[7] = 0x33;
parameter[8] = 0x50;
parameter[9] = 0x36;
parameter[10] = 0x13;
parameter[11] = 0x14;
parameter[12] = 0x29;
parameter[13] = 0x2D;
WriteReg(0xE0, parameter, 14);
/* Negative Voltage Gamma Control */
parameter[0] = 0xD0;
parameter[1] = 0x08;
parameter[2] = 0x10;
parameter[3] = 0x08;
parameter[4] = 0x06;
parameter[5] = 0x06;
parameter[6] = 0x39;
parameter[7] = 0x44;
parameter[8] = 0x51;
parameter[9] = 0x0B;
parameter[10] = 0x16;
parameter[11] = 0x14;
parameter[12] = 0x2F;
parameter[13] = 0x31;
WriteReg(0xE1, parameter, 14);
/* Display ON command */
WriteReg(0x29, (uint8_t*)NULL, 0);
/* Sleep Out command */
WriteReg(0x11, (uint8_t*)NULL, 0);
/* Tearing Effect Line On: Option (00h:VSYNC Interface OFF, 01h:VSYNC Interface ON) */
parameter[0] = 0x00;
WriteReg(0x35, parameter, 1);
///////////////////////////////////////////////////////
parameter[0] = 0x00;
WriteReg(0x36, parameter, 1);
///////////////////////////////////////////////////////
}
low_level_init.cpp
Спойлер
#ifdef __cplusplusextern "C" {
#endif
#include <stddef.h>
#include "stm32f412zx.h"
int __low_level_init(void)
{
RCC->AHB3ENR |= RCC_AHB3ENR_FSMCEN; //Тактирование FSMC
RCC->AHB1ENR |= ( RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOEEN | RCC_AHB1ENR_GPIOFEN ); //Тактирование порта FSMC
RCC->APB1ENR |= RCC_APB1ENR_TIM5EN;//Тактирование таймера PF5 LCD TIM5_CN3 1-5kHz
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
GPIOF->MODER |= ( GPIO_MODER_MODER5_1 | GPIO_MODER_MODER0_1); //Выход LCD LED//Выход FSMC - A0
GPIOF->MODER &= ~ ( GPIO_MODER_MODER14_0 | GPIO_MODER_MODER15_0 ); //Вход
GPIOD->MODER |= ( GPIO_MODER_MODER15_1 | GPIO_MODER_MODER14_1 | GPIO_MODER_MODER8_1 | GPIO_MODER_MODER10_1 //Выход FSMC
| GPIO_MODER_MODER1_1 | GPIO_MODER_MODER11_0 | GPIO_MODER_MODER4_1 | GPIO_MODER_MODER0_1 | GPIO_MODER_MODER5_1
| GPIO_MODER_MODER7_1 | GPIO_MODER_MODER9_1);
GPIOE->MODER |=( GPIO_MODER_MODER0_0 | GPIO_MODER_MODER1_0 | GPIO_MODER_MODER2_0 | GPIO_MODER_MODER3_0
| GPIO_MODER_MODER14_1 | GPIO_MODER_MODER12_1 | GPIO_MODER_MODER10_1 | GPIO_MODER_MODER8_1 | GPIO_MODER_MODER15_1
| GPIO_MODER_MODER13_1 | GPIO_MODER_MODER11_1 | GPIO_MODER_MODER9_1 | GPIO_MODER_MODER7_1 );
GPIOG->MODER |= GPIO_MODER_MODER4_1; //Выход FSMC - LCD TE FSMC_A14 ?
GPIOD->OTYPER &= ~ ( GPIO_OTYPER_OT_15 | GPIO_OTYPER_OT_14 | GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_10 | GPIO_OTYPER_OT_1
| GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_4 | GPIO_OTYPER_OT_0 | GPIO_OTYPER_OT_5 | GPIO_OTYPER_OT_7 | GPIO_OTYPER_OT_9);
GPIOE->OTYPER &= ~ ( GPIO_OTYPER_OT_14 | GPIO_OTYPER_OT_12 | GPIO_OTYPER_OT_10 | GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_15
| GPIO_OTYPER_OT_13 | GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_7 );
GPIOF->OTYPER &= ~GPIO_OTYPER_OT_0;
GPIOG->OTYPER &= ~GPIO_OTYPER_OT_4;
GPIOD->PUPDR &= ~ ( GPIO_PUPDR_PUPDR15 | GPIO_PUPDR_PUPDR14 | GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR10 | GPIO_PUPDR_PUPDR1
| GPIO_PUPDR_PUPDR11 | GPIO_PUPDR_PUPDR4 | GPIO_PUPDR_PUPDR0 | GPIO_PUPDR_PUPDR5 | GPIO_PUPDR_PUPDR7 | GPIO_PUPDR_PUPDR9);
GPIOE->PUPDR &= ~ ( GPIO_PUPDR_PUPDR14 | GPIO_PUPDR_PUPDR12 | GPIO_PUPDR_PUPDR10 | GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR15
| GPIO_PUPDR_PUPDR13 | GPIO_PUPDR_PUPDR11 | GPIO_PUPDR_PUPDR9 | GPIO_PUPDR_PUPDR7 );
GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR0;
GPIOG->PUPDR &= ~GPIO_PUPDR_PUPDR4;
GPIOD->OSPEEDR |= ( GPIO_OSPEEDER_OSPEEDR15 | GPIO_OSPEEDER_OSPEEDR14 | GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR10
| GPIO_OSPEEDER_OSPEEDR1 | GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR4 | GPIO_OSPEEDER_OSPEEDR0 | GPIO_OSPEEDER_OSPEEDR5
| GPIO_OSPEEDER_OSPEEDR7 | GPIO_OSPEEDER_OSPEEDR9 );
GPIOE->OSPEEDR |= ( GPIO_OSPEEDER_OSPEEDR15 | GPIO_OSPEEDER_OSPEEDR14 | GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR10
| GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR13 | GPIO_OSPEEDER_OSPEEDR5 | GPIO_OSPEEDER_OSPEEDR7 | GPIO_OSPEEDER_OSPEEDR9);
GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR0;
GPIOG->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR4;//вход
GPIOD->AFR[0] = 0xC0CC00CC;
GPIOD->AFR[1] = 0xCC000CCC;
GPIOE->AFR[0] = 0xC0000000;
GPIOE->AFR[1] = 0xCCCCCCCC;
GPIOF->AFR[0] = 0x20000C;
GPIOG->AFR[0] = 0xC0000;
TIM5->CCER |= TIM_CCER_CC3E;//
TIM5->CCMR2|=(TIM_CCMR2_OC3M_0 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2); //ССМР2 наш канал 3
TIM5->CR1 |= TIM_CR1_CEN;
TIM5->CCR1 = 1000; // Скваженность
GPIOD->ODR |= 0x800; //D11 reset
FSMC_Bank1->BTCR[0] &= 0x00000000;
FSMC_Bank1->BTCR[0] |= 1 << 14| 1 << 12 | 0x01 << 4 | 0x00 << 2 | 1 << 0;
FSMC_Bank1->BTCR[1] &= 0x00000000;
FSMC_Bank1->BTCR[1] |= 0x00 << 28 | 0x0000 << 20 | 0x0f << 8 | 0x01;
FSMC_Bank1E->BWTR[0] &= 0x00000000;
FSMC_Bank1E->BWTR[0] |= 0x00 << 28 | 0x0000 << 20 | 0x03 << 8 | 0x00;
return 1;
}
#ifdef __cplusplus
}
#endif
Последний раз редактировалось TEPEM Сб дек 14, 2019 14:06:43, всего редактировалось 1 раз.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
Господа, что-то вас не в ту степь несёт! Проблема ТС вовсе не в выборе IDE. У него есть рабочая IDE, которой он худо бедно получает результат. Зачем вы энтропию повышаете? Зачем ему для своего хобби строить билд-систему корпорации?
Добавлено after 12 minutes 59 seconds:
TEPEM, __enable_irq () не по месту применена - это штука глобальная. Её лучше в main() после всех инициализаций применять. Да и вообще, не нужна она, так как в Cortex-M прерывания по умолчанию разрешены. Можешь попробовать убрать - ничего не изменится.
2ALL, применение тут __DSB() для меня необъяснимо. Нескольких процессоров нет, нескольких потоков тоже нет. Кроме тормозов ничего тут барьер не даёт.
Вот докладик про барьеры
Добавлено after 12 minutes 59 seconds:
TEPEM, __enable_irq () не по месту применена - это штука глобальная. Её лучше в main() после всех инициализаций применять. Да и вообще, не нужна она, так как в Cortex-M прерывания по умолчанию разрешены. Можешь попробовать убрать - ничего не изменится.
2ALL, применение тут __DSB() для меня необъяснимо. Нескольких процессоров нет, нескольких потоков тоже нет. Кроме тормозов ничего тут барьер не даёт.
Вот докладик про барьеры
Re: Таймер не работает
[uquote="VladislavS",url="/forum/viewtopic.php?p=3755709#p3755709"]2ALL, применение тут __DSB() для меня необъяснимо. Нескольких процессоров нет, нескольких потоков тоже нет. Кроме тормозов ничего тут барьер не даёт.
Вот докладик про барьеры
[/uquote]
на форуме ST обсуждали этот вопрос, PM говорил что DSBшить надо в редких случаях, когда таблицу векторов переносят или память переалиасят, на форуме писали, что с FSMC ловили глюки без барьера
Вот докладик про барьеры
[/uquote]
на форуме ST обсуждали этот вопрос, PM говорил что DSBшить надо в редких случаях, когда таблицу векторов переносят или память переалиасят, на форуме писали, что с FSMC ловили глюки без барьера
После нас - хоть потоп (с) Лойсо
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
TEPEM, а скажи мне как эмбеддер эмбеддеру, а где ты частоту процессора поднимаешь? Или так на HSI и пытаешься "выжать" fps? 
правильно вот такПро "мэджик намберс" молчу, проверить я их не могу.
Код: Выделить всё
GPIOD->ODR |= 0x800; //D11 reset
FSMC_Bank1->BTCR[0] &= 0x00000000;
FSMC_Bank1->BTCR[0] |= 1 << 14| 1 << 12 | 0x01 << 4 | 0x00 << 2 | 1 << 0;
Код: Выделить всё
GPIOD->BSRR = 1<<11; //D11 = "1"
FSMC_Bank1->BTCR[0] = 1 << 14| 1 << 12 | 0x01 << 4 | 0x00 << 2 | 1 << 0;- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
С тактовой да, там 16мГц, мне Bevice помогает ее поднять, даст Бог все пройдет)
А это я все поправляю, так глядишь и код уменьшится, спасибо
А это я все поправляю, так глядишь и код уменьшится, спасибо
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
Ну дерзайте, не забудь латентность flash выставить ПЕРЕД поднятием частоты.
ЗЫ: покажи потом что получилось, будем оптимизировать.
ЗЫ: покажи потом что получилось, будем оптимизировать.
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
Получилось вот так на данный момент)
main
#include "stm32f412zx.h"
#include "disp.h"
#include "lis24.h"
int main()
{
initdisp();
int x,y,i, ih;
uint8_t r, g, b, r8,g8,b8;
uint16_t rgb565;
beluidisplei(0);y=128;
for (i = 0; i < 16384; i++)
{
if ( x < 127 )
{
if (i>0)ih = i*3;else ih=3;
r8 = picture1[ih-1]; g8 = picture1[ih-2]; b8 = picture1[ih];
r = ((r8 & 0xF8) >> 3);
g = ((g8 & 0xFC) >> 2);
b = ((b8 & 0xF8) >> 3);
rgb565 = ((uint16_t)(r) << 11) + ((uint16_t)(g) << 5) + ((uint16_t)(b) << 0);
WritePixel(x+56, y+56, rgb565);
x++;
}
else { x=0; y--;}
}
while (1)
{
//if((GPIOA->IDR & 1)==1) //нажатие джостик
}
}
low_level_init
extern "C" {
#endif
#include <stddef.h>
#include "stm32f412zx.h"
int __low_level_init(void)
{
RCC->CR |= ((uint32_t)RCC_CR_HSEON);//запускаем HSE (RCC->CR)
while(!(RCC->CR & RCC_CR_HSERDY));//ждем запуска HSE (RCC->CR)
RCC->PLLCFGR = 0x403208;
RCC->CR |= RCC_CR_PLLON;
while((RCC->CR & RCC_CR_PLLRDY) == 0) {}
FLASH->ACR = 3;
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
//djostik selest pa0
RCC->AHB3ENR |= RCC_AHB3ENR_FSMCEN; //Тактирование FSMC
RCC->AHB1ENR |= ( RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOEEN | RCC_AHB1ENR_GPIOFEN | RCC_AHB1ENR_GPIOAEN); //Тактирование порта FSMC
RCC->APB1ENR |= ( RCC_APB1ENR_TIM5EN | RCC_APB1ENR_TIM2EN);//Тактирование таймера PF5 LCD TIM5_CN3 1-5kHz
GPIOF->MODER |= ( GPIO_MODER_MODER5_1 | GPIO_MODER_MODER0_1); //Выход LCD LED//Выход FSMC - A0
GPIOF->MODER &= ~ ( GPIO_MODER_MODER14_0 | GPIO_MODER_MODER15_0 ); //Вход
GPIOD->MODER |= ( GPIO_MODER_MODER15_1 | GPIO_MODER_MODER14_1 | GPIO_MODER_MODER8_1 | GPIO_MODER_MODER10_1 //Выход FSMC
| GPIO_MODER_MODER1_1 | GPIO_MODER_MODER11_0 | GPIO_MODER_MODER4_1 | GPIO_MODER_MODER0_1 | GPIO_MODER_MODER5_1
| GPIO_MODER_MODER7_1 | GPIO_MODER_MODER9_1);
GPIOE->MODER |=( GPIO_MODER_MODER0_0 | GPIO_MODER_MODER1_0 | GPIO_MODER_MODER2_0 | GPIO_MODER_MODER3_0
| GPIO_MODER_MODER14_1 | GPIO_MODER_MODER12_1 | GPIO_MODER_MODER10_1 | GPIO_MODER_MODER8_1 | GPIO_MODER_MODER15_1
| GPIO_MODER_MODER13_1 | GPIO_MODER_MODER11_1 | GPIO_MODER_MODER9_1 | GPIO_MODER_MODER7_1 );
GPIOA->MODER &= ~GPIO_MODER_MODER0_0; //Djostick
GPIOG->MODER |= GPIO_MODER_MODER4_1; //Выход FSMC - LCD TE FSMC_A14 ?
GPIOD->OTYPER &= ~ ( GPIO_OTYPER_OT_15 | GPIO_OTYPER_OT_14 | GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_10 | GPIO_OTYPER_OT_1
| GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_4 | GPIO_OTYPER_OT_0 | GPIO_OTYPER_OT_5 | GPIO_OTYPER_OT_7 | GPIO_OTYPER_OT_9);
GPIOE->OTYPER &= ~ ( GPIO_OTYPER_OT_14 | GPIO_OTYPER_OT_12 | GPIO_OTYPER_OT_10 | GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_15
| GPIO_OTYPER_OT_13 | GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_7 );
GPIOF->OTYPER &= ~GPIO_OTYPER_OT_0;
GPIOG->OTYPER &= ~GPIO_OTYPER_OT_4;
GPIOD->PUPDR &= ~ ( GPIO_PUPDR_PUPDR15 | GPIO_PUPDR_PUPDR14 | GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR10 | GPIO_PUPDR_PUPDR1
| GPIO_PUPDR_PUPDR11 | GPIO_PUPDR_PUPDR4 | GPIO_PUPDR_PUPDR0 | GPIO_PUPDR_PUPDR5 | GPIO_PUPDR_PUPDR7 | GPIO_PUPDR_PUPDR9);
GPIOE->PUPDR &= ~ ( GPIO_PUPDR_PUPDR14 | GPIO_PUPDR_PUPDR12 | GPIO_PUPDR_PUPDR10 | GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR15
| GPIO_PUPDR_PUPDR13 | GPIO_PUPDR_PUPDR11 | GPIO_PUPDR_PUPDR9 | GPIO_PUPDR_PUPDR7 );
GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR0;
GPIOG->PUPDR &= ~GPIO_PUPDR_PUPDR4;
GPIOD->OSPEEDR |= ( GPIO_OSPEEDER_OSPEEDR15 | GPIO_OSPEEDER_OSPEEDR14 | GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR10
| GPIO_OSPEEDER_OSPEEDR1 | GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR4 | GPIO_OSPEEDER_OSPEEDR0 | GPIO_OSPEEDER_OSPEEDR5
| GPIO_OSPEEDER_OSPEEDR7 | GPIO_OSPEEDER_OSPEEDR9 );
GPIOE->OSPEEDR |= ( GPIO_OSPEEDER_OSPEEDR15 | GPIO_OSPEEDER_OSPEEDR14 | GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR10
| GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR13 | GPIO_OSPEEDER_OSPEEDR5 | GPIO_OSPEEDER_OSPEEDR7 | GPIO_OSPEEDER_OSPEEDR9);
GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR0;
GPIOG->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR4;//вход
GPIOD->AFR[0] = 0xC0CC00CC;
GPIOD->AFR[1] = 0xCC000CCC;
GPIOE->AFR[0] = 0xC0000000;
GPIOE->AFR[1] = 0xCCCCCCCC;
GPIOF->AFR[0] = 0x20000C;
GPIOG->AFR[0] = 0xC0000;
TIM5->CCER |= TIM_CCER_CC3E;//
TIM5->CCMR2|=(TIM_CCMR2_OC3M_0 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2); //ССМР2 наш канал 3
TIM5->CR1 |= TIM_CR1_CEN;
TIM5->CCR1 = 1000; // Скваженность
GPIOD->ODR |= 0x800; //D11 reset
FSMC_Bank1->BTCR[0] = 1 << 14| 1 << 12 | 0x01 << 4 | 0x00 << 2 | 1 << 0;
FSMC_Bank1->BTCR[1] = 0x00 << 28 | 0x0000 << 20 | 0x0f << 8 | 0x01;
FSMC_Bank1E->BWTR[0] = 0x00 << 28 | 0x0000 << 20 |0x03 << 8 | 0x00;
return 1;
}
#ifdef __cplusplus
}
#endif
disp
#include "stm32f412zx.h"
#define FMC_BANK1 ((LCTDef *)(uint32_t)(0x60000000 | 0x00000000))
typedef struct
{
__IO uint16_t REG;
__IO uint16_t RAM;
}LCTDef;
static uint8_t flag = 1;
void initTIM2()
{
TIM2->PSC = 10000- 1;
TIM2->DIER |= TIM_DIER_UIE;
NVIC_EnableIRQ(TIM2_IRQn);
}
void delay(uint32_t _delay){
initTIM2();
TIM2->ARR = _delay;
TIM2->CR1 |= TIM_CR1_CEN;
flag = 1;
while(flag);
}
extern "C" void TIM2_IRQHandler(void)
{
TIM2->SR &= ~TIM_SR_UIF;
TIM2->CR1 &= ~TIM_CR1_CEN;
flag = 0;
}
void WriteReg(uint8_t Command, uint8_t *Parameters, uint8_t NbParameters)
{
uint8_t i;
/* Send command */
FMC_BANK1->REG = Command;//LCD_IO_WriteReg(Command);
/* Send command's parameters if any */
for (i=0; i<NbParameters; i++)
{
//FMC_BANK1_WriteData(Parameters[i]);
FMC_BANK1->RAM = Parameters[i];//LCD_IO_WriteData(Parameters[i]);
}
}
void WriteData(uint8_t Command)
{
FMC_BANK1->RAM = Command;//LCD_IO_WriteData(Parameters[i]);
}
void WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode)
{
/* Set Cursor */
uint8_t parameter1[4];
parameter1[0] = 0x00;
parameter1[1] = 0x00 + Xpos;// +X
parameter1[2] = 0x00;
parameter1[3] = 0xEF + Xpos;// +x
WriteReg(0x2A, parameter1, 4);
/* RASET: Row Addrses Set */
parameter1[0] = 0x00;
parameter1[1] = 0x00 + Ypos;// +y
parameter1[2] = 0x00;
parameter1[3] = 0xEF + Ypos;// +y
WriteReg(0x2B, parameter1, 4);
/* Prepare to write to LCD RAM */
WriteReg(0x2C, (uint8_t*)NULL, 0); /* RAM write data command */
/* Write RAM data */
FMC_BANK1->RAM = RGBCode;
}
void beluidisplei(uint16_t he)
{
int x,y, rgbe;
if ( he == 0 ) rgbe = 0xFFFFFF;
if ( he == 1 ) rgbe = 0x000000;
y=0;
while( y < 240)
{
x=0;
while( x < 240)
{
WritePixel(x, y , rgbe);
x++;
}
y++;
}
}
void initdisp()
{
uint8_t parameter[14];
/* Sleep In Command */
WriteReg(0x10, (uint8_t*)NULL, 0);
delay(10);
/* SW Reset Command */
WriteReg(0x01, (uint8_t*)NULL, 0);
/* Wait for 200ms */
delay(200);
/* Sleep Out Command */
WriteReg(0x11, (uint8_t*)NULL, 0);
/* Wait for 120ms */
delay(120);
/* Normal display for Driver Down side */
parameter[0] = 0x00;
WriteReg(0x36, parameter, 1);
/* Color mode 16bits/pixel */
parameter[0] = 0x05;
WriteReg(0x3A, parameter, 1);
/* Display inversion On */
WriteReg( 0x21, (uint8_t*)NULL, 0);
/* Set Column address CASET */
parameter[0] = 0x00;
parameter[1] = 0x00;
parameter[2] = 0x00;
parameter[3] = 0xEF;
WriteReg(0x2A, parameter, 4);
/* Set Row address RASET */
parameter[0] = 0x00;
parameter[1] = 0x00;
parameter[2] = 0x00;
parameter[3] = 0xEF;
WriteReg(0x2B, parameter, 4);
/*---------- ST7789H2 Frame rate setting ----------*/
/* PORCH control setting */
parameter[0] = 0x0C;
parameter[1] = 0x0C;
parameter[2] = 0x00;
parameter[3] = 0x33;
parameter[4] = 0x33;
WriteReg(0xB2, parameter, 5);
/* GATE control setting */
parameter[0] = 0x35;
WriteReg(0xB7, parameter, 1);
/*---------- ST7789H2 Power setting ----------*/
/* VCOM setting */
parameter[0] = 0x1F;
WriteReg(0xBB, parameter, 1);
/* LCM Control setting */
parameter[0] = 0x2C;
WriteReg(0xC0, parameter, 1);
/* VDV and VRH Command Enable */
parameter[0] = 0x01;
parameter[1] = 0xC3;
WriteReg(0xC2, parameter, 2);
/* VDV Set */
parameter[0] = 0x20;
WriteReg(0xC4, parameter, 1);
/* Frame Rate Control in normal mode */
parameter[0] = 0x0F;
WriteReg(0xC6, parameter, 1);
/* Power Control */
parameter[0] = 0xA4;
parameter[1] = 0xA1;
WriteReg(0xD0, parameter, 1);
/*---------- ST7789H2 Gamma setting ----------*/
/* Positive Voltage Gamma Control */
parameter[0] = 0xD0;
parameter[1] = 0x08;
parameter[2] = 0x11;
parameter[3] = 0x08;
parameter[4] = 0x0C;
parameter[5] = 0x15;
parameter[6] = 0x39;
parameter[7] = 0x33;
parameter[8] = 0x50;
parameter[9] = 0x36;
parameter[10] = 0x13;
parameter[11] = 0x14;
parameter[12] = 0x29;
parameter[13] = 0x2D;
WriteReg(0xE0, parameter, 14);
/* Negative Voltage Gamma Control */
parameter[0] = 0xD0;
parameter[1] = 0x08;
parameter[2] = 0x10;
parameter[3] = 0x08;
parameter[4] = 0x06;
parameter[5] = 0x06;
parameter[6] = 0x39;
parameter[7] = 0x44;
parameter[8] = 0x51;
parameter[9] = 0x0B;
parameter[10] = 0x16;
parameter[11] = 0x14;
parameter[12] = 0x2F;
parameter[13] = 0x31;
WriteReg(0xE1, parameter, 14);
/* Display ON command */
WriteReg(0x29, (uint8_t*)NULL, 0);
/* Sleep Out command */
WriteReg(0x11, (uint8_t*)NULL, 0);
/* Tearing Effect Line On: Option (00h:VSYNC Interface OFF, 01h:VSYNC Interface ON) */
parameter[0] = 0x00;
WriteReg(0x35, parameter, 1);
///////////////////////////////////////////////////////
parameter[0] = 0x00;
WriteReg(0x36, parameter, 1);
///////////////////////////////////////////////////////
}
lis24.h это лис из вк конвертированный в массив

main
Спойлер
#include <stddef.h>#include "stm32f412zx.h"
#include "disp.h"
#include "lis24.h"
int main()
{
initdisp();
int x,y,i, ih;
uint8_t r, g, b, r8,g8,b8;
uint16_t rgb565;
beluidisplei(0);y=128;
for (i = 0; i < 16384; i++)
{
if ( x < 127 )
{
if (i>0)ih = i*3;else ih=3;
r8 = picture1[ih-1]; g8 = picture1[ih-2]; b8 = picture1[ih];
r = ((r8 & 0xF8) >> 3);
g = ((g8 & 0xFC) >> 2);
b = ((b8 & 0xF8) >> 3);
rgb565 = ((uint16_t)(r) << 11) + ((uint16_t)(g) << 5) + ((uint16_t)(b) << 0);
WritePixel(x+56, y+56, rgb565);
x++;
}
else { x=0; y--;}
}
while (1)
{
//if((GPIOA->IDR & 1)==1) //нажатие джостик
}
}
low_level_init
Спойлер
#ifdef __cplusplusextern "C" {
#endif
#include <stddef.h>
#include "stm32f412zx.h"
int __low_level_init(void)
{
RCC->CR |= ((uint32_t)RCC_CR_HSEON);//запускаем HSE (RCC->CR)
while(!(RCC->CR & RCC_CR_HSERDY));//ждем запуска HSE (RCC->CR)
RCC->PLLCFGR = 0x403208;
RCC->CR |= RCC_CR_PLLON;
while((RCC->CR & RCC_CR_PLLRDY) == 0) {}
FLASH->ACR = 3;
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
//djostik selest pa0
RCC->AHB3ENR |= RCC_AHB3ENR_FSMCEN; //Тактирование FSMC
RCC->AHB1ENR |= ( RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOEEN | RCC_AHB1ENR_GPIOFEN | RCC_AHB1ENR_GPIOAEN); //Тактирование порта FSMC
RCC->APB1ENR |= ( RCC_APB1ENR_TIM5EN | RCC_APB1ENR_TIM2EN);//Тактирование таймера PF5 LCD TIM5_CN3 1-5kHz
GPIOF->MODER |= ( GPIO_MODER_MODER5_1 | GPIO_MODER_MODER0_1); //Выход LCD LED//Выход FSMC - A0
GPIOF->MODER &= ~ ( GPIO_MODER_MODER14_0 | GPIO_MODER_MODER15_0 ); //Вход
GPIOD->MODER |= ( GPIO_MODER_MODER15_1 | GPIO_MODER_MODER14_1 | GPIO_MODER_MODER8_1 | GPIO_MODER_MODER10_1 //Выход FSMC
| GPIO_MODER_MODER1_1 | GPIO_MODER_MODER11_0 | GPIO_MODER_MODER4_1 | GPIO_MODER_MODER0_1 | GPIO_MODER_MODER5_1
| GPIO_MODER_MODER7_1 | GPIO_MODER_MODER9_1);
GPIOE->MODER |=( GPIO_MODER_MODER0_0 | GPIO_MODER_MODER1_0 | GPIO_MODER_MODER2_0 | GPIO_MODER_MODER3_0
| GPIO_MODER_MODER14_1 | GPIO_MODER_MODER12_1 | GPIO_MODER_MODER10_1 | GPIO_MODER_MODER8_1 | GPIO_MODER_MODER15_1
| GPIO_MODER_MODER13_1 | GPIO_MODER_MODER11_1 | GPIO_MODER_MODER9_1 | GPIO_MODER_MODER7_1 );
GPIOA->MODER &= ~GPIO_MODER_MODER0_0; //Djostick
GPIOG->MODER |= GPIO_MODER_MODER4_1; //Выход FSMC - LCD TE FSMC_A14 ?
GPIOD->OTYPER &= ~ ( GPIO_OTYPER_OT_15 | GPIO_OTYPER_OT_14 | GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_10 | GPIO_OTYPER_OT_1
| GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_4 | GPIO_OTYPER_OT_0 | GPIO_OTYPER_OT_5 | GPIO_OTYPER_OT_7 | GPIO_OTYPER_OT_9);
GPIOE->OTYPER &= ~ ( GPIO_OTYPER_OT_14 | GPIO_OTYPER_OT_12 | GPIO_OTYPER_OT_10 | GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_15
| GPIO_OTYPER_OT_13 | GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_7 );
GPIOF->OTYPER &= ~GPIO_OTYPER_OT_0;
GPIOG->OTYPER &= ~GPIO_OTYPER_OT_4;
GPIOD->PUPDR &= ~ ( GPIO_PUPDR_PUPDR15 | GPIO_PUPDR_PUPDR14 | GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR10 | GPIO_PUPDR_PUPDR1
| GPIO_PUPDR_PUPDR11 | GPIO_PUPDR_PUPDR4 | GPIO_PUPDR_PUPDR0 | GPIO_PUPDR_PUPDR5 | GPIO_PUPDR_PUPDR7 | GPIO_PUPDR_PUPDR9);
GPIOE->PUPDR &= ~ ( GPIO_PUPDR_PUPDR14 | GPIO_PUPDR_PUPDR12 | GPIO_PUPDR_PUPDR10 | GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR15
| GPIO_PUPDR_PUPDR13 | GPIO_PUPDR_PUPDR11 | GPIO_PUPDR_PUPDR9 | GPIO_PUPDR_PUPDR7 );
GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR0;
GPIOG->PUPDR &= ~GPIO_PUPDR_PUPDR4;
GPIOD->OSPEEDR |= ( GPIO_OSPEEDER_OSPEEDR15 | GPIO_OSPEEDER_OSPEEDR14 | GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR10
| GPIO_OSPEEDER_OSPEEDR1 | GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR4 | GPIO_OSPEEDER_OSPEEDR0 | GPIO_OSPEEDER_OSPEEDR5
| GPIO_OSPEEDER_OSPEEDR7 | GPIO_OSPEEDER_OSPEEDR9 );
GPIOE->OSPEEDR |= ( GPIO_OSPEEDER_OSPEEDR15 | GPIO_OSPEEDER_OSPEEDR14 | GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR10
| GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR13 | GPIO_OSPEEDER_OSPEEDR5 | GPIO_OSPEEDER_OSPEEDR7 | GPIO_OSPEEDER_OSPEEDR9);
GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR0;
GPIOG->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR4;//вход
GPIOD->AFR[0] = 0xC0CC00CC;
GPIOD->AFR[1] = 0xCC000CCC;
GPIOE->AFR[0] = 0xC0000000;
GPIOE->AFR[1] = 0xCCCCCCCC;
GPIOF->AFR[0] = 0x20000C;
GPIOG->AFR[0] = 0xC0000;
TIM5->CCER |= TIM_CCER_CC3E;//
TIM5->CCMR2|=(TIM_CCMR2_OC3M_0 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2); //ССМР2 наш канал 3
TIM5->CR1 |= TIM_CR1_CEN;
TIM5->CCR1 = 1000; // Скваженность
GPIOD->ODR |= 0x800; //D11 reset
FSMC_Bank1->BTCR[0] = 1 << 14| 1 << 12 | 0x01 << 4 | 0x00 << 2 | 1 << 0;
FSMC_Bank1->BTCR[1] = 0x00 << 28 | 0x0000 << 20 | 0x0f << 8 | 0x01;
FSMC_Bank1E->BWTR[0] = 0x00 << 28 | 0x0000 << 20 |0x03 << 8 | 0x00;
return 1;
}
#ifdef __cplusplus
}
#endif
disp
Спойлер
#include <stddef.h>#include "stm32f412zx.h"
#define FMC_BANK1 ((LCTDef *)(uint32_t)(0x60000000 | 0x00000000))
typedef struct
{
__IO uint16_t REG;
__IO uint16_t RAM;
}LCTDef;
static uint8_t flag = 1;
void initTIM2()
{
TIM2->PSC = 10000- 1;
TIM2->DIER |= TIM_DIER_UIE;
NVIC_EnableIRQ(TIM2_IRQn);
}
void delay(uint32_t _delay){
initTIM2();
TIM2->ARR = _delay;
TIM2->CR1 |= TIM_CR1_CEN;
flag = 1;
while(flag);
}
extern "C" void TIM2_IRQHandler(void)
{
TIM2->SR &= ~TIM_SR_UIF;
TIM2->CR1 &= ~TIM_CR1_CEN;
flag = 0;
}
void WriteReg(uint8_t Command, uint8_t *Parameters, uint8_t NbParameters)
{
uint8_t i;
/* Send command */
FMC_BANK1->REG = Command;//LCD_IO_WriteReg(Command);
/* Send command's parameters if any */
for (i=0; i<NbParameters; i++)
{
//FMC_BANK1_WriteData(Parameters[i]);
FMC_BANK1->RAM = Parameters[i];//LCD_IO_WriteData(Parameters[i]);
}
}
void WriteData(uint8_t Command)
{
FMC_BANK1->RAM = Command;//LCD_IO_WriteData(Parameters[i]);
}
void WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode)
{
/* Set Cursor */
uint8_t parameter1[4];
parameter1[0] = 0x00;
parameter1[1] = 0x00 + Xpos;// +X
parameter1[2] = 0x00;
parameter1[3] = 0xEF + Xpos;// +x
WriteReg(0x2A, parameter1, 4);
/* RASET: Row Addrses Set */
parameter1[0] = 0x00;
parameter1[1] = 0x00 + Ypos;// +y
parameter1[2] = 0x00;
parameter1[3] = 0xEF + Ypos;// +y
WriteReg(0x2B, parameter1, 4);
/* Prepare to write to LCD RAM */
WriteReg(0x2C, (uint8_t*)NULL, 0); /* RAM write data command */
/* Write RAM data */
FMC_BANK1->RAM = RGBCode;
}
void beluidisplei(uint16_t he)
{
int x,y, rgbe;
if ( he == 0 ) rgbe = 0xFFFFFF;
if ( he == 1 ) rgbe = 0x000000;
y=0;
while( y < 240)
{
x=0;
while( x < 240)
{
WritePixel(x, y , rgbe);
x++;
}
y++;
}
}
void initdisp()
{
uint8_t parameter[14];
/* Sleep In Command */
WriteReg(0x10, (uint8_t*)NULL, 0);
delay(10);
/* SW Reset Command */
WriteReg(0x01, (uint8_t*)NULL, 0);
/* Wait for 200ms */
delay(200);
/* Sleep Out Command */
WriteReg(0x11, (uint8_t*)NULL, 0);
/* Wait for 120ms */
delay(120);
/* Normal display for Driver Down side */
parameter[0] = 0x00;
WriteReg(0x36, parameter, 1);
/* Color mode 16bits/pixel */
parameter[0] = 0x05;
WriteReg(0x3A, parameter, 1);
/* Display inversion On */
WriteReg( 0x21, (uint8_t*)NULL, 0);
/* Set Column address CASET */
parameter[0] = 0x00;
parameter[1] = 0x00;
parameter[2] = 0x00;
parameter[3] = 0xEF;
WriteReg(0x2A, parameter, 4);
/* Set Row address RASET */
parameter[0] = 0x00;
parameter[1] = 0x00;
parameter[2] = 0x00;
parameter[3] = 0xEF;
WriteReg(0x2B, parameter, 4);
/*---------- ST7789H2 Frame rate setting ----------*/
/* PORCH control setting */
parameter[0] = 0x0C;
parameter[1] = 0x0C;
parameter[2] = 0x00;
parameter[3] = 0x33;
parameter[4] = 0x33;
WriteReg(0xB2, parameter, 5);
/* GATE control setting */
parameter[0] = 0x35;
WriteReg(0xB7, parameter, 1);
/*---------- ST7789H2 Power setting ----------*/
/* VCOM setting */
parameter[0] = 0x1F;
WriteReg(0xBB, parameter, 1);
/* LCM Control setting */
parameter[0] = 0x2C;
WriteReg(0xC0, parameter, 1);
/* VDV and VRH Command Enable */
parameter[0] = 0x01;
parameter[1] = 0xC3;
WriteReg(0xC2, parameter, 2);
/* VDV Set */
parameter[0] = 0x20;
WriteReg(0xC4, parameter, 1);
/* Frame Rate Control in normal mode */
parameter[0] = 0x0F;
WriteReg(0xC6, parameter, 1);
/* Power Control */
parameter[0] = 0xA4;
parameter[1] = 0xA1;
WriteReg(0xD0, parameter, 1);
/*---------- ST7789H2 Gamma setting ----------*/
/* Positive Voltage Gamma Control */
parameter[0] = 0xD0;
parameter[1] = 0x08;
parameter[2] = 0x11;
parameter[3] = 0x08;
parameter[4] = 0x0C;
parameter[5] = 0x15;
parameter[6] = 0x39;
parameter[7] = 0x33;
parameter[8] = 0x50;
parameter[9] = 0x36;
parameter[10] = 0x13;
parameter[11] = 0x14;
parameter[12] = 0x29;
parameter[13] = 0x2D;
WriteReg(0xE0, parameter, 14);
/* Negative Voltage Gamma Control */
parameter[0] = 0xD0;
parameter[1] = 0x08;
parameter[2] = 0x10;
parameter[3] = 0x08;
parameter[4] = 0x06;
parameter[5] = 0x06;
parameter[6] = 0x39;
parameter[7] = 0x44;
parameter[8] = 0x51;
parameter[9] = 0x0B;
parameter[10] = 0x16;
parameter[11] = 0x14;
parameter[12] = 0x2F;
parameter[13] = 0x31;
WriteReg(0xE1, parameter, 14);
/* Display ON command */
WriteReg(0x29, (uint8_t*)NULL, 0);
/* Sleep Out command */
WriteReg(0x11, (uint8_t*)NULL, 0);
/* Tearing Effect Line On: Option (00h:VSYNC Interface OFF, 01h:VSYNC Interface ON) */
parameter[0] = 0x00;
WriteReg(0x35, parameter, 1);
///////////////////////////////////////////////////////
parameter[0] = 0x00;
WriteReg(0x36, parameter, 1);
///////////////////////////////////////////////////////
}
lis24.h это лис из вк конвертированный в массив
Спойлер
