Таймер не работает

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Таймер не работает

Сообщение VladislavS »

[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 в сторону "я тут наоптимизоровал, работать перестало, но формально хрен подкопаешься". Но тут это будет жёсткий оффтопик.
Последний раз редактировалось VladislavS Сб дек 14, 2019 13:00:48, всего редактировалось 1 раз.
Аватара пользователя
TEPEM
Нашел транзистор. Понюхал.
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

Re: Таймер не работает

Сообщение TEPEM »

[uquote="TEPEM",url="/forum/viewtopic.php?p=3755558#p3755558"]Я полазил по англоязычным сайтам и нашел несколько регистровых настроек FSMC, одна из них подошла, FFFFFFFFF мне тоже не понравились([/uquote]Да прекращай ты копипастить всякую дурь. Ну есть же RM. Неужели так трудно сесть, внимательно прочитать и заполнить правильными параметрами два-три регистра FSMC?[/uquote]

Я не поленился все регистры выписать, перевести, почитать, вникнуть. Но они мягко говоря не однозначные, рассчитаны на людей хорошо знающих архитектуру FSMC, а надо заметить в интернете про FSMC информации либо вообще нет либо я им не умею пользоваться. Я и книжечки на озоне искал и статейки гуглил, а в ответ тишина. Одни статьи как кубом дисплей прикрутить
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Таймер не работает

Сообщение VladislavS »

[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: Таймер не работает

Сообщение TEPEM »

Это я собирал по библиотекам HAL, в надежде упростить потом

Добавлено after 10 minutes 28 seconds:
Вот если создать дополнительный файл с иницилизацией и настройкой контроллера дисплея, это канонично сделать и .h & .c или в одном .h работать не будет?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Таймер не работает

Сообщение VladislavS »

[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: Таймер не работает

Сообщение TEPEM »

а .cpp он же без пары? Если в таком же сделать все это?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Таймер не работает

Сообщение VladislavS »

[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() в других тулчейнах) и там надо себя вести аккуратно.
Последний раз редактировалось VladislavS Сб дек 14, 2019 12:08:17, всего редактировалось 1 раз.
Аватара пользователя
TEPEM
Нашел транзистор. Понюхал.
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

Re: Таймер не работает

Сообщение TEPEM »

Да, low_level_init мне очень понравился, он выполняется даже раньше чем плей нажимаешь в иар

Добавлено after 1 minute 8 seconds:
Дык я бы с удовольствием не городил бы два файла а сделал бы в одном .cpp, только как их связать чтобы можно было функции глобально использовать из него
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Таймер не работает

Сообщение VladislavS »

[uquote="TEPEM",url="/forum/viewtopic.php?p=3755586#p3755586"]Дык я бы с удовольствием не городил бы два файла а сделал бы в одном .cpp,[/uquote]В общем случае, при классическом построении программы/проекта это невозможно. Да и зачем? Обратное, кстати, когда вся библиотека в .h - вполне обычное дело. Но ты к этому ещё не готов, лучше научись сначала всё по классике делать.

[uquote="TEPEM",url="/forum/viewtopic.php?p=3755586#p3755586"]только как их связать чтобы можно было функции глобально использовать из него[/uquote]Ну так .h для этого и есть.
Аватара пользователя
TEPEM
Нашел транзистор. Понюхал.
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

Re: Таймер не работает

Сообщение TEPEM »

Сделал по классике, заработало)
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Таймер не работает

Сообщение Мурик »

bevice писал(а):Но если так не нравится - Code::Block почти без настроек работает. Буквально вчера пробовал.
Тогда уж лучше EmBitz. Среда на основе Code::Block и оптимизирована под STM32.
При создании проекта автоматически в него добавляется CMSIS, а при необходимости и SPL.
Компилятор GCC входит в состав дистрибутива.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Таймер не работает

Сообщение VladislavS »

Мурик был бы не Мурик, если бы про "лучшие шпингалеты выпускается на фабрике №3 по адресу улица Цурюпа 15 телефон 9-18 факс 4-12 добавочный 03, самовывоз из Нижнего Тагила" не ввернул. :) Серьёзный продукт, даже по оффсайту виндно
СпойлерИзображение
Вложения
em.png
(53.25 КБ) 305 скачиваний
Аватара пользователя
bevice
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб июн 06, 2009 11:13:56
Контактная информация:

Re: Таймер не работает

Сообщение bevice »

[uquote="Мурик",url="/forum/viewtopic.php?p=3755690#p3755690"]
bevice писал(а):Но если так не нравится - Code::Block почти без настроек работает. Буквально вчера пробовал.
Тогда уж лучше EmBitz. Среда на основе Code::Block и оптимизирована под STM32.
При создании проекта автоматически в него добавляется 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
(для stm32F103C8) при этом в шаблоне уже есть CMSIS/LL/HAL в виде подключаемых библиотек, есть конфигурационные файлы для OpenOCD, все настроено и готово к использованию в Clion. Для остальных еще нужно сделать что-то вроде

Код: Выделить всё

cmake -G "CodeBlocks - Unix Makefiles" src/path
но у ребят это тоже автоматизировано скриптами.

Ну и как я говорил, есть возможность собирать через docker-сборщик, так же одной командой без установок любых IDE, или без докера, но тогда придется иметь arm-none-eabi-gcc+make+cmake
После нас - хоть потоп (с) Лойсо
Аватара пользователя
TEPEM
Нашел транзистор. Понюхал.
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

Re: Таймер не работает

Сообщение TEPEM »

Дисплей работает STM32F412G-Disco, без левых библиотек, выложу, может кто то подскажет что сократить, может кто скопирует, мне по крайней мере очень надо было.
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 __cplusplus
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
Последний раз редактировалось TEPEM Сб дек 14, 2019 14:06:43, всего редактировалось 1 раз.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Таймер не работает

Сообщение VladislavS »

Господа, что-то вас не в ту степь несёт! Проблема ТС вовсе не в выборе IDE. У него есть рабочая IDE, которой он худо бедно получает результат. Зачем вы энтропию повышаете? Зачем ему для своего хобби строить билд-систему корпорации?

Добавлено after 12 minutes 59 seconds:
TEPEM, __enable_irq () не по месту применена - это штука глобальная. Её лучше в main() после всех инициализаций применять. Да и вообще, не нужна она, так как в Cortex-M прерывания по умолчанию разрешены. Можешь попробовать убрать - ничего не изменится.

2ALL, применение тут __DSB() для меня необъяснимо. Нескольких процессоров нет, нескольких потоков тоже нет. Кроме тормозов ничего тут барьер не даёт.
Вот докладик про барьеры
Аватара пользователя
bevice
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб июн 06, 2009 11:13:56
Контактная информация:

Re: Таймер не работает

Сообщение bevice »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3755709#p3755709"]2ALL, применение тут __DSB() для меня необъяснимо. Нескольких процессоров нет, нескольких потоков тоже нет. Кроме тормозов ничего тут барьер не даёт.
Вот докладик про барьеры
[/uquote]
на форуме ST обсуждали этот вопрос, PM говорил что DSBшить надо в редких случаях, когда таблицу векторов переносят или память переалиасят, на форуме писали, что с FSMC ловили глюки без барьера
После нас - хоть потоп (с) Лойсо
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Таймер не работает

Сообщение VladislavS »

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: Таймер не работает

Сообщение TEPEM »

С тактовой да, там 16мГц, мне Bevice помогает ее поднять, даст Бог все пройдет)
А это я все поправляю, так глядишь и код уменьшится, спасибо
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Таймер не работает

Сообщение VladislavS »

Ну дерзайте, не забудь латентность flash выставить ПЕРЕД поднятием частоты.

ЗЫ: покажи потом что получилось, будем оптимизировать.
Аватара пользователя
TEPEM
Нашел транзистор. Понюхал.
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

Re: Таймер не работает

Сообщение TEPEM »

Получилось вот так на данный момент)
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 __cplusplus
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 <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 это лис из вк конвертированный в массив
СпойлерИзображение
Ответить

Вернуться в «ARM»