Всем привет! Продолжаю мучить таймеры и форумчан=)) Перешел к изучению режима захвата. В программе дрыгаю светодиодами с задержкой 5 сек. попутно таймером TIM3 первый канал которого находится на PA6 пытаюсь захватить сигнал со светодиода, что живет на PD12. Просто замыкаю эти две ноги.
void led_blinking(){ GPIOD->BSRRH = GPIO_BSRR_BS_12 | GPIO_BSRR_BS_13 | GPIO_BSRR_BS_14 | GPIO_BSRR_BS_15; //LEDs On DelaymS(5000);//Delay using SysTick GPIOD->BSRRL = GPIO_BSRR_BS_12 | GPIO_BSRR_BS_13 | GPIO_BSRR_BS_14 | GPIO_BSRR_BS_15; //LEDs Off DelaymS(5000); }
Настроил порт Д и диоды. Настроил порт А и для шестой ноги определил альтернативную функцию. Настроил таймер в режиме захвата, захват по фронту. Но почему-то не заходит в прерывание. Период изменения сигнала для светодиодов 5 сек. Где я мог ошибиться?
Проблема была в том, что я неверно настроил пин на альтернативную функцию.
Код:
GPIOA->MODER = GPIO_MODER_MODER6_1;
должно быть А вот насчет установки предделителя PSC и значения ARR не уверен, что обязательно устанавливать. У меня и так и так работает. То есть мк уходит в прерывание. Может кто объяснить надо ли для захвата их настраивать?
Далее решил разобраться а как же определить период сигнала. По идее в обработчике прерывания необходимо (сбросить флаг само собой) записать в переменную значение TIM3->CCR1, а затем вычислить разницу между предыдущим и следующим значениями.
Нет там никакого "прерывания по переполнению" для таймеров общего назначения. Есть TIMх global interrupt, который для всего. И есть регистр разрешения определённых прерываний TIMх_DIER, и есть регистр состояния флагов TIMх_SR. Вот по флагам и определяется, что именно послужило причиной прерывания. Да и смысла в этом "как в AVR" аж никакого.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Нет там никакого "прерывания по переполнению" для таймеров общего назначения. Есть TIMх global interrupt, который для всего. И есть регистр разрешения определённых прерываний TIMх_DIER, и есть регистр состояния флагов TIMх_SR. Вот по флагам и определяется, что именно послужило причиной прерывания. Да и смысла в этом "как в AVR" аж никакого.
Да, разобрался. Прерывания эти действительно есть в stm32. Целых 4 канала сравнения. Точнее прерывание одно, а дальше надо разбираться в его причинах по флагам. Все-таки в AVR были разные прерывания на разные регистры сравнения.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Вопрос по прерываниям.(STM32F4) Атолик, код заносится в ОЗУ, пишу в обработчик прерывания код для таймера TIM2.Получается что в дебагере, когда код в ОЗУ прерывания не работают. Написал просто через if проверкой бита UIF, всё работает.Как сделать чтобы штатные хендлеры работали при дебагере из ОЗУ. Почему из ОЗУ , да я стока раз перезагружаю боюсь,что камень не выдержит(хоть и обещают для F4 10000 перезагрузок). Дефайн раскоментировал ( #define VECT_TAB_SRAM).Разрешаю прерывания для TIM2 может не достаточно ,может нужно и глобальные разрешить.
Да... маловато знаний у меня. Работает , только если я явно вызываю обработчик в цикле while.
Добавлено after 7 hours 26 minutes 55 seconds: Заработало , всё ок. А разобрался с помощью всеми забытого CooCoxa.Жаль что забросили его. Кстати компилит быстрее чем последний Атолик.
Всё нормально входит в прерывания из ОЗУ, ничего не меняю 3-5 раз, потом стоп уже всё не входит. Это Толик. кидаю этот же проект в СооСох всё нормально 5-10 раз проганяю в дебагере, опять стоп уже не заходит в прерывания. Что могло бы быть. после 5-10 раз прогона, ничего не меняя уже прерывания им не нравятся. Что это ....
Добавлено after 1 hour 40 minutes 4 seconds: Интересный эффект в СооСохе. Компилирую проект под флеш, потом под озу, тогда всё работает. Если только под озу не хочет в дебагере работать. Короче сначала собираю для флеш потом для озу.
Интересный эффект в СооСохе. Компилирую проект под флеш, потом под озу, тогда всё работает. Если только под озу не хочет в дебагере работать. Короче сначала собираю для флеш потом для озу.
При старте из флеша грузитcя адрес SP, при выполнении из SRAM нужно его загрузить самостоятельно, так, например:
Код:
asm ("ldr sp, =_estack");
Иначе будет работать только если во флеше есть старая прошивка. Опять же Reset_Handler тоже берется из флеша и таблица векторов разбивается на две части, но это если основной код во флеше, а таблица векторов в RAM. Что у тебя там вообще не понятно, т.к. ни строчки кода предоставлено не было...
Вот main.c В прерывании просто мигают диоды по очереди. Вопрос, почему пока один раз во флеше на скомпилирую, то в озу не дебажится. Ставлю галочку дебаг во флеш собираю проект, потом ставлю галочку дебаг в RAM и всё дебаг идёт. В ST_link утилите память 0x08000000 это флеш , там чисто стоят FFFFFFFF Значит там нет таблицы прерываний. Вернее там нет вектора стека и вектора сброса.
Карма: 16
Рейтинг сообщений: 166
Зарегистрирован: Вс дек 02, 2012 16:58:33 Сообщений: 826 Откуда: Уже не город Белых гор
Рейтинг сообщения:0
Вы больше доверяйте халу. Он в ините изменяет адрес таблицы прерываний в никуда. Поправка: Конечно же куб, а не хал. Столкнулся на прошлой неделе. У меня самописный стартап работает, а у товарища генерированный кубом нет.
Последний раз редактировалось GARMIN Вс ноя 21, 2021 18:26:24, всего редактировалось 1 раз.
Меня просто интересует один эффект и всё. Почему в СооСохе нужно хотя бы раз поставить точку дебаг во флеше, а потом уже можно и из SRAM дебаг. Что не нравится дебагу если сразу во SRAM.
За перемещение таблицы прерываний отвечает линкер. Где в СооСохе он не могу найти. В Толике в проекте всё внизу валяется, в кокосе спрятали. Вот нашёл, всё в озу таблица никак не делится на флеш и озу или я не прав?
Вы больше доверяйте халу. Он в ините изменяет адрес таблицы прерываний в никуда. Поправка: Конечно же куб, а не хал. Столкнулся на прошлой неделе. У меня самописный стартап работает, а у товарища генерированный кубом нет.
Я ваще люблю регистры, чего их так гнобят некоторые. Открыл мануал и всё лежит на ладони - простейше. Не пойму, тяжело цифру загнать в указатель.?
tim1 это не таймер общего назначения , прерывания для расширенного таймера. А ВОПРОС был по таймерам общего.
Добавлено after 7 hours 22 minutes 45 seconds: В этой теме я сам с собой общаюсь, прикольно.Ничего stm я потихоньку "распилю", хай на это и потрачу кучу времени
1. Диалог подозревает, что вы хоть как-то реагируете на реплики собеседника. 2. Таймер сконфигурирован неправильно. Вероятно, вы не совсем понимаете как он работает. 3. В обработчике ерунда написана: - Такой код возможен только если прерывание каждый инкремент счётчика таймера будет. Это невозможно. - Включили вы прерывание по СС1 не сконфигурировав его. - Флаги прерывания надо очищать при выходе. - и т.д. и т.п. 4. Начните мигание диодами на SysTick. Он куда проще в работе. Для мигания диодами его примерно на 100 Гц настройте. В обработчике прерывания статический счётчик программный заведите и уже от него свитчём стройте свои алгоритмы мигания.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения