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",