[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 раз.
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755558#p3755558"]Я полазил по англоязычным сайтам и нашел несколько регистровых настроек FSMC, одна из них подошла, FFFFFFFFF мне тоже не понравились([/uquote]Да прекращай ты копипастить всякую дурь. Ну есть же RM. Неужели так трудно сесть, внимательно прочитать и заполнить правильными параметрами два-три регистра FSMC?[/uquote]
Я не поленился все регистры выписать, перевести, почитать, вникнуть. Но они мягко говоря не однозначные, рассчитаны на людей хорошо знающих архитектуру FSMC, а надо заметить в интернете про FSMC информации либо вообще нет либо я им не умею пользоваться. Я и книжечки на озоне искал и статейки гуглил, а в ответ тишина. Одни статьи как кубом дисплей прикрутить
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755568#p3755568"]Но они мягко говоря не однозначные, рассчитаны на людей хорошо знающих архитектуру FSMC,[/uquote]Ну так на то и форум, спрашивай какие параметры непонятны. Думаешь не расскажут?
Ну просто когда я вижу вот такое, то о качестве остального кода у меня складывается определённое негативное впечатление.
Это я собирал по библиотекам HAL, в надежде упростить потом
Добавлено after 10 minutes 28 seconds:
Вот если создать дополнительный файл с иницилизацией и настройкой контроллера дисплея, это канонично сделать и .h & .c или в одном .h работать не будет?
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755573#p3755573"]Вот если создать дополнительный файл с иницилизацией и настройкой контроллера дисплея, это канонично сделать и .h & .c или в одном .h работать не будет?[/uquote]В .h делаешь объявление функций, а в .c определение. Соответственно .h инклудишь, а .c включаешь в проект. Вроде как эти вещи должны у любого программиста от зубов отлетать.
[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 раз.
Да, low_level_init мне очень понравился, он выполняется даже раньше чем плей нажимаешь в иар
Добавлено after 1 minute 8 seconds:
Дык я бы с удовольствием не городил бы два файла а сделал бы в одном .cpp, только как их связать чтобы можно было функции глобально использовать из него
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755586#p3755586"]Дык я бы с удовольствием не городил бы два файла а сделал бы в одном .cpp,[/uquote]В общем случае, при классическом построении программы/проекта это невозможно. Да и зачем? Обратное, кстати, когда вся библиотека в .h - вполне обычное дело. Но ты к этому ещё не готов, лучше научись сначала всё по классике делать.
[uquote="TEPEM",url="/forum/viewtopic.php?p=3755586#p3755586"]только как их связать чтобы можно было функции глобально использовать из него[/uquote]Ну так .h для этого и есть.
bevice писал(а):Но если так не нравится - Code::Block почти без настроек работает. Буквально вчера пробовал.
Тогда уж лучше EmBitz. Среда на основе Code::Block и оптимизирована под STM32.
При создании проекта автоматически в него добавляется CMSIS, а при необходимости и SPL.
Компилятор GCC входит в состав дистрибутива.
Мурик был бы не Мурик, если бы про "лучшие шпингалеты выпускается на фабрике №3 по адресу улица Цурюпа 15 телефон 9-18 факс 4-12 добавочный 03, самовывоз из Нижнего Тагила" не ввернул. Серьёзный продукт, даже по оффсайту виндно
Спойлер
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 слишком много проблем из-за подписи драйверов. Это тоже накладывает свой отпечаток.
(для stm32F103C8) при этом в шаблоне уже есть CMSIS/LL/HAL в виде подключаемых библиотек, есть конфигурационные файлы для OpenOCD, все настроено и готово к использованию в Clion. Для остальных еще нужно сделать что-то вроде
Ну и как я говорил, есть возможность собирать через docker-сборщик, так же одной командой без установок любых IDE, или без докера, но тогда придется иметь arm-none-eabi-gcc+make+cmake
Дисплей работает 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);
Господа, что-то вас не в ту степь несёт! Проблема ТС вовсе не в выборе IDE. У него есть рабочая IDE, которой он худо бедно получает результат. Зачем вы энтропию повышаете? Зачем ему для своего хобби строить билд-систему корпорации?
Добавлено after 12 minutes 59 seconds: TEPEM, __enable_irq () не по месту применена - это штука глобальная. Её лучше в main() после всех инициализаций применять. Да и вообще, не нужна она, так как в Cortex-M прерывания по умолчанию разрешены. Можешь попробовать убрать - ничего не изменится.
2ALL, применение тут __DSB() для меня необъяснимо. Нескольких процессоров нет, нескольких потоков тоже нет. Кроме тормозов ничего тут барьер не даёт.
Вот докладик про барьеры
[uquote="VladislavS",url="/forum/viewtopic.php?p=3755709#p3755709"]2ALL, применение тут __DSB() для меня необъяснимо. Нескольких процессоров нет, нескольких потоков тоже нет. Кроме тормозов ничего тут барьер не даёт.
Вот докладик про барьеры
[/uquote]
на форуме ST обсуждали этот вопрос, PM говорил что DSBшить надо в редких случаях, когда таблицу векторов переносят или память переалиасят, на форуме писали, что с FSMC ловили глюки без барьера