Форум РадиоКот • Просмотр темы - Таймер не работает
Сообщения без ответов | Активные темы
Страница 7 из 12
[ Сообщений: 237 ]
... , , , , , , ...
Автор
Сообщение
VladislavS
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 11:25:58
Собутыльник Кота
Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47Сообщений: 2557
Рейтинг сообщения: 0
Есть же способ обратится к функциям находящимся в 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 раз.
Вернуться наверх
Реклама
TEPEM
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 11:26:32
Нашел транзистор. Понюхал.
Зарегистрирован: Чт дек 05, 2019 16:28:11Сообщений: 152Откуда: Самара
Рейтинг сообщения: 0
Я полазил по англоязычным сайтам и нашел несколько регистровых настроек FSMC, одна из них подошла, FFFFFFFFF мне тоже не понравились(
Да прекращай ты копипастить всякую дурь. Ну есть же RM. Неужели так трудно сесть, внимательно прочитать и заполнить правильными параметрами два-три регистра FSMC?[/uquote]
Я не поленился все регистры выписать, перевести, почитать, вникнуть. Но они мягко говоря не однозначные, рассчитаны на людей хорошо знающих архитектуру FSMC, а надо заметить в интернете про FSMC информации либо вообще нет либо я им не умею пользоваться. Я и книжечки на озоне искал и статейки гуглил, а в ответ тишина. Одни статьи как кубом дисплей прикрутить
Вернуться наверх
Реклама
VladislavS
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 11:30:54
Собутыльник Кота
Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47Сообщений: 2557
Рейтинг сообщения: 0
Но они мягко говоря не однозначные, рассчитаны на людей хорошо знающих архитектуру FSMC,
Ну так на то и форум, спрашивай какие параметры непонятны. Думаешь не расскажут?
Ну просто когда я вижу вот такое, то о качестве остального кода у меня складывается определённое негативное впечатление.
Код:
((LCTDef *)(uint32_t)(0x60000000 | 0x00000000))->RAM
Вернуться наверх
TEPEM
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 11:50:58
Нашел транзистор. Понюхал.
Зарегистрирован: Чт дек 05, 2019 16:28:11Сообщений: 152Откуда: Самара
Рейтинг сообщения: 0
Это я собирал по библиотекам HAL, в надежде упростить потомДобавлено after 10 minutes 28 seconds: Вот если создать дополнительный файл с иницилизацией и настройкой контроллера дисплея, это канонично сделать и .h & .c или в одном .h работать не будет?
Вернуться наверх
Реклама
VladislavS
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 11:54:27
Собутыльник Кота
Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47Сообщений: 2557
Рейтинг сообщения: 0
Вот если создать дополнительный файл с иницилизацией и настройкой контроллера дисплея, это канонично сделать и .h & .c или в одном .h работать не будет?
В .h делаешь объявление функций, а в .c определение. Соответственно .h инклудишь, а .c включаешь в проект. Вроде как эти вещи должны у любого программиста от зубов отлетать.
Вернуться наверх
Реклама
TEPEM
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 11:57:02
Нашел транзистор. Понюхал.
Зарегистрирован: Чт дек 05, 2019 16:28:11Сообщений: 152Откуда: Самара
Рейтинг сообщения: 0
а .cpp он же без пары? Если в таком же сделать все это?
Вернуться наверх
Реклама
VladislavS
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 12:03:58
Собутыльник Кота
Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47Сообщений: 2557
Рейтинг сообщения: 0
а .cpp он же без пары?
Ну какой такой "пары". Кто тебе запрещает делать сколько угодно *.c, *.cpp и *.h?
Если в таком же сделать все это?
Делать можно всё что не противозаконно
Только не трогай low_level_init. Это фактически часть стартапа (то же что и SystemInit() в других тулчейнах) и там надо себя вести аккуратно.
Последний раз редактировалось VladislavS Сб дек 14, 2019 12:08:17, всего редактировалось 1 раз.
Вернуться наверх
TEPEM
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 12:06:08
Нашел транзистор. Понюхал.
Зарегистрирован: Чт дек 05, 2019 16:28:11Сообщений: 152Откуда: Самара
Рейтинг сообщения: 0
Да, low_level_init мне очень понравился, он выполняется даже раньше чем плей нажимаешь в иарДобавлено after 1 minute 8 seconds: Дык я бы с удовольствием не городил бы два файла а сделал бы в одном .cpp, только как их связать чтобы можно было функции глобально использовать из него
Вернуться наверх
VladislavS
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 12:44:47
Собутыльник Кота
Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47Сообщений: 2557
Рейтинг сообщения: 0
Дык я бы с удовольствием не городил бы два файла а сделал бы в одном .cpp,
В общем случае, при классическом построении программы/проекта это невозможно. Да и зачем? Обратное, кстати, когда вся библиотека в .h - вполне обычное дело. Но ты к этому ещё не готов, лучше научись сначала всё по классике делать.
только как их связать чтобы можно было функции глобально использовать из него
Ну так .h для этого и есть.
Вернуться наверх
Реклама
TEPEM
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 12:55:56
Нашел транзистор. Понюхал.
Зарегистрирован: Чт дек 05, 2019 16:28:11Сообщений: 152Откуда: Самара
Рейтинг сообщения: 0
Сделал по классике, заработало)
Вернуться наверх
Мурик
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 13:15:01
Друг Кота
Карма: 1
Рейтинг сообщений: 179
Зарегистрирован: Пн окт 11, 2010 19:00:08Сообщений: 3382
Рейтинг сообщения: 0
bevice писал(а):
Но если так не нравится - Code::Block почти без настроек работает. Буквально вчера пробовал.
Тогда уж лучше EmBitz. Среда на основе Code::Block и оптимизирована под STM32.
При создании проекта автоматически в него добавляется CMSIS, а при необходимости и SPL.
Компилятор GCC входит в состав дистрибутива.
Вернуться наверх
VladislavS
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 13:44:35
Собутыльник Кота
Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47Сообщений: 2557
Рейтинг сообщения: 3
Мурик был бы не Мурик, если бы про "лучшие шпингалеты выпускается на фабрике №3 по адресу улица Цурюпа 15 телефон 9-18 факс 4-12 добавочный 03, самовывоз из Нижнего Тагила" не ввернул.
Серьёзный продукт, даже по оффсайту виндно
Спойлер
Вложения:
em.png [53.25 KiB]
Скачиваний: 284
Вернуться наверх
bevice
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 13:50:05
Открыл глаза
Зарегистрирован: Сб июн 06, 2009 11:13:56Сообщений: 54
Рейтинг сообщения: 0
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
_________________ После нас - хоть потоп (с) Лойсо
Вернуться наверх
TEPEM
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 13:55:50
Нашел транзистор. Понюхал.
Зарегистрирован: Чт дек 05, 2019 16:28:11Сообщений: 152Откуда: Самара
Рейтинг сообщения: 0
Дисплей работает 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
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 14:10:20
Собутыльник Кота
Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47Сообщений: 2557
Рейтинг сообщения: 1
Господа, что-то вас не в ту степь несёт! Проблема ТС вовсе не в выборе IDE. У него есть рабочая IDE, которой он худо бедно получает результат. Зачем вы энтропию повышаете? Зачем ему для своего хобби строить билд-систему корпорации?Добавлено after 12 minutes 59 seconds: TEPEM , __enable_irq () не по месту применена - это штука глобальная. Её лучше в main() после всех инициализаций применять. Да и вообще, не нужна она, так как в Cortex-M прерывания по умолчанию разрешены. Можешь попробовать убрать - ничего не изменится.2ALL , применение тут __DSB() для меня необъяснимо. Нескольких процессоров нет, нескольких потоков тоже нет. Кроме тормозов ничего тут барьер не даёт. Вот докладик про барьерыVIDEO
Вернуться наверх
bevice
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 15:10:08
Открыл глаза
Зарегистрирован: Сб июн 06, 2009 11:13:56Сообщений: 54
Рейтинг сообщения: 0
2ALL , применение тут __DSB() для меня необъяснимо. Нескольких процессоров нет, нескольких потоков тоже нет. Кроме тормозов ничего тут барьер не даёт. Вот докладик про барьерыVIDEO
на форуме ST обсуждали этот вопрос, PM говорил что DSBшить надо в редких случаях, когда таблицу векторов переносят или память переалиасят, на форуме писали, что с FSMC ловили глюки без барьера
_________________ После нас - хоть потоп (с) Лойсо
Вернуться наверх
VladislavS
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 15:46:57
Собутыльник Кота
Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47Сообщений: 2557
Рейтинг сообщения: 0
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
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 16:17:03
Нашел транзистор. Понюхал.
Зарегистрирован: Чт дек 05, 2019 16:28:11Сообщений: 152Откуда: Самара
Рейтинг сообщения: 0
С тактовой да, там 16мГц, мне Bevice помогает ее поднять, даст Бог все пройдет) А это я все поправляю, так глядишь и код уменьшится, спасибо
Вернуться наверх
VladislavS
Заголовок сообщения: Re: Таймер не работает
Добавлено: Сб дек 14, 2019 16:23:39
Собутыльник Кота
Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47Сообщений: 2557
Рейтинг сообщения: 0
Ну дерзайте, не забудь латентность flash выставить ПЕРЕД поднятием частоты. ЗЫ: покажи потом что получилось, будем оптимизировать.
Вернуться наверх
TEPEM
Заголовок сообщения: Re: Таймер не работает
Добавлено: Вс дек 15, 2019 07:19:25
Нашел транзистор. Понюхал.
Зарегистрирован: Чт дек 05, 2019 16:28:11Сообщений: 152Откуда: Самара
Рейтинг сообщения: 0
Получилось вот так на данный момент)
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 } #endifdisp
Спойлер #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 это лис из вк конвертированный в массив
Спойлер
Вернуться наверх
Страница 7 из 12
[ Сообщений: 237 ]
... , , , , , , ...
Кто сейчас на форуме
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения