From 962333bfece8a50edeaa98589adba3d75b4a72af Mon Sep 17 00:00:00 2001 From: DashyFox Date: Sat, 7 Sep 2024 00:09:34 +0300 Subject: [PATCH] todo --- Core/Src/main.c | 2 +- Core/Src/stm32f1xx_it.c | 36 +++++++++------- StackSport Release.launch | 81 +++++++++++++++++++++++++++++++++++ TODO.md | 90 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 192 insertions(+), 17 deletions(-) create mode 100644 StackSport Release.launch diff --git a/Core/Src/main.c b/Core/Src/main.c index a646a1d..7e98394 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -148,10 +148,10 @@ int main(void) MX_GPIO_Init(); MX_I2C1_Init(); MX_USB_DEVICE_Init(); + MX_USART3_UART_Init(); MX_TIM1_Init(); MX_TIM2_Init(); MX_TIM3_Init(); - MX_USART3_UART_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); //PA8 diff --git a/Core/Src/stm32f1xx_it.c b/Core/Src/stm32f1xx_it.c index 2813254..1c9966e 100644 --- a/Core/Src/stm32f1xx_it.c +++ b/Core/Src/stm32f1xx_it.c @@ -451,6 +451,10 @@ void SysTick_Handler(void) TIM2->CCR3 = Vupr2; } +// TIM2->CCR4 = 0xffff; +// TIM2->CCR3 = 0xffff; +// TIM2->CCR1 = 0xffff; +// TIM2->CCR2 = 0xffff; // ������ ���������� �������� � ����� ��� �� if (vi < 600) @@ -494,22 +498,22 @@ void SysTick_Handler(void) void EXTI0_IRQHandler(void) { /* USER CODE BEGIN EXTI0_IRQn 0 */ - if (avto == 1) - { - if (rejim_number < rejim[0]) - rejim_number++; - else - rejim_number = 1; - - SetServo(0, rejim[1 + (rejim_number - 1) * 6]); - SetServo(1, rejim[2 + (rejim_number - 1) * 6]); - SetServo(2, rejim[3 + (rejim_number - 1) * 6]); - Vz1 = rejim[4 + (rejim_number - 1) * 6]; - Vz2 = rejim[5 + (rejim_number - 1) * 6]; - TIM1->CCR1 = 0; - TIM1->CCR2 = (uint16_t)(40 * rejim[6 + (rejim_number - 1) * 6]); - vi = 0; // zapis grafika start - } +// if (avto == 1) +// { +// if (rejim_number < rejim[0]) +// rejim_number++; +// else +// rejim_number = 1; +// +// SetServo(0, rejim[1 + (rejim_number - 1) * 6]); +// SetServo(1, rejim[2 + (rejim_number - 1) * 6]); +// SetServo(2, rejim[3 + (rejim_number - 1) * 6]); +// Vz1 = rejim[4 + (rejim_number - 1) * 6]; +// Vz2 = rejim[5 + (rejim_number - 1) * 6]; +// TIM1->CCR1 = 0; +// TIM1->CCR2 = (uint16_t)(40 * rejim[6 + (rejim_number - 1) * 6]); +// vi = 0; // zapis grafika start +// } /* USER CODE END EXTI0_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(BALL_EXT_Pin); /* USER CODE BEGIN EXTI0_IRQn 1 */ diff --git a/StackSport Release.launch b/StackSport Release.launch new file mode 100644 index 0000000..990e8bc --- /dev/null +++ b/StackSport Release.launch @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TODO.md b/TODO.md index b93c019..a3709f9 100644 --- a/TODO.md +++ b/TODO.md @@ -39,4 +39,94 @@ IR: +uint32_t GetTimerClockFrequency(TIM_TypeDef *TIMx) { + uint32_t clock_frequency = 0; + uint32_t sysclk_frequency = 0; + uint32_t hclk_frequency = 0; + uint32_t apb1_frequency = 0; + uint32_t apb2_frequency = 0; + + // Определяем источник системного тактирования (SYSCLK) + switch (RCC->CFGR & RCC_CFGR_SWS) { + case RCC_CFGR_SWS_HSI: // HSI используется как системный клок + sysclk_frequency = 8000000; // HSI - 8 MHz + break; + case RCC_CFGR_SWS_HSE: // HSE используется как системный клок + sysclk_frequency = HSE_VALUE; // Предположим, что значение HSE_VALUE определено + break; + case RCC_CFGR_SWS_PLL: // PLL используется как системный клок + // Получаем значение входного тактового сигнала PLL + if ((RCC->CFGR & RCC_CFGR_PLLSRC) == RCC_CFGR_PLLSRC_HSI_DIV2) { + sysclk_frequency = 4000000; // HSI/2 - 4 MHz + } else { + sysclk_frequency = HSE_VALUE; // HSE_VALUE определено как 8 или 16 MHz + } + + // Получаем множитель PLL + uint32_t pll_mul = ((RCC->CFGR & RCC_CFGR_PLLMULL) >> 18) + 2; + sysclk_frequency *= pll_mul; + break; + default: + sysclk_frequency = 8000000; // По умолчанию HSI + break; + } + + // Определяем частоту шины AHB (HCLK) + uint32_t ahb_prescaler = (RCC->CFGR & RCC_CFGR_HPRE) >> 4; + if (ahb_prescaler < 8) { + hclk_frequency = sysclk_frequency; + } else { + hclk_frequency = sysclk_frequency >> ((ahb_prescaler - 7)); + } + + // Определяем частоту шины APB1 + uint32_t apb1_prescaler = (RCC->CFGR & RCC_CFGR_PPRE1) >> 8; + if (apb1_prescaler < 4) { + apb1_frequency = hclk_frequency; + } else { + apb1_frequency = hclk_frequency >> ((apb1_prescaler - 3)); + } + + // Определяем частоту шины APB2 + uint32_t apb2_prescaler = (RCC->CFGR & RCC_CFGR_PPRE2) >> 11; + if (apb2_prescaler < 4) { + apb2_frequency = hclk_frequency; + } else { + apb2_frequency = hclk_frequency >> ((apb2_prescaler - 3)); + } + + // Определяем частоту для конкретного таймера + if (TIMx == TIM1 || TIMx == TIM8) { // Таймеры на шине APB2 + clock_frequency = (apb2_prescaler == 0 ? apb2_frequency : apb2_frequency * 2); + } else { // Таймеры на шине APB1 + clock_frequency = (apb1_prescaler == 0 ? apb1_frequency : apb1_frequency * 2); + } + + return clock_frequency; +} + +// Функция для вычисления целевого значения +uint32_t CalculateTargetCount(TIM_TypeDef *TIMx, uint32_t freq) { + // Проверяем, что частота не равна нулю + if (freq == 0) return 0xFFFFFFFF; // Защита от деления на ноль + + // Получаем частоту тактового генератора для данного таймера + uint32_t clock_frequency = GetTimerClockFrequency(TIMx); + + // Получаем значение предделителя (PSC) и ARR таймера + uint32_t psc = TIMx->PSC; + uint32_t arr = TIMx->ARR; + + // Вычисляем частоту работы таймера + uint32_t timer_frequency = clock_frequency / ((psc + 1) * (arr + 1)); + + // Вычисляем целевое значение счетчика для заданной частоты + uint32_t target_count = timer_frequency / freq; + + return target_count; +} + + + + \ No newline at end of file