fix(main.c): исправлены приоритеты прерывания и часы
This commit is contained in:
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user