Например TDA7294

Форум РадиоКот :: Просмотр темы - STM32F4+таймеры+захват
Форум РадиоКот
https://radiokot.ru/forum/

STM32F4+таймеры+захват
https://radiokot.ru/forum/viewtopic.php?f=59&t=128849
Страница 1 из 2

Автор:  TmYAG [ Чт мар 17, 2016 10:59:44 ]
Заголовок сообщения:  STM32F4+таймеры+захват

Всем привет!
Продолжаю мучить таймеры и форумчан=))
Перешел к изучению режима захвата.
В программе дрыгаю светодиодами с задержкой 5 сек.
попутно таймером TIM3 первый канал которого находится на PA6 пытаюсь захватить сигнал со светодиода, что живет на PD12. Просто замыкаю эти две ноги.
Код:
#include "stm32f4xx.h"                  // Device header

void init_gpio(void);
void init_timer(void);
void led_blinking(void);


static volatile uint32_t TimeTick;
volatile int capture1;
volatile int capture2;

void SysTick_Handler() {
   if(TimeTick)
   {
      TimeTick--;
   }
}

void TIM3_IRQHandler(){
   if(TIM3->SR&2){
   }
}


int main(){
   SysTick_Config(SystemCoreClock/1000);
   init_gpio();
   init_timer();
   while(1){
      led_blinking();
   }
   
}

void init_gpio(){
   /*Configure pins 12, 13, 14, 15 on port D*/
   RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
   GPIOD->MODER = 0x55000000;
   
   /*Cofigure TIM3, Channel 1 (PA6)*/
   RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
   GPIOA->MODER = GPIO_MODER_MODER6_0;
   GPIOA->AFR[0] = 0x02000000;
}

void init_timer(){
   RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
   TIM3->CCMR1 |= TIM_CCMR1_CC1S_0;                           // CH1 to PA6
  TIM3->CCMR1 |= (TIM_CCMR1_IC1F_0 | TIM_CCMR1_IC1F_1);            //
  TIM3->CCER &= ~TIM_CCER_CC1P;
  TIM3->CCER &= ~TIM_CCER_CC1NP;
  TIM3->CCMR1 &= ~TIM_CCMR1_IC1PSC;                           //
  TIM3->CCER |= TIM_CCER_CC1E;                              //
  TIM3->DIER |= TIM_DIER_CC1IE;                              //
  TIM3->CR1 |= TIM_CR1_CEN;                                 //
  NVIC_EnableIRQ(TIM3_IRQn);   
}


void DelaymS(uint32_t time){
   TimeTick = time;
    while(TimeTick);
}

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 сек.
Где я мог ошибиться?

Вложения:
L7_Genral_purpose_timer_Capture_input_LED_CMSIS.zip [776.55 KiB]
Скачиваний: 394

