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

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

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

Сообщение VladislavS »

[uquote="TEPEM",url="/forum/viewtopic.php?p=3752882#p3752882"]Там регистры в FSMC в адовом количестве[/uquote]Если их поделить на количество nCSx, то фиг да не фига остаётся. Меньше чем в GPIO.

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

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

Сообщение TEPEM »

[del]

Добавлено after 20 minutes 13 seconds:
stm32412g_discovery.c
hsram.Instance = FSMC_NORSRAM_DEVICE;
hsram.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
В районе 827 линии.
Кто то знает что передают эти строчки гоняя по кругу регистры?
Это ужас какой то, все перепробовал что только можно. Уже что только не записывал. С ними работает, без них нет, и если без первой просто тупит, то без второй черный экран. Весь интернет перерыл, уже даже по иностранным статейкам пробежал.
Экстендед по дефайнам меняет три состояния, много где участвует, но как я понял везде как донор и не подвергается перезаписи. Чудеса
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Результатом работы всей этой "магии" со структурами является запись регистров FSMC. Если у тебя появилась рабочая конфигурация, то остановись в ней отладчиком, посмотри содержимое регистров и в коде их запиши нужными значениями. После чего выкинь инициализацию через структуры.
Аватара пользователя
bevice
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб июн 06, 2009 11:13:56
Контактная информация:

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

Сообщение bevice »

[uquote="TEPEM",url="/forum/viewtopic.php?p=3751881#p3751881"]Либо стандартный пример из куба отчистить от ереси, я уже почти сделал это но застрял жестко. У меня пока с подвижки только в виде проекта с таймером, настроенными ногами на FSMC, и шим на подсветку. Что бы Вы посоветовали?[/uquote]
Очистить от ереси стандартный пример в кубе. Он хоть и может быть косячный, но работает. В чем затык с очисткой вышел? Я когда шаблоны под cmake перепиливал справлялся за полчаса с новым камнем

Добавлено after 47 minutes 52 seconds:
Народ, зачем вы мучаетесь с extern "c"?
сделайте в заголовке макрос

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

#ifdef __cplusplus
#define SAFECALL extern "C"
#else
#define SAFECALL 
#endif

после он сам будет разворачиваться когда нужно:

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

SAFECALL void SysTick_Handler(){...}
После нас - хоть потоп (с) Лойсо
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Мучаемся, ночами не спим. Ну и богатая же у тебя фантазия :) У меня у всех обработчиков прерываний нужен extern "С". Куда как проще написать эти 9 мучительных букв, чем подключать какой-то заголовочный файл и писать не пойми что скрывающие в себе 8 букв SAFECALL.
Реклама
Аватара пользователя
bevice
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб июн 06, 2009 11:13:56
Контактная информация:

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

Сообщение bevice »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3753845#p3753845"]Мучаемся, ночами не спим. Ну и богатая же у тебя фантазия :) У меня у всех обработчиков прерываний нужен extern "С". Куда как проще написать эти 9 мучительных букв, чем подключать какой-то заголовочный файл и писать не пойми что скрывающие в себе 8 букв SAFECALL.[/uquote]
#define С SAFECALL
и пишете одну букву. экономия. Но я вас понял, если для всех и всегда - тогда не проще ли поправить уже таблицу векторов и не писать лишнего?
После нас - хоть потоп (с) Лойсо
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Имена векторов прерываний определил производитель чипа, они фигурируют в его документации и библиотеках. В большинстве IDE при создании проекта стартап будет на C или ASM. Зачем я буду его переписывать? Ради вашей extern "С" фобии? Да сношайся оно конём :) По сравнению с template <typename... T> static constexpr inline auto Foo(T... t){} да ещё с какими-нибудь атрибутами, extern "С" так безобидно выглядит.
Аватара пользователя
bevice
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб июн 06, 2009 11:13:56
Контактная информация:

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

Сообщение bevice »

