STM32+RTOS проблема с работой таймеров в прерываниях

Кто любит RISC в жизни, заходим, не стесняемся.

Аффтар выпей йаду!

Пей!
3
100%
Остынь.
0
Голосов нет
 
Всего голосов: 3

Аватара пользователя
The_Blind_WatchMaker
Родился
Сообщения: 14
Зарегистрирован: Вт ноя 29, 2022 12:17:58
Откуда: Деревенский

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение The_Blind_WatchMaker »

Ни какого результата.
Крутится бесконечно в цикле если в нём нет "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:
[uquote="VladislavS",url="/forum/viewtopic.php?p=4392509#p4392509"]
Если не работает, то либо счётчик не тикает, либо читается не тот счётчик.
Эти два варианта, я так понимаю, вы уже проверили?[/uquote]
Счётчик таки странно работает. Возможно у Вас есть мысли по этому поводу?
____________________________
Поделиться рецептом можно в ЛС
Реклама
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение a797945 »

где то, должен сбрасываться флаг вызвавший прерывание
"TIM1->SR = ~TIM_SR_UIF;" - в начале обработчика.

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

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

Вернуться в «ARM»