Implement working (if useless) USB on F411

This commit is contained in:
Hierophect 2019-07-24 16:23:35 -04:00
parent 21f1ae51df
commit 981398406c
6 changed files with 41 additions and 40 deletions

@ -1 +1 @@
Subproject commit 0848c462b3e431a9da42e96537d2b597a4579636 Subproject commit 97e2629d647584681b2883f2081fa2cddb3d61cc

View File

@ -28,36 +28,34 @@
void stm32f4_peripherals_clocks_init(void) { void stm32f4_peripherals_clocks_init(void) {
//System clock init //System clock init
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
/** Configure the main internal regulator output voltage /* Enable Power Control clock */
*/ __HAL_RCC_PWR_CLK_ENABLE();
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /* The voltage scaling allows optimizing the power consumption when the device is
/** Initializes the CPU, AHB and APB busses clocks clocked below the maximum system frequency, to update the voltage scaling value
*/ regarding system frequency refer to product datasheet. */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; /* Enable HSE Oscillator and activate PLL with HSE as source */
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.PLL.PLLM = 4; RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLN = 192; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLQ = 8; RCC_OscInitStruct.PLL.PLLM = 8;
HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_OscInitStruct.PLL.PLLN = 336;
/** Initializes the CPU, AHB and APB busses clocks RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
*/ RCC_OscInitStruct.PLL.PLLQ = 7;
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK HAL_RCC_OscConfig(&RCC_OscInitStruct);
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; clocks dividers */
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3); RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
PeriphClkInitStruct.PLLI2S.PLLI2SN = 200; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
PeriphClkInitStruct.PLLI2S.PLLI2SM = 5; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
PeriphClkInitStruct.PLLI2S.PLLI2SR = 2;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
} }

View File

@ -30,7 +30,6 @@
#include "lib/utils/interrupt_char.h" #include "lib/utils/interrupt_char.h"
#include "lib/mp-readline/readline.h" #include "lib/mp-readline/readline.h"
#include "stm32f4xx_hal.h" #include "stm32f4xx_hal.h"
//#include "tusb_config.h"
void init_usb_hardware(void) { void init_usb_hardware(void) {
// HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_RESET); //LED 2 // HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_RESET); //LED 2

View File

@ -55,12 +55,12 @@ void SysTick_Handler(void) {
} }
void tick_init() { void tick_init() {
uint32_t ticks_per_ms = 16000000/ 1000; uint32_t ticks_per_ms = SystemCoreClock/ 1000;
SysTick_Config(ticks_per_ms); // interrupt is enabled SysTick_Config(ticks_per_ms); // interrupt is enabled
} }
void tick_delay(uint32_t us) { void tick_delay(uint32_t us) {
uint32_t ticks_per_us = 16000000 / 1000 / 1000; uint32_t ticks_per_us = SystemCoreClock / 1000 / 1000;
uint32_t us_between_ticks = SysTick->VAL / ticks_per_us; uint32_t us_between_ticks = SysTick->VAL / ticks_per_us;
uint64_t start_ms = ticks_ms; uint64_t start_ms = ticks_ms;
while (us > 1000) { while (us > 1000) {
@ -74,12 +74,12 @@ void tick_delay(uint32_t us) {
// us counts down! // us counts down!
void current_tick(uint64_t* ms, uint32_t* us_until_ms) { void current_tick(uint64_t* ms, uint32_t* us_until_ms) {
uint32_t ticks_per_us = 16000000 / 1000 / 1000; uint32_t ticks_per_us = SystemCoreClock / 1000 / 1000;
*ms = ticks_ms; *ms = ticks_ms;
*us_until_ms = SysTick->VAL / ticks_per_us; *us_until_ms = SysTick->VAL / ticks_per_us;
} }
void wait_until(uint64_t ms, uint32_t us_until_ms) { void wait_until(uint64_t ms, uint32_t us_until_ms) {
uint32_t ticks_per_us = 16000000 / 1000 / 1000; uint32_t ticks_per_us = SystemCoreClock / 1000 / 1000;
while(ticks_ms <= ms && SysTick->VAL / ticks_per_us >= us_until_ms) {} while(ticks_ms <= ms && SysTick->VAL / ticks_per_us >= us_until_ms) {}
} }

View File

@ -60,10 +60,14 @@ bool usb_enabled(void) {
void usb_init(void) { void usb_init(void) {
init_usb_hardware(); init_usb_hardware();
load_serial_number(); //load_serial_number();
tusb_init(); tusb_init();
while(1) {
tud_task();
}
#if MICROPY_KBD_EXCEPTION #if MICROPY_KBD_EXCEPTION
// Set Ctrl+C as wanted char, tud_cdc_rx_wanted_cb() callback will be invoked when Ctrl+C is received // Set Ctrl+C as wanted char, tud_cdc_rx_wanted_cb() callback will be invoked when Ctrl+C is received
// This callback always got invoked regardless of mp_interrupt_char value since we only set it once here // This callback always got invoked regardless of mp_interrupt_char value since we only set it once here

View File

@ -197,7 +197,7 @@ bool tud_msc_test_unit_ready_cb(uint8_t lun) {
// Invoked when received Start Stop Unit command // Invoked when received Start Stop Unit command
// - Start = 0 : stopped power mode, if load_eject = 1 : unload disk storage // - Start = 0 : stopped power mode, if load_eject = 1 : unload disk storage
// - Start = 1 : active mode, if load_eject = 1 : load disk storage // - Start = 1 : active mode, if load_eject = 1 : load disk storage
bool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, bool load_eject) { void tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, bool load_eject) {
if (load_eject) { if (load_eject) {
if (lun > 1) { if (lun > 1) {
return false; return false;