diff --git a/Core/Inc/eeprom.h b/Core/Inc/eeprom.h index 3543a37..e14e3a5 100644 --- a/Core/Inc/eeprom.h +++ b/Core/Inc/eeprom.h @@ -9,6 +9,13 @@ //includes #include "stm32f1xx_hal.h" +//---------------------------------------------Datas registration-------------------------------------------- + +#define EEPROM_VAR_ID (0) // 16b: Init ID: 0xCA1C +#define EEPROM_VAR_CFG (1) // 16b: 0x00 + CFG reg +#define EEPROM_VAR_KBD (2) // 16b: DEB + FRQ regs +#define EEPROM_VAR_BCKL (3) // 16b: LCD + KBD backlight step indice + //-------------------------------------------library configuration------------------------------------------- //number of variables (maximum variable name is EEPROM_VARIABLE_COUNT - 1) diff --git a/Core/Inc/main.h b/Core/Inc/hal_interface.h similarity index 69% rename from Core/Inc/main.h rename to Core/Inc/hal_interface.h index 87f1ea7..9883b1d 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/hal_interface.h @@ -1,26 +1,22 @@ -/* USER CODE BEGIN Header */ /** ****************************************************************************** + * @file hal_interface.h + * @brief Central access to STM32-HAL definitions and + * related functions. + ****************************************************************************** + * @attention * * Copyright (c) 2025 C.ARE (JackCarterSmith). + * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * ****************************************************************************** + * */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MAIN_H -#define __MAIN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ #include "stm32f1xx_hal.h" #include "stm32f1xx_ll_iwdg.h" #include "stm32f1xx_ll_rcc.h" @@ -33,46 +29,17 @@ extern "C" { #include "stm32f1xx_ll_dma.h" #include "stm32f1xx_ll_rtc.h" #include "stm32f1xx_ll_gpio.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ #include "stm32f1xx_ll_tim.h" -/* USER CODE END Includes */ -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ -/* USER CODE END ET */ +#ifndef HAL_INTERFACE_H_ +#define HAL_INTERFACE_H_ -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ -extern TIM_HandleTypeDef htim1; -extern TIM_HandleTypeDef htim3; -extern I2C_HandleTypeDef hi2c2; +#ifdef __cplusplus +extern "C" { +#endif -extern volatile uint32_t systicks_counter; -extern volatile uint8_t pmu_irq; -extern uint8_t io_matrix[9]; -extern uint8_t js_bits; -/* USER CODE END EC */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); - -/* Exported functions prototypes ---------------------------------------------*/ -void Error_Handler(void); - -/* USER CODE BEGIN EFP */ -__STATIC_INLINE uint32_t uptime_ms(void) { return systicks_counter; } - -void flash_one_time(uint32_t ts, uint8_t restore_status); -/* USER CODE END EFP */ - -/* Private defines -----------------------------------------------------------*/ +// HAL GPIO pins definition -------------------------------------------------------- #define SYS_LED_Pin LL_GPIO_PIN_13 #define SYS_LED_GPIO_Port GPIOC #define COL_1_Pin LL_GPIO_PIN_0 @@ -157,15 +124,38 @@ void flash_one_time(uint32_t ts, uint8_t restore_status); #define PICO_SDA_Pin LL_GPIO_PIN_9 #define PICO_SDA_GPIO_Port GPIOB -/* USER CODE BEGIN Private defines */ -#define EEPROM_VAR_ID (0) // 16b: Init ID: 0xCA1C -#define EEPROM_VAR_CFG (1) // 16b: 0x00 + CFG reg -#define EEPROM_VAR_KBD (2) // 16b: DEB + FRQ regs -#define EEPROM_VAR_BCKL (3) // 16b: LCD + KBD backlight step indice -/* USER CODE END Private defines */ + +// Global variables definition -------------------------------------------------------- +extern volatile uint32_t systicks_counter; +extern volatile uint8_t pmu_irq; + + +// Global functions definition -------------------------------------------------------- +HAL_StatusTypeDef HAL_Interface_init(void); + +__STATIC_INLINE uint32_t uptime_ms(void) { return systicks_counter; } +void flash_one_time(uint32_t ts, uint8_t restore_status); + +void Error_Handler(void); + +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ +#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ +void assert_failed(uint8_t *file, uint32_t line); +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ #ifdef __cplusplus } #endif -#endif /* __MAIN_H */ +#endif /* HAL_INTERFACE_H_ */ diff --git a/Core/Inc/keyboard.h b/Core/Inc/keyboard.h index 8acd0e2..3b8db07 100644 --- a/Core/Inc/keyboard.h +++ b/Core/Inc/keyboard.h @@ -1,5 +1,4 @@ #include "stm32f1xx_hal.h" -#include "main.h" #ifndef KEYBOARD_H_ #define KEYBOARD_H_ @@ -74,10 +73,12 @@ enum key_state { #define KEY_F10 0x90 +extern uint8_t io_matrix[9]; +extern uint8_t js_bits; + typedef void (*key_callback)(char, enum key_state); typedef void (*lock_callback)(uint8_t, uint8_t); - void keyboard_set_key_callback(key_callback callback); void keyboard_set_lock_callback(lock_callback callback); uint8_t keyboard_get_capslock(void); diff --git a/Core/Inc/regs.h b/Core/Inc/regs.h index 7717731..f6d1520 100644 --- a/Core/Inc/regs.h +++ b/Core/Inc/regs.h @@ -19,6 +19,7 @@ enum reg_id REG_ID_BAT = 0x0B, // battery REG_ID_C64_MTX = 0x0C,// read c64 matrix REG_ID_C64_JS = 0x0D, // joystick io bits + REG_ID_TYP = 0xFF, // firmware type (0=official, others=custom) REG_ID_LAST, }; diff --git a/Core/Inc/stm32_assert.h b/Core/Inc/stm32_assert.h deleted file mode 100644 index 305895a..0000000 --- a/Core/Inc/stm32_assert.h +++ /dev/null @@ -1,53 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32_assert.h - * @author MCD Application Team - * @brief STM32 assert file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2018 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32_ASSERT_H -#define __STM32_ASSERT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Includes ------------------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ -#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ -void assert_failed(uint8_t *file, uint32_t line); -#else -#define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32_ASSERT_H */ - diff --git a/Core/Inc/stm32f1xx_it.h b/Core/Inc/stm32f1xx_it.h index 549fae1..254de69 100644 --- a/Core/Inc/stm32f1xx_it.h +++ b/Core/Inc/stm32f1xx_it.h @@ -59,8 +59,12 @@ void EXTI9_5_IRQHandler(void); void TIM2_IRQHandler(void); void I2C1_EV_IRQHandler(void); void I2C1_ER_IRQHandler(void); +#ifdef DEBUG void USART1_IRQHandler(void); +#endif +#ifdef UART_PICO_INTERFACE void USART3_IRQHandler(void); +#endif /* USER CODE BEGIN EFP */ /* USER CODE END EFP */ diff --git a/Core/Inc/version.h b/Core/Inc/version.h new file mode 100644 index 0000000..58847fe --- /dev/null +++ b/Core/Inc/version.h @@ -0,0 +1,7 @@ +#ifndef VERSION_H_ +#define VERSION_H_ + +#define VERSION_MAJOR (0) +#define VERSION_MINOR (3) + +#endif /* VERSION_H_ */ diff --git a/Core/Src/axp2101.c b/Core/Src/axp2101.c index a7bc8a4..88519e0 100644 --- a/Core/Src/axp2101.c +++ b/Core/Src/axp2101.c @@ -1,10 +1,13 @@ #include "axp2101.h" -#include "main.h" -#include "stm32_assert.h" + +#include "hal_interface.h" + #define AXP2101_DEV_I2C_ID 0x68 +extern I2C_HandleTypeDef hi2c2; + static uint8_t statusRegister[XPOWERS_AXP2101_INTSTS_CNT] = {0}; static uint8_t intRegister[XPOWERS_AXP2101_INTSTS_CNT] = {0}; diff --git a/Core/Src/backlight.c b/Core/Src/backlight.c index a7b0682..962d26b 100644 --- a/Core/Src/backlight.c +++ b/Core/Src/backlight.c @@ -1,8 +1,12 @@ #include "backlight.h" -#include "main.h" + +#include "hal_interface.h" #include "regs.h" +extern TIM_HandleTypeDef htim1; +extern TIM_HandleTypeDef htim3; + // LCD backlight curve based on brightness measurements for specific value of PWM duty cycle. // Using this, I've established a custom command curve. #define LCD_BCKL_STEPS 10 diff --git a/Core/Src/batt.c b/Core/Src/batt.c index 2b9d631..708f3ee 100644 --- a/Core/Src/batt.c +++ b/Core/Src/batt.c @@ -1,5 +1,6 @@ #include "batt.h" -#include "main.h" + +#include "hal_interface.h" #include "axp2101.h" diff --git a/Core/Src/hal_interface.c b/Core/Src/hal_interface.c new file mode 100644 index 0000000..8f0f925 --- /dev/null +++ b/Core/Src/hal_interface.c @@ -0,0 +1,773 @@ +/** + ****************************************************************************** + * @file hal_interface.c + * @brief Central access to STM32-HAL definitions and + * related functions. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 C.ARE (JackCarterSmith). + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * + ****************************************************************************** + * + */ + +#include "hal_interface.h" + + +I2C_HandleTypeDef hi2c1; +I2C_HandleTypeDef hi2c2; + +TIM_HandleTypeDef htim1; +TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim3; + +#ifdef DEBUG +UART_HandleTypeDef huart1; +#endif +#ifdef UART_PICO_INTERFACE +UART_HandleTypeDef huart3; +#endif + +static void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) { + LL_FLASH_SetLatency(LL_FLASH_LATENCY_0); + while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_0) {} + LL_RCC_HSE_Enable(); + + /* Wait till HSE is ready */ + while(LL_RCC_HSE_IsReady() != 1) {} + LL_RCC_LSI_Enable(); + + /* Wait till LSI is ready */ + while(LL_RCC_LSI_IsReady() != 1) {} + LL_PWR_EnableBkUpAccess(); + if(LL_RCC_GetRTCClockSource() != LL_RCC_RTC_CLKSOURCE_LSE) { + LL_RCC_ForceBackupDomainReset(); + LL_RCC_ReleaseBackupDomainReset(); + } + LL_RCC_LSE_Enable(); + + /* Wait till LSE is ready */ + while(LL_RCC_LSE_IsReady() != 1) {} + if(LL_RCC_GetRTCClockSource() != LL_RCC_RTC_CLKSOURCE_LSE) { + LL_RCC_SetRTCClockSource(LL_RCC_RTC_CLKSOURCE_LSE); + } + LL_RCC_EnableRTC(); + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2); + LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); + LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE); + + /* Wait till System clock is ready */ + while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSE) {} + LL_SetSystemCoreClock(4000000); + + /* Update the time base */ + if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK) + Error_Handler(); +} + +/** + * @brief I2C1 Initialization Function + * @param None + * @retval None + */ +static void MX_I2C1_Init(void) { + hi2c1.Instance = I2C1; + hi2c1.Init.ClockSpeed = 10000; + hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; + hi2c1.Init.OwnAddress1 = 62; + hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c1.Init.OwnAddress2 = 0; + hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c1) != HAL_OK) + Error_Handler(); +} + +/** + * @brief I2C2 Initialization Function + * @param None + * @retval None + */ +static void MX_I2C2_Init(void) { + hi2c2.Instance = I2C2; + hi2c2.Init.ClockSpeed = 100000; + hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2; + hi2c2.Init.OwnAddress1 = 0; + hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c2.Init.OwnAddress2 = 0; + hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c2) != HAL_OK) + Error_Handler(); +} + +/** + * @brief IWDG Initialization Function + * @param None + * @retval None + */ +static void MX_IWDG_Init(void) { +#ifndef DEBUG + LL_IWDG_Enable(IWDG); + LL_IWDG_EnableWriteAccess(IWDG); + LL_IWDG_SetPrescaler(IWDG, LL_IWDG_PRESCALER_32); + LL_IWDG_SetReloadCounter(IWDG, 4095); + while (LL_IWDG_IsReady(IWDG) != 1) {} + + LL_IWDG_ReloadCounter(IWDG); +#endif +} + +/** + * @brief RTC Initialization Function + * @param None + * @retval None + */ +static void MX_RTC_Init(void) { + LL_RTC_InitTypeDef RTC_InitStruct = {0}; + LL_RTC_TimeTypeDef RTC_TimeStruct = {0}; + + LL_PWR_EnableBkUpAccess(); + /* Enable BKP CLK enable for backup registers */ + LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_BKP); + /* Peripheral clock enable */ + LL_RCC_EnableRTC(); + + + /** Initialize RTC and set the Time and Date + */ + RTC_InitStruct.AsynchPrescaler = 0xFFFFFFFFU; + LL_RTC_Init(RTC, &RTC_InitStruct); + LL_RTC_SetAsynchPrescaler(RTC, 0xFFFFFFFFU); + + /** Initialize RTC and set the Time and Date + */ + RTC_TimeStruct.Hours = 0; + RTC_TimeStruct.Minutes = 0; + RTC_TimeStruct.Seconds = 0; + LL_RTC_TIME_Init(RTC, LL_RTC_FORMAT_BCD, &RTC_TimeStruct); +} + +/** + * @brief TIM1 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM1_Init(void) { + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; + + htim1.Instance = TIM1; + htim1.Init.Prescaler = 0; + htim1.Init.CounterMode = TIM_COUNTERMODE_UP; + htim1.Init.Period = 800; + htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim1.Init.RepetitionCounter = 0; + htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; + if (HAL_TIM_Base_Init(&htim1) != HAL_OK) + Error_Handler(); + + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) + Error_Handler(); + + if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) + Error_Handler(); + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) + Error_Handler(); + + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; + if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + Error_Handler(); + + sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; + sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; + sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; + sBreakDeadTimeConfig.DeadTime = 0; + sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; + sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; + sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; + if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) + Error_Handler(); + + HAL_TIM_MspPostInit(&htim1); +} + +/** + * @brief TIM2 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM2_Init(void) { + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + htim2.Instance = TIM2; + htim2.Init.Prescaler = 4-1; + htim2.Init.CounterMode = TIM_COUNTERMODE_UP; + htim2.Init.Period = 1000; + htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; + if (HAL_TIM_Base_Init(&htim2) != HAL_OK) + Error_Handler(); + + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) + Error_Handler(); + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) + Error_Handler(); +} + +/** + * @brief TIM3 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM3_Init(void) { + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + + htim3.Instance = TIM3; + htim3.Init.Prescaler = 0; + htim3.Init.CounterMode = TIM_COUNTERMODE_UP; + htim3.Init.Period = 512; + htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; + if (HAL_TIM_Base_Init(&htim3) != HAL_OK) + Error_Handler(); + + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) + Error_Handler(); + + if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) + Error_Handler(); + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) + Error_Handler(); + + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + Error_Handler(); + + HAL_TIM_MspPostInit(&htim3); +} + +/** + * @brief USART1 Initialization Function + * @param None + * @retval None + */ +static void MX_USART1_UART_Init(void) { +#ifdef DEBUG + huart1.Instance = USART1; + huart1.Init.BaudRate = 115200; + huart1.Init.WordLength = UART_WORDLENGTH_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart1) != HAL_OK) + Error_Handler(); +#endif +} + +/** + * @brief USART3 Initialization Function + * @param None + * @retval None + */ +static void MX_USART3_UART_Init(void) { +#ifdef UART_PICO_INTERFACE + huart3.Instance = USART3; + huart3.Init.BaudRate = 115200; + huart3.Init.WordLength = UART_WORDLENGTH_8B; + huart3.Init.StopBits = UART_STOPBITS_1; + huart3.Init.Parity = UART_PARITY_NONE; + huart3.Init.Mode = UART_MODE_TX_RX; + huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart3.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart3) != HAL_OK) + Error_Handler(); +#endif +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) { + LL_EXTI_InitTypeDef EXTI_InitStruct = {0}; + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC); + LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOD); + LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA); + LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB); + + /**/ + LL_GPIO_SetOutputPin(GPIOC, SYS_LED_Pin|COL_1_Pin|COL_2_Pin|COL_3_Pin + |COL_4_Pin|COL_5_Pin|COL_6_Pin|COL_7_Pin + |COL_8_Pin); + + /**/ + LL_GPIO_ResetOutputPin(GPIOA, PICO_EN_Pin|SP_AMP_EN_Pin); + + /**/ + GPIO_InitStruct.Pin = SYS_LED_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; + LL_GPIO_Init(SYS_LED_GPIO_Port, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = COL_1_Pin|COL_2_Pin|COL_3_Pin|COL_4_Pin + |COL_5_Pin|COL_6_Pin|COL_7_Pin|COL_8_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; + LL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = ROW_1_Pin|ROW_2_Pin|ROW_3_Pin|ROW_4_Pin + |ROW_5_Pin|ROW_6_Pin|ROW_7_Pin|ROW_8_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = KEY_1_Pin|KEY_2_Pin|KEY_3_Pin|KEY_9_Pin + |KEY_10_Pin|KEY_11_Pin|KEY_12_Pin|KEY_4_Pin + |KEY_5_Pin|KEY_6_Pin|KEY_7_Pin|KEY_8_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_11|LL_GPIO_PIN_12|LL_GPIO_PIN_15; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = PICO_EN_Pin|SP_AMP_EN_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = HP_DET_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING; + LL_GPIO_Init(HP_DET_GPIO_Port, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_2; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + LL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /**/ + LL_GPIO_AF_SetEXTISource(LL_GPIO_AF_EXTI_PORTC, LL_GPIO_AF_EXTI_LINE9); + + /**/ + EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_9; + EXTI_InitStruct.LineCommand = ENABLE; + EXTI_InitStruct.Mode = LL_EXTI_MODE_IT; + EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_FALLING; + LL_EXTI_Init(&EXTI_InitStruct); + + /**/ + LL_GPIO_SetPinMode(PMU_IRQ_GPIO_Port, PMU_IRQ_Pin, LL_GPIO_MODE_FLOATING); + + /* EXTI interrupt init*/ + NVIC_SetPriority(EXTI9_5_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),3, 0)); + NVIC_EnableIRQ(EXTI9_5_IRQn); +} + + +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) { + __HAL_RCC_AFIO_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /** DISABLE: JTAG-DP Disabled and SW-DP Disabled + */ + __HAL_AFIO_REMAP_SWJ_DISABLE(); +} + +/** + * @brief I2C MSP Initialization + * This function configures the hardware resources used in this example + * @param hi2c: I2C handle pointer + * @retval None + */ +void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) { + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + if (hi2c->Instance == I2C1) { + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /**I2C1 GPIO Configuration + PB8 ------> I2C1_SCL + PB9 ------> I2C1_SDA + */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + __HAL_AFIO_REMAP_I2C1_ENABLE(); + + /* Peripheral clock enable */ + __HAL_RCC_I2C1_CLK_ENABLE(); + + /* I2C1 interrupt Init */ + HAL_NVIC_SetPriority(I2C1_EV_IRQn, 2, 0); + HAL_NVIC_EnableIRQ(I2C1_EV_IRQn); + HAL_NVIC_SetPriority(I2C1_ER_IRQn, 2, 0); + HAL_NVIC_EnableIRQ(I2C1_ER_IRQn); + } else if (hi2c->Instance == I2C2) { + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /**I2C2 GPIO Configuration + PB10 ------> I2C2_SCL + PB11 ------> I2C2_SDA + */ + GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* Peripheral clock enable */ + __HAL_RCC_I2C2_CLK_ENABLE(); + } +} + +/** + * @brief I2C MSP De-Initialization + * This function freeze the hardware resources used in this example + * @param hi2c: I2C handle pointer + * @retval None + */ +void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c) { + if (hi2c->Instance == I2C1) { + /* Peripheral clock disable */ + __HAL_RCC_I2C1_CLK_DISABLE(); + + /**I2C1 GPIO Configuration + PB8 ------> I2C1_SCL + PB9 ------> I2C1_SDA + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_9); + + /* I2C1 interrupt DeInit */ + HAL_NVIC_DisableIRQ(I2C1_EV_IRQn); + HAL_NVIC_DisableIRQ(I2C1_ER_IRQn); + } else if (hi2c->Instance == I2C2) { + /* Peripheral clock disable */ + __HAL_RCC_I2C2_CLK_DISABLE(); + + /**I2C2 GPIO Configuration + PB10 ------> I2C2_SCL + PB11 ------> I2C2_SDA + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_11); + } +} + +/** + * @brief TIM_Base MSP Initialization + * This function configures the hardware resources used in this example + * @param htim_base: TIM_Base handle pointer + * @retval None + */ +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) { + if (htim_base->Instance == TIM1) { + /* Peripheral clock enable */ + __HAL_RCC_TIM1_CLK_ENABLE(); + } else if (htim_base->Instance == TIM2) { + /* Peripheral clock enable */ + __HAL_RCC_TIM2_CLK_ENABLE(); + + /* TIM2 interrupt Init */ + HAL_NVIC_SetPriority(TIM2_IRQn, 1, 0); + HAL_NVIC_EnableIRQ(TIM2_IRQn); + } else if (htim_base->Instance == TIM3) { + /* Peripheral clock enable */ + __HAL_RCC_TIM3_CLK_ENABLE(); + } +} + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (htim->Instance == TIM1) { + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**TIM1 GPIO Configuration + PA8 ------> TIM1_CH1 + */ + GPIO_InitStruct.Pin = GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + } else if (htim->Instance == TIM3) { + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**TIM3 GPIO Configuration + PC8 ------> TIM3_CH3 + */ + GPIO_InitStruct.Pin = GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + __HAL_AFIO_REMAP_TIM3_ENABLE(); + } +} + +/** + * @brief TIM_Base MSP De-Initialization + * This function freeze the hardware resources used in this example + * @param htim_base: TIM_Base handle pointer + * @retval None + */ +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) { + if (htim_base->Instance == TIM1) { + /* Peripheral clock disable */ + __HAL_RCC_TIM1_CLK_DISABLE(); + } else if (htim_base->Instance == TIM2) { + /* Peripheral clock disable */ + __HAL_RCC_TIM2_CLK_DISABLE(); + + /* TIM2 interrupt DeInit */ + HAL_NVIC_DisableIRQ(TIM2_IRQn); + } else if (htim_base->Instance == TIM3) { + /* Peripheral clock disable */ + __HAL_RCC_TIM3_CLK_DISABLE(); + } +} + +/** + * @brief UART MSP Initialization + * This function configures the hardware resources used in this example + * @param huart: UART handle pointer + * @retval None + */ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) { + GPIO_InitTypeDef GPIO_InitStruct = {0}; + +#ifdef DEBUG + if (huart->Instance == USART1) { + /* Peripheral clock enable */ + __HAL_RCC_USART1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USART1 interrupt Init */ + HAL_NVIC_SetPriority(USART1_IRQn, 4, 0); + HAL_NVIC_EnableIRQ(USART1_IRQn); + } else +#endif +#ifdef UART_PICO_INTERFACE + if (huart->Instance == USART3) { + /* Peripheral clock enable */ + __HAL_RCC_USART3_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**USART3 GPIO Configuration + PC10 ------> USART3_TX + PC11 ------> USART3_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + __HAL_AFIO_REMAP_USART3_PARTIAL(); + + /* USART3 interrupt Init */ + HAL_NVIC_SetPriority(USART3_IRQn, 3, 0); + HAL_NVIC_EnableIRQ(USART3_IRQn); + } +#else + NULL; +#endif +} + +/** + * @brief UART MSP De-Initialization + * This function freeze the hardware resources used in this example + * @param huart: UART handle pointer + * @retval None + */ +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) { +#ifdef DEBUG + if (huart->Instance == USART1) { + /* Peripheral clock disable */ + __HAL_RCC_USART1_CLK_DISABLE(); + + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); + + /* USART1 interrupt DeInit */ + HAL_NVIC_DisableIRQ(USART1_IRQn); + } else +#endif +#ifdef UART_PICO_INTERFACE + if (huart->Instance == USART3) { + /* Peripheral clock disable */ + __HAL_RCC_USART3_CLK_DISABLE(); + + /**USART3 GPIO Configuration + PC10 ------> USART3_TX + PC11 ------> USART3_RX + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10|GPIO_PIN_11); + + /* USART3 interrupt DeInit */ + HAL_NVIC_DisableIRQ(USART3_IRQn); + } +#else + NULL; +#endif +} + + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) { + // User can add his own implementation to report the HAL error return state + //TODO: replace with dedicated, non-blocking, error handler + __disable_irq(); + while (1) { + //LL_GPIO_TogglePin(SYS_LED_GPIO_Port, SYS_LED_Pin); + HAL_Delay(500); + } +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +void flash_one_time(uint32_t ts, uint8_t restore_status) { + for (size_t i = 0; i < ts; i++) { + LL_IWDG_ReloadCounter(IWDG); + LL_GPIO_ResetOutputPin(SYS_LED_GPIO_Port, SYS_LED_Pin); + HAL_Delay(400); + LL_GPIO_SetOutputPin(SYS_LED_GPIO_Port, SYS_LED_Pin); + HAL_Delay(200); + } + + if (restore_status) + LL_GPIO_ResetOutputPin(SYS_LED_GPIO_Port, SYS_LED_Pin); + else + LL_GPIO_SetOutputPin(SYS_LED_GPIO_Port, SYS_LED_Pin); +} + +/** + * @brief This function is executed at the start of the program to initialize all peripherals. + * @retval None + */ +HAL_StatusTypeDef HAL_Interface_init(void) { + HAL_StatusTypeDef result = HAL_OK; + + result |= HAL_Init(); + if (result != HAL_OK) + return result; + + SystemClock_Config(); + + MX_GPIO_Init(); + MX_I2C1_Init(); + MX_I2C2_Init(); + MX_RTC_Init(); + MX_USART1_UART_Init(); + MX_USART3_UART_Init(); + MX_IWDG_Init(); + MX_TIM1_Init(); + MX_TIM3_Init(); + MX_TIM2_Init(); + + return result; +} diff --git a/Core/Src/keyboard.c b/Core/Src/keyboard.c index 05193dc..ab39b66 100644 --- a/Core/Src/keyboard.c +++ b/Core/Src/keyboard.c @@ -1,4 +1,6 @@ #include "keyboard.h" + +#include "hal_interface.h" #include "regs.h" #include "backlight.h" #include "batt.h" @@ -108,6 +110,9 @@ static uint8_t capslock = 0; static uint8_t numlock_changed = 0; static uint8_t numlock = 0; +uint8_t io_matrix[9] = {0}; //for IO matrix,last byte is the restore key(c64 only) +uint8_t js_bits = 0xFF; // c64 joystick bits + inline void keyboard_set_key_callback(key_callback callback) { _key_callback = callback; diff --git a/Core/Src/main.c b/Core/Src/main.c index 2a4e6e4..9edaf14 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -1,4 +1,3 @@ -/* USER CODE BEGIN Header */ /** ****************************************************************************** * @@ -13,12 +12,8 @@ * SYS_LED and COL_x are open-drain, output logic is inverted. * */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ +#include "hal_interface.h" #include "axp2101.h" #include "backlight.h" #include "batt.h" @@ -26,59 +21,56 @@ #include "fifo.h" #include "keyboard.h" #include "regs.h" -/* USER CODE END Includes */ -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN PTD */ -enum i2cs_state { - //I2CS_STATE_HALT, - I2CS_STATE_IDLE, - I2CS_STATE_REG_REQUEST, - I2CS_STATE_REG_ANSWER -}; -/* USER CODE END PTD */ -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ +// Private define ------------------------------------------------------------ //#define DEFAULT_LCD_BL (205) // ~40% PWM@7.81kHz (9 bits resolution) //#define DEFAULT_KBD_BL (20) // ~4% PWM@7.81kHz (9 bits resolution) #define DEFAULT_LCD_BL (3) //step-4 (~50%) #define DEFAULT_KBD_BL (0) //step-1 (0%) #define I2CS_REARM_TIMEOUT 500 -/* USER CODE END PD */ +#define I2CS_W_BUFF_LEN 31+1 // The last one must be only a 0 value, TODO: another cleaner way? -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ #ifdef DEBUG #define DEBUG_UART_MSG(msg) HAL_UART_Transmit(&huart1, (uint8_t*)msg, sizeof(msg)-1, 1000) //#define DEBUG_UART_MSG2(d,s) HAL_UART_Transmit(&huart1, (uint8_t*)d, s, 200) #define DEBUG_UART_MSG2(d,sz, swp) uart_rawdata_write(d,sz,swp) #endif -/* USER CODE END PM */ -/* Private variables ---------------------------------------------------------*/ -I2C_HandleTypeDef hi2c1; -I2C_HandleTypeDef hi2c2; -TIM_HandleTypeDef htim1; -TIM_HandleTypeDef htim2; -TIM_HandleTypeDef htim3; +// Private typedef ----------------------------------------------------------- +enum i2cs_state { + //I2CS_STATE_HALT, + I2CS_STATE_IDLE, + I2CS_STATE_REG_REQUEST, + I2CS_STATE_REG_ANSWER +}; -UART_HandleTypeDef huart1; -UART_HandleTypeDef huart3; -/* USER CODE BEGIN PV */ -volatile uint32_t systicks_counter = 0; // 1 MHz systick counter - TODO: implement overflow self-reset mechanism -volatile uint32_t pmu_check_counter = 0; -volatile uint32_t i2cs_rearm_counter = 0; +// Private variables --------------------------------------------------------- +extern I2C_HandleTypeDef hi2c1; +extern I2C_HandleTypeDef hi2c2; + +extern TIM_HandleTypeDef htim1; +extern TIM_HandleTypeDef htim2; +extern TIM_HandleTypeDef htim3; + #ifdef DEBUG +extern UART_HandleTypeDef huart1; static const uint8_t hexmap[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; #endif +#ifdef UART_PICO_INTERFACE +extern UART_HandleTypeDef huart3; +#endif + +volatile uint32_t systicks_counter = 0; // 1 MHz systick counter - TODO: implement overflow self-reset mechanism +volatile uint32_t pmu_check_counter = 0; +volatile uint32_t i2cs_rearm_counter = 0; static uint8_t i2cs_r_buff[2]; static volatile uint8_t i2cs_r_idx = 0; -static uint8_t i2cs_w_buff[31 + 1]; // The last one must be only a 0 value +static uint8_t i2cs_w_buff[I2CS_W_BUFF_LEN]; static volatile uint8_t i2cs_w_idx = 0; static volatile uint8_t i2cs_w_len = 0; static enum i2cs_state i2cs_state = I2CS_STATE_IDLE; @@ -88,32 +80,14 @@ static uint32_t head_phone_status = 0; volatile uint8_t pmu_irq = 0; static uint32_t pmu_online = 0; -uint8_t io_matrix[9] = {0}; //for IO matrix,last byte is the restore key(c64 only) -uint8_t js_bits = 0xFF; // c64 joystick bits -/* USER CODE END PV */ -/* Private function prototypes -----------------------------------------------*/ -void SystemClock_Config(void); -static void MX_GPIO_Init(void); -static void MX_I2C1_Init(void); -static void MX_I2C2_Init(void); -static void MX_RTC_Init(void); -static void MX_USART1_UART_Init(void); -static void MX_USART3_UART_Init(void); -static void MX_IWDG_Init(void); -static void MX_TIM1_Init(void); -static void MX_TIM3_Init(void); -static void MX_TIM2_Init(void); -/* USER CODE BEGIN PFP */ +// Private variables --------------------------------------------------------- //static void lock_cb(uint8_t caps_changed, uint8_t num_changed); static void key_cb(char key, enum key_state state); static void hw_check_HP_presence(void); static void sync_bat(void); static void check_pmu_int(void); -/* USER CODE END PFP */ -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ extern void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim == &htim2) { systicks_counter += 1; @@ -159,8 +133,12 @@ extern void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirect fifo_dequeue(&item); i2cs_w_buff[0] = item.state; i2cs_w_buff[1] = item.key; + } else if (reg == REG_ID_VER) { + i2cs_w_buff[1] = reg_get_value(REG_ID_VER); } else if (reg == REG_ID_BAT) { i2cs_w_buff[1] = reg_get_value(REG_ID_BAT); + } else if (reg == REG_ID_TYP) { + i2cs_w_buff[1] = reg_get_value(REG_ID_TYP); } else if (reg == REG_ID_KEY) { i2cs_w_buff[0] = fifo_count(); i2cs_w_buff[0] |= keyboard_get_numlock() ? KEY_NUMLOCK : 0x00; @@ -220,7 +198,7 @@ extern void HAL_I2C_ListenCpltCallback (I2C_HandleTypeDef *hi2c) { extern void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) { if (hi2c == &hi2c1) if (HAL_I2C_GetError(hi2c) != HAL_I2C_ERROR_AF) - Error_Handler(); //TODO: replace with dedicated, non-blocking, error handler + Error_Handler(); // Actually this will trigger the watchdog and restart the system... That can ruin the day of the user. } @@ -239,157 +217,113 @@ void uart_rawdata_write(uint32_t c, size_t s, uint8_t swap) { } #endif -void flash_one_time(uint32_t ts, uint8_t restore_status) { - for (size_t i = 0; i < ts; i++) { - LL_IWDG_ReloadCounter(IWDG); - LL_GPIO_ResetOutputPin(SYS_LED_GPIO_Port, SYS_LED_Pin); - HAL_Delay(400); - LL_GPIO_SetOutputPin(SYS_LED_GPIO_Port, SYS_LED_Pin); - HAL_Delay(200); - } - - if (restore_status) - LL_GPIO_ResetOutputPin(SYS_LED_GPIO_Port, SYS_LED_Pin); - else - LL_GPIO_SetOutputPin(SYS_LED_GPIO_Port, SYS_LED_Pin); -} - -/* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ -int main(void) -{ +int main(void) { + uint32_t result = 0; - /* USER CODE BEGIN 1 */ - int32_t result = 0; - /* USER CODE END 1 */ + // Initialize the STM32 HAL system + result = HAL_Interface_init(); + if (result != HAL_OK) + Error_Handler(); - /* MCU Configuration--------------------------------------------------------*/ + LL_GPIO_ResetOutputPin(SYS_LED_GPIO_Port, SYS_LED_Pin); // I'm alive! - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); + // Start the systick timer + if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK) + Error_Handler(); - /* USER CODE BEGIN Init */ - - /* USER CODE END Init */ - - /* Configure the system clock */ - SystemClock_Config(); - - /* USER CODE BEGIN SysInit */ - - /* USER CODE END SysInit */ - - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_I2C1_Init(); - MX_I2C2_Init(); - MX_RTC_Init(); - MX_USART1_UART_Init(); - MX_USART3_UART_Init(); - MX_IWDG_Init(); - MX_TIM1_Init(); - MX_TIM3_Init(); - MX_TIM2_Init(); - /* USER CODE BEGIN 2 */ - - LL_GPIO_ResetOutputPin(SYS_LED_GPIO_Port, SYS_LED_Pin); // I'm alive! - - // Start the systick timer - if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK) - Error_Handler(); - - // EEPROM emulation init - if (EEPROM_Init() != EEPROM_SUCCESS) - Error_Handler(); + // EEPROM emulation init + if (EEPROM_Init() != EEPROM_SUCCESS) + Error_Handler(); #ifdef DEBUG - DEBUG_UART_MSG("EEPROM init\n\r"); + DEBUG_UART_MSG("EEPROM init\n\r"); #endif - // Check EEPROM first run - EEPROM_ReadVariable(EEPROM_VAR_ID, (EEPROM_Value*)&result); - if ((uint16_t)result != 0xCA1C) { - EEPROM_WriteVariable(EEPROM_VAR_BCKL, (EEPROM_Value)(uint16_t)((DEFAULT_LCD_BL << 8) | DEFAULT_KBD_BL), EEPROM_SIZE16); - EEPROM_WriteVariable(EEPROM_VAR_KBD, (EEPROM_Value)(uint16_t)((10 << 8) | 5), EEPROM_SIZE16); - EEPROM_WriteVariable(EEPROM_VAR_CFG, (EEPROM_Value)(uint16_t)(CFG_OVERFLOW_INT | CFG_KEY_INT | CFG_USE_MODS | CFG_REPORT_MODS), EEPROM_SIZE16); - EEPROM_WriteVariable(EEPROM_VAR_ID, (EEPROM_Value)(uint16_t)0xCA1C, EEPROM_SIZE16); + // Check EEPROM first run + EEPROM_ReadVariable(EEPROM_VAR_ID, (EEPROM_Value*)&result); + if ((uint16_t)result != 0xCA1C) { + EEPROM_WriteVariable(EEPROM_VAR_BCKL, (EEPROM_Value)(uint16_t)((DEFAULT_LCD_BL << 8) | DEFAULT_KBD_BL), EEPROM_SIZE16); + EEPROM_WriteVariable(EEPROM_VAR_KBD, (EEPROM_Value)(uint16_t)((10 << 8) | 5), EEPROM_SIZE16); + EEPROM_WriteVariable(EEPROM_VAR_CFG, (EEPROM_Value)(uint16_t)(CFG_OVERFLOW_INT | CFG_KEY_INT | CFG_USE_MODS | CFG_REPORT_MODS), EEPROM_SIZE16); + EEPROM_WriteVariable(EEPROM_VAR_ID, (EEPROM_Value)(uint16_t)0xCA1C, EEPROM_SIZE16); #ifdef DEBUG - DEBUG_UART_MSG("EEPROM first start!\n\r"); + DEBUG_UART_MSG("EEPROM first start!\n\r"); #endif - } + } - // I2C-Pico interface registers - reg_init(); - if (HAL_I2C_EnableListen_IT(&hi2c1) != HAL_OK) - Error_Handler(); - HAL_Delay(10); + // I2C-Pico interface registers + reg_init(); + HAL_Delay(10); + if (HAL_I2C_EnableListen_IT(&hi2c1) != HAL_OK) + Error_Handler(); - // Check for AXP2101 is accessible on secondary I2C bus - //result = HAL_I2C_IsDeviceReady(&hi2c2, 0x68, 3, 40); - //if (result == HAL_OK) { - result = 0; - HAL_I2C_Mem_Read(&hi2c2, 0x68, XPOWERS_AXP2101_IC_TYPE, 1, (uint8_t*)&result, 1, 60); - if (result == XPOWERS_AXP2101_CHIP_ID) { + // Check for AXP2101 is accessible on secondary I2C bus + //result = HAL_I2C_IsDeviceReady(&hi2c2, 0x68, 3, 40); + //if (result == HAL_OK) { + result = 0; + HAL_I2C_Mem_Read(&hi2c2, 0x68, XPOWERS_AXP2101_IC_TYPE, 1, (uint8_t*)&result, 1, 60); + if (result == XPOWERS_AXP2101_CHIP_ID) { #ifdef DEBUG DEBUG_UART_MSG("PMU ID: "); DEBUG_UART_MSG2((uint32_t)result, 1, 0); DEBUG_UART_MSG("\n\r"); #endif pmu_online = 1; - } else { + } #ifdef DEBUG - DEBUG_UART_MSG("PMU not online!\n\r"); -#endif - } - - // Start LCD and KBD backlight PWM - lcd_backlight_off(); - if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1) != HAL_OK) - Error_Handler(); - kbd_backlight_on(); - if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3) != HAL_OK) - Error_Handler(); -#ifdef DEBUG - DEBUG_UART_MSG("Bckl params: "); - DEBUG_UART_MSG2(((uint32_t)result >> 8), 1, 1); - DEBUG_UART_MSG(", "); - DEBUG_UART_MSG2(((uint32_t)result & 0xFF), 1, 1); - DEBUG_UART_MSG("\n\r"); + else { + DEBUG_UART_MSG("PMU not online!\n\r"); + } #endif - keyboard_set_key_callback(key_cb); - - // Enable PICO power - LL_GPIO_SetOutputPin(PICO_EN_GPIO_Port, PICO_EN_Pin); + // Start LCD and KBD backlight PWM + lcd_backlight_off(); + if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1) != HAL_OK) + Error_Handler(); + kbd_backlight_on(); + if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3) != HAL_OK) + Error_Handler(); #ifdef DEBUG - DEBUG_UART_MSG("Pico started\n\r"); + DEBUG_UART_MSG("Bckl params: "); + DEBUG_UART_MSG2(((uint32_t)result >> 8), 1, 1); + DEBUG_UART_MSG(", "); + DEBUG_UART_MSG2(((uint32_t)result & 0xFF), 1, 1); + DEBUG_UART_MSG("\n\r"); +#endif + keyboard_set_key_callback(key_cb); + + // Enable PICO power + LL_GPIO_SetOutputPin(PICO_EN_GPIO_Port, PICO_EN_Pin); +#ifdef DEBUG + DEBUG_UART_MSG("Pico started\n\r"); #endif - // Enable speaker Amp. power - LL_GPIO_SetOutputPin(SP_AMP_EN_GPIO_Port, SP_AMP_EN_Pin); + // Enable speaker Amp. power + LL_GPIO_SetOutputPin(SP_AMP_EN_GPIO_Port, SP_AMP_EN_Pin); - HAL_Delay(500); - lcd_backlight_on(); + HAL_Delay(500); + lcd_backlight_on(); // It is necessary to disable the detection function of the TS pin on the // board without the battery temperature detection function, otherwise it will // cause abnormal charging - AXP2101_setSysPowerDownVoltage(2800); - AXP2101_disableTSPinMeasure(); - // AXP2101_enableTemperatureMeasure(); - AXP2101_enableBattDetection(); - AXP2101_enableVbusVoltageMeasure(); - AXP2101_enableBattVoltageMeasure(); - AXP2101_enableSystemVoltageMeasure(); + AXP2101_setSysPowerDownVoltage(2800); + AXP2101_disableTSPinMeasure(); + // AXP2101_enableTemperatureMeasure(); + AXP2101_enableBattDetection(); + AXP2101_enableVbusVoltageMeasure(); + AXP2101_enableBattVoltageMeasure(); + AXP2101_enableSystemVoltageMeasure(); - AXP2101_setChargingLedMode(XPOWERS_CHG_LED_CTRL_CHG); + AXP2101_setChargingLedMode(XPOWERS_CHG_LED_CTRL_CHG); - AXP2101_disableIRQ(XPOWERS_AXP2101_ALL_IRQ); - AXP2101_clearIrqStatus(); - AXP2101_enableIRQ(XPOWERS_AXP2101_BAT_INSERT_IRQ | + AXP2101_disableIRQ(XPOWERS_AXP2101_ALL_IRQ); + AXP2101_clearIrqStatus(); + AXP2101_enableIRQ(XPOWERS_AXP2101_BAT_INSERT_IRQ | XPOWERS_AXP2101_BAT_REMOVE_IRQ | // BATTERY XPOWERS_AXP2101_VBUS_INSERT_IRQ | XPOWERS_AXP2101_VBUS_REMOVE_IRQ | // VBUS @@ -397,9 +331,7 @@ int main(void) XPOWERS_AXP2101_PKEY_LONG_IRQ | // POWER KEY XPOWERS_AXP2101_BAT_CHG_DONE_IRQ | XPOWERS_AXP2101_BAT_CHG_START_IRQ // CHARGE - // XPOWERS_AXP2101_PKEY_NEGATIVE_IRQ | - // XPOWERS_AXP2101_PKEY_POSITIVE_IRQ | //POWER KEY - ); + ); // setLowBatWarnThreshold Range: 5% ~ 20% // The following data is obtained from actual testing , Please see the description below for the test method. // 20% ~= 3.7v @@ -407,7 +339,7 @@ int main(void) // 10% ~= 3.55V // 5% ~= 3.5V // 1% ~= 3.4V - AXP2101_setLowBatWarnThreshold(20); // Set to trigger interrupt when reaching 20% + AXP2101_setLowBatWarnThreshold(20); // Set to trigger interrupt when reaching 20% // setLowBatShutdownThreshold Range: 0% ~ 15% // The following data is obtained from actual testing , Please see the description below for the test method. @@ -415,586 +347,27 @@ int main(void) // 10% ~= 3.55V // 5% ~= 3.5V // 1% ~= 3.4V - AXP2101_setLowBatShutdownThreshold(5); //This is related to the battery charging and discharging logic. If you're not sure what you're doing, please don't modify it, as it could damage the battery. + AXP2101_setLowBatShutdownThreshold(5); //This is related to the battery charging and discharging logic. If you're not sure what you're doing, please don't modify it, as it could damage the battery. - keycb_start = 1; - sync_bat(); - low_bat(); - /* USER CODE END 2 */ + keycb_start = 1; + sync_bat(); + low_bat(); - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - while (1) - { - LL_IWDG_ReloadCounter(IWDG); - /* USER CODE END WHILE */ + while (1) { + LL_IWDG_ReloadCounter(IWDG); - /* USER CODE BEGIN 3 */ - // Re-arm I2CS in case of lost master signal - if (i2cs_state != I2CS_STATE_IDLE && i2cs_rearm_counter > I2CS_REARM_TIMEOUT) - i2cs_state = I2CS_STATE_IDLE; + // Re-arm I2CS in case of lost master signal + if (i2cs_state != I2CS_STATE_IDLE && i2cs_rearm_counter > I2CS_REARM_TIMEOUT) + i2cs_state = I2CS_STATE_IDLE; - reg_sync(); - check_pmu_int(); - keyboard_process(); - hw_check_HP_presence(); - //HAL_Delay(10); - } - /* USER CODE END 3 */ + reg_sync(); + check_pmu_int(); + keyboard_process(); + hw_check_HP_presence(); + } } -/** - * @brief System Clock Configuration - * @retval None - */ -void SystemClock_Config(void) -{ - LL_FLASH_SetLatency(LL_FLASH_LATENCY_0); - while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_0) - { - } - LL_RCC_HSE_Enable(); - /* Wait till HSE is ready */ - while(LL_RCC_HSE_IsReady() != 1) - { - - } - LL_RCC_LSI_Enable(); - - /* Wait till LSI is ready */ - while(LL_RCC_LSI_IsReady() != 1) - { - - } - LL_PWR_EnableBkUpAccess(); - if(LL_RCC_GetRTCClockSource() != LL_RCC_RTC_CLKSOURCE_LSE) - { - LL_RCC_ForceBackupDomainReset(); - LL_RCC_ReleaseBackupDomainReset(); - } - LL_RCC_LSE_Enable(); - - /* Wait till LSE is ready */ - while(LL_RCC_LSE_IsReady() != 1) - { - - } - if(LL_RCC_GetRTCClockSource() != LL_RCC_RTC_CLKSOURCE_LSE) - { - LL_RCC_SetRTCClockSource(LL_RCC_RTC_CLKSOURCE_LSE); - } - LL_RCC_EnableRTC(); - LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2); - LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); - LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); - LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE); - - /* Wait till System clock is ready */ - while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSE) - { - - } - LL_SetSystemCoreClock(4000000); - - /* Update the time base */ - if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK) - { - Error_Handler(); - } -} - -/** - * @brief I2C1 Initialization Function - * @param None - * @retval None - */ -static void MX_I2C1_Init(void) -{ - - /* USER CODE BEGIN I2C1_Init 0 */ - - /* USER CODE END I2C1_Init 0 */ - - /* USER CODE BEGIN I2C1_Init 1 */ - - /* USER CODE END I2C1_Init 1 */ - hi2c1.Instance = I2C1; - hi2c1.Init.ClockSpeed = 10000; - hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; - hi2c1.Init.OwnAddress1 = 62; - hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; - hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; - hi2c1.Init.OwnAddress2 = 0; - hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; - hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - if (HAL_I2C_Init(&hi2c1) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN I2C1_Init 2 */ - - /* USER CODE END I2C1_Init 2 */ - -} - -/** - * @brief I2C2 Initialization Function - * @param None - * @retval None - */ -static void MX_I2C2_Init(void) -{ - - /* USER CODE BEGIN I2C2_Init 0 */ - - /* USER CODE END I2C2_Init 0 */ - - /* USER CODE BEGIN I2C2_Init 1 */ - - /* USER CODE END I2C2_Init 1 */ - hi2c2.Instance = I2C2; - hi2c2.Init.ClockSpeed = 100000; - hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2; - hi2c2.Init.OwnAddress1 = 0; - hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; - hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; - hi2c2.Init.OwnAddress2 = 0; - hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; - hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - if (HAL_I2C_Init(&hi2c2) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN I2C2_Init 2 */ - - /* USER CODE END I2C2_Init 2 */ - -} - -/** - * @brief IWDG Initialization Function - * @param None - * @retval None - */ -static void MX_IWDG_Init(void) -{ - - /* USER CODE BEGIN IWDG_Init 0 */ - - /* USER CODE END IWDG_Init 0 */ - - /* USER CODE BEGIN IWDG_Init 1 */ -#ifndef DEBUG - /* USER CODE END IWDG_Init 1 */ - LL_IWDG_Enable(IWDG); - LL_IWDG_EnableWriteAccess(IWDG); - LL_IWDG_SetPrescaler(IWDG, LL_IWDG_PRESCALER_32); - LL_IWDG_SetReloadCounter(IWDG, 4095); - while (LL_IWDG_IsReady(IWDG) != 1) - { - } - - LL_IWDG_ReloadCounter(IWDG); - /* USER CODE BEGIN IWDG_Init 2 */ -#endif - /* USER CODE END IWDG_Init 2 */ - -} - -/** - * @brief RTC Initialization Function - * @param None - * @retval None - */ -static void MX_RTC_Init(void) -{ - - /* USER CODE BEGIN RTC_Init 0 */ - - /* USER CODE END RTC_Init 0 */ - - LL_RTC_InitTypeDef RTC_InitStruct = {0}; - LL_RTC_TimeTypeDef RTC_TimeStruct = {0}; - - LL_PWR_EnableBkUpAccess(); - /* Enable BKP CLK enable for backup registers */ - LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_BKP); - /* Peripheral clock enable */ - LL_RCC_EnableRTC(); - - /* USER CODE BEGIN RTC_Init 1 */ - - /* USER CODE END RTC_Init 1 */ - - /** Initialize RTC and set the Time and Date - */ - RTC_InitStruct.AsynchPrescaler = 0xFFFFFFFFU; - LL_RTC_Init(RTC, &RTC_InitStruct); - LL_RTC_SetAsynchPrescaler(RTC, 0xFFFFFFFFU); - - /** Initialize RTC and set the Time and Date - */ - RTC_TimeStruct.Hours = 0; - RTC_TimeStruct.Minutes = 0; - RTC_TimeStruct.Seconds = 0; - LL_RTC_TIME_Init(RTC, LL_RTC_FORMAT_BCD, &RTC_TimeStruct); - - /** Initialize RTC and set the Time and Date - */ - /* USER CODE BEGIN RTC_Init 2 */ - - /* USER CODE END RTC_Init 2 */ - -} - -/** - * @brief TIM1 Initialization Function - * @param None - * @retval None - */ -static void MX_TIM1_Init(void) -{ - - /* USER CODE BEGIN TIM1_Init 0 */ - - /* USER CODE END TIM1_Init 0 */ - - TIM_ClockConfigTypeDef sClockSourceConfig = {0}; - TIM_MasterConfigTypeDef sMasterConfig = {0}; - TIM_OC_InitTypeDef sConfigOC = {0}; - TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; - - /* USER CODE BEGIN TIM1_Init 1 */ - - /* USER CODE END TIM1_Init 1 */ - htim1.Instance = TIM1; - htim1.Init.Prescaler = 0; - htim1.Init.CounterMode = TIM_COUNTERMODE_UP; - htim1.Init.Period = 800; - htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim1.Init.RepetitionCounter = 0; - htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; - if (HAL_TIM_Base_Init(&htim1) != HAL_OK) - { - Error_Handler(); - } - sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; - if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) - { - Error_Handler(); - } - if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) - { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) - { - Error_Handler(); - } - sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 0; - sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; - sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; - sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; - sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; - sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; - if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) - { - Error_Handler(); - } - sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; - sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; - sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; - sBreakDeadTimeConfig.DeadTime = 0; - sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; - sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; - sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; - if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN TIM1_Init 2 */ - - /* USER CODE END TIM1_Init 2 */ - HAL_TIM_MspPostInit(&htim1); - -} - -/** - * @brief TIM2 Initialization Function - * @param None - * @retval None - */ -static void MX_TIM2_Init(void) -{ - - /* USER CODE BEGIN TIM2_Init 0 */ - - /* USER CODE END TIM2_Init 0 */ - - TIM_ClockConfigTypeDef sClockSourceConfig = {0}; - TIM_MasterConfigTypeDef sMasterConfig = {0}; - - /* USER CODE BEGIN TIM2_Init 1 */ - - /* USER CODE END TIM2_Init 1 */ - htim2.Instance = TIM2; - htim2.Init.Prescaler = 4-1; - htim2.Init.CounterMode = TIM_COUNTERMODE_UP; - htim2.Init.Period = 1000; - htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; - if (HAL_TIM_Base_Init(&htim2) != HAL_OK) - { - Error_Handler(); - } - sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; - if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) - { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN TIM2_Init 2 */ - - /* USER CODE END TIM2_Init 2 */ - -} - -/** - * @brief TIM3 Initialization Function - * @param None - * @retval None - */ -static void MX_TIM3_Init(void) -{ - - /* USER CODE BEGIN TIM3_Init 0 */ - - /* USER CODE END TIM3_Init 0 */ - - TIM_ClockConfigTypeDef sClockSourceConfig = {0}; - TIM_MasterConfigTypeDef sMasterConfig = {0}; - TIM_OC_InitTypeDef sConfigOC = {0}; - - /* USER CODE BEGIN TIM3_Init 1 */ - - /* USER CODE END TIM3_Init 1 */ - htim3.Instance = TIM3; - htim3.Init.Prescaler = 0; - htim3.Init.CounterMode = TIM_COUNTERMODE_UP; - htim3.Init.Period = 512; - htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; - if (HAL_TIM_Base_Init(&htim3) != HAL_OK) - { - Error_Handler(); - } - sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; - if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) - { - Error_Handler(); - } - if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) - { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) - { - Error_Handler(); - } - sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 0; - sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; - sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; - if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN TIM3_Init 2 */ - - /* USER CODE END TIM3_Init 2 */ - HAL_TIM_MspPostInit(&htim3); - -} - -/** - * @brief USART1 Initialization Function - * @param None - * @retval None - */ -static void MX_USART1_UART_Init(void) -{ - - /* USER CODE BEGIN USART1_Init 0 */ - - /* USER CODE END USART1_Init 0 */ - - /* USER CODE BEGIN USART1_Init 1 */ -#ifdef DEBUG - /* USER CODE END USART1_Init 1 */ - huart1.Instance = USART1; - huart1.Init.BaudRate = 115200; - huart1.Init.WordLength = UART_WORDLENGTH_8B; - huart1.Init.StopBits = UART_STOPBITS_1; - huart1.Init.Parity = UART_PARITY_NONE; - huart1.Init.Mode = UART_MODE_TX_RX; - huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; - huart1.Init.OverSampling = UART_OVERSAMPLING_16; - if (HAL_UART_Init(&huart1) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN USART1_Init 2 */ -#endif - /* USER CODE END USART1_Init 2 */ - -} - -/** - * @brief USART3 Initialization Function - * @param None - * @retval None - */ -static void MX_USART3_UART_Init(void) -{ - - /* USER CODE BEGIN USART3_Init 0 */ - - /* USER CODE END USART3_Init 0 */ - - /* USER CODE BEGIN USART3_Init 1 */ -#ifdef UART_PICO_INTERFACE - /* USER CODE END USART3_Init 1 */ - huart3.Instance = USART3; - huart3.Init.BaudRate = 115200; - huart3.Init.WordLength = UART_WORDLENGTH_8B; - huart3.Init.StopBits = UART_STOPBITS_1; - huart3.Init.Parity = UART_PARITY_NONE; - huart3.Init.Mode = UART_MODE_TX_RX; - huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; - huart3.Init.OverSampling = UART_OVERSAMPLING_16; - if (HAL_UART_Init(&huart3) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN USART3_Init 2 */ -#endif - /* USER CODE END USART3_Init 2 */ - -} - -/** - * @brief GPIO Initialization Function - * @param None - * @retval None - */ -static void MX_GPIO_Init(void) -{ - LL_EXTI_InitTypeDef EXTI_InitStruct = {0}; - LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; - /* USER CODE BEGIN MX_GPIO_Init_1 */ - - /* USER CODE END MX_GPIO_Init_1 */ - - /* GPIO Ports Clock Enable */ - LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC); - LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOD); - LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA); - LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB); - - /**/ - LL_GPIO_SetOutputPin(GPIOC, SYS_LED_Pin|COL_1_Pin|COL_2_Pin|COL_3_Pin - |COL_4_Pin|COL_5_Pin|COL_6_Pin|COL_7_Pin - |COL_8_Pin); - - /**/ - LL_GPIO_ResetOutputPin(GPIOA, PICO_EN_Pin|SP_AMP_EN_Pin); - - /**/ - GPIO_InitStruct.Pin = SYS_LED_Pin; - GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM; - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; - LL_GPIO_Init(SYS_LED_GPIO_Port, &GPIO_InitStruct); - - /**/ - GPIO_InitStruct.Pin = COL_1_Pin|COL_2_Pin|COL_3_Pin|COL_4_Pin - |COL_5_Pin|COL_6_Pin|COL_7_Pin|COL_8_Pin; - GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; - LL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - /**/ - GPIO_InitStruct.Pin = ROW_1_Pin|ROW_2_Pin|ROW_3_Pin|ROW_4_Pin - |ROW_5_Pin|ROW_6_Pin|ROW_7_Pin|ROW_8_Pin; - GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; - LL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /**/ - GPIO_InitStruct.Pin = KEY_1_Pin|KEY_2_Pin|KEY_3_Pin|KEY_9_Pin - |KEY_10_Pin|KEY_11_Pin|KEY_12_Pin|KEY_4_Pin - |KEY_5_Pin|KEY_6_Pin|KEY_7_Pin|KEY_8_Pin; - GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; - LL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /**/ - GPIO_InitStruct.Pin = LL_GPIO_PIN_11|LL_GPIO_PIN_12|LL_GPIO_PIN_15; - GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; - LL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /**/ - GPIO_InitStruct.Pin = PICO_EN_Pin|SP_AMP_EN_Pin; - GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; - LL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /**/ - GPIO_InitStruct.Pin = HP_DET_Pin; - GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING; - LL_GPIO_Init(HP_DET_GPIO_Port, &GPIO_InitStruct); - - /**/ - GPIO_InitStruct.Pin = LL_GPIO_PIN_2; - GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; - LL_GPIO_Init(GPIOD, &GPIO_InitStruct); - - /**/ - LL_GPIO_AF_SetEXTISource(LL_GPIO_AF_EXTI_PORTC, LL_GPIO_AF_EXTI_LINE9); - - /**/ - EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_9; - EXTI_InitStruct.LineCommand = ENABLE; - EXTI_InitStruct.Mode = LL_EXTI_MODE_IT; - EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_FALLING; - LL_EXTI_Init(&EXTI_InitStruct); - - /**/ - LL_GPIO_SetPinMode(PMU_IRQ_GPIO_Port, PMU_IRQ_Pin, LL_GPIO_MODE_FLOATING); - - /* EXTI interrupt init*/ - NVIC_SetPriority(EXTI9_5_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),3, 0)); - NVIC_EnableIRQ(EXTI9_5_IRQn); - - /* USER CODE BEGIN MX_GPIO_Init_2 */ - - /* USER CODE END MX_GPIO_Init_2 */ -} - -/* USER CODE BEGIN 4 */ /* static void lock_cb(uint8_t caps_changed, uint8_t num_changed) { //uint8_t do_int = 0; @@ -1272,37 +645,3 @@ __STATIC_INLINE void check_pmu_int(void) { AXP2101_clearIrqStatus(); } } -/* USER CODE END 4 */ - -/** - * @brief This function is executed in case of error occurrence. - * @retval None - */ -void Error_Handler(void) -{ - /* USER CODE BEGIN Error_Handler_Debug */ - /* User can add his own implementation to report the HAL error return state */ - __disable_irq(); - while (1) { - //LL_GPIO_TogglePin(SYS_LED_GPIO_Port, SYS_LED_Pin); - HAL_Delay(500); - } - /* USER CODE END Error_Handler_Debug */ -} - -#ifdef USE_FULL_ASSERT -/** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ -void assert_failed(uint8_t *file, uint32_t line) -{ - /* USER CODE BEGIN 6 */ - /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ -} -#endif /* USE_FULL_ASSERT */ diff --git a/Core/Src/regs.c b/Core/Src/regs.c index b433d46..8741abc 100644 --- a/Core/Src/regs.c +++ b/Core/Src/regs.c @@ -1,7 +1,8 @@ #include "regs.h" -#include "main.h" + +#include "hal_interface.h" #include "eeprom.h" -#include "backlight.h" +#include "version.h" static uint8_t regs[REG_ID_LAST] = {0}; @@ -59,6 +60,8 @@ inline void reg_set_bit(enum reg_id reg, uint8_t bit) { void reg_init(void) { uint16_t buff; + regs[REG_ID_VER] = (uint8_t)((VERSION_MAJOR << 4) | VERSION_MINOR); // 1.2 => (0x1 << 4) | 0x2 + EEPROM_ReadVariable(EEPROM_VAR_CFG, (EEPROM_Value*)&buff); regs[REG_ID_CFG] = (uint8_t)(buff & 0xFF); @@ -72,6 +75,8 @@ void reg_init(void) { regs[REG_ID_BAT] = 0; //default .no battery ,no charging + regs[REG_ID_TYP] = 0xCA; // That's me :3 + eeprom_refresh_counter = uptime_ms(); } diff --git a/Core/Src/stm32f1xx_hal_msp.c b/Core/Src/stm32f1xx_hal_msp.c deleted file mode 100644 index 720019d..0000000 --- a/Core/Src/stm32f1xx_hal_msp.c +++ /dev/null @@ -1,468 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f1xx_hal_msp.c - * @brief This file provides code for the MSP Initialization - * and de-Initialization codes. - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN Define */ - -/* USER CODE END Define */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN Macro */ - -/* USER CODE END Macro */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* External functions --------------------------------------------------------*/ -/* USER CODE BEGIN ExternalFunctions */ - -/* USER CODE END ExternalFunctions */ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); - /** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) -{ - - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - - __HAL_RCC_AFIO_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - - /** DISABLE: JTAG-DP Disabled and SW-DP Disabled - */ - __HAL_AFIO_REMAP_SWJ_DISABLE(); - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/** - * @brief I2C MSP Initialization - * This function configures the hardware resources used in this example - * @param hi2c: I2C handle pointer - * @retval None - */ -void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(hi2c->Instance==I2C1) - { - /* USER CODE BEGIN I2C1_MspInit 0 */ - - /* USER CODE END I2C1_MspInit 0 */ - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**I2C1 GPIO Configuration - PB8 ------> I2C1_SCL - PB9 ------> I2C1_SDA - */ - GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - __HAL_AFIO_REMAP_I2C1_ENABLE(); - - /* Peripheral clock enable */ - __HAL_RCC_I2C1_CLK_ENABLE(); - /* I2C1 interrupt Init */ - HAL_NVIC_SetPriority(I2C1_EV_IRQn, 2, 0); - HAL_NVIC_EnableIRQ(I2C1_EV_IRQn); - HAL_NVIC_SetPriority(I2C1_ER_IRQn, 2, 0); - HAL_NVIC_EnableIRQ(I2C1_ER_IRQn); - /* USER CODE BEGIN I2C1_MspInit 1 */ - - /* USER CODE END I2C1_MspInit 1 */ - } - else if(hi2c->Instance==I2C2) - { - /* USER CODE BEGIN I2C2_MspInit 0 */ - - /* USER CODE END I2C2_MspInit 0 */ - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**I2C2 GPIO Configuration - PB10 ------> I2C2_SCL - PB11 ------> I2C2_SDA - */ - GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* Peripheral clock enable */ - __HAL_RCC_I2C2_CLK_ENABLE(); - /* USER CODE BEGIN I2C2_MspInit 1 */ - - /* USER CODE END I2C2_MspInit 1 */ - } - -} - -/** - * @brief I2C MSP De-Initialization - * This function freeze the hardware resources used in this example - * @param hi2c: I2C handle pointer - * @retval None - */ -void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c) -{ - if(hi2c->Instance==I2C1) - { - /* USER CODE BEGIN I2C1_MspDeInit 0 */ - - /* USER CODE END I2C1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_I2C1_CLK_DISABLE(); - - /**I2C1 GPIO Configuration - PB8 ------> I2C1_SCL - PB9 ------> I2C1_SDA - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8); - - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_9); - - /* I2C1 interrupt DeInit */ - HAL_NVIC_DisableIRQ(I2C1_EV_IRQn); - HAL_NVIC_DisableIRQ(I2C1_ER_IRQn); - /* USER CODE BEGIN I2C1_MspDeInit 1 */ - - /* USER CODE END I2C1_MspDeInit 1 */ - } - else if(hi2c->Instance==I2C2) - { - /* USER CODE BEGIN I2C2_MspDeInit 0 */ - - /* USER CODE END I2C2_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_I2C2_CLK_DISABLE(); - - /**I2C2 GPIO Configuration - PB10 ------> I2C2_SCL - PB11 ------> I2C2_SDA - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10); - - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_11); - - /* USER CODE BEGIN I2C2_MspDeInit 1 */ - - /* USER CODE END I2C2_MspDeInit 1 */ - } - -} - -/** - * @brief TIM_Base MSP Initialization - * This function configures the hardware resources used in this example - * @param htim_base: TIM_Base handle pointer - * @retval None - */ -void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) -{ - if(htim_base->Instance==TIM1) - { - /* USER CODE BEGIN TIM1_MspInit 0 */ - - /* USER CODE END TIM1_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM1_CLK_ENABLE(); - /* USER CODE BEGIN TIM1_MspInit 1 */ - - /* USER CODE END TIM1_MspInit 1 */ - } - else if(htim_base->Instance==TIM2) - { - /* USER CODE BEGIN TIM2_MspInit 0 */ - - /* USER CODE END TIM2_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM2_CLK_ENABLE(); - /* TIM2 interrupt Init */ - HAL_NVIC_SetPriority(TIM2_IRQn, 1, 0); - HAL_NVIC_EnableIRQ(TIM2_IRQn); - /* USER CODE BEGIN TIM2_MspInit 1 */ - - /* USER CODE END TIM2_MspInit 1 */ - } - else if(htim_base->Instance==TIM3) - { - /* USER CODE BEGIN TIM3_MspInit 0 */ - - /* USER CODE END TIM3_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM3_CLK_ENABLE(); - /* USER CODE BEGIN TIM3_MspInit 1 */ - - /* USER CODE END TIM3_MspInit 1 */ - } - -} - -void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(htim->Instance==TIM1) - { - /* USER CODE BEGIN TIM1_MspPostInit 0 */ - - /* USER CODE END TIM1_MspPostInit 0 */ - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**TIM1 GPIO Configuration - PA8 ------> TIM1_CH1 - */ - GPIO_InitStruct.Pin = GPIO_PIN_8; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN TIM1_MspPostInit 1 */ - - /* USER CODE END TIM1_MspPostInit 1 */ - } - else if(htim->Instance==TIM3) - { - /* USER CODE BEGIN TIM3_MspPostInit 0 */ - - /* USER CODE END TIM3_MspPostInit 0 */ - - __HAL_RCC_GPIOC_CLK_ENABLE(); - /**TIM3 GPIO Configuration - PC8 ------> TIM3_CH3 - */ - GPIO_InitStruct.Pin = GPIO_PIN_8; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - __HAL_AFIO_REMAP_TIM3_ENABLE(); - - /* USER CODE BEGIN TIM3_MspPostInit 1 */ - - /* USER CODE END TIM3_MspPostInit 1 */ - } - -} -/** - * @brief TIM_Base MSP De-Initialization - * This function freeze the hardware resources used in this example - * @param htim_base: TIM_Base handle pointer - * @retval None - */ -void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) -{ - if(htim_base->Instance==TIM1) - { - /* USER CODE BEGIN TIM1_MspDeInit 0 */ - - /* USER CODE END TIM1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_TIM1_CLK_DISABLE(); - /* USER CODE BEGIN TIM1_MspDeInit 1 */ - - /* USER CODE END TIM1_MspDeInit 1 */ - } - else if(htim_base->Instance==TIM2) - { - /* USER CODE BEGIN TIM2_MspDeInit 0 */ - - /* USER CODE END TIM2_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_TIM2_CLK_DISABLE(); - - /* TIM2 interrupt DeInit */ - HAL_NVIC_DisableIRQ(TIM2_IRQn); - /* USER CODE BEGIN TIM2_MspDeInit 1 */ - - /* USER CODE END TIM2_MspDeInit 1 */ - } - else if(htim_base->Instance==TIM3) - { - /* USER CODE BEGIN TIM3_MspDeInit 0 */ - - /* USER CODE END TIM3_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_TIM3_CLK_DISABLE(); - /* USER CODE BEGIN TIM3_MspDeInit 1 */ - - /* USER CODE END TIM3_MspDeInit 1 */ - } - -} - -/** - * @brief UART MSP Initialization - * This function configures the hardware resources used in this example - * @param huart: UART handle pointer - * @retval None - */ -void HAL_UART_MspInit(UART_HandleTypeDef* huart) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(huart->Instance==USART1) - { - /* USER CODE BEGIN USART1_MspInit 0 */ - - /* USER CODE END USART1_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_USART1_CLK_ENABLE(); - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**USART1 GPIO Configuration - PA9 ------> USART1_TX - PA10 ------> USART1_RX - */ - GPIO_InitStruct.Pin = GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_10; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USART1 interrupt Init */ - HAL_NVIC_SetPriority(USART1_IRQn, 4, 0); - HAL_NVIC_EnableIRQ(USART1_IRQn); - /* USER CODE BEGIN USART1_MspInit 1 */ - - /* USER CODE END USART1_MspInit 1 */ - } - else if(huart->Instance==USART3) - { - /* USER CODE BEGIN USART3_MspInit 0 */ - - /* USER CODE END USART3_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_USART3_CLK_ENABLE(); - - __HAL_RCC_GPIOC_CLK_ENABLE(); - /**USART3 GPIO Configuration - PC10 ------> USART3_TX - PC11 ------> USART3_RX - */ - GPIO_InitStruct.Pin = GPIO_PIN_10; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_11; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - __HAL_AFIO_REMAP_USART3_PARTIAL(); - - /* USART3 interrupt Init */ - HAL_NVIC_SetPriority(USART3_IRQn, 3, 0); - HAL_NVIC_EnableIRQ(USART3_IRQn); - /* USER CODE BEGIN USART3_MspInit 1 */ - - /* USER CODE END USART3_MspInit 1 */ - } - -} - -/** - * @brief UART MSP De-Initialization - * This function freeze the hardware resources used in this example - * @param huart: UART handle pointer - * @retval None - */ -void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) -{ - if(huart->Instance==USART1) - { - /* USER CODE BEGIN USART1_MspDeInit 0 */ - - /* USER CODE END USART1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_USART1_CLK_DISABLE(); - - /**USART1 GPIO Configuration - PA9 ------> USART1_TX - PA10 ------> USART1_RX - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); - - /* USART1 interrupt DeInit */ - HAL_NVIC_DisableIRQ(USART1_IRQn); - /* USER CODE BEGIN USART1_MspDeInit 1 */ - - /* USER CODE END USART1_MspDeInit 1 */ - } - else if(huart->Instance==USART3) - { - /* USER CODE BEGIN USART3_MspDeInit 0 */ - - /* USER CODE END USART3_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_USART3_CLK_DISABLE(); - - /**USART3 GPIO Configuration - PC10 ------> USART3_TX - PC11 ------> USART3_RX - */ - HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10|GPIO_PIN_11); - - /* USART3 interrupt DeInit */ - HAL_NVIC_DisableIRQ(USART3_IRQn); - /* USER CODE BEGIN USART3_MspDeInit 1 */ - - /* USER CODE END USART3_MspDeInit 1 */ - } - -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/Core/Src/stm32f1xx_it.c b/Core/Src/stm32f1xx_it.c index 38b0bc2..276b493 100644 --- a/Core/Src/stm32f1xx_it.c +++ b/Core/Src/stm32f1xx_it.c @@ -1,67 +1,29 @@ -/* USER CODE BEGIN Header */ /** ****************************************************************************** - * @file stm32f1xx_it.c - * @brief Interrupt Service Routines. - ****************************************************************************** - * @attention * - * Copyright (c) 2025 STMicroelectronics. + * Copyright (c) 2025 C.ARE (JackCarterSmith). * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** + * */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "main.h" +#include "hal_interface.h" #include "stm32f1xx_it.h" -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -/* USER CODE END Includes */ -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/* External variables --------------------------------------------------------*/ extern I2C_HandleTypeDef hi2c1; extern TIM_HandleTypeDef htim2; +#ifdef DEBUG extern UART_HandleTypeDef huart1; +#endif +#ifdef UART_PICO_INTERFACE extern UART_HandleTypeDef huart3; -/* USER CODE BEGIN EV */ +#endif -/* USER CODE END EV */ /******************************************************************************/ /* Cortex-M3 Processor Interruption and Exception Handlers */ @@ -69,129 +31,64 @@ extern UART_HandleTypeDef huart3; /** * @brief This function handles Non maskable interrupt. */ -void NMI_Handler(void) -{ - /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ - - /* USER CODE END NonMaskableInt_IRQn 0 */ - /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ - while (1) - { - } - /* USER CODE END NonMaskableInt_IRQn 1 */ +void NMI_Handler(void) { + while (1) {} } /** * @brief This function handles Hard fault interrupt. */ -void HardFault_Handler(void) -{ - /* USER CODE BEGIN HardFault_IRQn 0 */ - - /* USER CODE END HardFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_HardFault_IRQn 0 */ - /* USER CODE END W1_HardFault_IRQn 0 */ - } +void HardFault_Handler(void) { + while (1) {} } /** * @brief This function handles Memory management fault. */ -void MemManage_Handler(void) -{ - /* USER CODE BEGIN MemoryManagement_IRQn 0 */ - - /* USER CODE END MemoryManagement_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ - /* USER CODE END W1_MemoryManagement_IRQn 0 */ - } +void MemManage_Handler(void) { + while (1) {} } /** * @brief This function handles Prefetch fault, memory access fault. */ -void BusFault_Handler(void) -{ - /* USER CODE BEGIN BusFault_IRQn 0 */ - - /* USER CODE END BusFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_BusFault_IRQn 0 */ - /* USER CODE END W1_BusFault_IRQn 0 */ - } +void BusFault_Handler(void) { + while (1) {} } /** * @brief This function handles Undefined instruction or illegal state. */ -void UsageFault_Handler(void) -{ - /* USER CODE BEGIN UsageFault_IRQn 0 */ - - /* USER CODE END UsageFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ - /* USER CODE END W1_UsageFault_IRQn 0 */ - } +void UsageFault_Handler(void) { + while (1) {} } /** * @brief This function handles System service call via SWI instruction. */ -void SVC_Handler(void) -{ - /* USER CODE BEGIN SVCall_IRQn 0 */ - - /* USER CODE END SVCall_IRQn 0 */ - /* USER CODE BEGIN SVCall_IRQn 1 */ - - /* USER CODE END SVCall_IRQn 1 */ +void SVC_Handler(void) { + while (1) {} } /** * @brief This function handles Debug monitor. */ -void DebugMon_Handler(void) -{ - /* USER CODE BEGIN DebugMonitor_IRQn 0 */ +void DebugMon_Handler(void) { - /* USER CODE END DebugMonitor_IRQn 0 */ - /* USER CODE BEGIN DebugMonitor_IRQn 1 */ - - /* USER CODE END DebugMonitor_IRQn 1 */ } /** * @brief This function handles Pendable request for system service. */ -void PendSV_Handler(void) -{ - /* USER CODE BEGIN PendSV_IRQn 0 */ +void PendSV_Handler(void) { - /* USER CODE END PendSV_IRQn 0 */ - /* USER CODE BEGIN PendSV_IRQn 1 */ - - /* USER CODE END PendSV_IRQn 1 */ } /** * @brief This function handles System tick timer. */ -void SysTick_Handler(void) -{ - /* USER CODE BEGIN SysTick_IRQn 0 */ - - /* USER CODE END SysTick_IRQn 0 */ - HAL_IncTick(); - /* USER CODE BEGIN SysTick_IRQn 1 */ - - /* USER CODE END SysTick_IRQn 1 */ +void SysTick_Handler(void) { + HAL_IncTick(); } /******************************************************************************/ @@ -204,93 +101,48 @@ void SysTick_Handler(void) /** * @brief This function handles EXTI line[9:5] interrupts. */ -void EXTI9_5_IRQHandler(void) -{ - /* USER CODE BEGIN EXTI9_5_IRQn 0 */ +void EXTI9_5_IRQHandler(void) { + if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_9) != RESET) { + LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_9); - /* USER CODE END EXTI9_5_IRQn 0 */ - if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_9) != RESET) - { - LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_9); - /* USER CODE BEGIN LL_EXTI_LINE_9 */ - pmu_irq = 1; - /* USER CODE END LL_EXTI_LINE_9 */ - } - /* USER CODE BEGIN EXTI9_5_IRQn 1 */ - - /* USER CODE END EXTI9_5_IRQn 1 */ + pmu_irq = 1; + } } /** * @brief This function handles TIM2 global interrupt. */ -void TIM2_IRQHandler(void) -{ - /* USER CODE BEGIN TIM2_IRQn 0 */ - - /* USER CODE END TIM2_IRQn 0 */ - HAL_TIM_IRQHandler(&htim2); - /* USER CODE BEGIN TIM2_IRQn 1 */ - - /* USER CODE END TIM2_IRQn 1 */ +void TIM2_IRQHandler(void) { + HAL_TIM_IRQHandler(&htim2); } /** * @brief This function handles I2C1 event interrupt. */ -void I2C1_EV_IRQHandler(void) -{ - /* USER CODE BEGIN I2C1_EV_IRQn 0 */ - - /* USER CODE END I2C1_EV_IRQn 0 */ - HAL_I2C_EV_IRQHandler(&hi2c1); - /* USER CODE BEGIN I2C1_EV_IRQn 1 */ - - /* USER CODE END I2C1_EV_IRQn 1 */ +void I2C1_EV_IRQHandler(void) { + HAL_I2C_EV_IRQHandler(&hi2c1); } /** * @brief This function handles I2C1 error interrupt. */ -void I2C1_ER_IRQHandler(void) -{ - /* USER CODE BEGIN I2C1_ER_IRQn 0 */ - - /* USER CODE END I2C1_ER_IRQn 0 */ - HAL_I2C_ER_IRQHandler(&hi2c1); - /* USER CODE BEGIN I2C1_ER_IRQn 1 */ - - /* USER CODE END I2C1_ER_IRQn 1 */ +void I2C1_ER_IRQHandler(void) { + HAL_I2C_ER_IRQHandler(&hi2c1); } +#ifdef DEBUG /** * @brief This function handles USART1 global interrupt. */ -void USART1_IRQHandler(void) -{ - /* USER CODE BEGIN USART1_IRQn 0 */ - - /* USER CODE END USART1_IRQn 0 */ - HAL_UART_IRQHandler(&huart1); - /* USER CODE BEGIN USART1_IRQn 1 */ - - /* USER CODE END USART1_IRQn 1 */ +void USART1_IRQHandler(void) { + HAL_UART_IRQHandler(&huart1); } - +#endif +#ifdef UART_PICO_INTERFACE /** * @brief This function handles USART3 global interrupt. */ -void USART3_IRQHandler(void) -{ - /* USER CODE BEGIN USART3_IRQn 0 */ - - /* USER CODE END USART3_IRQn 0 */ - HAL_UART_IRQHandler(&huart3); - /* USER CODE BEGIN USART3_IRQn 1 */ - - /* USER CODE END USART3_IRQn 1 */ +void USART3_IRQHandler(void) { + HAL_UART_IRQHandler(&huart3); } - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ +#endif