diff --git a/BSP/stm32wlxx_nucleo_radio.c b/BSP/stm32wlxx_nucleo_radio.c index dcdf78d..15d4143 100644 --- a/BSP/stm32wlxx_nucleo_radio.c +++ b/BSP/stm32wlxx_nucleo_radio.c @@ -8,7 +8,7 @@ ****************************************************************************** * @attention * - * Copyright (c) 2020(-2021) STMicroelectronics. + * Copyright (c) 2020-2021 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file @@ -23,7 +23,7 @@ /** @addtogroup BSP * @{ - */ + */ /** @addtogroup STM32WLXX_NUCLEO * @{ @@ -155,7 +155,7 @@ int32_t BSP_RADIO_ConfigRFSwitch(BSP_RADIO_Switch_TypeDef Config) */ int32_t BSP_RADIO_GetTxConfig(void) { - return RADIO_CONF_RFO_HP; + return RADIO_CONF_RFO_HP; } /** @@ -167,7 +167,6 @@ int32_t BSP_RADIO_GetTxConfig(void) */ int32_t BSP_RADIO_IsTCXO(void) { - //return RADIO_CONF_TCXO_SUPPORTED; return RADIO_CONF_TCXO_NOT_SUPPORTED; } @@ -182,6 +181,7 @@ int32_t BSP_RADIO_IsDCDC(void) { return RADIO_CONF_DCDC_SUPPORTED; } + /** * @brief Return RF Output Max Power Configuration * @retval @@ -203,6 +203,7 @@ int32_t BSP_RADIO_GetRFOMaxPowerConfig(BSP_RADIO_RFOMaxPowerConfig_TypeDef Confi return ret; } + /** * @} */ @@ -217,6 +218,4 @@ int32_t BSP_RADIO_GetRFOMaxPowerConfig(BSP_RADIO_RFOMaxPowerConfig_TypeDef Confi /** * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + */ diff --git a/CMakeLists.txt b/CMakeLists.txt index 1fe694c..1699e60 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,23 +14,27 @@ set(TARGET_SOURCES "BSP/stm32wlxx_nucleo_radio.c" "MX_Generated/startup_stm32wle5xx.s" "MX_Generated/Core/Src/adc.c" + "MX_Generated/Core/Src/dma.c" "MX_Generated/Core/Src/gpio.c" "MX_Generated/Core/Src/main.c" "MX_Generated/Core/Src/rtc.c" - "MX_Generated/Core/Src/stm32_adv_trace_if.c" "MX_Generated/Core/Src/stm32_lpm_if.c" "MX_Generated/Core/Src/stm32wlxx_hal_msp.c" "MX_Generated/Core/Src/stm32wlxx_it.c" "MX_Generated/Core/Src/subghz.c" "MX_Generated/Core/Src/sys_app.c" + "MX_Generated/Core/Src/sys_debug.c" "MX_Generated/Core/Src/system_stm32wlxx.c" "MX_Generated/Core/Src/timer_if.c" "MX_Generated/Core/Src/usart.c" + "MX_Generated/Core/Src/usart_if.c" "MX_Generated/SubGHz_Phy/App/app_subghz_phy.c" "MX_Generated/SubGHz_Phy/App/subghz_phy_app.c" "MX_Generated/SubGHz_Phy/Target/radio_board_if.c" "SDK/Drivers/STM32WLxx_HAL_Driver/Src/stm32wlxx_hal.c" "SDK/Drivers/STM32WLxx_HAL_Driver/Src/stm32wlxx_hal_cortex.c" + "SDK/Drivers/STM32WLxx_HAL_Driver/Src/stm32wlxx_hal_dma.c" + "SDK/Drivers/STM32WLxx_HAL_Driver/Src/stm32wlxx_hal_dma_ex.c" "SDK/Drivers/STM32WLxx_HAL_Driver/Src/stm32wlxx_hal_gpio.c" "SDK/Drivers/STM32WLxx_HAL_Driver/Src/stm32wlxx_hal_pwr.c" "SDK/Drivers/STM32WLxx_HAL_Driver/Src/stm32wlxx_hal_pwr_ex.c" @@ -41,8 +45,16 @@ set(TARGET_SOURCES "SDK/Drivers/STM32WLxx_HAL_Driver/Src/stm32wlxx_hal_subghz.c" "SDK/Drivers/STM32WLxx_HAL_Driver/Src/stm32wlxx_hal_uart.c" "SDK/Drivers/STM32WLxx_HAL_Driver/Src/stm32wlxx_hal_uart_ex.c" + "SDK/Middlewares/Third_Party/SubGHz_Phy/stm32_radio_driver/lr_fhss_mac.c" + "SDK/Middlewares/Third_Party/SubGHz_Phy/stm32_radio_driver/radio_driver.c" + "SDK/Middlewares/Third_Party/SubGHz_Phy/stm32_radio_driver/radio_fw.c" + "SDK/Middlewares/Third_Party/SubGHz_Phy/stm32_radio_driver/radio.c" + "SDK/Middlewares/Third_Party/SubGHz_Phy/stm32_radio_driver/wl_lr_fhss.c" "SDK/Utilities/lpm/tiny_lpm/stm32_lpm.c" "SDK/Utilities/misc/stm32_mem.c" + "SDK/Utilities/misc/stm32_systime.c" + "SDK/Utilities/misc/stm32_tiny_vsnprintf.c" + "SDK/Utilities/sequencer/stm32_seq.c" "SDK/Utilities/timer/stm32_timer.c" "SDK/Utilities/trace/adv_trace/stm32_adv_trace.c" "src/app_syscalls.c" @@ -64,8 +76,10 @@ set(TARGET_C_INCLUDES "SDK/Drivers/CMSIS/Device/ST/STM32WLxx/Include" "SDK/Drivers/STM32WLxx_HAL_Driver/Inc" "SDK/Middlewares/Third_Party/SubGHz_Phy" + "SDK/Middlewares/Third_Party/SubGHz_Phy/stm32_radio_driver" "SDK/Utilities/lpm/tiny_lpm" "SDK/Utilities/misc" + "SDK/Utilities/sequencer" "SDK/Utilities/timer" "SDK/Utilities/trace/adv_trace" "include" diff --git a/MX_Generated/Core/Inc/dma.h b/MX_Generated/Core/Inc/dma.h new file mode 100644 index 0000000..959a5b0 --- /dev/null +++ b/MX_Generated/Core/Inc/dma.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file dma.h + * @brief This file contains all the function prototypes for + * the dma.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 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 __DMA_H__ +#define __DMA_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* DMA memory to memory transfer handles -------------------------------------*/ + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_DMA_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __DMA_H__ */ + diff --git a/MX_Generated/Core/Inc/main.h b/MX_Generated/Core/Inc/main.h index 63ed073..932d963 100644 --- a/MX_Generated/Core/Inc/main.h +++ b/MX_Generated/Core/Inc/main.h @@ -57,6 +57,15 @@ void Error_Handler(void); /* USER CODE END EFP */ /* Private defines -----------------------------------------------------------*/ +#define RTC_N_PREDIV_S 10 +#define RTC_PREDIV_S ((1< -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* External variables --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/** - * @brief Init the UART and associated DMA. - * @param cb tx function callback. - * @return @ref UTIL_ADV_TRACE_Status_t - */ -UTIL_ADV_TRACE_Status_t UART_Init(void (*cb)(void *)); - -/** - * @brief DeInit the UART and associated DMA. - * @return @ref UTIL_ADV_TRACE_Status_t - */ -UTIL_ADV_TRACE_Status_t UART_DeInit(void); - -/** - * @brief send buffer to UART using DMA - * @param pdata data to be sent - * @param size of buffer p_data to be sent - * @return @ref UTIL_ADV_TRACE_Status_t - */ -UTIL_ADV_TRACE_Status_t UART_TransmitDMA(uint8_t *pdata, uint16_t size); - -/** - * @brief start Rx process - * @param cb callback to receive the data - * @return @ref UTIL_ADV_TRACE_Status_t - */ -UTIL_ADV_TRACE_Status_t UART_StartRx(void (*cb)(uint8_t *pdata, uint16_t size, uint8_t error)); - -#ifdef __cplusplus -} -#endif - -/** - * @} - */ - -#endif /* __STM32_ADV_TRACE_IF_H__*/ diff --git a/MX_Generated/Core/Inc/stm32wlxx_it.h b/MX_Generated/Core/Inc/stm32wlxx_it.h index 8a41d23..c357165 100644 --- a/MX_Generated/Core/Inc/stm32wlxx_it.h +++ b/MX_Generated/Core/Inc/stm32wlxx_it.h @@ -55,6 +55,14 @@ void SVC_Handler(void); void DebugMon_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); +void PVD_PVM_IRQHandler(void); +void TAMP_STAMP_LSECSS_SSRU_IRQHandler(void); +void RCC_IRQHandler(void); +void DMA1_Channel1_IRQHandler(void); +void DMA1_Channel2_IRQHandler(void); +void LPUART1_IRQHandler(void); +void RTC_Alarm_IRQHandler(void); +void SUBGHZ_Radio_IRQHandler(void); /* USER CODE BEGIN EFP */ /* USER CODE END EFP */ diff --git a/MX_Generated/Core/Inc/sys_app.h b/MX_Generated/Core/Inc/sys_app.h index d6c63b5..5812466 100644 --- a/MX_Generated/Core/Inc/sys_app.h +++ b/MX_Generated/Core/Inc/sys_app.h @@ -28,6 +28,8 @@ extern "C" { /* Includes ------------------------------------------------------------------*/ #include "stdint.h" +#include "sys_conf.h" +#include "stm32_adv_trace.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ @@ -53,11 +55,18 @@ extern "C" { /* USER CODE END EV */ /* Exported macros -----------------------------------------------------------*/ -/* USER CODE BEGIN APP_PRINT */ -/* Map your own trace mechanism or to map UTIL_ADV_TRACE see examples from CubeFw, e.g.: */ -#define APP_PRINTF(...) /* do{ {UTIL_ADV_TRACE_COND_FSend(VLEVEL_ALWAYS, T_REG_OFF, TS_OFF, __VA_ARGS__);} }while(0); */ -#define APP_LOG(TS,VL,...) /* do{ {UTIL_ADV_TRACE_COND_FSend(VL, T_REG_OFF, TS, __VA_ARGS__);} }while(0); */ -/* USER CODE END APP_PRINT */ +#define APP_PPRINTF(...) do{ } while( UTIL_ADV_TRACE_OK \ + != UTIL_ADV_TRACE_COND_FSend(VLEVEL_ALWAYS, T_REG_OFF, TS_OFF, __VA_ARGS__) ) /* Polling Mode */ +#define APP_TPRINTF(...) do{ {UTIL_ADV_TRACE_COND_FSend(VLEVEL_ALWAYS, T_REG_OFF, TS_ON, __VA_ARGS__);} }while(0); /* with timestamp */ +#define APP_PRINTF(...) do{ {UTIL_ADV_TRACE_COND_FSend(VLEVEL_ALWAYS, T_REG_OFF, TS_OFF, __VA_ARGS__);} }while(0); + +#if defined (APP_LOG_ENABLED) && (APP_LOG_ENABLED == 1) +#define APP_LOG(TS,VL,...) do{ {UTIL_ADV_TRACE_COND_FSend(VL, T_REG_OFF, TS, __VA_ARGS__);} }while(0); +#elif defined (APP_LOG_ENABLED) && (APP_LOG_ENABLED == 0) /* APP_LOG disabled */ +#define APP_LOG(TS,VL,...) +#else +#error "APP_LOG_ENABLED not defined or out of range <0,1>" +#endif /* APP_LOG_ENABLED */ /* USER CODE BEGIN EM */ diff --git a/MX_Generated/Core/Inc/sys_conf.h b/MX_Generated/Core/Inc/sys_conf.h new file mode 100644 index 0000000..4dc0a17 --- /dev/null +++ b/MX_Generated/Core/Inc/sys_conf.h @@ -0,0 +1,103 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file sys_conf.h + * @author MCD Application Team + * @brief Applicative configuration, e.g. : debug, trace, low power, sensors + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 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 __SYS_CONF_H__ +#define __SYS_CONF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ + +/** + * @brief Verbose level for all trace logs + */ +#define VERBOSE_LEVEL VLEVEL_M + +/** + * @brief Enable trace logs + */ +#define APP_LOG_ENABLED 1 + +/** + * @brief Activate monitoring (probes) of some internal RF signals for debug purpose + */ +#define DEBUG_SUBGHZSPI_MONITORING_ENABLED 0 + +#define DEBUG_RF_NRESET_ENABLED 0 + +#define DEBUG_RF_HSE32RDY_ENABLED 0 + +#define DEBUG_RF_SMPSRDY_ENABLED 0 + +#define DEBUG_RF_LDORDY_ENABLED 0 + +#define DEBUG_RF_DTB1_ENABLED 0 + +#define DEBUG_RF_BUSY_ENABLED 0 + +/** + * @brief Enable/Disable MCU Debugger pins (dbg serial wires) + * @note by HW serial wires are ON by default, need to put them OFF to save power + */ +#define DEBUGGER_ENABLED 1 + +/** + * @brief Disable Low Power mode + * @note 0: LowPowerMode enabled. MCU enters stop2 mode, 1: LowPowerMode disabled. MCU enters sleep mode only + */ +#define LOW_POWER_DISABLE 1 + +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* External variables --------------------------------------------------------*/ +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SYS_CONF_H__ */ diff --git a/MX_Generated/Core/Inc/sys_debug.h b/MX_Generated/Core/Inc/sys_debug.h new file mode 100644 index 0000000..4498847 --- /dev/null +++ b/MX_Generated/Core/Inc/sys_debug.h @@ -0,0 +1,109 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file sys_debug.h + * @author MCD Application Team + * @brief Configuration of the debug.c instances + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 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 __SYS_DEBUG_H__ +#define __SYS_DEBUG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "sys_conf.h" +#include "platform.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* Pin defines */ + +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* External variables --------------------------------------------------------*/ +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/* Exported macro ------------------------------------------------------------*/ +#if !defined (DISABLE_PROBE_GPIO) + +/** + * @brief Set pin to x value + */ +#define PROBE_GPIO_WRITE( gpio, n, x ) HAL_GPIO_WritePin( gpio, n, (GPIO_PinState)(x) ) + +/** + * @brief Set pin to high level + */ +#define PROBE_GPIO_SET_LINE( gpio, n ) LL_GPIO_SetOutputPin( gpio, n ) + +/** + * @brief Set pin to low level + */ +#define PROBE_GPIO_RST_LINE( gpio, n ) LL_GPIO_ResetOutputPin( gpio, n ) + +#else /* DISABLE_PROBE_GPIO */ + +/** + * @brief not usable + */ +#define PROBE_GPIO_WRITE( gpio, n, x ) + +/** + * @brief not usable + */ +#define PROBE_GPIO_SET_LINE( gpio, n ) + +/** + * @brief not usable + */ +#define PROBE_GPIO_RST_LINE( gpio, n ) + +#endif /* DISABLE_PROBE_GPIO */ + +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +/** + * @brief Initializes the SW probes pins and the monitor RF pins via Alternate Function + */ +void DBG_Init(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SYS_DEBUG_H__ */ diff --git a/MX_Generated/Core/Inc/usart_if.h b/MX_Generated/Core/Inc/usart_if.h new file mode 100644 index 0000000..912579e --- /dev/null +++ b/MX_Generated/Core/Inc/usart_if.h @@ -0,0 +1,117 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file usart_if.h + * @author MCD Application Team + * @brief Header for USART interface configuration + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 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 */ + +#include "stm32_adv_trace.h" +#include "usart.h" +#include "dma.h" + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USART_IF_H__ +#define __USART_IF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* External variables --------------------------------------------------------*/ +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +/** + * @brief Init the UART and associated DMA. + * @param cb TxCpltCallback + * @return @ref UTIL_ADV_TRACE_Status_t + */ +UTIL_ADV_TRACE_Status_t vcom_Init(void (*cb)(void *)); + +/** + * @brief init receiver of vcom + * @param RxCb callback when Rx char is received + * @return @ref UTIL_ADV_TRACE_Status_t + */ +UTIL_ADV_TRACE_Status_t vcom_ReceiveInit(void (*RxCb)(uint8_t *rxChar, uint16_t size, uint8_t error)); + +/** + * @brief DeInit the UART and associated DMA. + * @return @ref UTIL_ADV_TRACE_Status_t + */ +UTIL_ADV_TRACE_Status_t vcom_DeInit(void); + +/** + * @brief send buffer \p p_data of size \p size to vcom in polling mode + * @param p_data data to be sent + * @param size of buffer p_data to be sent + */ +void vcom_Trace(uint8_t *p_data, uint16_t size); + +/** + * @brief send buffer \p p_data of size \p size to vcom using DMA + * @param p_data data to be sent + * @param size of buffer p_data to be sent + * @return @ref UTIL_ADV_TRACE_Status_t + */ +UTIL_ADV_TRACE_Status_t vcom_Trace_DMA(uint8_t *p_data, uint16_t size); + +/** + * @brief last byte has been sent on the uart line + */ +void vcom_IRQHandler(void); + +/** + * @brief last byte has been sent from memory to uart data register + */ +void vcom_DMA_TX_IRQHandler(void); + +/** + * @brief Resume the UART and associated DMA (used by LPM) + */ +void vcom_Resume(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USART_IF_H__ */ diff --git a/MX_Generated/Core/Inc/utilities_def.h b/MX_Generated/Core/Inc/utilities_def.h index 756c97d..7778f37 100644 --- a/MX_Generated/Core/Inc/utilities_def.h +++ b/MX_Generated/Core/Inc/utilities_def.h @@ -45,7 +45,8 @@ typedef enum /* USER CODE BEGIN CFG_LPM_Id_t_0 */ /* USER CODE END CFG_LPM_Id_t_0 */ - CFG_LPM_DUMMY_Id, + CFG_LPM_APPLI_Id, + CFG_LPM_UART_TX_Id, /* USER CODE BEGIN CFG_LPM_Id_t */ /* USER CODE END CFG_LPM_Id_t */ @@ -74,7 +75,7 @@ typedef enum */ typedef enum { - CFG_SEQ_Task_Default, + CFG_SEQ_Task_SubGHz_Phy_App_Process, /* USER CODE BEGIN CFG_SEQ_Task_Id_t */ /* USER CODE END CFG_SEQ_Task_Id_t */ diff --git a/MX_Generated/Core/Src/dma.c b/MX_Generated/Core/Src/dma.c new file mode 100644 index 0000000..b6de2b9 --- /dev/null +++ b/MX_Generated/Core/Src/dma.c @@ -0,0 +1,59 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file dma.c + * @brief This file provides code for the configuration + * of all the requested memory to memory DMA transfers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 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 "dma.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/*----------------------------------------------------------------------------*/ +/* Configure DMA */ +/*----------------------------------------------------------------------------*/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** + * Enable DMA controller clock + */ +void MX_DMA_Init(void) +{ + + /* DMA controller clock enable */ + __HAL_RCC_DMAMUX1_CLK_ENABLE(); + __HAL_RCC_DMA1_CLK_ENABLE(); + + /* DMA interrupt init */ + /* DMA1_Channel1_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); + /* DMA1_Channel2_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); + +} + +/* USER CODE BEGIN 2 */ + +/* USER CODE END 2 */ + diff --git a/MX_Generated/Core/Src/gpio.c b/MX_Generated/Core/Src/gpio.c index 06a5d20..5705911 100644 --- a/MX_Generated/Core/Src/gpio.c +++ b/MX_Generated/Core/Src/gpio.c @@ -42,10 +42,23 @@ void MX_GPIO_Init(void) { + GPIO_InitTypeDef GPIO_InitStruct = {0}; + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOB, LED3_Pin|LED2_Pin|LED1_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pins : PBPin PBPin PBPin */ + GPIO_InitStruct.Pin = LED3_Pin|LED2_Pin|LED1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + } /* USER CODE BEGIN 2 */ diff --git a/MX_Generated/Core/Src/main.c b/MX_Generated/Core/Src/main.c index 6777c6b..f9d90f8 100644 --- a/MX_Generated/Core/Src/main.c +++ b/MX_Generated/Core/Src/main.c @@ -19,6 +19,7 @@ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "adc.h" +#include "dma.h" #include "usart.h" #include "rtc.h" #include "app_subghz_phy.h" diff --git a/MX_Generated/Core/Src/rtc.c b/MX_Generated/Core/Src/rtc.c index f8e4b94..2da13dd 100644 --- a/MX_Generated/Core/Src/rtc.c +++ b/MX_Generated/Core/Src/rtc.c @@ -34,8 +34,7 @@ void MX_RTC_Init(void) /* USER CODE END RTC_Init 0 */ - RTC_TimeTypeDef sTime = {0}; - RTC_DateTypeDef sDate = {0}; + RTC_AlarmTypeDef sAlarm = {0}; /* USER CODE BEGIN RTC_Init 1 */ @@ -44,15 +43,13 @@ void MX_RTC_Init(void) /** Initialize RTC Only */ hrtc.Instance = RTC; - hrtc.Init.HourFormat = RTC_HOURFORMAT_24; - hrtc.Init.AsynchPrediv = 127; - hrtc.Init.SynchPrediv = 255; + hrtc.Init.AsynchPrediv = RTC_PREDIV_A; hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE; hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE; - hrtc.Init.BinMode = RTC_BINARY_NONE; + hrtc.Init.BinMode = RTC_BINARY_ONLY; if (HAL_RTC_Init(&hrtc) != HAL_OK) { Error_Handler(); @@ -64,21 +61,19 @@ void MX_RTC_Init(void) /** Initialize RTC and set the Time and Date */ - sTime.Hours = 0x0; - sTime.Minutes = 0x0; - sTime.Seconds = 0x0; - sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; - sTime.StoreOperation = RTC_STOREOPERATION_RESET; - if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) + if (HAL_RTCEx_SetSSRU_IT(&hrtc) != HAL_OK) { Error_Handler(); } - sDate.WeekDay = RTC_WEEKDAY_MONDAY; - sDate.Month = RTC_MONTH_JANUARY; - sDate.Date = 0x1; - sDate.Year = 0x0; - if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) + /** Enable the Alarm A + */ + sAlarm.BinaryAutoClr = RTC_ALARMSUBSECONDBIN_AUTOCLR_NO; + sAlarm.AlarmTime.SubSeconds = 0x0; + sAlarm.AlarmMask = RTC_ALARMMASK_NONE; + sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDBINMASK_NONE; + sAlarm.Alarm = RTC_ALARM_A; + if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, 0) != HAL_OK) { Error_Handler(); } @@ -111,6 +106,12 @@ void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle) /* RTC clock enable */ __HAL_RCC_RTC_ENABLE(); __HAL_RCC_RTCAPB_CLK_ENABLE(); + + /* RTC interrupt Init */ + HAL_NVIC_SetPriority(TAMP_STAMP_LSECSS_SSRU_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TAMP_STAMP_LSECSS_SSRU_IRQn); + HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn); /* USER CODE BEGIN RTC_MspInit 1 */ /* USER CODE END RTC_MspInit 1 */ @@ -128,6 +129,10 @@ void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle) /* Peripheral clock disable */ __HAL_RCC_RTC_DISABLE(); __HAL_RCC_RTCAPB_CLK_DISABLE(); + + /* RTC interrupt Deinit */ + HAL_NVIC_DisableIRQ(TAMP_STAMP_LSECSS_SSRU_IRQn); + HAL_NVIC_DisableIRQ(RTC_Alarm_IRQn); /* USER CODE BEGIN RTC_MspDeInit 1 */ /* USER CODE END RTC_MspDeInit 1 */ diff --git a/MX_Generated/Core/Src/stm32_adv_trace_if.c b/MX_Generated/Core/Src/stm32_adv_trace_if.c deleted file mode 100644 index 12557da..0000000 --- a/MX_Generated/Core/Src/stm32_adv_trace_if.c +++ /dev/null @@ -1,94 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : stm32_adv_trace_if.c - * @brief : Source file for interfacing the stm32_adv_trace to hardware - ****************************************************************************** - * @attention - * - * Copyright (c) 2023 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 */ - -#include "stm32_adv_trace.h" -#include "stm32_adv_trace_if.h" -/* USER CODE BEGIN include */ - -/* USER CODE END include */ - -/* Exported variables --------------------------------------------------------*/ - -/** - * @brief trace tracer definition. - * - * list all the driver interface used by the trace application. - */ -const UTIL_ADV_TRACE_Driver_s UTIL_TraceDriver = -{ - UART_Init, - UART_DeInit, - UART_StartRx, - UART_TransmitDMA -}; -/* USER CODE BEGIN EV */ - -/* USER CODE END EV */ -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN Private_Function_Prototypes */ - -/* USER CODE END Private_Function_Prototypes */ -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN Private_Typedef */ - -/* USER CODE END Private_Typedef */ -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN Private_Define */ - -/* USER CODE END Private_Define */ -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN Private_Macro */ - -/* USER CODE END Private_Macro */ -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN Private_Variables */ - -/* USER CODE END Private_Variables */ - -UTIL_ADV_TRACE_Status_t UART_Init(void (*cb)(void *)) -{ - /* USER CODE BEGIN UART_Init */ - return UTIL_ADV_TRACE_OK; - /* USER CODE END UART_Init */ -} - -UTIL_ADV_TRACE_Status_t UART_DeInit(void) -{ - /* USER CODE BEGIN UART_DeInit */ - return UTIL_ADV_TRACE_OK; - /* USER CODE END UART_DeInit */ -} - -UTIL_ADV_TRACE_Status_t UART_StartRx(void (*cb)(uint8_t *pdata, uint16_t size, uint8_t error)) -{ - /* USER CODE BEGIN UART_StartRx */ - return UTIL_ADV_TRACE_OK; - /* USER CODE END UART_StartRx */ -} - -UTIL_ADV_TRACE_Status_t UART_TransmitDMA(uint8_t *pdata, uint16_t size) -{ - /* USER CODE BEGIN UART_TransmitDMA */ - return UTIL_ADV_TRACE_OK; - /* USER CODE END UART_TransmitDMA */ -} - -/* USER CODE BEGIN Private_Functions */ - -/* USER CODE END Private_Functions */ diff --git a/MX_Generated/Core/Src/stm32_lpm_if.c b/MX_Generated/Core/Src/stm32_lpm_if.c index 10883da..a404c92 100644 --- a/MX_Generated/Core/Src/stm32_lpm_if.c +++ b/MX_Generated/Core/Src/stm32_lpm_if.c @@ -19,8 +19,10 @@ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ +#include "platform.h" #include "stm32_lpm.h" #include "stm32_lpm_if.h" +#include "usart_if.h" /* USER CODE BEGIN Includes */ @@ -92,6 +94,17 @@ void PWR_EnterStopMode(void) /* USER CODE BEGIN EnterStopMode_1 */ /* USER CODE END EnterStopMode_1 */ + HAL_SuspendTick(); + /* Clear Status Flag before entering STOP/STANDBY Mode */ + LL_PWR_ClearFlag_C1STOP_C1STB(); + + /* USER CODE BEGIN EnterStopMode_2 */ + + /* USER CODE END EnterStopMode_2 */ + HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI); + /* USER CODE BEGIN EnterStopMode_3 */ + + /* USER CODE END EnterStopMode_3 */ } void PWR_ExitStopMode(void) @@ -99,6 +112,18 @@ void PWR_ExitStopMode(void) /* USER CODE BEGIN ExitStopMode_1 */ /* USER CODE END ExitStopMode_1 */ + /* Resume sysTick : work around for debugger problem in dual core */ + HAL_ResumeTick(); + /*Not retained periph: + ADC interface + DAC interface USARTx, TIMx, i2Cx, SPIx + SRAM ctrls, DMAx, DMAMux, AES, RNG, HSEM */ + + /* Resume not retained USARTx and DMA */ + vcom_Resume(); + /* USER CODE BEGIN ExitStopMode_2 */ + + /* USER CODE END ExitStopMode_2 */ } void PWR_EnterSleepMode(void) @@ -106,6 +131,15 @@ void PWR_EnterSleepMode(void) /* USER CODE BEGIN EnterSleepMode_1 */ /* USER CODE END EnterSleepMode_1 */ + /* Suspend sysTick */ + HAL_SuspendTick(); + /* USER CODE BEGIN EnterSleepMode_2 */ + + /* USER CODE END EnterSleepMode_2 */ + HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); + /* USER CODE BEGIN EnterSleepMode_3 */ + + /* USER CODE END EnterSleepMode_3 */ } void PWR_ExitSleepMode(void) @@ -113,6 +147,12 @@ void PWR_ExitSleepMode(void) /* USER CODE BEGIN ExitSleepMode_1 */ /* USER CODE END ExitSleepMode_1 */ + /* Resume sysTick */ + HAL_ResumeTick(); + + /* USER CODE BEGIN ExitSleepMode_2 */ + + /* USER CODE END ExitSleepMode_2 */ } /* USER CODE BEGIN EF */ diff --git a/MX_Generated/Core/Src/stm32wlxx_hal_msp.c b/MX_Generated/Core/Src/stm32wlxx_hal_msp.c index 93413f7..3e712b8 100644 --- a/MX_Generated/Core/Src/stm32wlxx_hal_msp.c +++ b/MX_Generated/Core/Src/stm32wlxx_hal_msp.c @@ -68,6 +68,14 @@ void HAL_MspInit(void) /* System interrupt init*/ + /* Peripheral interrupt init */ + /* PVD_PVM_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(PVD_PVM_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(PVD_PVM_IRQn); + /* RCC_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(RCC_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(RCC_IRQn); + /* USER CODE BEGIN MspInit 1 */ /* USER CODE END MspInit 1 */ diff --git a/MX_Generated/Core/Src/stm32wlxx_it.c b/MX_Generated/Core/Src/stm32wlxx_it.c index 072fc25..a1d4e51 100644 --- a/MX_Generated/Core/Src/stm32wlxx_it.c +++ b/MX_Generated/Core/Src/stm32wlxx_it.c @@ -55,7 +55,11 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ - +extern DMA_HandleTypeDef hdma_lpuart1_tx; +extern DMA_HandleTypeDef hdma_lpuart1_rx; +extern UART_HandleTypeDef hlpuart1; +extern RTC_HandleTypeDef hrtc; +extern SUBGHZ_HandleTypeDef hsubghz; /* USER CODE BEGIN EV */ /* USER CODE END EV */ @@ -199,6 +203,117 @@ void SysTick_Handler(void) /* please refer to the startup file (startup_stm32wlxx.s). */ /******************************************************************************/ +/** + * @brief This function handles PVD and PVM detector. + */ +void PVD_PVM_IRQHandler(void) +{ + /* USER CODE BEGIN PVD_PVM_IRQn 0 */ + + /* USER CODE END PVD_PVM_IRQn 0 */ + HAL_PWREx_PVD_PVM_IRQHandler(); + /* USER CODE BEGIN PVD_PVM_IRQn 1 */ + + /* USER CODE END PVD_PVM_IRQn 1 */ +} + +/** + * @brief This function handles RTC Tamper, RTC TimeStamp, LSECSS and RTC SSRU Interrupts. + */ +void TAMP_STAMP_LSECSS_SSRU_IRQHandler(void) +{ + /* USER CODE BEGIN TAMP_STAMP_LSECSS_SSRU_IRQn 0 */ + + /* USER CODE END TAMP_STAMP_LSECSS_SSRU_IRQn 0 */ + HAL_RTCEx_SSRUIRQHandler(&hrtc); + /* USER CODE BEGIN TAMP_STAMP_LSECSS_SSRU_IRQn 1 */ + + /* USER CODE END TAMP_STAMP_LSECSS_SSRU_IRQn 1 */ +} + +/** + * @brief This function handles RCC Interrupt. + */ +void RCC_IRQHandler(void) +{ + /* USER CODE BEGIN RCC_IRQn 0 */ + + /* USER CODE END RCC_IRQn 0 */ + /* USER CODE BEGIN RCC_IRQn 1 */ + + /* USER CODE END RCC_IRQn 1 */ +} + +/** + * @brief This function handles DMA1 Channel 1 Interrupt. + */ +void DMA1_Channel1_IRQHandler(void) +{ + /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */ + + /* USER CODE END DMA1_Channel1_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_lpuart1_tx); + /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */ + + /* USER CODE END DMA1_Channel1_IRQn 1 */ +} + +/** + * @brief This function handles DMA1 Channel 2 Interrupt. + */ +void DMA1_Channel2_IRQHandler(void) +{ + /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */ + + /* USER CODE END DMA1_Channel2_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_lpuart1_rx); + /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */ + + /* USER CODE END DMA1_Channel2_IRQn 1 */ +} + +/** + * @brief This function handles LPUART1 Interrupt. + */ +void LPUART1_IRQHandler(void) +{ + /* USER CODE BEGIN LPUART1_IRQn 0 */ + + /* USER CODE END LPUART1_IRQn 0 */ + HAL_UART_IRQHandler(&hlpuart1); + /* USER CODE BEGIN LPUART1_IRQn 1 */ + + /* USER CODE END LPUART1_IRQn 1 */ +} + +/** + * @brief This function handles RTC Alarms (A and B) Interrupt. + */ +void RTC_Alarm_IRQHandler(void) +{ + /* USER CODE BEGIN RTC_Alarm_IRQn 0 */ + + /* USER CODE END RTC_Alarm_IRQn 0 */ + HAL_RTC_AlarmIRQHandler(&hrtc); + /* USER CODE BEGIN RTC_Alarm_IRQn 1 */ + + /* USER CODE END RTC_Alarm_IRQn 1 */ +} + +/** + * @brief This function handles SUBGHZ Radio Interrupt. + */ +void SUBGHZ_Radio_IRQHandler(void) +{ + /* USER CODE BEGIN SUBGHZ_Radio_IRQn 0 */ + + /* USER CODE END SUBGHZ_Radio_IRQn 0 */ + HAL_SUBGHZ_IRQHandler(&hsubghz); + /* USER CODE BEGIN SUBGHZ_Radio_IRQn 1 */ + + /* USER CODE END SUBGHZ_Radio_IRQn 1 */ +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ diff --git a/MX_Generated/Core/Src/subghz.c b/MX_Generated/Core/Src/subghz.c index 28cbb0d..35bebf4 100644 --- a/MX_Generated/Core/Src/subghz.c +++ b/MX_Generated/Core/Src/subghz.c @@ -56,6 +56,10 @@ void HAL_SUBGHZ_MspInit(SUBGHZ_HandleTypeDef* subghzHandle) /* USER CODE END SUBGHZ_MspInit 0 */ /* SUBGHZ clock enable */ __HAL_RCC_SUBGHZSPI_CLK_ENABLE(); + + /* SUBGHZ interrupt Init */ + HAL_NVIC_SetPriority(SUBGHZ_Radio_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(SUBGHZ_Radio_IRQn); /* USER CODE BEGIN SUBGHZ_MspInit 1 */ /* USER CODE END SUBGHZ_MspInit 1 */ @@ -69,6 +73,9 @@ void HAL_SUBGHZ_MspDeInit(SUBGHZ_HandleTypeDef* subghzHandle) /* USER CODE END SUBGHZ_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_SUBGHZSPI_CLK_DISABLE(); + + /* SUBGHZ interrupt Deinit */ + HAL_NVIC_DisableIRQ(SUBGHZ_Radio_IRQn); /* USER CODE BEGIN SUBGHZ_MspDeInit 1 */ /* USER CODE END SUBGHZ_MspDeInit 1 */ diff --git a/MX_Generated/Core/Src/sys_app.c b/MX_Generated/Core/Src/sys_app.c index bfbcd94..bb1718c 100644 --- a/MX_Generated/Core/Src/sys_app.c +++ b/MX_Generated/Core/Src/sys_app.c @@ -22,9 +22,12 @@ #include #include "platform.h" #include "sys_app.h" +#include "stm32_seq.h" #include "stm32_systime.h" +#include "stm32_lpm.h" #include "timer_if.h" #include "utilities_def.h" +#include "sys_debug.h" /* USER CODE BEGIN Includes */ @@ -41,6 +44,8 @@ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ +#define MAX_TS_SIZE (int) 16 + /* USER CODE BEGIN PD */ /* USER CODE END PD */ @@ -58,6 +63,18 @@ static uint8_t SYS_TimerInitialisedFlag = 0; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ +/** + * @brief Returns sec and msec based on the systime in use + * @param buff to update with timestamp + * @param size of updated buffer + */ +static void TimestampNow(uint8_t *buff, uint16_t *size); + +/** + * @brief it calls UTIL_ADV_TRACE_VSNPRINTF + */ +static void tiny_snprintf_like(char *buf, uint32_t maxsize, const char *strFormat, ...); + /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ @@ -69,6 +86,51 @@ void SystemApp_Init(void) /* USER CODE END SystemApp_Init_1 */ + /* Ensure that MSI is wake-up system clock */ + __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_MSI); + + /*Initialize timer and RTC*/ + UTIL_TIMER_Init(); + SYS_TimerInitialisedFlag = 1; + /* Initializes the SW probes pins and the monitor RF pins via Alternate Function */ + DBG_Init(); + + /*Initialize the terminal */ + UTIL_ADV_TRACE_Init(); + UTIL_ADV_TRACE_RegisterTimeStampFunction(TimestampNow); + + /*Set verbose LEVEL*/ + UTIL_ADV_TRACE_SetVerboseLevel(VERBOSE_LEVEL); + + /*Init low power manager*/ + UTIL_LPM_Init(); + /* Disable Stand-by mode */ + UTIL_LPM_SetOffMode((1 << CFG_LPM_APPLI_Id), UTIL_LPM_DISABLE); + +#if defined (LOW_POWER_DISABLE) && (LOW_POWER_DISABLE == 1) + /* Disable Stop Mode */ + UTIL_LPM_SetStopMode((1 << CFG_LPM_APPLI_Id), UTIL_LPM_DISABLE); +#elif !defined (LOW_POWER_DISABLE) +#error LOW_POWER_DISABLE not defined +#endif /* LOW_POWER_DISABLE */ + + /* USER CODE BEGIN SystemApp_Init_2 */ + + /* USER CODE END SystemApp_Init_2 */ +} + +/** + * @brief redefines __weak function in stm32_seq.c such to enter low power + */ +void UTIL_SEQ_Idle(void) +{ + /* USER CODE BEGIN UTIL_SEQ_Idle_1 */ + + /* USER CODE END UTIL_SEQ_Idle_1 */ + UTIL_LPM_EnterLowPower(); + /* USER CODE BEGIN UTIL_SEQ_Idle_2 */ + + /* USER CODE END UTIL_SEQ_Idle_2 */ } /* USER CODE BEGIN EF */ @@ -76,21 +138,63 @@ void SystemApp_Init(void) /* USER CODE END EF */ /* Private functions ---------------------------------------------------------*/ + +static void TimestampNow(uint8_t *buff, uint16_t *size) +{ + /* USER CODE BEGIN TimestampNow_1 */ + + /* USER CODE END TimestampNow_1 */ + SysTime_t curtime = SysTimeGet(); + tiny_snprintf_like((char *)buff, MAX_TS_SIZE, "%ds%03d:", curtime.Seconds, curtime.SubSeconds); + *size = strlen((char *)buff); + /* USER CODE BEGIN TimestampNow_2 */ + + /* USER CODE END TimestampNow_2 */ +} + +/* Disable StopMode when traces need to be printed */ +void UTIL_ADV_TRACE_PreSendHook(void) +{ + /* USER CODE BEGIN UTIL_ADV_TRACE_PreSendHook_1 */ + + /* USER CODE END UTIL_ADV_TRACE_PreSendHook_1 */ + UTIL_LPM_SetStopMode((1 << CFG_LPM_UART_TX_Id), UTIL_LPM_DISABLE); + /* USER CODE BEGIN UTIL_ADV_TRACE_PreSendHook_2 */ + + /* USER CODE END UTIL_ADV_TRACE_PreSendHook_2 */ +} +/* Re-enable StopMode when traces have been printed */ +void UTIL_ADV_TRACE_PostSendHook(void) +{ + /* USER CODE BEGIN UTIL_LPM_SetStopMode_1 */ + + /* USER CODE END UTIL_LPM_SetStopMode_1 */ + UTIL_LPM_SetStopMode((1 << CFG_LPM_UART_TX_Id), UTIL_LPM_ENABLE); + /* USER CODE BEGIN UTIL_LPM_SetStopMode_2 */ + + /* USER CODE END UTIL_LPM_SetStopMode_2 */ +} + +static void tiny_snprintf_like(char *buf, uint32_t maxsize, const char *strFormat, ...) +{ + /* USER CODE BEGIN tiny_snprintf_like_1 */ + + /* USER CODE END tiny_snprintf_like_1 */ + va_list vaArgs; + va_start(vaArgs, strFormat); + UTIL_ADV_TRACE_VSNPRINTF(buf, maxsize, strFormat, vaArgs); + va_end(vaArgs); + /* USER CODE BEGIN tiny_snprintf_like_2 */ + + /* USER CODE END tiny_snprintf_like_2 */ +} + /* USER CODE BEGIN PrFD */ /* USER CODE END PrFD */ /* HAL overload functions ---------------------------------------------------------*/ -/* Set #if 0 if you want to keep the default HAL instead overcharge them*/ -/* USER CODE BEGIN Overload_HAL_weaks_1 */ -#if 1 -/* USER CODE END Overload_HAL_weaks_1 */ - -/* USER CODE BEGIN Overload_HAL_weaks_1a */ - -/* USER CODE END Overload_HAL_weaks_1a */ - /** * @note This function overwrites the __weak one from HAL */ @@ -138,8 +242,6 @@ void HAL_Delay(__IO uint32_t Delay) /* USER CODE END HAL_Delay_2 */ } -/* USER CODE BEGIN Overload_HAL_weaks_2 */ -#endif /* 1 default HAL overcharge */ -/* if needed set #if 0 and redefine here your own "Tick" functions*/ +/* USER CODE BEGIN Overload_HAL_weaks */ -/* USER CODE END Overload_HAL_weaks_2 */ +/* USER CODE END Overload_HAL_weaks */ diff --git a/MX_Generated/Core/Src/sys_debug.c b/MX_Generated/Core/Src/sys_debug.c new file mode 100644 index 0000000..298cd42 --- /dev/null +++ b/MX_Generated/Core/Src/sys_debug.c @@ -0,0 +1,187 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file sys_debug.c + * @author MCD Application Team + * @brief Configure probes pins RealTime debugging and JTAG/SerialWires for LowPower + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 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 "platform.h" +#include "sys_debug.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* External variables ---------------------------------------------------------*/ +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* 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 */ + +/* Exported functions --------------------------------------------------------*/ + +/** + * @brief Initializes the SW probes pins and the monitor RF pins via Alternate Function + */ +void DBG_Init(void) +{ + /* USER CODE BEGIN DBG_Init_1 */ + + /* USER CODE END DBG_Init_1 */ + + /* SW probes */ +#if defined (DEBUGGER_ENABLED) && ( DEBUGGER_ENABLED == 0 ) + HAL_DBGMCU_DisableDBGSleepMode(); + HAL_DBGMCU_DisableDBGStopMode(); + HAL_DBGMCU_DisableDBGStandbyMode(); +#elif defined (DEBUGGER_ENABLED) && ( DEBUGGER_ENABLED == 1 ) + /*Debug power up request wakeup CBDGPWRUPREQ*/ + LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_46); + /* Disabled HAL_DBGMCU_ */ + HAL_DBGMCU_EnableDBGSleepMode(); + HAL_DBGMCU_EnableDBGStopMode(); + HAL_DBGMCU_EnableDBGStandbyMode(); +#elif !defined (DEBUGGER_ENABLED) +#error "DEBUGGER_ENABLED not defined or out of range <0,1>" +#endif /* DEBUGGER_OFF */ + +#if (DEBUG_SUBGHZSPI_MONITORING_ENABLED == 1) || \ + (DEBUG_RF_NRESET_ENABLED == 1) || \ + (DEBUG_RF_HSE32RDY_ENABLED == 1) || \ + (DEBUG_RF_SMPSRDY_ENABLED == 1) || \ + (DEBUG_RF_LDORDY_ENABLED == 1) || \ + (DEBUG_RF_DTB1_ENABLED == 1) || \ + (DEBUG_RF_BUSY_ENABLED == 1) + GPIO_InitTypeDef GPIO_InitStruct = {0}; +#endif + + /* USER CODE BEGIN DBG_Init_2 */ + + /* USER CODE END DBG_Init_2 */ + + /* HW alternate functions for monitoring RF */ + +#if (DEBUG_SUBGHZSPI_MONITORING_ENABLED == 1) + /*spi dbg*/ + GPIO_InitStruct.Pin = (GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7); + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DEBUG_SUBGHZSPI; + __HAL_RCC_GPIOA_CLK_ENABLE(); + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); +#endif /* DEBUG_SUBGHZSPI_MONITORING_ENABLED */ + +#if (DEBUG_RF_NRESET_ENABLED == 1) + GPIO_InitStruct.Pin = GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DEBUG_RF; + __HAL_RCC_GPIOA_CLK_ENABLE(); + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); +#endif /* DEBUG_RF_NRESET_ENABLED */ + +#if (DEBUG_RF_HSE32RDY_ENABLED == 1) + GPIO_InitStruct.Pin = GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DEBUG_RF; + __HAL_RCC_GPIOA_CLK_ENABLE(); + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); +#endif /* DEBUG_RF_HSE32RDY_ENABLED */ + +#if (DEBUG_RF_SMPSRDY_ENABLED == 1) + GPIO_InitStruct.Pin = (GPIO_PIN_2); + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DEBUG_RF; + __HAL_RCC_GPIOB_CLK_ENABLE(); + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); +#endif /* DEBUG_RF_SMPSRDY_ENABLED */ + +#if (DEBUG_RF_LDORDY_ENABLED == 1) + GPIO_InitStruct.Pin = (GPIO_PIN_4); + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DEBUG_RF; + __HAL_RCC_GPIOB_CLK_ENABLE(); + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); +#endif /* DEBUG_RF_LDORDY_ENABLED */ + +#if (DEBUG_RF_DTB1_ENABLED == 1) + GPIO_InitStruct.Pin = GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DEBUG_RF; + __HAL_RCC_GPIOB_CLK_ENABLE(); + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); +#endif /* DEBUG_RF_DTB1_ENABLED */ + +#if (DEBUG_RF_BUSY_ENABLED == 1) + /* Busy */ + GPIO_InitStruct.Pin = (GPIO_PIN_12); + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF6_RF_BUSY; + __HAL_RCC_GPIOA_CLK_ENABLE() ; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); +#endif /* DEBUG_RF_BUSY_ENABLED */ + + /* USER CODE BEGIN DBG_Init_3 */ + + /* USER CODE END DBG_Init_3 */ +} + +/* USER CODE BEGIN EF */ + +/* USER CODE END EF */ + +/* Private Functions Definition -----------------------------------------------*/ + +/* USER CODE BEGIN PrFD */ + +/* USER CODE END PrFD */ diff --git a/MX_Generated/Core/Src/timer_if.c b/MX_Generated/Core/Src/timer_if.c index f9b4f4d..0980a77 100644 --- a/MX_Generated/Core/Src/timer_if.c +++ b/MX_Generated/Core/Src/timer_if.c @@ -21,12 +21,20 @@ /* Includes ------------------------------------------------------------------*/ #include #include "timer_if.h" +#include "main.h" /*for STM32CubeMX generated RTC_N_PREDIV_S and RTC_N_PREDIV_A*/ +#include "rtc.h" +#include "utilities_def.h" +#include "stm32wlxx_ll_rtc.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* External variables ---------------------------------------------------------*/ +/** + * @brief RTC handle + */ +extern RTC_HandleTypeDef hrtc; /** * @brief Timer driver callbacks handler @@ -72,16 +80,67 @@ const UTIL_SYSTIM_Driver_s UTIL_SYSTIMDriver = /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ +/** + * @brief Minimum timeout delay of Alarm in ticks + */ +#define MIN_ALARM_DELAY 3 + +/** + * @brief Backup seconds register + */ +#define RTC_BKP_SECONDS RTC_BKP_DR0 + +/** + * @brief Backup subseconds register + */ +#define RTC_BKP_SUBSECONDS RTC_BKP_DR1 + +/** + * @brief Backup msbticks register + */ +#define RTC_BKP_MSBTICKS RTC_BKP_DR2 + +/* #define RTIF_DEBUG */ + +/** + * @brief Map UTIL_TIMER_IRQ can be overridden in utilities_conf.h to Map on Task rather then Isr + */ +#ifndef UTIL_TIMER_IRQ_MAP_INIT +#define UTIL_TIMER_IRQ_MAP_INIT() +#endif /* UTIL_TIMER_IRQ_MAP_INIT */ + +#ifndef UTIL_TIMER_IRQ_MAP_PROCESS +#define UTIL_TIMER_IRQ_MAP_PROCESS() UTIL_TIMER_IRQ_Handler() +#endif /* UTIL_TIMER_IRQ_MAP_PROCESS */ + /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ +#ifdef RTIF_DEBUG +#include "sys_app.h" /*for app_log*/ +/** + * @brief Post the RTC log string format to the circular queue for printing in using the polling mode + */ +#define TIMER_IF_DBG_PRINTF(...) do{ {UTIL_ADV_TRACE_COND_FSend(VLEVEL_ALWAYS, T_REG_OFF, TS_OFF, __VA_ARGS__);} }while(0); +#else +/** + * @brief not used + */ +#define TIMER_IF_DBG_PRINTF(...) +#endif /* RTIF_DEBUG */ + /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ +/** + * @brief Indicates if the RTC is already Initialized or not + */ +static bool RTC_Initialized = false; + /** * @brief RtcTimerContext */ @@ -92,6 +151,28 @@ static uint32_t RtcTimerContext = 0; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ +/** + * @brief Get rtc timer Value in rtc tick + * @return val the rtc timer value (upcounting) + */ +static inline uint32_t GetTimerTicks(void); + +/** + * @brief Writes MSBticks to backup register + * Absolute RTC time in tick is (MSBticks)<<32 + (32bits binary counter) + * @note MSBticks incremented every time the 32bits RTC timer wraps around (~44days) + * @param[in] MSBticks + */ +static void TIMER_IF_BkUp_Write_MSBticks(uint32_t MSBticks); + +/** + * @brief Reads MSBticks from backup register + * Absolute RTC time in tick is (MSBticks)<<32 + (32bits binary counter) + * @note MSBticks incremented every time the 32bits RTC timer wraps around (~44days) + * @retval MSBticks + */ +static uint32_t TIMER_IF_BkUp_Read_MSBticks(void); + /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ @@ -103,6 +184,34 @@ UTIL_TIMER_Status_t TIMER_IF_Init(void) /* USER CODE BEGIN TIMER_IF_Init */ /* USER CODE END TIMER_IF_Init */ + if (RTC_Initialized == false) + { + hrtc.IsEnabled.RtcFeatures = UINT32_MAX; + /*Init RTC*/ + MX_RTC_Init(); + /*Stop Timer */ + TIMER_IF_StopTimer(); + /** DeActivate the Alarm A enabled by STM32CubeMX during MX_RTC_Init() */ + HAL_RTC_DeactivateAlarm(&hrtc, RTC_ALARM_A); + /*overload RTC feature enable*/ + hrtc.IsEnabled.RtcFeatures = UINT32_MAX; + + /*Enable Direct Read of the calendar registers (not through Shadow) */ + HAL_RTCEx_EnableBypassShadow(&hrtc); + /*Initialize MSB ticks*/ + TIMER_IF_BkUp_Write_MSBticks(0); + + TIMER_IF_SetTimerContext(); + + /* Register a task to associate to UTIL_TIMER_Irq() interrupt */ + UTIL_TIMER_IRQ_MAP_INIT(); + + RTC_Initialized = true; + } + + /* USER CODE BEGIN TIMER_IF_Init_Last */ + + /* USER CODE END TIMER_IF_Init_Last */ return ret; } @@ -112,6 +221,25 @@ UTIL_TIMER_Status_t TIMER_IF_StartTimer(uint32_t timeout) /* USER CODE BEGIN TIMER_IF_StartTimer */ /* USER CODE END TIMER_IF_StartTimer */ + RTC_AlarmTypeDef sAlarm = {0}; + /*Stop timer if one is already started*/ + TIMER_IF_StopTimer(); + timeout += RtcTimerContext; + + TIMER_IF_DBG_PRINTF("Start timer: time=%d, alarm=%d\n\r", GetTimerTicks(), timeout); + /* starts timer*/ + sAlarm.BinaryAutoClr = RTC_ALARMSUBSECONDBIN_AUTOCLR_NO; + sAlarm.AlarmTime.SubSeconds = UINT32_MAX - timeout; + sAlarm.AlarmMask = RTC_ALARMMASK_NONE; + sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDBINMASK_NONE; + sAlarm.Alarm = RTC_ALARM_A; + if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIMER_IF_StartTimer_Last */ + + /* USER CODE END TIMER_IF_StartTimer_Last */ return ret; } @@ -121,15 +249,28 @@ UTIL_TIMER_Status_t TIMER_IF_StopTimer(void) /* USER CODE BEGIN TIMER_IF_StopTimer */ /* USER CODE END TIMER_IF_StopTimer */ + /* Clear RTC Alarm Flag */ + __HAL_RTC_ALARM_CLEAR_FLAG(&hrtc, RTC_FLAG_ALRAF); + /* Disable the Alarm A interrupt */ + HAL_RTC_DeactivateAlarm(&hrtc, RTC_ALARM_A); + /*overload RTC feature enable*/ + hrtc.IsEnabled.RtcFeatures = UINT32_MAX; + /* USER CODE BEGIN TIMER_IF_StopTimer_Last */ + + /* USER CODE END TIMER_IF_StopTimer_Last */ return ret; } uint32_t TIMER_IF_SetTimerContext(void) { + /*store time context*/ + RtcTimerContext = GetTimerTicks(); + /* USER CODE BEGIN TIMER_IF_SetTimerContext */ /* USER CODE END TIMER_IF_SetTimerContext */ + TIMER_IF_DBG_PRINTF("TIMER_IF_SetTimerContext=%d\n\r", RtcTimerContext); /*return time context*/ return RtcTimerContext; } @@ -140,6 +281,7 @@ uint32_t TIMER_IF_GetTimerContext(void) /* USER CODE END TIMER_IF_GetTimerContext */ + TIMER_IF_DBG_PRINTF("TIMER_IF_GetTimerContext=%d\n\r", RtcTimerContext); /*return time context*/ return RtcTimerContext; } @@ -150,6 +292,10 @@ uint32_t TIMER_IF_GetTimerElapsedTime(void) /* USER CODE BEGIN TIMER_IF_GetTimerElapsedTime */ /* USER CODE END TIMER_IF_GetTimerElapsedTime */ + ret = ((uint32_t)(GetTimerTicks() - RtcTimerContext)); + /* USER CODE BEGIN TIMER_IF_GetTimerElapsedTime_Last */ + + /* USER CODE END TIMER_IF_GetTimerElapsedTime_Last */ return ret; } @@ -159,6 +305,13 @@ uint32_t TIMER_IF_GetTimerValue(void) /* USER CODE BEGIN TIMER_IF_GetTimerValue */ /* USER CODE END TIMER_IF_GetTimerValue */ + if (RTC_Initialized == true) + { + ret = GetTimerTicks(); + } + /* USER CODE BEGIN TIMER_IF_GetTimerValue_Last */ + + /* USER CODE END TIMER_IF_GetTimerValue_Last */ return ret; } @@ -168,6 +321,10 @@ uint32_t TIMER_IF_GetMinimumTimeout(void) /* USER CODE BEGIN TIMER_IF_GetMinimumTimeout */ /* USER CODE END TIMER_IF_GetMinimumTimeout */ + ret = (MIN_ALARM_DELAY); + /* USER CODE BEGIN TIMER_IF_GetMinimumTimeout_Last */ + + /* USER CODE END TIMER_IF_GetMinimumTimeout_Last */ return ret; } @@ -177,6 +334,10 @@ uint32_t TIMER_IF_Convert_ms2Tick(uint32_t timeMilliSec) /* USER CODE BEGIN TIMER_IF_Convert_ms2Tick */ /* USER CODE END TIMER_IF_Convert_ms2Tick */ + ret = ((uint32_t)((((uint64_t) timeMilliSec) << RTC_N_PREDIV_S) / 1000)); + /* USER CODE BEGIN TIMER_IF_Convert_ms2Tick_Last */ + + /* USER CODE END TIMER_IF_Convert_ms2Tick_Last */ return ret; } @@ -186,6 +347,10 @@ uint32_t TIMER_IF_Convert_Tick2ms(uint32_t tick) /* USER CODE BEGIN TIMER_IF_Convert_Tick2ms */ /* USER CODE END TIMER_IF_Convert_Tick2ms */ + ret = ((uint32_t)((((uint64_t)(tick)) * 1000) >> RTC_N_PREDIV_S)); + /* USER CODE BEGIN TIMER_IF_Convert_Tick2ms_Last */ + + /* USER CODE END TIMER_IF_Convert_Tick2ms_Last */ return ret; } @@ -194,6 +359,43 @@ void TIMER_IF_DelayMs(uint32_t delay) /* USER CODE BEGIN TIMER_IF_DelayMs */ /* USER CODE END TIMER_IF_DelayMs */ + uint32_t delayTicks = TIMER_IF_Convert_ms2Tick(delay); + uint32_t timeout = GetTimerTicks(); + + /* Wait delay ms */ + while (((GetTimerTicks() - timeout)) < delayTicks) + { + __NOP(); + } + /* USER CODE BEGIN TIMER_IF_DelayMs_Last */ + + /* USER CODE END TIMER_IF_DelayMs_Last */ +} + +void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) +{ + /* USER CODE BEGIN HAL_RTC_AlarmAEventCallback */ + + /* USER CODE END HAL_RTC_AlarmAEventCallback */ + UTIL_TIMER_IRQ_MAP_PROCESS(); + /* USER CODE BEGIN HAL_RTC_AlarmAEventCallback_Last */ + + /* USER CODE END HAL_RTC_AlarmAEventCallback_Last */ +} + +void HAL_RTCEx_SSRUEventCallback(RTC_HandleTypeDef *hrtc) +{ + /* USER CODE BEGIN HAL_RTCEx_SSRUEventCallback */ + + /* USER CODE END HAL_RTCEx_SSRUEventCallback */ + /*called every 48 days with 1024 ticks per seconds*/ + TIMER_IF_DBG_PRINTF(">>Handler SSRUnderflow at %d\n\r", GetTimerTicks()); + /*Increment MSBticks*/ + uint32_t MSB_ticks = TIMER_IF_BkUp_Read_MSBticks(); + TIMER_IF_BkUp_Write_MSBticks(MSB_ticks + 1); + /* USER CODE BEGIN HAL_RTCEx_SSRUEventCallback_Last */ + + /* USER CODE END HAL_RTCEx_SSRUEventCallback_Last */ } uint32_t TIMER_IF_GetTime(uint16_t *mSeconds) @@ -202,6 +404,21 @@ uint32_t TIMER_IF_GetTime(uint16_t *mSeconds) /* USER CODE BEGIN TIMER_IF_GetTime */ /* USER CODE END TIMER_IF_GetTime */ + uint64_t ticks; + uint32_t timerValueLsb = GetTimerTicks(); + uint32_t timerValueMSB = TIMER_IF_BkUp_Read_MSBticks(); + + ticks = (((uint64_t) timerValueMSB) << 32) + timerValueLsb; + + seconds = (uint32_t)(ticks >> RTC_N_PREDIV_S); + + ticks = (uint32_t) ticks & RTC_PREDIV_S; + + *mSeconds = TIMER_IF_Convert_Tick2ms(ticks); + + /* USER CODE BEGIN TIMER_IF_GetTime_Last */ + + /* USER CODE END TIMER_IF_GetTime_Last */ return seconds; } @@ -210,6 +427,10 @@ void TIMER_IF_BkUp_Write_Seconds(uint32_t Seconds) /* USER CODE BEGIN TIMER_IF_BkUp_Write_Seconds */ /* USER CODE END TIMER_IF_BkUp_Write_Seconds */ + HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_SECONDS, Seconds); + /* USER CODE BEGIN TIMER_IF_BkUp_Write_Seconds_Last */ + + /* USER CODE END TIMER_IF_BkUp_Write_Seconds_Last */ } void TIMER_IF_BkUp_Write_SubSeconds(uint32_t SubSeconds) @@ -217,6 +438,10 @@ void TIMER_IF_BkUp_Write_SubSeconds(uint32_t SubSeconds) /* USER CODE BEGIN TIMER_IF_BkUp_Write_SubSeconds */ /* USER CODE END TIMER_IF_BkUp_Write_SubSeconds */ + HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_SUBSECONDS, SubSeconds); + /* USER CODE BEGIN TIMER_IF_BkUp_Write_SubSeconds_Last */ + + /* USER CODE END TIMER_IF_BkUp_Write_SubSeconds_Last */ } uint32_t TIMER_IF_BkUp_Read_Seconds(void) @@ -225,6 +450,10 @@ uint32_t TIMER_IF_BkUp_Read_Seconds(void) /* USER CODE BEGIN TIMER_IF_BkUp_Read_Seconds */ /* USER CODE END TIMER_IF_BkUp_Read_Seconds */ + ret = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_SECONDS); + /* USER CODE BEGIN TIMER_IF_BkUp_Read_Seconds_Last */ + + /* USER CODE END TIMER_IF_BkUp_Read_Seconds_Last */ return ret; } @@ -234,6 +463,10 @@ uint32_t TIMER_IF_BkUp_Read_SubSeconds(void) /* USER CODE BEGIN TIMER_IF_BkUp_Read_SubSeconds */ /* USER CODE END TIMER_IF_BkUp_Read_SubSeconds */ + ret = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_SUBSECONDS); + /* USER CODE BEGIN TIMER_IF_BkUp_Read_SubSeconds_Last */ + + /* USER CODE END TIMER_IF_BkUp_Read_SubSeconds_Last */ return ret; } @@ -242,6 +475,47 @@ uint32_t TIMER_IF_BkUp_Read_SubSeconds(void) /* USER CODE END EF */ /* Private functions ---------------------------------------------------------*/ +static void TIMER_IF_BkUp_Write_MSBticks(uint32_t MSBticks) +{ + /* USER CODE BEGIN TIMER_IF_BkUp_Write_MSBticks */ + + /* USER CODE END TIMER_IF_BkUp_Write_MSBticks */ + HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_MSBTICKS, MSBticks); + /* USER CODE BEGIN TIMER_IF_BkUp_Write_MSBticks_Last */ + + /* USER CODE END TIMER_IF_BkUp_Write_MSBticks_Last */ +} + +static uint32_t TIMER_IF_BkUp_Read_MSBticks(void) +{ + /* USER CODE BEGIN TIMER_IF_BkUp_Read_MSBticks */ + + /* USER CODE END TIMER_IF_BkUp_Read_MSBticks */ + uint32_t MSBticks; + MSBticks = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_MSBTICKS); + return MSBticks; + /* USER CODE BEGIN TIMER_IF_BkUp_Read_MSBticks_Last */ + + /* USER CODE END TIMER_IF_BkUp_Read_MSBticks_Last */ +} + +static inline uint32_t GetTimerTicks(void) +{ + /* USER CODE BEGIN GetTimerTicks */ + + /* USER CODE END GetTimerTicks */ + uint32_t ssr = LL_RTC_TIME_GetSubSecond(RTC); + /* read twice to make sure value it valid*/ + while (ssr != LL_RTC_TIME_GetSubSecond(RTC)) + { + ssr = LL_RTC_TIME_GetSubSecond(RTC); + } + return UINT32_MAX - ssr; + /* USER CODE BEGIN GetTimerTicks_Last */ + + /* USER CODE END GetTimerTicks_Last */ +} + /* USER CODE BEGIN PrFD */ /* USER CODE END PrFD */ diff --git a/MX_Generated/Core/Src/usart.c b/MX_Generated/Core/Src/usart.c index 0634085..78ff861 100644 --- a/MX_Generated/Core/Src/usart.c +++ b/MX_Generated/Core/Src/usart.c @@ -25,6 +25,8 @@ /* USER CODE END 0 */ UART_HandleTypeDef hlpuart1; +DMA_HandleTypeDef hdma_lpuart1_tx; +DMA_HandleTypeDef hdma_lpuart1_rx; /* LPUART1 init function */ @@ -106,6 +108,44 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + /* LPUART1 DMA Init */ + /* LPUART1_TX Init */ + hdma_lpuart1_tx.Instance = DMA1_Channel1; + hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX; + hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE; + hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_lpuart1_tx.Init.Mode = DMA_NORMAL; + hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW; + if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(uartHandle,hdmatx,hdma_lpuart1_tx); + + /* LPUART1_RX Init */ + hdma_lpuart1_rx.Instance = DMA1_Channel2; + hdma_lpuart1_rx.Init.Request = DMA_REQUEST_LPUART1_RX; + hdma_lpuart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_lpuart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_lpuart1_rx.Init.MemInc = DMA_MINC_ENABLE; + hdma_lpuart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_lpuart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_lpuart1_rx.Init.Mode = DMA_NORMAL; + hdma_lpuart1_rx.Init.Priority = DMA_PRIORITY_LOW; + if (HAL_DMA_Init(&hdma_lpuart1_rx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(uartHandle,hdmarx,hdma_lpuart1_rx); + + /* LPUART1 interrupt Init */ + HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(LPUART1_IRQn); /* USER CODE BEGIN LPUART1_MspInit 1 */ /* USER CODE END LPUART1_MspInit 1 */ @@ -129,6 +169,12 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); + /* LPUART1 DMA DeInit */ + HAL_DMA_DeInit(uartHandle->hdmatx); + HAL_DMA_DeInit(uartHandle->hdmarx); + + /* LPUART1 interrupt Deinit */ + HAL_NVIC_DisableIRQ(LPUART1_IRQn); /* USER CODE BEGIN LPUART1_MspDeInit 1 */ /* USER CODE END LPUART1_MspDeInit 1 */ diff --git a/MX_Generated/Core/Src/usart_if.c b/MX_Generated/Core/Src/usart_if.c new file mode 100644 index 0000000..7ca10e4 --- /dev/null +++ b/MX_Generated/Core/Src/usart_if.c @@ -0,0 +1,254 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file usart_if.c + * @author MCD Application Team + * @brief Configuration of UART driver interface for hyperterminal communication + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 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 "usart_if.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* External variables ---------------------------------------------------------*/ +/** + * @brief DMA handle + */ +extern DMA_HandleTypeDef hdma_lpuart1_tx; + +/** + * @brief UART handle + */ +extern UART_HandleTypeDef hlpuart1; + +/** + * @brief buffer to receive 1 character + */ +uint8_t charRx; + +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/* Private typedef -----------------------------------------------------------*/ +/** + * @brief Trace driver callbacks handler + */ +const UTIL_ADV_TRACE_Driver_s UTIL_TraceDriver = +{ + vcom_Init, + vcom_DeInit, + vcom_ReceiveInit, + vcom_Trace_DMA, +}; + +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/** + * @brief TX complete callback + * @return none + */ +static void (*TxCpltCallback)(void *); +/** + * @brief RX complete callback + * @param rxChar ptr of chars buffer sent by user + * @param size buffer size + * @param error errorcode + * @return none + */ +static void (*RxCpltCallback)(uint8_t *rxChar, uint16_t size, uint8_t error); + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ + +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Exported functions --------------------------------------------------------*/ + +UTIL_ADV_TRACE_Status_t vcom_Init(void (*cb)(void *)) +{ + /* USER CODE BEGIN vcom_Init_1 */ + + /* USER CODE END vcom_Init_1 */ + TxCpltCallback = cb; + MX_DMA_Init(); + MX_LPUART1_UART_Init(); + LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_28); + return UTIL_ADV_TRACE_OK; + /* USER CODE BEGIN vcom_Init_2 */ + + /* USER CODE END vcom_Init_2 */ +} + +UTIL_ADV_TRACE_Status_t vcom_DeInit(void) +{ + /* USER CODE BEGIN vcom_DeInit_1 */ + + /* USER CODE END vcom_DeInit_1 */ + /* ##-1- Reset peripherals ################################################## */ + __HAL_RCC_LPUART1_FORCE_RESET(); + __HAL_RCC_LPUART1_RELEASE_RESET(); + + /* ##-2- MspDeInit ################################################## */ + HAL_UART_MspDeInit(&hlpuart1); + + /* ##-3- Disable the NVIC for DMA ########################################### */ + /* USER CODE BEGIN 1 */ + HAL_NVIC_DisableIRQ(DMA1_Channel5_IRQn); + + return UTIL_ADV_TRACE_OK; + /* USER CODE END 1 */ + /* USER CODE BEGIN vcom_DeInit_2 */ + + /* USER CODE END vcom_DeInit_2 */ +} + +void vcom_Trace(uint8_t *p_data, uint16_t size) +{ + /* USER CODE BEGIN vcom_Trace_1 */ + + /* USER CODE END vcom_Trace_1 */ + HAL_UART_Transmit(&hlpuart1, p_data, size, 1000); + /* USER CODE BEGIN vcom_Trace_2 */ + + /* USER CODE END vcom_Trace_2 */ +} + +UTIL_ADV_TRACE_Status_t vcom_Trace_DMA(uint8_t *p_data, uint16_t size) +{ + /* USER CODE BEGIN vcom_Trace_DMA_1 */ + + /* USER CODE END vcom_Trace_DMA_1 */ + HAL_UART_Transmit_DMA(&hlpuart1, p_data, size); + return UTIL_ADV_TRACE_OK; + /* USER CODE BEGIN vcom_Trace_DMA_2 */ + + /* USER CODE END vcom_Trace_DMA_2 */ +} + +UTIL_ADV_TRACE_Status_t vcom_ReceiveInit(void (*RxCb)(uint8_t *rxChar, uint16_t size, uint8_t error)) +{ + /* USER CODE BEGIN vcom_ReceiveInit_1 */ + + /* USER CODE END vcom_ReceiveInit_1 */ + UART_WakeUpTypeDef WakeUpSelection; + + /*record call back*/ + RxCpltCallback = RxCb; + + /*Set wakeUp event on start bit*/ + WakeUpSelection.WakeUpEvent = UART_WAKEUP_ON_STARTBIT; + + HAL_UARTEx_StopModeWakeUpSourceConfig(&hlpuart1, WakeUpSelection); + + /* Make sure that no UART transfer is on-going */ + while (__HAL_UART_GET_FLAG(&hlpuart1, USART_ISR_BUSY) == SET); + + /* Make sure that UART is ready to receive) */ + while (__HAL_UART_GET_FLAG(&hlpuart1, USART_ISR_REACK) == RESET); + + /* Enable USART interrupt */ + __HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_WUF); + + /*Enable wakeup from stop mode*/ + HAL_UARTEx_EnableStopMode(&hlpuart1); + + /*Start LPUART receive on IT*/ + HAL_UART_Receive_IT(&hlpuart1, &charRx, 1); + + return UTIL_ADV_TRACE_OK; + /* USER CODE BEGIN vcom_ReceiveInit_2 */ + + /* USER CODE END vcom_ReceiveInit_2 */ +} + +void vcom_Resume(void) +{ + /* USER CODE BEGIN vcom_Resume_1 */ + + /* USER CODE END vcom_Resume_1 */ + /*to re-enable lost DMA settings*/ + if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN vcom_Resume_2 */ + + /* USER CODE END vcom_Resume_2 */ +} + +void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) +{ + /* USER CODE BEGIN HAL_UART_TxCpltCallback_1 */ + + /* USER CODE END HAL_UART_TxCpltCallback_1 */ + /* buffer transmission complete*/ + if (huart->Instance == LPUART1) + { + TxCpltCallback(NULL); + } + /* USER CODE BEGIN HAL_UART_TxCpltCallback_2 */ + + /* USER CODE END HAL_UART_TxCpltCallback_2 */ +} + +void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) +{ + /* USER CODE BEGIN HAL_UART_RxCpltCallback_1 */ + + /* USER CODE END HAL_UART_RxCpltCallback_1 */ + if (huart->Instance == LPUART1) + { + if ((NULL != RxCpltCallback) && (HAL_UART_ERROR_NONE == huart->ErrorCode)) + { + RxCpltCallback(&charRx, 1, 0); + } + HAL_UART_Receive_IT(huart, &charRx, 1); + } + /* USER CODE BEGIN HAL_UART_RxCpltCallback_2 */ + + /* USER CODE END HAL_UART_RxCpltCallback_2 */ +} + +/* USER CODE BEGIN EF */ + +/* USER CODE END EF */ + +/* Private Functions Definition -----------------------------------------------*/ + +/* USER CODE BEGIN PrFD */ + +/* USER CODE END PrFD */ diff --git a/MX_Generated/STM32WLE5CBUx.ioc b/MX_Generated/STM32WLE5CBUx.ioc index 680f688..4e5595e 100644 --- a/MX_Generated/STM32WLE5CBUx.ioc +++ b/MX_Generated/STM32WLE5CBUx.ioc @@ -5,6 +5,43 @@ ADC.SelectedChannel=ADC_CHANNEL_VREFINT|ADC_CHANNEL_VBAT CAD.formats= CAD.pinconfig= CAD.provider= +Dma.LPUART1_RX.1.Direction=DMA_PERIPH_TO_MEMORY +Dma.LPUART1_RX.1.EventEnable=DISABLE +Dma.LPUART1_RX.1.Instance=DMA1_Channel2 +Dma.LPUART1_RX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.LPUART1_RX.1.MemInc=DMA_MINC_ENABLE +Dma.LPUART1_RX.1.Mode=DMA_NORMAL +Dma.LPUART1_RX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.LPUART1_RX.1.PeriphInc=DMA_PINC_DISABLE +Dma.LPUART1_RX.1.Polarity=HAL_DMAMUX_REQ_GEN_RISING +Dma.LPUART1_RX.1.Priority=DMA_PRIORITY_LOW +Dma.LPUART1_RX.1.RequestNumber=1 +Dma.LPUART1_RX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber +Dma.LPUART1_RX.1.SignalID=NONE +Dma.LPUART1_RX.1.SyncEnable=DISABLE +Dma.LPUART1_RX.1.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT +Dma.LPUART1_RX.1.SyncRequestNumber=1 +Dma.LPUART1_RX.1.SyncSignalID=NONE +Dma.LPUART1_TX.0.Direction=DMA_MEMORY_TO_PERIPH +Dma.LPUART1_TX.0.EventEnable=DISABLE +Dma.LPUART1_TX.0.Instance=DMA1_Channel1 +Dma.LPUART1_TX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.LPUART1_TX.0.MemInc=DMA_MINC_ENABLE +Dma.LPUART1_TX.0.Mode=DMA_NORMAL +Dma.LPUART1_TX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.LPUART1_TX.0.PeriphInc=DMA_PINC_DISABLE +Dma.LPUART1_TX.0.Polarity=HAL_DMAMUX_REQ_GEN_RISING +Dma.LPUART1_TX.0.Priority=DMA_PRIORITY_LOW +Dma.LPUART1_TX.0.RequestNumber=1 +Dma.LPUART1_TX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber +Dma.LPUART1_TX.0.SignalID=NONE +Dma.LPUART1_TX.0.SyncEnable=DISABLE +Dma.LPUART1_TX.0.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT +Dma.LPUART1_TX.0.SyncRequestNumber=1 +Dma.LPUART1_TX.0.SyncSignalID=NONE +Dma.Request0=LPUART1_TX +Dma.Request1=LPUART1_RX +Dma.RequestsNb=2 File.Version=6 GPIO.groupedBy=Group By Peripherals KeepUserPlacement=false @@ -18,57 +55,70 @@ Mcu.CPN=STM32WLE5CBU6 Mcu.Family=STM32WL Mcu.IP0=ADC Mcu.IP1=ADV_TRACE -Mcu.IP10=SUBGHZ_PHY -Mcu.IP11=SYS -Mcu.IP12=TIMER -Mcu.IP13=TINY_LPM +Mcu.IP10=SUBGHZ +Mcu.IP11=SUBGHZ_PHY +Mcu.IP12=SYS +Mcu.IP13=TIMER +Mcu.IP14=TINY_LPM Mcu.IP2=DEBUG -Mcu.IP3=LPUART1 -Mcu.IP4=MISC -Mcu.IP5=NVIC -Mcu.IP6=RCC -Mcu.IP7=RTC -Mcu.IP8=SEQUENCER -Mcu.IP9=SUBGHZ -Mcu.IPNb=14 +Mcu.IP3=DMA +Mcu.IP4=LPUART1 +Mcu.IP5=MISC +Mcu.IP6=NVIC +Mcu.IP7=RCC +Mcu.IP8=RTC +Mcu.IP9=SEQUENCER +Mcu.IPNb=15 Mcu.Name=STM32WLE5CBUx Mcu.Package=UFQFPN48 -Mcu.Pin0=PA2 -Mcu.Pin1=PA3 -Mcu.Pin10=VP_ADV_TRACE_VS_ADV_TRACE -Mcu.Pin11=VP_MISC_VS_MISC -Mcu.Pin12=VP_RTC_VS_RTC_Activate -Mcu.Pin13=VP_RTC_VS_RTC_Calendar -Mcu.Pin14=VP_SEQUENCER_VS_SEQUENCER -Mcu.Pin15=VP_SUBGHZ_VS_SUBGHZ -Mcu.Pin16=VP_SUBGHZ_PHY_VS_SubGhzPhy -Mcu.Pin17=VP_SYS_VS_Systick -Mcu.Pin18=VP_TIMER_VS_TIMER -Mcu.Pin19=VP_TINY_LPM_VS_TINY_LPM -Mcu.Pin2=OSC_IN -Mcu.Pin3=OSC_OUT -Mcu.Pin4=PA13 -Mcu.Pin5=PC14-OSC32_IN -Mcu.Pin6=PC15-OSC32_OUT -Mcu.Pin7=PA14 -Mcu.Pin8=VP_ADC_Vref_Input -Mcu.Pin9=VP_ADC_Vbat_Input -Mcu.PinsNb=20 +Mcu.Pin0=PB3 +Mcu.Pin1=PB4 +Mcu.Pin10=PA14 +Mcu.Pin11=VP_ADC_Vref_Input +Mcu.Pin12=VP_ADC_Vbat_Input +Mcu.Pin13=VP_ADV_TRACE_VS_ADV_TRACE +Mcu.Pin14=VP_MISC_VS_MISC +Mcu.Pin15=VP_RTC_VS_RTC_Activate +Mcu.Pin16=VP_RTC_VS_RTC_Calendar +Mcu.Pin17=VP_RTC_VS_RTC_Alarm_A_Intern +Mcu.Pin18=VP_SEQUENCER_VS_SEQUENCER +Mcu.Pin19=VP_SUBGHZ_VS_SUBGHZ +Mcu.Pin2=PB5 +Mcu.Pin20=VP_SUBGHZ_PHY_VS_SubGhzPhy +Mcu.Pin21=VP_SYS_VS_Systick +Mcu.Pin22=VP_TIMER_VS_TIMER +Mcu.Pin23=VP_TINY_LPM_VS_TINY_LPM +Mcu.Pin3=PA2 +Mcu.Pin4=PA3 +Mcu.Pin5=OSC_IN +Mcu.Pin6=OSC_OUT +Mcu.Pin7=PA13 +Mcu.Pin8=PC14-OSC32_IN +Mcu.Pin9=PC15-OSC32_OUT +Mcu.PinsNb=24 Mcu.ThirdPartyNb=0 -Mcu.UserConstants= +Mcu.UserConstants=RTC_N_PREDIV_S,10;RTC_PREDIV_S,((1< MAX_APP_BUFFER_SIZE) +#error PAYLOAD_LEN must be less or equal than MAX_APP_BUFFER_SIZE +#endif /* (PAYLOAD_LEN > MAX_APP_BUFFER_SIZE) */ +/* wait for remote to be in Rx, before sending a Tx frame*/ +#define RX_TIME_MARGIN 200 +/* Afc bandwidth in Hz */ +#define FSK_AFC_BANDWIDTH 83333 +/* LED blink Period*/ +#define LED_PERIOD_MS 200 /* USER CODE END PD */ @@ -53,6 +85,26 @@ static RadioEvents_t RadioEvents; /* USER CODE BEGIN PV */ +/*Ping Pong FSM states */ +static States_t State = RX; +/* App Rx Buffer*/ +static uint8_t BufferRx[MAX_APP_BUFFER_SIZE]; +/* App Tx Buffer*/ +static uint8_t BufferTx[MAX_APP_BUFFER_SIZE]; +/* Last Received Buffer Size*/ +uint16_t RxBufferSize = 0; +/* Last Received packer Rssi*/ +int8_t RssiValue = 0; +/* Last Received packer SNR (in Lora modulation)*/ +int8_t SnrValue = 0; +/* Led Timers objects*/ +static UTIL_TIMER_Object_t timerLed; +/* device state. Master: true, Slave: false*/ +bool isMaster = true; +/* random delay to make sure 2 devices will sync*/ +/* the closest the random delays are, the longer it will + take for the devices to sync when started simultaneously*/ +static int32_t random_delay; /* USER CODE END PV */ @@ -87,6 +139,16 @@ static void OnRxTimeout(void); static void OnRxError(void); /* USER CODE BEGIN PFP */ +/** + * @brief Function executed on when led timer elapses + * @param context ptr of LED context + */ +static void OnledEvent(void *context); + +/** + * @brief PingPong state machine implementation + */ +static void PingPong_Process(void); /* USER CODE END PFP */ @@ -95,6 +157,22 @@ void SubghzApp_Init(void) { /* USER CODE BEGIN SubghzApp_Init_1 */ + APP_LOG(TS_OFF, VLEVEL_M, "\n\rPING PONG\n\r"); + /* Get SubGHY_Phy APP version*/ + APP_LOG(TS_OFF, VLEVEL_M, "APPLICATION_VERSION: V%X.%X.%X\r\n", + (uint8_t)(APP_VERSION_MAIN), + (uint8_t)(APP_VERSION_SUB1), + (uint8_t)(APP_VERSION_SUB2)); + + /* Get MW SubGhz_Phy info */ + APP_LOG(TS_OFF, VLEVEL_M, "MW_RADIO_VERSION: V%X.%X.%X\r\n", + (uint8_t)(SUBGHZ_PHY_VERSION_MAIN), + (uint8_t)(SUBGHZ_PHY_VERSION_SUB1), + (uint8_t)(SUBGHZ_PHY_VERSION_SUB2)); + + /* Led Timers*/ + UTIL_TIMER_Create(&timerLed, LED_PERIOD_MS, UTIL_TIMER_ONESHOT, OnledEvent, NULL); + UTIL_TIMER_Start(&timerLed); /* USER CODE END SubghzApp_Init_1 */ /* Radio initialization */ @@ -107,7 +185,62 @@ void SubghzApp_Init(void) Radio.Init(&RadioEvents); /* USER CODE BEGIN SubghzApp_Init_2 */ + /*calculate random delay for synchronization*/ + random_delay = (Radio.Random()) >> 22; /*10bits random e.g. from 0 to 1023 ms*/ + /* Radio Set frequency */ + Radio.SetChannel(RF_FREQUENCY); + + /* Radio configuration */ +#if ((USE_MODEM_LORA == 1) && (USE_MODEM_FSK == 0)) + APP_LOG(TS_OFF, VLEVEL_M, "---------------\n\r"); + APP_LOG(TS_OFF, VLEVEL_M, "LORA_MODULATION\n\r"); + APP_LOG(TS_OFF, VLEVEL_M, "LORA_BW=%d kHz\n\r", (1 << LORA_BANDWIDTH) * 125); + APP_LOG(TS_OFF, VLEVEL_M, "LORA_SF=%d\n\r", LORA_SPREADING_FACTOR); + + Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, + LORA_SPREADING_FACTOR, LORA_CODINGRATE, + LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, + true, 0, 0, LORA_IQ_INVERSION_ON, TX_TIMEOUT_VALUE); + + Radio.SetRxConfig(MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, + LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, + LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, + 0, true, 0, 0, LORA_IQ_INVERSION_ON, true); + + Radio.SetMaxPayloadLength(MODEM_LORA, MAX_APP_BUFFER_SIZE); + +#elif ((USE_MODEM_LORA == 0) && (USE_MODEM_FSK == 1)) + APP_LOG(TS_OFF, VLEVEL_M, "---------------\n\r"); + APP_LOG(TS_OFF, VLEVEL_M, "FSK_MODULATION\n\r"); + APP_LOG(TS_OFF, VLEVEL_M, "FSK_BW=%d Hz\n\r", FSK_BANDWIDTH); + APP_LOG(TS_OFF, VLEVEL_M, "FSK_DR=%d bits/s\n\r", FSK_DATARATE); + + Radio.SetTxConfig(MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0, + FSK_DATARATE, 0, + FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON, + true, 0, 0, 0, TX_TIMEOUT_VALUE); + + Radio.SetRxConfig(MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE, + 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH, + 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, true, + 0, 0, false, true); + + Radio.SetMaxPayloadLength(MODEM_FSK, MAX_APP_BUFFER_SIZE); + +#else +#error "Please define a modulation in the subghz_phy_app.h file." +#endif /* USE_MODEM_LORA | USE_MODEM_FSK */ + + /*fills tx buffer*/ + memset(BufferTx, 0x0, MAX_APP_BUFFER_SIZE); + + APP_LOG(TS_ON, VLEVEL_L, "rand=%d\n\r", random_delay); + /*starts reception*/ + Radio.Rx(RX_TIMEOUT_VALUE + random_delay); + + /*register task to to be run in while(1) after Radio IT*/ + UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), UTIL_SEQ_RFU, PingPong_Process); /* USER CODE END SubghzApp_Init_2 */ } @@ -119,33 +252,202 @@ void SubghzApp_Init(void) static void OnTxDone(void) { /* USER CODE BEGIN OnTxDone */ + APP_LOG(TS_ON, VLEVEL_L, "OnTxDone\n\r"); + /* Update the State of the FSM*/ + State = TX; + /* Run PingPong process in background*/ + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0); /* USER CODE END OnTxDone */ } static void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t LoraSnr_FskCfo) { /* USER CODE BEGIN OnRxDone */ + APP_LOG(TS_ON, VLEVEL_L, "OnRxDone\n\r"); +#if ((USE_MODEM_LORA == 1) && (USE_MODEM_FSK == 0)) + APP_LOG(TS_ON, VLEVEL_L, "RssiValue=%d dBm, SnrValue=%ddB\n\r", rssi, LoraSnr_FskCfo); + /* Record payload Signal to noise ratio in Lora*/ + SnrValue = LoraSnr_FskCfo; +#endif /* USE_MODEM_LORA | USE_MODEM_FSK */ +#if ((USE_MODEM_LORA == 0) && (USE_MODEM_FSK == 1)) + APP_LOG(TS_ON, VLEVEL_L, "RssiValue=%d dBm, Cfo=%dkHz\n\r", rssi, LoraSnr_FskCfo); + SnrValue = 0; /*not applicable in GFSK*/ +#endif /* USE_MODEM_LORA | USE_MODEM_FSK */ + /* Update the State of the FSM*/ + State = RX; + /* Clear BufferRx*/ + memset(BufferRx, 0, MAX_APP_BUFFER_SIZE); + /* Record payload size*/ + RxBufferSize = size; + if (RxBufferSize <= MAX_APP_BUFFER_SIZE) + { + memcpy(BufferRx, payload, RxBufferSize); + } + /* Record Received Signal Strength*/ + RssiValue = rssi; + /* Record payload content*/ + APP_LOG(TS_ON, VLEVEL_H, "payload. size=%d \n\r", size); + for (int32_t i = 0; i < PAYLOAD_LEN; i++) + { + APP_LOG(TS_OFF, VLEVEL_H, "%02X", BufferRx[i]); + if (i % 16 == 15) + { + APP_LOG(TS_OFF, VLEVEL_H, "\n\r"); + } + } + APP_LOG(TS_OFF, VLEVEL_H, "\n\r"); + /* Run PingPong process in background*/ + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0); /* USER CODE END OnRxDone */ } static void OnTxTimeout(void) { /* USER CODE BEGIN OnTxTimeout */ + APP_LOG(TS_ON, VLEVEL_L, "OnTxTimeout\n\r"); + /* Update the State of the FSM*/ + State = TX_TIMEOUT; + /* Run PingPong process in background*/ + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0); /* USER CODE END OnTxTimeout */ } static void OnRxTimeout(void) { /* USER CODE BEGIN OnRxTimeout */ + APP_LOG(TS_ON, VLEVEL_L, "OnRxTimeout\n\r"); + /* Update the State of the FSM*/ + State = RX_TIMEOUT; + /* Run PingPong process in background*/ + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0); /* USER CODE END OnRxTimeout */ } static void OnRxError(void) { /* USER CODE BEGIN OnRxError */ + APP_LOG(TS_ON, VLEVEL_L, "OnRxError\n\r"); + /* Update the State of the FSM*/ + State = RX_ERROR; + /* Run PingPong process in background*/ + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0); /* USER CODE END OnRxError */ } /* USER CODE BEGIN PrFD */ +static void PingPong_Process(void) +{ + Radio.Sleep(); + + switch (State) + { + case RX: + + if (isMaster == true) + { + if (RxBufferSize > 0) + { + if (strncmp((const char *)BufferRx, PONG, sizeof(PONG) - 1) == 0) + { + UTIL_TIMER_Stop(&timerLed); + /* switch off green led */ + HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET); /* LED_GREEN */ + /* master toggles red led */ + HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); /* LED_RED */ + /* Add delay between RX and TX */ + HAL_Delay(Radio.GetWakeupTime() + RX_TIME_MARGIN); + /* master sends PING*/ + APP_LOG(TS_ON, VLEVEL_L, "..." + "PING" + "\n\r"); + APP_LOG(TS_ON, VLEVEL_L, "Master Tx start\n\r"); + memcpy(BufferTx, PING, sizeof(PING) - 1); + Radio.Send(BufferTx, PAYLOAD_LEN); + } + else if (strncmp((const char *)BufferRx, PING, sizeof(PING) - 1) == 0) + { + /* A master already exists then become a slave */ + isMaster = false; + APP_LOG(TS_ON, VLEVEL_L, "Slave Rx start\n\r"); + Radio.Rx(RX_TIMEOUT_VALUE); + } + else /* valid reception but neither a PING or a PONG message */ + { + /* Set device as master and start again */ + isMaster = true; + APP_LOG(TS_ON, VLEVEL_L, "Master Rx start\n\r"); + Radio.Rx(RX_TIMEOUT_VALUE); + } + } + } + else + { + if (RxBufferSize > 0) + { + if (strncmp((const char *)BufferRx, PING, sizeof(PING) - 1) == 0) + { + UTIL_TIMER_Stop(&timerLed); + /* switch off red led */ + HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET); /* LED_RED */ + /* slave toggles green led */ + HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); /* LED_GREEN */ + /* Add delay between RX and TX */ + HAL_Delay(Radio.GetWakeupTime() + RX_TIME_MARGIN); + /*slave sends PONG*/ + APP_LOG(TS_ON, VLEVEL_L, "..." + "PONG" + "\n\r"); + APP_LOG(TS_ON, VLEVEL_L, "Slave Tx start\n\r"); + memcpy(BufferTx, PONG, sizeof(PONG) - 1); + Radio.Send(BufferTx, PAYLOAD_LEN); + } + else /* valid reception but not a PING as expected */ + { + /* Set device as master and start again */ + isMaster = true; + APP_LOG(TS_ON, VLEVEL_L, "Master Rx start\n\r"); + Radio.Rx(RX_TIMEOUT_VALUE); + } + } + } + break; + case TX: + APP_LOG(TS_ON, VLEVEL_L, "Rx start\n\r"); + Radio.Rx(RX_TIMEOUT_VALUE); + break; + case RX_TIMEOUT: + case RX_ERROR: + if (isMaster == true) + { + /* Send the next PING frame */ + /* Add delay between RX and TX*/ + /* add random_delay to force sync between boards after some trials*/ + HAL_Delay(Radio.GetWakeupTime() + RX_TIME_MARGIN + random_delay); + APP_LOG(TS_ON, VLEVEL_L, "Master Tx start\n\r"); + /* master sends PING*/ + memcpy(BufferTx, PING, sizeof(PING) - 1); + Radio.Send(BufferTx, PAYLOAD_LEN); + } + else + { + APP_LOG(TS_ON, VLEVEL_L, "Slave Rx start\n\r"); + Radio.Rx(RX_TIMEOUT_VALUE); + } + break; + case TX_TIMEOUT: + APP_LOG(TS_ON, VLEVEL_L, "Slave Rx start\n\r"); + Radio.Rx(RX_TIMEOUT_VALUE); + break; + default: + break; + } +} + +static void OnledEvent(void *context) +{ + HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); /* LED_GREEN */ + HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); /* LED_RED */ + UTIL_TIMER_Start(&timerLed); +} /* USER CODE END PrFD */ diff --git a/MX_Generated/SubGHz_Phy/App/subghz_phy_app.h b/MX_Generated/SubGHz_Phy/App/subghz_phy_app.h index 852d1f4..2869f88 100644 --- a/MX_Generated/SubGHz_Phy/App/subghz_phy_app.h +++ b/MX_Generated/SubGHz_Phy/App/subghz_phy_app.h @@ -34,9 +34,43 @@ extern "C" { /* Exported types ------------------------------------------------------------*/ /* USER CODE BEGIN ET */ +#define TX_OUTPUT_POWER 7 + /* USER CODE END ET */ /* Exported constants --------------------------------------------------------*/ +/* MODEM type: one shall be 1 the other shall be 0 */ +#define USE_MODEM_LORA 1 +#define USE_MODEM_FSK 0 + +#define RF_FREQUENCY 491975000 /* Hz */ + +#ifndef TX_OUTPUT_POWER /* please, to change this value, redefine it in USER CODE SECTION */ +#define TX_OUTPUT_POWER 14 /* dBm */ +#endif /* TX_OUTPUT_POWER */ + +#if (( USE_MODEM_LORA == 1 ) && ( USE_MODEM_FSK == 0 )) +#define LORA_BANDWIDTH 0 /* [0: 125 kHz, 1: 250 kHz, 2: 500 kHz, 3: Reserved] */ +#define LORA_SPREADING_FACTOR 9 /* [SF7..SF12] */ +#define LORA_CODINGRATE 1 /* [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] */ +#define LORA_PREAMBLE_LENGTH 8 /* Same for Tx and Rx */ +#define LORA_SYMBOL_TIMEOUT 5 /* Symbols */ +#define LORA_FIX_LENGTH_PAYLOAD_ON false +#define LORA_IQ_INVERSION_ON false + +#elif (( USE_MODEM_LORA == 0 ) && ( USE_MODEM_FSK == 1 )) + +#define FSK_FDEV 25000 /* Hz */ +#define FSK_DATARATE 50000 /* bps */ +#define FSK_BANDWIDTH 50000 /* Hz */ +#define FSK_PREAMBLE_LENGTH 5 /* Same for Tx and Rx */ +#define FSK_FIX_LENGTH_PAYLOAD_ON false + +#else +#error "Please define a modem in the compiler subghz_phy_app.h." +#endif /* USE_MODEM_LORA | USE_MODEM_FSK */ + +#define PAYLOAD_LEN 64 /* USER CODE BEGIN EC */ diff --git a/MX_Generated/SubGHz_Phy/Target/mw_log_conf.h b/MX_Generated/SubGHz_Phy/Target/mw_log_conf.h index 5c42d20..9a29073 100644 --- a/MX_Generated/SubGHz_Phy/Target/mw_log_conf.h +++ b/MX_Generated/SubGHz_Phy/Target/mw_log_conf.h @@ -27,6 +27,8 @@ extern "C" { #endif /* Includes ------------------------------------------------------------------*/ +#include "stm32_adv_trace.h" + /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ @@ -50,15 +52,9 @@ extern "C" { /* Exported macro ------------------------------------------------------------*/ #ifdef MW_LOG_ENABLED -/* USER CODE BEGIN Mw_Logs_En*/ -/* Map your own trace mechanism or to map UTIL_ADV_TRACE see examples from CubeFw, i.e.: - do{ {UTIL_ADV_TRACE_COND_FSend(VL, T_REG_OFF, TS, __VA_ARGS__);} }while(0) */ -#define MW_LOG(TS,VL, ...) -/* USER CODE END Mw_Logs_En */ +#define MW_LOG(TS,VL, ...) do{ {UTIL_ADV_TRACE_COND_FSend(VL, T_REG_OFF, TS, __VA_ARGS__);} }while(0) #else /* MW_LOG_ENABLED */ -/* USER CODE BEGIN Mw_Logs_Dis*/ #define MW_LOG(TS,VL, ...) -/* USER CODE END Mw_Logs_Dis */ #endif /* MW_LOG_ENABLED */ /* USER CODE BEGIN EM */ diff --git a/MX_Generated/SubGHz_Phy/Target/radio_conf.h b/MX_Generated/SubGHz_Phy/Target/radio_conf.h index d254aa3..79aefec 100644 --- a/MX_Generated/SubGHz_Phy/Target/radio_conf.h +++ b/MX_Generated/SubGHz_Phy/Target/radio_conf.h @@ -33,6 +33,7 @@ extern "C" { #include "mw_log_conf.h" /* mw trace conf */ #include "radio_board_if.h" /* low layer api (bsp) */ #include "utilities_def.h" /* low layer api (bsp) */ +#include "sys_debug.h" /* USER CODE BEGIN include */ /* USER CODE END include */ diff --git a/src/main.c b/src/main.c index f2cc5a8..6eb392d 100644 --- a/src/main.c +++ b/src/main.c @@ -8,7 +8,7 @@ #include "subghz.h" #include "usart.h" -#include "radio.h" +#include "app_subghz_phy.h" extern void SystemClock_Config(void); @@ -19,13 +19,12 @@ int main(void) { /* Hardware initialization */ MX_GPIO_Init(); SystemClock_Config(); - MX_RTC_Init(); - MX_LPUART1_UART_Init(); - MX_SUBGHZ_Init(); + + MX_SubGHz_Phy_Init(); printf("Initialization completed.\r\n"); for (;;) { - /* -- */ + MX_SubGHz_Phy_Process(); } } \ No newline at end of file