Например TDA7294

Форум РадиоКот • Просмотр темы - STM32+RTOS проблема с работой таймеров в прерываниях
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Чт апр 18, 2024 14:51:05

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 22 ]    , 2

Аффтар выпей йаду!
Пей! 100%  100%  [ 3 ]
Остынь. 0%  0%  [ 0 ]
Всего голосов : 3
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: STM32+RTOS проблема с работой таймеров в прерываниях
СообщениеДобавлено: Ср мар 29, 2023 12:14:30 
Родился
Аватар пользователя

Зарегистрирован: Вт ноя 29, 2022 12:17:58
Сообщений: 14
Откуда: Деревенский
Рейтинг сообщения: 0
Ни какого результата.
Крутится бесконечно в цикле если в нём нет "f++"
Не считает
СпойлерИзображение

Спойлер
Код:
          HAL_TIM_PeriodElapsedCallback:
08000830:   push    {r7, lr}
08000832:   sub     sp, #16
08000834:   add     r7, sp, #0
08000836:   str     r0, [r7, #4]
289          uint32_t i = 0, f = 0;
08000838:   movs    r3, #0
0800083a:   str     r3, [r7, #12]
0800083c:   movs    r3, #0
0800083e:   str     r3, [r7, #8]
290          if (htim->Instance == TIM4)
08000840:   ldr     r3, [r7, #4]
08000842:   ldr     r3, [r3, #0]
08000844:   ldr     r2, [pc, #108]  ; (0x80008b4 <HAL_TIM_PeriodElapsedCallback+132>)
08000846:   cmp     r3, r2
08000848:   beq.n   0x8000898 <HAL_TIM_PeriodElapsedCallback+104>
293          else if (htim->Instance == TIM1)
0800084a:   ldr     r3, [r7, #4]
0800084c:   ldr     r3, [r3, #0]
0800084e:   ldr     r2, [pc, #104]  ; (0x80008b8 <HAL_TIM_PeriodElapsedCallback+136>)
08000850:   cmp     r3, r2
08000852:   bne.n   0x8000898 <HAL_TIM_PeriodElapsedCallback+104>
295                HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_5);
08000854:   movs    r1, #32
08000856:   ldr     r0, [pc, #100]  ; (0x80008bc <HAL_TIM_PeriodElapsedCallback+140>)
08000858:   bl      0x800115a <HAL_GPIO_TogglePin>
297                __HAL_TIM_SET_COUNTER(&htim4, 0);
0800085c:   ldr     r3, [pc, #96]   ; (0x80008c0 <HAL_TIM_PeriodElapsedCallback+144>)
0800085e:   ldr     r3, [r3, #0]
08000860:   movs    r2, #0
08000862:   str     r2, [r3, #36]   ; 0x24
300                while(((__HAL_TIM_GET_COUNTER(htim) < 8) && (f < 20) ))  //
08000864:   b.n     0x8000888 <HAL_TIM_PeriodElapsedCallback+88>
307                   if(htim->Instance->CNT != last)
08000866:   ldr     r3, [r7, #4]
08000868:   ldr     r3, [r3, #0]
0800086a:   ldr     r2, [r3, #36]   ; 0x24
0800086c:   ldr     r3, [pc, #84]   ; (0x80008c4 <HAL_TIM_PeriodElapsedCallback+148>)
0800086e:   ldr     r3, [r3, #0]
08000870:   cmp     r2, r3
08000872:   beq.n   0x8000888 <HAL_TIM_PeriodElapsedCallback+88>
309                      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
08000874:   mov.w   r1, #512        ; 0x200
08000878:   ldr     r0, [pc, #64]   ; (0x80008bc <HAL_TIM_PeriodElapsedCallback+140>)
0800087a:   bl      0x800115a <HAL_GPIO_TogglePin>
310                      last = htim->Instance->CNT;
0800087e:   ldr     r3, [r7, #4]
08000880:   ldr     r3, [r3, #0]
08000882:   ldr     r3, [r3, #36]   ; 0x24
08000884:   ldr     r2, [pc, #60]   ; (0x80008c4 <HAL_TIM_PeriodElapsedCallback+148>)
08000886:   str     r3, [r2, #0]
300                while(((__HAL_TIM_GET_COUNTER(htim) < 8) && (f < 20) ))  //
08000888:   ldr     r3, [r7, #4]
0800088a:   ldr     r3, [r3, #0]
0800088c:   ldr     r3, [r3, #36]   ; 0x24
0800088e:   cmp     r3, #7
08000890:   bhi.n   0x8000898 <HAL_TIM_PeriodElapsedCallback+104>
08000892:   ldr     r3, [r7, #8]
08000894:   cmp     r3, #19
08000896:   bls.n   0x8000866 <HAL_TIM_PeriodElapsedCallback+54>
316          i = 5;
08000898:   movs    r3, #5
0800089a:   str     r3, [r7, #12]
317          f = 0;
0800089c:   movs    r3, #0
0800089e:   str     r3, [r7, #8]
318           HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5|GPIO_PIN_9, GPIO_PIN_RESET);
080008a0:   movs    r2, #0
080008a2:   mov.w   r1, #544        ; 0x220
080008a6:   ldr     r0, [pc, #20]   ; (0x80008bc <HAL_TIM_PeriodElapsedCallback+140>)
080008a8:   bl      0x8001128 <HAL_GPIO_WritePin>
319       }


Считает если есть "f++"
СпойлерИзображение

Спойлер
Код:
          HAL_TIM_PeriodElapsedCallback:
08000830:   push    {r7, lr}
08000832:   sub     sp, #16
08000834:   add     r7, sp, #0
08000836:   str     r0, [r7, #4]
289          uint32_t i = 0, f = 0;
08000838:   movs    r3, #0
0800083a:   str     r3, [r7, #12]
0800083c:   movs    r3, #0
0800083e:   str     r3, [r7, #8]
290          if (htim->Instance == TIM4)
08000840:   ldr     r3, [r7, #4]
08000842:   ldr     r3, [r3, #0]
08000844:   ldr     r2, [pc, #120]  ; (0x80008c0 <HAL_TIM_PeriodElapsedCallback+144>)
08000846:   cmp     r3, r2
08000848:   beq.n   0x80008a4 <HAL_TIM_PeriodElapsedCallback+116>
293          else if (htim->Instance == TIM1)
0800084a:   ldr     r3, [r7, #4]
0800084c:   ldr     r3, [r3, #0]
0800084e:   ldr     r2, [pc, #116]  ; (0x80008c4 <HAL_TIM_PeriodElapsedCallback+148>)
08000850:   cmp     r3, r2
08000852:   bne.n   0x80008a4 <HAL_TIM_PeriodElapsedCallback+116>
295                HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_5);
08000854:   movs    r1, #32
08000856:   ldr     r0, [pc, #112]  ; (0x80008c8 <HAL_TIM_PeriodElapsedCallback+152>)
08000858:   bl      0x8001166 <HAL_GPIO_TogglePin>
297                __HAL_TIM_SET_COUNTER(&htim4, 0);
0800085c:   ldr     r3, [pc, #108]  ; (0x80008cc <HAL_TIM_PeriodElapsedCallback+156>)
0800085e:   ldr     r3, [r3, #0]
08000860:   movs    r2, #0
08000862:   str     r2, [r3, #36]   ; 0x24
300                while(((__HAL_TIM_GET_COUNTER(htim) < 8) && (f < 20) ))  //
08000864:   b.n     0x8000894 <HAL_TIM_PeriodElapsedCallback+100>
305                   f++;
08000866:   ldr     r3, [r7, #8]
08000868:   adds    r3, #1
0800086a:   str     r3, [r7, #8]
306                   i++;
0800086c:   ldr     r3, [r7, #12]
0800086e:   adds    r3, #1
08000870:   str     r3, [r7, #12]
307                   if(htim->Instance->CNT != last)
08000872:   ldr     r3, [r7, #4]
08000874:   ldr     r3, [r3, #0]
08000876:   ldr     r2, [r3, #36]   ; 0x24
08000878:   ldr     r3, [pc, #84]   ; (0x80008d0 <HAL_TIM_PeriodElapsedCallback+160>)
0800087a:   ldr     r3, [r3, #0]
0800087c:   cmp     r2, r3
0800087e:   beq.n   0x8000894 <HAL_TIM_PeriodElapsedCallback+100>
309                      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
08000880:   mov.w   r1, #512        ; 0x200
08000884:   ldr     r0, [pc, #64]   ; (0x80008c8 <HAL_TIM_PeriodElapsedCallback+152>)
08000886:   bl      0x8001166 <HAL_GPIO_TogglePin>
310                      last = htim->Instance->CNT;
0800088a:   ldr     r3, [r7, #4]
0800088c:   ldr     r3, [r3, #0]
0800088e:   ldr     r3, [r3, #36]   ; 0x24
08000890:   ldr     r2, [pc, #60]   ; (0x80008d0 <HAL_TIM_PeriodElapsedCallback+160>)
08000892:   str     r3, [r2, #0]
300                while(((__HAL_TIM_GET_COUNTER(htim) < 8) && (f < 20) ))  //
08000894:   ldr     r3, [r7, #4]
08000896:   ldr     r3, [r3, #0]
08000898:   ldr     r3, [r3, #36]   ; 0x24
0800089a:   cmp     r3, #7
0800089c:   bhi.n   0x80008a4 <HAL_TIM_PeriodElapsedCallback+116>
0800089e:   ldr     r3, [r7, #8]
080008a0:   cmp     r3, #19
080008a2:   bls.n   0x8000866 <HAL_TIM_PeriodElapsedCallback+54>
316          i = 5;
080008a4:   movs    r3, #5
080008a6:   str     r3, [r7, #12]
317          f = 0;
080008a8:   movs    r3, #0
080008aa:   str     r3, [r7, #8]
318           HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5|GPIO_PIN_9, GPIO_PIN_RESET);
080008ac:   movs    r2, #0
080008ae:   mov.w   r1, #544        ; 0x220
080008b2:   ldr     r0, [pc, #20]   ; (0x80008c8 <HAL_TIM_PeriodElapsedCallback+152>)
080008b4:   bl      0x8001134 <HAL_GPIO_WritePin>
319       }

Туториала толкового по Ассемблеру не нашел, но из того, что я понял причины счётчику не работать выявить не могу...

Добавлено after 4 minutes 13 seconds:
Цитата:
Если не работает, то либо счётчик не тикает, либо читается не тот счётчик.

Эти два варианта, я так понимаю, вы уже проверили?

Счётчик таки странно работает. Возможно у Вас есть мысли по этому поводу?

_________________
_____
Поделиться рецептом можно в ЛС


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32+RTOS проблема с работой таймеров в прерываниях
СообщениеДобавлено: Ср мар 29, 2023 16:14:41 
Мучитель микросхем

Карма: 4
Рейтинг сообщений: 80
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Сообщений: 445
Откуда: 69.Ржев
Рейтинг сообщения: 0
где то, должен сбрасываться флаг вызвавший прерывание
"TIM1->SR = ~TIM_SR_UIF;" - в начале обработчика.

попробуйте дать last не =0 - кувырнется ли нога

по листингам отличий не приметил, кроме f++,i++,
и проверка f<20 присутствует, хоть f всегда =0 (в верхнем)


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 22 ]    , 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y