Вы пишете на плюсах, при этом вектор лежит в ассемблерном файле и использует символы C. И это не кажется извращением, да?
Ну так напишите таблицу векторов на плюсах, там и наследоваться на прерываниях можно будет и еще что-нить приятное придумать можно, позднее связывание хотя бы.
и какие библиотеки без спроса у вас используют прерывания и зачем? Хотя не отвечайте, это уже совсем офтоп. Если вам удобно тыкать палочкой в процессор, кто я такой чтобы лишать этого удовольствия.
После нас - хоть потоп (с) Лойсо
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="bevice",url="/forum/viewtopic.php?p=3753998#p3753998"]Вы пишете на плюсах, при этом вектор лежит в ассемблерном файле и использует символы C. И это не кажется извращением, да?[/uquote]Не вижу в этом никакой проблемы. Могу даже тупо взять стартап поставляемый производителем и не париться.

[uquote="bevice",url="/forum/viewtopic.php?p=3753998#p3753998"]Ну так напишите таблицу векторов на плюсах,[/uquote]Не говорите мне что делать и я не скажу куда вам идти.

[uquote="bevice",url="/forum/viewtopic.php?p=3753998#p3753998"]там и наследоваться на прерываниях можно будет и еще что-нить приятное придумать можно, позднее связывание хотя бы.[/uquote]Позднее связывание на векторах прерывания? Можно я просто пальцем у виска покручу?
Аватара пользователя
bevice
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб июн 06, 2009 11:13:56
Контактная информация:

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

Сообщение bevice »

Позднее связывание на векторах прерывания? Можно я просто пальцем у виска покручу?
Покрутите, если сможете объяснить, что в этом плохого.
После нас - хоть потоп (с) Лойсо
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Объясню, если сможете показать, как это сделать.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3754154#p3754154"]Объясню, если сможете показать, как это сделать.[/uquote]
Перенести таблицу векторов в RAM?

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

Timer2 tim2;
tim2.init(0, 36'000'000 - 1);
tim2.setCallback([] { tim2.clearInterruptFlags(); redLed.toggle(); });
tim2.enableInterrupts<TimInt::Update>();
tim2.enable();
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

И руками её заполнить? Ну вот оно и первое почему это "хорошо".
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3754183#p3754183"]И руками её заполнить? Ну вот оно и первое почему это "хорошо".[/uquote]
Все заполнять не нужно, только реально используемое. На самом деле подход довольно распространенный, даже в каком-то порте ардуино для ARM такое видел.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Если взять какой-нибудь ARM926, где адреса обработчиков прерываний надо при инициализации в VIC записывать, то это ещё как-то вяжется. Но у Cortex-M всё сделано для упрощения. Зачем же на ровном месте усложнять?
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3754199#p3754199"]Зачем же на ровном месте усложнять?[/uquote]
Ситуации разные бывают, кому-то может просто нравится, что можно на ходу менять обработчики, а кто-то так делает ради повышения производительности и большей предсказуемости. Например, если взять F4 с 5WS, то он сначала полезет в таблицу векторов, что сбрасывает кеш и заставляет ждать лишние 5 тактов, потом то же самое происходит второй раз когда из таблицы получен адрес и выполняется переход на сам обработчик прерывания. Если используется callback, то придется дополнительно читать адрес из переменной и переходить по нему в третий раз. Итого потери могут составить 5+5+5 тактов и что еще хуже, она может быть меньше, т.к. не известно какие данные накешировал ART, может у него все необходимое есть и ждать чтения из флеша не нужно... А если таблица в RAM, то ART не задействуется, если еще и сама функция в RAM, то после чтения адреса из таблицы векторов прыгаем сразу на нее с детерминированной и относительно небольшой задержкой.
Но основная причина думаю все-же в простоте использования, вызвал usart.init() и он автоматически подключил обработчик прерывания...
jcxz
Мудрый кот
Сообщения: 1731
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="Reflector",url="/forum/viewtopic.php?p=3754230#p3754230"]Но основная причина думаю все-же в простоте использования, вызвал usart.init() и он автоматически подключил обработчик прерывания...[/uquote]Некая "простота использования" против "безопасности использования" с таблицей векторов во флешь? Сомнительный выигрыш....
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="jcxz",url="/forum/viewtopic.php?p=3754234#p3754234"]Некая "простота использования" против "безопасности использования" с таблицей векторов во флешь? Сомнительный выигрыш....[/uquote]
Смотря что подразумевать под "безопасностью использования"... Если usart.init(...) сам прописывает обработчик прерывания, сам определяет текущую частоту, в него нельзя передать неправильные пины, а AF тоже определяется автоматически, то такая функция с определенной точки зрения будет максимально безопасной, т.к. оставляет минимальную возможность сделать что-то не так. Конечно на АЭС такое устройство лучше не ставить, да и в лифт тоже, но на любительском уровне это и не нужно.
jcxz
Мудрый кот
Сообщения: 1731
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="Reflector",url="/forum/viewtopic.php?p=3754243#p3754243"]Смотря что подразумевать под "безопасностью использования"... Если usart.init(...) сам прописывает обработчик прерывания, сам определяет текущую частоту, в него нельзя передать неправильные пины, а AF тоже определяется автоматически, то такая функция с определенной точки зрения будет максимально безопасной, т.к. оставляет минимальную возможность сделать что-то не так.[/uquote]Безопасным можно считать код, находящийся во flash, которая не может быть стёрта случайной записью из-за сбоя. И такой код (даже если он не во флешь) должен быть защищён посредством MPU от таких записей.
Если, как Вы предлагаете, что-то записывать в вектора по ходу работы программы, то значит на таблицу векторов нельзя поставить защиту от записи через MPU - значит любая ошибочная запись в таблицу прерываний сразу приведёт к краху программы, причём даже с невозможностью диагностирования причины краха.

