Форум РадиоКот 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 сек. Где я мог ошибиться?
|
Автор: | 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+таймеры+захват |
Всё решено, мой косяк был.Прерывание работает и из ОЗУ.Скопировал код с экрана, не проверил ![]() |
Автор: | 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/ |