Files
sound-analyze/firmware/App/Src/main.c

132 lines
3.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "FreeRTOS.h"
#include "stm32f1xx.h"
#include "task.h"
#include "tusb.h"
void SystemClock_Config(void) {
// 1. Включаем HSE (внешний кварц 8 МГц)
RCC->CR |= RCC_CR_HSEON;
while (!(RCC->CR & RCC_CR_HSERDY));
// 2. Настраиваем Flash: 1 цикл ожидания (достаточно для 48 МГц)
FLASH->ACR = FLASH_ACR_LATENCY_1;
// 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 = 48000000;
}
// Задача USB
void usb_device_task(void *param) {
(void)param;
while (1) { tud_task(); }
}
// Задача CDC
void cdc_task(void *param) {
(void)param;
while (1) {
if (tud_cdc_connected()) {
if (tud_cdc_available()) {
uint8_t buf[64];
uint32_t count = tud_cdc_read(buf, sizeof(buf));
tud_cdc_write(buf, count);
tud_cdc_write_flush();
}
}
vTaskDelay(pdMS_TO_TICKS(10));
}
}
// Задача LED (отдельно!)
void led_task(void *param) {
(void)param;
while (1) {
GPIOC->BSRR = GPIO_BSRR_BR13; // LED ON
vTaskDelay(pdMS_TO_TICKS(500));
GPIOC->BSRR = GPIO_BSRR_BS13; // LED OFF
vTaskDelay(pdMS_TO_TICKS(500));
}
}
void force_usb_reset(void) {
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
GPIOA->CRH &= ~GPIO_CRH_CNF12;
GPIOA->CRH |= GPIO_CRH_MODE12_1;
GPIOA->BSRR = GPIO_BSRR_BR12;
for (volatile int i = 0; i < 500000; i++) __NOP();
GPIOA->CRH &= ~GPIO_CRH_MODE12;
GPIOA->CRH |= GPIO_CRH_CNF12_0;
}
int main(void) {
SystemClock_Config();
// Настройка LED
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
GPIOC->CRH &= ~GPIO_CRH_CNF13;
GPIOC->CRH |= GPIO_CRH_MODE13_1;
force_usb_reset();
// Включаем USB
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
RCC->APB1ENR |= RCC_APB1ENR_USBEN;
// Устанавливаем приоритет 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();
xTaskCreate(
usb_device_task,
"usbd",
256,
NULL,
configMAX_PRIORITIES - 1,
NULL);
xTaskCreate(cdc_task, "cdc", 256, NULL, configMAX_PRIORITIES - 2, NULL);
xTaskCreate(led_task, "led", 128, NULL, 1, NULL);
vTaskStartScheduler();
while (1);
}
void USB_HP_CAN1_TX_IRQHandler(void) {
tud_int_handler(0);
}
void USB_LP_CAN1_RX0_IRQHandler(void) {
tud_int_handler(0);
}
void USBWakeUp_IRQHandler(void) {
tud_int_handler(0);
}