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