Форум РадиоКот • Просмотр темы - STM32+RTOS проблема с работой таймеров в прерываниях
Сообщения без ответов | Активные темы
Страница 2 из 2
[ Сообщений: 22 ]
,
Автор
Сообщение
The_Blind_WatchMaker
Заголовок сообщения: 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: Цитата:
Если не работает, то либо счётчик не тикает, либо читается не тот счётчик.
Эти два варианта, я так понимаю, вы уже проверили?
Счётчик таки странно работает. Возможно у Вас есть мысли по этому поводу?
_________________ _____ Поделиться рецептом можно в ЛС
Вернуться наверх
Реклама
a797945
Заголовок сообщения: 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 (в верхнем)
Вернуться наверх
Реклама
Страница 2 из 2
[ Сообщений: 22 ]
,
Кто сейчас на форуме
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения