fix(main.c): исправлены приоритеты прерывания и часы

This commit is contained in:
2025-12-24 23:23:35 +03:00
parent 82b5280567
commit 2f0527a3d8

View File

@@ -4,31 +4,42 @@
#include "tusb.h" #include "tusb.h"
void SystemClock_Config(void) { void SystemClock_Config(void) {
// 1. Включаем HSE (внешний кварц 8 МГц)
RCC->CR |= RCC_CR_HSEON; RCC->CR |= RCC_CR_HSEON;
while (!(RCC->CR & RCC_CR_HSERDY)); 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) // 3. Настраиваем PLL:
RCC->CFGR &= ~RCC_CFGR_USBPRE; // <-- ДОБАВЛЕНО! // Множитель x6: 8 МГц * 6 = 48 МГц
RCC->CFGR |= (RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL9); 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; RCC->CR |= RCC_CR_PLLON;
while (!(RCC->CR & RCC_CR_PLLRDY)); while (!(RCC->CR & RCC_CR_PLLRDY));
// 6. Переключаем системную частоту на PLL
RCC->CFGR &= ~RCC_CFGR_SW;
RCC->CFGR |= RCC_CFGR_SW_PLL; RCC->CFGR |= RCC_CFGR_SW_PLL;
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_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 usb_device_task(void *param) {
(void)param; (void)param;
while (1) { while (1) { tud_task(); }
tud_task();
// Без задержки! tud_task() должен вызываться как можно чаще
}
} }
// Задача CDC // Задача CDC
@@ -43,7 +54,7 @@ void cdc_task(void *param) {
tud_cdc_write_flush(); 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->APB2ENR |= RCC_APB2ENR_IOPAEN;
RCC->APB1ENR |= RCC_APB1ENR_USBEN; 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_HP_CAN1_TX_IRQn);
NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn); NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
NVIC_EnableIRQ(USBWakeUp_IRQn); NVIC_EnableIRQ(USBWakeUp_IRQn);
tusb_init(); tusb_init();
// УВЕЛИЧИЛИ стек до 256!
xTaskCreate( xTaskCreate(
usb_device_task, usb_device_task,
"usbd", "usbd",