Да и зачем оно нужно? Прописывать обработчик прерывания в вектор. Как часто вам приходится писать программы, где обработчики прерывания меняются в процессе выполнения программы? Да ещё к тому-же обработчики настолько критичные ко времени выполнения, что не позволяют на старте ISR сделать простое ветвление с выбором нужной процедуры ISR?
Аватара пользователя
bevice
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб июн 06, 2009 11:13:56
Контактная информация:

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

Сообщение bevice »

[uquote="jcxz",url="/forum/viewtopic.php?p=3754262#p3754262"]Безопасным можно считать код, находящийся во flash, которая не может быть стёрта случайной записью из-за сбоя. И такой код (даже если он не во флешь) должен быть защищён посредством MPU от таких записей.
Если, как Вы предлагаете, что-то записывать в вектора по ходу работы программы, то значит на таблицу векторов нельзя поставить защиту от записи через MPU - значит любая ошибочная запись в таблицу прерываний сразу приведёт к краху программы, причём даже с невозможностью диагностирования причины краха.[/uquote]

Поместить адрес статичного метода в флешку тоже никаких проблем не вызовет. Память SRAM сама по себе не портится, а если случилось страшное и она поломалась - не важно, что там было вектора прерываний или просто ваши переменные - в подавляющем большинстве случаев дорога в hard_fault. Так что никакой безопасности код во флеше не несет.
Невозможность диагностирования - тоже дудки, стек все равно останется на месте.

[uquote="jcxz",url="/forum/viewtopic.php?p=3754262#p3754262"]Да и зачем оно нужно? Прописывать обработчик прерывания в вектор. Как часто вам приходится писать программы, где обработчики прерывания меняются в процессе выполнения программы? Да ещё к тому-же обработчики настолько критичные ко времени выполнения, что не позволяют на старте ISR сделать простое ветвление с выбором нужной процедуры ISR?[/uquote]
Можно спросить более развернуто: зачем вообще нужно программировать на плюсах? Любую иерархию классов можно разрулить ветвлением. Более того, все это можно сделать на ассемблере, причем работать скорее всего будет быстрее. Но удобства они такие, могут даже заставить шаблонами пользоваться
После нас - хоть потоп (с) Лойсо
Ответить

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