From 2f0527a3d8eb46ef54d84bd7b4c693067848949f Mon Sep 17 00:00:00 2001 From: Iwwww Date: Wed, 24 Dec 2025 23:23:35 +0300 Subject: [PATCH] =?UTF-8?q?fix(main.c):=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=B8=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D1=82=D1=8B=20=D0=BF=D1=80=D0=B5=D1=80=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B8=20=D1=87=D0=B0=D1=81?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- firmware/App/Src/main.c | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/firmware/App/Src/main.c b/firmware/App/Src/main.c index 56c94ba..1d59769 100644 --- a/firmware/App/Src/main.c +++ b/firmware/App/Src/main.c @@ -4,31 +4,42 @@ #include "tusb.h" void SystemClock_Config(void) { + // 1. Включаем HSE (внешний кварц 8 МГц) RCC->CR |= RCC_CR_HSEON; while (!(RCC->CR & RCC_CR_HSERDY)); - FLASH->ACR |= FLASH_ACR_LATENCY_2; + // 2. Настраиваем Flash: 1 цикл ожидания (достаточно для 48 МГц) + FLASH->ACR = FLASH_ACR_LATENCY_1; - // ЯВНО обнуляем бит USBPRE (div 1.5 для получения 48MHz USB) - RCC->CFGR &= ~RCC_CFGR_USBPRE; // <-- ДОБАВЛЕНО! - RCC->CFGR |= (RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL9); + // 3. Настраиваем PLL: + // Множитель x6: 8 МГц * 6 = 48 МГц + RCC->CFGR &= ~RCC_CFGR_PLLMULL; // Сброс битов множителя + RCC->CFGR |= RCC_CFGR_PLLMULL6; + // Источник PLL = HSE + RCC->CFGR |= RCC_CFGR_PLLSRC; + + // 4. Настраиваем USB делитель: + // USBPRE = 1 (делитель /1). Т.е. 48 МГц / 1 = 48 МГц + RCC->CFGR |= RCC_CFGR_USBPRE; + + // 5. Включаем PLL RCC->CR |= RCC_CR_PLLON; while (!(RCC->CR & RCC_CR_PLLRDY)); + // 6. Переключаем системную частоту на PLL + RCC->CFGR &= ~RCC_CFGR_SW; RCC->CFGR |= RCC_CFGR_SW_PLL; while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL); - SystemCoreClock = 72000000; + // Обновляем глобальную переменную частоты + SystemCoreClock = 48000000; } -// Задача USB (ТОЛЬКО tud_task, ничего больше!) +// Задача USB void usb_device_task(void *param) { (void)param; - while (1) { - tud_task(); - // Без задержки! tud_task() должен вызываться как можно чаще - } + while (1) { tud_task(); } } // Задача CDC @@ -43,7 +54,7 @@ void cdc_task(void *param) { tud_cdc_write_flush(); } } - vTaskDelay(pdMS_TO_TICKS(10)); // 10мс достаточно + vTaskDelay(pdMS_TO_TICKS(10)); } } @@ -82,14 +93,17 @@ int main(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; RCC->APB1ENR |= RCC_APB1ENR_USBEN; - // Прерывания USB + // Устанавливаем приоритет USB прерываний больше 5, больше FreeRTOS + NVIC_SetPriority(USB_HP_CAN1_TX_IRQn, 6); + NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 6); + NVIC_SetPriority(USBWakeUp_IRQn, 6); + NVIC_EnableIRQ(USB_HP_CAN1_TX_IRQn); NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn); NVIC_EnableIRQ(USBWakeUp_IRQn); tusb_init(); - // УВЕЛИЧИЛИ стек до 256! xTaskCreate( usb_device_task, "usbd",