[Решенные] прерывания в таймере не работают

Францискогимено
Ср 22 ноября 2017 г. 9:38
Привет, друзья могут кто -нибудь подать мне пример использования таймеров с Arduino IDE в основной доске.
Библиотека таймера1..Timer3, кажется, не работает на этой доске.

Я искал, но я не вижу ясного примера.

Приветствую и спасибо

Стивестронг
Ср 22 ноября 2017 г. 10:45
Вот оригинальная справочная документация Leaflabs: http: // docs.Leaflabs.com/static.Leaflab ... -мини.HTML
С правой стороны у вас есть модули (включая таймеры).

Францискогимено
Ср 22 ноября 2017 г. 11:01
Спасибо за ответ.

В этой сети ссылка на эти библиотеки у меня нет.

Моя доска - STMF303 - F303K8 и не используйте эти библиотеки

fpistm
Ср 22 ноября 2017 г. 13:27
Привет,
Я открываю дискуссию об управлении таймером здесь:
https: // github.com/stm32duino/arduino_c ... Проблемы/146

Францискогимено
Ср 22 ноября 2017 г. 16:07
Я использовал <Flexitimer2.час> и это дает мне ошибку при компиляции.

Не поддерживает этот микро.

Два других не компилируют.

Францискогимено
Чт 23 ноября 2017 г. 18:15
Кто -то знает, почему библиотеки не работают
Таймер1 ... 2 ...


Я попробовал этот пример, и он тоже не работает.


#define any_delay_rquired 0x0fff

Тим6->Sr = 0
Тим6->Arr = any_delay_rquired
Тим6->CR1 | = TIM_CR1_CEN
пока (!(TIM6->Старший & Tim_sr_uif)); / * Цикл до тех пор, пока флаг события обновления не будет установлен */
/ * Требуемая задержка времени была исчщена */
/ * Код пользователя может быть выполнен */

Компилировать без ошибок, но это не работает

fpistm
Чт 23 ноября 2017 г. 20:22
Может, CLK для этого таймера не включает.

__Hal_rcc_tim6_clk_enable
https: // github.com/stm32duino/arduino_c ... RCC.H#1797

Францискогимено
Пт 24 ноября 2017 г. 7:55 утра
Привет, этот пример, я взял его со листа ST AN4776

Чтобы использовать его, я включаю в проект #include <Таймер.час>.

Я попробую вашу возможность увидеть, работает ли это.

Францискогимено
Пт 24 ноября 2017 г. 13:11
Это все еще не работает .. Я схожу с ума от таймера : oops: : oops: : oops:

Францискогимено
Пт 24 ноября 2017 г. 13:18
Если я помесчу это:


Тим6-> Sr = 0;
Тим6-> Arr = 250;
Тим6-> CR1 | = Tim_cr1_cen;
пока (! (TIM6-> Старший & Tim_sr_uif));

точка а

Никогда не ходите в пункт А



RCC->Apb1enr | = rcc_apb1enr_tim6en; <-----------новая линия
Тим6->Sr = 0;
Тим6->Arr = 250;
Тим6->CR1 | = TIM_CR1_CEN;
пока (!(TIM6->Старший & Tim_sr_uif));

точка а

И с новой линией, которая говорит вам, что генератор внутренний,
сразу же, не делая никаких сроков

Дэнниф
Пт 24 ноября 2017 г. 13:24
У меня есть набор процедур таймеров для F3, но он построен на вершине SPL.

Взгляните на таблицу данных, и не так сложно выработать набор собственных процедур, с прямым доступом к регистрации.

Если у меня будет некоторое время, я могу написать сам сам.

Францискогимено
Пт 24 ноября 2017 г. 15:30
Я был бы признателен, мне просто нужен пример, и я продолжаю.
Странно то, что даже не работает код ST.

Дэнниф
Пт 24 ноября 2017 г. 22:13
Я на самом деле закончил просто использовать свой код F1.
tim3_init(100); //set prescaler to 100 tim3_setpr1(50000ul); //oc1 period to be 50000 ticks tim3_act1(led12_flp); //install user handler ei(); //enable global interrupts

Дэнниф
Пт 24 ноября 2017 г. 22:27
Кстати, этот подход (с использованием выходных каналов сравнения для времени) позволяет создавать 4 события времени на TIM2/3/4 (каждый из которых имеет 4 канала сравнения выхода) с разными периодами.

это можно расширить и на другие чипсы. Для получения дополнительной информации см. Здесь: https: // dannyelectronics.WordPress.ком/ ... ол

Основной код должен работать на других чипах STM32 с минимальной повторной конфигурацией: в основном для изменения тактового снабжения.

Францискогимено
Пн 27 ноября 2017 г. 8:43 утра
Привет, друг, спасибо большое спасибо за ваш код.

Мне удалось доказать это, но перерывы не вызывают запуска

Францискогимено
Вт 28 ноября 2017 г. 9:51 утра
В конце я решил это, поместив функцию
В Systick_handler, побуждение, так как есть много таймеров
без использования.

В прерывании таймера не работает.
Я пытался с таймером 6, 7, 1,3, и он не работает.

Например, базовый таймер 6 имеет правильное значение, но
Даже если вы установите активное прерывание, оно никогда не запускает его.

Также, если в любом таймере активно это: TIM6->DIER |= TIM_DIER_UIE;

Дэнниф
Вт 28 ноября 2017 г. 16:54
То, как вы написаны ISR, это трудно не повесить.

1. Прочитайте таблицу и посмотрите, что вам нужно там делать.

2. Переверните булавку в ISR, чтобы помочь вам понять, что происходит.

Францискогимено
Вт 28 ноября 2017 г., 18:32
Ну, я не знаю, хотя я смотрю на справочное руководство RM0316 RM0316
и режимы конфигурации:
AN4013 Примечание примечания STM32 Обзор таймера перекрестного сериала
AN4776 Примечание примечания общего назначения поваренная книга таймера таймера

Я не вижу вины.

: шок:

Францискогимено
Вт 28 ноября 2017 г., 19:06
Это также не запускает событие:


void tim6_init ()
{
RCC->Apb1enr | = rcc_apb1enr_tim6en; // включить часы TIM6
Тим6->PSC = 41999; // Установить Прескалер на 41999
Тим6->Arr = 5999; // установить автоматическую загрузку на 5999
Тим6->CR1 | = TIM_CR1_OPM; // один режим импульса
Тим6->Egr | = tim_egr_ug; // Обновление силы
Тим6->Старший &= ~ Tim_sr_uif; // очистить флаг обновления
Тим6->Dier | = tim_dier_uie; // включить прерывание события обновления
Nvic_enableirq (tim6_dac_irqn); // включить TIM6 IRQ
Тим6->CR1 | = TIM_CR1_CEN; // включить счетчик TIM6
}



void tim6_dac_irqhandler ()
{
if (tim6->Старший & TIM_SR_UIF != 0) // Если установлен флаг обновления
{
Тим6->Старший &= ~ Tim_sr_uif; // прерывание было обработано
Сериал.println ("прерывание");
}

}

Дэнниф
Вторник 28 ноября 2017 г. 11:52
Вы близки. Так что продолжайте работать над этим.

следующее:
IO_OUT(LED_PORT, LED12); //led as output tim6_init(100); tim6_setpr(10000); tim6_act(led12_flp); tim7_init(100); tim7_setpr(10000*1.01); tim7_act(led12_flp); ei(); //enable global interrupts

fpistm
Ср 29 ноября 2017 г. 8:26 утра
Какое ядро ​​вы использовали?

Обратите внимание, что, если IRQHandler определяется в файле CPP или в файле INO, вы должны объявить TIM6_DAC_IRQHandler как Extern "C"
extern "C" void TIM6_DAC_IRQHandler()

Францискогимено
Ср 29 ноября 2017 г. 10:58 утра
Код скомпилируется хорошо, и счетчик имеет значение в соответствии с планом.

Как в вашем примере, так и в предыдущем, опубликованном мной.

Проблема в том, что когда вы достигаете конца учетной записи, микро -микросхема блокируется и никогда не входит в
прерывание, как будто я собирался искать это прерывание, и я не найду его, и, конечно, это вешает трубку.

Это происходит с двумя примерами с вашим и моим

Любые предложения?

Францискогимено
Ср 29 ноября 2017 г. 11:18
Привет

Ядро: Nucleo STMF303 - F303K8

И эта линия, где я ее поместил, потому что я проверил начало программы:

extern "c" void tim6_dac_irqhandler ();

И я получаю ошибку.

основной.А (таймер.в.o)*: в функции tim6_dac1_irqhandler
таймер.C*: (.текст.TIM6_DAC1_IRQHandler+0x0): множественное определение TIM6_DAC1_IRQHandler

Дэнниф
Ср 29 ноября 2017 г. 11:55 утра
никогда не входит в
прерывание,
Вы не могли (и не могли) установить это. Если вы попытаетесь установить это, вы найдете проблему с вашим кодом.
Любые предложения? так же, как я дал тебе ранее.

Францискогимено
Ср 29 ноября 2017 г. 12:22
Извините, но я не понимаю, что вы имеете в виду.

fpistm
Ср 29 ноября 2017 г. 13:01
Ошибка нормальная с ARDUINO_CORE_STM32, поскольку функция TIM6_DAC1_IRQHandler уже определена в ядре.

Как уже говорилось, я должен пересмотреть управление таймером, выпуск открылся для отслеживания этого обзора:
https: // github.com/stm32duino/arduino_c ... Проблемы/146

Вы выпускаете связан с этим PR:
https: // github.com/stm32duino/arduino_c ... 2/тяга/150
Ядро уже определило Timx_irqhandler, пока он не должен.

В частности, эта линия:
https: // github.com/stm32duino/arduino_c ... 54128R1119
WEAK void TIM6_IRQHandler(void)

Францискогимено
Ср 29 ноября 2017 г. 13:49
Хорошо. Хорошо, это уже работает наконец : D : D : D : D : D
Большое спасибо всем.

Суммировано для того, что случается со мной и не сходит с ума ... :рулон: :рулон:

Измените таймер.c Файл
Все эти пустоты Тим.... Для этих слабых пустот Тим...... и сохранить.


Когда прерывание определяется таким образом:

Внешний "C" {
void tim6_dac_irqhandler ()
{
код прерывания
}
}

И сейчас :ржу не могу: :ржу не могу: :ржу не могу: :ржу не могу: :ржу не могу:

Я чуть не умер в этом.

Спасибо, спасибо, спасибо всем.

STM32L476RG