Автор:  TmYAG [ Пн мар 21, 2016 07:51:55 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Проблема была в том, что я неверно настроил пин на альтернативную функцию.
Код:
GPIOA->MODER = GPIO_MODER_MODER6_1;
должно быть
А вот насчет установки предделителя PSC и значения ARR не уверен, что обязательно устанавливать. У меня и так и так работает. То есть мк уходит в прерывание. Может кто объяснить надо ли для захвата их настраивать?

Далее решил разобраться а как же определить период сигнала.
По идее в обработчике прерывания необходимо (сбросить флаг само собой) записать в переменную значение TIM3->CCR1, а затем вычислить разницу между предыдущим и следующим значениями.
Код:
capture1 = capture2 = 0;
   capture2 = TIM3->CCR1;
   t = capture2 - capture1;

Верно?
Но почему-то t какая-то фигня пишется. HEX в DEC не забываю перевести.

Автор:  *BoyKot* [ Чт авг 03, 2017 14:09:34 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Как добиться от CubeMX установки в код прерываний по совпадению с каким-нибудь каналом, а не по переполнению счетчика?

Автор:  scorpi_0n [ Чт авг 03, 2017 15:47:44 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Нет там никакого "прерывания по переполнению" для таймеров общего назначения. Есть TIMх global interrupt, который для всего. И есть регистр разрешения определённых прерываний TIMх_DIER, и есть регистр состояния флагов TIMх_SR. Вот по флагам и определяется, что именно послужило причиной прерывания.
Да и смысла в этом "как в AVR" аж никакого.

Автор:  *BoyKot* [ Чт авг 03, 2017 15:51:45 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Нет там никакого "прерывания по переполнению" для таймеров общего назначения. Есть TIMх global interrupt, который для всего. И есть регистр разрешения определённых прерываний TIMх_DIER, и есть регистр состояния флагов TIMх_SR. Вот по флагам и определяется, что именно послужило причиной прерывания.
Да и смысла в этом "как в AVR" аж никакого.


Да, разобрался. Прерывания эти действительно есть в stm32. Целых 4 канала сравнения. Точнее прерывание одно, а дальше надо разбираться в его причинах по флагам. Все-таки в AVR были разные прерывания на разные регистры сравнения.

Автор:  pixar [ Чт авг 03, 2017 17:09:06 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

TIM1_BRK_UP_TRG_COM_IRQn
TIM1_CC_IRQn

Автор:  shalfey [ Сб ноя 13, 2021 17:05:10 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Вопрос по прерываниям.(STM32F4) Атолик, код заносится в ОЗУ, пишу в обработчик прерывания код для таймера TIM2.Получается что в дебагере, когда код в ОЗУ прерывания не работают. Написал просто через if проверкой бита UIF, всё работает.Как сделать чтобы штатные хендлеры работали при дебагере из ОЗУ. Почему из ОЗУ , да я стока раз перезагружаю боюсь,что камень не выдержит(хоть и обещают для F4 10000 перезагрузок). Дефайн раскоментировал ( #define VECT_TAB_SRAM).Разрешаю прерывания для TIM2 может не достаточно ,может нужно и глобальные разрешить.

Автор:  VladislavS [ Сб ноя 13, 2021 17:35:50 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Как сделать чтобы штатные хендлеры работали при дебагере из ОЗУ.
1. Проверить в map-файле по какому адресу слинкована таблица векторов прерывания.
2. Проверить чтобы SCB->VTOR указывал на неё.

Автор:  shalfey [ Сб ноя 13, 2021 17:52:30 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Ок буду смотреть

Автор:  shalfey [ Вс ноя 14, 2021 21:42:38 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Всё решено, мой косяк был.Прерывание работает и из ОЗУ.Скопировал код с экрана, не проверил :facepalm: .Входит в обработчик.

Автор:  shalfey [ Пн ноя 15, 2021 20:59:29 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Да... маловато знаний у меня. Работает , только если я явно вызываю обработчик в цикле while.

Добавлено after 7 hours 26 minutes 55 seconds:
Заработало , всё ок. А разобрался с помощью всеми забытого CooCoxa.Жаль что забросили его. Кстати компилит быстрее чем последний Атолик.

Автор:  shalfey [ Ср ноя 17, 2021 18:29:39 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Всё нормально входит в прерывания из ОЗУ, ничего не меняю 3-5 раз, потом стоп уже всё не входит. Это Толик. кидаю этот же проект в СооСох всё нормально 5-10 раз проганяю в дебагере, опять стоп уже не заходит в прерывания. Что могло бы быть. после 5-10 раз прогона, ничего не меняя уже прерывания им не нравятся. Что это ....

Добавлено after 1 hour 40 minutes 4 seconds:
Интересный эффект в СооСохе. Компилирую проект под флеш, потом под озу, тогда всё работает. Если только под озу не хочет в дебагере работать. Короче сначала собираю для флеш потом для озу.

Автор:  Reflector [ Ср ноя 17, 2021 18:39:21 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Интересный эффект в СооСохе. Компилирую проект под флеш, потом под озу, тогда всё работает. Если только под озу не хочет в дебагере работать. Короче сначала собираю для флеш потом для озу.

При старте из флеша грузитcя адрес SP, при выполнении из SRAM нужно его загрузить самостоятельно, так, например:
Код:
asm ("ldr sp, =_estack");

Иначе будет работать только если во флеше есть старая прошивка. Опять же Reset_Handler тоже берется из флеша и таблица векторов разбивается на две части, но это если основной код во флеше, а таблица векторов в RAM. Что у тебя там вообще не понятно, т.к. ни строчки кода предоставлено не было...

Автор:  shalfey [ Чт ноя 18, 2021 19:46:02 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Какой файл показать. Что там смотреть. Скрипт линкера наверно?А в main что там ...
В Атолике внизу скрипты линкера в CooCoxe я их не могу найти

Автор:  shalfey [ Сб ноя 20, 2021 17:01:14 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Вот main.c В прерывании просто мигают диоды по очереди. Вопрос, почему пока один раз во флеше на скомпилирую, то в озу не дебажится. Ставлю галочку дебаг во флеш собираю проект, потом ставлю галочку дебаг в RAM и всё дебаг идёт. В ST_link утилите память 0x08000000 это флеш , там чисто стоят FFFFFFFF Значит там нет таблицы прерываний. Вернее там нет вектора стека и вектора сброса.

Код:

   #include "stm32f4xx.h"
   #include "stm32f4xx_gpio.h"
   #include "stm32f4xx_rcc.h"
   #include "misc.h"
   #include "stm32f4xx_tim.h"

   void GPIO(void);
   void TIM_config(void);

   void NVIC_Config();

   void TIM3_IRQHandler(void);
   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;



   void TIM_config(void)
   {
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

   TIM_TimeBaseStructure.TIM_Prescaler=0x00FF;

   TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
   TIM_TimeBaseStructure.TIM_ClockDivision=0;
   TIM_TimeBaseStructure.TIM_Period=0xFF00;
     TIM_ITConfig( TIM3,  TIM_IT_CC1,ENABLE);

   TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

   TIM_Cmd(TIM3,ENABLE);
   }

   void GPIO(void)
   {
   GPIO_InitTypeDef GPIO_InitStructure;

   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);


   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
      GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
      GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
      GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
      GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
      GPIO_Init(GPIOD,&GPIO_InitStructure);
   }




      int main()
   {
       NVIC_Config();
       GPIO();
         TIM_config();
         
           while(1)
      {

      }
   }



      void NVIC_Config()

      {
      NVIC_InitTypeDef NVIC_InitStructure;
      NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);

      }
      void TIM3_IRQHandler(void)

      {
                   switch (TIM_GetCounter ( TIM3) )

                 {

                   case  10000:
                      GPIO_SetBits(GPIOD, GPIO_Pin_12);
                     break;
                   case 20000:

                      GPIO_SetBits(GPIOD, GPIO_Pin_14);
                      break;

                    case 30000:
                             GPIO_SetBits(GPIOD, GPIO_Pin_13);
                       break;

                    case 40000:
                                GPIO_SetBits(GPIOD, GPIO_Pin_15);
                     break;

                   case 50000:
                               GPIO_ResetBits(GPIOD,GPIO_Pin_12|GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15);


                           break;



                }

      }


Автор:  GARMIN [ Сб ноя 20, 2021 18:31:55 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Вы больше доверяйте халу. Он в ините изменяет адрес таблицы прерываний в никуда.
Поправка: Конечно же куб, а не хал. Столкнулся на прошлой неделе. У меня самописный стартап работает, а у товарища генерированный кубом нет.

Автор:  shalfey [ Сб ноя 20, 2021 19:34:19 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Извините меня чайника "халу" это кто. КУБ чтоли.

Автор:  shalfey [ Вс ноя 21, 2021 11:24:05 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

Меня просто интересует один эффект и всё. Почему в СооСохе нужно хотя бы раз поставить точку дебаг во флеше, а потом уже можно и из SRAM дебаг. Что не нравится дебагу если сразу во SRAM.

Автор:  shalfey [ Вт ноя 23, 2021 00:12:08 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

За перемещение таблицы прерываний отвечает линкер. Где в СооСохе он не могу найти. В Толике в проекте всё внизу валяется, в кокосе спрятали.
Вот нашёл, всё в озу таблица никак не делится на флеш и озу или я не прав?
Код:

Linker script and memory map

                0x20020000                _eram = 0x20020000

.text           0x20000000      0x758
 *(.isr_vector)
 .isr_vector    0x20000000      0x188 ..\obj\startup_stm32f4xx.o
                0x20000000                g_pfnVectors
 *(.text*)
 .text.Default_Reset_Handler
                0x20000188       0x6c ..\obj\startup_stm32f4xx.o
                0x20000188                Default_Reset_Handler
                0x20000188                Reset_Handler
 .text.Default_Handler





Добавлено after 25 minutes 30 seconds:
Вы больше доверяйте халу. Он в ините изменяет адрес таблицы прерываний в никуда.
Поправка: Конечно же куб, а не хал. Столкнулся на прошлой неделе. У меня самописный стартап работает, а у товарища генерированный кубом нет.

Я ваще люблю регистры, чего их так гнобят некоторые. Открыл мануал и всё лежит на ладони - простейше. Не пойму, тяжело цифру загнать в указатель.?

Добавлено after 1 hour 52 minutes 51 second:
TIM1_BRK_UP_TRG_COM_IRQn
TIM1_CC_IRQn

tim1 это не таймер общего назначения , прерывания для расширенного таймера. А ВОПРОС был по таймерам общего.

Добавлено after 7 hours 22 minutes 45 seconds:
В этой теме я сам с собой общаюсь, прикольно.Ничего stm я потихоньку "распилю", хай на это и потрачу кучу времени

Автор:  VladislavS [ Вт ноя 23, 2021 06:12:04 ]
Заголовок сообщения:  Re: STM32F4+таймеры+захват

1. Диалог подозревает, что вы хоть как-то реагируете на реплики собеседника.
2. Таймер сконфигурирован неправильно. Вероятно, вы не совсем понимаете как он работает.
3. В обработчике ерунда написана:
- Такой код возможен только если прерывание каждый инкремент счётчика таймера будет. Это невозможно.
- Включили вы прерывание по СС1 не сконфигурировав его.
- Флаги прерывания надо очищать при выходе.
- и т.д. и т.п.
4. Начните мигание диодами на SysTick. Он куда проще в работе. Для мигания диодами его примерно на 100 Гц настройте. В обработчике прерывания статический счётчик программный заведите и уже от него свитчём стройте свои алгоритмы мигания.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/