Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Сб дек 14, 2019 11:25:58

Есть же способ обратится к функциям находящимся в low_level_init.cpp из майна основного?
Не надо в low_level_init.cpp ничего кроме __low_level_init() пихать! Внутри __low_level_init() делай самую необходимую инициализацию железа (тактовые, GPIO, FSMC и т.д.) и всё.

Так не выходит, при попытке приинклудить low_level_init.cpp он ошибку кидает(
Кто тебя учил .c и .cpp файлы инклудить?

Я полазил по англоязычным сайтам и нашел несколько регистровых настроек FSMC, одна из них подошла, FFFFFFFFF мне тоже не понравились(
Да прекращай ты копипастить всякую дурь. Ну есть же RM. Неужели так трудно сесть, внимательно прочитать и заполнить правильными параметрами два-три регистра FSMC?

Добавлено after 4 minutes 8 seconds:
* не нужно пропускать volatile там где он нужен и с оптимизацией-по умолчанию ничего страшного не случится. Если иар позволяет такие фокусы даже со включенной на полную оптимизацией - оптимизатор у него не работает.
Не надо рубить шашкой. Я имею в виду достаточно неочевидные для новичка случаи, которые даже для меня с двумя десятками лет эмбеддерского опыта являются спорными. У меня есть несколько примеров, когда IAR разруливает их в сторону пользователя, а GCC в сторону "я тут наоптимизоровал, работать перестало, но формально хрен подкопаешься". Но тут это будет жёсткий оффтопик.
Последний раз редактировалось VladislavS Сб дек 14, 2019 13:00:48, всего редактировалось 1 раз.

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

Сб дек 14, 2019 11:26:32

Я полазил по англоязычным сайтам и нашел несколько регистровых настроек FSMC, одна из них подошла, FFFFFFFFF мне тоже не понравились(
Да прекращай ты копипастить всякую дурь. Ну есть же RM. Неужели так трудно сесть, внимательно прочитать и заполнить правильными параметрами два-три регистра FSMC?[/uquote]

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

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

Сб дек 14, 2019 11:30:54

Но они мягко говоря не однозначные, рассчитаны на людей хорошо знающих архитектуру FSMC,
Ну так на то и форум, спрашивай какие параметры непонятны. Думаешь не расскажут?

Ну просто когда я вижу вот такое, то о качестве остального кода у меня складывается определённое негативное впечатление.
Код:
((LCTDef *)(uint32_t)(0x60000000 | 0x00000000))->RAM

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

Сб дек 14, 2019 11:50:58

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

Добавлено after 10 minutes 28 seconds:
Вот если создать дополнительный файл с иницилизацией и настройкой контроллера дисплея, это канонично сделать и .h & .c или в одном .h работать не будет?

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

Сб дек 14, 2019 11:54:27

Вот если создать дополнительный файл с иницилизацией и настройкой контроллера дисплея, это канонично сделать и .h & .c или в одном .h работать не будет?
В .h делаешь объявление функций, а в .c определение. Соответственно .h инклудишь, а .c включаешь в проект. Вроде как эти вещи должны у любого программиста от зубов отлетать.

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

Сб дек 14, 2019 11:57:02

а .cpp он же без пары? Если в таком же сделать все это?

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

Сб дек 14, 2019 12:03:58

а .cpp он же без пары?
Ну какой такой "пары". Кто тебе запрещает делать сколько угодно *.c, *.cpp и *.h?

Если в таком же сделать все это?
Делать можно всё что не противозаконно :)

Только не трогай low_level_init. Это фактически часть стартапа (то же что и SystemInit() в других тулчейнах) и там надо себя вести аккуратно.
Последний раз редактировалось VladislavS Сб дек 14, 2019 12:08:17, всего редактировалось 1 раз.

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

Сб дек 14, 2019 12:06:08

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

Добавлено after 1 minute 8 seconds:
Дык я бы с удовольствием не городил бы два файла а сделал бы в одном .cpp, только как их связать чтобы можно было функции глобально использовать из него

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

Сб дек 14, 2019 12:44:47

Дык я бы с удовольствием не городил бы два файла а сделал бы в одном .cpp,
В общем случае, при классическом построении программы/проекта это невозможно. Да и зачем? Обратное, кстати, когда вся библиотека в .h - вполне обычное дело. Но ты к этому ещё не готов, лучше научись сначала всё по классике делать.

только как их связать чтобы можно было функции глобально использовать из него
Ну так .h для этого и есть.

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

Сб дек 14, 2019 12:55:56

Сделал по классике, заработало)

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

Сб дек 14, 2019 13:15:01

bevice писал(а):Но если так не нравится - Code::Block почти без настроек работает. Буквально вчера пробовал.
Тогда уж лучше EmBitz. Среда на основе Code::Block и оптимизирована под STM32.
При создании проекта автоматически в него добавляется CMSIS, а при необходимости и SPL.
Компилятор GCC входит в состав дистрибутива.

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

Сб дек 14, 2019 13:44:35

Мурик был бы не Мурик, если бы про "лучшие шпингалеты выпускается на фабрике №3 по адресу улица Цурюпа 15 телефон 9-18 факс 4-12 добавочный 03, самовывоз из Нижнего Тагила" не ввернул. :) Серьёзный продукт, даже по оффсайту виндно
СпойлерИзображение
Вложения
em.png
(53.25 KiB) Скачиваний: 240

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

Сб дек 14, 2019 13:50:05

bevice писал(а):Но если так не нравится - Code::Block почти без настроек работает. Буквально вчера пробовал.
Тогда уж лучше EmBitz. Среда на основе Code::Block и оптимизирована под STM32.
При создании проекта автоматически в него добавляется CMSIS, а при необходимости и SPL.
Компилятор GCC входит в состав дистрибутива.

У меня специфика работы такая, что есть программисты, которые прошивки пишут, и есть совсем другие люди, которые эти прошивки потом используют. Есть билд-сервера, которые эти прошивки с нужными параметрами собирают. Я остановился на 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

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

Сб дек 14, 2019 13:55:50

Дисплей работает 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 раз.

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

Сб дек 14, 2019 14:10:20

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

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

2ALL, применение тут __DSB() для меня необъяснимо. Нескольких процессоров нет, нескольких потоков тоже нет. Кроме тормозов ничего тут барьер не даёт.
Вот докладик про барьеры

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

Сб дек 14, 2019 15:10:08

2ALL, применение тут __DSB() для меня необъяснимо. Нескольких процессоров нет, нескольких потоков тоже нет. Кроме тормозов ничего тут барьер не даёт.
Вот докладик про барьеры

на форуме ST обсуждали этот вопрос, PM говорил что DSBшить надо в редких случаях, когда таблицу векторов переносят или память переалиасят, на форуме писали, что с FSMC ловили глюки без барьера

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

Сб дек 14, 2019 15:46:57

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;
Про "мэджик намберс" молчу, проверить я их не могу.

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

Сб дек 14, 2019 16:17:03

С тактовой да, там 16мГц, мне Bevice помогает ее поднять, даст Бог все пройдет)
А это я все поправляю, так глядишь и код уменьшится, спасибо

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

Сб дек 14, 2019 16:23:39

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

ЗЫ: покажи потом что получилось, будем оптимизировать.

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

Вс дек 15, 2019 07:19:25

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