/* * This file is part of the MicroPython project, http://micropython.org/ * * The MIT License (MIT) * * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include #include "supervisor/port.h" #include "boards/board.h" #include "tick.h" //#include "shared-bindings/rtc/__init__.h" #include "stm32f4xx_hal.h" #define DATA_Ready_Pin GPIO_PIN_2 #define DATA_Ready_GPIO_Port GPIOE #define CS_I2C_SPI_Pin GPIO_PIN_3 #define CS_I2C_SPI_GPIO_Port GPIOE #define INT1_Pin GPIO_PIN_4 #define INT1_GPIO_Port GPIOE #define INT2_Pin GPIO_PIN_5 #define INT2_GPIO_Port GPIOE #define PC14_OSC32_IN_Pin GPIO_PIN_14 #define PC14_OSC32_IN_GPIO_Port GPIOC #define PC15_OSC32_OUT_Pin GPIO_PIN_15 #define PC15_OSC32_OUT_GPIO_Port GPIOC #define PH0_OSC_IN_Pin GPIO_PIN_0 #define PH0_OSC_IN_GPIO_Port GPIOH #define PH1_OSC_OUT_Pin GPIO_PIN_1 #define PH1_OSC_OUT_GPIO_Port GPIOH #define OTG_FS_PowerSwitchOn_Pin GPIO_PIN_0 #define OTG_FS_PowerSwitchOn_GPIO_Port GPIOC #define PDM_OUT_Pin GPIO_PIN_3 #define PDM_OUT_GPIO_Port GPIOC #define I2S3_WS_Pin GPIO_PIN_4 #define I2S3_WS_GPIO_Port GPIOA #define SPI1_SCK_Pin GPIO_PIN_5 #define SPI1_SCK_GPIO_Port GPIOA #define SPI1_MISO_Pin GPIO_PIN_6 #define SPI1_MISO_GPIO_Port GPIOA #define SPI1_MOSI_Pin GPIO_PIN_7 #define SPI1_MOSI_GPIO_Port GPIOA #define CLK_IN_Pin GPIO_PIN_10 #define CLK_IN_GPIO_Port GPIOB #define LD4_Pin GPIO_PIN_12 #define LD4_GPIO_Port GPIOD #define LD3_Pin GPIO_PIN_13 #define LD3_GPIO_Port GPIOD #define LD5_Pin GPIO_PIN_14 #define LD5_GPIO_Port GPIOD #define LD6_Pin GPIO_PIN_15 #define LD6_GPIO_Port GPIOD #define I2S3_MCK_Pin GPIO_PIN_7 #define I2S3_MCK_GPIO_Port GPIOC #define VBUS_FS_Pin GPIO_PIN_9 #define VBUS_FS_GPIO_Port GPIOA #define OTG_FS_ID_Pin GPIO_PIN_10 #define OTG_FS_ID_GPIO_Port GPIOA #define OTG_FS_DM_Pin GPIO_PIN_11 #define OTG_FS_DM_GPIO_Port GPIOA #define OTG_FS_DP_Pin GPIO_PIN_12 #define OTG_FS_DP_GPIO_Port GPIOA #define SWDIO_Pin GPIO_PIN_13 #define SWDIO_GPIO_Port GPIOA #define SWCLK_Pin GPIO_PIN_14 #define SWCLK_GPIO_Port GPIOA #define I2S3_SCK_Pin GPIO_PIN_10 #define I2S3_SCK_GPIO_Port GPIOC #define I2S3_SD_Pin GPIO_PIN_12 #define I2S3_SD_GPIO_Port GPIOC #define Audio_RST_Pin GPIO_PIN_4 #define Audio_RST_GPIO_Port GPIOD #define OTG_FS_OverCurrent_Pin GPIO_PIN_5 #define OTG_FS_OverCurrent_GPIO_Port GPIOD #define SWO_Pin GPIO_PIN_3 #define SWO_GPIO_Port GPIOB #define Audio_SCL_Pin GPIO_PIN_6 #define Audio_SCL_GPIO_Port GPIOB #define Audio_SDA_Pin GPIO_PIN_9 #define Audio_SDA_GPIO_Port GPIOB #define MEMS_INT2_Pin GPIO_PIN_1 #define MEMS_INT2_GPIO_Port GPIOE static void power_warning_handler(void) { reset_into_safe_mode(BROWNOUT); } safe_mode_t port_init(void) { HAL_Init(); //sys clock RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 4; RCC_OscInitStruct.PLL.PLLN = 192; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; RCC_OscInitStruct.PLL.PLLQ = 8; HAL_RCC_OscConfig(&RCC_OscInitStruct); /** Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3); PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S; PeriphClkInitStruct.PLLI2S.PLLI2SN = 200; PeriphClkInitStruct.PLLI2S.PLLI2SM = 5; PeriphClkInitStruct.PLLI2S.PLLI2SR = 2; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); //GPIO setup GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(OTG_FS_PowerSwitchOn_GPIO_Port, OTG_FS_PowerSwitchOn_Pin, GPIO_PIN_SET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOD, LD4_Pin|LD3_Pin|LD5_Pin|LD6_Pin |Audio_RST_Pin, GPIO_PIN_RESET); /*Configure GPIO pin : DATA_Ready_Pin */ GPIO_InitStruct.Pin = DATA_Ready_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(DATA_Ready_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin : CS_I2C_SPI_Pin */ GPIO_InitStruct.Pin = CS_I2C_SPI_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(CS_I2C_SPI_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pins : INT1_Pin INT2_Pin MEMS_INT2_Pin */ GPIO_InitStruct.Pin = INT1_Pin|INT2_Pin|MEMS_INT2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /*Configure GPIO pin : OTG_FS_PowerSwitchOn_Pin */ GPIO_InitStruct.Pin = OTG_FS_PowerSwitchOn_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(OTG_FS_PowerSwitchOn_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin : PA0 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : LD4_Pin LD3_Pin LD5_Pin LD6_Pin Audio_RST_Pin */ GPIO_InitStruct.Pin = LD4_Pin|LD3_Pin|LD5_Pin|LD6_Pin |Audio_RST_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /*Configure GPIO pin : OTG_FS_OverCurrent_Pin */ GPIO_InitStruct.Pin = OTG_FS_OverCurrent_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(OTG_FS_OverCurrent_GPIO_Port, &GPIO_InitStruct); //Status LED chain HAL_GPIO_WritePin(GPIOD, LD4_Pin, GPIO_PIN_RESET); //LED 1 HAL_GPIO_WritePin(GPIOD, LD3_Pin, GPIO_PIN_SET); //LED 2 HAL_GPIO_WritePin(GPIOD, LD5_Pin, GPIO_PIN_SET); //LED 3 HAL_GPIO_WritePin(GPIOD, LD6_Pin, GPIO_PIN_SET); //LED 4 tick_init(); board_init(); return NO_SAFE_MODE; } void reset_port(void) { } void reset_to_bootloader(void) { } void reset_cpu(void) { } extern uint32_t _ebss; // Place the word to save just after our BSS section that gets blanked. void port_set_saved_word(uint32_t value) { _ebss = value; } uint32_t port_get_saved_word(void) { return _ebss; } // void HardFault_Handler(void) { // }