Implement working (if useless) USB on F411
This commit is contained in:
parent
21f1ae51df
commit
981398406c
|
@ -1 +1 @@
|
||||||
Subproject commit 0848c462b3e431a9da42e96537d2b597a4579636
|
Subproject commit 97e2629d647584681b2883f2081fa2cddb3d61cc
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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) {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue