diff --git a/Onboarding/Mini-ACU/.gitkeep b/Onboarding/Mini-ACU/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Onboarding/Mini-ECU/.gitkeep b/Onboarding/Mini-ECU/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Onboarding/Mini-Inverter/.gitkeep b/Onboarding/Mini-Inverter/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Onboarding/W3_G4SPI_Receive/CMakeLists.txt b/Onboarding/W3_G4SPI_Receive/CMakeLists.txt deleted file mode 100644 index 2a9cb25be..000000000 --- a/Onboarding/W3_G4SPI_Receive/CMakeLists.txt +++ /dev/null @@ -1,50 +0,0 @@ -cmake_minimum_required(VERSION 3.25) - -# Setup compiler settings -set(CMAKE_C_STANDARD 11) -set(CMAKE_C_STANDARD_REQUIRED ON) -set(CMAKE_C_EXTENSIONS ON) - -# Define the build type -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Debug") -endif() - -# what, does in fact not get the filename of somthing but rather the name of the project from the path -get_filename_component(GR_PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) - -# Enable CMake support for ASM and C languages -enable_language( - C - ASM -) - -# Core project settings -project(${CMAKE_PROJECT_NAME}) - -# Questionable... -# set(TARGET_FLAGS "-mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard ") -# set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS "-T${CHIP_PATH}/CompileDependencies/STM32G474RETx_FLASH.ld") - -add_library(${GR_PROJECT_NAME}_USER_CODE INTERFACE) -target_sources( - ${GR_PROJECT_NAME}_USER_CODE - INTERFACE - Core/Src/main.c - #Core/Src/gpio.c - #Core/Src/adc.c - #Core/Src/crc.c - #Core/Src/fdcan.c - #Core/Src/spi.c - Core/Src/stm32g4xx_it.c - Core/Src/stm32g4xx_hal_msp.c -) - -target_link_libraries(${GR_PROJECT_NAME}_USER_CODE INTERFACE) - -target_include_directories( - ${GR_PROJECT_NAME}_USER_CODE - INTERFACE - Application/Inc - Core/Inc -) diff --git a/Onboarding/W3_G4SPI_Receive/Core/Inc/main.h b/Onboarding/W3_G4SPI_Receive/Core/Inc/main.h deleted file mode 100644 index a0a290aa9..000000000 --- a/Onboarding/W3_G4SPI_Receive/Core/Inc/main.h +++ /dev/null @@ -1,69 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.h - * @brief : Header for main.c file. - * This file contains the common defines of the application. - ****************************************************************************** - * @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 */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MAIN_H -#define __MAIN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_hal.h" - -/* Private 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 */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void Error_Handler(void); - -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -/* Private defines -----------------------------------------------------------*/ - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -#ifdef __cplusplus -} -#endif - -#endif /* __MAIN_H */ diff --git a/Onboarding/W3_G4SPI_Receive/Core/Inc/stm32g4xx_hal_conf.h b/Onboarding/W3_G4SPI_Receive/Core/Inc/stm32g4xx_hal_conf.h deleted file mode 100644 index 2c54ce1b3..000000000 --- a/Onboarding/W3_G4SPI_Receive/Core/Inc/stm32g4xx_hal_conf.h +++ /dev/null @@ -1,390 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32g4xx_hal_conf.h - * @author MCD Application Team - * @brief HAL configuration file - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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 STM32G4xx_HAL_CONF_H -#define STM32G4xx_HAL_CONF_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ - -#define HAL_MODULE_ENABLED - -/*#define HAL_ADC_MODULE_ENABLED */ -/*#define HAL_COMP_MODULE_ENABLED */ -/*#define HAL_CORDIC_MODULE_ENABLED */ -/*#define HAL_CRC_MODULE_ENABLED */ -/*#define HAL_CRYP_MODULE_ENABLED */ -/*#define HAL_DAC_MODULE_ENABLED */ -/*#define HAL_FDCAN_MODULE_ENABLED */ -/*#define HAL_FMAC_MODULE_ENABLED */ -/*#define HAL_HRTIM_MODULE_ENABLED */ -/*#define HAL_IRDA_MODULE_ENABLED */ -/*#define HAL_IWDG_MODULE_ENABLED */ -/*#define HAL_I2C_MODULE_ENABLED */ -/*#define HAL_I2S_MODULE_ENABLED */ -/*#define HAL_LPTIM_MODULE_ENABLED */ -/*#define HAL_NAND_MODULE_ENABLED */ -/*#define HAL_NOR_MODULE_ENABLED */ -/*#define HAL_OPAMP_MODULE_ENABLED */ -/*#define HAL_PCD_MODULE_ENABLED */ -/*#define HAL_QSPI_MODULE_ENABLED */ -/*#define HAL_RNG_MODULE_ENABLED */ -/*#define HAL_RTC_MODULE_ENABLED */ -/*#define HAL_SAI_MODULE_ENABLED */ -/*#define HAL_SMARTCARD_MODULE_ENABLED */ -/*#define HAL_SMBUS_MODULE_ENABLED */ -#define HAL_SPI_MODULE_ENABLED -/*#define HAL_SRAM_MODULE_ENABLED */ -/*#define HAL_TIM_MODULE_ENABLED */ -/*#define HAL_UART_MODULE_ENABLED */ -#define HAL_USART_MODULE_ENABLED -/*#define HAL_WWDG_MODULE_ENABLED */ -#define HAL_GPIO_MODULE_ENABLED -#define HAL_EXTI_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED - -/* ########################## Register Callbacks selection - * ############################## */ -/** - * @brief This is the list of modules where register callback can be used - */ -#define USE_HAL_ADC_REGISTER_CALLBACKS 0U -#define USE_HAL_COMP_REGISTER_CALLBACKS 0U -#define USE_HAL_CORDIC_REGISTER_CALLBACKS 0U -#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U -#define USE_HAL_DAC_REGISTER_CALLBACKS 0U -#define USE_HAL_EXTI_REGISTER_CALLBACKS 0U -#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U -#define USE_HAL_FMAC_REGISTER_CALLBACKS 0U -#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U -#define USE_HAL_I2C_REGISTER_CALLBACKS 0U -#define USE_HAL_I2S_REGISTER_CALLBACKS 0U -#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U -#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U -#define USE_HAL_NAND_REGISTER_CALLBACKS 0U -#define USE_HAL_NOR_REGISTER_CALLBACKS 0U -#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U -#define USE_HAL_PCD_REGISTER_CALLBACKS 0U -#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U -#define USE_HAL_RNG_REGISTER_CALLBACKS 0U -#define USE_HAL_RTC_REGISTER_CALLBACKS 0U -#define USE_HAL_SAI_REGISTER_CALLBACKS 0U -#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U -#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U -#define USE_HAL_SPI_REGISTER_CALLBACKS 0U -#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U -#define USE_HAL_TIM_REGISTER_CALLBACKS 0U -#define USE_HAL_UART_REGISTER_CALLBACKS 0U -#define USE_HAL_USART_REGISTER_CALLBACKS 0U -#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U - -/* ########################## Oscillator Values adaptation - * ####################*/ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your - * application. This value is used by the RCC HAL module to compute the system - * frequency (when HSE is used as system clock source, directly or through the - * PLL). - */ -#if !defined(HSE_VALUE) -#define HSE_VALUE (8000000UL) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined(HSE_STARTUP_TIMEOUT) -#define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system - * frequency (when HSI is used as system clock source, directly or through the - * PLL). - */ -#if !defined(HSI_VALUE) -#define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief Internal High Speed oscillator (HSI48) value for USB FS and RNG. - * This internal oscillator is mainly dedicated to provide a high - * precision clock to the USB peripheral by means of a special Clock Recovery - * System (CRS) circuitry. When the CRS is not used, the HSI48 RC oscillator - * runs on it default frequency which is subject to manufacturing process - * variations. - */ -#if !defined(HSI48_VALUE) -#define HSI48_VALUE \ - (48000000UL) /*!< Value of the Internal High Speed oscillator for USB \ - FS/RNG in Hz. The real value my vary depending on \ - manufacturing process variations.*/ -#endif /* HSI48_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined(LSI_VALUE) -/*!< Value of the Internal Low Speed oscillator in Hz -The real value may vary depending on the variations in voltage and -temperature.*/ -#define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ -/** - * @brief External Low Speed oscillator (LSE) value. - * This value is used by the UART, RTC HAL module to compute the system - * frequency - */ -#if !defined(LSE_VALUE) -#define LSE_VALUE (32768UL) /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -#if !defined(LSE_STARTUP_TIMEOUT) -#define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -/** - * @brief External clock source for I2S and SAI peripherals - * This value is used by the I2S and SAI HAL modules to compute the I2S - * and SAI clock source frequency, this source is inserted directly through - * I2S_CKIN pad. - */ -#if !defined(EXTERNAL_CLOCK_VALUE) -#define EXTERNAL_CLOCK_VALUE (12288000UL) /*!< Value of the External oscillator in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ - -#define VDD_VALUE (3300UL) /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY (15UL) /*!< tick interrupt priority (lowest by default) */ -#define USE_RTOS 0U -#define PREFETCH_ENABLE 0U -#define INSTRUCTION_CACHE_ENABLE 1U -#define DATA_CACHE_ENABLE 1U - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1U */ - -/* ################## SPI peripheral configuration ########################## */ - -/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver - * Activated: CRC code is present inside driver - * Deactivated: CRC code cleaned from driver - */ - -#define USE_SPI_CRC 0U - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED -#include "stm32g4xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED -#include "stm32g4xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED -#include "stm32g4xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED -#include "stm32g4xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED -#include "stm32g4xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_COMP_MODULE_ENABLED -#include "stm32g4xx_hal_comp.h" -#endif /* HAL_COMP_MODULE_ENABLED */ - -#ifdef HAL_CORDIC_MODULE_ENABLED -#include "stm32g4xx_hal_cordic.h" -#endif /* HAL_CORDIC_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED -#include "stm32g4xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED -#include "stm32g4xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED -#include "stm32g4xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED -#include "stm32g4xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_FDCAN_MODULE_ENABLED -#include "stm32g4xx_hal_fdcan.h" -#endif /* HAL_FDCAN_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED -#include "stm32g4xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_FMAC_MODULE_ENABLED -#include "stm32g4xx_hal_fmac.h" -#endif /* HAL_FMAC_MODULE_ENABLED */ - -#ifdef HAL_HRTIM_MODULE_ENABLED -#include "stm32g4xx_hal_hrtim.h" -#endif /* HAL_HRTIM_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED -#include "stm32g4xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED -#include "stm32g4xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED -#include "stm32g4xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED -#include "stm32g4xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED -#include "stm32g4xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED -#include "stm32g4xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED -#include "stm32g4xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_OPAMP_MODULE_ENABLED -#include "stm32g4xx_hal_opamp.h" -#endif /* HAL_OPAMP_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED -#include "stm32g4xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED -#include "stm32g4xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED -#include "stm32g4xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED -#include "stm32g4xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED -#include "stm32g4xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED -#include "stm32g4xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED -#include "stm32g4xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED -#include "stm32g4xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED -#include "stm32g4xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED -#include "stm32g4xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED -#include "stm32g4xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED -#include "stm32g4xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED -#include "stm32g4xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED -#include "stm32g4xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -/* 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 /* STM32G4xx_HAL_CONF_H */ diff --git a/Onboarding/W3_G4SPI_Receive/Core/Inc/stm32g4xx_hal_usart.h b/Onboarding/W3_G4SPI_Receive/Core/Inc/stm32g4xx_hal_usart.h deleted file mode 100644 index 209e70af6..000000000 --- a/Onboarding/W3_G4SPI_Receive/Core/Inc/stm32g4xx_hal_usart.h +++ /dev/null @@ -1,1008 +0,0 @@ -/** - ****************************************************************************** - * @file stm32g4xx_hal_usart.h - * @author MCD Application Team - * @brief Header file of USART HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32G4xx_HAL_USART_H -#define STM32G4xx_HAL_USART_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_hal_def.h" - -/** @addtogroup STM32G4xx_HAL_Driver - * @{ - */ - -/** @addtogroup USART - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup USART_Exported_Types USART Exported Types - * @{ - */ - -/** - * @brief USART Init Structure definition - */ -typedef struct { - uint32_t BaudRate; /*!< This member configures the Usart communication baud - rate. The baud rate is computed using the following - formula: Baud Rate Register[15:4] = ((2 * fclk_pres) / - ((huart->Init.BaudRate)))[15:4] - Baud Rate Register[3] = 0 - Baud Rate Register[2:0] = (((2 * fclk_pres) / - ((huart->Init.BaudRate)))[3:0]) >> 1 - where fclk_pres is the USART input clock frequency - (fclk) divided by a prescaler. - @note Oversampling by 8 is systematically applied to - achieve high baud rates. */ - - uint32_t WordLength; /*!< Specifies the number of data bits transmitted - or received in a frame. This parameter can be a - value of @ref USARTEx_Word_Length. */ - - uint32_t StopBits; /*!< Specifies the number of stop bits transmitted. - This parameter can be a value of @ref - USART_Stop_Bits. */ - - uint32_t Parity; /*!< Specifies the parity mode. - This parameter can be a value of @ref USART_Parity - @note When parity is enabled, the computed parity is - inserted at the MSB position of the transmitted data (9th - bit when the word length is set to 9 data bits; 8th bit - when the word length is set to 8 data bits). */ - - uint32_t Mode; /*!< Specifies whether the Receive or Transmit mode is - enabled or disabled. This parameter can be a value of - @ref USART_Mode. */ - - uint32_t CLKPolarity; /*!< Specifies the steady state of the serial - clock. This parameter can be a value of @ref - USART_Clock_Polarity. */ - - uint32_t CLKPhase; /*!< Specifies the clock transition on which the bit - capture is made. This parameter can be a value of - @ref USART_Clock_Phase. */ - - uint32_t CLKLastBit; /*!< Specifies whether the clock pulse corresponding to - the last transmitted data bit (MSB) has to be output - on the SCLK pin in synchronous mode. This parameter - can be a value of @ref USART_Last_Bit. */ - - uint32_t ClockPrescaler; /*!< Specifies the prescaler value used to divide - the USART clock source. This parameter can be a - value of @ref USART_ClockPrescaler. */ -} USART_InitTypeDef; - -/** - * @brief HAL USART State structures definition - */ -typedef enum { - HAL_USART_STATE_RESET = 0x00U, /*!< Peripheral is not initialized */ - HAL_USART_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ - HAL_USART_STATE_BUSY = 0x02U, /*!< an internal process is ongoing */ - HAL_USART_STATE_BUSY_TX = 0x12U, /*!< Data Transmission process is ongoing */ - HAL_USART_STATE_BUSY_RX = 0x22U, /*!< Data Reception process is ongoing */ - HAL_USART_STATE_BUSY_TX_RX = 0x32U, /*!< Data Transmission Reception process is ongoing */ - HAL_USART_STATE_TIMEOUT = 0x03U, /*!< Timeout state */ - HAL_USART_STATE_ERROR = 0x04U /*!< Error */ -} HAL_USART_StateTypeDef; - -/** - * @brief USART clock sources definitions - */ -typedef enum { - USART_CLOCKSOURCE_PCLK1 = 0x00U, /*!< PCLK1 clock source */ - USART_CLOCKSOURCE_PCLK2 = 0x01U, /*!< PCLK2 clock source */ - USART_CLOCKSOURCE_HSI = 0x02U, /*!< HSI clock source */ - USART_CLOCKSOURCE_SYSCLK = 0x04U, /*!< SYSCLK clock source */ - USART_CLOCKSOURCE_LSE = 0x08U, /*!< LSE clock source */ - USART_CLOCKSOURCE_UNDEFINED = 0x10U /*!< Undefined clock source */ -} USART_ClockSourceTypeDef; - -/** - * @brief USART handle Structure definition - */ -typedef struct __USART_HandleTypeDef { - USART_TypeDef *Instance; /*!< USART registers base address */ - - USART_InitTypeDef Init; /*!< USART communication parameters */ - - const uint8_t *pTxBuffPtr; /*!< Pointer to USART Tx transfer Buffer */ - - uint16_t TxXferSize; /*!< USART Tx Transfer size */ - - __IO uint16_t TxXferCount; /*!< USART Tx Transfer Counter */ - - uint8_t *pRxBuffPtr; /*!< Pointer to USART Rx transfer Buffer */ - - uint16_t RxXferSize; /*!< USART Rx Transfer size */ - - __IO uint16_t RxXferCount; /*!< USART Rx Transfer Counter */ - - uint16_t Mask; /*!< USART Rx RDR register mask */ - - uint16_t NbRxDataToProcess; /*!< Number of data to process during RX ISR - execution */ - - uint16_t NbTxDataToProcess; /*!< Number of data to process during TX ISR - execution */ - - uint32_t SlaveMode; /*!< Enable/Disable USART SPI Slave Mode. This parameter - can be a value of @ref USARTEx_Slave_Mode */ - - uint32_t FifoMode; /*!< Specifies if the FIFO mode will be used. This - parameter can be a value of @ref USARTEx_FIFO_mode. */ - - void (*RxISR)(struct __USART_HandleTypeDef *husart); /*!< Function pointer on Rx IRQ handler */ - - void (*TxISR)(struct __USART_HandleTypeDef *husart); /*!< Function pointer on Tx IRQ handler */ - - DMA_HandleTypeDef *hdmatx; /*!< USART Tx DMA Handle parameters */ - - DMA_HandleTypeDef *hdmarx; /*!< USART Rx DMA Handle parameters */ - - HAL_LockTypeDef Lock; /*!< Locking object */ - - __IO HAL_USART_StateTypeDef State; /*!< USART communication state */ - - __IO uint32_t ErrorCode; /*!< USART Error code */ - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - void (*TxHalfCpltCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Tx Half Complete Callback */ - void (*TxCpltCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Tx Complete Callback */ - void (*RxHalfCpltCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Rx Half Complete Callback */ - void (*RxCpltCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Rx Complete Callback */ - void (*TxRxCpltCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Tx Rx Complete Callback */ - void (*ErrorCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Error Callback */ - void (*AbortCpltCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Abort Complete Callback */ - void (*RxFifoFullCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Rx Fifo Full Callback */ - void (*TxFifoEmptyCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Tx Fifo Empty Callback */ - - void (*MspInitCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Msp Init callback */ - void (*MspDeInitCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Msp DeInit callback */ -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - -} USART_HandleTypeDef; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) -/** - * @brief HAL USART Callback ID enumeration definition - */ -typedef enum { - HAL_USART_TX_HALFCOMPLETE_CB_ID = 0x00U, /*!< USART Tx Half Complete Callback ID */ - HAL_USART_TX_COMPLETE_CB_ID = 0x01U, /*!< USART Tx Complete Callback ID */ - HAL_USART_RX_HALFCOMPLETE_CB_ID = 0x02U, /*!< USART Rx Half Complete Callback ID */ - HAL_USART_RX_COMPLETE_CB_ID = 0x03U, /*!< USART Rx Complete Callback ID */ - HAL_USART_TX_RX_COMPLETE_CB_ID = 0x04U, /*!< USART Tx Rx Complete Callback ID */ - HAL_USART_ERROR_CB_ID = 0x05U, /*!< USART Error Callback ID */ - HAL_USART_ABORT_COMPLETE_CB_ID = 0x06U, /*!< USART Abort Complete Callback ID */ - HAL_USART_RX_FIFO_FULL_CB_ID = 0x07U, /*!< USART Rx Fifo Full Callback ID */ - HAL_USART_TX_FIFO_EMPTY_CB_ID = 0x08U, /*!< USART Tx Fifo Empty Callback ID */ - - HAL_USART_MSPINIT_CB_ID = 0x09U, /*!< USART MspInit callback ID */ - HAL_USART_MSPDEINIT_CB_ID = 0x0AU /*!< USART MspDeInit callback ID */ - -} HAL_USART_CallbackIDTypeDef; - -/** - * @brief HAL USART Callback pointer definition - */ -typedef void (*pUSART_CallbackTypeDef)(USART_HandleTypeDef *husart); /*!< pointer to an USART callback function */ - -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup USART_Exported_Constants USART Exported Constants - * @{ - */ - -/** @defgroup USART_Error_Definition USART Error Definition - * @{ - */ -#define HAL_USART_ERROR_NONE (0x00000000U) /*!< No error */ -#define HAL_USART_ERROR_PE (0x00000001U) /*!< Parity error */ -#define HAL_USART_ERROR_NE (0x00000002U) /*!< Noise error */ -#define HAL_USART_ERROR_FE (0x00000004U) /*!< Frame error */ -#define HAL_USART_ERROR_ORE (0x00000008U) /*!< Overrun error */ -#define HAL_USART_ERROR_DMA (0x00000010U) /*!< DMA transfer error */ -#define HAL_USART_ERROR_UDR (0x00000020U) /*!< SPI slave underrun error */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) -#define HAL_USART_ERROR_INVALID_CALLBACK (0x00000040U) /*!< Invalid Callback error */ -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -#define HAL_USART_ERROR_RTO (0x00000080U) /*!< Receiver Timeout error */ -/** - * @} - */ - -/** @defgroup USART_Stop_Bits USART Number of Stop Bits - * @{ - */ -#define USART_STOPBITS_0_5 USART_CR2_STOP_0 /*!< USART frame with 0.5 stop bit */ -#define USART_STOPBITS_1 0x00000000U /*!< USART frame with 1 stop bit */ -#define USART_STOPBITS_1_5 (USART_CR2_STOP_0 | USART_CR2_STOP_1) /*!< USART frame with 1.5 stop bits */ -#define USART_STOPBITS_2 USART_CR2_STOP_1 /*!< USART frame with 2 stop bits */ -/** - * @} - */ - -/** @defgroup USART_Parity USART Parity - * @{ - */ -#define USART_PARITY_NONE 0x00000000U /*!< No parity */ -#define USART_PARITY_EVEN USART_CR1_PCE /*!< Even parity */ -#define USART_PARITY_ODD (USART_CR1_PCE | USART_CR1_PS) /*!< Odd parity */ -/** - * @} - */ - -/** @defgroup USART_Mode USART Mode - * @{ - */ -#define USART_MODE_RX USART_CR1_RE /*!< RX mode */ -#define USART_MODE_TX USART_CR1_TE /*!< TX mode */ -#define USART_MODE_TX_RX (USART_CR1_TE | USART_CR1_RE) /*!< RX and TX mode */ -/** - * @} - */ - -/** @defgroup USART_Clock USART Clock - * @{ - */ -#define USART_CLOCK_DISABLE 0x00000000U /*!< USART clock disable */ -#define USART_CLOCK_ENABLE USART_CR2_CLKEN /*!< USART clock enable */ -/** - * @} - */ - -/** @defgroup USART_Clock_Polarity USART Clock Polarity - * @{ - */ -#define USART_POLARITY_LOW 0x00000000U /*!< Driver enable signal is active high */ -#define USART_POLARITY_HIGH USART_CR2_CPOL /*!< Driver enable signal is active low */ -/** - * @} - */ - -/** @defgroup USART_Clock_Phase USART Clock Phase - * @{ - */ -#define USART_PHASE_1EDGE 0x00000000U /*!< USART frame phase on first clock transition */ -#define USART_PHASE_2EDGE USART_CR2_CPHA /*!< USART frame phase on second clock transition */ -/** - * @} - */ - -/** @defgroup USART_Last_Bit USART Last Bit - * @{ - */ -#define USART_LASTBIT_DISABLE \ - 0x00000000U /*!< USART frame last data bit clock pulse not output to \ - SCLK pin */ -#define USART_LASTBIT_ENABLE \ - USART_CR2_LBCL /*!< USART frame last data bit clock pulse output to \ - SCLK pin */ -/** - * @} - */ - -/** @defgroup USART_ClockPrescaler USART Clock Prescaler - * @{ - */ -#define USART_PRESCALER_DIV1 0x00000000U /*!< fclk_pres = fclk */ -#define USART_PRESCALER_DIV2 0x00000001U /*!< fclk_pres = fclk/2 */ -#define USART_PRESCALER_DIV4 0x00000002U /*!< fclk_pres = fclk/4 */ -#define USART_PRESCALER_DIV6 0x00000003U /*!< fclk_pres = fclk/6 */ -#define USART_PRESCALER_DIV8 0x00000004U /*!< fclk_pres = fclk/8 */ -#define USART_PRESCALER_DIV10 0x00000005U /*!< fclk_pres = fclk/10 */ -#define USART_PRESCALER_DIV12 0x00000006U /*!< fclk_pres = fclk/12 */ -#define USART_PRESCALER_DIV16 0x00000007U /*!< fclk_pres = fclk/16 */ -#define USART_PRESCALER_DIV32 0x00000008U /*!< fclk_pres = fclk/32 */ -#define USART_PRESCALER_DIV64 0x00000009U /*!< fclk_pres = fclk/64 */ -#define USART_PRESCALER_DIV128 0x0000000AU /*!< fclk_pres = fclk/128 */ -#define USART_PRESCALER_DIV256 0x0000000BU /*!< fclk_pres = fclk/256 */ - -/** - * @} - */ - -/** @defgroup USART_Request_Parameters USART Request Parameters - * @{ - */ -#define USART_RXDATA_FLUSH_REQUEST USART_RQR_RXFRQ /*!< Receive Data flush Request */ -#define USART_TXDATA_FLUSH_REQUEST USART_RQR_TXFRQ /*!< Transmit data flush Request */ -/** - * @} - */ - -/** @defgroup USART_Flags USART Flags - * Elements values convention: 0xXXXX - * - 0xXXXX : Flag mask in the ISR register - * @{ - */ -#define USART_FLAG_TXFT USART_ISR_TXFT /*!< USART TXFIFO threshold flag */ -#define USART_FLAG_RXFT USART_ISR_RXFT /*!< USART RXFIFO threshold flag */ -#define USART_FLAG_RXFF USART_ISR_RXFF /*!< USART RXFIFO Full flag */ -#define USART_FLAG_TXFE USART_ISR_TXFE /*!< USART TXFIFO Empty flag */ -#define USART_FLAG_REACK USART_ISR_REACK /*!< USART receive enable acknowledge flag */ -#define USART_FLAG_TEACK USART_ISR_TEACK /*!< USART transmit enable acknowledge flag */ -#define USART_FLAG_BUSY USART_ISR_BUSY /*!< USART busy flag */ -#define USART_FLAG_UDR USART_ISR_UDR /*!< SPI slave underrun error flag */ -#define USART_FLAG_TXE USART_ISR_TXE_TXFNF /*!< USART transmit data register empty */ -#define USART_FLAG_TXFNF USART_ISR_TXE_TXFNF /*!< USART TXFIFO not full */ -#define USART_FLAG_RTOF USART_ISR_RTOF /*!< USART receiver timeout flag */ -#define USART_FLAG_TC USART_ISR_TC /*!< USART transmission complete */ -#define USART_FLAG_RXNE USART_ISR_RXNE_RXFNE /*!< USART read data register not empty */ -#define USART_FLAG_RXFNE USART_ISR_RXNE_RXFNE /*!< USART RXFIFO not empty */ -#define USART_FLAG_IDLE USART_ISR_IDLE /*!< USART idle flag */ -#define USART_FLAG_ORE USART_ISR_ORE /*!< USART overrun error */ -#define USART_FLAG_NE USART_ISR_NE /*!< USART noise error */ -#define USART_FLAG_FE USART_ISR_FE /*!< USART frame error */ -#define USART_FLAG_PE USART_ISR_PE /*!< USART parity error */ - /** - * @} - */ - -/** @defgroup USART_Interrupt_definition USART Interrupts Definition - * Elements values convention: 0000ZZZZ0XXYYYYYb - * - YYYYY : Interrupt source position in the XX register (5bits) - * - XX : Interrupt source register (2bits) - * - 01: CR1 register - * - 10: CR2 register - * - 11: CR3 register - * - ZZZZ : Flag position in the ISR register(4bits) - * @{ - */ - -#define USART_IT_PE 0x0028U /*!< USART parity error interruption */ -#define USART_IT_TXE 0x0727U /*!< USART transmit data register empty interruption */ -#define USART_IT_TXFNF 0x0727U /*!< USART TX FIFO not full interruption */ -#define USART_IT_TC 0x0626U /*!< USART transmission complete interruption */ -#define USART_IT_RXNE 0x0525U /*!< USART read data register not empty interruption */ -#define USART_IT_RXFNE 0x0525U /*!< USART RXFIFO not empty interruption */ -#define USART_IT_IDLE 0x0424U /*!< USART idle interruption */ -#define USART_IT_ERR 0x0060U /*!< USART error interruption */ -#define USART_IT_ORE 0x0300U /*!< USART overrun error interruption */ -#define USART_IT_NE 0x0200U /*!< USART noise error interruption */ -#define USART_IT_FE 0x0100U /*!< USART frame error interruption */ -#define USART_IT_RXFF 0x183FU /*!< USART RXFIFO full interruption */ -#define USART_IT_TXFE 0x173EU /*!< USART TXFIFO empty interruption */ -#define USART_IT_RXFT 0x1A7CU /*!< USART RXFIFO threshold reached interruption */ -#define USART_IT_TXFT 0x1B77U /*!< USART TXFIFO threshold reached interruption */ - -/** - * @} - */ - -/** @defgroup USART_IT_CLEAR_Flags USART Interruption Clear Flags - * @{ - */ -#define USART_CLEAR_PEF USART_ICR_PECF /*!< Parity Error Clear Flag */ -#define USART_CLEAR_FEF USART_ICR_FECF /*!< Framing Error Clear Flag */ -#define USART_CLEAR_NEF USART_ICR_NECF /*!< Noise Error detected Clear Flag */ -#define USART_CLEAR_OREF USART_ICR_ORECF /*!< OverRun Error Clear Flag */ -#define USART_CLEAR_IDLEF USART_ICR_IDLECF /*!< IDLE line detected Clear Flag */ -#define USART_CLEAR_TCF USART_ICR_TCCF /*!< Transmission Complete Clear Flag */ -#define USART_CLEAR_UDRF USART_ICR_UDRCF /*!< SPI slave underrun error Clear Flag */ -#define USART_CLEAR_TXFECF USART_ICR_TXFECF /*!< TXFIFO Empty Clear Flag */ -#define USART_CLEAR_RTOF USART_ICR_RTOCF /*!< USART receiver timeout clear flag */ -/** - * @} - */ - -/** @defgroup USART_Interruption_Mask USART Interruption Flags Mask - * @{ - */ -#define USART_IT_MASK 0x001FU /*!< USART interruptions flags mask */ -#define USART_CR_MASK 0x00E0U /*!< USART control register mask */ -#define USART_CR_POS 5U /*!< USART control register position */ -#define USART_ISR_MASK 0x1F00U /*!< USART ISR register mask */ -#define USART_ISR_POS 8U /*!< USART ISR register position */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup USART_Exported_Macros USART Exported Macros - * @{ - */ - -/** @brief Reset USART handle state. - * @param __HANDLE__ USART handle. - * @retval None - */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) -#define __HAL_USART_RESET_HANDLE_STATE(__HANDLE__) \ - do { \ - (__HANDLE__)->State = HAL_USART_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while (0U) -#else -#define __HAL_USART_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_USART_STATE_RESET) -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - -/** @brief Check whether the specified USART flag is set or not. - * @param __HANDLE__ specifies the USART Handle - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg @ref USART_FLAG_TXFT TXFIFO threshold flag - * @arg @ref USART_FLAG_RXFT RXFIFO threshold flag - * @arg @ref USART_FLAG_RXFF RXFIFO Full flag - * @arg @ref USART_FLAG_TXFE TXFIFO Empty flag - * @arg @ref USART_FLAG_REACK Receive enable acknowledge flag - * @arg @ref USART_FLAG_TEACK Transmit enable acknowledge flag - * @arg @ref USART_FLAG_BUSY Busy flag - * @arg @ref USART_FLAG_UDR SPI slave underrun error flag - * @arg @ref USART_FLAG_TXE Transmit data register empty flag - * @arg @ref USART_FLAG_TXFNF TXFIFO not full flag - * @arg @ref USART_FLAG_TC Transmission Complete flag - * @arg @ref USART_FLAG_RXNE Receive data register not empty flag - * @arg @ref USART_FLAG_RXFNE RXFIFO not empty flag - * @arg @ref USART_FLAG_RTOF Receiver Timeout flag - * @arg @ref USART_FLAG_IDLE Idle Line detection flag - * @arg @ref USART_FLAG_ORE OverRun Error flag - * @arg @ref USART_FLAG_NE Noise Error flag - * @arg @ref USART_FLAG_FE Framing Error flag - * @arg @ref USART_FLAG_PE Parity Error flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_USART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->ISR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the specified USART pending flag. - * @param __HANDLE__ specifies the USART Handle. - * @param __FLAG__ specifies the flag to check. - * This parameter can be any combination of the following values: - * @arg @ref USART_CLEAR_PEF Parity Error Clear Flag - * @arg @ref USART_CLEAR_FEF Framing Error Clear Flag - * @arg @ref USART_CLEAR_NEF Noise detected Clear Flag - * @arg @ref USART_CLEAR_OREF Overrun Error Clear Flag - * @arg @ref USART_CLEAR_IDLEF IDLE line detected Clear Flag - * @arg @ref USART_CLEAR_TXFECF TXFIFO empty clear Flag - * @arg @ref USART_CLEAR_TCF Transmission Complete Clear Flag - * @arg @ref USART_CLEAR_RTOF Receiver Timeout clear flag - * @arg @ref USART_CLEAR_UDRF SPI slave underrun error Clear Flag - * @retval None - */ -#define __HAL_USART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ICR = (__FLAG__)) - -/** @brief Clear the USART PE pending flag. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_CLEAR_PEFLAG(__HANDLE__) __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_PEF) - -/** @brief Clear the USART FE pending flag. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_CLEAR_FEFLAG(__HANDLE__) __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_FEF) - -/** @brief Clear the USART NE pending flag. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_CLEAR_NEFLAG(__HANDLE__) __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_NEF) - -/** @brief Clear the USART ORE pending flag. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_CLEAR_OREFLAG(__HANDLE__) __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_OREF) - -/** @brief Clear the USART IDLE pending flag. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_CLEAR_IDLEFLAG(__HANDLE__) __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_IDLEF) - -/** @brief Clear the USART TX FIFO empty clear flag. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_CLEAR_TXFECF(__HANDLE__) __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_TXFECF) - -/** @brief Clear SPI slave underrun error flag. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_CLEAR_UDRFLAG(__HANDLE__) __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_UDRF) - -/** @brief Enable the specified USART interrupt. - * @param __HANDLE__ specifies the USART Handle. - * @param __INTERRUPT__ specifies the USART interrupt source to enable. - * This parameter can be one of the following values: - * @arg @ref USART_IT_RXFF RXFIFO Full interrupt - * @arg @ref USART_IT_TXFE TXFIFO Empty interrupt - * @arg @ref USART_IT_RXFT RXFIFO threshold interrupt - * @arg @ref USART_IT_TXFT TXFIFO threshold interrupt - * @arg @ref USART_IT_TXE Transmit Data Register empty interrupt - * @arg @ref USART_IT_TXFNF TX FIFO not full interrupt - * @arg @ref USART_IT_TC Transmission complete interrupt - * @arg @ref USART_IT_RXNE Receive Data register not empty interrupt - * @arg @ref USART_IT_RXFNE RXFIFO not empty interrupt - * @arg @ref USART_IT_IDLE Idle line detection interrupt - * @arg @ref USART_IT_PE Parity Error interrupt - * @arg @ref USART_IT_ERR Error interrupt(Frame error, noise error, - * overrun error) - * @retval None - */ -#define __HAL_USART_ENABLE_IT(__HANDLE__, __INTERRUPT__) \ - (((((__INTERRUPT__) & USART_CR_MASK) >> USART_CR_POS) == 1U) ? ((__HANDLE__)->Instance->CR1 |= (1UL << ((__INTERRUPT__) & USART_IT_MASK))) \ - : ((((__INTERRUPT__) & USART_CR_MASK) >> USART_CR_POS) == 2U) ? ((__HANDLE__)->Instance->CR2 |= (1UL << ((__INTERRUPT__) & USART_IT_MASK))) \ - : ((__HANDLE__)->Instance->CR3 |= (1UL << ((__INTERRUPT__) & USART_IT_MASK)))) - -/** @brief Disable the specified USART interrupt. - * @param __HANDLE__ specifies the USART Handle. - * @param __INTERRUPT__ specifies the USART interrupt source to disable. - * This parameter can be one of the following values: - * @arg @ref USART_IT_RXFF RXFIFO Full interrupt - * @arg @ref USART_IT_TXFE TXFIFO Empty interrupt - * @arg @ref USART_IT_RXFT RXFIFO threshold interrupt - * @arg @ref USART_IT_TXFT TXFIFO threshold interrupt - * @arg @ref USART_IT_TXE Transmit Data Register empty interrupt - * @arg @ref USART_IT_TXFNF TX FIFO not full interrupt - * @arg @ref USART_IT_TC Transmission complete interrupt - * @arg @ref USART_IT_RXNE Receive Data register not empty interrupt - * @arg @ref USART_IT_RXFNE RXFIFO not empty interrupt - * @arg @ref USART_IT_IDLE Idle line detection interrupt - * @arg @ref USART_IT_PE Parity Error interrupt - * @arg @ref USART_IT_ERR Error interrupt(Frame error, noise error, - * overrun error) - * @retval None - */ -#define __HAL_USART_DISABLE_IT(__HANDLE__, __INTERRUPT__) \ - (((((__INTERRUPT__) & USART_CR_MASK) >> USART_CR_POS) == 1U) ? ((__HANDLE__)->Instance->CR1 &= ~(1UL << ((__INTERRUPT__) & USART_IT_MASK))) \ - : ((((__INTERRUPT__) & USART_CR_MASK) >> USART_CR_POS) == 2U) ? ((__HANDLE__)->Instance->CR2 &= ~(1UL << ((__INTERRUPT__) & USART_IT_MASK))) \ - : ((__HANDLE__)->Instance->CR3 &= ~(1UL << ((__INTERRUPT__) & USART_IT_MASK)))) - -/** @brief Check whether the specified USART interrupt has occurred or not. - * @param __HANDLE__ specifies the USART Handle. - * @param __INTERRUPT__ specifies the USART interrupt source to check. - * This parameter can be one of the following values: - * @arg @ref USART_IT_RXFF RXFIFO Full interrupt - * @arg @ref USART_IT_TXFE TXFIFO Empty interrupt - * @arg @ref USART_IT_RXFT RXFIFO threshold interrupt - * @arg @ref USART_IT_TXFT TXFIFO threshold interrupt - * @arg @ref USART_IT_TXE Transmit Data Register empty interrupt - * @arg @ref USART_IT_TXFNF TX FIFO not full interrupt - * @arg @ref USART_IT_TC Transmission complete interrupt - * @arg @ref USART_IT_RXNE Receive Data register not empty interrupt - * @arg @ref USART_IT_RXFNE RXFIFO not empty interrupt - * @arg @ref USART_IT_IDLE Idle line detection interrupt - * @arg @ref USART_IT_ORE OverRun Error interrupt - * @arg @ref USART_IT_NE Noise Error interrupt - * @arg @ref USART_IT_FE Framing Error interrupt - * @arg @ref USART_IT_PE Parity Error interrupt - * @retval The new state of __INTERRUPT__ (SET or RESET). - */ -#define __HAL_USART_GET_IT(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->ISR & (0x01U << (((__INTERRUPT__) & USART_ISR_MASK) >> USART_ISR_POS))) != 0U) ? SET : RESET) - -/** @brief Check whether the specified USART interrupt source is enabled or - * not. - * @param __HANDLE__ specifies the USART Handle. - * @param __INTERRUPT__ specifies the USART interrupt source to check. - * This parameter can be one of the following values: - * @arg @ref USART_IT_RXFF RXFIFO Full interrupt - * @arg @ref USART_IT_TXFE TXFIFO Empty interrupt - * @arg @ref USART_IT_RXFT RXFIFO threshold interrupt - * @arg @ref USART_IT_TXFT TXFIFO threshold interrupt - * @arg @ref USART_IT_TXE Transmit Data Register empty interrupt - * @arg @ref USART_IT_TXFNF TX FIFO not full interrupt - * @arg @ref USART_IT_TC Transmission complete interrupt - * @arg @ref USART_IT_RXNE Receive Data register not empty interrupt - * @arg @ref USART_IT_RXFNE RXFIFO not empty interrupt - * @arg @ref USART_IT_IDLE Idle line detection interrupt - * @arg @ref USART_IT_ORE OverRun Error interrupt - * @arg @ref USART_IT_NE Noise Error interrupt - * @arg @ref USART_IT_FE Framing Error interrupt - * @arg @ref USART_IT_PE Parity Error interrupt - * @retval The new state of __INTERRUPT__ (SET or RESET). - */ -#define __HAL_USART_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) \ - ((((((((uint8_t)(__INTERRUPT__)) >> 0x05U) == 0x01U) ? (__HANDLE__)->Instance->CR1 \ - : (((((uint8_t)(__INTERRUPT__)) >> 0x05U) == 0x02U) ? (__HANDLE__)->Instance->CR2 : (__HANDLE__)->Instance->CR3)) & \ - (0x01U << (((uint16_t)(__INTERRUPT__)) & USART_IT_MASK))) != 0U) \ - ? SET \ - : RESET) - -/** @brief Clear the specified USART ISR flag, in setting the proper ICR - * register flag. - * @param __HANDLE__ specifies the USART Handle. - * @param __IT_CLEAR__ specifies the interrupt clear register flag that needs - * to be set to clear the corresponding interrupt. This parameter can be one of - * the following values: - * @arg @ref USART_CLEAR_PEF Parity Error Clear Flag - * @arg @ref USART_CLEAR_FEF Framing Error Clear Flag - * @arg @ref USART_CLEAR_NEF Noise detected Clear Flag - * @arg @ref USART_CLEAR_OREF Overrun Error Clear Flag - * @arg @ref USART_CLEAR_IDLEF IDLE line detected Clear Flag - * @arg @ref USART_CLEAR_RTOF Receiver timeout clear flag - * @arg @ref USART_CLEAR_TXFECF TXFIFO empty clear Flag - * @arg @ref USART_CLEAR_TCF Transmission Complete Clear Flag - * @retval None - */ -#define __HAL_USART_CLEAR_IT(__HANDLE__, __IT_CLEAR__) ((__HANDLE__)->Instance->ICR = (uint32_t)(__IT_CLEAR__)) - -/** @brief Set a specific USART request flag. - * @param __HANDLE__ specifies the USART Handle. - * @param __REQ__ specifies the request flag to set. - * This parameter can be one of the following values: - * @arg @ref USART_RXDATA_FLUSH_REQUEST Receive Data flush Request - * @arg @ref USART_TXDATA_FLUSH_REQUEST Transmit data flush Request - * - * @retval None - */ -#define __HAL_USART_SEND_REQ(__HANDLE__, __REQ__) ((__HANDLE__)->Instance->RQR |= (uint16_t)(__REQ__)) - -/** @brief Enable the USART one bit sample method. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_ONE_BIT_SAMPLE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3 |= USART_CR3_ONEBIT) - -/** @brief Disable the USART one bit sample method. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_ONE_BIT_SAMPLE_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3 &= ~USART_CR3_ONEBIT) - -/** @brief Enable USART. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 |= USART_CR1_UE) - -/** @brief Disable USART. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 &= ~USART_CR1_UE) - -/** - * @} - */ - -/* Private macros --------------------------------------------------------*/ -/** @defgroup USART_Private_Macros USART Private Macros - * @{ - */ - -/** @brief Get USART clock division factor from clock prescaler value. - * @param __CLOCKPRESCALER__ USART prescaler value. - * @retval USART clock division factor - */ -#define USART_GET_DIV_FACTOR(__CLOCKPRESCALER__) \ - (((__CLOCKPRESCALER__) == USART_PRESCALER_DIV1) ? 1U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV2) ? 2U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV4) ? 4U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV6) ? 6U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV8) ? 8U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV10) ? 10U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV12) ? 12U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV16) ? 16U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV32) ? 32U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV64) ? 64U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV128) ? 128U \ - : 256U) - -/** @brief BRR division operation to set BRR register in 8-bit oversampling - * mode. - * @param __PCLK__ USART clock. - * @param __BAUD__ Baud rate set by the user. - * @param __CLOCKPRESCALER__ USART prescaler value. - * @retval Division result - */ -#define USART_DIV_SAMPLING8(__PCLK__, __BAUD__, __CLOCKPRESCALER__) (((((__PCLK__) / USART_GET_DIV_FACTOR(__CLOCKPRESCALER__)) * 2U) + ((__BAUD__) / 2U)) / (__BAUD__)) - -/** @brief Report the USART clock source. - * @param __HANDLE__ specifies the USART Handle. - * @param __CLOCKSOURCE__ output variable. - * @retval the USART clocking source, written in __CLOCKSOURCE__. - */ -#if defined(USART3) -#define USART_GETCLOCKSOURCE(__HANDLE__, __CLOCKSOURCE__) \ - do { \ - if ((__HANDLE__)->Instance == USART1) { \ - switch (__HAL_RCC_GET_USART1_SOURCE()) { \ - case RCC_USART1CLKSOURCE_PCLK2: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK2; \ - break; \ - case RCC_USART1CLKSOURCE_HSI: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ - break; \ - case RCC_USART1CLKSOURCE_SYSCLK: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ - break; \ - case RCC_USART1CLKSOURCE_LSE: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ - break; \ - default: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ - break; \ - } \ - } else if ((__HANDLE__)->Instance == USART2) { \ - switch (__HAL_RCC_GET_USART2_SOURCE()) { \ - case RCC_USART2CLKSOURCE_PCLK1: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ - break; \ - case RCC_USART2CLKSOURCE_HSI: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ - break; \ - case RCC_USART2CLKSOURCE_SYSCLK: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ - break; \ - case RCC_USART2CLKSOURCE_LSE: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ - break; \ - default: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ - break; \ - } \ - } else if ((__HANDLE__)->Instance == USART3) { \ - switch (__HAL_RCC_GET_USART3_SOURCE()) { \ - case RCC_USART3CLKSOURCE_PCLK1: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ - break; \ - case RCC_USART3CLKSOURCE_HSI: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ - break; \ - case RCC_USART3CLKSOURCE_SYSCLK: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ - break; \ - case RCC_USART3CLKSOURCE_LSE: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ - break; \ - default: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ - break; \ - } \ - } else { \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ - } \ - } while (0) -#else -#define USART_GETCLOCKSOURCE(__HANDLE__, __CLOCKSOURCE__) \ - do { \ - if ((__HANDLE__)->Instance == USART1) { \ - switch (__HAL_RCC_GET_USART1_SOURCE()) { \ - case RCC_USART1CLKSOURCE_PCLK2: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK2; \ - break; \ - case RCC_USART1CLKSOURCE_HSI: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ - break; \ - case RCC_USART1CLKSOURCE_SYSCLK: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ - break; \ - case RCC_USART1CLKSOURCE_LSE: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ - break; \ - default: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ - break; \ - } \ - } else if ((__HANDLE__)->Instance == USART2) { \ - switch (__HAL_RCC_GET_USART2_SOURCE()) { \ - case RCC_USART2CLKSOURCE_PCLK1: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ - break; \ - case RCC_USART2CLKSOURCE_HSI: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ - break; \ - case RCC_USART2CLKSOURCE_SYSCLK: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ - break; \ - case RCC_USART2CLKSOURCE_LSE: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ - break; \ - default: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ - break; \ - } \ - } else { \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ - } \ - } while (0) -#endif /* USART3 */ - -/** @brief Check USART Baud rate. - * @param __BAUDRATE__ Baudrate specified by the user. - * The maximum Baud Rate is derived from the maximum clock on G4 (i.e. - * 150 MHz) divided by the smallest oversampling used on the USART (i.e. 8) - * @retval SET (__BAUDRATE__ is valid) or RESET (__BAUDRATE__ is invalid) */ -#define IS_USART_BAUDRATE(__BAUDRATE__) ((__BAUDRATE__) <= 18750000U) - -/** - * @brief Ensure that USART frame number of stop bits is valid. - * @param __STOPBITS__ USART frame number of stop bits. - * @retval SET (__STOPBITS__ is valid) or RESET (__STOPBITS__ is invalid) - */ -#define IS_USART_STOPBITS(__STOPBITS__) \ - (((__STOPBITS__) == USART_STOPBITS_0_5) || ((__STOPBITS__) == USART_STOPBITS_1) || ((__STOPBITS__) == USART_STOPBITS_1_5) || ((__STOPBITS__) == USART_STOPBITS_2)) - -/** - * @brief Ensure that USART frame parity is valid. - * @param __PARITY__ USART frame parity. - * @retval SET (__PARITY__ is valid) or RESET (__PARITY__ is invalid) - */ -#define IS_USART_PARITY(__PARITY__) (((__PARITY__) == USART_PARITY_NONE) || ((__PARITY__) == USART_PARITY_EVEN) || ((__PARITY__) == USART_PARITY_ODD)) - -/** - * @brief Ensure that USART communication mode is valid. - * @param __MODE__ USART communication mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_USART_MODE(__MODE__) ((((__MODE__) & 0xFFFFFFF3U) == 0x00U) && ((__MODE__) != 0x00U)) - -/** - * @brief Ensure that USART clock state is valid. - * @param __CLOCK__ USART clock state. - * @retval SET (__CLOCK__ is valid) or RESET (__CLOCK__ is invalid) - */ -#define IS_USART_CLOCK(__CLOCK__) (((__CLOCK__) == USART_CLOCK_DISABLE) || ((__CLOCK__) == USART_CLOCK_ENABLE)) - -/** - * @brief Ensure that USART frame polarity is valid. - * @param __CPOL__ USART frame polarity. - * @retval SET (__CPOL__ is valid) or RESET (__CPOL__ is invalid) - */ -#define IS_USART_POLARITY(__CPOL__) (((__CPOL__) == USART_POLARITY_LOW) || ((__CPOL__) == USART_POLARITY_HIGH)) - -/** - * @brief Ensure that USART frame phase is valid. - * @param __CPHA__ USART frame phase. - * @retval SET (__CPHA__ is valid) or RESET (__CPHA__ is invalid) - */ -#define IS_USART_PHASE(__CPHA__) (((__CPHA__) == USART_PHASE_1EDGE) || ((__CPHA__) == USART_PHASE_2EDGE)) - -/** - * @brief Ensure that USART frame last bit clock pulse setting is valid. - * @param __LASTBIT__ USART frame last bit clock pulse setting. - * @retval SET (__LASTBIT__ is valid) or RESET (__LASTBIT__ is invalid) - */ -#define IS_USART_LASTBIT(__LASTBIT__) (((__LASTBIT__) == USART_LASTBIT_DISABLE) || ((__LASTBIT__) == USART_LASTBIT_ENABLE)) - -/** - * @brief Ensure that USART request parameter is valid. - * @param __PARAM__ USART request parameter. - * @retval SET (__PARAM__ is valid) or RESET (__PARAM__ is invalid) - */ -#define IS_USART_REQUEST_PARAMETER(__PARAM__) (((__PARAM__) == USART_RXDATA_FLUSH_REQUEST) || ((__PARAM__) == USART_TXDATA_FLUSH_REQUEST)) - -/** - * @brief Ensure that USART Prescaler is valid. - * @param __CLOCKPRESCALER__ USART Prescaler value. - * @retval SET (__CLOCKPRESCALER__ is valid) or RESET (__CLOCKPRESCALER__ is - * invalid) - */ -#define IS_USART_PRESCALER(__CLOCKPRESCALER__) \ - (((__CLOCKPRESCALER__) == USART_PRESCALER_DIV1) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV2) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV4) || \ - ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV6) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV8) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV10) || \ - ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV12) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV16) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV32) || \ - ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV64) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV128) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV256)) - -/** - * @} - */ - -/* Include USART HAL Extended module */ -#include "stm32g4xx_hal_usart_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup USART_Exported_Functions USART Exported Functions - * @{ - */ - -/** @addtogroup USART_Exported_Functions_Group1 Initialization and - * de-initialization functions - * @{ - */ - -/* Initialization and de-initialization functions ****************************/ -HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USART_DeInit(USART_HandleTypeDef *husart); -void HAL_USART_MspInit(USART_HandleTypeDef *husart); -void HAL_USART_MspDeInit(USART_HandleTypeDef *husart); - -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_USART_RegisterCallback(USART_HandleTypeDef *husart, HAL_USART_CallbackIDTypeDef CallbackID, pUSART_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_USART_UnRegisterCallback(USART_HandleTypeDef *husart, HAL_USART_CallbackIDTypeDef CallbackID); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @addtogroup USART_Exported_Functions_Group2 IO operation functions - * @{ - */ - -/* IO operation functions *****************************************************/ -HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_USART_Transmit_IT(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_Receive_IT(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_TransmitReceive_IT(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_Transmit_DMA(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_Receive_DMA(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_TransmitReceive_DMA(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_DMAPause(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USART_DMAResume(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USART_DMAStop(USART_HandleTypeDef *husart); -/* Transfer Abort functions */ -HAL_StatusTypeDef HAL_USART_Abort(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USART_Abort_IT(USART_HandleTypeDef *husart); - -void HAL_USART_IRQHandler(USART_HandleTypeDef *husart); -void HAL_USART_TxHalfCpltCallback(USART_HandleTypeDef *husart); -void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart); -void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart); -void HAL_USART_RxHalfCpltCallback(USART_HandleTypeDef *husart); -void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart); -void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart); -void HAL_USART_AbortCpltCallback(USART_HandleTypeDef *husart); - -/** - * @} - */ - -/** @addtogroup USART_Exported_Functions_Group4 Peripheral State and Error - * functions - * @{ - */ - -/* Peripheral State and Error functions ***************************************/ -HAL_USART_StateTypeDef HAL_USART_GetState(const USART_HandleTypeDef *husart); -uint32_t HAL_USART_GetError(const USART_HandleTypeDef *husart); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32G4xx_HAL_USART_H */ diff --git a/Onboarding/W3_G4SPI_Receive/Core/Inc/stm32g4xx_hal_usart_ex.h b/Onboarding/W3_G4SPI_Receive/Core/Inc/stm32g4xx_hal_usart_ex.h deleted file mode 100644 index cd32cc9fc..000000000 --- a/Onboarding/W3_G4SPI_Receive/Core/Inc/stm32g4xx_hal_usart_ex.h +++ /dev/null @@ -1,258 +0,0 @@ -/** - ****************************************************************************** - * @file stm32g4xx_hal_usart_ex.h - * @author MCD Application Team - * @brief Header file of USART HAL Extended module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32G4xx_HAL_USART_EX_H -#define STM32G4xx_HAL_USART_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_hal_def.h" - -/** @addtogroup STM32G4xx_HAL_Driver - * @{ - */ - -/** @addtogroup USARTEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup USARTEx_Exported_Constants USARTEx Exported Constants - * @{ - */ - -/** @defgroup USARTEx_Word_Length USARTEx Word Length - * @{ - */ -#define USART_WORDLENGTH_7B (USART_CR1_M1) /*!< 7-bit long USART frame */ -#define USART_WORDLENGTH_8B (0x00000000U) /*!< 8-bit long USART frame */ -#define USART_WORDLENGTH_9B (USART_CR1_M0) /*!< 9-bit long USART frame */ -/** - * @} - */ - -/** @defgroup USARTEx_Slave_Select_management USARTEx Slave Select Management - * @{ - */ -#define USART_NSS_HARD 0x00000000U /*!< SPI slave selection depends on NSS input pin */ -#define USART_NSS_SOFT \ - USART_CR2_DIS_NSS /*!< SPI slave is always selected and NSS input pin \ - is ignored */ -/** - * @} - */ - -/** @defgroup USARTEx_Slave_Mode USARTEx Synchronous Slave mode enable - * @brief USART SLAVE mode - * @{ - */ -#define USART_SLAVEMODE_DISABLE \ - 0x00000000U /*!< USART SPI Slave Mode Enable \ - */ -#define USART_SLAVEMODE_ENABLE USART_CR2_SLVEN /*!< USART SPI Slave Mode Disable */ -/** - * @} - */ - -/** @defgroup USARTEx_FIFO_mode USARTEx FIFO mode - * @brief USART FIFO mode - * @{ - */ -#define USART_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */ -#define USART_FIFOMODE_ENABLE USART_CR1_FIFOEN /*!< FIFO mode enable */ -/** - * @} - */ - -/** @defgroup USARTEx_TXFIFO_threshold_level USARTEx TXFIFO threshold level - * @brief USART TXFIFO level - * @{ - */ -#define USART_TXFIFO_THRESHOLD_1_8 0x00000000U /*!< TXFIFO reaches 1/8 of its depth */ -#define USART_TXFIFO_THRESHOLD_1_4 USART_CR3_TXFTCFG_0 /*!< TXFIFO reaches 1/4 of its depth */ -#define USART_TXFIFO_THRESHOLD_1_2 USART_CR3_TXFTCFG_1 /*!< TXFIFO reaches 1/2 of its depth */ -#define USART_TXFIFO_THRESHOLD_3_4 (USART_CR3_TXFTCFG_0 | USART_CR3_TXFTCFG_1) /*!< TXFIFO reaches 3/4 of its depth */ -#define USART_TXFIFO_THRESHOLD_7_8 USART_CR3_TXFTCFG_2 /*!< TXFIFO reaches 7/8 of its depth */ -#define USART_TXFIFO_THRESHOLD_8_8 (USART_CR3_TXFTCFG_2 | USART_CR3_TXFTCFG_0) /*!< TXFIFO becomes empty */ -/** - * @} - */ - -/** @defgroup USARTEx_RXFIFO_threshold_level USARTEx RXFIFO threshold level - * @brief USART RXFIFO level - * @{ - */ -#define USART_RXFIFO_THRESHOLD_1_8 0x00000000U /*!< RXFIFO FIFO reaches 1/8 of its depth */ -#define USART_RXFIFO_THRESHOLD_1_4 USART_CR3_RXFTCFG_0 /*!< RXFIFO FIFO reaches 1/4 of its depth */ -#define USART_RXFIFO_THRESHOLD_1_2 USART_CR3_RXFTCFG_1 /*!< RXFIFO FIFO reaches 1/2 of its depth */ -#define USART_RXFIFO_THRESHOLD_3_4 (USART_CR3_RXFTCFG_0 | USART_CR3_RXFTCFG_1) /*!< RXFIFO FIFO reaches 3/4 of its depth */ -#define USART_RXFIFO_THRESHOLD_7_8 USART_CR3_RXFTCFG_2 /*!< RXFIFO FIFO reaches 7/8 of its depth */ -#define USART_RXFIFO_THRESHOLD_8_8 (USART_CR3_RXFTCFG_2 | USART_CR3_RXFTCFG_0) /*!< RXFIFO FIFO becomes full */ -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup USARTEx_Private_Macros USARTEx Private Macros - * @{ - */ - -/** @brief Compute the USART mask to apply to retrieve the received data - * according to the word length and to the parity bits activation. - * @note If PCE = 1, the parity bit is not included in the data extracted - * by the reception API(). - * This masking operation is not carried out in the case of - * DMA transfers. - * @param __HANDLE__ specifies the USART Handle. - * @retval None, the mask to apply to USART RDR register is stored in - * (__HANDLE__)->Mask field. - */ -#define USART_MASK_COMPUTATION(__HANDLE__) \ - do { \ - if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_9B) { \ - if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) { \ - (__HANDLE__)->Mask = 0x01FFU; \ - } else { \ - (__HANDLE__)->Mask = 0x00FFU; \ - } \ - } else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_8B) { \ - if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) { \ - (__HANDLE__)->Mask = 0x00FFU; \ - } else { \ - (__HANDLE__)->Mask = 0x007FU; \ - } \ - } else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_7B) { \ - if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) { \ - (__HANDLE__)->Mask = 0x007FU; \ - } else { \ - (__HANDLE__)->Mask = 0x003FU; \ - } \ - } else { \ - (__HANDLE__)->Mask = 0x0000U; \ - } \ - } while (0U) - -/** - * @brief Ensure that USART frame length is valid. - * @param __LENGTH__ USART frame length. - * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid) - */ -#define IS_USART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == USART_WORDLENGTH_7B) || ((__LENGTH__) == USART_WORDLENGTH_8B) || ((__LENGTH__) == USART_WORDLENGTH_9B)) - -/** - * @brief Ensure that USART Negative Slave Select (NSS) pin management is valid. - * @param __NSS__ USART Negative Slave Select pin management. - * @retval SET (__NSS__ is valid) or RESET (__NSS__ is invalid) - */ -#define IS_USART_NSS(__NSS__) (((__NSS__) == USART_NSS_HARD) || ((__NSS__) == USART_NSS_SOFT)) - -/** - * @brief Ensure that USART Slave Mode is valid. - * @param __STATE__ USART Slave Mode. - * @retval SET (__STATE__ is valid) or RESET (__STATE__ is invalid) - */ -#define IS_USART_SLAVEMODE(__STATE__) (((__STATE__) == USART_SLAVEMODE_DISABLE) || ((__STATE__) == USART_SLAVEMODE_ENABLE)) - -/** - * @brief Ensure that USART FIFO mode is valid. - * @param __STATE__ USART FIFO mode. - * @retval SET (__STATE__ is valid) or RESET (__STATE__ is invalid) - */ -#define IS_USART_FIFO_MODE_STATE(__STATE__) (((__STATE__) == USART_FIFOMODE_DISABLE) || ((__STATE__) == USART_FIFOMODE_ENABLE)) - -/** - * @brief Ensure that USART TXFIFO threshold level is valid. - * @param __THRESHOLD__ USART TXFIFO threshold level. - * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid) - */ -#define IS_USART_TXFIFO_THRESHOLD(__THRESHOLD__) \ - (((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_1_8) || ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_1_4) || ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_1_2) || \ - ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_3_4) || ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_7_8) || ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_8_8)) - -/** - * @brief Ensure that USART RXFIFO threshold level is valid. - * @param __THRESHOLD__ USART RXFIFO threshold level. - * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid) - */ -#define IS_USART_RXFIFO_THRESHOLD(__THRESHOLD__) \ - (((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_1_8) || ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_1_4) || ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_1_2) || \ - ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_3_4) || ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_7_8) || ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_8_8)) -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup USARTEx_Exported_Functions - * @{ - */ - -/** @addtogroup USARTEx_Exported_Functions_Group1 - * @{ - */ - -/* IO operation functions *****************************************************/ -void HAL_USARTEx_RxFifoFullCallback(USART_HandleTypeDef *husart); -void HAL_USARTEx_TxFifoEmptyCallback(USART_HandleTypeDef *husart); - -/** - * @} - */ - -/** @addtogroup USARTEx_Exported_Functions_Group2 - * @{ - */ - -/* Peripheral Control functions ***********************************************/ -HAL_StatusTypeDef HAL_USARTEx_EnableSlaveMode(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USARTEx_DisableSlaveMode(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USARTEx_ConfigNSS(USART_HandleTypeDef *husart, uint32_t NSSConfig); -HAL_StatusTypeDef HAL_USARTEx_EnableFifoMode(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USARTEx_DisableFifoMode(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USARTEx_SetTxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold); -HAL_StatusTypeDef HAL_USARTEx_SetRxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32G4xx_HAL_USART_EX_H */ diff --git a/Onboarding/W3_G4SPI_Receive/Core/Inc/stm32g4xx_it.h b/Onboarding/W3_G4SPI_Receive/Core/Inc/stm32g4xx_it.h deleted file mode 100644 index 0e522cc62..000000000 --- a/Onboarding/W3_G4SPI_Receive/Core/Inc/stm32g4xx_it.h +++ /dev/null @@ -1,66 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32g4xx_it.h - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * @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 */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32G4xx_IT_H -#define __STM32G4xx_IT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Private 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 */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void NMI_Handler(void); -void HardFault_Handler(void); -void MemManage_Handler(void); -void BusFault_Handler(void); -void UsageFault_Handler(void); -void SVC_Handler(void); -void DebugMon_Handler(void); -void PendSV_Handler(void); -void SysTick_Handler(void); -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32G4xx_IT_H */ diff --git a/Onboarding/W3_G4SPI_Receive/Core/Src/main.c b/Onboarding/W3_G4SPI_Receive/Core/Src/main.c deleted file mode 100644 index 62fc1f645..000000000 --- a/Onboarding/W3_G4SPI_Receive/Core/Src/main.c +++ /dev/null @@ -1,334 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.c - * @brief : Main program body - ****************************************************************************** - * @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" - -#include -#include - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* 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 ---------------------------------------------------------*/ -SPI_HandleTypeDef hspi2; - -USART_HandleTypeDef husart2; - -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -void SystemClock_Config(void); -static void MX_GPIO_Init(void); -static void MX_SPI2_Init(void); -static void MX_USART2_Init(void); -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/** - * @brief The application entry point. - * @retval int - */ - -int __io_putchar(int ch) -{ - HAL_USART_Transmit(&husart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY); - return ch; -} - -int main(void) -{ - - /* USER CODE BEGIN 1 */ - - /* USER CODE END 1 */ - - /* MCU - * Configuration--------------------------------------------------------*/ - - /* Reset of all peripherals, Initializes the Flash interface and the - * Systick. */ - HAL_Init(); - - /* 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_SPI2_Init(); - MX_USART2_Init(); - - /* USER CODE BEGIN 2 */ - - /* USER CODE END 2 */ - - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - - /*PB12 ------> SPI2_NSS - PB13 ------> SPI2_SCK - PB14 ------> SPI2_MISO - PB15 ------> SPI2_MOSI*/ - - char RX_Buffer[50] = {0}; - char message[] = "hello"; - int count = 0; - while (1) { - /* USER CODE END WHILE */ - /* USER CODE BEGIN 3 */ - HAL_SPI_Receive(&hspi2, (uint8_t *)RX_Buffer, sizeof(message), 3000); - - if (strncmp(message, RX_Buffer, sizeof(message)) == 0) { - count += 1; - RX_Buffer[0] = 0; // Clear message - } - - // Loops every - for (int i = 0; i < count; i++) { - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); - HAL_Delay(100); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); - HAL_Delay(100); - } - - count &= __extension__ 0b11; // count = count % 4 - } - /* USER CODE END 3 */ -} - -/** - * @brief System Clock Configuration - * @retval None - */ -void SystemClock_Config(void) -{ - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - - /** Configure the main internal regulator output voltage - */ - HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1); - - /** Initializes the RCC Oscillators according to the specified - * parameters in the RCC_OscInitTypeDef structure. - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; - RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { - Error_Handler(); - } - - /** Initializes the CPU, AHB and APB buses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { - Error_Handler(); - } -} - -/** - * @brief SPI2 Initialization Function - * @param None - * @retval None - */ -static void MX_SPI2_Init(void) -{ - - /* USER CODE BEGIN SPI2_Init 0 */ - - /* USER CODE END SPI2_Init 0 */ - - /* USER CODE BEGIN SPI2_Init 1 */ - - /* USER CODE END SPI2_Init 1 */ - /* SPI2 parameter configuration*/ - hspi2.Instance = SPI2; - hspi2.Init.Mode = SPI_MODE_SLAVE; - hspi2.Init.Direction = SPI_DIRECTION_2LINES; - hspi2.Init.DataSize = SPI_DATASIZE_8BIT; - hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; - - hspi2.Init.NSS = SPI_NSS_HARD_INPUT; // Must select this option for the SPI slave to - // listen to the Chip select line, otherwise - // CS line is ignored completely, regardless of whether the master pulls - // it high or low - - hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi2.Init.TIMode = SPI_TIMODE_DISABLE; - hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; - - hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi2.Init.CRCPolynomial = 7; - hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - hspi2.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; - if (HAL_SPI_Init(&hspi2) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN SPI2_Init 2 */ - - /* USER CODE END SPI2_Init 2 */ -} - -static void MX_USART2_Init(void) -{ - - /* USER CODE BEGIN USART2_Init 0 */ - - /* USER CODE END USART2_Init 0 */ - - /* USER CODE BEGIN USART2_Init 1 */ - - /* USER CODE END USART2_Init 1 */ - husart2.Instance = USART2; - husart2.Init.BaudRate = 115200; - husart2.Init.WordLength = USART_WORDLENGTH_8B; - husart2.Init.StopBits = USART_STOPBITS_1; - husart2.Init.Parity = USART_PARITY_NONE; - husart2.Init.Mode = USART_MODE_TX_RX; - husart2.Init.CLKPolarity = USART_POLARITY_LOW; - husart2.Init.CLKPhase = USART_PHASE_1EDGE; - husart2.Init.CLKLastBit = USART_LASTBIT_DISABLE; - husart2.Init.ClockPrescaler = USART_PRESCALER_DIV1; - husart2.SlaveMode = USART_SLAVEMODE_ENABLE; - if (HAL_USART_Init(&husart2) != HAL_OK) { - Error_Handler(); - } - if (HAL_USARTEx_SetTxFifoThreshold(&husart2, USART_TXFIFO_THRESHOLD_1_8) != HAL_OK) { - Error_Handler(); - } - if (HAL_USARTEx_SetRxFifoThreshold(&husart2, USART_RXFIFO_THRESHOLD_1_8) != HAL_OK) { - Error_Handler(); - } - if (HAL_USARTEx_DisableFifoMode(&husart2) != HAL_OK) { - Error_Handler(); - } - if (HAL_USARTEx_EnableSlaveMode(&husart2) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN USART2_Init 2 */ - - /* USER CODE END USART2_Init 2 */ -} - -/** - * @brief GPIO Initialization Function - * @param None - * @retval None - */ -static void MX_GPIO_Init(void) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - /* USER CODE BEGIN MX_GPIO_Init_1 */ - - /* USER CODE END MX_GPIO_Init_1 */ - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); - - /*Configure GPIO pin : PA5 */ - GPIO_InitStruct.Pin = GPIO_PIN_5; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN MX_GPIO_Init_2 */ - - /* USER CODE END MX_GPIO_Init_2 */ -} - -/* USER CODE BEGIN 4 */ - -/* 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) {} - /* 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/Onboarding/W3_G4SPI_Receive/Core/Src/stm32g4xx_hal_msp.c b/Onboarding/W3_G4SPI_Receive/Core/Src/stm32g4xx_hal_msp.c deleted file mode 100644 index e95bd27a2..000000000 --- a/Onboarding/W3_G4SPI_Receive/Core/Src/stm32g4xx_hal_msp.c +++ /dev/null @@ -1,218 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32g4xx_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 */ -/** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) -{ - - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - - __HAL_RCC_SYSCFG_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - - /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral - */ - HAL_PWREx_DisableUCPDDeadBattery(); - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/** - * @brief SPI MSP Initialization - * This function configures the hardware resources used in this example - * @param hspi: SPI handle pointer - * @retval None - */ -void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (hspi->Instance == SPI2) { - /* USER CODE BEGIN SPI2_MspInit 0 */ - - /* USER CODE END SPI2_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_SPI2_CLK_ENABLE(); - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**SPI2 GPIO Configuration - PB12 ------> SPI2_NSS - PB13 ------> SPI2_SCK - PB14 ------> SPI2_MISO - PB15 ------> SPI2_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI2_MspInit 1 */ - - /* USER CODE END SPI2_MspInit 1 */ - } -} - -/** - * @brief SPI MSP De-Initialization - * This function freeze the hardware resources used in this example - * @param hspi: SPI handle pointer - * @retval None - */ -void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) -{ - if (hspi->Instance == SPI2) { - /* USER CODE BEGIN SPI2_MspDeInit 0 */ - - /* USER CODE END SPI2_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI2_CLK_DISABLE(); - - /**SPI2 GPIO Configuration - PB12 ------> SPI2_NSS - PB13 ------> SPI2_SCK - PB14 ------> SPI2_MISO - PB15 ------> SPI2_MOSI - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15); - - /* USER CODE BEGIN SPI2_MspDeInit 1 */ - - /* USER CODE END SPI2_MspDeInit 1 */ - } -} - -void HAL_USART_MspInit(USART_HandleTypeDef *husart) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; - if (husart->Instance == USART2) { - /* USER CODE BEGIN USART2_MspInit 0 */ - - /* USER CODE END USART2_MspInit 0 */ - - /** Initializes the peripherals clocks - */ - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; - PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { - Error_Handler(); - } - - /* Peripheral clock enable */ - __HAL_RCC_USART2_CLK_ENABLE(); - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**USART2 GPIO Configuration - PB3 ------> USART2_TX - PB4 ------> USART2_RX - PB5 ------> USART2_CK - */ - GPIO_InitStruct.Pin = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF7_USART2; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN USART2_MspInit 1 */ - - /* USER CODE END USART2_MspInit 1 */ - } -} - -/** - * @brief USART MSP De-Initialization - * This function freeze the hardware resources used in this example - * @param husart: USART handle pointer - * @retval None - */ -void HAL_USART_MspDeInit(USART_HandleTypeDef *husart) -{ - if (husart->Instance == USART2) { - /* USER CODE BEGIN USART2_MspDeInit 0 */ - - /* USER CODE END USART2_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_USART2_CLK_DISABLE(); - - /**USART2 GPIO Configuration - PB3 ------> USART2_TX - PB4 ------> USART2_RX - PB5 ------> USART2_CK - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5); - - /* USER CODE BEGIN USART2_MspDeInit 1 */ - - /* USER CODE END USART2_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/Onboarding/W3_G4SPI_Receive/Core/Src/stm32g4xx_hal_usart.c b/Onboarding/W3_G4SPI_Receive/Core/Src/stm32g4xx_hal_usart.c deleted file mode 100644 index 9951f7d92..000000000 --- a/Onboarding/W3_G4SPI_Receive/Core/Src/stm32g4xx_hal_usart.c +++ /dev/null @@ -1,3508 +0,0 @@ -/** - ****************************************************************************** - * @file stm32g4xx_hal_usart.c - * @author MCD Application Team - * @brief USART HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Universal Synchronous/Asynchronous Receiver - Transmitter - * Peripheral (USART). - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State and Error functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - @verbatim - =============================================================================== - ##### How to use this driver ##### - =============================================================================== - [..] - The USART HAL driver can be used as follows: - - (#) Declare a USART_HandleTypeDef handle structure (eg. - USART_HandleTypeDef husart). - (#) Initialize the USART low level resources by implementing the - HAL_USART_MspInit() API: - (++) Enable the USARTx interface clock. - (++) USART pins configuration: - (+++) Enable the clock for the USART GPIOs. - (+++) Configure these USART pins as alternate function pull-up. - (++) NVIC configuration if you need to use interrupt process - (HAL_USART_Transmit_IT(), HAL_USART_Receive_IT() and - HAL_USART_TransmitReceive_IT() APIs): - (+++) Configure the USARTx interrupt priority. - (+++) Enable the NVIC USART IRQ handle. - (++) USART interrupts handling: - -@@- The specific USART interrupts (Transmission complete - interrupt, RXNE interrupt and Error Interrupts) will be managed using the - macros - __HAL_USART_ENABLE_IT() and __HAL_USART_DISABLE_IT() inside - the transmit and receive process. - (++) DMA Configuration if you need to use DMA process - (HAL_USART_Transmit_DMA() HAL_USART_Receive_DMA() and - HAL_USART_TransmitReceive_DMA() APIs): - (+++) Declare a DMA handle structure for the Tx/Rx channel. - (+++) Enable the DMAx interface clock. - (+++) Configure the declared DMA handle structure with the required - Tx/Rx parameters. - (+++) Configure the DMA Tx/Rx channel. - (+++) Associate the initialized DMA handle to the USART DMA Tx/Rx - handle. - (+++) Configure the priority and enable the NVIC for the transfer - complete interrupt on the DMA Tx/Rx channel. - - (#) Program the Baud Rate, Word Length, Stop Bit, Parity, and Mode - (Receiver/Transmitter) in the husart handle Init structure. - - (#) Initialize the USART registers by calling the HAL_USART_Init() API: - (++) This API configures also the low level Hardware GPIO, CLOCK, - CORTEX...etc) by calling the customized HAL_USART_MspInit(&husart) API. - - [..] - (@) To configure and enable/disable the USART to wake up the MCU from stop - mode, resort to UART API's HAL_UARTEx_StopModeWakeUpSourceConfig(), - HAL_UARTEx_EnableStopMode() and HAL_UARTEx_DisableStopMode() in casting the - USART handle to UART type UART_HandleTypeDef. - - ##### Callback registration ##### - ================================== - - [..] - The compilation define USE_HAL_USART_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - - [..] - Use Function HAL_USART_RegisterCallback() to register a user callback. - Function HAL_USART_RegisterCallback() allows to register following - callbacks: - (+) TxHalfCpltCallback : Tx Half Complete Callback. - (+) TxCpltCallback : Tx Complete Callback. - (+) RxHalfCpltCallback : Rx Half Complete Callback. - (+) RxCpltCallback : Rx Complete Callback. - (+) TxRxCpltCallback : Tx Rx Complete Callback. - (+) ErrorCallback : Error Callback. - (+) AbortCpltCallback : Abort Complete Callback. - (+) RxFifoFullCallback : Rx Fifo Full Callback. - (+) TxFifoEmptyCallback : Tx Fifo Empty Callback. - (+) MspInitCallback : USART MspInit. - (+) MspDeInitCallback : USART MspDeInit. - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - - [..] - Use function HAL_USART_UnRegisterCallback() to reset a callback to the - default weak function. HAL_USART_UnRegisterCallback() takes as parameters the - HAL peripheral handle, and the Callback ID. This function allows to reset - following callbacks: - (+) TxHalfCpltCallback : Tx Half Complete Callback. - (+) TxCpltCallback : Tx Complete Callback. - (+) RxHalfCpltCallback : Rx Half Complete Callback. - (+) RxCpltCallback : Rx Complete Callback. - (+) TxRxCpltCallback : Tx Rx Complete Callback. - (+) ErrorCallback : Error Callback. - (+) AbortCpltCallback : Abort Complete Callback. - (+) RxFifoFullCallback : Rx Fifo Full Callback. - (+) TxFifoEmptyCallback : Tx Fifo Empty Callback. - (+) MspInitCallback : USART MspInit. - (+) MspDeInitCallback : USART MspDeInit. - - [..] - By default, after the HAL_USART_Init() and when the state is - HAL_USART_STATE_RESET all callbacks are set to the corresponding weak - functions: examples HAL_USART_TxCpltCallback(), HAL_USART_RxHalfCpltCallback(). - Exception done for MspInit and MspDeInit functions that are respectively - reset to the legacy weak functions in the HAL_USART_Init() - and HAL_USART_DeInit() only when these callbacks are null (not registered - beforehand). If not, MspInit or MspDeInit are not null, the HAL_USART_Init() - and HAL_USART_DeInit() keep and use the user MspInit/MspDeInit callbacks - (registered beforehand). - - [..] - Callbacks can be registered/unregistered in HAL_USART_STATE_READY state - only. Exception done MspInit/MspDeInit that can be registered/unregistered in - HAL_USART_STATE_READY or HAL_USART_STATE_RESET state, thus registered (user) - MspInit/DeInit callbacks can be used during the Init/DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using HAL_USART_RegisterCallback() before calling HAL_USART_DeInit() - or HAL_USART_Init() function. - - [..] - When The compilation define USE_HAL_USART_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registration feature is not available - and weak callbacks are used. - - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_hal.h" - -/** @addtogroup STM32G4xx_HAL_Driver - * @{ - */ - -/** @defgroup USART USART - * @brief HAL USART Synchronous SPI module driver - * @{ - */ - -#ifdef HAL_USART_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @defgroup USART_Private_Constants USART Private Constants - * @{ - */ -#define USART_DUMMY_DATA \ - ((uint16_t)0xFFFF) /*!< USART transmitted dummy data \ - */ -#define USART_TEACK_REACK_TIMEOUT 1000U /*!< USART TX or RX enable acknowledge time-out value */ -#define USART_CR1_FIELDS \ - ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8 | USART_CR1_FIFOEN)) /*!< USART CR1 fields of parameters set \ - by USART_SetConfig API */ - -#define USART_CR2_FIELDS \ - ((uint32_t)(USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_CLKEN | USART_CR2_LBCL | USART_CR2_STOP | USART_CR2_SLVEN | USART_CR2_DIS_NSS)) /*!< USART CR2 fields of parameters \ - set by USART_SetConfig API */ - -#define USART_CR3_FIELDS \ - ((uint32_t)(USART_CR3_TXFTCFG | USART_CR3_RXFTCFG)) /*!< USART or USART CR3 fields of \ - parameters set by USART_SetConfig \ - API */ - -#define USART_BRR_MIN 0x10U /* USART BRR minimum authorized value */ -#define USART_BRR_MAX 0xFFFFU /* USART BRR maximum authorized value */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup USART_Private_Functions - * @{ - */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) -void USART_InitCallbacksToDefault(USART_HandleTypeDef *husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -static void USART_EndTransfer(USART_HandleTypeDef *husart); -static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma); -static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma); -static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma); -static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma); -static void USART_DMAError(DMA_HandleTypeDef *hdma); -static void USART_DMAAbortOnError(DMA_HandleTypeDef *hdma); -static void USART_DMATxAbortCallback(DMA_HandleTypeDef *hdma); -static void USART_DMARxAbortCallback(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout); -static HAL_StatusTypeDef USART_SetConfig(USART_HandleTypeDef *husart); -static HAL_StatusTypeDef USART_CheckIdleState(USART_HandleTypeDef *husart); -static void USART_TxISR_8BIT(USART_HandleTypeDef *husart); -static void USART_TxISR_16BIT(USART_HandleTypeDef *husart); -static void USART_TxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart); -static void USART_TxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart); -static void USART_EndTransmit_IT(USART_HandleTypeDef *husart); -static void USART_RxISR_8BIT(USART_HandleTypeDef *husart); -static void USART_RxISR_16BIT(USART_HandleTypeDef *husart); -static void USART_RxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart); -static void USART_RxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart); - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup USART_Exported_Functions USART Exported Functions - * @{ - */ - -/** @defgroup USART_Exported_Functions_Group1 Initialization and -de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to initialize the USART - in synchronous SPI master/slave mode. - (+) For the synchronous SPI mode only these parameters can be configured: - (++) Baud Rate - (++) Word Length - (++) Stop Bit - (++) Parity: If the parity is enabled, then the MSB bit of the data -written in the data register is transmitted but is changed by the parity bit. - (++) USART polarity - (++) USART phase - (++) USART LastBit - (++) Receiver/transmitter modes - - [..] - The HAL_USART_Init() function follows the USART synchronous SPI -configuration procedure (details for the procedure are available in reference -manual). - -@endverbatim - - Depending on the frame length defined by the M1 and M0 bits (7-bit, - 8-bit or 9-bit), the possible USART formats are listed in the - following table. - - Table 1. USART frame format. - +-----------------------------------------------------------------------+ - | M1 bit | M0 bit | PCE bit | USART frame | - |---------|---------|-----------|---------------------------------------| - | 0 | 0 | 0 | | SB | 8 bit data | STB | | - |---------|---------|-----------|---------------------------------------| - | 0 | 0 | 1 | | SB | 7 bit data | PB | STB | | - |---------|---------|-----------|---------------------------------------| - | 0 | 1 | 0 | | SB | 9 bit data | STB | | - |---------|---------|-----------|---------------------------------------| - | 0 | 1 | 1 | | SB | 8 bit data | PB | STB | | - |---------|---------|-----------|---------------------------------------| - | 1 | 0 | 0 | | SB | 7 bit data | STB | | - |---------|---------|-----------|---------------------------------------| - | 1 | 0 | 1 | | SB | 6 bit data | PB | STB | | - +-----------------------------------------------------------------------+ - - * @{ - */ - -/** - * @brief Initialize the USART mode according to the specified - * parameters in the USART_InitTypeDef and initialize the associated - * handle. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *husart) -{ - /* Check the USART handle allocation */ - if (husart == NULL) { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_USART_INSTANCE(husart->Instance)); - - if (husart->State == HAL_USART_STATE_RESET) { - /* Allocate lock resource and initialize it */ - husart->Lock = HAL_UNLOCKED; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - USART_InitCallbacksToDefault(husart); - - if (husart->MspInitCallback == NULL) { - husart->MspInitCallback = HAL_USART_MspInit; - } - - /* Init the low level hardware */ - husart->MspInitCallback(husart); -#else - /* Init the low level hardware : GPIO, CLOCK */ - HAL_USART_MspInit(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - - husart->State = HAL_USART_STATE_BUSY; - - /* Disable the Peripheral */ - __HAL_USART_DISABLE(husart); - - /* Set the Usart Communication parameters */ - if (USART_SetConfig(husart) == HAL_ERROR) { - return HAL_ERROR; - } - - /* In Synchronous SPI mode, the following bits must be kept cleared: - - LINEN bit in the USART_CR2 register - - HDSEL, SCEN and IREN bits in the USART_CR3 register. - */ - husart->Instance->CR2 &= ~USART_CR2_LINEN; - husart->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN); - - /* Enable the Peripheral */ - __HAL_USART_ENABLE(husart); - - /* TEACK and/or REACK to check before moving husart->State to Ready */ - return (USART_CheckIdleState(husart)); -} - -/** - * @brief DeInitialize the USART peripheral. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_DeInit(USART_HandleTypeDef *husart) -{ - /* Check the USART handle allocation */ - if (husart == NULL) { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_USART_INSTANCE(husart->Instance)); - - husart->State = HAL_USART_STATE_BUSY; - - husart->Instance->CR1 = 0x0U; - husart->Instance->CR2 = 0x0U; - husart->Instance->CR3 = 0x0U; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - if (husart->MspDeInitCallback == NULL) { - husart->MspDeInitCallback = HAL_USART_MspDeInit; - } - /* DeInit the low level hardware */ - husart->MspDeInitCallback(husart); -#else - /* DeInit the low level hardware */ - HAL_USART_MspDeInit(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_RESET; - - /* Process Unlock */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Initialize the USART MSP. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_MspInit(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USART_MspInit can be implemented in the user file - */ -} - -/** - * @brief DeInitialize the USART MSP. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_MspDeInit(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USART_MspDeInit can be implemented in the user file - */ -} - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User USART Callback - * To be used to override the weak predefined callback - * @note The HAL_USART_RegisterCallback() may be called before -HAL_USART_Init() in HAL_USART_STATE_RESET - * to register callbacks for HAL_USART_MSPINIT_CB_ID and -HAL_USART_MSPDEINIT_CB_ID - * @param husart usart handle - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_USART_TX_HALFCOMPLETE_CB_ID Tx Half Complete -Callback ID - * @arg @ref HAL_USART_TX_COMPLETE_CB_ID Tx Complete Callback ID - * @arg @ref HAL_USART_RX_HALFCOMPLETE_CB_ID Rx Half Complete -Callback ID - * @arg @ref HAL_USART_RX_COMPLETE_CB_ID Rx Complete Callback ID - * @arg @ref HAL_USART_TX_RX_COMPLETE_CB_ID Rx Complete Callback ID - * @arg @ref HAL_USART_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_USART_ABORT_COMPLETE_CB_ID Abort Complete Callback -ID - * @arg @ref HAL_USART_RX_FIFO_FULL_CB_ID Rx Fifo Full Callback ID - * @arg @ref HAL_USART_TX_FIFO_EMPTY_CB_ID Tx Fifo Empty Callback ID - * @arg @ref HAL_USART_MSPINIT_CB_ID MspInit Callback ID - * @arg @ref HAL_USART_MSPDEINIT_CB_ID MspDeInit Callback ID - * @param pCallback pointer to the Callback function - * @retval HAL status -+ */ -HAL_StatusTypeDef HAL_USART_RegisterCallback(USART_HandleTypeDef *husart, HAL_USART_CallbackIDTypeDef CallbackID, pUSART_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) { - /* Update the error code */ - husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - if (husart->State == HAL_USART_STATE_READY) { - switch (CallbackID) { - case HAL_USART_TX_HALFCOMPLETE_CB_ID: - husart->TxHalfCpltCallback = pCallback; - break; - - case HAL_USART_TX_COMPLETE_CB_ID: - husart->TxCpltCallback = pCallback; - break; - - case HAL_USART_RX_HALFCOMPLETE_CB_ID: - husart->RxHalfCpltCallback = pCallback; - break; - - case HAL_USART_RX_COMPLETE_CB_ID: - husart->RxCpltCallback = pCallback; - break; - - case HAL_USART_TX_RX_COMPLETE_CB_ID: - husart->TxRxCpltCallback = pCallback; - break; - - case HAL_USART_ERROR_CB_ID: - husart->ErrorCallback = pCallback; - break; - - case HAL_USART_ABORT_COMPLETE_CB_ID: - husart->AbortCpltCallback = pCallback; - break; - - case HAL_USART_RX_FIFO_FULL_CB_ID: - husart->RxFifoFullCallback = pCallback; - break; - - case HAL_USART_TX_FIFO_EMPTY_CB_ID: - husart->TxFifoEmptyCallback = pCallback; - break; - - case HAL_USART_MSPINIT_CB_ID: - husart->MspInitCallback = pCallback; - break; - - case HAL_USART_MSPDEINIT_CB_ID: - husart->MspDeInitCallback = pCallback; - break; - - default: - /* Update the error code */ - husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } else if (husart->State == HAL_USART_STATE_RESET) { - switch (CallbackID) { - case HAL_USART_MSPINIT_CB_ID: - husart->MspInitCallback = pCallback; - break; - - case HAL_USART_MSPDEINIT_CB_ID: - husart->MspDeInitCallback = pCallback; - break; - - default: - /* Update the error code */ - husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } else { - /* Update the error code */ - husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Unregister an USART Callback - * USART callaback is redirected to the weak predefined callback - * @note The HAL_USART_UnRegisterCallback() may be called before - * HAL_USART_Init() in HAL_USART_STATE_RESET to un-register callbacks for - * HAL_USART_MSPINIT_CB_ID and HAL_USART_MSPDEINIT_CB_ID - * @param husart usart handle - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_USART_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback - * ID - * @arg @ref HAL_USART_TX_COMPLETE_CB_ID Tx Complete Callback ID - * @arg @ref HAL_USART_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback - * ID - * @arg @ref HAL_USART_RX_COMPLETE_CB_ID Rx Complete Callback ID - * @arg @ref HAL_USART_TX_RX_COMPLETE_CB_ID Rx Complete Callback ID - * @arg @ref HAL_USART_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_USART_ABORT_COMPLETE_CB_ID Abort Complete Callback ID - * @arg @ref HAL_USART_RX_FIFO_FULL_CB_ID Rx Fifo Full Callback ID - * @arg @ref HAL_USART_TX_FIFO_EMPTY_CB_ID Tx Fifo Empty Callback ID - * @arg @ref HAL_USART_MSPINIT_CB_ID MspInit Callback ID - * @arg @ref HAL_USART_MSPDEINIT_CB_ID MspDeInit Callback ID - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_UnRegisterCallback(USART_HandleTypeDef *husart, HAL_USART_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (HAL_USART_STATE_READY == husart->State) { - switch (CallbackID) { - case HAL_USART_TX_HALFCOMPLETE_CB_ID: - husart->TxHalfCpltCallback = HAL_USART_TxHalfCpltCallback; /* Legacy weak - TxHalfCpltCallback - */ - break; - - case HAL_USART_TX_COMPLETE_CB_ID: - husart->TxCpltCallback = HAL_USART_TxCpltCallback; /* Legacy weak - TxCpltCallback - */ - break; - - case HAL_USART_RX_HALFCOMPLETE_CB_ID: - husart->RxHalfCpltCallback = HAL_USART_RxHalfCpltCallback; /* Legacy weak - RxHalfCpltCallback - */ - break; - - case HAL_USART_RX_COMPLETE_CB_ID: - husart->RxCpltCallback = HAL_USART_RxCpltCallback; /* Legacy weak - RxCpltCallback - */ - break; - - case HAL_USART_TX_RX_COMPLETE_CB_ID: - husart->TxRxCpltCallback = HAL_USART_TxRxCpltCallback; /* Legacy weak - TxRxCpltCallback - */ - break; - - case HAL_USART_ERROR_CB_ID: - husart->ErrorCallback = HAL_USART_ErrorCallback; /* Legacy weak - ErrorCallback */ - break; - - case HAL_USART_ABORT_COMPLETE_CB_ID: - husart->AbortCpltCallback = HAL_USART_AbortCpltCallback; /* Legacy weak - AbortCpltCallback - */ - break; - - case HAL_USART_RX_FIFO_FULL_CB_ID: - husart->RxFifoFullCallback = HAL_USARTEx_RxFifoFullCallback; /* Legacy - weak - RxFifoFullCallback - */ - break; - - case HAL_USART_TX_FIFO_EMPTY_CB_ID: - husart->TxFifoEmptyCallback = HAL_USARTEx_TxFifoEmptyCallback; /* Legacy - weak - TxFifoEmptyCallback - */ - break; - - case HAL_USART_MSPINIT_CB_ID: - husart->MspInitCallback = HAL_USART_MspInit; /* Legacy weak - MspInitCallback */ - break; - - case HAL_USART_MSPDEINIT_CB_ID: - husart->MspDeInitCallback = HAL_USART_MspDeInit; /* Legacy weak - MspDeInitCallback */ - break; - - default: - /* Update the error code */ - husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } else if (HAL_USART_STATE_RESET == husart->State) { - switch (CallbackID) { - case HAL_USART_MSPINIT_CB_ID: - husart->MspInitCallback = HAL_USART_MspInit; - break; - - case HAL_USART_MSPDEINIT_CB_ID: - husart->MspDeInitCallback = HAL_USART_MspDeInit; - break; - - default: - /* Update the error code */ - husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } else { - /* Update the error code */ - husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - return status; -} -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup USART_Exported_Functions_Group2 IO operation functions - * @brief USART Transmit and Receive functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to manage the -USART synchronous SPI data transfers. - - [..] The USART Synchronous SPI supports master and slave modes (SCLK as -output or input). - - [..] - - (#) There are two modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same -function after finishing transfer. - (++) No-Blocking mode: The communication is performed using Interrupts - or DMA, These API's return the HAL status. - The end of the data processing will be indicated through the - dedicated USART IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The HAL_USART_TxCpltCallback(), HAL_USART_RxCpltCallback() and -HAL_USART_TxRxCpltCallback() user callbacks will be executed respectively at the -end of the transmit or Receive process The HAL_USART_ErrorCallback()user -callback will be executed when a communication error is detected - - (#) Blocking mode API's are : - (++) HAL_USART_Transmit() in simplex mode - (++) HAL_USART_Receive() in full duplex receive only - (++) HAL_USART_TransmitReceive() in full duplex mode - - (#) Non-Blocking mode API's with Interrupt are : - (++) HAL_USART_Transmit_IT() in simplex mode - (++) HAL_USART_Receive_IT() in full duplex receive only - (++) HAL_USART_TransmitReceive_IT() in full duplex mode - (++) HAL_USART_IRQHandler() - - (#) No-Blocking mode API's with DMA are : - (++) HAL_USART_Transmit_DMA() in simplex mode - (++) HAL_USART_Receive_DMA() in full duplex receive only - (++) HAL_USART_TransmitReceive_DMA() in full duplex mode - (++) HAL_USART_DMAPause() - (++) HAL_USART_DMAResume() - (++) HAL_USART_DMAStop() - - (#) A set of Transfer Complete Callbacks are provided in Non_Blocking mode: - (++) HAL_USART_TxCpltCallback() - (++) HAL_USART_RxCpltCallback() - (++) HAL_USART_TxHalfCpltCallback() - (++) HAL_USART_RxHalfCpltCallback() - (++) HAL_USART_ErrorCallback() - (++) HAL_USART_TxRxCpltCallback() - - (#) Non-Blocking mode transfers could be aborted using Abort API's : - (++) HAL_USART_Abort() - (++) HAL_USART_Abort_IT() - - (#) For Abort services based on interrupts (HAL_USART_Abort_IT), a Abort -Complete Callbacks is provided: - (++) HAL_USART_AbortCpltCallback() - - (#) In Non-Blocking mode transfers, possible errors are split into 2 -categories. Errors are handled as follows : - (++) Error is considered as Recoverable and non blocking : Transfer -could go till end, but error severity is to be evaluated by user : this concerns -Frame Error, Parity Error or Noise Error in Interrupt mode reception . Received -character is then retrieved and stored in Rx buffer, Error code is set to allow -user to identify error type, and HAL_USART_ErrorCallback() user callback is -executed. Transfer is kept ongoing on USART side. If user wants to abort it, -Abort services should be called by user. - (++) Error is considered as Blocking : Transfer could not be completed -properly and is aborted. This concerns Overrun Error In Interrupt mode reception -and all errors in DMA mode. Error code is set to allow user to identify error -type, and HAL_USART_ErrorCallback() user callback is executed. - -@endverbatim - * @{ - */ - -/** - * @brief Simplex send an amount of data in blocking mode. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the sent data is handled as a set of u16. - * In this case, Size must indicate the number of u16 provided through pTxData. - * @param husart USART handle. - * @param pTxData Pointer to data buffer (u8 or u16 data elements). - * @param Size Amount of data elements (u8 or u16) to be sent. - * @param Timeout Timeout duration. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size, uint32_t Timeout) -{ - const uint8_t *ptxdata8bits; - const uint16_t *ptxdata16bits; - uint32_t tickstart; - - if (husart->State == HAL_USART_STATE_READY) { - if ((pTxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_TX; - - /* Init tickstart for timeout management */ - tickstart = HAL_GetTick(); - - husart->TxXferSize = Size; - husart->TxXferCount = Size; - - /* In case of 9bits/No Parity transfer, pTxData needs to be - * handled as a uint16_t pointer */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - ptxdata8bits = NULL; - ptxdata16bits = (const uint16_t *)pTxData; - } else { - ptxdata8bits = pTxData; - ptxdata16bits = NULL; - } - - /* Check the remaining data to be sent */ - while (husart->TxXferCount > 0U) { - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) { - return HAL_TIMEOUT; - } - if (ptxdata8bits == NULL) { - husart->Instance->TDR = (uint16_t)(*ptxdata16bits & 0x01FFU); - ptxdata16bits++; - } else { - husart->Instance->TDR = (uint8_t)(*ptxdata8bits & 0xFFU); - ptxdata8bits++; - } - - husart->TxXferCount--; - } - - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK) { - return HAL_TIMEOUT; - } - - /* Clear Transmission Complete Flag */ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF); - - /* Clear overrun flag and discard the received data */ - __HAL_USART_CLEAR_OREFLAG(husart); - __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - - /* At end of Tx process, restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; - } else { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in blocking mode. - * @note To receive synchronous data, dummy data are simultaneously - * transmitted. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the received data is handled as a set of - * u16. In this case, Size must indicate the number of u16 available through - * pRxData. - * @param husart USART handle. - * @param pRxData Pointer to data buffer (u8 or u16 data elements). - * @param Size Amount of data elements (u8 or u16) to be received. - * @param Timeout Timeout duration. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout) -{ - uint8_t *prxdata8bits; - uint16_t *prxdata16bits; - uint16_t uhMask; - uint32_t tickstart; - - if (husart->State == HAL_USART_STATE_READY) { - if ((pRxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_RX; - - /* Init tickstart for timeout management */ - tickstart = HAL_GetTick(); - - husart->RxXferSize = Size; - husart->RxXferCount = Size; - - /* Computation of USART mask to apply to RDR register */ - USART_MASK_COMPUTATION(husart); - uhMask = husart->Mask; - - /* In case of 9bits/No Parity transfer, pRxData needs to be - * handled as a uint16_t pointer */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - prxdata8bits = NULL; - prxdata16bits = (uint16_t *)pRxData; - } else { - prxdata8bits = pRxData; - prxdata16bits = NULL; - } - - /* as long as data have to be received */ - while (husart->RxXferCount > 0U) { - if (husart->SlaveMode == USART_SLAVEMODE_DISABLE) { - /* Wait until TXE flag is set to send dummy byte - * in order to generate the clock for the slave - * to send data. Whatever the frame length (7, 8 - * or 9-bit long), the same dummy value can be - * written for all the cases. */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) { - return HAL_TIMEOUT; - } - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x0FF); - } - - /* Wait for RXNE Flag */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) { - return HAL_TIMEOUT; - } - - if (prxdata8bits == NULL) { - *prxdata16bits = (uint16_t)(husart->Instance->RDR & uhMask); - prxdata16bits++; - } else { - *prxdata8bits = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU)); - prxdata8bits++; - } - - husart->RxXferCount--; - } - - /* Clear SPI slave underrun flag and discard transmit data */ - if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) { - __HAL_USART_CLEAR_UDRFLAG(husart); - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - } - - /* At end of Rx process, restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; - } else { - return HAL_BUSY; - } -} - -/** - * @brief Full-Duplex Send and Receive an amount of data in blocking mode. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the sent data and the received data are - * handled as sets of u16. In this case, Size must indicate the number of u16 - * available through pTxData and through pRxData. - * @param husart USART handle. - * @param pTxData pointer to TX data buffer (u8 or u16 data elements). - * @param pRxData pointer to RX data buffer (u8 or u16 data elements). - * @param Size amount of data elements (u8 or u16) to be sent (same amount to - * be received). - * @param Timeout Timeout duration. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout) -{ - uint8_t *prxdata8bits; - uint16_t *prxdata16bits; - const uint8_t *ptxdata8bits; - const uint16_t *ptxdata16bits; - uint16_t uhMask; - uint16_t rxdatacount; - uint32_t tickstart; - - if (husart->State == HAL_USART_STATE_READY) { - if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_RX; - - /* Init tickstart for timeout management */ - tickstart = HAL_GetTick(); - - husart->RxXferSize = Size; - husart->TxXferSize = Size; - husart->TxXferCount = Size; - husart->RxXferCount = Size; - - /* Computation of USART mask to apply to RDR register */ - USART_MASK_COMPUTATION(husart); - uhMask = husart->Mask; - - /* In case of 9bits/No Parity transfer, pRxData needs to be - * handled as a uint16_t pointer */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - prxdata8bits = NULL; - ptxdata8bits = NULL; - ptxdata16bits = (const uint16_t *)pTxData; - prxdata16bits = (uint16_t *)pRxData; - } else { - prxdata8bits = pRxData; - ptxdata8bits = pTxData; - ptxdata16bits = NULL; - prxdata16bits = NULL; - } - - if ((husart->TxXferCount == 0x01U) || (husart->SlaveMode == USART_SLAVEMODE_ENABLE)) { - /* Wait until TXE flag is set to send data */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) { - return HAL_TIMEOUT; - } - if (ptxdata8bits == NULL) { - husart->Instance->TDR = (uint16_t)(*ptxdata16bits & uhMask); - ptxdata16bits++; - } else { - husart->Instance->TDR = (uint8_t)(*ptxdata8bits & (uint8_t)(uhMask & 0xFFU)); - ptxdata8bits++; - } - - husart->TxXferCount--; - } - - /* Check the remain data to be sent */ - /* rxdatacount is a temporary variable for MISRAC2012-Rule-13.5 - */ - rxdatacount = husart->RxXferCount; - while ((husart->TxXferCount > 0U) || (rxdatacount > 0U)) { - if (husart->TxXferCount > 0U) { - /* Wait until TXE flag is set to send data */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) { - return HAL_TIMEOUT; - } - if (ptxdata8bits == NULL) { - husart->Instance->TDR = (uint16_t)(*ptxdata16bits & uhMask); - ptxdata16bits++; - } else { - husart->Instance->TDR = (uint8_t)(*ptxdata8bits & (uint8_t)(uhMask & 0xFFU)); - ptxdata8bits++; - } - - husart->TxXferCount--; - } - - if (husart->RxXferCount > 0U) { - /* Wait for RXNE Flag */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) { - return HAL_TIMEOUT; - } - - if (prxdata8bits == NULL) { - *prxdata16bits = (uint16_t)(husart->Instance->RDR & uhMask); - prxdata16bits++; - } else { - *prxdata8bits = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU)); - prxdata8bits++; - } - - husart->RxXferCount--; - } - rxdatacount = husart->RxXferCount; - } - - /* At end of TxRx process, restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; - } else { - return HAL_BUSY; - } -} - -/** - * @brief Send an amount of data in interrupt mode. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the sent data is handled as a set of u16. - * In this case, Size must indicate the number of u16 provided through pTxData. - * @param husart USART handle. - * @param pTxData pointer to data buffer (u8 or u16 data elements). - * @param Size amount of data elements (u8 or u16) to be sent. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Transmit_IT(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size) -{ - if (husart->State == HAL_USART_STATE_READY) { - if ((pTxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pTxBuffPtr = pTxData; - husart->TxXferSize = Size; - husart->TxXferCount = Size; - husart->TxISR = NULL; - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_TX; - - /* The USART Error Interrupts: (Frame error, noise error, - overrun error) are not managed by the USART Transmit Process to - avoid the overrun interrupt when the usart mode is configured - for transmit and receive "USART_MODE_TX_RX" to benefit for the - frame error and noise interrupts the usart mode should be - configured only for transmit "USART_MODE_TX" */ - - /* Configure Tx interrupt processing */ - if (husart->FifoMode == USART_FIFOMODE_ENABLE) { - /* Set the Tx ISR function pointer according to the data - * word length */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - husart->TxISR = USART_TxISR_16BIT_FIFOEN; - } else { - husart->TxISR = USART_TxISR_8BIT_FIFOEN; - } - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Enable the TX FIFO threshold interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TXFT); - } else { - /* Set the Tx ISR function pointer according to the data - * word length */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - husart->TxISR = USART_TxISR_16BIT; - } else { - husart->TxISR = USART_TxISR_8BIT; - } - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Enable the USART Transmit Data Register Empty - * Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TXE); - } - - return HAL_OK; - } else { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in interrupt mode. - * @note To receive synchronous data, dummy data are simultaneously - * transmitted. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the received data is handled as a set of - * u16. In this case, Size must indicate the number of u16 available through - * pRxData. - * @param husart USART handle. - * @param pRxData pointer to data buffer (u8 or u16 data elements). - * @param Size amount of data elements (u8 or u16) to be received. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Receive_IT(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size) -{ - uint16_t nb_dummy_data; - - if (husart->State == HAL_USART_STATE_READY) { - if ((pRxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pRxBuffPtr = pRxData; - husart->RxXferSize = Size; - husart->RxXferCount = Size; - husart->RxISR = NULL; - - USART_MASK_COMPUTATION(husart); - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_RX; - - /* Enable the USART Error Interrupt: (Frame error, noise error, - * overrun error) */ - SET_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Configure Rx interrupt processing */ - if ((husart->FifoMode == USART_FIFOMODE_ENABLE) && (Size >= husart->NbRxDataToProcess)) { - /* Set the Rx ISR function pointer according to the data - * word length */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - husart->RxISR = USART_RxISR_16BIT_FIFOEN; - } else { - husart->RxISR = USART_RxISR_8BIT_FIFOEN; - } - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Enable the USART Parity Error interrupt and RX FIFO - * Threshold interrupt */ - if (husart->Init.Parity != USART_PARITY_NONE) { - SET_BIT(husart->Instance->CR1, USART_CR1_PEIE); - } - SET_BIT(husart->Instance->CR3, USART_CR3_RXFTIE); - } else { - /* Set the Rx ISR function pointer according to the data - * word length */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - husart->RxISR = USART_RxISR_16BIT; - } else { - husart->RxISR = USART_RxISR_8BIT; - } - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Enable the USART Parity Error and Data Register not - * empty Interrupts */ - if (husart->Init.Parity != USART_PARITY_NONE) { - SET_BIT(husart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE); - } else { - SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); - } - } - - if (husart->SlaveMode == USART_SLAVEMODE_DISABLE) { - /* Send dummy data in order to generate the clock for - the Slave to send the next data. When FIFO mode is - disabled only one data must be transferred. When FIFO - mode is enabled data must be transmitted until the RX - FIFO reaches its threshold. - */ - if ((husart->FifoMode == USART_FIFOMODE_ENABLE) && (Size >= husart->NbRxDataToProcess)) { - for (nb_dummy_data = husart->NbRxDataToProcess; nb_dummy_data > 0U; nb_dummy_data--) { - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } - } else { - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } - } - - return HAL_OK; - } else { - return HAL_BUSY; - } -} - -/** - * @brief Full-Duplex Send and Receive an amount of data in interrupt mode. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the sent data and the received data are - * handled as sets of u16. In this case, Size must indicate the number of u16 - * available through pTxData and through pRxData. - * @param husart USART handle. - * @param pTxData pointer to TX data buffer (u8 or u16 data elements). - * @param pRxData pointer to RX data buffer (u8 or u16 data elements). - * @param Size amount of data elements (u8 or u16) to be sent (same amount to - * be received). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_TransmitReceive_IT(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData, uint16_t Size) -{ - - if (husart->State == HAL_USART_STATE_READY) { - if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pRxBuffPtr = pRxData; - husart->RxXferSize = Size; - husart->RxXferCount = Size; - husart->pTxBuffPtr = pTxData; - husart->TxXferSize = Size; - husart->TxXferCount = Size; - - /* Computation of USART mask to apply to RDR register */ - USART_MASK_COMPUTATION(husart); - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_TX_RX; - - /* Configure TxRx interrupt processing */ - if ((husart->FifoMode == USART_FIFOMODE_ENABLE) && (Size >= husart->NbRxDataToProcess)) { - /* Set the Rx ISR function pointer according to the data - * word length */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - husart->TxISR = USART_TxISR_16BIT_FIFOEN; - husart->RxISR = USART_RxISR_16BIT_FIFOEN; - } else { - husart->TxISR = USART_TxISR_8BIT_FIFOEN; - husart->RxISR = USART_RxISR_8BIT_FIFOEN; - } - - /* Process Locked */ - __HAL_UNLOCK(husart); - - /* Enable the USART Error Interrupt: (Frame error, noise - * error, overrun error) */ - SET_BIT(husart->Instance->CR3, USART_CR3_EIE); - - if (husart->Init.Parity != USART_PARITY_NONE) { - /* Enable the USART Parity Error interrupt */ - SET_BIT(husart->Instance->CR1, USART_CR1_PEIE); - } - - /* Enable the TX and RX FIFO Threshold interrupts */ - SET_BIT(husart->Instance->CR3, (USART_CR3_TXFTIE | USART_CR3_RXFTIE)); - } else { - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - husart->TxISR = USART_TxISR_16BIT; - husart->RxISR = USART_RxISR_16BIT; - } else { - husart->TxISR = USART_TxISR_8BIT; - husart->RxISR = USART_RxISR_8BIT; - } - - /* Process Locked */ - __HAL_UNLOCK(husart); - - /* Enable the USART Error Interrupt: (Frame error, noise - * error, overrun error) */ - SET_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Enable the USART Parity Error and USART Data Register - * not empty Interrupts */ - if (husart->Init.Parity != USART_PARITY_NONE) { - SET_BIT(husart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE); - } else { - SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); - } - - /* Enable the USART Transmit Data Register Empty - * Interrupt */ - SET_BIT(husart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE); - } - - return HAL_OK; - } else { - return HAL_BUSY; - } -} - -/** - * @brief Send an amount of data in DMA mode. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the sent data is handled as a set of u16. - * In this case, Size must indicate the number of u16 provided through pTxData. - * @param husart USART handle. - * @param pTxData pointer to data buffer (u8 or u16 data elements). - * @param Size amount of data elements (u8 or u16) to be sent. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Transmit_DMA(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size) -{ - HAL_StatusTypeDef status = HAL_OK; - const uint32_t *tmp; - - if (husart->State == HAL_USART_STATE_READY) { - if ((pTxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pTxBuffPtr = pTxData; - husart->TxXferSize = Size; - husart->TxXferCount = Size; - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_TX; - - if (husart->hdmatx != NULL) { - /* Set the USART DMA transfer complete callback */ - husart->hdmatx->XferCpltCallback = USART_DMATransmitCplt; - - /* Set the USART DMA Half transfer complete callback */ - husart->hdmatx->XferHalfCpltCallback = USART_DMATxHalfCplt; - - /* Set the DMA error callback */ - husart->hdmatx->XferErrorCallback = USART_DMAError; - - /* Enable the USART transmit DMA channel */ - tmp = (const uint32_t *)&pTxData; - status = HAL_DMA_Start_IT(husart->hdmatx, *(const uint32_t *)tmp, (uint32_t)&husart->Instance->TDR, Size); - } - - if (status == HAL_OK) { - /* Clear the TC flag in the ICR register */ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF); - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Enable the DMA transfer for transmit request by - setting the DMAT bit in the USART CR3 register */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAT); - - return HAL_OK; - } else { - /* Set error code to DMA */ - husart->ErrorCode = HAL_USART_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Restore husart->State to ready */ - husart->State = HAL_USART_STATE_READY; - - return HAL_ERROR; - } - } else { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in DMA mode. - * @note When the USART parity is enabled (PCE = 1), the received data contain - * the parity bit (MSB position). - * @note The USART DMA transmit channel must be configured in order to - * generate the clock for the slave. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the received data is handled as a set of - * u16. In this case, Size must indicate the number of u16 available through - * pRxData. - * @param husart USART handle. - * @param pRxData pointer to data buffer (u8 or u16 data elements). - * @param Size amount of data elements (u8 or u16) to be received. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Receive_DMA(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t *tmp = (uint32_t *)&pRxData; - - /* Check that a Rx process is not already ongoing */ - if (husart->State == HAL_USART_STATE_READY) { - if ((pRxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pRxBuffPtr = pRxData; - husart->RxXferSize = Size; - husart->pTxBuffPtr = pRxData; - husart->TxXferSize = Size; - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_RX; - - if (husart->hdmarx != NULL) { - /* Set the USART DMA Rx transfer complete callback */ - husart->hdmarx->XferCpltCallback = USART_DMAReceiveCplt; - - /* Set the USART DMA Half transfer complete callback */ - husart->hdmarx->XferHalfCpltCallback = USART_DMARxHalfCplt; - - /* Set the USART DMA Rx transfer error callback */ - husart->hdmarx->XferErrorCallback = USART_DMAError; - - /* Enable the USART receive DMA channel */ - status = HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->RDR, *(uint32_t *)tmp, Size); - } - - if ((status == HAL_OK) && (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) { - /* Enable the USART transmit DMA channel: the transmit - channel is used in order to generate in the - non-blocking mode the clock to the slave device, this - mode isn't a simplex receive mode but a full-duplex - receive mode */ - - /* Set the USART DMA Tx Complete and Error callback to - * Null */ - if (husart->hdmatx != NULL) { - husart->hdmatx->XferErrorCallback = NULL; - husart->hdmatx->XferHalfCpltCallback = NULL; - husart->hdmatx->XferCpltCallback = NULL; - status = HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t *)tmp, (uint32_t)&husart->Instance->TDR, Size); - } - } - - if (status == HAL_OK) { - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - if (husart->Init.Parity != USART_PARITY_NONE) { - /* Enable the USART Parity Error Interrupt */ - SET_BIT(husart->Instance->CR1, USART_CR1_PEIE); - } - - /* Enable the USART Error Interrupt: (Frame error, noise - * error, overrun error) */ - SET_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Enable the DMA transfer for the receiver request by - setting the DMAR bit in the USART CR3 register */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAR); - - /* Enable the DMA transfer for transmit request by - setting the DMAT bit in the USART CR3 register */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAT); - - return HAL_OK; - } else { - if (husart->hdmarx != NULL) { - status = HAL_DMA_Abort(husart->hdmarx); - } - - /* No need to check on error code */ - UNUSED(status); - - /* Set error code to DMA */ - husart->ErrorCode = HAL_USART_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Restore husart->State to ready */ - husart->State = HAL_USART_STATE_READY; - - return HAL_ERROR; - } - } else { - return HAL_BUSY; - } -} - -/** - * @brief Full-Duplex Transmit Receive an amount of data in non-blocking mode. - * @note When the USART parity is enabled (PCE = 1) the data received contain - * the parity bit. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the sent data and the received data are - * handled as sets of u16. In this case, Size must indicate the number of u16 - * available through pTxData and through pRxData. - * @param husart USART handle. - * @param pTxData pointer to TX data buffer (u8 or u16 data elements). - * @param pRxData pointer to RX data buffer (u8 or u16 data elements). - * @param Size amount of data elements (u8 or u16) to be received/sent. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_TransmitReceive_DMA(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData, uint16_t Size) -{ - HAL_StatusTypeDef status; - const uint32_t *tmp; - - if (husart->State == HAL_USART_STATE_READY) { - if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pRxBuffPtr = pRxData; - husart->RxXferSize = Size; - husart->pTxBuffPtr = pTxData; - husart->TxXferSize = Size; - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_TX_RX; - - if ((husart->hdmarx != NULL) && (husart->hdmatx != NULL)) { - /* Set the USART DMA Rx transfer complete callback */ - husart->hdmarx->XferCpltCallback = USART_DMAReceiveCplt; - - /* Set the USART DMA Half transfer complete callback */ - husart->hdmarx->XferHalfCpltCallback = USART_DMARxHalfCplt; - - /* Set the USART DMA Tx transfer complete callback */ - husart->hdmatx->XferCpltCallback = USART_DMATransmitCplt; - - /* Set the USART DMA Half transfer complete callback */ - husart->hdmatx->XferHalfCpltCallback = USART_DMATxHalfCplt; - - /* Set the USART DMA Tx transfer error callback */ - husart->hdmatx->XferErrorCallback = USART_DMAError; - - /* Set the USART DMA Rx transfer error callback */ - husart->hdmarx->XferErrorCallback = USART_DMAError; - - /* Enable the USART receive DMA channel */ - tmp = (uint32_t *)&pRxData; - status = HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->RDR, *(const uint32_t *)tmp, Size); - - /* Enable the USART transmit DMA channel */ - if (status == HAL_OK) { - tmp = (const uint32_t *)&pTxData; - status = HAL_DMA_Start_IT(husart->hdmatx, *(const uint32_t *)tmp, (uint32_t)&husart->Instance->TDR, Size); - } - } else { - status = HAL_ERROR; - } - - if (status == HAL_OK) { - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - if (husart->Init.Parity != USART_PARITY_NONE) { - /* Enable the USART Parity Error Interrupt */ - SET_BIT(husart->Instance->CR1, USART_CR1_PEIE); - } - - /* Enable the USART Error Interrupt: (Frame error, noise - * error, overrun error) */ - SET_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Clear the TC flag in the ICR register */ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF); - - /* Enable the DMA transfer for the receiver request by - setting the DMAR bit in the USART CR3 register */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAR); - - /* Enable the DMA transfer for transmit request by - setting the DMAT bit in the USART CR3 register */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAT); - - return HAL_OK; - } else { - if (husart->hdmarx != NULL) { - status = HAL_DMA_Abort(husart->hdmarx); - } - - /* No need to check on error code */ - UNUSED(status); - - /* Set error code to DMA */ - husart->ErrorCode = HAL_USART_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Restore husart->State to ready */ - husart->State = HAL_USART_STATE_READY; - - return HAL_ERROR; - } - } else { - return HAL_BUSY; - } -} - -/** - * @brief Pause the DMA Transfer. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_DMAPause(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - - /* Process Locked */ - __HAL_LOCK(husart); - - if ((HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) && (state == HAL_USART_STATE_BUSY_TX)) { - /* Disable the USART DMA Tx request */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); - } else if ((state == HAL_USART_STATE_BUSY_RX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) { - /* Disable the USART DMA Tx request */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); - } - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) { - /* Disable PE and ERR (Frame error, noise error, overrun - * error) interrupts */ - CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE); - CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Disable the USART DMA Rx request */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR); - } - } else { - /* Nothing to do */ - } - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Resume the DMA Transfer. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_DMAResume(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - - /* Process Locked */ - __HAL_LOCK(husart); - - if (state == HAL_USART_STATE_BUSY_TX) { - /* Enable the USART DMA Tx request */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAT); - } else if ((state == HAL_USART_STATE_BUSY_RX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - /* Clear the Overrun flag before resuming the Rx transfer*/ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF); - - /* Re-enable PE and ERR (Frame error, noise error, overrun - * error) interrupts */ - if (husart->Init.Parity != USART_PARITY_NONE) { - SET_BIT(husart->Instance->CR1, USART_CR1_PEIE); - } - SET_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Enable the USART DMA Rx request before the DMA Tx request */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAR); - - /* Enable the USART DMA Tx request */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAT); - } else { - /* Nothing to do */ - } - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Stop the DMA Transfer. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_DMAStop(USART_HandleTypeDef *husart) -{ - /* The Lock is not implemented on this API to allow the user application - to call the HAL USART API under callbacks HAL_USART_TxCpltCallback() - / HAL_USART_RxCpltCallback() / HAL_USART_TxHalfCpltCallback / - HAL_USART_RxHalfCpltCallback: indeed, when HAL_DMA_Abort() API is - called, the DMA TX/RX Transfer or Half Transfer complete interrupt is - generated if the DMA transfer interruption occurs at the middle or at - the end of the stream and the corresponding call back is executed. */ - - /* Disable the USART Tx/Rx DMA requests */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR); - - /* Abort the USART DMA tx channel */ - if (husart->hdmatx != NULL) { - if (HAL_DMA_Abort(husart->hdmatx) != HAL_OK) { - if (HAL_DMA_GetError(husart->hdmatx) == HAL_DMA_ERROR_TIMEOUT) { - /* Set error code to DMA */ - husart->ErrorCode = HAL_USART_ERROR_DMA; - - return HAL_TIMEOUT; - } - } - } - /* Abort the USART DMA rx channel */ - if (husart->hdmarx != NULL) { - if (HAL_DMA_Abort(husart->hdmarx) != HAL_OK) { - if (HAL_DMA_GetError(husart->hdmarx) == HAL_DMA_ERROR_TIMEOUT) { - /* Set error code to DMA */ - husart->ErrorCode = HAL_USART_ERROR_DMA; - - return HAL_TIMEOUT; - } - } - } - - USART_EndTransfer(husart); - husart->State = HAL_USART_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Abort ongoing transfers (blocking mode). - * @param husart USART handle. - * @note This procedure could be used for aborting any ongoing transfer - * started in Interrupt or DMA mode. This procedure performs following - * operations : - * - Disable USART Interrupts (Tx and Rx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer - * in DMA mode) - * - Set handle State to READY - * @note This procedure is executed in blocking mode : when exiting function, - * Abort is considered as completed. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Abort(USART_HandleTypeDef *husart) -{ - /* Disable TXEIE, TCIE, RXNE, RXFT, TXFT, PE and ERR (Frame error, noise - * error, overrun error) interrupts */ - CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE)); - CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE)); - - /* Abort the USART DMA Tx channel if enabled */ - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) { - /* Disable the USART DMA Tx request if enabled */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); - - /* Abort the USART DMA Tx channel : use blocking DMA Abort API - * (no callback) */ - if (husart->hdmatx != NULL) { - /* Set the USART DMA Abort callback to Null. - No call back execution at end of DMA abort procedure - */ - husart->hdmatx->XferAbortCallback = NULL; - - if (HAL_DMA_Abort(husart->hdmatx) != HAL_OK) { - if (HAL_DMA_GetError(husart->hdmatx) == HAL_DMA_ERROR_TIMEOUT) { - /* Set error code to DMA */ - husart->ErrorCode = HAL_USART_ERROR_DMA; - - return HAL_TIMEOUT; - } - } - } - } - - /* Abort the USART DMA Rx channel if enabled */ - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) { - /* Disable the USART DMA Rx request if enabled */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR); - - /* Abort the USART DMA Rx channel : use blocking DMA Abort API - * (no callback) */ - if (husart->hdmarx != NULL) { - /* Set the USART DMA Abort callback to Null. - No call back execution at end of DMA abort procedure - */ - husart->hdmarx->XferAbortCallback = NULL; - - if (HAL_DMA_Abort(husart->hdmarx) != HAL_OK) { - if (HAL_DMA_GetError(husart->hdmarx) == HAL_DMA_ERROR_TIMEOUT) { - /* Set error code to DMA */ - husart->ErrorCode = HAL_USART_ERROR_DMA; - - return HAL_TIMEOUT; - } - } - } - } - - /* Reset Tx and Rx transfer counters */ - husart->TxXferCount = 0U; - husart->RxXferCount = 0U; - - /* Clear the Error flags in the ICR register */ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF); - - /* Flush the whole TX FIFO (if needed) */ - if (husart->FifoMode == USART_FIFOMODE_ENABLE) { - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - } - - /* Discard the received data */ - __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); - - /* Restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - - /* Reset Handle ErrorCode to No Error */ - husart->ErrorCode = HAL_USART_ERROR_NONE; - - return HAL_OK; -} - -/** - * @brief Abort ongoing transfers (Interrupt mode). - * @param husart USART handle. - * @note This procedure could be used for aborting any ongoing transfer - * started in Interrupt or DMA mode. This procedure performs following - * operations : - * - Disable USART Interrupts (Tx and Rx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of - * transfer in DMA mode) - * - Set handle State to READY - * - At abort completion, call user abort complete callback - * @note This procedure is executed in Interrupt mode, meaning that abort - * procedure could be considered as completed only when user abort complete - * callback is executed (not when exiting function). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Abort_IT(USART_HandleTypeDef *husart) -{ - uint32_t abortcplt = 1U; - - /* Disable TXEIE, TCIE, RXNE, RXFT, TXFT, PE and ERR (Frame error, noise - * error, overrun error) interrupts */ - CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE)); - CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE)); - - /* If DMA Tx and/or DMA Rx Handles are associated to USART Handle, DMA - Abort complete callbacks should be initialised before any call to DMA - Abort functions */ - /* DMA Tx Handle is valid */ - if (husart->hdmatx != NULL) { - /* Set DMA Abort Complete callback if USART DMA Tx request if - enabled. Otherwise, set it to NULL */ - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) { - husart->hdmatx->XferAbortCallback = USART_DMATxAbortCallback; - } else { - husart->hdmatx->XferAbortCallback = NULL; - } - } - /* DMA Rx Handle is valid */ - if (husart->hdmarx != NULL) { - /* Set DMA Abort Complete callback if USART DMA Rx request if - enabled. Otherwise, set it to NULL */ - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) { - husart->hdmarx->XferAbortCallback = USART_DMARxAbortCallback; - } else { - husart->hdmarx->XferAbortCallback = NULL; - } - } - - /* Abort the USART DMA Tx channel if enabled */ - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) { - /* Disable DMA Tx at USART level */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); - - /* Abort the USART DMA Tx channel : use non blocking DMA Abort - * API (callback) */ - if (husart->hdmatx != NULL) { - /* USART Tx DMA Abort callback has already been - initialised : will lead to call - HAL_USART_AbortCpltCallback() at end of DMA abort - procedure */ - - /* Abort DMA TX */ - if (HAL_DMA_Abort_IT(husart->hdmatx) != HAL_OK) { - husart->hdmatx->XferAbortCallback = NULL; - } else { - abortcplt = 0U; - } - } - } - - /* Abort the USART DMA Rx channel if enabled */ - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) { - /* Disable the USART DMA Rx request if enabled */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR); - - /* Abort the USART DMA Rx channel : use non blocking DMA Abort - * API (callback) */ - if (husart->hdmarx != NULL) { - /* USART Rx DMA Abort callback has already been - initialised : will lead to call - HAL_USART_AbortCpltCallback() at end of DMA abort - procedure */ - - /* Abort DMA RX */ - if (HAL_DMA_Abort_IT(husart->hdmarx) != HAL_OK) { - husart->hdmarx->XferAbortCallback = NULL; - abortcplt = 1U; - } else { - abortcplt = 0U; - } - } - } - - /* if no DMA abort complete callback execution is required => call user - * Abort Complete callback */ - if (abortcplt == 1U) { - /* Reset Tx and Rx transfer counters */ - husart->TxXferCount = 0U; - husart->RxXferCount = 0U; - - /* Reset errorCode */ - husart->ErrorCode = HAL_USART_ERROR_NONE; - - /* Clear the Error flags in the ICR register */ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF); - - /* Flush the whole TX FIFO (if needed) */ - if (husart->FifoMode == USART_FIFOMODE_ENABLE) { - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - } - - /* Discard the received data */ - __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); - - /* Restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - - /* As no DMA to be aborted, call directly user Abort complete - * callback */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Abort Complete Callback */ - husart->AbortCpltCallback(husart); -#else - /* Call legacy weak Abort Complete Callback */ - HAL_USART_AbortCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - - return HAL_OK; -} - -/** - * @brief Handle USART interrupt request. - * @param husart USART handle. - * @retval None - */ -void HAL_USART_IRQHandler(USART_HandleTypeDef *husart) -{ - uint32_t isrflags = READ_REG(husart->Instance->ISR); - uint32_t cr1its = READ_REG(husart->Instance->CR1); - uint32_t cr3its = READ_REG(husart->Instance->CR3); - - uint32_t errorflags; - uint32_t errorcode; - - /* If no error occurs */ - errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF | USART_ISR_UDR)); - if (errorflags == 0U) { - /* USART in mode Receiver - * ---------------------------------------------------*/ - if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U) && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) || ((cr3its & USART_CR3_RXFTIE) != 0U))) { - if (husart->RxISR != NULL) { - husart->RxISR(husart); - } - return; - } - } - - /* If some errors occur */ - if ((errorflags != 0U) && (((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U) || ((cr1its & (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)) != 0U))) { - /* USART parity error interrupt occurred - * -------------------------------------*/ - if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U)) { - __HAL_USART_CLEAR_IT(husart, USART_CLEAR_PEF); - - husart->ErrorCode |= HAL_USART_ERROR_PE; - } - - /* USART frame error interrupt occurred - * --------------------------------------*/ - if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) { - __HAL_USART_CLEAR_IT(husart, USART_CLEAR_FEF); - - husart->ErrorCode |= HAL_USART_ERROR_FE; - } - - /* USART noise error interrupt occurred - * --------------------------------------*/ - if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) { - __HAL_USART_CLEAR_IT(husart, USART_CLEAR_NEF); - - husart->ErrorCode |= HAL_USART_ERROR_NE; - } - - /* USART Over-Run interrupt occurred - * -----------------------------------------*/ - if (((isrflags & USART_ISR_ORE) != 0U) && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) || ((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U))) { - __HAL_USART_CLEAR_IT(husart, USART_CLEAR_OREF); - - husart->ErrorCode |= HAL_USART_ERROR_ORE; - } - - /* USART Receiver Timeout interrupt occurred - * ---------------------------------*/ - if (((isrflags & USART_ISR_RTOF) != 0U) && ((cr1its & USART_CR1_RTOIE) != 0U)) { - __HAL_USART_CLEAR_IT(husart, USART_CLEAR_RTOF); - - husart->ErrorCode |= HAL_USART_ERROR_RTO; - } - - /* USART SPI slave underrun error interrupt occurred - * -------------------------*/ - if (((isrflags & USART_ISR_UDR) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) { - /* Ignore SPI slave underrun errors when reception is - * going on */ - if (husart->State == HAL_USART_STATE_BUSY_RX) { - __HAL_USART_CLEAR_UDRFLAG(husart); - return; - } else { - __HAL_USART_CLEAR_UDRFLAG(husart); - husart->ErrorCode |= HAL_USART_ERROR_UDR; - } - } - - /* Call USART Error Call back function if need be - * --------------------------*/ - if (husart->ErrorCode != HAL_USART_ERROR_NONE) { - /* USART in mode Receiver - * ---------------------------------------------------*/ - if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U) && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) || ((cr3its & USART_CR3_RXFTIE) != 0U))) { - if (husart->RxISR != NULL) { - husart->RxISR(husart); - } - } - - /* If Overrun error occurs, or if any error occurs in - DMA mode reception, consider error as blocking */ - errorcode = husart->ErrorCode & HAL_USART_ERROR_ORE; - if ((HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) || (errorcode != 0U)) { - /* Blocking error : transfer is aborted - Set the USART state ready to be able to start - again the process, Disable Interrupts, and - disable DMA requests, if ongoing */ - USART_EndTransfer(husart); - - /* Abort the USART DMA Rx channel if enabled */ - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) { - /* Disable the USART DMA Rx request if - * enabled */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR | USART_CR3_DMAR); - - /* Abort the USART DMA Tx channel */ - if (husart->hdmatx != NULL) { - /* Set the USART Tx DMA Abort - callback to NULL : no - callback executed at end of - DMA abort procedure */ - husart->hdmatx->XferAbortCallback = NULL; - - /* Abort DMA TX */ - (void)HAL_DMA_Abort_IT(husart->hdmatx); - } - - /* Abort the USART DMA Rx channel */ - if (husart->hdmarx != NULL) { - /* Set the USART Rx DMA Abort - callback : will lead to call - HAL_USART_ErrorCallback() at - end of DMA abort procedure */ - husart->hdmarx->XferAbortCallback = USART_DMAAbortOnError; - - /* Abort DMA RX */ - if (HAL_DMA_Abort_IT(husart->hdmarx) != HAL_OK) { - /* Call Directly - * husart->hdmarx->XferAbortCallback - * function in case of - * error */ - husart->hdmarx->XferAbortCallback(husart->hdmarx); - } - } else { - /* Call user error callback */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Error - * Callback */ - husart->ErrorCallback(husart); -#else - /* Call legacy weak Error - * Callback */ - HAL_USART_ErrorCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - } else { - /* Call user error callback */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Error Callback */ - husart->ErrorCallback(husart); -#else - /* Call legacy weak Error Callback */ - HAL_USART_ErrorCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - } else { - /* Non Blocking error : transfer could go on. - Error is notified to user through user error - callback */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Error Callback */ - husart->ErrorCallback(husart); -#else - /* Call legacy weak Error Callback */ - HAL_USART_ErrorCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - husart->ErrorCode = HAL_USART_ERROR_NONE; - } - } - return; - - } /* End if some error occurs */ - - /* USART in mode Transmitter - * ------------------------------------------------*/ - if (((isrflags & USART_ISR_TXE_TXFNF) != 0U) && (((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U) || ((cr3its & USART_CR3_TXFTIE) != 0U))) { - if (husart->TxISR != NULL) { - husart->TxISR(husart); - } - return; - } - - /* USART in mode Transmitter (transmission end) - * -----------------------------*/ - if (((isrflags & USART_ISR_TC) != 0U) && ((cr1its & USART_CR1_TCIE) != 0U)) { - USART_EndTransmit_IT(husart); - return; - } - - /* USART TX Fifo Empty occurred - * ----------------------------------------------*/ - if (((isrflags & USART_ISR_TXFE) != 0U) && ((cr1its & USART_CR1_TXFEIE) != 0U)) { -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Fifo Empty Callback */ - husart->TxFifoEmptyCallback(husart); -#else - /* Call legacy weak Tx Fifo Empty Callback */ - HAL_USARTEx_TxFifoEmptyCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - return; - } - - /* USART RX Fifo Full occurred - * ----------------------------------------------*/ - if (((isrflags & USART_ISR_RXFF) != 0U) && ((cr1its & USART_CR1_RXFFIE) != 0U)) { -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Fifo Full Callback */ - husart->RxFifoFullCallback(husart); -#else - /* Call legacy weak Rx Fifo Full Callback */ - HAL_USARTEx_RxFifoFullCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - return; - } -} - -/** - * @brief Tx Transfer completed callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USART_TxCpltCallback can be implemented in the user - file. - */ -} - -/** - * @brief Tx Half Transfer completed callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_TxHalfCpltCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE: This function should not be modified, when the callback is - needed, the HAL_USART_TxHalfCpltCallback can be implemented in the - user file. - */ -} - -/** - * @brief Rx Transfer completed callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE: This function should not be modified, when the callback is - needed, the HAL_USART_RxCpltCallback can be implemented in the user - file. - */ -} - -/** - * @brief Rx Half Transfer completed callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_RxHalfCpltCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USART_RxHalfCpltCallback can be implemented in the - user file - */ -} - -/** - * @brief Tx/Rx Transfers completed callback for the non-blocking process. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USART_TxRxCpltCallback can be implemented in the user - file - */ -} - -/** - * @brief USART error callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USART_ErrorCallback can be implemented in the user - file. - */ -} - -/** - * @brief USART Abort Complete callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_AbortCpltCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USART_AbortCpltCallback can be implemented in the - user file. - */ -} - -/** - * @} - */ - -/** @defgroup USART_Exported_Functions_Group4 Peripheral State and Error -functions - * @brief USART Peripheral State and Error functions - * -@verbatim - ============================================================================== - ##### Peripheral State and Error functions ##### - ============================================================================== - [..] - This subsection provides functions allowing to : - (+) Return the USART handle state - (+) Return the USART handle error code - -@endverbatim - * @{ - */ - -/** - * @brief Return the USART handle state. - * @param husart pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART. - * @retval USART handle state - */ -HAL_USART_StateTypeDef HAL_USART_GetState(const USART_HandleTypeDef *husart) -{ - return husart->State; -} - -/** - * @brief Return the USART error code. - * @param husart pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART. - * @retval USART handle Error Code - */ -uint32_t HAL_USART_GetError(const USART_HandleTypeDef *husart) -{ - return husart->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup USART_Private_Functions USART Private Functions - * @{ - */ - -/** - * @brief Initialize the callbacks to their default values. - * @param husart USART handle. - * @retval none - */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) -void USART_InitCallbacksToDefault(USART_HandleTypeDef *husart) -{ - /* Init the USART Callback settings */ - husart->TxHalfCpltCallback = HAL_USART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ - husart->TxCpltCallback = HAL_USART_TxCpltCallback; /* Legacy weak TxCpltCallback */ - husart->RxHalfCpltCallback = HAL_USART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ - husart->RxCpltCallback = HAL_USART_RxCpltCallback; /* Legacy weak RxCpltCallback */ - husart->TxRxCpltCallback = HAL_USART_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */ - husart->ErrorCallback = HAL_USART_ErrorCallback; /* Legacy weak ErrorCallback */ - husart->AbortCpltCallback = HAL_USART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - husart->RxFifoFullCallback = HAL_USARTEx_RxFifoFullCallback; /* Legacy weak RxFifoFullCallback */ - husart->TxFifoEmptyCallback = HAL_USARTEx_TxFifoEmptyCallback; /* Legacy weak TxFifoEmptyCallback - */ -} -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - -/** - * @brief End ongoing transfer on USART peripheral (following error detection - * or Transfer completion). - * @param husart USART handle. - * @retval None - */ -static void USART_EndTransfer(USART_HandleTypeDef *husart) -{ - /* Disable TXEIE, TCIE, RXNE, RXFT, TXFT, PE and ERR (Frame error, noise - * error, overrun error) interrupts */ - CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE)); - CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE)); - - /* At end of process, restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; -} - -/** - * @brief DMA USART transmit process complete callback. - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - - /* DMA Normal mode */ - if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC)) { - husart->TxXferCount = 0U; - - if (husart->State == HAL_USART_STATE_BUSY_TX) { - /* Disable the DMA transfer for transmit request by - resetting the DMAT bit in the USART CR3 register */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); - - /* Enable the USART Transmit Complete Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TC); - } - } - /* DMA Circular mode */ - else { - if (husart->State == HAL_USART_STATE_BUSY_TX) { -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Complete Callback */ - husart->TxCpltCallback(husart); -#else - /* Call legacy weak Tx Complete Callback */ - HAL_USART_TxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - } -} - -/** - * @brief DMA USART transmit process half complete callback. - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Half Complete Callback */ - husart->TxHalfCpltCallback(husart); -#else - /* Call legacy weak Tx Half Complete Callback */ - HAL_USART_TxHalfCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA USART receive process complete callback. - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - - /* DMA Normal mode */ - if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC)) { - husart->RxXferCount = 0U; - - /* Disable PE and ERR (Frame error, noise error, overrun error) - * interrupts */ - CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE); - CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Disable the DMA RX transfer for the receiver request by - resetting the DMAR bit in USART CR3 register */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR); - /* similarly, disable the DMA TX transfer that was started to - provide the clock to the slave device */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); - - if (husart->State == HAL_USART_STATE_BUSY_RX) { -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Complete Callback */ - husart->RxCpltCallback(husart); -#else - /* Call legacy weak Rx Complete Callback */ - HAL_USART_RxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - /* The USART state is HAL_USART_STATE_BUSY_TX_RX */ - else { -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Rx Complete Callback */ - husart->TxRxCpltCallback(husart); -#else - /* Call legacy weak Tx Rx Complete Callback */ - HAL_USART_TxRxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - husart->State = HAL_USART_STATE_READY; - } - /* DMA circular mode */ - else { - if (husart->State == HAL_USART_STATE_BUSY_RX) { -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Complete Callback */ - husart->RxCpltCallback(husart); -#else - /* Call legacy weak Rx Complete Callback */ - HAL_USART_RxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - /* The USART state is HAL_USART_STATE_BUSY_TX_RX */ - else { -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Rx Complete Callback */ - husart->TxRxCpltCallback(husart); -#else - /* Call legacy weak Tx Rx Complete Callback */ - HAL_USART_TxRxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - } -} - -/** - * @brief DMA USART receive process half complete callback. - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Half Complete Callback */ - husart->RxHalfCpltCallback(husart); -#else - /* Call legacy weak Rx Half Complete Callback */ - HAL_USART_RxHalfCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA USART communication error callback. - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMAError(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - - husart->RxXferCount = 0U; - husart->TxXferCount = 0U; - USART_EndTransfer(husart); - - husart->ErrorCode |= HAL_USART_ERROR_DMA; - husart->State = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Error Callback */ - husart->ErrorCallback(husart); -#else - /* Call legacy weak Error Callback */ - HAL_USART_ErrorCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA USART communication abort callback, when initiated by HAL - * services on Error (To be called at end of DMA Abort procedure following error - * occurrence). - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMAAbortOnError(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - husart->RxXferCount = 0U; - husart->TxXferCount = 0U; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Error Callback */ - husart->ErrorCallback(husart); -#else - /* Call legacy weak Error Callback */ - HAL_USART_ErrorCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA USART Tx communication abort callback, when initiated by user - * (To be called at end of DMA Tx Abort procedure following user abort - * request). - * @note When this callback is executed, User Abort complete call back is - * called only if no Abort still ongoing for Rx DMA Handle. - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMATxAbortCallback(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - - husart->hdmatx->XferAbortCallback = NULL; - - /* Check if an Abort process is still ongoing */ - if (husart->hdmarx != NULL) { - if (husart->hdmarx->XferAbortCallback != NULL) { - return; - } - } - - /* No Abort process still ongoing : All DMA channels are aborted, call - * user Abort Complete callback */ - husart->TxXferCount = 0U; - husart->RxXferCount = 0U; - - /* Reset errorCode */ - husart->ErrorCode = HAL_USART_ERROR_NONE; - - /* Clear the Error flags in the ICR register */ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF); - - /* Restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - - /* Call user Abort complete callback */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Abort Complete Callback */ - husart->AbortCpltCallback(husart); -#else - /* Call legacy weak Abort Complete Callback */ - HAL_USART_AbortCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA USART Rx communication abort callback, when initiated by user - * (To be called at end of DMA Rx Abort procedure following user abort - * request). - * @note When this callback is executed, User Abort complete call back is - * called only if no Abort still ongoing for Tx DMA Handle. - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMARxAbortCallback(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - - husart->hdmarx->XferAbortCallback = NULL; - - /* Check if an Abort process is still ongoing */ - if (husart->hdmatx != NULL) { - if (husart->hdmatx->XferAbortCallback != NULL) { - return; - } - } - - /* No Abort process still ongoing : All DMA channels are aborted, call - * user Abort Complete callback */ - husart->TxXferCount = 0U; - husart->RxXferCount = 0U; - - /* Reset errorCode */ - husart->ErrorCode = HAL_USART_ERROR_NONE; - - /* Clear the Error flags in the ICR register */ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF); - - /* Restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - - /* Call user Abort complete callback */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Abort Complete Callback */ - husart->AbortCpltCallback(husart); -#else - /* Call legacy weak Abort Complete Callback */ - HAL_USART_AbortCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -} - -/** - * @brief Handle USART Communication Timeout. It waits - * until a flag is no longer in the specified status. - * @param husart USART handle. - * @param Flag Specifies the USART flag to check. - * @param Status the actual Flag status (SET or RESET). - * @param Tickstart Tick start value - * @param Timeout timeout duration. - * @retval HAL status - */ -static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout) -{ - /* Wait until flag is set */ - while ((__HAL_USART_GET_FLAG(husart, Flag) ? SET : RESET) == Status) { - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) { - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) { - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_TIMEOUT; - } - } - } - return HAL_OK; -} - -/** - * @brief Configure the USART peripheral. - * @param husart USART handle. - * @retval HAL status - */ -static HAL_StatusTypeDef USART_SetConfig(USART_HandleTypeDef *husart) -{ - uint32_t tmpreg; - USART_ClockSourceTypeDef clocksource; - HAL_StatusTypeDef ret = HAL_OK; - uint16_t brrtemp; - uint32_t usartdiv = 0x00000000; - uint32_t pclk; - - /* Check the parameters */ - assert_param(IS_USART_POLARITY(husart->Init.CLKPolarity)); - assert_param(IS_USART_PHASE(husart->Init.CLKPhase)); - assert_param(IS_USART_LASTBIT(husart->Init.CLKLastBit)); - assert_param(IS_USART_BAUDRATE(husart->Init.BaudRate)); - assert_param(IS_USART_WORD_LENGTH(husart->Init.WordLength)); - assert_param(IS_USART_STOPBITS(husart->Init.StopBits)); - assert_param(IS_USART_PARITY(husart->Init.Parity)); - assert_param(IS_USART_MODE(husart->Init.Mode)); - assert_param(IS_USART_PRESCALER(husart->Init.ClockPrescaler)); - - /*-------------------------- USART CR1 Configuration - * -----------------------*/ - /* Clear M, PCE, PS, TE and RE bits and configure - * the USART Word Length, Parity and Mode: - * set the M bits according to husart->Init.WordLength value - * set PCE and PS bits according to husart->Init.Parity value - * set TE and RE bits according to husart->Init.Mode value - * force OVER8 to 1 to allow to reach the maximum speed (Fclock/8) */ - tmpreg = (uint32_t)husart->Init.WordLength | husart->Init.Parity | husart->Init.Mode | USART_CR1_OVER8; - MODIFY_REG(husart->Instance->CR1, USART_CR1_FIELDS, tmpreg); - - /*---------------------------- USART CR2 Configuration - * ---------------------*/ - /* Clear and configure the USART Clock, CPOL, CPHA, LBCL STOP and SLVEN - * bits: set CPOL bit according to husart->Init.CLKPolarity value set - * CPHA bit according to husart->Init.CLKPhase value set LBCL bit - * according to husart->Init.CLKLastBit value (used in USART Synchronous - * SPI master mode only) set STOP[13:12] bits according to - * husart->Init.StopBits value */ - tmpreg = (uint32_t)(USART_CLOCK_ENABLE); - tmpreg |= (uint32_t)husart->Init.CLKLastBit; - tmpreg |= ((uint32_t)husart->Init.CLKPolarity | (uint32_t)husart->Init.CLKPhase); - tmpreg |= (uint32_t)husart->Init.StopBits; - MODIFY_REG(husart->Instance->CR2, USART_CR2_FIELDS, tmpreg); - - /*-------------------------- USART PRESC Configuration - * -----------------------*/ - /* Configure - * - USART Clock Prescaler : set PRESCALER according to - * husart->Init.ClockPrescaler value */ - MODIFY_REG(husart->Instance->PRESC, USART_PRESC_PRESCALER, husart->Init.ClockPrescaler); - - /*-------------------------- USART BRR Configuration - * -----------------------*/ - /* BRR is filled-up according to OVER8 bit setting which is forced to 1 - */ - USART_GETCLOCKSOURCE(husart, clocksource); - - switch (clocksource) { - case USART_CLOCKSOURCE_PCLK1: - pclk = HAL_RCC_GetPCLK1Freq(); - usartdiv = (uint32_t)(USART_DIV_SAMPLING8(pclk, husart->Init.BaudRate, husart->Init.ClockPrescaler)); - break; - case USART_CLOCKSOURCE_PCLK2: - pclk = HAL_RCC_GetPCLK2Freq(); - usartdiv = (uint32_t)(USART_DIV_SAMPLING8(pclk, husart->Init.BaudRate, husart->Init.ClockPrescaler)); - break; - case USART_CLOCKSOURCE_HSI: - usartdiv = (uint32_t)(USART_DIV_SAMPLING8(HSI_VALUE, husart->Init.BaudRate, husart->Init.ClockPrescaler)); - break; - case USART_CLOCKSOURCE_SYSCLK: - pclk = HAL_RCC_GetSysClockFreq(); - usartdiv = (uint32_t)(USART_DIV_SAMPLING8(pclk, husart->Init.BaudRate, husart->Init.ClockPrescaler)); - break; - case USART_CLOCKSOURCE_LSE: - usartdiv = (uint32_t)(USART_DIV_SAMPLING8(LSE_VALUE, husart->Init.BaudRate, husart->Init.ClockPrescaler)); - break; - default: - ret = HAL_ERROR; - break; - } - - /* USARTDIV must be greater than or equal to 0d16 and smaller than or - * equal to ffff */ - if ((usartdiv >= USART_BRR_MIN) && (usartdiv <= USART_BRR_MAX)) { - brrtemp = (uint16_t)(usartdiv & 0xFFF0U); - brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000FU) >> 1U); - husart->Instance->BRR = brrtemp; - } else { - ret = HAL_ERROR; - } - - /* Initialize the number of data to process during RX/TX ISR execution - */ - husart->NbTxDataToProcess = 1U; - husart->NbRxDataToProcess = 1U; - - /* Clear ISR function pointers */ - husart->RxISR = NULL; - husart->TxISR = NULL; - - return ret; -} - -/** - * @brief Check the USART Idle State. - * @param husart USART handle. - * @retval HAL status - */ -static HAL_StatusTypeDef USART_CheckIdleState(USART_HandleTypeDef *husart) -{ - uint32_t tickstart; - - /* Initialize the USART ErrorCode */ - husart->ErrorCode = HAL_USART_ERROR_NONE; - - /* Init tickstart for timeout management */ - tickstart = HAL_GetTick(); - - /* Check if the Transmitter is enabled */ - if ((husart->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE) { - /* Wait until TEACK flag is set */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_ISR_TEACK, RESET, tickstart, USART_TEACK_REACK_TIMEOUT) != HAL_OK) { - /* Timeout occurred */ - return HAL_TIMEOUT; - } - } - /* Check if the Receiver is enabled */ - if ((husart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE) { - /* Wait until REACK flag is set */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_ISR_REACK, RESET, tickstart, USART_TEACK_REACK_TIMEOUT) != HAL_OK) { - /* Timeout occurred */ - return HAL_TIMEOUT; - } - } - - /* Initialize the USART state*/ - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Simplex send an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Transmit_IT(). - * @note The USART errors are not managed to avoid the overrun error. - * @note ISR function executed when FIFO mode is disabled and when the - * data word length is less than 9 bits long. - * @param husart USART handle. - * @retval None - */ -static void USART_TxISR_8BIT(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - - /* Check that a Tx process is ongoing */ - if ((state == HAL_USART_STATE_BUSY_TX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - if (husart->TxXferCount == 0U) { - /* Disable the USART Transmit data register empty - * interrupt */ - __HAL_USART_DISABLE_IT(husart, USART_IT_TXE); - - /* Enable the USART Transmit Complete Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TC); - } else { - husart->Instance->TDR = (uint8_t)(*husart->pTxBuffPtr & (uint8_t)0xFF); - husart->pTxBuffPtr++; - husart->TxXferCount--; - } - } -} - -/** - * @brief Simplex send an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Transmit_IT(). - * @note The USART errors are not managed to avoid the overrun error. - * @note ISR function executed when FIFO mode is disabled and when the - * data word length is 9 bits long. - * @param husart USART handle. - * @retval None - */ -static void USART_TxISR_16BIT(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - const uint16_t *tmp; - - if ((state == HAL_USART_STATE_BUSY_TX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - if (husart->TxXferCount == 0U) { - /* Disable the USART Transmit data register empty - * interrupt */ - __HAL_USART_DISABLE_IT(husart, USART_IT_TXE); - - /* Enable the USART Transmit Complete Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TC); - } else { - tmp = (const uint16_t *)husart->pTxBuffPtr; - husart->Instance->TDR = (uint16_t)(*tmp & 0x01FFU); - husart->pTxBuffPtr += 2U; - husart->TxXferCount--; - } - } -} - -/** - * @brief Simplex send an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Transmit_IT(). - * @note The USART errors are not managed to avoid the overrun error. - * @note ISR function executed when FIFO mode is enabled and when the - * data word length is less than 9 bits long. - * @param husart USART handle. - * @retval None - */ -static void USART_TxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - uint16_t nb_tx_data; - - /* Check that a Tx process is ongoing */ - if ((state == HAL_USART_STATE_BUSY_TX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - for (nb_tx_data = husart->NbTxDataToProcess; nb_tx_data > 0U; nb_tx_data--) { - if (husart->TxXferCount == 0U) { - /* Disable the TX FIFO threshold interrupt */ - __HAL_USART_DISABLE_IT(husart, USART_IT_TXFT); - - /* Enable the USART Transmit Complete Interrupt - */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TC); - - break; /* force exit loop */ - } else if (__HAL_USART_GET_FLAG(husart, USART_FLAG_TXFNF) == SET) { - husart->Instance->TDR = (uint8_t)(*husart->pTxBuffPtr & (uint8_t)0xFF); - husart->pTxBuffPtr++; - husart->TxXferCount--; - } else { - /* Nothing to do */ - } - } - } -} - -/** - * @brief Simplex send an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Transmit_IT(). - * @note The USART errors are not managed to avoid the overrun error. - * @note ISR function executed when FIFO mode is enabled and when the - * data word length is 9 bits long. - * @param husart USART handle. - * @retval None - */ -static void USART_TxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - const uint16_t *tmp; - uint16_t nb_tx_data; - - /* Check that a Tx process is ongoing */ - if ((state == HAL_USART_STATE_BUSY_TX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - for (nb_tx_data = husart->NbTxDataToProcess; nb_tx_data > 0U; nb_tx_data--) { - if (husart->TxXferCount == 0U) { - /* Disable the TX FIFO threshold interrupt */ - __HAL_USART_DISABLE_IT(husart, USART_IT_TXFT); - - /* Enable the USART Transmit Complete Interrupt - */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TC); - - break; /* force exit loop */ - } else if (__HAL_USART_GET_FLAG(husart, USART_FLAG_TXFNF) == SET) { - tmp = (const uint16_t *)husart->pTxBuffPtr; - husart->Instance->TDR = (uint16_t)(*tmp & 0x01FFU); - husart->pTxBuffPtr += 2U; - husart->TxXferCount--; - } else { - /* Nothing to do */ - } - } - } -} - -/** - * @brief Wraps up transmission in non-blocking mode. - * @param husart Pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval None - */ -static void USART_EndTransmit_IT(USART_HandleTypeDef *husart) -{ - /* Disable the USART Transmit Complete Interrupt */ - __HAL_USART_DISABLE_IT(husart, USART_IT_TC); - - /* Disable the USART Error Interrupt: (Frame error, noise error, overrun - * error) */ - __HAL_USART_DISABLE_IT(husart, USART_IT_ERR); - - /* Clear TxISR function pointer */ - husart->TxISR = NULL; - - if (husart->State == HAL_USART_STATE_BUSY_TX) { - /* Clear overrun flag and discard the received data */ - __HAL_USART_CLEAR_OREFLAG(husart); - __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); - - /* Tx process is completed, restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Complete Callback */ - husart->TxCpltCallback(husart); -#else - /* Call legacy weak Tx Complete Callback */ - HAL_USART_TxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else if (husart->RxXferCount == 0U) { - /* TxRx process is completed, restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Rx Complete Callback */ - husart->TxRxCpltCallback(husart); -#else - /* Call legacy weak Tx Rx Complete Callback */ - HAL_USART_TxRxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else { - /* Nothing to do */ - } -} - -/** - * @brief Simplex receive an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Receive_IT(). - * @note ISR function executed when FIFO mode is disabled and when the - * data word length is less than 9 bits long. - * @param husart USART handle - * @retval None - */ -static void USART_RxISR_8BIT(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - uint16_t txdatacount; - uint16_t uhMask = husart->Mask; - uint32_t txftie; - - if ((state == HAL_USART_STATE_BUSY_RX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - *husart->pRxBuffPtr = (uint8_t)(husart->Instance->RDR & (uint8_t)uhMask); - husart->pRxBuffPtr++; - husart->RxXferCount--; - - if (husart->RxXferCount == 0U) { - /* Disable the USART Parity Error Interrupt and RXNE - * interrupt*/ - CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)); - - /* Disable the USART Error Interrupt: (Frame error, - * noise error, overrun error) */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Clear RxISR function pointer */ - husart->RxISR = NULL; - - /* txftie and txdatacount are temporary variables for - * MISRAC2012-Rule-13.5 */ - txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE); - txdatacount = husart->TxXferCount; - - if (state == HAL_USART_STATE_BUSY_RX) { - /* Clear SPI slave underrun flag and discard - * transmit data */ - if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) { - __HAL_USART_CLEAR_UDRFLAG(husart); - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - } - - /* Rx process is completed, restore - * husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Complete Callback */ - husart->RxCpltCallback(husart); -#else - /* Call legacy weak Rx Complete Callback */ - HAL_USART_RxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) && (txftie != USART_CR3_TXFTIE) && (txdatacount == 0U)) { - /* TxRx process is completed, restore - * husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Rx Complete Callback */ - husart->TxRxCpltCallback(husart); -#else - /* Call legacy weak Tx Rx Complete Callback */ - HAL_USART_TxRxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else { - /* Nothing to do */ - } - } else if ((state == HAL_USART_STATE_BUSY_RX) && (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) { - /* Send dummy byte in order to generate the clock for - * the Slave to Send the next data */ - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } else { - /* Nothing to do */ - } - } -} - -/** - * @brief Simplex receive an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Receive_IT(). - * @note ISR function executed when FIFO mode is disabled and when the - * data word length is 9 bits long. - * @param husart USART handle - * @retval None - */ -static void USART_RxISR_16BIT(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - uint16_t txdatacount; - uint16_t *tmp; - uint16_t uhMask = husart->Mask; - uint32_t txftie; - - if ((state == HAL_USART_STATE_BUSY_RX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - tmp = (uint16_t *)husart->pRxBuffPtr; - *tmp = (uint16_t)(husart->Instance->RDR & uhMask); - husart->pRxBuffPtr += 2U; - husart->RxXferCount--; - - if (husart->RxXferCount == 0U) { - /* Disable the USART Parity Error Interrupt and RXNE - * interrupt*/ - CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)); - - /* Disable the USART Error Interrupt: (Frame error, - * noise error, overrun error) */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Clear RxISR function pointer */ - husart->RxISR = NULL; - - /* txftie and txdatacount are temporary variables for - * MISRAC2012-Rule-13.5 */ - txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE); - txdatacount = husart->TxXferCount; - - if (state == HAL_USART_STATE_BUSY_RX) { - /* Clear SPI slave underrun flag and discard - * transmit data */ - if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) { - __HAL_USART_CLEAR_UDRFLAG(husart); - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - } - - /* Rx process is completed, restore - * husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Complete Callback */ - husart->RxCpltCallback(husart); -#else - /* Call legacy weak Rx Complete Callback */ - HAL_USART_RxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) && (txftie != USART_CR3_TXFTIE) && (txdatacount == 0U)) { - /* TxRx process is completed, restore - * husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Rx Complete Callback */ - husart->TxRxCpltCallback(husart); -#else - /* Call legacy weak Tx Rx Complete Callback */ - HAL_USART_TxRxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else { - /* Nothing to do */ - } - } else if ((state == HAL_USART_STATE_BUSY_RX) && (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) { - /* Send dummy byte in order to generate the clock for - * the Slave to Send the next data */ - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } else { - /* Nothing to do */ - } - } -} - -/** - * @brief Simplex receive an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Receive_IT(). - * @note ISR function executed when FIFO mode is enabled and when the - * data word length is less than 9 bits long. - * @param husart USART handle - * @retval None - */ -static void USART_RxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart) -{ - HAL_USART_StateTypeDef state = husart->State; - uint16_t txdatacount; - uint16_t rxdatacount; - uint16_t uhMask = husart->Mask; - uint16_t nb_rx_data; - uint32_t txftie; - - /* Check that a Rx process is ongoing */ - if ((state == HAL_USART_STATE_BUSY_RX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - for (nb_rx_data = husart->NbRxDataToProcess; nb_rx_data > 0U; nb_rx_data--) { - if (__HAL_USART_GET_FLAG(husart, USART_FLAG_RXFNE) == SET) { - *husart->pRxBuffPtr = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU)); - husart->pRxBuffPtr++; - husart->RxXferCount--; - - if (husart->RxXferCount == 0U) { - /* Disable the USART Parity Error - * Interrupt */ - CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE); - - /* Disable the USART Error Interrupt: - (Frame error, noise error, overrun - error) and RX FIFO Threshold - interrupt */ - CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE)); - - /* Clear RxISR function pointer */ - husart->RxISR = NULL; - - /* txftie and txdatacount are temporary - * variables for MISRAC2012-Rule-13.5 */ - txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE); - txdatacount = husart->TxXferCount; - - if (state == HAL_USART_STATE_BUSY_RX) { - /* Clear SPI slave underrun flag - * and discard transmit data */ - if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) { - __HAL_USART_CLEAR_UDRFLAG(husart); - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - } - - /* Rx process is completed, - * restore husart->State to - * Ready */ - husart->State = HAL_USART_STATE_READY; - state = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Complete - * Callback */ - husart->RxCpltCallback(husart); -#else - /* Call legacy weak Rx Complete - * Callback */ - HAL_USART_RxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) && (txftie != USART_CR3_TXFTIE) && (txdatacount == 0U)) { - /* TxRx process is completed, - * restore husart->State to - * Ready */ - husart->State = HAL_USART_STATE_READY; - state = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Rx - * Complete Callback */ - husart->TxRxCpltCallback(husart); -#else - /* Call legacy weak Tx Rx - * Complete Callback */ - HAL_USART_TxRxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else { - /* Nothing to do */ - } - } else if ((state == HAL_USART_STATE_BUSY_RX) && (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) { - /* Send dummy byte in order to generate - * the clock for the Slave to Send the - * next data */ - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } else { - /* Nothing to do */ - } - } - } - - /* When remaining number of bytes to receive is less than the RX - FIFO threshold, next incoming frames are processed as if FIFO - mode was disabled (i.e. one interrupt per received frame). - */ - rxdatacount = husart->RxXferCount; - if (((rxdatacount != 0U)) && (rxdatacount < husart->NbRxDataToProcess)) { - /* Disable the USART RXFT interrupt*/ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_RXFTIE); - - /* Update the RxISR function pointer */ - husart->RxISR = USART_RxISR_8BIT; - - /* Enable the USART Data Register Not Empty interrupt */ - SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); - - if ((husart->TxXferCount == 0U) && (state == HAL_USART_STATE_BUSY_TX_RX) && (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) { - /* Send dummy byte in order to generate the - * clock for the Slave to Send the next data */ - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } - } - } else { - /* Clear RXNE interrupt flag */ - __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); - } -} - -/** - * @brief Simplex receive an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Receive_IT(). - * @note ISR function executed when FIFO mode is enabled and when the - * data word length is 9 bits long. - * @param husart USART handle - * @retval None - */ -static void USART_RxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart) -{ - HAL_USART_StateTypeDef state = husart->State; - uint16_t txdatacount; - uint16_t rxdatacount; - uint16_t *tmp; - uint16_t uhMask = husart->Mask; - uint16_t nb_rx_data; - uint32_t txftie; - - /* Check that a Tx process is ongoing */ - if ((state == HAL_USART_STATE_BUSY_RX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - for (nb_rx_data = husart->NbRxDataToProcess; nb_rx_data > 0U; nb_rx_data--) { - if (__HAL_USART_GET_FLAG(husart, USART_FLAG_RXFNE) == SET) { - tmp = (uint16_t *)husart->pRxBuffPtr; - *tmp = (uint16_t)(husart->Instance->RDR & uhMask); - husart->pRxBuffPtr += 2U; - husart->RxXferCount--; - - if (husart->RxXferCount == 0U) { - /* Disable the USART Parity Error - * Interrupt */ - CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE); - - /* Disable the USART Error Interrupt: - (Frame error, noise error, overrun - error) and RX FIFO Threshold - interrupt */ - CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE)); - - /* Clear RxISR function pointer */ - husart->RxISR = NULL; - - /* txftie and txdatacount are temporary - * variables for MISRAC2012-Rule-13.5 */ - txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE); - txdatacount = husart->TxXferCount; - - if (state == HAL_USART_STATE_BUSY_RX) { - /* Clear SPI slave underrun flag - * and discard transmit data */ - if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) { - __HAL_USART_CLEAR_UDRFLAG(husart); - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - } - - /* Rx process is completed, - * restore husart->State to - * Ready */ - husart->State = HAL_USART_STATE_READY; - state = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Complete - * Callback */ - husart->RxCpltCallback(husart); -#else - /* Call legacy weak Rx Complete - * Callback */ - HAL_USART_RxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) && (txftie != USART_CR3_TXFTIE) && (txdatacount == 0U)) { - /* TxRx process is completed, - * restore husart->State to - * Ready */ - husart->State = HAL_USART_STATE_READY; - state = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Rx - * Complete Callback */ - husart->TxRxCpltCallback(husart); -#else - /* Call legacy weak Tx Rx - * Complete Callback */ - HAL_USART_TxRxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else { - /* Nothing to do */ - } - } else if ((state == HAL_USART_STATE_BUSY_RX) && (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) { - /* Send dummy byte in order to generate - * the clock for the Slave to Send the - * next data */ - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } else { - /* Nothing to do */ - } - } - } - - /* When remaining number of bytes to receive is less than the RX - FIFO threshold, next incoming frames are processed as if FIFO - mode was disabled (i.e. one interrupt per received frame). - */ - rxdatacount = husart->RxXferCount; - if (((rxdatacount != 0U)) && (rxdatacount < husart->NbRxDataToProcess)) { - /* Disable the USART RXFT interrupt*/ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_RXFTIE); - - /* Update the RxISR function pointer */ - husart->RxISR = USART_RxISR_16BIT; - - /* Enable the USART Data Register Not Empty interrupt */ - SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); - - if ((husart->TxXferCount == 0U) && (state == HAL_USART_STATE_BUSY_TX_RX) && (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) { - /* Send dummy byte in order to generate the - * clock for the Slave to Send the next data */ - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } - } - } else { - /* Clear RXNE interrupt flag */ - __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); - } -} - -/** - * @} - */ - -#endif /* HAL_USART_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/Onboarding/W3_G4SPI_Receive/Core/Src/stm32g4xx_hal_usart_ex.c b/Onboarding/W3_G4SPI_Receive/Core/Src/stm32g4xx_hal_usart_ex.c deleted file mode 100644 index df556a120..000000000 --- a/Onboarding/W3_G4SPI_Receive/Core/Src/stm32g4xx_hal_usart_ex.c +++ /dev/null @@ -1,538 +0,0 @@ -/** - ****************************************************************************** - * @file stm32g4xx_hal_usart_ex.c - * @author MCD Application Team - * @brief Extended USART HAL module driver. - * This file provides firmware functions to manage the following - extended - * functionalities of the Universal Synchronous Receiver Transmitter - Peripheral (USART). - * + Peripheral Control functions - * - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### USART peripheral extended features ##### - ============================================================================== - - (#) FIFO mode enabling/disabling and RX/TX FIFO threshold programming. - - -@- When USART operates in FIFO mode, FIFO mode must be enabled prior - starting RX/TX transfers. Also RX/TX FIFO thresholds must be - configured prior starting RX/TX transfers. - - (#) Slave mode enabling/disabling and NSS pin configuration. - - -@- When USART operates in Slave mode, Slave mode must be enabled prior - starting RX/TX transfers. - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_hal.h" - -/** @addtogroup STM32G4xx_HAL_Driver - * @{ - */ - -/** @defgroup USARTEx USARTEx - * @brief USART Extended HAL module driver - * @{ - */ - -#ifdef HAL_USART_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/** @defgroup USARTEx_Private_Constants USARTEx Private Constants - * @{ - */ -/* USART RX FIFO depth */ -#define RX_FIFO_DEPTH 8U - -/* USART TX FIFO depth */ -#define TX_FIFO_DEPTH 8U -/** - * @} - */ - -/* Private define ------------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @defgroup USARTEx_Private_Functions USARTEx Private Functions - * @{ - */ -static void USARTEx_SetNbDataToProcess(USART_HandleTypeDef *husart); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup USARTEx_Exported_Functions USARTEx Exported Functions - * @{ - */ - -/** @defgroup USARTEx_Exported_Functions_Group1 IO operation functions - * @brief Extended USART Transmit/Receive functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - This subsection provides a set of FIFO mode related callback functions. - - (#) TX/RX Fifos Callbacks: - (+) HAL_USARTEx_RxFifoFullCallback() - (+) HAL_USARTEx_TxFifoEmptyCallback() - -@endverbatim - * @{ - */ - -/** - * @brief USART RX Fifo full callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USARTEx_RxFifoFullCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USARTEx_RxFifoFullCallback can be implemented in the - user file. - */ -} - -/** - * @brief USART TX Fifo empty callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USARTEx_TxFifoEmptyCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USARTEx_TxFifoEmptyCallback can be implemented in the - user file. - */ -} - -/** - * @} - */ - -/** @defgroup USARTEx_Exported_Functions_Group2 Peripheral Control functions - * @brief Extended Peripheral Control functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] This section provides the following functions: - (+) HAL_USARTEx_EnableSPISlaveMode() API enables the SPI slave mode - (+) HAL_USARTEx_DisableSPISlaveMode() API disables the SPI slave mode - (+) HAL_USARTEx_ConfigNSS API configures the Slave Select input pin (NSS) - (+) HAL_USARTEx_EnableFifoMode() API enables the FIFO mode - (+) HAL_USARTEx_DisableFifoMode() API disables the FIFO mode - (+) HAL_USARTEx_SetTxFifoThreshold() API sets the TX FIFO threshold - (+) HAL_USARTEx_SetRxFifoThreshold() API sets the RX FIFO threshold - - -@endverbatim - * @{ - */ - -/** - * @brief Enable the SPI slave mode. - * @note When the USART operates in SPI slave mode, it handles data flow using - * the serial interface clock derived from the external SCLK signal - * provided by the external master SPI device. - * @note In SPI slave mode, the USART must be enabled before starting the master - * communications (or between frames while the clock is stable). - * Otherwise, if the USART slave is enabled while the master is in the middle of - * a frame, it will become desynchronized with the master. - * @note The data register of the slave needs to be ready before the first edge - * of the communication clock or before the end of the ongoing - * communication, otherwise the SPI slave will transmit zeros. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USARTEx_EnableSlaveMode(USART_HandleTypeDef *husart) -{ - uint32_t tmpcr1; - - /* Check parameters */ - assert_param(IS_UART_SPI_SLAVE_INSTANCE(husart->Instance)); - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->State = HAL_USART_STATE_BUSY; - - /* Save actual USART configuration */ - tmpcr1 = READ_REG(husart->Instance->CR1); - - /* Disable USART */ - __HAL_USART_DISABLE(husart); - - /* In SPI slave mode mode, the following bits must be kept cleared: - - LINEN and CLKEN bit in the USART_CR2 register - - HDSEL, SCEN and IREN bits in the USART_CR3 register.*/ - CLEAR_BIT(husart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); - CLEAR_BIT(husart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); - - /* Enable SPI slave mode */ - SET_BIT(husart->Instance->CR2, USART_CR2_SLVEN); - - /* Restore USART configuration */ - WRITE_REG(husart->Instance->CR1, tmpcr1); - - husart->SlaveMode = USART_SLAVEMODE_ENABLE; - - husart->State = HAL_USART_STATE_READY; - - /* Enable USART */ - __HAL_USART_ENABLE(husart); - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Disable the SPI slave mode. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USARTEx_DisableSlaveMode(USART_HandleTypeDef *husart) -{ - uint32_t tmpcr1; - - /* Check parameters */ - assert_param(IS_UART_SPI_SLAVE_INSTANCE(husart->Instance)); - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->State = HAL_USART_STATE_BUSY; - - /* Save actual USART configuration */ - tmpcr1 = READ_REG(husart->Instance->CR1); - - /* Disable USART */ - __HAL_USART_DISABLE(husart); - - /* Disable SPI slave mode */ - CLEAR_BIT(husart->Instance->CR2, USART_CR2_SLVEN); - - /* Restore USART configuration */ - WRITE_REG(husart->Instance->CR1, tmpcr1); - - husart->SlaveMode = USART_SLAVEMODE_DISABLE; - - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Configure the Slave Select input pin (NSS). - * @note Software NSS management: SPI slave will always be selected and NSS - * input pin will be ignored. - * @note Hardware NSS management: the SPI slave selection depends on NSS - * input pin. The slave is selected when NSS is low and deselected when - * NSS is high. - * @param husart USART handle. - * @param NSSConfig NSS configuration. - * This parameter can be one of the following values: - * @arg @ref USART_NSS_HARD - * @arg @ref USART_NSS_SOFT - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USARTEx_ConfigNSS(USART_HandleTypeDef *husart, uint32_t NSSConfig) -{ - uint32_t tmpcr1; - - /* Check parameters */ - assert_param(IS_UART_SPI_SLAVE_INSTANCE(husart->Instance)); - assert_param(IS_USART_NSS(NSSConfig)); - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->State = HAL_USART_STATE_BUSY; - - /* Save actual USART configuration */ - tmpcr1 = READ_REG(husart->Instance->CR1); - - /* Disable USART */ - __HAL_USART_DISABLE(husart); - - /* Program DIS_NSS bit in the USART_CR2 register */ - MODIFY_REG(husart->Instance->CR2, USART_CR2_DIS_NSS, NSSConfig); - - /* Restore USART configuration */ - WRITE_REG(husart->Instance->CR1, tmpcr1); - - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Enable the FIFO mode. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USARTEx_EnableFifoMode(USART_HandleTypeDef *husart) -{ - uint32_t tmpcr1; - - /* Check parameters */ - assert_param(IS_UART_FIFO_INSTANCE(husart->Instance)); - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->State = HAL_USART_STATE_BUSY; - - /* Save actual USART configuration */ - tmpcr1 = READ_REG(husart->Instance->CR1); - - /* Disable USART */ - __HAL_USART_DISABLE(husart); - - /* Enable FIFO mode */ - SET_BIT(tmpcr1, USART_CR1_FIFOEN); - husart->FifoMode = USART_FIFOMODE_ENABLE; - - /* Restore USART configuration */ - WRITE_REG(husart->Instance->CR1, tmpcr1); - - /* Determine the number of data to process during RX/TX ISR execution */ - USARTEx_SetNbDataToProcess(husart); - - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Disable the FIFO mode. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USARTEx_DisableFifoMode(USART_HandleTypeDef *husart) -{ - uint32_t tmpcr1; - - /* Check parameters */ - assert_param(IS_UART_FIFO_INSTANCE(husart->Instance)); - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->State = HAL_USART_STATE_BUSY; - - /* Save actual USART configuration */ - tmpcr1 = READ_REG(husart->Instance->CR1); - - /* Disable USART */ - __HAL_USART_DISABLE(husart); - - /* Disable FIFO mode */ - CLEAR_BIT(tmpcr1, USART_CR1_FIFOEN); - husart->FifoMode = USART_FIFOMODE_DISABLE; - - /* Restore USART configuration */ - WRITE_REG(husart->Instance->CR1, tmpcr1); - - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Set the TXFIFO threshold. - * @param husart USART handle. - * @param Threshold TX FIFO threshold value - * This parameter can be one of the following values: - * @arg @ref USART_TXFIFO_THRESHOLD_1_8 - * @arg @ref USART_TXFIFO_THRESHOLD_1_4 - * @arg @ref USART_TXFIFO_THRESHOLD_1_2 - * @arg @ref USART_TXFIFO_THRESHOLD_3_4 - * @arg @ref USART_TXFIFO_THRESHOLD_7_8 - * @arg @ref USART_TXFIFO_THRESHOLD_8_8 - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USARTEx_SetTxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold) -{ - uint32_t tmpcr1; - - /* Check parameters */ - assert_param(IS_UART_FIFO_INSTANCE(husart->Instance)); - assert_param(IS_USART_TXFIFO_THRESHOLD(Threshold)); - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->State = HAL_USART_STATE_BUSY; - - /* Save actual USART configuration */ - tmpcr1 = READ_REG(husart->Instance->CR1); - - /* Disable USART */ - __HAL_USART_DISABLE(husart); - - /* Update TX threshold configuration */ - MODIFY_REG(husart->Instance->CR3, USART_CR3_TXFTCFG, Threshold); - - /* Determine the number of data to process during RX/TX ISR execution */ - USARTEx_SetNbDataToProcess(husart); - - /* Restore USART configuration */ - WRITE_REG(husart->Instance->CR1, tmpcr1); - - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Set the RXFIFO threshold. - * @param husart USART handle. - * @param Threshold RX FIFO threshold value - * This parameter can be one of the following values: - * @arg @ref USART_RXFIFO_THRESHOLD_1_8 - * @arg @ref USART_RXFIFO_THRESHOLD_1_4 - * @arg @ref USART_RXFIFO_THRESHOLD_1_2 - * @arg @ref USART_RXFIFO_THRESHOLD_3_4 - * @arg @ref USART_RXFIFO_THRESHOLD_7_8 - * @arg @ref USART_RXFIFO_THRESHOLD_8_8 - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USARTEx_SetRxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold) -{ - uint32_t tmpcr1; - - /* Check the parameters */ - assert_param(IS_UART_FIFO_INSTANCE(husart->Instance)); - assert_param(IS_USART_RXFIFO_THRESHOLD(Threshold)); - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->State = HAL_USART_STATE_BUSY; - - /* Save actual USART configuration */ - tmpcr1 = READ_REG(husart->Instance->CR1); - - /* Disable USART */ - __HAL_USART_DISABLE(husart); - - /* Update RX threshold configuration */ - MODIFY_REG(husart->Instance->CR3, USART_CR3_RXFTCFG, Threshold); - - /* Determine the number of data to process during RX/TX ISR execution */ - USARTEx_SetNbDataToProcess(husart); - - /* Restore USART configuration */ - WRITE_REG(husart->Instance->CR1, tmpcr1); - - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup USARTEx_Private_Functions - * @{ - */ - -/** - * @brief Calculate the number of data to process in RX/TX ISR. - * @note The RX FIFO depth and the TX FIFO depth is extracted from - * the USART configuration registers. - * @param husart USART handle. - * @retval None - */ -static void USARTEx_SetNbDataToProcess(USART_HandleTypeDef *husart) -{ - uint8_t rx_fifo_depth; - uint8_t tx_fifo_depth; - uint8_t rx_fifo_threshold; - uint8_t tx_fifo_threshold; - /* 2 0U/1U added for MISRAC2012-Rule-18.1_b and MISRAC2012-Rule-18.1_d - */ - static const uint8_t numerator[] = {1U, 1U, 1U, 3U, 7U, 1U, 0U, 0U}; - static const uint8_t denominator[] = {8U, 4U, 2U, 4U, 8U, 1U, 1U, 1U}; - - if (husart->FifoMode == USART_FIFOMODE_DISABLE) { - husart->NbTxDataToProcess = 1U; - husart->NbRxDataToProcess = 1U; - } else { - rx_fifo_depth = RX_FIFO_DEPTH; - tx_fifo_depth = TX_FIFO_DEPTH; - rx_fifo_threshold = (uint8_t)((READ_BIT(husart->Instance->CR3, USART_CR3_RXFTCFG) >> USART_CR3_RXFTCFG_Pos) & 0xFFU); - tx_fifo_threshold = (uint8_t)((READ_BIT(husart->Instance->CR3, USART_CR3_TXFTCFG) >> USART_CR3_TXFTCFG_Pos) & 0xFFU); - husart->NbTxDataToProcess = ((uint16_t)tx_fifo_depth * numerator[tx_fifo_threshold]) / (uint16_t)denominator[tx_fifo_threshold]; - husart->NbRxDataToProcess = ((uint16_t)rx_fifo_depth * numerator[rx_fifo_threshold]) / (uint16_t)denominator[rx_fifo_threshold]; - } -} -/** - * @} - */ - -#endif /* HAL_USART_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/Onboarding/W3_G4SPI_Receive/Core/Src/stm32g4xx_it.c b/Onboarding/W3_G4SPI_Receive/Core/Src/stm32g4xx_it.c deleted file mode 100644 index b8f0c7de5..000000000 --- a/Onboarding/W3_G4SPI_Receive/Core/Src/stm32g4xx_it.c +++ /dev/null @@ -1,198 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32g4xx_it.c - * @brief Interrupt Service Routines. - ****************************************************************************** - * @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 "stm32g4xx_it.h" - -#include "main.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 --------------------------------------------------------*/ - -/* USER CODE BEGIN EV */ - -/* USER CODE END EV */ - -/******************************************************************************/ -/* Cortex-M4 Processor Interruption and Exception Handlers */ -/******************************************************************************/ -/** - * @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 */ -} - -/** - * @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 */ - } -} - -/** - * @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 */ - } -} - -/** - * @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 */ - } -} - -/** - * @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 */ - } -} - -/** - * @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 */ -} - -/** - * @brief This function handles Debug monitor. - */ -void DebugMon_Handler(void) -{ - /* USER CODE BEGIN DebugMonitor_IRQn 0 */ - - /* 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 */ - - /* 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 */ -} - -/******************************************************************************/ -/* STM32G4xx Peripheral Interrupt Handlers */ -/* Add here the Interrupt Handlers for the used peripherals. */ -/* For the available peripheral interrupt handler names, */ -/* please refer to the startup file (startup_stm32g4xx.s). */ -/******************************************************************************/ - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/Onboarding/W3_G4SPI_Transmit/CMakeLists.txt b/Onboarding/W3_G4SPI_Transmit/CMakeLists.txt deleted file mode 100644 index 2a9cb25be..000000000 --- a/Onboarding/W3_G4SPI_Transmit/CMakeLists.txt +++ /dev/null @@ -1,50 +0,0 @@ -cmake_minimum_required(VERSION 3.25) - -# Setup compiler settings -set(CMAKE_C_STANDARD 11) -set(CMAKE_C_STANDARD_REQUIRED ON) -set(CMAKE_C_EXTENSIONS ON) - -# Define the build type -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Debug") -endif() - -# what, does in fact not get the filename of somthing but rather the name of the project from the path -get_filename_component(GR_PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) - -# Enable CMake support for ASM and C languages -enable_language( - C - ASM -) - -# Core project settings -project(${CMAKE_PROJECT_NAME}) - -# Questionable... -# set(TARGET_FLAGS "-mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard ") -# set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS "-T${CHIP_PATH}/CompileDependencies/STM32G474RETx_FLASH.ld") - -add_library(${GR_PROJECT_NAME}_USER_CODE INTERFACE) -target_sources( - ${GR_PROJECT_NAME}_USER_CODE - INTERFACE - Core/Src/main.c - #Core/Src/gpio.c - #Core/Src/adc.c - #Core/Src/crc.c - #Core/Src/fdcan.c - #Core/Src/spi.c - Core/Src/stm32g4xx_it.c - Core/Src/stm32g4xx_hal_msp.c -) - -target_link_libraries(${GR_PROJECT_NAME}_USER_CODE INTERFACE) - -target_include_directories( - ${GR_PROJECT_NAME}_USER_CODE - INTERFACE - Application/Inc - Core/Inc -) diff --git a/Onboarding/W3_G4SPI_Transmit/Core/Inc/main.h b/Onboarding/W3_G4SPI_Transmit/Core/Inc/main.h deleted file mode 100644 index a0a290aa9..000000000 --- a/Onboarding/W3_G4SPI_Transmit/Core/Inc/main.h +++ /dev/null @@ -1,69 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.h - * @brief : Header for main.c file. - * This file contains the common defines of the application. - ****************************************************************************** - * @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 */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MAIN_H -#define __MAIN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_hal.h" - -/* Private 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 */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void Error_Handler(void); - -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -/* Private defines -----------------------------------------------------------*/ - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -#ifdef __cplusplus -} -#endif - -#endif /* __MAIN_H */ diff --git a/Onboarding/W3_G4SPI_Transmit/Core/Inc/stm32g4xx_hal_conf.h b/Onboarding/W3_G4SPI_Transmit/Core/Inc/stm32g4xx_hal_conf.h deleted file mode 100644 index 2c54ce1b3..000000000 --- a/Onboarding/W3_G4SPI_Transmit/Core/Inc/stm32g4xx_hal_conf.h +++ /dev/null @@ -1,390 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32g4xx_hal_conf.h - * @author MCD Application Team - * @brief HAL configuration file - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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 STM32G4xx_HAL_CONF_H -#define STM32G4xx_HAL_CONF_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ - -#define HAL_MODULE_ENABLED - -/*#define HAL_ADC_MODULE_ENABLED */ -/*#define HAL_COMP_MODULE_ENABLED */ -/*#define HAL_CORDIC_MODULE_ENABLED */ -/*#define HAL_CRC_MODULE_ENABLED */ -/*#define HAL_CRYP_MODULE_ENABLED */ -/*#define HAL_DAC_MODULE_ENABLED */ -/*#define HAL_FDCAN_MODULE_ENABLED */ -/*#define HAL_FMAC_MODULE_ENABLED */ -/*#define HAL_HRTIM_MODULE_ENABLED */ -/*#define HAL_IRDA_MODULE_ENABLED */ -/*#define HAL_IWDG_MODULE_ENABLED */ -/*#define HAL_I2C_MODULE_ENABLED */ -/*#define HAL_I2S_MODULE_ENABLED */ -/*#define HAL_LPTIM_MODULE_ENABLED */ -/*#define HAL_NAND_MODULE_ENABLED */ -/*#define HAL_NOR_MODULE_ENABLED */ -/*#define HAL_OPAMP_MODULE_ENABLED */ -/*#define HAL_PCD_MODULE_ENABLED */ -/*#define HAL_QSPI_MODULE_ENABLED */ -/*#define HAL_RNG_MODULE_ENABLED */ -/*#define HAL_RTC_MODULE_ENABLED */ -/*#define HAL_SAI_MODULE_ENABLED */ -/*#define HAL_SMARTCARD_MODULE_ENABLED */ -/*#define HAL_SMBUS_MODULE_ENABLED */ -#define HAL_SPI_MODULE_ENABLED -/*#define HAL_SRAM_MODULE_ENABLED */ -/*#define HAL_TIM_MODULE_ENABLED */ -/*#define HAL_UART_MODULE_ENABLED */ -#define HAL_USART_MODULE_ENABLED -/*#define HAL_WWDG_MODULE_ENABLED */ -#define HAL_GPIO_MODULE_ENABLED -#define HAL_EXTI_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED - -/* ########################## Register Callbacks selection - * ############################## */ -/** - * @brief This is the list of modules where register callback can be used - */ -#define USE_HAL_ADC_REGISTER_CALLBACKS 0U -#define USE_HAL_COMP_REGISTER_CALLBACKS 0U -#define USE_HAL_CORDIC_REGISTER_CALLBACKS 0U -#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U -#define USE_HAL_DAC_REGISTER_CALLBACKS 0U -#define USE_HAL_EXTI_REGISTER_CALLBACKS 0U -#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U -#define USE_HAL_FMAC_REGISTER_CALLBACKS 0U -#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U -#define USE_HAL_I2C_REGISTER_CALLBACKS 0U -#define USE_HAL_I2S_REGISTER_CALLBACKS 0U -#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U -#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U -#define USE_HAL_NAND_REGISTER_CALLBACKS 0U -#define USE_HAL_NOR_REGISTER_CALLBACKS 0U -#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U -#define USE_HAL_PCD_REGISTER_CALLBACKS 0U -#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U -#define USE_HAL_RNG_REGISTER_CALLBACKS 0U -#define USE_HAL_RTC_REGISTER_CALLBACKS 0U -#define USE_HAL_SAI_REGISTER_CALLBACKS 0U -#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U -#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U -#define USE_HAL_SPI_REGISTER_CALLBACKS 0U -#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U -#define USE_HAL_TIM_REGISTER_CALLBACKS 0U -#define USE_HAL_UART_REGISTER_CALLBACKS 0U -#define USE_HAL_USART_REGISTER_CALLBACKS 0U -#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U - -/* ########################## Oscillator Values adaptation - * ####################*/ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your - * application. This value is used by the RCC HAL module to compute the system - * frequency (when HSE is used as system clock source, directly or through the - * PLL). - */ -#if !defined(HSE_VALUE) -#define HSE_VALUE (8000000UL) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined(HSE_STARTUP_TIMEOUT) -#define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system - * frequency (when HSI is used as system clock source, directly or through the - * PLL). - */ -#if !defined(HSI_VALUE) -#define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief Internal High Speed oscillator (HSI48) value for USB FS and RNG. - * This internal oscillator is mainly dedicated to provide a high - * precision clock to the USB peripheral by means of a special Clock Recovery - * System (CRS) circuitry. When the CRS is not used, the HSI48 RC oscillator - * runs on it default frequency which is subject to manufacturing process - * variations. - */ -#if !defined(HSI48_VALUE) -#define HSI48_VALUE \ - (48000000UL) /*!< Value of the Internal High Speed oscillator for USB \ - FS/RNG in Hz. The real value my vary depending on \ - manufacturing process variations.*/ -#endif /* HSI48_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined(LSI_VALUE) -/*!< Value of the Internal Low Speed oscillator in Hz -The real value may vary depending on the variations in voltage and -temperature.*/ -#define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ -/** - * @brief External Low Speed oscillator (LSE) value. - * This value is used by the UART, RTC HAL module to compute the system - * frequency - */ -#if !defined(LSE_VALUE) -#define LSE_VALUE (32768UL) /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -#if !defined(LSE_STARTUP_TIMEOUT) -#define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -/** - * @brief External clock source for I2S and SAI peripherals - * This value is used by the I2S and SAI HAL modules to compute the I2S - * and SAI clock source frequency, this source is inserted directly through - * I2S_CKIN pad. - */ -#if !defined(EXTERNAL_CLOCK_VALUE) -#define EXTERNAL_CLOCK_VALUE (12288000UL) /*!< Value of the External oscillator in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ - -#define VDD_VALUE (3300UL) /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY (15UL) /*!< tick interrupt priority (lowest by default) */ -#define USE_RTOS 0U -#define PREFETCH_ENABLE 0U -#define INSTRUCTION_CACHE_ENABLE 1U -#define DATA_CACHE_ENABLE 1U - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1U */ - -/* ################## SPI peripheral configuration ########################## */ - -/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver - * Activated: CRC code is present inside driver - * Deactivated: CRC code cleaned from driver - */ - -#define USE_SPI_CRC 0U - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED -#include "stm32g4xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED -#include "stm32g4xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED -#include "stm32g4xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED -#include "stm32g4xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED -#include "stm32g4xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_COMP_MODULE_ENABLED -#include "stm32g4xx_hal_comp.h" -#endif /* HAL_COMP_MODULE_ENABLED */ - -#ifdef HAL_CORDIC_MODULE_ENABLED -#include "stm32g4xx_hal_cordic.h" -#endif /* HAL_CORDIC_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED -#include "stm32g4xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED -#include "stm32g4xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED -#include "stm32g4xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED -#include "stm32g4xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_FDCAN_MODULE_ENABLED -#include "stm32g4xx_hal_fdcan.h" -#endif /* HAL_FDCAN_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED -#include "stm32g4xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_FMAC_MODULE_ENABLED -#include "stm32g4xx_hal_fmac.h" -#endif /* HAL_FMAC_MODULE_ENABLED */ - -#ifdef HAL_HRTIM_MODULE_ENABLED -#include "stm32g4xx_hal_hrtim.h" -#endif /* HAL_HRTIM_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED -#include "stm32g4xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED -#include "stm32g4xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED -#include "stm32g4xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED -#include "stm32g4xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED -#include "stm32g4xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED -#include "stm32g4xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED -#include "stm32g4xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_OPAMP_MODULE_ENABLED -#include "stm32g4xx_hal_opamp.h" -#endif /* HAL_OPAMP_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED -#include "stm32g4xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED -#include "stm32g4xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED -#include "stm32g4xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED -#include "stm32g4xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED -#include "stm32g4xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED -#include "stm32g4xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED -#include "stm32g4xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED -#include "stm32g4xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED -#include "stm32g4xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED -#include "stm32g4xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED -#include "stm32g4xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED -#include "stm32g4xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED -#include "stm32g4xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED -#include "stm32g4xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -/* 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 /* STM32G4xx_HAL_CONF_H */ diff --git a/Onboarding/W3_G4SPI_Transmit/Core/Inc/stm32g4xx_hal_usart.h b/Onboarding/W3_G4SPI_Transmit/Core/Inc/stm32g4xx_hal_usart.h deleted file mode 100644 index 209e70af6..000000000 --- a/Onboarding/W3_G4SPI_Transmit/Core/Inc/stm32g4xx_hal_usart.h +++ /dev/null @@ -1,1008 +0,0 @@ -/** - ****************************************************************************** - * @file stm32g4xx_hal_usart.h - * @author MCD Application Team - * @brief Header file of USART HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32G4xx_HAL_USART_H -#define STM32G4xx_HAL_USART_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_hal_def.h" - -/** @addtogroup STM32G4xx_HAL_Driver - * @{ - */ - -/** @addtogroup USART - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup USART_Exported_Types USART Exported Types - * @{ - */ - -/** - * @brief USART Init Structure definition - */ -typedef struct { - uint32_t BaudRate; /*!< This member configures the Usart communication baud - rate. The baud rate is computed using the following - formula: Baud Rate Register[15:4] = ((2 * fclk_pres) / - ((huart->Init.BaudRate)))[15:4] - Baud Rate Register[3] = 0 - Baud Rate Register[2:0] = (((2 * fclk_pres) / - ((huart->Init.BaudRate)))[3:0]) >> 1 - where fclk_pres is the USART input clock frequency - (fclk) divided by a prescaler. - @note Oversampling by 8 is systematically applied to - achieve high baud rates. */ - - uint32_t WordLength; /*!< Specifies the number of data bits transmitted - or received in a frame. This parameter can be a - value of @ref USARTEx_Word_Length. */ - - uint32_t StopBits; /*!< Specifies the number of stop bits transmitted. - This parameter can be a value of @ref - USART_Stop_Bits. */ - - uint32_t Parity; /*!< Specifies the parity mode. - This parameter can be a value of @ref USART_Parity - @note When parity is enabled, the computed parity is - inserted at the MSB position of the transmitted data (9th - bit when the word length is set to 9 data bits; 8th bit - when the word length is set to 8 data bits). */ - - uint32_t Mode; /*!< Specifies whether the Receive or Transmit mode is - enabled or disabled. This parameter can be a value of - @ref USART_Mode. */ - - uint32_t CLKPolarity; /*!< Specifies the steady state of the serial - clock. This parameter can be a value of @ref - USART_Clock_Polarity. */ - - uint32_t CLKPhase; /*!< Specifies the clock transition on which the bit - capture is made. This parameter can be a value of - @ref USART_Clock_Phase. */ - - uint32_t CLKLastBit; /*!< Specifies whether the clock pulse corresponding to - the last transmitted data bit (MSB) has to be output - on the SCLK pin in synchronous mode. This parameter - can be a value of @ref USART_Last_Bit. */ - - uint32_t ClockPrescaler; /*!< Specifies the prescaler value used to divide - the USART clock source. This parameter can be a - value of @ref USART_ClockPrescaler. */ -} USART_InitTypeDef; - -/** - * @brief HAL USART State structures definition - */ -typedef enum { - HAL_USART_STATE_RESET = 0x00U, /*!< Peripheral is not initialized */ - HAL_USART_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ - HAL_USART_STATE_BUSY = 0x02U, /*!< an internal process is ongoing */ - HAL_USART_STATE_BUSY_TX = 0x12U, /*!< Data Transmission process is ongoing */ - HAL_USART_STATE_BUSY_RX = 0x22U, /*!< Data Reception process is ongoing */ - HAL_USART_STATE_BUSY_TX_RX = 0x32U, /*!< Data Transmission Reception process is ongoing */ - HAL_USART_STATE_TIMEOUT = 0x03U, /*!< Timeout state */ - HAL_USART_STATE_ERROR = 0x04U /*!< Error */ -} HAL_USART_StateTypeDef; - -/** - * @brief USART clock sources definitions - */ -typedef enum { - USART_CLOCKSOURCE_PCLK1 = 0x00U, /*!< PCLK1 clock source */ - USART_CLOCKSOURCE_PCLK2 = 0x01U, /*!< PCLK2 clock source */ - USART_CLOCKSOURCE_HSI = 0x02U, /*!< HSI clock source */ - USART_CLOCKSOURCE_SYSCLK = 0x04U, /*!< SYSCLK clock source */ - USART_CLOCKSOURCE_LSE = 0x08U, /*!< LSE clock source */ - USART_CLOCKSOURCE_UNDEFINED = 0x10U /*!< Undefined clock source */ -} USART_ClockSourceTypeDef; - -/** - * @brief USART handle Structure definition - */ -typedef struct __USART_HandleTypeDef { - USART_TypeDef *Instance; /*!< USART registers base address */ - - USART_InitTypeDef Init; /*!< USART communication parameters */ - - const uint8_t *pTxBuffPtr; /*!< Pointer to USART Tx transfer Buffer */ - - uint16_t TxXferSize; /*!< USART Tx Transfer size */ - - __IO uint16_t TxXferCount; /*!< USART Tx Transfer Counter */ - - uint8_t *pRxBuffPtr; /*!< Pointer to USART Rx transfer Buffer */ - - uint16_t RxXferSize; /*!< USART Rx Transfer size */ - - __IO uint16_t RxXferCount; /*!< USART Rx Transfer Counter */ - - uint16_t Mask; /*!< USART Rx RDR register mask */ - - uint16_t NbRxDataToProcess; /*!< Number of data to process during RX ISR - execution */ - - uint16_t NbTxDataToProcess; /*!< Number of data to process during TX ISR - execution */ - - uint32_t SlaveMode; /*!< Enable/Disable USART SPI Slave Mode. This parameter - can be a value of @ref USARTEx_Slave_Mode */ - - uint32_t FifoMode; /*!< Specifies if the FIFO mode will be used. This - parameter can be a value of @ref USARTEx_FIFO_mode. */ - - void (*RxISR)(struct __USART_HandleTypeDef *husart); /*!< Function pointer on Rx IRQ handler */ - - void (*TxISR)(struct __USART_HandleTypeDef *husart); /*!< Function pointer on Tx IRQ handler */ - - DMA_HandleTypeDef *hdmatx; /*!< USART Tx DMA Handle parameters */ - - DMA_HandleTypeDef *hdmarx; /*!< USART Rx DMA Handle parameters */ - - HAL_LockTypeDef Lock; /*!< Locking object */ - - __IO HAL_USART_StateTypeDef State; /*!< USART communication state */ - - __IO uint32_t ErrorCode; /*!< USART Error code */ - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - void (*TxHalfCpltCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Tx Half Complete Callback */ - void (*TxCpltCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Tx Complete Callback */ - void (*RxHalfCpltCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Rx Half Complete Callback */ - void (*RxCpltCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Rx Complete Callback */ - void (*TxRxCpltCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Tx Rx Complete Callback */ - void (*ErrorCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Error Callback */ - void (*AbortCpltCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Abort Complete Callback */ - void (*RxFifoFullCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Rx Fifo Full Callback */ - void (*TxFifoEmptyCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Tx Fifo Empty Callback */ - - void (*MspInitCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Msp Init callback */ - void (*MspDeInitCallback)(struct __USART_HandleTypeDef *husart); /*!< USART Msp DeInit callback */ -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - -} USART_HandleTypeDef; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) -/** - * @brief HAL USART Callback ID enumeration definition - */ -typedef enum { - HAL_USART_TX_HALFCOMPLETE_CB_ID = 0x00U, /*!< USART Tx Half Complete Callback ID */ - HAL_USART_TX_COMPLETE_CB_ID = 0x01U, /*!< USART Tx Complete Callback ID */ - HAL_USART_RX_HALFCOMPLETE_CB_ID = 0x02U, /*!< USART Rx Half Complete Callback ID */ - HAL_USART_RX_COMPLETE_CB_ID = 0x03U, /*!< USART Rx Complete Callback ID */ - HAL_USART_TX_RX_COMPLETE_CB_ID = 0x04U, /*!< USART Tx Rx Complete Callback ID */ - HAL_USART_ERROR_CB_ID = 0x05U, /*!< USART Error Callback ID */ - HAL_USART_ABORT_COMPLETE_CB_ID = 0x06U, /*!< USART Abort Complete Callback ID */ - HAL_USART_RX_FIFO_FULL_CB_ID = 0x07U, /*!< USART Rx Fifo Full Callback ID */ - HAL_USART_TX_FIFO_EMPTY_CB_ID = 0x08U, /*!< USART Tx Fifo Empty Callback ID */ - - HAL_USART_MSPINIT_CB_ID = 0x09U, /*!< USART MspInit callback ID */ - HAL_USART_MSPDEINIT_CB_ID = 0x0AU /*!< USART MspDeInit callback ID */ - -} HAL_USART_CallbackIDTypeDef; - -/** - * @brief HAL USART Callback pointer definition - */ -typedef void (*pUSART_CallbackTypeDef)(USART_HandleTypeDef *husart); /*!< pointer to an USART callback function */ - -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup USART_Exported_Constants USART Exported Constants - * @{ - */ - -/** @defgroup USART_Error_Definition USART Error Definition - * @{ - */ -#define HAL_USART_ERROR_NONE (0x00000000U) /*!< No error */ -#define HAL_USART_ERROR_PE (0x00000001U) /*!< Parity error */ -#define HAL_USART_ERROR_NE (0x00000002U) /*!< Noise error */ -#define HAL_USART_ERROR_FE (0x00000004U) /*!< Frame error */ -#define HAL_USART_ERROR_ORE (0x00000008U) /*!< Overrun error */ -#define HAL_USART_ERROR_DMA (0x00000010U) /*!< DMA transfer error */ -#define HAL_USART_ERROR_UDR (0x00000020U) /*!< SPI slave underrun error */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) -#define HAL_USART_ERROR_INVALID_CALLBACK (0x00000040U) /*!< Invalid Callback error */ -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -#define HAL_USART_ERROR_RTO (0x00000080U) /*!< Receiver Timeout error */ -/** - * @} - */ - -/** @defgroup USART_Stop_Bits USART Number of Stop Bits - * @{ - */ -#define USART_STOPBITS_0_5 USART_CR2_STOP_0 /*!< USART frame with 0.5 stop bit */ -#define USART_STOPBITS_1 0x00000000U /*!< USART frame with 1 stop bit */ -#define USART_STOPBITS_1_5 (USART_CR2_STOP_0 | USART_CR2_STOP_1) /*!< USART frame with 1.5 stop bits */ -#define USART_STOPBITS_2 USART_CR2_STOP_1 /*!< USART frame with 2 stop bits */ -/** - * @} - */ - -/** @defgroup USART_Parity USART Parity - * @{ - */ -#define USART_PARITY_NONE 0x00000000U /*!< No parity */ -#define USART_PARITY_EVEN USART_CR1_PCE /*!< Even parity */ -#define USART_PARITY_ODD (USART_CR1_PCE | USART_CR1_PS) /*!< Odd parity */ -/** - * @} - */ - -/** @defgroup USART_Mode USART Mode - * @{ - */ -#define USART_MODE_RX USART_CR1_RE /*!< RX mode */ -#define USART_MODE_TX USART_CR1_TE /*!< TX mode */ -#define USART_MODE_TX_RX (USART_CR1_TE | USART_CR1_RE) /*!< RX and TX mode */ -/** - * @} - */ - -/** @defgroup USART_Clock USART Clock - * @{ - */ -#define USART_CLOCK_DISABLE 0x00000000U /*!< USART clock disable */ -#define USART_CLOCK_ENABLE USART_CR2_CLKEN /*!< USART clock enable */ -/** - * @} - */ - -/** @defgroup USART_Clock_Polarity USART Clock Polarity - * @{ - */ -#define USART_POLARITY_LOW 0x00000000U /*!< Driver enable signal is active high */ -#define USART_POLARITY_HIGH USART_CR2_CPOL /*!< Driver enable signal is active low */ -/** - * @} - */ - -/** @defgroup USART_Clock_Phase USART Clock Phase - * @{ - */ -#define USART_PHASE_1EDGE 0x00000000U /*!< USART frame phase on first clock transition */ -#define USART_PHASE_2EDGE USART_CR2_CPHA /*!< USART frame phase on second clock transition */ -/** - * @} - */ - -/** @defgroup USART_Last_Bit USART Last Bit - * @{ - */ -#define USART_LASTBIT_DISABLE \ - 0x00000000U /*!< USART frame last data bit clock pulse not output to \ - SCLK pin */ -#define USART_LASTBIT_ENABLE \ - USART_CR2_LBCL /*!< USART frame last data bit clock pulse output to \ - SCLK pin */ -/** - * @} - */ - -/** @defgroup USART_ClockPrescaler USART Clock Prescaler - * @{ - */ -#define USART_PRESCALER_DIV1 0x00000000U /*!< fclk_pres = fclk */ -#define USART_PRESCALER_DIV2 0x00000001U /*!< fclk_pres = fclk/2 */ -#define USART_PRESCALER_DIV4 0x00000002U /*!< fclk_pres = fclk/4 */ -#define USART_PRESCALER_DIV6 0x00000003U /*!< fclk_pres = fclk/6 */ -#define USART_PRESCALER_DIV8 0x00000004U /*!< fclk_pres = fclk/8 */ -#define USART_PRESCALER_DIV10 0x00000005U /*!< fclk_pres = fclk/10 */ -#define USART_PRESCALER_DIV12 0x00000006U /*!< fclk_pres = fclk/12 */ -#define USART_PRESCALER_DIV16 0x00000007U /*!< fclk_pres = fclk/16 */ -#define USART_PRESCALER_DIV32 0x00000008U /*!< fclk_pres = fclk/32 */ -#define USART_PRESCALER_DIV64 0x00000009U /*!< fclk_pres = fclk/64 */ -#define USART_PRESCALER_DIV128 0x0000000AU /*!< fclk_pres = fclk/128 */ -#define USART_PRESCALER_DIV256 0x0000000BU /*!< fclk_pres = fclk/256 */ - -/** - * @} - */ - -/** @defgroup USART_Request_Parameters USART Request Parameters - * @{ - */ -#define USART_RXDATA_FLUSH_REQUEST USART_RQR_RXFRQ /*!< Receive Data flush Request */ -#define USART_TXDATA_FLUSH_REQUEST USART_RQR_TXFRQ /*!< Transmit data flush Request */ -/** - * @} - */ - -/** @defgroup USART_Flags USART Flags - * Elements values convention: 0xXXXX - * - 0xXXXX : Flag mask in the ISR register - * @{ - */ -#define USART_FLAG_TXFT USART_ISR_TXFT /*!< USART TXFIFO threshold flag */ -#define USART_FLAG_RXFT USART_ISR_RXFT /*!< USART RXFIFO threshold flag */ -#define USART_FLAG_RXFF USART_ISR_RXFF /*!< USART RXFIFO Full flag */ -#define USART_FLAG_TXFE USART_ISR_TXFE /*!< USART TXFIFO Empty flag */ -#define USART_FLAG_REACK USART_ISR_REACK /*!< USART receive enable acknowledge flag */ -#define USART_FLAG_TEACK USART_ISR_TEACK /*!< USART transmit enable acknowledge flag */ -#define USART_FLAG_BUSY USART_ISR_BUSY /*!< USART busy flag */ -#define USART_FLAG_UDR USART_ISR_UDR /*!< SPI slave underrun error flag */ -#define USART_FLAG_TXE USART_ISR_TXE_TXFNF /*!< USART transmit data register empty */ -#define USART_FLAG_TXFNF USART_ISR_TXE_TXFNF /*!< USART TXFIFO not full */ -#define USART_FLAG_RTOF USART_ISR_RTOF /*!< USART receiver timeout flag */ -#define USART_FLAG_TC USART_ISR_TC /*!< USART transmission complete */ -#define USART_FLAG_RXNE USART_ISR_RXNE_RXFNE /*!< USART read data register not empty */ -#define USART_FLAG_RXFNE USART_ISR_RXNE_RXFNE /*!< USART RXFIFO not empty */ -#define USART_FLAG_IDLE USART_ISR_IDLE /*!< USART idle flag */ -#define USART_FLAG_ORE USART_ISR_ORE /*!< USART overrun error */ -#define USART_FLAG_NE USART_ISR_NE /*!< USART noise error */ -#define USART_FLAG_FE USART_ISR_FE /*!< USART frame error */ -#define USART_FLAG_PE USART_ISR_PE /*!< USART parity error */ - /** - * @} - */ - -/** @defgroup USART_Interrupt_definition USART Interrupts Definition - * Elements values convention: 0000ZZZZ0XXYYYYYb - * - YYYYY : Interrupt source position in the XX register (5bits) - * - XX : Interrupt source register (2bits) - * - 01: CR1 register - * - 10: CR2 register - * - 11: CR3 register - * - ZZZZ : Flag position in the ISR register(4bits) - * @{ - */ - -#define USART_IT_PE 0x0028U /*!< USART parity error interruption */ -#define USART_IT_TXE 0x0727U /*!< USART transmit data register empty interruption */ -#define USART_IT_TXFNF 0x0727U /*!< USART TX FIFO not full interruption */ -#define USART_IT_TC 0x0626U /*!< USART transmission complete interruption */ -#define USART_IT_RXNE 0x0525U /*!< USART read data register not empty interruption */ -#define USART_IT_RXFNE 0x0525U /*!< USART RXFIFO not empty interruption */ -#define USART_IT_IDLE 0x0424U /*!< USART idle interruption */ -#define USART_IT_ERR 0x0060U /*!< USART error interruption */ -#define USART_IT_ORE 0x0300U /*!< USART overrun error interruption */ -#define USART_IT_NE 0x0200U /*!< USART noise error interruption */ -#define USART_IT_FE 0x0100U /*!< USART frame error interruption */ -#define USART_IT_RXFF 0x183FU /*!< USART RXFIFO full interruption */ -#define USART_IT_TXFE 0x173EU /*!< USART TXFIFO empty interruption */ -#define USART_IT_RXFT 0x1A7CU /*!< USART RXFIFO threshold reached interruption */ -#define USART_IT_TXFT 0x1B77U /*!< USART TXFIFO threshold reached interruption */ - -/** - * @} - */ - -/** @defgroup USART_IT_CLEAR_Flags USART Interruption Clear Flags - * @{ - */ -#define USART_CLEAR_PEF USART_ICR_PECF /*!< Parity Error Clear Flag */ -#define USART_CLEAR_FEF USART_ICR_FECF /*!< Framing Error Clear Flag */ -#define USART_CLEAR_NEF USART_ICR_NECF /*!< Noise Error detected Clear Flag */ -#define USART_CLEAR_OREF USART_ICR_ORECF /*!< OverRun Error Clear Flag */ -#define USART_CLEAR_IDLEF USART_ICR_IDLECF /*!< IDLE line detected Clear Flag */ -#define USART_CLEAR_TCF USART_ICR_TCCF /*!< Transmission Complete Clear Flag */ -#define USART_CLEAR_UDRF USART_ICR_UDRCF /*!< SPI slave underrun error Clear Flag */ -#define USART_CLEAR_TXFECF USART_ICR_TXFECF /*!< TXFIFO Empty Clear Flag */ -#define USART_CLEAR_RTOF USART_ICR_RTOCF /*!< USART receiver timeout clear flag */ -/** - * @} - */ - -/** @defgroup USART_Interruption_Mask USART Interruption Flags Mask - * @{ - */ -#define USART_IT_MASK 0x001FU /*!< USART interruptions flags mask */ -#define USART_CR_MASK 0x00E0U /*!< USART control register mask */ -#define USART_CR_POS 5U /*!< USART control register position */ -#define USART_ISR_MASK 0x1F00U /*!< USART ISR register mask */ -#define USART_ISR_POS 8U /*!< USART ISR register position */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup USART_Exported_Macros USART Exported Macros - * @{ - */ - -/** @brief Reset USART handle state. - * @param __HANDLE__ USART handle. - * @retval None - */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) -#define __HAL_USART_RESET_HANDLE_STATE(__HANDLE__) \ - do { \ - (__HANDLE__)->State = HAL_USART_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while (0U) -#else -#define __HAL_USART_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_USART_STATE_RESET) -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - -/** @brief Check whether the specified USART flag is set or not. - * @param __HANDLE__ specifies the USART Handle - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg @ref USART_FLAG_TXFT TXFIFO threshold flag - * @arg @ref USART_FLAG_RXFT RXFIFO threshold flag - * @arg @ref USART_FLAG_RXFF RXFIFO Full flag - * @arg @ref USART_FLAG_TXFE TXFIFO Empty flag - * @arg @ref USART_FLAG_REACK Receive enable acknowledge flag - * @arg @ref USART_FLAG_TEACK Transmit enable acknowledge flag - * @arg @ref USART_FLAG_BUSY Busy flag - * @arg @ref USART_FLAG_UDR SPI slave underrun error flag - * @arg @ref USART_FLAG_TXE Transmit data register empty flag - * @arg @ref USART_FLAG_TXFNF TXFIFO not full flag - * @arg @ref USART_FLAG_TC Transmission Complete flag - * @arg @ref USART_FLAG_RXNE Receive data register not empty flag - * @arg @ref USART_FLAG_RXFNE RXFIFO not empty flag - * @arg @ref USART_FLAG_RTOF Receiver Timeout flag - * @arg @ref USART_FLAG_IDLE Idle Line detection flag - * @arg @ref USART_FLAG_ORE OverRun Error flag - * @arg @ref USART_FLAG_NE Noise Error flag - * @arg @ref USART_FLAG_FE Framing Error flag - * @arg @ref USART_FLAG_PE Parity Error flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_USART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->ISR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the specified USART pending flag. - * @param __HANDLE__ specifies the USART Handle. - * @param __FLAG__ specifies the flag to check. - * This parameter can be any combination of the following values: - * @arg @ref USART_CLEAR_PEF Parity Error Clear Flag - * @arg @ref USART_CLEAR_FEF Framing Error Clear Flag - * @arg @ref USART_CLEAR_NEF Noise detected Clear Flag - * @arg @ref USART_CLEAR_OREF Overrun Error Clear Flag - * @arg @ref USART_CLEAR_IDLEF IDLE line detected Clear Flag - * @arg @ref USART_CLEAR_TXFECF TXFIFO empty clear Flag - * @arg @ref USART_CLEAR_TCF Transmission Complete Clear Flag - * @arg @ref USART_CLEAR_RTOF Receiver Timeout clear flag - * @arg @ref USART_CLEAR_UDRF SPI slave underrun error Clear Flag - * @retval None - */ -#define __HAL_USART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ICR = (__FLAG__)) - -/** @brief Clear the USART PE pending flag. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_CLEAR_PEFLAG(__HANDLE__) __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_PEF) - -/** @brief Clear the USART FE pending flag. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_CLEAR_FEFLAG(__HANDLE__) __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_FEF) - -/** @brief Clear the USART NE pending flag. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_CLEAR_NEFLAG(__HANDLE__) __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_NEF) - -/** @brief Clear the USART ORE pending flag. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_CLEAR_OREFLAG(__HANDLE__) __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_OREF) - -/** @brief Clear the USART IDLE pending flag. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_CLEAR_IDLEFLAG(__HANDLE__) __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_IDLEF) - -/** @brief Clear the USART TX FIFO empty clear flag. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_CLEAR_TXFECF(__HANDLE__) __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_TXFECF) - -/** @brief Clear SPI slave underrun error flag. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_CLEAR_UDRFLAG(__HANDLE__) __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_UDRF) - -/** @brief Enable the specified USART interrupt. - * @param __HANDLE__ specifies the USART Handle. - * @param __INTERRUPT__ specifies the USART interrupt source to enable. - * This parameter can be one of the following values: - * @arg @ref USART_IT_RXFF RXFIFO Full interrupt - * @arg @ref USART_IT_TXFE TXFIFO Empty interrupt - * @arg @ref USART_IT_RXFT RXFIFO threshold interrupt - * @arg @ref USART_IT_TXFT TXFIFO threshold interrupt - * @arg @ref USART_IT_TXE Transmit Data Register empty interrupt - * @arg @ref USART_IT_TXFNF TX FIFO not full interrupt - * @arg @ref USART_IT_TC Transmission complete interrupt - * @arg @ref USART_IT_RXNE Receive Data register not empty interrupt - * @arg @ref USART_IT_RXFNE RXFIFO not empty interrupt - * @arg @ref USART_IT_IDLE Idle line detection interrupt - * @arg @ref USART_IT_PE Parity Error interrupt - * @arg @ref USART_IT_ERR Error interrupt(Frame error, noise error, - * overrun error) - * @retval None - */ -#define __HAL_USART_ENABLE_IT(__HANDLE__, __INTERRUPT__) \ - (((((__INTERRUPT__) & USART_CR_MASK) >> USART_CR_POS) == 1U) ? ((__HANDLE__)->Instance->CR1 |= (1UL << ((__INTERRUPT__) & USART_IT_MASK))) \ - : ((((__INTERRUPT__) & USART_CR_MASK) >> USART_CR_POS) == 2U) ? ((__HANDLE__)->Instance->CR2 |= (1UL << ((__INTERRUPT__) & USART_IT_MASK))) \ - : ((__HANDLE__)->Instance->CR3 |= (1UL << ((__INTERRUPT__) & USART_IT_MASK)))) - -/** @brief Disable the specified USART interrupt. - * @param __HANDLE__ specifies the USART Handle. - * @param __INTERRUPT__ specifies the USART interrupt source to disable. - * This parameter can be one of the following values: - * @arg @ref USART_IT_RXFF RXFIFO Full interrupt - * @arg @ref USART_IT_TXFE TXFIFO Empty interrupt - * @arg @ref USART_IT_RXFT RXFIFO threshold interrupt - * @arg @ref USART_IT_TXFT TXFIFO threshold interrupt - * @arg @ref USART_IT_TXE Transmit Data Register empty interrupt - * @arg @ref USART_IT_TXFNF TX FIFO not full interrupt - * @arg @ref USART_IT_TC Transmission complete interrupt - * @arg @ref USART_IT_RXNE Receive Data register not empty interrupt - * @arg @ref USART_IT_RXFNE RXFIFO not empty interrupt - * @arg @ref USART_IT_IDLE Idle line detection interrupt - * @arg @ref USART_IT_PE Parity Error interrupt - * @arg @ref USART_IT_ERR Error interrupt(Frame error, noise error, - * overrun error) - * @retval None - */ -#define __HAL_USART_DISABLE_IT(__HANDLE__, __INTERRUPT__) \ - (((((__INTERRUPT__) & USART_CR_MASK) >> USART_CR_POS) == 1U) ? ((__HANDLE__)->Instance->CR1 &= ~(1UL << ((__INTERRUPT__) & USART_IT_MASK))) \ - : ((((__INTERRUPT__) & USART_CR_MASK) >> USART_CR_POS) == 2U) ? ((__HANDLE__)->Instance->CR2 &= ~(1UL << ((__INTERRUPT__) & USART_IT_MASK))) \ - : ((__HANDLE__)->Instance->CR3 &= ~(1UL << ((__INTERRUPT__) & USART_IT_MASK)))) - -/** @brief Check whether the specified USART interrupt has occurred or not. - * @param __HANDLE__ specifies the USART Handle. - * @param __INTERRUPT__ specifies the USART interrupt source to check. - * This parameter can be one of the following values: - * @arg @ref USART_IT_RXFF RXFIFO Full interrupt - * @arg @ref USART_IT_TXFE TXFIFO Empty interrupt - * @arg @ref USART_IT_RXFT RXFIFO threshold interrupt - * @arg @ref USART_IT_TXFT TXFIFO threshold interrupt - * @arg @ref USART_IT_TXE Transmit Data Register empty interrupt - * @arg @ref USART_IT_TXFNF TX FIFO not full interrupt - * @arg @ref USART_IT_TC Transmission complete interrupt - * @arg @ref USART_IT_RXNE Receive Data register not empty interrupt - * @arg @ref USART_IT_RXFNE RXFIFO not empty interrupt - * @arg @ref USART_IT_IDLE Idle line detection interrupt - * @arg @ref USART_IT_ORE OverRun Error interrupt - * @arg @ref USART_IT_NE Noise Error interrupt - * @arg @ref USART_IT_FE Framing Error interrupt - * @arg @ref USART_IT_PE Parity Error interrupt - * @retval The new state of __INTERRUPT__ (SET or RESET). - */ -#define __HAL_USART_GET_IT(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->ISR & (0x01U << (((__INTERRUPT__) & USART_ISR_MASK) >> USART_ISR_POS))) != 0U) ? SET : RESET) - -/** @brief Check whether the specified USART interrupt source is enabled or - * not. - * @param __HANDLE__ specifies the USART Handle. - * @param __INTERRUPT__ specifies the USART interrupt source to check. - * This parameter can be one of the following values: - * @arg @ref USART_IT_RXFF RXFIFO Full interrupt - * @arg @ref USART_IT_TXFE TXFIFO Empty interrupt - * @arg @ref USART_IT_RXFT RXFIFO threshold interrupt - * @arg @ref USART_IT_TXFT TXFIFO threshold interrupt - * @arg @ref USART_IT_TXE Transmit Data Register empty interrupt - * @arg @ref USART_IT_TXFNF TX FIFO not full interrupt - * @arg @ref USART_IT_TC Transmission complete interrupt - * @arg @ref USART_IT_RXNE Receive Data register not empty interrupt - * @arg @ref USART_IT_RXFNE RXFIFO not empty interrupt - * @arg @ref USART_IT_IDLE Idle line detection interrupt - * @arg @ref USART_IT_ORE OverRun Error interrupt - * @arg @ref USART_IT_NE Noise Error interrupt - * @arg @ref USART_IT_FE Framing Error interrupt - * @arg @ref USART_IT_PE Parity Error interrupt - * @retval The new state of __INTERRUPT__ (SET or RESET). - */ -#define __HAL_USART_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) \ - ((((((((uint8_t)(__INTERRUPT__)) >> 0x05U) == 0x01U) ? (__HANDLE__)->Instance->CR1 \ - : (((((uint8_t)(__INTERRUPT__)) >> 0x05U) == 0x02U) ? (__HANDLE__)->Instance->CR2 : (__HANDLE__)->Instance->CR3)) & \ - (0x01U << (((uint16_t)(__INTERRUPT__)) & USART_IT_MASK))) != 0U) \ - ? SET \ - : RESET) - -/** @brief Clear the specified USART ISR flag, in setting the proper ICR - * register flag. - * @param __HANDLE__ specifies the USART Handle. - * @param __IT_CLEAR__ specifies the interrupt clear register flag that needs - * to be set to clear the corresponding interrupt. This parameter can be one of - * the following values: - * @arg @ref USART_CLEAR_PEF Parity Error Clear Flag - * @arg @ref USART_CLEAR_FEF Framing Error Clear Flag - * @arg @ref USART_CLEAR_NEF Noise detected Clear Flag - * @arg @ref USART_CLEAR_OREF Overrun Error Clear Flag - * @arg @ref USART_CLEAR_IDLEF IDLE line detected Clear Flag - * @arg @ref USART_CLEAR_RTOF Receiver timeout clear flag - * @arg @ref USART_CLEAR_TXFECF TXFIFO empty clear Flag - * @arg @ref USART_CLEAR_TCF Transmission Complete Clear Flag - * @retval None - */ -#define __HAL_USART_CLEAR_IT(__HANDLE__, __IT_CLEAR__) ((__HANDLE__)->Instance->ICR = (uint32_t)(__IT_CLEAR__)) - -/** @brief Set a specific USART request flag. - * @param __HANDLE__ specifies the USART Handle. - * @param __REQ__ specifies the request flag to set. - * This parameter can be one of the following values: - * @arg @ref USART_RXDATA_FLUSH_REQUEST Receive Data flush Request - * @arg @ref USART_TXDATA_FLUSH_REQUEST Transmit data flush Request - * - * @retval None - */ -#define __HAL_USART_SEND_REQ(__HANDLE__, __REQ__) ((__HANDLE__)->Instance->RQR |= (uint16_t)(__REQ__)) - -/** @brief Enable the USART one bit sample method. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_ONE_BIT_SAMPLE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3 |= USART_CR3_ONEBIT) - -/** @brief Disable the USART one bit sample method. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_ONE_BIT_SAMPLE_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3 &= ~USART_CR3_ONEBIT) - -/** @brief Enable USART. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 |= USART_CR1_UE) - -/** @brief Disable USART. - * @param __HANDLE__ specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 &= ~USART_CR1_UE) - -/** - * @} - */ - -/* Private macros --------------------------------------------------------*/ -/** @defgroup USART_Private_Macros USART Private Macros - * @{ - */ - -/** @brief Get USART clock division factor from clock prescaler value. - * @param __CLOCKPRESCALER__ USART prescaler value. - * @retval USART clock division factor - */ -#define USART_GET_DIV_FACTOR(__CLOCKPRESCALER__) \ - (((__CLOCKPRESCALER__) == USART_PRESCALER_DIV1) ? 1U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV2) ? 2U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV4) ? 4U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV6) ? 6U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV8) ? 8U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV10) ? 10U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV12) ? 12U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV16) ? 16U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV32) ? 32U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV64) ? 64U \ - : ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV128) ? 128U \ - : 256U) - -/** @brief BRR division operation to set BRR register in 8-bit oversampling - * mode. - * @param __PCLK__ USART clock. - * @param __BAUD__ Baud rate set by the user. - * @param __CLOCKPRESCALER__ USART prescaler value. - * @retval Division result - */ -#define USART_DIV_SAMPLING8(__PCLK__, __BAUD__, __CLOCKPRESCALER__) (((((__PCLK__) / USART_GET_DIV_FACTOR(__CLOCKPRESCALER__)) * 2U) + ((__BAUD__) / 2U)) / (__BAUD__)) - -/** @brief Report the USART clock source. - * @param __HANDLE__ specifies the USART Handle. - * @param __CLOCKSOURCE__ output variable. - * @retval the USART clocking source, written in __CLOCKSOURCE__. - */ -#if defined(USART3) -#define USART_GETCLOCKSOURCE(__HANDLE__, __CLOCKSOURCE__) \ - do { \ - if ((__HANDLE__)->Instance == USART1) { \ - switch (__HAL_RCC_GET_USART1_SOURCE()) { \ - case RCC_USART1CLKSOURCE_PCLK2: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK2; \ - break; \ - case RCC_USART1CLKSOURCE_HSI: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ - break; \ - case RCC_USART1CLKSOURCE_SYSCLK: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ - break; \ - case RCC_USART1CLKSOURCE_LSE: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ - break; \ - default: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ - break; \ - } \ - } else if ((__HANDLE__)->Instance == USART2) { \ - switch (__HAL_RCC_GET_USART2_SOURCE()) { \ - case RCC_USART2CLKSOURCE_PCLK1: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ - break; \ - case RCC_USART2CLKSOURCE_HSI: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ - break; \ - case RCC_USART2CLKSOURCE_SYSCLK: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ - break; \ - case RCC_USART2CLKSOURCE_LSE: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ - break; \ - default: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ - break; \ - } \ - } else if ((__HANDLE__)->Instance == USART3) { \ - switch (__HAL_RCC_GET_USART3_SOURCE()) { \ - case RCC_USART3CLKSOURCE_PCLK1: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ - break; \ - case RCC_USART3CLKSOURCE_HSI: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ - break; \ - case RCC_USART3CLKSOURCE_SYSCLK: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ - break; \ - case RCC_USART3CLKSOURCE_LSE: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ - break; \ - default: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ - break; \ - } \ - } else { \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ - } \ - } while (0) -#else -#define USART_GETCLOCKSOURCE(__HANDLE__, __CLOCKSOURCE__) \ - do { \ - if ((__HANDLE__)->Instance == USART1) { \ - switch (__HAL_RCC_GET_USART1_SOURCE()) { \ - case RCC_USART1CLKSOURCE_PCLK2: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK2; \ - break; \ - case RCC_USART1CLKSOURCE_HSI: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ - break; \ - case RCC_USART1CLKSOURCE_SYSCLK: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ - break; \ - case RCC_USART1CLKSOURCE_LSE: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ - break; \ - default: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ - break; \ - } \ - } else if ((__HANDLE__)->Instance == USART2) { \ - switch (__HAL_RCC_GET_USART2_SOURCE()) { \ - case RCC_USART2CLKSOURCE_PCLK1: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ - break; \ - case RCC_USART2CLKSOURCE_HSI: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ - break; \ - case RCC_USART2CLKSOURCE_SYSCLK: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ - break; \ - case RCC_USART2CLKSOURCE_LSE: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ - break; \ - default: \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ - break; \ - } \ - } else { \ - (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ - } \ - } while (0) -#endif /* USART3 */ - -/** @brief Check USART Baud rate. - * @param __BAUDRATE__ Baudrate specified by the user. - * The maximum Baud Rate is derived from the maximum clock on G4 (i.e. - * 150 MHz) divided by the smallest oversampling used on the USART (i.e. 8) - * @retval SET (__BAUDRATE__ is valid) or RESET (__BAUDRATE__ is invalid) */ -#define IS_USART_BAUDRATE(__BAUDRATE__) ((__BAUDRATE__) <= 18750000U) - -/** - * @brief Ensure that USART frame number of stop bits is valid. - * @param __STOPBITS__ USART frame number of stop bits. - * @retval SET (__STOPBITS__ is valid) or RESET (__STOPBITS__ is invalid) - */ -#define IS_USART_STOPBITS(__STOPBITS__) \ - (((__STOPBITS__) == USART_STOPBITS_0_5) || ((__STOPBITS__) == USART_STOPBITS_1) || ((__STOPBITS__) == USART_STOPBITS_1_5) || ((__STOPBITS__) == USART_STOPBITS_2)) - -/** - * @brief Ensure that USART frame parity is valid. - * @param __PARITY__ USART frame parity. - * @retval SET (__PARITY__ is valid) or RESET (__PARITY__ is invalid) - */ -#define IS_USART_PARITY(__PARITY__) (((__PARITY__) == USART_PARITY_NONE) || ((__PARITY__) == USART_PARITY_EVEN) || ((__PARITY__) == USART_PARITY_ODD)) - -/** - * @brief Ensure that USART communication mode is valid. - * @param __MODE__ USART communication mode. - * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid) - */ -#define IS_USART_MODE(__MODE__) ((((__MODE__) & 0xFFFFFFF3U) == 0x00U) && ((__MODE__) != 0x00U)) - -/** - * @brief Ensure that USART clock state is valid. - * @param __CLOCK__ USART clock state. - * @retval SET (__CLOCK__ is valid) or RESET (__CLOCK__ is invalid) - */ -#define IS_USART_CLOCK(__CLOCK__) (((__CLOCK__) == USART_CLOCK_DISABLE) || ((__CLOCK__) == USART_CLOCK_ENABLE)) - -/** - * @brief Ensure that USART frame polarity is valid. - * @param __CPOL__ USART frame polarity. - * @retval SET (__CPOL__ is valid) or RESET (__CPOL__ is invalid) - */ -#define IS_USART_POLARITY(__CPOL__) (((__CPOL__) == USART_POLARITY_LOW) || ((__CPOL__) == USART_POLARITY_HIGH)) - -/** - * @brief Ensure that USART frame phase is valid. - * @param __CPHA__ USART frame phase. - * @retval SET (__CPHA__ is valid) or RESET (__CPHA__ is invalid) - */ -#define IS_USART_PHASE(__CPHA__) (((__CPHA__) == USART_PHASE_1EDGE) || ((__CPHA__) == USART_PHASE_2EDGE)) - -/** - * @brief Ensure that USART frame last bit clock pulse setting is valid. - * @param __LASTBIT__ USART frame last bit clock pulse setting. - * @retval SET (__LASTBIT__ is valid) or RESET (__LASTBIT__ is invalid) - */ -#define IS_USART_LASTBIT(__LASTBIT__) (((__LASTBIT__) == USART_LASTBIT_DISABLE) || ((__LASTBIT__) == USART_LASTBIT_ENABLE)) - -/** - * @brief Ensure that USART request parameter is valid. - * @param __PARAM__ USART request parameter. - * @retval SET (__PARAM__ is valid) or RESET (__PARAM__ is invalid) - */ -#define IS_USART_REQUEST_PARAMETER(__PARAM__) (((__PARAM__) == USART_RXDATA_FLUSH_REQUEST) || ((__PARAM__) == USART_TXDATA_FLUSH_REQUEST)) - -/** - * @brief Ensure that USART Prescaler is valid. - * @param __CLOCKPRESCALER__ USART Prescaler value. - * @retval SET (__CLOCKPRESCALER__ is valid) or RESET (__CLOCKPRESCALER__ is - * invalid) - */ -#define IS_USART_PRESCALER(__CLOCKPRESCALER__) \ - (((__CLOCKPRESCALER__) == USART_PRESCALER_DIV1) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV2) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV4) || \ - ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV6) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV8) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV10) || \ - ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV12) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV16) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV32) || \ - ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV64) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV128) || ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV256)) - -/** - * @} - */ - -/* Include USART HAL Extended module */ -#include "stm32g4xx_hal_usart_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup USART_Exported_Functions USART Exported Functions - * @{ - */ - -/** @addtogroup USART_Exported_Functions_Group1 Initialization and - * de-initialization functions - * @{ - */ - -/* Initialization and de-initialization functions ****************************/ -HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USART_DeInit(USART_HandleTypeDef *husart); -void HAL_USART_MspInit(USART_HandleTypeDef *husart); -void HAL_USART_MspDeInit(USART_HandleTypeDef *husart); - -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_USART_RegisterCallback(USART_HandleTypeDef *husart, HAL_USART_CallbackIDTypeDef CallbackID, pUSART_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_USART_UnRegisterCallback(USART_HandleTypeDef *husart, HAL_USART_CallbackIDTypeDef CallbackID); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @addtogroup USART_Exported_Functions_Group2 IO operation functions - * @{ - */ - -/* IO operation functions *****************************************************/ -HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_USART_Transmit_IT(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_Receive_IT(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_TransmitReceive_IT(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_Transmit_DMA(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_Receive_DMA(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_TransmitReceive_DMA(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_DMAPause(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USART_DMAResume(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USART_DMAStop(USART_HandleTypeDef *husart); -/* Transfer Abort functions */ -HAL_StatusTypeDef HAL_USART_Abort(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USART_Abort_IT(USART_HandleTypeDef *husart); - -void HAL_USART_IRQHandler(USART_HandleTypeDef *husart); -void HAL_USART_TxHalfCpltCallback(USART_HandleTypeDef *husart); -void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart); -void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart); -void HAL_USART_RxHalfCpltCallback(USART_HandleTypeDef *husart); -void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart); -void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart); -void HAL_USART_AbortCpltCallback(USART_HandleTypeDef *husart); - -/** - * @} - */ - -/** @addtogroup USART_Exported_Functions_Group4 Peripheral State and Error - * functions - * @{ - */ - -/* Peripheral State and Error functions ***************************************/ -HAL_USART_StateTypeDef HAL_USART_GetState(const USART_HandleTypeDef *husart); -uint32_t HAL_USART_GetError(const USART_HandleTypeDef *husart); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32G4xx_HAL_USART_H */ diff --git a/Onboarding/W3_G4SPI_Transmit/Core/Inc/stm32g4xx_hal_usart_ex.h b/Onboarding/W3_G4SPI_Transmit/Core/Inc/stm32g4xx_hal_usart_ex.h deleted file mode 100644 index cd32cc9fc..000000000 --- a/Onboarding/W3_G4SPI_Transmit/Core/Inc/stm32g4xx_hal_usart_ex.h +++ /dev/null @@ -1,258 +0,0 @@ -/** - ****************************************************************************** - * @file stm32g4xx_hal_usart_ex.h - * @author MCD Application Team - * @brief Header file of USART HAL Extended module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32G4xx_HAL_USART_EX_H -#define STM32G4xx_HAL_USART_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_hal_def.h" - -/** @addtogroup STM32G4xx_HAL_Driver - * @{ - */ - -/** @addtogroup USARTEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup USARTEx_Exported_Constants USARTEx Exported Constants - * @{ - */ - -/** @defgroup USARTEx_Word_Length USARTEx Word Length - * @{ - */ -#define USART_WORDLENGTH_7B (USART_CR1_M1) /*!< 7-bit long USART frame */ -#define USART_WORDLENGTH_8B (0x00000000U) /*!< 8-bit long USART frame */ -#define USART_WORDLENGTH_9B (USART_CR1_M0) /*!< 9-bit long USART frame */ -/** - * @} - */ - -/** @defgroup USARTEx_Slave_Select_management USARTEx Slave Select Management - * @{ - */ -#define USART_NSS_HARD 0x00000000U /*!< SPI slave selection depends on NSS input pin */ -#define USART_NSS_SOFT \ - USART_CR2_DIS_NSS /*!< SPI slave is always selected and NSS input pin \ - is ignored */ -/** - * @} - */ - -/** @defgroup USARTEx_Slave_Mode USARTEx Synchronous Slave mode enable - * @brief USART SLAVE mode - * @{ - */ -#define USART_SLAVEMODE_DISABLE \ - 0x00000000U /*!< USART SPI Slave Mode Enable \ - */ -#define USART_SLAVEMODE_ENABLE USART_CR2_SLVEN /*!< USART SPI Slave Mode Disable */ -/** - * @} - */ - -/** @defgroup USARTEx_FIFO_mode USARTEx FIFO mode - * @brief USART FIFO mode - * @{ - */ -#define USART_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */ -#define USART_FIFOMODE_ENABLE USART_CR1_FIFOEN /*!< FIFO mode enable */ -/** - * @} - */ - -/** @defgroup USARTEx_TXFIFO_threshold_level USARTEx TXFIFO threshold level - * @brief USART TXFIFO level - * @{ - */ -#define USART_TXFIFO_THRESHOLD_1_8 0x00000000U /*!< TXFIFO reaches 1/8 of its depth */ -#define USART_TXFIFO_THRESHOLD_1_4 USART_CR3_TXFTCFG_0 /*!< TXFIFO reaches 1/4 of its depth */ -#define USART_TXFIFO_THRESHOLD_1_2 USART_CR3_TXFTCFG_1 /*!< TXFIFO reaches 1/2 of its depth */ -#define USART_TXFIFO_THRESHOLD_3_4 (USART_CR3_TXFTCFG_0 | USART_CR3_TXFTCFG_1) /*!< TXFIFO reaches 3/4 of its depth */ -#define USART_TXFIFO_THRESHOLD_7_8 USART_CR3_TXFTCFG_2 /*!< TXFIFO reaches 7/8 of its depth */ -#define USART_TXFIFO_THRESHOLD_8_8 (USART_CR3_TXFTCFG_2 | USART_CR3_TXFTCFG_0) /*!< TXFIFO becomes empty */ -/** - * @} - */ - -/** @defgroup USARTEx_RXFIFO_threshold_level USARTEx RXFIFO threshold level - * @brief USART RXFIFO level - * @{ - */ -#define USART_RXFIFO_THRESHOLD_1_8 0x00000000U /*!< RXFIFO FIFO reaches 1/8 of its depth */ -#define USART_RXFIFO_THRESHOLD_1_4 USART_CR3_RXFTCFG_0 /*!< RXFIFO FIFO reaches 1/4 of its depth */ -#define USART_RXFIFO_THRESHOLD_1_2 USART_CR3_RXFTCFG_1 /*!< RXFIFO FIFO reaches 1/2 of its depth */ -#define USART_RXFIFO_THRESHOLD_3_4 (USART_CR3_RXFTCFG_0 | USART_CR3_RXFTCFG_1) /*!< RXFIFO FIFO reaches 3/4 of its depth */ -#define USART_RXFIFO_THRESHOLD_7_8 USART_CR3_RXFTCFG_2 /*!< RXFIFO FIFO reaches 7/8 of its depth */ -#define USART_RXFIFO_THRESHOLD_8_8 (USART_CR3_RXFTCFG_2 | USART_CR3_RXFTCFG_0) /*!< RXFIFO FIFO becomes full */ -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup USARTEx_Private_Macros USARTEx Private Macros - * @{ - */ - -/** @brief Compute the USART mask to apply to retrieve the received data - * according to the word length and to the parity bits activation. - * @note If PCE = 1, the parity bit is not included in the data extracted - * by the reception API(). - * This masking operation is not carried out in the case of - * DMA transfers. - * @param __HANDLE__ specifies the USART Handle. - * @retval None, the mask to apply to USART RDR register is stored in - * (__HANDLE__)->Mask field. - */ -#define USART_MASK_COMPUTATION(__HANDLE__) \ - do { \ - if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_9B) { \ - if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) { \ - (__HANDLE__)->Mask = 0x01FFU; \ - } else { \ - (__HANDLE__)->Mask = 0x00FFU; \ - } \ - } else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_8B) { \ - if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) { \ - (__HANDLE__)->Mask = 0x00FFU; \ - } else { \ - (__HANDLE__)->Mask = 0x007FU; \ - } \ - } else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_7B) { \ - if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) { \ - (__HANDLE__)->Mask = 0x007FU; \ - } else { \ - (__HANDLE__)->Mask = 0x003FU; \ - } \ - } else { \ - (__HANDLE__)->Mask = 0x0000U; \ - } \ - } while (0U) - -/** - * @brief Ensure that USART frame length is valid. - * @param __LENGTH__ USART frame length. - * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid) - */ -#define IS_USART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == USART_WORDLENGTH_7B) || ((__LENGTH__) == USART_WORDLENGTH_8B) || ((__LENGTH__) == USART_WORDLENGTH_9B)) - -/** - * @brief Ensure that USART Negative Slave Select (NSS) pin management is valid. - * @param __NSS__ USART Negative Slave Select pin management. - * @retval SET (__NSS__ is valid) or RESET (__NSS__ is invalid) - */ -#define IS_USART_NSS(__NSS__) (((__NSS__) == USART_NSS_HARD) || ((__NSS__) == USART_NSS_SOFT)) - -/** - * @brief Ensure that USART Slave Mode is valid. - * @param __STATE__ USART Slave Mode. - * @retval SET (__STATE__ is valid) or RESET (__STATE__ is invalid) - */ -#define IS_USART_SLAVEMODE(__STATE__) (((__STATE__) == USART_SLAVEMODE_DISABLE) || ((__STATE__) == USART_SLAVEMODE_ENABLE)) - -/** - * @brief Ensure that USART FIFO mode is valid. - * @param __STATE__ USART FIFO mode. - * @retval SET (__STATE__ is valid) or RESET (__STATE__ is invalid) - */ -#define IS_USART_FIFO_MODE_STATE(__STATE__) (((__STATE__) == USART_FIFOMODE_DISABLE) || ((__STATE__) == USART_FIFOMODE_ENABLE)) - -/** - * @brief Ensure that USART TXFIFO threshold level is valid. - * @param __THRESHOLD__ USART TXFIFO threshold level. - * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid) - */ -#define IS_USART_TXFIFO_THRESHOLD(__THRESHOLD__) \ - (((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_1_8) || ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_1_4) || ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_1_2) || \ - ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_3_4) || ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_7_8) || ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_8_8)) - -/** - * @brief Ensure that USART RXFIFO threshold level is valid. - * @param __THRESHOLD__ USART RXFIFO threshold level. - * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid) - */ -#define IS_USART_RXFIFO_THRESHOLD(__THRESHOLD__) \ - (((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_1_8) || ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_1_4) || ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_1_2) || \ - ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_3_4) || ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_7_8) || ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_8_8)) -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup USARTEx_Exported_Functions - * @{ - */ - -/** @addtogroup USARTEx_Exported_Functions_Group1 - * @{ - */ - -/* IO operation functions *****************************************************/ -void HAL_USARTEx_RxFifoFullCallback(USART_HandleTypeDef *husart); -void HAL_USARTEx_TxFifoEmptyCallback(USART_HandleTypeDef *husart); - -/** - * @} - */ - -/** @addtogroup USARTEx_Exported_Functions_Group2 - * @{ - */ - -/* Peripheral Control functions ***********************************************/ -HAL_StatusTypeDef HAL_USARTEx_EnableSlaveMode(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USARTEx_DisableSlaveMode(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USARTEx_ConfigNSS(USART_HandleTypeDef *husart, uint32_t NSSConfig); -HAL_StatusTypeDef HAL_USARTEx_EnableFifoMode(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USARTEx_DisableFifoMode(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USARTEx_SetTxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold); -HAL_StatusTypeDef HAL_USARTEx_SetRxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32G4xx_HAL_USART_EX_H */ diff --git a/Onboarding/W3_G4SPI_Transmit/Core/Inc/stm32g4xx_it.h b/Onboarding/W3_G4SPI_Transmit/Core/Inc/stm32g4xx_it.h deleted file mode 100644 index 0e522cc62..000000000 --- a/Onboarding/W3_G4SPI_Transmit/Core/Inc/stm32g4xx_it.h +++ /dev/null @@ -1,66 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32g4xx_it.h - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * @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 */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32G4xx_IT_H -#define __STM32G4xx_IT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Private 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 */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void NMI_Handler(void); -void HardFault_Handler(void); -void MemManage_Handler(void); -void BusFault_Handler(void); -void UsageFault_Handler(void); -void SVC_Handler(void); -void DebugMon_Handler(void); -void PendSV_Handler(void); -void SysTick_Handler(void); -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32G4xx_IT_H */ diff --git a/Onboarding/W3_G4SPI_Transmit/Core/Src/main.c b/Onboarding/W3_G4SPI_Transmit/Core/Src/main.c deleted file mode 100644 index acc7751ee..000000000 --- a/Onboarding/W3_G4SPI_Transmit/Core/Src/main.c +++ /dev/null @@ -1,327 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.c - * @brief : Main program body - ****************************************************************************** - * @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" - -#include - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* 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 ---------------------------------------------------------*/ -SPI_HandleTypeDef hspi2; -USART_HandleTypeDef husart2; - -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -void SystemClock_Config(void); -static void MX_GPIO_Init(void); -static void MX_SPI2_Init(void); -static void MX_USART2_Init(void); - -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/** - * @brief The application entry point. - * @retval int - */ -int __io_putchar(int ch) -{ - HAL_USART_Transmit(&husart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY); - return ch; -} - -int main(void) -{ - - /* USER CODE BEGIN 1 */ - - /* USER CODE END 1 */ - - /* MCU - * Configuration--------------------------------------------------------*/ - - /* Reset of all peripherals, Initializes the Flash interface and the - * Systick. */ - HAL_Init(); - - /* 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_SPI2_Init(); - MX_USART2_Init(); - - /* USER CODE BEGIN 2 */ - - /* USER CODE END 2 */ - - /* Infinite loop */ - - /*PB12 ------> SPI2_NSS (Chip select) - PB13 ------> SPI2_SCK - PB14 ------> SPI2_MISO - PB15 ------> SPI2_MOSI*/ - - uint8_t TX_Buffer[] = {"hello"}; - // printf("%s\n",TX_Buffer); Don't uncomment this. - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, - GPIO_PIN_RESET); // Set the CS line to active low to - // enable the slave - while (1) { - /* USER CODE END WHILE */ - HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); - HAL_SPI_Transmit(&hspi2, TX_Buffer, sizeof(TX_Buffer), 1000); - HAL_Delay(1500); - /* USER CODE BEGIN 3 */ - } - /* USER CODE END 3 */ -} - -/** - * @brief System Clock Configuration - * @retval None - */ -void SystemClock_Config(void) -{ - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - - /** Configure the main internal regulator output voltage - */ - HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1); - - /** Initializes the RCC Oscillators according to the specified - * parameters in the RCC_OscInitTypeDef structure. - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; - RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { - Error_Handler(); - } - - /** Initializes the CPU, AHB and APB buses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { - Error_Handler(); - } -} - -/** - * @brief SPI2 Initialization Function - * @param None - * @retval None - */ -static void MX_SPI2_Init(void) -{ - - /* USER CODE BEGIN SPI2_Init 0 */ - - /* USER CODE END SPI2_Init 0 */ - - /* USER CODE BEGIN SPI2_Init 1 */ - - /* USER CODE END SPI2_Init 1 */ - /* SPI2 parameter configuration*/ - hspi2.Instance = SPI2; - hspi2.Init.Mode = SPI_MODE_MASTER; - hspi2.Init.Direction = SPI_DIRECTION_2LINES; - hspi2.Init.DataSize = SPI_DATASIZE_8BIT; - hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; - - hspi2.Init.NSS = SPI_NSS_SOFT; // If software, the master must manually - // set the CS line to Active Low - - hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; - hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi2.Init.TIMode = SPI_TIMODE_DISABLE; - hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi2.Init.CRCPolynomial = 7; - hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - hspi2.Init.NSSPMode = SPI_NSS_PULSE_DISABLED; - if (HAL_SPI_Init(&hspi2) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN SPI2_Init 2 */ - - /* USER CODE END SPI2_Init 2 */ -} - -static void MX_USART2_Init(void) -{ - - /* USER CODE BEGIN USART2_Init 0 */ - - /* USER CODE END USART2_Init 0 */ - - /* USER CODE BEGIN USART2_Init 1 */ - - /* USER CODE END USART2_Init 1 */ - husart2.Instance = USART2; - husart2.Init.BaudRate = 115200; - husart2.Init.WordLength = USART_WORDLENGTH_8B; - husart2.Init.StopBits = USART_STOPBITS_1; - husart2.Init.Parity = USART_PARITY_NONE; - husart2.Init.Mode = USART_MODE_TX_RX; - husart2.Init.CLKPolarity = USART_POLARITY_LOW; - husart2.Init.CLKPhase = USART_PHASE_1EDGE; - husart2.Init.CLKLastBit = USART_LASTBIT_DISABLE; - husart2.Init.ClockPrescaler = USART_PRESCALER_DIV1; - husart2.SlaveMode = USART_SLAVEMODE_ENABLE; - if (HAL_USART_Init(&husart2) != HAL_OK) { - Error_Handler(); - } - if (HAL_USARTEx_SetTxFifoThreshold(&husart2, USART_TXFIFO_THRESHOLD_1_8) != HAL_OK) { - Error_Handler(); - } - if (HAL_USARTEx_SetRxFifoThreshold(&husart2, USART_RXFIFO_THRESHOLD_1_8) != HAL_OK) { - Error_Handler(); - } - if (HAL_USARTEx_DisableFifoMode(&husart2) != HAL_OK) { - Error_Handler(); - } - if (HAL_USARTEx_EnableSlaveMode(&husart2) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN USART2_Init 2 */ - - /* USER CODE END USART2_Init 2 */ -} - -/** - * @brief GPIO Initialization Function - * @param None - * @retval None - */ -static void MX_GPIO_Init(void) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - /* USER CODE BEGIN MX_GPIO_Init_1 */ - - /* USER CODE END MX_GPIO_Init_1 */ - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); - - /*Configure GPIO pin : PA5 */ - GPIO_InitStruct.Pin = GPIO_PIN_5; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /*Configure GPIO pin : PB12 */ - GPIO_InitStruct.Pin = GPIO_PIN_12; - 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 MX_GPIO_Init_2 */ - - /* USER CODE END MX_GPIO_Init_2 */ -} - -/* USER CODE BEGIN 4 */ - -/* 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) {} - /* 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/Onboarding/W3_G4SPI_Transmit/Core/Src/stm32g4xx_hal_msp.c b/Onboarding/W3_G4SPI_Transmit/Core/Src/stm32g4xx_hal_msp.c deleted file mode 100644 index 206e1901c..000000000 --- a/Onboarding/W3_G4SPI_Transmit/Core/Src/stm32g4xx_hal_msp.c +++ /dev/null @@ -1,216 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32g4xx_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 */ -/** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) -{ - - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - - __HAL_RCC_SYSCFG_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - - /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral - */ - HAL_PWREx_DisableUCPDDeadBattery(); - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/** - * @brief SPI MSP Initialization - * This function configures the hardware resources used in this example - * @param hspi: SPI handle pointer - * @retval None - */ -void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (hspi->Instance == SPI2) { - /* USER CODE BEGIN SPI2_MspInit 0 */ - - /* USER CODE END SPI2_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_SPI2_CLK_ENABLE(); - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**SPI2 GPIO Configuration - PB13 ------> SPI2_SCK - PB14 ------> SPI2_MISO - PB15 ------> SPI2_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI2_MspInit 1 */ - - /* USER CODE END SPI2_MspInit 1 */ - } -} - -/** - * @brief SPI MSP De-Initialization - * This function freeze the hardware resources used in this example - * @param hspi: SPI handle pointer - * @retval None - */ -void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) -{ - if (hspi->Instance == SPI2) { - /* USER CODE BEGIN SPI2_MspDeInit 0 */ - - /* USER CODE END SPI2_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI2_CLK_DISABLE(); - - /**SPI2 GPIO Configuration - PB13 ------> SPI2_SCK - PB14 ------> SPI2_MISO - PB15 ------> SPI2_MOSI - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15); - - /* USER CODE BEGIN SPI2_MspDeInit 1 */ - - /* USER CODE END SPI2_MspDeInit 1 */ - } -} - -void HAL_USART_MspInit(USART_HandleTypeDef *husart) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; - if (husart->Instance == USART2) { - /* USER CODE BEGIN USART2_MspInit 0 */ - - /* USER CODE END USART2_MspInit 0 */ - - /** Initializes the peripherals clocks - */ - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; - PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { - Error_Handler(); - } - - /* Peripheral clock enable */ - __HAL_RCC_USART2_CLK_ENABLE(); - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**USART2 GPIO Configuration - PB3 ------> USART2_TX - PB4 ------> USART2_RX - PB5 ------> USART2_CK - */ - GPIO_InitStruct.Pin = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF7_USART2; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN USART2_MspInit 1 */ - - /* USER CODE END USART2_MspInit 1 */ - } -} - -/** - * @brief USART MSP De-Initialization - * This function freeze the hardware resources used in this example - * @param husart: USART handle pointer - * @retval None - */ -void HAL_USART_MspDeInit(USART_HandleTypeDef *husart) -{ - if (husart->Instance == USART2) { - /* USER CODE BEGIN USART2_MspDeInit 0 */ - - /* USER CODE END USART2_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_USART2_CLK_DISABLE(); - - /**USART2 GPIO Configuration - PB3 ------> USART2_TX - PB4 ------> USART2_RX - PB5 ------> USART2_CK - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5); - - /* USER CODE BEGIN USART2_MspDeInit 1 */ - - /* USER CODE END USART2_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/Onboarding/W3_G4SPI_Transmit/Core/Src/stm32g4xx_hal_usart.c b/Onboarding/W3_G4SPI_Transmit/Core/Src/stm32g4xx_hal_usart.c deleted file mode 100644 index 9951f7d92..000000000 --- a/Onboarding/W3_G4SPI_Transmit/Core/Src/stm32g4xx_hal_usart.c +++ /dev/null @@ -1,3508 +0,0 @@ -/** - ****************************************************************************** - * @file stm32g4xx_hal_usart.c - * @author MCD Application Team - * @brief USART HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Universal Synchronous/Asynchronous Receiver - Transmitter - * Peripheral (USART). - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State and Error functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - @verbatim - =============================================================================== - ##### How to use this driver ##### - =============================================================================== - [..] - The USART HAL driver can be used as follows: - - (#) Declare a USART_HandleTypeDef handle structure (eg. - USART_HandleTypeDef husart). - (#) Initialize the USART low level resources by implementing the - HAL_USART_MspInit() API: - (++) Enable the USARTx interface clock. - (++) USART pins configuration: - (+++) Enable the clock for the USART GPIOs. - (+++) Configure these USART pins as alternate function pull-up. - (++) NVIC configuration if you need to use interrupt process - (HAL_USART_Transmit_IT(), HAL_USART_Receive_IT() and - HAL_USART_TransmitReceive_IT() APIs): - (+++) Configure the USARTx interrupt priority. - (+++) Enable the NVIC USART IRQ handle. - (++) USART interrupts handling: - -@@- The specific USART interrupts (Transmission complete - interrupt, RXNE interrupt and Error Interrupts) will be managed using the - macros - __HAL_USART_ENABLE_IT() and __HAL_USART_DISABLE_IT() inside - the transmit and receive process. - (++) DMA Configuration if you need to use DMA process - (HAL_USART_Transmit_DMA() HAL_USART_Receive_DMA() and - HAL_USART_TransmitReceive_DMA() APIs): - (+++) Declare a DMA handle structure for the Tx/Rx channel. - (+++) Enable the DMAx interface clock. - (+++) Configure the declared DMA handle structure with the required - Tx/Rx parameters. - (+++) Configure the DMA Tx/Rx channel. - (+++) Associate the initialized DMA handle to the USART DMA Tx/Rx - handle. - (+++) Configure the priority and enable the NVIC for the transfer - complete interrupt on the DMA Tx/Rx channel. - - (#) Program the Baud Rate, Word Length, Stop Bit, Parity, and Mode - (Receiver/Transmitter) in the husart handle Init structure. - - (#) Initialize the USART registers by calling the HAL_USART_Init() API: - (++) This API configures also the low level Hardware GPIO, CLOCK, - CORTEX...etc) by calling the customized HAL_USART_MspInit(&husart) API. - - [..] - (@) To configure and enable/disable the USART to wake up the MCU from stop - mode, resort to UART API's HAL_UARTEx_StopModeWakeUpSourceConfig(), - HAL_UARTEx_EnableStopMode() and HAL_UARTEx_DisableStopMode() in casting the - USART handle to UART type UART_HandleTypeDef. - - ##### Callback registration ##### - ================================== - - [..] - The compilation define USE_HAL_USART_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - - [..] - Use Function HAL_USART_RegisterCallback() to register a user callback. - Function HAL_USART_RegisterCallback() allows to register following - callbacks: - (+) TxHalfCpltCallback : Tx Half Complete Callback. - (+) TxCpltCallback : Tx Complete Callback. - (+) RxHalfCpltCallback : Rx Half Complete Callback. - (+) RxCpltCallback : Rx Complete Callback. - (+) TxRxCpltCallback : Tx Rx Complete Callback. - (+) ErrorCallback : Error Callback. - (+) AbortCpltCallback : Abort Complete Callback. - (+) RxFifoFullCallback : Rx Fifo Full Callback. - (+) TxFifoEmptyCallback : Tx Fifo Empty Callback. - (+) MspInitCallback : USART MspInit. - (+) MspDeInitCallback : USART MspDeInit. - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - - [..] - Use function HAL_USART_UnRegisterCallback() to reset a callback to the - default weak function. HAL_USART_UnRegisterCallback() takes as parameters the - HAL peripheral handle, and the Callback ID. This function allows to reset - following callbacks: - (+) TxHalfCpltCallback : Tx Half Complete Callback. - (+) TxCpltCallback : Tx Complete Callback. - (+) RxHalfCpltCallback : Rx Half Complete Callback. - (+) RxCpltCallback : Rx Complete Callback. - (+) TxRxCpltCallback : Tx Rx Complete Callback. - (+) ErrorCallback : Error Callback. - (+) AbortCpltCallback : Abort Complete Callback. - (+) RxFifoFullCallback : Rx Fifo Full Callback. - (+) TxFifoEmptyCallback : Tx Fifo Empty Callback. - (+) MspInitCallback : USART MspInit. - (+) MspDeInitCallback : USART MspDeInit. - - [..] - By default, after the HAL_USART_Init() and when the state is - HAL_USART_STATE_RESET all callbacks are set to the corresponding weak - functions: examples HAL_USART_TxCpltCallback(), HAL_USART_RxHalfCpltCallback(). - Exception done for MspInit and MspDeInit functions that are respectively - reset to the legacy weak functions in the HAL_USART_Init() - and HAL_USART_DeInit() only when these callbacks are null (not registered - beforehand). If not, MspInit or MspDeInit are not null, the HAL_USART_Init() - and HAL_USART_DeInit() keep and use the user MspInit/MspDeInit callbacks - (registered beforehand). - - [..] - Callbacks can be registered/unregistered in HAL_USART_STATE_READY state - only. Exception done MspInit/MspDeInit that can be registered/unregistered in - HAL_USART_STATE_READY or HAL_USART_STATE_RESET state, thus registered (user) - MspInit/DeInit callbacks can be used during the Init/DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using HAL_USART_RegisterCallback() before calling HAL_USART_DeInit() - or HAL_USART_Init() function. - - [..] - When The compilation define USE_HAL_USART_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registration feature is not available - and weak callbacks are used. - - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_hal.h" - -/** @addtogroup STM32G4xx_HAL_Driver - * @{ - */ - -/** @defgroup USART USART - * @brief HAL USART Synchronous SPI module driver - * @{ - */ - -#ifdef HAL_USART_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @defgroup USART_Private_Constants USART Private Constants - * @{ - */ -#define USART_DUMMY_DATA \ - ((uint16_t)0xFFFF) /*!< USART transmitted dummy data \ - */ -#define USART_TEACK_REACK_TIMEOUT 1000U /*!< USART TX or RX enable acknowledge time-out value */ -#define USART_CR1_FIELDS \ - ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8 | USART_CR1_FIFOEN)) /*!< USART CR1 fields of parameters set \ - by USART_SetConfig API */ - -#define USART_CR2_FIELDS \ - ((uint32_t)(USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_CLKEN | USART_CR2_LBCL | USART_CR2_STOP | USART_CR2_SLVEN | USART_CR2_DIS_NSS)) /*!< USART CR2 fields of parameters \ - set by USART_SetConfig API */ - -#define USART_CR3_FIELDS \ - ((uint32_t)(USART_CR3_TXFTCFG | USART_CR3_RXFTCFG)) /*!< USART or USART CR3 fields of \ - parameters set by USART_SetConfig \ - API */ - -#define USART_BRR_MIN 0x10U /* USART BRR minimum authorized value */ -#define USART_BRR_MAX 0xFFFFU /* USART BRR maximum authorized value */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup USART_Private_Functions - * @{ - */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) -void USART_InitCallbacksToDefault(USART_HandleTypeDef *husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -static void USART_EndTransfer(USART_HandleTypeDef *husart); -static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma); -static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma); -static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma); -static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma); -static void USART_DMAError(DMA_HandleTypeDef *hdma); -static void USART_DMAAbortOnError(DMA_HandleTypeDef *hdma); -static void USART_DMATxAbortCallback(DMA_HandleTypeDef *hdma); -static void USART_DMARxAbortCallback(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout); -static HAL_StatusTypeDef USART_SetConfig(USART_HandleTypeDef *husart); -static HAL_StatusTypeDef USART_CheckIdleState(USART_HandleTypeDef *husart); -static void USART_TxISR_8BIT(USART_HandleTypeDef *husart); -static void USART_TxISR_16BIT(USART_HandleTypeDef *husart); -static void USART_TxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart); -static void USART_TxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart); -static void USART_EndTransmit_IT(USART_HandleTypeDef *husart); -static void USART_RxISR_8BIT(USART_HandleTypeDef *husart); -static void USART_RxISR_16BIT(USART_HandleTypeDef *husart); -static void USART_RxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart); -static void USART_RxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart); - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup USART_Exported_Functions USART Exported Functions - * @{ - */ - -/** @defgroup USART_Exported_Functions_Group1 Initialization and -de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to initialize the USART - in synchronous SPI master/slave mode. - (+) For the synchronous SPI mode only these parameters can be configured: - (++) Baud Rate - (++) Word Length - (++) Stop Bit - (++) Parity: If the parity is enabled, then the MSB bit of the data -written in the data register is transmitted but is changed by the parity bit. - (++) USART polarity - (++) USART phase - (++) USART LastBit - (++) Receiver/transmitter modes - - [..] - The HAL_USART_Init() function follows the USART synchronous SPI -configuration procedure (details for the procedure are available in reference -manual). - -@endverbatim - - Depending on the frame length defined by the M1 and M0 bits (7-bit, - 8-bit or 9-bit), the possible USART formats are listed in the - following table. - - Table 1. USART frame format. - +-----------------------------------------------------------------------+ - | M1 bit | M0 bit | PCE bit | USART frame | - |---------|---------|-----------|---------------------------------------| - | 0 | 0 | 0 | | SB | 8 bit data | STB | | - |---------|---------|-----------|---------------------------------------| - | 0 | 0 | 1 | | SB | 7 bit data | PB | STB | | - |---------|---------|-----------|---------------------------------------| - | 0 | 1 | 0 | | SB | 9 bit data | STB | | - |---------|---------|-----------|---------------------------------------| - | 0 | 1 | 1 | | SB | 8 bit data | PB | STB | | - |---------|---------|-----------|---------------------------------------| - | 1 | 0 | 0 | | SB | 7 bit data | STB | | - |---------|---------|-----------|---------------------------------------| - | 1 | 0 | 1 | | SB | 6 bit data | PB | STB | | - +-----------------------------------------------------------------------+ - - * @{ - */ - -/** - * @brief Initialize the USART mode according to the specified - * parameters in the USART_InitTypeDef and initialize the associated - * handle. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *husart) -{ - /* Check the USART handle allocation */ - if (husart == NULL) { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_USART_INSTANCE(husart->Instance)); - - if (husart->State == HAL_USART_STATE_RESET) { - /* Allocate lock resource and initialize it */ - husart->Lock = HAL_UNLOCKED; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - USART_InitCallbacksToDefault(husart); - - if (husart->MspInitCallback == NULL) { - husart->MspInitCallback = HAL_USART_MspInit; - } - - /* Init the low level hardware */ - husart->MspInitCallback(husart); -#else - /* Init the low level hardware : GPIO, CLOCK */ - HAL_USART_MspInit(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - - husart->State = HAL_USART_STATE_BUSY; - - /* Disable the Peripheral */ - __HAL_USART_DISABLE(husart); - - /* Set the Usart Communication parameters */ - if (USART_SetConfig(husart) == HAL_ERROR) { - return HAL_ERROR; - } - - /* In Synchronous SPI mode, the following bits must be kept cleared: - - LINEN bit in the USART_CR2 register - - HDSEL, SCEN and IREN bits in the USART_CR3 register. - */ - husart->Instance->CR2 &= ~USART_CR2_LINEN; - husart->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN); - - /* Enable the Peripheral */ - __HAL_USART_ENABLE(husart); - - /* TEACK and/or REACK to check before moving husart->State to Ready */ - return (USART_CheckIdleState(husart)); -} - -/** - * @brief DeInitialize the USART peripheral. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_DeInit(USART_HandleTypeDef *husart) -{ - /* Check the USART handle allocation */ - if (husart == NULL) { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_USART_INSTANCE(husart->Instance)); - - husart->State = HAL_USART_STATE_BUSY; - - husart->Instance->CR1 = 0x0U; - husart->Instance->CR2 = 0x0U; - husart->Instance->CR3 = 0x0U; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - if (husart->MspDeInitCallback == NULL) { - husart->MspDeInitCallback = HAL_USART_MspDeInit; - } - /* DeInit the low level hardware */ - husart->MspDeInitCallback(husart); -#else - /* DeInit the low level hardware */ - HAL_USART_MspDeInit(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_RESET; - - /* Process Unlock */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Initialize the USART MSP. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_MspInit(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USART_MspInit can be implemented in the user file - */ -} - -/** - * @brief DeInitialize the USART MSP. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_MspDeInit(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USART_MspDeInit can be implemented in the user file - */ -} - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User USART Callback - * To be used to override the weak predefined callback - * @note The HAL_USART_RegisterCallback() may be called before -HAL_USART_Init() in HAL_USART_STATE_RESET - * to register callbacks for HAL_USART_MSPINIT_CB_ID and -HAL_USART_MSPDEINIT_CB_ID - * @param husart usart handle - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_USART_TX_HALFCOMPLETE_CB_ID Tx Half Complete -Callback ID - * @arg @ref HAL_USART_TX_COMPLETE_CB_ID Tx Complete Callback ID - * @arg @ref HAL_USART_RX_HALFCOMPLETE_CB_ID Rx Half Complete -Callback ID - * @arg @ref HAL_USART_RX_COMPLETE_CB_ID Rx Complete Callback ID - * @arg @ref HAL_USART_TX_RX_COMPLETE_CB_ID Rx Complete Callback ID - * @arg @ref HAL_USART_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_USART_ABORT_COMPLETE_CB_ID Abort Complete Callback -ID - * @arg @ref HAL_USART_RX_FIFO_FULL_CB_ID Rx Fifo Full Callback ID - * @arg @ref HAL_USART_TX_FIFO_EMPTY_CB_ID Tx Fifo Empty Callback ID - * @arg @ref HAL_USART_MSPINIT_CB_ID MspInit Callback ID - * @arg @ref HAL_USART_MSPDEINIT_CB_ID MspDeInit Callback ID - * @param pCallback pointer to the Callback function - * @retval HAL status -+ */ -HAL_StatusTypeDef HAL_USART_RegisterCallback(USART_HandleTypeDef *husart, HAL_USART_CallbackIDTypeDef CallbackID, pUSART_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) { - /* Update the error code */ - husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - if (husart->State == HAL_USART_STATE_READY) { - switch (CallbackID) { - case HAL_USART_TX_HALFCOMPLETE_CB_ID: - husart->TxHalfCpltCallback = pCallback; - break; - - case HAL_USART_TX_COMPLETE_CB_ID: - husart->TxCpltCallback = pCallback; - break; - - case HAL_USART_RX_HALFCOMPLETE_CB_ID: - husart->RxHalfCpltCallback = pCallback; - break; - - case HAL_USART_RX_COMPLETE_CB_ID: - husart->RxCpltCallback = pCallback; - break; - - case HAL_USART_TX_RX_COMPLETE_CB_ID: - husart->TxRxCpltCallback = pCallback; - break; - - case HAL_USART_ERROR_CB_ID: - husart->ErrorCallback = pCallback; - break; - - case HAL_USART_ABORT_COMPLETE_CB_ID: - husart->AbortCpltCallback = pCallback; - break; - - case HAL_USART_RX_FIFO_FULL_CB_ID: - husart->RxFifoFullCallback = pCallback; - break; - - case HAL_USART_TX_FIFO_EMPTY_CB_ID: - husart->TxFifoEmptyCallback = pCallback; - break; - - case HAL_USART_MSPINIT_CB_ID: - husart->MspInitCallback = pCallback; - break; - - case HAL_USART_MSPDEINIT_CB_ID: - husart->MspDeInitCallback = pCallback; - break; - - default: - /* Update the error code */ - husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } else if (husart->State == HAL_USART_STATE_RESET) { - switch (CallbackID) { - case HAL_USART_MSPINIT_CB_ID: - husart->MspInitCallback = pCallback; - break; - - case HAL_USART_MSPDEINIT_CB_ID: - husart->MspDeInitCallback = pCallback; - break; - - default: - /* Update the error code */ - husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } else { - /* Update the error code */ - husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Unregister an USART Callback - * USART callaback is redirected to the weak predefined callback - * @note The HAL_USART_UnRegisterCallback() may be called before - * HAL_USART_Init() in HAL_USART_STATE_RESET to un-register callbacks for - * HAL_USART_MSPINIT_CB_ID and HAL_USART_MSPDEINIT_CB_ID - * @param husart usart handle - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_USART_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback - * ID - * @arg @ref HAL_USART_TX_COMPLETE_CB_ID Tx Complete Callback ID - * @arg @ref HAL_USART_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback - * ID - * @arg @ref HAL_USART_RX_COMPLETE_CB_ID Rx Complete Callback ID - * @arg @ref HAL_USART_TX_RX_COMPLETE_CB_ID Rx Complete Callback ID - * @arg @ref HAL_USART_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_USART_ABORT_COMPLETE_CB_ID Abort Complete Callback ID - * @arg @ref HAL_USART_RX_FIFO_FULL_CB_ID Rx Fifo Full Callback ID - * @arg @ref HAL_USART_TX_FIFO_EMPTY_CB_ID Tx Fifo Empty Callback ID - * @arg @ref HAL_USART_MSPINIT_CB_ID MspInit Callback ID - * @arg @ref HAL_USART_MSPDEINIT_CB_ID MspDeInit Callback ID - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_UnRegisterCallback(USART_HandleTypeDef *husart, HAL_USART_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (HAL_USART_STATE_READY == husart->State) { - switch (CallbackID) { - case HAL_USART_TX_HALFCOMPLETE_CB_ID: - husart->TxHalfCpltCallback = HAL_USART_TxHalfCpltCallback; /* Legacy weak - TxHalfCpltCallback - */ - break; - - case HAL_USART_TX_COMPLETE_CB_ID: - husart->TxCpltCallback = HAL_USART_TxCpltCallback; /* Legacy weak - TxCpltCallback - */ - break; - - case HAL_USART_RX_HALFCOMPLETE_CB_ID: - husart->RxHalfCpltCallback = HAL_USART_RxHalfCpltCallback; /* Legacy weak - RxHalfCpltCallback - */ - break; - - case HAL_USART_RX_COMPLETE_CB_ID: - husart->RxCpltCallback = HAL_USART_RxCpltCallback; /* Legacy weak - RxCpltCallback - */ - break; - - case HAL_USART_TX_RX_COMPLETE_CB_ID: - husart->TxRxCpltCallback = HAL_USART_TxRxCpltCallback; /* Legacy weak - TxRxCpltCallback - */ - break; - - case HAL_USART_ERROR_CB_ID: - husart->ErrorCallback = HAL_USART_ErrorCallback; /* Legacy weak - ErrorCallback */ - break; - - case HAL_USART_ABORT_COMPLETE_CB_ID: - husart->AbortCpltCallback = HAL_USART_AbortCpltCallback; /* Legacy weak - AbortCpltCallback - */ - break; - - case HAL_USART_RX_FIFO_FULL_CB_ID: - husart->RxFifoFullCallback = HAL_USARTEx_RxFifoFullCallback; /* Legacy - weak - RxFifoFullCallback - */ - break; - - case HAL_USART_TX_FIFO_EMPTY_CB_ID: - husart->TxFifoEmptyCallback = HAL_USARTEx_TxFifoEmptyCallback; /* Legacy - weak - TxFifoEmptyCallback - */ - break; - - case HAL_USART_MSPINIT_CB_ID: - husart->MspInitCallback = HAL_USART_MspInit; /* Legacy weak - MspInitCallback */ - break; - - case HAL_USART_MSPDEINIT_CB_ID: - husart->MspDeInitCallback = HAL_USART_MspDeInit; /* Legacy weak - MspDeInitCallback */ - break; - - default: - /* Update the error code */ - husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } else if (HAL_USART_STATE_RESET == husart->State) { - switch (CallbackID) { - case HAL_USART_MSPINIT_CB_ID: - husart->MspInitCallback = HAL_USART_MspInit; - break; - - case HAL_USART_MSPDEINIT_CB_ID: - husart->MspDeInitCallback = HAL_USART_MspDeInit; - break; - - default: - /* Update the error code */ - husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } else { - /* Update the error code */ - husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - return status; -} -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup USART_Exported_Functions_Group2 IO operation functions - * @brief USART Transmit and Receive functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to manage the -USART synchronous SPI data transfers. - - [..] The USART Synchronous SPI supports master and slave modes (SCLK as -output or input). - - [..] - - (#) There are two modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same -function after finishing transfer. - (++) No-Blocking mode: The communication is performed using Interrupts - or DMA, These API's return the HAL status. - The end of the data processing will be indicated through the - dedicated USART IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The HAL_USART_TxCpltCallback(), HAL_USART_RxCpltCallback() and -HAL_USART_TxRxCpltCallback() user callbacks will be executed respectively at the -end of the transmit or Receive process The HAL_USART_ErrorCallback()user -callback will be executed when a communication error is detected - - (#) Blocking mode API's are : - (++) HAL_USART_Transmit() in simplex mode - (++) HAL_USART_Receive() in full duplex receive only - (++) HAL_USART_TransmitReceive() in full duplex mode - - (#) Non-Blocking mode API's with Interrupt are : - (++) HAL_USART_Transmit_IT() in simplex mode - (++) HAL_USART_Receive_IT() in full duplex receive only - (++) HAL_USART_TransmitReceive_IT() in full duplex mode - (++) HAL_USART_IRQHandler() - - (#) No-Blocking mode API's with DMA are : - (++) HAL_USART_Transmit_DMA() in simplex mode - (++) HAL_USART_Receive_DMA() in full duplex receive only - (++) HAL_USART_TransmitReceive_DMA() in full duplex mode - (++) HAL_USART_DMAPause() - (++) HAL_USART_DMAResume() - (++) HAL_USART_DMAStop() - - (#) A set of Transfer Complete Callbacks are provided in Non_Blocking mode: - (++) HAL_USART_TxCpltCallback() - (++) HAL_USART_RxCpltCallback() - (++) HAL_USART_TxHalfCpltCallback() - (++) HAL_USART_RxHalfCpltCallback() - (++) HAL_USART_ErrorCallback() - (++) HAL_USART_TxRxCpltCallback() - - (#) Non-Blocking mode transfers could be aborted using Abort API's : - (++) HAL_USART_Abort() - (++) HAL_USART_Abort_IT() - - (#) For Abort services based on interrupts (HAL_USART_Abort_IT), a Abort -Complete Callbacks is provided: - (++) HAL_USART_AbortCpltCallback() - - (#) In Non-Blocking mode transfers, possible errors are split into 2 -categories. Errors are handled as follows : - (++) Error is considered as Recoverable and non blocking : Transfer -could go till end, but error severity is to be evaluated by user : this concerns -Frame Error, Parity Error or Noise Error in Interrupt mode reception . Received -character is then retrieved and stored in Rx buffer, Error code is set to allow -user to identify error type, and HAL_USART_ErrorCallback() user callback is -executed. Transfer is kept ongoing on USART side. If user wants to abort it, -Abort services should be called by user. - (++) Error is considered as Blocking : Transfer could not be completed -properly and is aborted. This concerns Overrun Error In Interrupt mode reception -and all errors in DMA mode. Error code is set to allow user to identify error -type, and HAL_USART_ErrorCallback() user callback is executed. - -@endverbatim - * @{ - */ - -/** - * @brief Simplex send an amount of data in blocking mode. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the sent data is handled as a set of u16. - * In this case, Size must indicate the number of u16 provided through pTxData. - * @param husart USART handle. - * @param pTxData Pointer to data buffer (u8 or u16 data elements). - * @param Size Amount of data elements (u8 or u16) to be sent. - * @param Timeout Timeout duration. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size, uint32_t Timeout) -{ - const uint8_t *ptxdata8bits; - const uint16_t *ptxdata16bits; - uint32_t tickstart; - - if (husart->State == HAL_USART_STATE_READY) { - if ((pTxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_TX; - - /* Init tickstart for timeout management */ - tickstart = HAL_GetTick(); - - husart->TxXferSize = Size; - husart->TxXferCount = Size; - - /* In case of 9bits/No Parity transfer, pTxData needs to be - * handled as a uint16_t pointer */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - ptxdata8bits = NULL; - ptxdata16bits = (const uint16_t *)pTxData; - } else { - ptxdata8bits = pTxData; - ptxdata16bits = NULL; - } - - /* Check the remaining data to be sent */ - while (husart->TxXferCount > 0U) { - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) { - return HAL_TIMEOUT; - } - if (ptxdata8bits == NULL) { - husart->Instance->TDR = (uint16_t)(*ptxdata16bits & 0x01FFU); - ptxdata16bits++; - } else { - husart->Instance->TDR = (uint8_t)(*ptxdata8bits & 0xFFU); - ptxdata8bits++; - } - - husart->TxXferCount--; - } - - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK) { - return HAL_TIMEOUT; - } - - /* Clear Transmission Complete Flag */ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF); - - /* Clear overrun flag and discard the received data */ - __HAL_USART_CLEAR_OREFLAG(husart); - __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - - /* At end of Tx process, restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; - } else { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in blocking mode. - * @note To receive synchronous data, dummy data are simultaneously - * transmitted. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the received data is handled as a set of - * u16. In this case, Size must indicate the number of u16 available through - * pRxData. - * @param husart USART handle. - * @param pRxData Pointer to data buffer (u8 or u16 data elements). - * @param Size Amount of data elements (u8 or u16) to be received. - * @param Timeout Timeout duration. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout) -{ - uint8_t *prxdata8bits; - uint16_t *prxdata16bits; - uint16_t uhMask; - uint32_t tickstart; - - if (husart->State == HAL_USART_STATE_READY) { - if ((pRxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_RX; - - /* Init tickstart for timeout management */ - tickstart = HAL_GetTick(); - - husart->RxXferSize = Size; - husart->RxXferCount = Size; - - /* Computation of USART mask to apply to RDR register */ - USART_MASK_COMPUTATION(husart); - uhMask = husart->Mask; - - /* In case of 9bits/No Parity transfer, pRxData needs to be - * handled as a uint16_t pointer */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - prxdata8bits = NULL; - prxdata16bits = (uint16_t *)pRxData; - } else { - prxdata8bits = pRxData; - prxdata16bits = NULL; - } - - /* as long as data have to be received */ - while (husart->RxXferCount > 0U) { - if (husart->SlaveMode == USART_SLAVEMODE_DISABLE) { - /* Wait until TXE flag is set to send dummy byte - * in order to generate the clock for the slave - * to send data. Whatever the frame length (7, 8 - * or 9-bit long), the same dummy value can be - * written for all the cases. */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) { - return HAL_TIMEOUT; - } - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x0FF); - } - - /* Wait for RXNE Flag */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) { - return HAL_TIMEOUT; - } - - if (prxdata8bits == NULL) { - *prxdata16bits = (uint16_t)(husart->Instance->RDR & uhMask); - prxdata16bits++; - } else { - *prxdata8bits = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU)); - prxdata8bits++; - } - - husart->RxXferCount--; - } - - /* Clear SPI slave underrun flag and discard transmit data */ - if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) { - __HAL_USART_CLEAR_UDRFLAG(husart); - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - } - - /* At end of Rx process, restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; - } else { - return HAL_BUSY; - } -} - -/** - * @brief Full-Duplex Send and Receive an amount of data in blocking mode. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the sent data and the received data are - * handled as sets of u16. In this case, Size must indicate the number of u16 - * available through pTxData and through pRxData. - * @param husart USART handle. - * @param pTxData pointer to TX data buffer (u8 or u16 data elements). - * @param pRxData pointer to RX data buffer (u8 or u16 data elements). - * @param Size amount of data elements (u8 or u16) to be sent (same amount to - * be received). - * @param Timeout Timeout duration. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout) -{ - uint8_t *prxdata8bits; - uint16_t *prxdata16bits; - const uint8_t *ptxdata8bits; - const uint16_t *ptxdata16bits; - uint16_t uhMask; - uint16_t rxdatacount; - uint32_t tickstart; - - if (husart->State == HAL_USART_STATE_READY) { - if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_RX; - - /* Init tickstart for timeout management */ - tickstart = HAL_GetTick(); - - husart->RxXferSize = Size; - husart->TxXferSize = Size; - husart->TxXferCount = Size; - husart->RxXferCount = Size; - - /* Computation of USART mask to apply to RDR register */ - USART_MASK_COMPUTATION(husart); - uhMask = husart->Mask; - - /* In case of 9bits/No Parity transfer, pRxData needs to be - * handled as a uint16_t pointer */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - prxdata8bits = NULL; - ptxdata8bits = NULL; - ptxdata16bits = (const uint16_t *)pTxData; - prxdata16bits = (uint16_t *)pRxData; - } else { - prxdata8bits = pRxData; - ptxdata8bits = pTxData; - ptxdata16bits = NULL; - prxdata16bits = NULL; - } - - if ((husart->TxXferCount == 0x01U) || (husart->SlaveMode == USART_SLAVEMODE_ENABLE)) { - /* Wait until TXE flag is set to send data */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) { - return HAL_TIMEOUT; - } - if (ptxdata8bits == NULL) { - husart->Instance->TDR = (uint16_t)(*ptxdata16bits & uhMask); - ptxdata16bits++; - } else { - husart->Instance->TDR = (uint8_t)(*ptxdata8bits & (uint8_t)(uhMask & 0xFFU)); - ptxdata8bits++; - } - - husart->TxXferCount--; - } - - /* Check the remain data to be sent */ - /* rxdatacount is a temporary variable for MISRAC2012-Rule-13.5 - */ - rxdatacount = husart->RxXferCount; - while ((husart->TxXferCount > 0U) || (rxdatacount > 0U)) { - if (husart->TxXferCount > 0U) { - /* Wait until TXE flag is set to send data */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) { - return HAL_TIMEOUT; - } - if (ptxdata8bits == NULL) { - husart->Instance->TDR = (uint16_t)(*ptxdata16bits & uhMask); - ptxdata16bits++; - } else { - husart->Instance->TDR = (uint8_t)(*ptxdata8bits & (uint8_t)(uhMask & 0xFFU)); - ptxdata8bits++; - } - - husart->TxXferCount--; - } - - if (husart->RxXferCount > 0U) { - /* Wait for RXNE Flag */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) { - return HAL_TIMEOUT; - } - - if (prxdata8bits == NULL) { - *prxdata16bits = (uint16_t)(husart->Instance->RDR & uhMask); - prxdata16bits++; - } else { - *prxdata8bits = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU)); - prxdata8bits++; - } - - husart->RxXferCount--; - } - rxdatacount = husart->RxXferCount; - } - - /* At end of TxRx process, restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; - } else { - return HAL_BUSY; - } -} - -/** - * @brief Send an amount of data in interrupt mode. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the sent data is handled as a set of u16. - * In this case, Size must indicate the number of u16 provided through pTxData. - * @param husart USART handle. - * @param pTxData pointer to data buffer (u8 or u16 data elements). - * @param Size amount of data elements (u8 or u16) to be sent. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Transmit_IT(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size) -{ - if (husart->State == HAL_USART_STATE_READY) { - if ((pTxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pTxBuffPtr = pTxData; - husart->TxXferSize = Size; - husart->TxXferCount = Size; - husart->TxISR = NULL; - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_TX; - - /* The USART Error Interrupts: (Frame error, noise error, - overrun error) are not managed by the USART Transmit Process to - avoid the overrun interrupt when the usart mode is configured - for transmit and receive "USART_MODE_TX_RX" to benefit for the - frame error and noise interrupts the usart mode should be - configured only for transmit "USART_MODE_TX" */ - - /* Configure Tx interrupt processing */ - if (husart->FifoMode == USART_FIFOMODE_ENABLE) { - /* Set the Tx ISR function pointer according to the data - * word length */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - husart->TxISR = USART_TxISR_16BIT_FIFOEN; - } else { - husart->TxISR = USART_TxISR_8BIT_FIFOEN; - } - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Enable the TX FIFO threshold interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TXFT); - } else { - /* Set the Tx ISR function pointer according to the data - * word length */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - husart->TxISR = USART_TxISR_16BIT; - } else { - husart->TxISR = USART_TxISR_8BIT; - } - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Enable the USART Transmit Data Register Empty - * Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TXE); - } - - return HAL_OK; - } else { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in interrupt mode. - * @note To receive synchronous data, dummy data are simultaneously - * transmitted. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the received data is handled as a set of - * u16. In this case, Size must indicate the number of u16 available through - * pRxData. - * @param husart USART handle. - * @param pRxData pointer to data buffer (u8 or u16 data elements). - * @param Size amount of data elements (u8 or u16) to be received. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Receive_IT(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size) -{ - uint16_t nb_dummy_data; - - if (husart->State == HAL_USART_STATE_READY) { - if ((pRxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pRxBuffPtr = pRxData; - husart->RxXferSize = Size; - husart->RxXferCount = Size; - husart->RxISR = NULL; - - USART_MASK_COMPUTATION(husart); - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_RX; - - /* Enable the USART Error Interrupt: (Frame error, noise error, - * overrun error) */ - SET_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Configure Rx interrupt processing */ - if ((husart->FifoMode == USART_FIFOMODE_ENABLE) && (Size >= husart->NbRxDataToProcess)) { - /* Set the Rx ISR function pointer according to the data - * word length */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - husart->RxISR = USART_RxISR_16BIT_FIFOEN; - } else { - husart->RxISR = USART_RxISR_8BIT_FIFOEN; - } - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Enable the USART Parity Error interrupt and RX FIFO - * Threshold interrupt */ - if (husart->Init.Parity != USART_PARITY_NONE) { - SET_BIT(husart->Instance->CR1, USART_CR1_PEIE); - } - SET_BIT(husart->Instance->CR3, USART_CR3_RXFTIE); - } else { - /* Set the Rx ISR function pointer according to the data - * word length */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - husart->RxISR = USART_RxISR_16BIT; - } else { - husart->RxISR = USART_RxISR_8BIT; - } - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Enable the USART Parity Error and Data Register not - * empty Interrupts */ - if (husart->Init.Parity != USART_PARITY_NONE) { - SET_BIT(husart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE); - } else { - SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); - } - } - - if (husart->SlaveMode == USART_SLAVEMODE_DISABLE) { - /* Send dummy data in order to generate the clock for - the Slave to send the next data. When FIFO mode is - disabled only one data must be transferred. When FIFO - mode is enabled data must be transmitted until the RX - FIFO reaches its threshold. - */ - if ((husart->FifoMode == USART_FIFOMODE_ENABLE) && (Size >= husart->NbRxDataToProcess)) { - for (nb_dummy_data = husart->NbRxDataToProcess; nb_dummy_data > 0U; nb_dummy_data--) { - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } - } else { - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } - } - - return HAL_OK; - } else { - return HAL_BUSY; - } -} - -/** - * @brief Full-Duplex Send and Receive an amount of data in interrupt mode. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the sent data and the received data are - * handled as sets of u16. In this case, Size must indicate the number of u16 - * available through pTxData and through pRxData. - * @param husart USART handle. - * @param pTxData pointer to TX data buffer (u8 or u16 data elements). - * @param pRxData pointer to RX data buffer (u8 or u16 data elements). - * @param Size amount of data elements (u8 or u16) to be sent (same amount to - * be received). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_TransmitReceive_IT(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData, uint16_t Size) -{ - - if (husart->State == HAL_USART_STATE_READY) { - if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pRxBuffPtr = pRxData; - husart->RxXferSize = Size; - husart->RxXferCount = Size; - husart->pTxBuffPtr = pTxData; - husart->TxXferSize = Size; - husart->TxXferCount = Size; - - /* Computation of USART mask to apply to RDR register */ - USART_MASK_COMPUTATION(husart); - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_TX_RX; - - /* Configure TxRx interrupt processing */ - if ((husart->FifoMode == USART_FIFOMODE_ENABLE) && (Size >= husart->NbRxDataToProcess)) { - /* Set the Rx ISR function pointer according to the data - * word length */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - husart->TxISR = USART_TxISR_16BIT_FIFOEN; - husart->RxISR = USART_RxISR_16BIT_FIFOEN; - } else { - husart->TxISR = USART_TxISR_8BIT_FIFOEN; - husart->RxISR = USART_RxISR_8BIT_FIFOEN; - } - - /* Process Locked */ - __HAL_UNLOCK(husart); - - /* Enable the USART Error Interrupt: (Frame error, noise - * error, overrun error) */ - SET_BIT(husart->Instance->CR3, USART_CR3_EIE); - - if (husart->Init.Parity != USART_PARITY_NONE) { - /* Enable the USART Parity Error interrupt */ - SET_BIT(husart->Instance->CR1, USART_CR1_PEIE); - } - - /* Enable the TX and RX FIFO Threshold interrupts */ - SET_BIT(husart->Instance->CR3, (USART_CR3_TXFTIE | USART_CR3_RXFTIE)); - } else { - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) { - husart->TxISR = USART_TxISR_16BIT; - husart->RxISR = USART_RxISR_16BIT; - } else { - husart->TxISR = USART_TxISR_8BIT; - husart->RxISR = USART_RxISR_8BIT; - } - - /* Process Locked */ - __HAL_UNLOCK(husart); - - /* Enable the USART Error Interrupt: (Frame error, noise - * error, overrun error) */ - SET_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Enable the USART Parity Error and USART Data Register - * not empty Interrupts */ - if (husart->Init.Parity != USART_PARITY_NONE) { - SET_BIT(husart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE); - } else { - SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); - } - - /* Enable the USART Transmit Data Register Empty - * Interrupt */ - SET_BIT(husart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE); - } - - return HAL_OK; - } else { - return HAL_BUSY; - } -} - -/** - * @brief Send an amount of data in DMA mode. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the sent data is handled as a set of u16. - * In this case, Size must indicate the number of u16 provided through pTxData. - * @param husart USART handle. - * @param pTxData pointer to data buffer (u8 or u16 data elements). - * @param Size amount of data elements (u8 or u16) to be sent. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Transmit_DMA(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size) -{ - HAL_StatusTypeDef status = HAL_OK; - const uint32_t *tmp; - - if (husart->State == HAL_USART_STATE_READY) { - if ((pTxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pTxBuffPtr = pTxData; - husart->TxXferSize = Size; - husart->TxXferCount = Size; - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_TX; - - if (husart->hdmatx != NULL) { - /* Set the USART DMA transfer complete callback */ - husart->hdmatx->XferCpltCallback = USART_DMATransmitCplt; - - /* Set the USART DMA Half transfer complete callback */ - husart->hdmatx->XferHalfCpltCallback = USART_DMATxHalfCplt; - - /* Set the DMA error callback */ - husart->hdmatx->XferErrorCallback = USART_DMAError; - - /* Enable the USART transmit DMA channel */ - tmp = (const uint32_t *)&pTxData; - status = HAL_DMA_Start_IT(husart->hdmatx, *(const uint32_t *)tmp, (uint32_t)&husart->Instance->TDR, Size); - } - - if (status == HAL_OK) { - /* Clear the TC flag in the ICR register */ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF); - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Enable the DMA transfer for transmit request by - setting the DMAT bit in the USART CR3 register */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAT); - - return HAL_OK; - } else { - /* Set error code to DMA */ - husart->ErrorCode = HAL_USART_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Restore husart->State to ready */ - husart->State = HAL_USART_STATE_READY; - - return HAL_ERROR; - } - } else { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in DMA mode. - * @note When the USART parity is enabled (PCE = 1), the received data contain - * the parity bit (MSB position). - * @note The USART DMA transmit channel must be configured in order to - * generate the clock for the slave. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the received data is handled as a set of - * u16. In this case, Size must indicate the number of u16 available through - * pRxData. - * @param husart USART handle. - * @param pRxData pointer to data buffer (u8 or u16 data elements). - * @param Size amount of data elements (u8 or u16) to be received. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Receive_DMA(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t *tmp = (uint32_t *)&pRxData; - - /* Check that a Rx process is not already ongoing */ - if (husart->State == HAL_USART_STATE_READY) { - if ((pRxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pRxBuffPtr = pRxData; - husart->RxXferSize = Size; - husart->pTxBuffPtr = pRxData; - husart->TxXferSize = Size; - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_RX; - - if (husart->hdmarx != NULL) { - /* Set the USART DMA Rx transfer complete callback */ - husart->hdmarx->XferCpltCallback = USART_DMAReceiveCplt; - - /* Set the USART DMA Half transfer complete callback */ - husart->hdmarx->XferHalfCpltCallback = USART_DMARxHalfCplt; - - /* Set the USART DMA Rx transfer error callback */ - husart->hdmarx->XferErrorCallback = USART_DMAError; - - /* Enable the USART receive DMA channel */ - status = HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->RDR, *(uint32_t *)tmp, Size); - } - - if ((status == HAL_OK) && (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) { - /* Enable the USART transmit DMA channel: the transmit - channel is used in order to generate in the - non-blocking mode the clock to the slave device, this - mode isn't a simplex receive mode but a full-duplex - receive mode */ - - /* Set the USART DMA Tx Complete and Error callback to - * Null */ - if (husart->hdmatx != NULL) { - husart->hdmatx->XferErrorCallback = NULL; - husart->hdmatx->XferHalfCpltCallback = NULL; - husart->hdmatx->XferCpltCallback = NULL; - status = HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t *)tmp, (uint32_t)&husart->Instance->TDR, Size); - } - } - - if (status == HAL_OK) { - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - if (husart->Init.Parity != USART_PARITY_NONE) { - /* Enable the USART Parity Error Interrupt */ - SET_BIT(husart->Instance->CR1, USART_CR1_PEIE); - } - - /* Enable the USART Error Interrupt: (Frame error, noise - * error, overrun error) */ - SET_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Enable the DMA transfer for the receiver request by - setting the DMAR bit in the USART CR3 register */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAR); - - /* Enable the DMA transfer for transmit request by - setting the DMAT bit in the USART CR3 register */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAT); - - return HAL_OK; - } else { - if (husart->hdmarx != NULL) { - status = HAL_DMA_Abort(husart->hdmarx); - } - - /* No need to check on error code */ - UNUSED(status); - - /* Set error code to DMA */ - husart->ErrorCode = HAL_USART_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Restore husart->State to ready */ - husart->State = HAL_USART_STATE_READY; - - return HAL_ERROR; - } - } else { - return HAL_BUSY; - } -} - -/** - * @brief Full-Duplex Transmit Receive an amount of data in non-blocking mode. - * @note When the USART parity is enabled (PCE = 1) the data received contain - * the parity bit. - * @note When USART parity is not enabled (PCE = 0), and Word Length is - * configured to 9 bits (M1-M0 = 01), the sent data and the received data are - * handled as sets of u16. In this case, Size must indicate the number of u16 - * available through pTxData and through pRxData. - * @param husart USART handle. - * @param pTxData pointer to TX data buffer (u8 or u16 data elements). - * @param pRxData pointer to RX data buffer (u8 or u16 data elements). - * @param Size amount of data elements (u8 or u16) to be received/sent. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_TransmitReceive_DMA(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData, uint16_t Size) -{ - HAL_StatusTypeDef status; - const uint32_t *tmp; - - if (husart->State == HAL_USART_STATE_READY) { - if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pRxBuffPtr = pRxData; - husart->RxXferSize = Size; - husart->pTxBuffPtr = pTxData; - husart->TxXferSize = Size; - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_TX_RX; - - if ((husart->hdmarx != NULL) && (husart->hdmatx != NULL)) { - /* Set the USART DMA Rx transfer complete callback */ - husart->hdmarx->XferCpltCallback = USART_DMAReceiveCplt; - - /* Set the USART DMA Half transfer complete callback */ - husart->hdmarx->XferHalfCpltCallback = USART_DMARxHalfCplt; - - /* Set the USART DMA Tx transfer complete callback */ - husart->hdmatx->XferCpltCallback = USART_DMATransmitCplt; - - /* Set the USART DMA Half transfer complete callback */ - husart->hdmatx->XferHalfCpltCallback = USART_DMATxHalfCplt; - - /* Set the USART DMA Tx transfer error callback */ - husart->hdmatx->XferErrorCallback = USART_DMAError; - - /* Set the USART DMA Rx transfer error callback */ - husart->hdmarx->XferErrorCallback = USART_DMAError; - - /* Enable the USART receive DMA channel */ - tmp = (uint32_t *)&pRxData; - status = HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->RDR, *(const uint32_t *)tmp, Size); - - /* Enable the USART transmit DMA channel */ - if (status == HAL_OK) { - tmp = (const uint32_t *)&pTxData; - status = HAL_DMA_Start_IT(husart->hdmatx, *(const uint32_t *)tmp, (uint32_t)&husart->Instance->TDR, Size); - } - } else { - status = HAL_ERROR; - } - - if (status == HAL_OK) { - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - if (husart->Init.Parity != USART_PARITY_NONE) { - /* Enable the USART Parity Error Interrupt */ - SET_BIT(husart->Instance->CR1, USART_CR1_PEIE); - } - - /* Enable the USART Error Interrupt: (Frame error, noise - * error, overrun error) */ - SET_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Clear the TC flag in the ICR register */ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF); - - /* Enable the DMA transfer for the receiver request by - setting the DMAR bit in the USART CR3 register */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAR); - - /* Enable the DMA transfer for transmit request by - setting the DMAT bit in the USART CR3 register */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAT); - - return HAL_OK; - } else { - if (husart->hdmarx != NULL) { - status = HAL_DMA_Abort(husart->hdmarx); - } - - /* No need to check on error code */ - UNUSED(status); - - /* Set error code to DMA */ - husart->ErrorCode = HAL_USART_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Restore husart->State to ready */ - husart->State = HAL_USART_STATE_READY; - - return HAL_ERROR; - } - } else { - return HAL_BUSY; - } -} - -/** - * @brief Pause the DMA Transfer. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_DMAPause(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - - /* Process Locked */ - __HAL_LOCK(husart); - - if ((HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) && (state == HAL_USART_STATE_BUSY_TX)) { - /* Disable the USART DMA Tx request */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); - } else if ((state == HAL_USART_STATE_BUSY_RX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) { - /* Disable the USART DMA Tx request */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); - } - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) { - /* Disable PE and ERR (Frame error, noise error, overrun - * error) interrupts */ - CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE); - CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Disable the USART DMA Rx request */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR); - } - } else { - /* Nothing to do */ - } - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Resume the DMA Transfer. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_DMAResume(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - - /* Process Locked */ - __HAL_LOCK(husart); - - if (state == HAL_USART_STATE_BUSY_TX) { - /* Enable the USART DMA Tx request */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAT); - } else if ((state == HAL_USART_STATE_BUSY_RX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - /* Clear the Overrun flag before resuming the Rx transfer*/ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF); - - /* Re-enable PE and ERR (Frame error, noise error, overrun - * error) interrupts */ - if (husart->Init.Parity != USART_PARITY_NONE) { - SET_BIT(husart->Instance->CR1, USART_CR1_PEIE); - } - SET_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Enable the USART DMA Rx request before the DMA Tx request */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAR); - - /* Enable the USART DMA Tx request */ - SET_BIT(husart->Instance->CR3, USART_CR3_DMAT); - } else { - /* Nothing to do */ - } - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Stop the DMA Transfer. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_DMAStop(USART_HandleTypeDef *husart) -{ - /* The Lock is not implemented on this API to allow the user application - to call the HAL USART API under callbacks HAL_USART_TxCpltCallback() - / HAL_USART_RxCpltCallback() / HAL_USART_TxHalfCpltCallback / - HAL_USART_RxHalfCpltCallback: indeed, when HAL_DMA_Abort() API is - called, the DMA TX/RX Transfer or Half Transfer complete interrupt is - generated if the DMA transfer interruption occurs at the middle or at - the end of the stream and the corresponding call back is executed. */ - - /* Disable the USART Tx/Rx DMA requests */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR); - - /* Abort the USART DMA tx channel */ - if (husart->hdmatx != NULL) { - if (HAL_DMA_Abort(husart->hdmatx) != HAL_OK) { - if (HAL_DMA_GetError(husart->hdmatx) == HAL_DMA_ERROR_TIMEOUT) { - /* Set error code to DMA */ - husart->ErrorCode = HAL_USART_ERROR_DMA; - - return HAL_TIMEOUT; - } - } - } - /* Abort the USART DMA rx channel */ - if (husart->hdmarx != NULL) { - if (HAL_DMA_Abort(husart->hdmarx) != HAL_OK) { - if (HAL_DMA_GetError(husart->hdmarx) == HAL_DMA_ERROR_TIMEOUT) { - /* Set error code to DMA */ - husart->ErrorCode = HAL_USART_ERROR_DMA; - - return HAL_TIMEOUT; - } - } - } - - USART_EndTransfer(husart); - husart->State = HAL_USART_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Abort ongoing transfers (blocking mode). - * @param husart USART handle. - * @note This procedure could be used for aborting any ongoing transfer - * started in Interrupt or DMA mode. This procedure performs following - * operations : - * - Disable USART Interrupts (Tx and Rx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer - * in DMA mode) - * - Set handle State to READY - * @note This procedure is executed in blocking mode : when exiting function, - * Abort is considered as completed. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Abort(USART_HandleTypeDef *husart) -{ - /* Disable TXEIE, TCIE, RXNE, RXFT, TXFT, PE and ERR (Frame error, noise - * error, overrun error) interrupts */ - CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE)); - CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE)); - - /* Abort the USART DMA Tx channel if enabled */ - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) { - /* Disable the USART DMA Tx request if enabled */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); - - /* Abort the USART DMA Tx channel : use blocking DMA Abort API - * (no callback) */ - if (husart->hdmatx != NULL) { - /* Set the USART DMA Abort callback to Null. - No call back execution at end of DMA abort procedure - */ - husart->hdmatx->XferAbortCallback = NULL; - - if (HAL_DMA_Abort(husart->hdmatx) != HAL_OK) { - if (HAL_DMA_GetError(husart->hdmatx) == HAL_DMA_ERROR_TIMEOUT) { - /* Set error code to DMA */ - husart->ErrorCode = HAL_USART_ERROR_DMA; - - return HAL_TIMEOUT; - } - } - } - } - - /* Abort the USART DMA Rx channel if enabled */ - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) { - /* Disable the USART DMA Rx request if enabled */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR); - - /* Abort the USART DMA Rx channel : use blocking DMA Abort API - * (no callback) */ - if (husart->hdmarx != NULL) { - /* Set the USART DMA Abort callback to Null. - No call back execution at end of DMA abort procedure - */ - husart->hdmarx->XferAbortCallback = NULL; - - if (HAL_DMA_Abort(husart->hdmarx) != HAL_OK) { - if (HAL_DMA_GetError(husart->hdmarx) == HAL_DMA_ERROR_TIMEOUT) { - /* Set error code to DMA */ - husart->ErrorCode = HAL_USART_ERROR_DMA; - - return HAL_TIMEOUT; - } - } - } - } - - /* Reset Tx and Rx transfer counters */ - husart->TxXferCount = 0U; - husart->RxXferCount = 0U; - - /* Clear the Error flags in the ICR register */ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF); - - /* Flush the whole TX FIFO (if needed) */ - if (husart->FifoMode == USART_FIFOMODE_ENABLE) { - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - } - - /* Discard the received data */ - __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); - - /* Restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - - /* Reset Handle ErrorCode to No Error */ - husart->ErrorCode = HAL_USART_ERROR_NONE; - - return HAL_OK; -} - -/** - * @brief Abort ongoing transfers (Interrupt mode). - * @param husart USART handle. - * @note This procedure could be used for aborting any ongoing transfer - * started in Interrupt or DMA mode. This procedure performs following - * operations : - * - Disable USART Interrupts (Tx and Rx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of - * transfer in DMA mode) - * - Set handle State to READY - * - At abort completion, call user abort complete callback - * @note This procedure is executed in Interrupt mode, meaning that abort - * procedure could be considered as completed only when user abort complete - * callback is executed (not when exiting function). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Abort_IT(USART_HandleTypeDef *husart) -{ - uint32_t abortcplt = 1U; - - /* Disable TXEIE, TCIE, RXNE, RXFT, TXFT, PE and ERR (Frame error, noise - * error, overrun error) interrupts */ - CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE)); - CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE)); - - /* If DMA Tx and/or DMA Rx Handles are associated to USART Handle, DMA - Abort complete callbacks should be initialised before any call to DMA - Abort functions */ - /* DMA Tx Handle is valid */ - if (husart->hdmatx != NULL) { - /* Set DMA Abort Complete callback if USART DMA Tx request if - enabled. Otherwise, set it to NULL */ - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) { - husart->hdmatx->XferAbortCallback = USART_DMATxAbortCallback; - } else { - husart->hdmatx->XferAbortCallback = NULL; - } - } - /* DMA Rx Handle is valid */ - if (husart->hdmarx != NULL) { - /* Set DMA Abort Complete callback if USART DMA Rx request if - enabled. Otherwise, set it to NULL */ - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) { - husart->hdmarx->XferAbortCallback = USART_DMARxAbortCallback; - } else { - husart->hdmarx->XferAbortCallback = NULL; - } - } - - /* Abort the USART DMA Tx channel if enabled */ - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) { - /* Disable DMA Tx at USART level */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); - - /* Abort the USART DMA Tx channel : use non blocking DMA Abort - * API (callback) */ - if (husart->hdmatx != NULL) { - /* USART Tx DMA Abort callback has already been - initialised : will lead to call - HAL_USART_AbortCpltCallback() at end of DMA abort - procedure */ - - /* Abort DMA TX */ - if (HAL_DMA_Abort_IT(husart->hdmatx) != HAL_OK) { - husart->hdmatx->XferAbortCallback = NULL; - } else { - abortcplt = 0U; - } - } - } - - /* Abort the USART DMA Rx channel if enabled */ - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) { - /* Disable the USART DMA Rx request if enabled */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR); - - /* Abort the USART DMA Rx channel : use non blocking DMA Abort - * API (callback) */ - if (husart->hdmarx != NULL) { - /* USART Rx DMA Abort callback has already been - initialised : will lead to call - HAL_USART_AbortCpltCallback() at end of DMA abort - procedure */ - - /* Abort DMA RX */ - if (HAL_DMA_Abort_IT(husart->hdmarx) != HAL_OK) { - husart->hdmarx->XferAbortCallback = NULL; - abortcplt = 1U; - } else { - abortcplt = 0U; - } - } - } - - /* if no DMA abort complete callback execution is required => call user - * Abort Complete callback */ - if (abortcplt == 1U) { - /* Reset Tx and Rx transfer counters */ - husart->TxXferCount = 0U; - husart->RxXferCount = 0U; - - /* Reset errorCode */ - husart->ErrorCode = HAL_USART_ERROR_NONE; - - /* Clear the Error flags in the ICR register */ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF); - - /* Flush the whole TX FIFO (if needed) */ - if (husart->FifoMode == USART_FIFOMODE_ENABLE) { - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - } - - /* Discard the received data */ - __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); - - /* Restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - - /* As no DMA to be aborted, call directly user Abort complete - * callback */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Abort Complete Callback */ - husart->AbortCpltCallback(husart); -#else - /* Call legacy weak Abort Complete Callback */ - HAL_USART_AbortCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - - return HAL_OK; -} - -/** - * @brief Handle USART interrupt request. - * @param husart USART handle. - * @retval None - */ -void HAL_USART_IRQHandler(USART_HandleTypeDef *husart) -{ - uint32_t isrflags = READ_REG(husart->Instance->ISR); - uint32_t cr1its = READ_REG(husart->Instance->CR1); - uint32_t cr3its = READ_REG(husart->Instance->CR3); - - uint32_t errorflags; - uint32_t errorcode; - - /* If no error occurs */ - errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF | USART_ISR_UDR)); - if (errorflags == 0U) { - /* USART in mode Receiver - * ---------------------------------------------------*/ - if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U) && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) || ((cr3its & USART_CR3_RXFTIE) != 0U))) { - if (husart->RxISR != NULL) { - husart->RxISR(husart); - } - return; - } - } - - /* If some errors occur */ - if ((errorflags != 0U) && (((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U) || ((cr1its & (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)) != 0U))) { - /* USART parity error interrupt occurred - * -------------------------------------*/ - if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U)) { - __HAL_USART_CLEAR_IT(husart, USART_CLEAR_PEF); - - husart->ErrorCode |= HAL_USART_ERROR_PE; - } - - /* USART frame error interrupt occurred - * --------------------------------------*/ - if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) { - __HAL_USART_CLEAR_IT(husart, USART_CLEAR_FEF); - - husart->ErrorCode |= HAL_USART_ERROR_FE; - } - - /* USART noise error interrupt occurred - * --------------------------------------*/ - if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) { - __HAL_USART_CLEAR_IT(husart, USART_CLEAR_NEF); - - husart->ErrorCode |= HAL_USART_ERROR_NE; - } - - /* USART Over-Run interrupt occurred - * -----------------------------------------*/ - if (((isrflags & USART_ISR_ORE) != 0U) && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) || ((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U))) { - __HAL_USART_CLEAR_IT(husart, USART_CLEAR_OREF); - - husart->ErrorCode |= HAL_USART_ERROR_ORE; - } - - /* USART Receiver Timeout interrupt occurred - * ---------------------------------*/ - if (((isrflags & USART_ISR_RTOF) != 0U) && ((cr1its & USART_CR1_RTOIE) != 0U)) { - __HAL_USART_CLEAR_IT(husart, USART_CLEAR_RTOF); - - husart->ErrorCode |= HAL_USART_ERROR_RTO; - } - - /* USART SPI slave underrun error interrupt occurred - * -------------------------*/ - if (((isrflags & USART_ISR_UDR) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) { - /* Ignore SPI slave underrun errors when reception is - * going on */ - if (husart->State == HAL_USART_STATE_BUSY_RX) { - __HAL_USART_CLEAR_UDRFLAG(husart); - return; - } else { - __HAL_USART_CLEAR_UDRFLAG(husart); - husart->ErrorCode |= HAL_USART_ERROR_UDR; - } - } - - /* Call USART Error Call back function if need be - * --------------------------*/ - if (husart->ErrorCode != HAL_USART_ERROR_NONE) { - /* USART in mode Receiver - * ---------------------------------------------------*/ - if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U) && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) || ((cr3its & USART_CR3_RXFTIE) != 0U))) { - if (husart->RxISR != NULL) { - husart->RxISR(husart); - } - } - - /* If Overrun error occurs, or if any error occurs in - DMA mode reception, consider error as blocking */ - errorcode = husart->ErrorCode & HAL_USART_ERROR_ORE; - if ((HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) || (errorcode != 0U)) { - /* Blocking error : transfer is aborted - Set the USART state ready to be able to start - again the process, Disable Interrupts, and - disable DMA requests, if ongoing */ - USART_EndTransfer(husart); - - /* Abort the USART DMA Rx channel if enabled */ - if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) { - /* Disable the USART DMA Rx request if - * enabled */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR | USART_CR3_DMAR); - - /* Abort the USART DMA Tx channel */ - if (husart->hdmatx != NULL) { - /* Set the USART Tx DMA Abort - callback to NULL : no - callback executed at end of - DMA abort procedure */ - husart->hdmatx->XferAbortCallback = NULL; - - /* Abort DMA TX */ - (void)HAL_DMA_Abort_IT(husart->hdmatx); - } - - /* Abort the USART DMA Rx channel */ - if (husart->hdmarx != NULL) { - /* Set the USART Rx DMA Abort - callback : will lead to call - HAL_USART_ErrorCallback() at - end of DMA abort procedure */ - husart->hdmarx->XferAbortCallback = USART_DMAAbortOnError; - - /* Abort DMA RX */ - if (HAL_DMA_Abort_IT(husart->hdmarx) != HAL_OK) { - /* Call Directly - * husart->hdmarx->XferAbortCallback - * function in case of - * error */ - husart->hdmarx->XferAbortCallback(husart->hdmarx); - } - } else { - /* Call user error callback */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Error - * Callback */ - husart->ErrorCallback(husart); -#else - /* Call legacy weak Error - * Callback */ - HAL_USART_ErrorCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - } else { - /* Call user error callback */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Error Callback */ - husart->ErrorCallback(husart); -#else - /* Call legacy weak Error Callback */ - HAL_USART_ErrorCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - } else { - /* Non Blocking error : transfer could go on. - Error is notified to user through user error - callback */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Error Callback */ - husart->ErrorCallback(husart); -#else - /* Call legacy weak Error Callback */ - HAL_USART_ErrorCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - husart->ErrorCode = HAL_USART_ERROR_NONE; - } - } - return; - - } /* End if some error occurs */ - - /* USART in mode Transmitter - * ------------------------------------------------*/ - if (((isrflags & USART_ISR_TXE_TXFNF) != 0U) && (((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U) || ((cr3its & USART_CR3_TXFTIE) != 0U))) { - if (husart->TxISR != NULL) { - husart->TxISR(husart); - } - return; - } - - /* USART in mode Transmitter (transmission end) - * -----------------------------*/ - if (((isrflags & USART_ISR_TC) != 0U) && ((cr1its & USART_CR1_TCIE) != 0U)) { - USART_EndTransmit_IT(husart); - return; - } - - /* USART TX Fifo Empty occurred - * ----------------------------------------------*/ - if (((isrflags & USART_ISR_TXFE) != 0U) && ((cr1its & USART_CR1_TXFEIE) != 0U)) { -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Fifo Empty Callback */ - husart->TxFifoEmptyCallback(husart); -#else - /* Call legacy weak Tx Fifo Empty Callback */ - HAL_USARTEx_TxFifoEmptyCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - return; - } - - /* USART RX Fifo Full occurred - * ----------------------------------------------*/ - if (((isrflags & USART_ISR_RXFF) != 0U) && ((cr1its & USART_CR1_RXFFIE) != 0U)) { -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Fifo Full Callback */ - husart->RxFifoFullCallback(husart); -#else - /* Call legacy weak Rx Fifo Full Callback */ - HAL_USARTEx_RxFifoFullCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - return; - } -} - -/** - * @brief Tx Transfer completed callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USART_TxCpltCallback can be implemented in the user - file. - */ -} - -/** - * @brief Tx Half Transfer completed callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_TxHalfCpltCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE: This function should not be modified, when the callback is - needed, the HAL_USART_TxHalfCpltCallback can be implemented in the - user file. - */ -} - -/** - * @brief Rx Transfer completed callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE: This function should not be modified, when the callback is - needed, the HAL_USART_RxCpltCallback can be implemented in the user - file. - */ -} - -/** - * @brief Rx Half Transfer completed callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_RxHalfCpltCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USART_RxHalfCpltCallback can be implemented in the - user file - */ -} - -/** - * @brief Tx/Rx Transfers completed callback for the non-blocking process. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USART_TxRxCpltCallback can be implemented in the user - file - */ -} - -/** - * @brief USART error callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USART_ErrorCallback can be implemented in the user - file. - */ -} - -/** - * @brief USART Abort Complete callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USART_AbortCpltCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USART_AbortCpltCallback can be implemented in the - user file. - */ -} - -/** - * @} - */ - -/** @defgroup USART_Exported_Functions_Group4 Peripheral State and Error -functions - * @brief USART Peripheral State and Error functions - * -@verbatim - ============================================================================== - ##### Peripheral State and Error functions ##### - ============================================================================== - [..] - This subsection provides functions allowing to : - (+) Return the USART handle state - (+) Return the USART handle error code - -@endverbatim - * @{ - */ - -/** - * @brief Return the USART handle state. - * @param husart pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART. - * @retval USART handle state - */ -HAL_USART_StateTypeDef HAL_USART_GetState(const USART_HandleTypeDef *husart) -{ - return husart->State; -} - -/** - * @brief Return the USART error code. - * @param husart pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART. - * @retval USART handle Error Code - */ -uint32_t HAL_USART_GetError(const USART_HandleTypeDef *husart) -{ - return husart->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup USART_Private_Functions USART Private Functions - * @{ - */ - -/** - * @brief Initialize the callbacks to their default values. - * @param husart USART handle. - * @retval none - */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) -void USART_InitCallbacksToDefault(USART_HandleTypeDef *husart) -{ - /* Init the USART Callback settings */ - husart->TxHalfCpltCallback = HAL_USART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ - husart->TxCpltCallback = HAL_USART_TxCpltCallback; /* Legacy weak TxCpltCallback */ - husart->RxHalfCpltCallback = HAL_USART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ - husart->RxCpltCallback = HAL_USART_RxCpltCallback; /* Legacy weak RxCpltCallback */ - husart->TxRxCpltCallback = HAL_USART_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */ - husart->ErrorCallback = HAL_USART_ErrorCallback; /* Legacy weak ErrorCallback */ - husart->AbortCpltCallback = HAL_USART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - husart->RxFifoFullCallback = HAL_USARTEx_RxFifoFullCallback; /* Legacy weak RxFifoFullCallback */ - husart->TxFifoEmptyCallback = HAL_USARTEx_TxFifoEmptyCallback; /* Legacy weak TxFifoEmptyCallback - */ -} -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - -/** - * @brief End ongoing transfer on USART peripheral (following error detection - * or Transfer completion). - * @param husart USART handle. - * @retval None - */ -static void USART_EndTransfer(USART_HandleTypeDef *husart) -{ - /* Disable TXEIE, TCIE, RXNE, RXFT, TXFT, PE and ERR (Frame error, noise - * error, overrun error) interrupts */ - CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE)); - CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE)); - - /* At end of process, restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; -} - -/** - * @brief DMA USART transmit process complete callback. - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - - /* DMA Normal mode */ - if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC)) { - husart->TxXferCount = 0U; - - if (husart->State == HAL_USART_STATE_BUSY_TX) { - /* Disable the DMA transfer for transmit request by - resetting the DMAT bit in the USART CR3 register */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); - - /* Enable the USART Transmit Complete Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TC); - } - } - /* DMA Circular mode */ - else { - if (husart->State == HAL_USART_STATE_BUSY_TX) { -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Complete Callback */ - husart->TxCpltCallback(husart); -#else - /* Call legacy weak Tx Complete Callback */ - HAL_USART_TxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - } -} - -/** - * @brief DMA USART transmit process half complete callback. - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Half Complete Callback */ - husart->TxHalfCpltCallback(husart); -#else - /* Call legacy weak Tx Half Complete Callback */ - HAL_USART_TxHalfCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA USART receive process complete callback. - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - - /* DMA Normal mode */ - if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC)) { - husart->RxXferCount = 0U; - - /* Disable PE and ERR (Frame error, noise error, overrun error) - * interrupts */ - CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE); - CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Disable the DMA RX transfer for the receiver request by - resetting the DMAR bit in USART CR3 register */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR); - /* similarly, disable the DMA TX transfer that was started to - provide the clock to the slave device */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); - - if (husart->State == HAL_USART_STATE_BUSY_RX) { -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Complete Callback */ - husart->RxCpltCallback(husart); -#else - /* Call legacy weak Rx Complete Callback */ - HAL_USART_RxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - /* The USART state is HAL_USART_STATE_BUSY_TX_RX */ - else { -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Rx Complete Callback */ - husart->TxRxCpltCallback(husart); -#else - /* Call legacy weak Tx Rx Complete Callback */ - HAL_USART_TxRxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - husart->State = HAL_USART_STATE_READY; - } - /* DMA circular mode */ - else { - if (husart->State == HAL_USART_STATE_BUSY_RX) { -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Complete Callback */ - husart->RxCpltCallback(husart); -#else - /* Call legacy weak Rx Complete Callback */ - HAL_USART_RxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - /* The USART state is HAL_USART_STATE_BUSY_TX_RX */ - else { -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Rx Complete Callback */ - husart->TxRxCpltCallback(husart); -#else - /* Call legacy weak Tx Rx Complete Callback */ - HAL_USART_TxRxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } - } -} - -/** - * @brief DMA USART receive process half complete callback. - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Half Complete Callback */ - husart->RxHalfCpltCallback(husart); -#else - /* Call legacy weak Rx Half Complete Callback */ - HAL_USART_RxHalfCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA USART communication error callback. - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMAError(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - - husart->RxXferCount = 0U; - husart->TxXferCount = 0U; - USART_EndTransfer(husart); - - husart->ErrorCode |= HAL_USART_ERROR_DMA; - husart->State = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Error Callback */ - husart->ErrorCallback(husart); -#else - /* Call legacy weak Error Callback */ - HAL_USART_ErrorCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA USART communication abort callback, when initiated by HAL - * services on Error (To be called at end of DMA Abort procedure following error - * occurrence). - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMAAbortOnError(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - husart->RxXferCount = 0U; - husart->TxXferCount = 0U; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Error Callback */ - husart->ErrorCallback(husart); -#else - /* Call legacy weak Error Callback */ - HAL_USART_ErrorCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA USART Tx communication abort callback, when initiated by user - * (To be called at end of DMA Tx Abort procedure following user abort - * request). - * @note When this callback is executed, User Abort complete call back is - * called only if no Abort still ongoing for Rx DMA Handle. - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMATxAbortCallback(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - - husart->hdmatx->XferAbortCallback = NULL; - - /* Check if an Abort process is still ongoing */ - if (husart->hdmarx != NULL) { - if (husart->hdmarx->XferAbortCallback != NULL) { - return; - } - } - - /* No Abort process still ongoing : All DMA channels are aborted, call - * user Abort Complete callback */ - husart->TxXferCount = 0U; - husart->RxXferCount = 0U; - - /* Reset errorCode */ - husart->ErrorCode = HAL_USART_ERROR_NONE; - - /* Clear the Error flags in the ICR register */ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF); - - /* Restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - - /* Call user Abort complete callback */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Abort Complete Callback */ - husart->AbortCpltCallback(husart); -#else - /* Call legacy weak Abort Complete Callback */ - HAL_USART_AbortCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA USART Rx communication abort callback, when initiated by user - * (To be called at end of DMA Rx Abort procedure following user abort - * request). - * @note When this callback is executed, User Abort complete call back is - * called only if no Abort still ongoing for Tx DMA Handle. - * @param hdma DMA handle. - * @retval None - */ -static void USART_DMARxAbortCallback(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); - - husart->hdmarx->XferAbortCallback = NULL; - - /* Check if an Abort process is still ongoing */ - if (husart->hdmatx != NULL) { - if (husart->hdmatx->XferAbortCallback != NULL) { - return; - } - } - - /* No Abort process still ongoing : All DMA channels are aborted, call - * user Abort Complete callback */ - husart->TxXferCount = 0U; - husart->RxXferCount = 0U; - - /* Reset errorCode */ - husart->ErrorCode = HAL_USART_ERROR_NONE; - - /* Clear the Error flags in the ICR register */ - __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF); - - /* Restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - - /* Call user Abort complete callback */ -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Abort Complete Callback */ - husart->AbortCpltCallback(husart); -#else - /* Call legacy weak Abort Complete Callback */ - HAL_USART_AbortCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ -} - -/** - * @brief Handle USART Communication Timeout. It waits - * until a flag is no longer in the specified status. - * @param husart USART handle. - * @param Flag Specifies the USART flag to check. - * @param Status the actual Flag status (SET or RESET). - * @param Tickstart Tick start value - * @param Timeout timeout duration. - * @retval HAL status - */ -static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout) -{ - /* Wait until flag is set */ - while ((__HAL_USART_GET_FLAG(husart, Flag) ? SET : RESET) == Status) { - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) { - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) { - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_TIMEOUT; - } - } - } - return HAL_OK; -} - -/** - * @brief Configure the USART peripheral. - * @param husart USART handle. - * @retval HAL status - */ -static HAL_StatusTypeDef USART_SetConfig(USART_HandleTypeDef *husart) -{ - uint32_t tmpreg; - USART_ClockSourceTypeDef clocksource; - HAL_StatusTypeDef ret = HAL_OK; - uint16_t brrtemp; - uint32_t usartdiv = 0x00000000; - uint32_t pclk; - - /* Check the parameters */ - assert_param(IS_USART_POLARITY(husart->Init.CLKPolarity)); - assert_param(IS_USART_PHASE(husart->Init.CLKPhase)); - assert_param(IS_USART_LASTBIT(husart->Init.CLKLastBit)); - assert_param(IS_USART_BAUDRATE(husart->Init.BaudRate)); - assert_param(IS_USART_WORD_LENGTH(husart->Init.WordLength)); - assert_param(IS_USART_STOPBITS(husart->Init.StopBits)); - assert_param(IS_USART_PARITY(husart->Init.Parity)); - assert_param(IS_USART_MODE(husart->Init.Mode)); - assert_param(IS_USART_PRESCALER(husart->Init.ClockPrescaler)); - - /*-------------------------- USART CR1 Configuration - * -----------------------*/ - /* Clear M, PCE, PS, TE and RE bits and configure - * the USART Word Length, Parity and Mode: - * set the M bits according to husart->Init.WordLength value - * set PCE and PS bits according to husart->Init.Parity value - * set TE and RE bits according to husart->Init.Mode value - * force OVER8 to 1 to allow to reach the maximum speed (Fclock/8) */ - tmpreg = (uint32_t)husart->Init.WordLength | husart->Init.Parity | husart->Init.Mode | USART_CR1_OVER8; - MODIFY_REG(husart->Instance->CR1, USART_CR1_FIELDS, tmpreg); - - /*---------------------------- USART CR2 Configuration - * ---------------------*/ - /* Clear and configure the USART Clock, CPOL, CPHA, LBCL STOP and SLVEN - * bits: set CPOL bit according to husart->Init.CLKPolarity value set - * CPHA bit according to husart->Init.CLKPhase value set LBCL bit - * according to husart->Init.CLKLastBit value (used in USART Synchronous - * SPI master mode only) set STOP[13:12] bits according to - * husart->Init.StopBits value */ - tmpreg = (uint32_t)(USART_CLOCK_ENABLE); - tmpreg |= (uint32_t)husart->Init.CLKLastBit; - tmpreg |= ((uint32_t)husart->Init.CLKPolarity | (uint32_t)husart->Init.CLKPhase); - tmpreg |= (uint32_t)husart->Init.StopBits; - MODIFY_REG(husart->Instance->CR2, USART_CR2_FIELDS, tmpreg); - - /*-------------------------- USART PRESC Configuration - * -----------------------*/ - /* Configure - * - USART Clock Prescaler : set PRESCALER according to - * husart->Init.ClockPrescaler value */ - MODIFY_REG(husart->Instance->PRESC, USART_PRESC_PRESCALER, husart->Init.ClockPrescaler); - - /*-------------------------- USART BRR Configuration - * -----------------------*/ - /* BRR is filled-up according to OVER8 bit setting which is forced to 1 - */ - USART_GETCLOCKSOURCE(husart, clocksource); - - switch (clocksource) { - case USART_CLOCKSOURCE_PCLK1: - pclk = HAL_RCC_GetPCLK1Freq(); - usartdiv = (uint32_t)(USART_DIV_SAMPLING8(pclk, husart->Init.BaudRate, husart->Init.ClockPrescaler)); - break; - case USART_CLOCKSOURCE_PCLK2: - pclk = HAL_RCC_GetPCLK2Freq(); - usartdiv = (uint32_t)(USART_DIV_SAMPLING8(pclk, husart->Init.BaudRate, husart->Init.ClockPrescaler)); - break; - case USART_CLOCKSOURCE_HSI: - usartdiv = (uint32_t)(USART_DIV_SAMPLING8(HSI_VALUE, husart->Init.BaudRate, husart->Init.ClockPrescaler)); - break; - case USART_CLOCKSOURCE_SYSCLK: - pclk = HAL_RCC_GetSysClockFreq(); - usartdiv = (uint32_t)(USART_DIV_SAMPLING8(pclk, husart->Init.BaudRate, husart->Init.ClockPrescaler)); - break; - case USART_CLOCKSOURCE_LSE: - usartdiv = (uint32_t)(USART_DIV_SAMPLING8(LSE_VALUE, husart->Init.BaudRate, husart->Init.ClockPrescaler)); - break; - default: - ret = HAL_ERROR; - break; - } - - /* USARTDIV must be greater than or equal to 0d16 and smaller than or - * equal to ffff */ - if ((usartdiv >= USART_BRR_MIN) && (usartdiv <= USART_BRR_MAX)) { - brrtemp = (uint16_t)(usartdiv & 0xFFF0U); - brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000FU) >> 1U); - husart->Instance->BRR = brrtemp; - } else { - ret = HAL_ERROR; - } - - /* Initialize the number of data to process during RX/TX ISR execution - */ - husart->NbTxDataToProcess = 1U; - husart->NbRxDataToProcess = 1U; - - /* Clear ISR function pointers */ - husart->RxISR = NULL; - husart->TxISR = NULL; - - return ret; -} - -/** - * @brief Check the USART Idle State. - * @param husart USART handle. - * @retval HAL status - */ -static HAL_StatusTypeDef USART_CheckIdleState(USART_HandleTypeDef *husart) -{ - uint32_t tickstart; - - /* Initialize the USART ErrorCode */ - husart->ErrorCode = HAL_USART_ERROR_NONE; - - /* Init tickstart for timeout management */ - tickstart = HAL_GetTick(); - - /* Check if the Transmitter is enabled */ - if ((husart->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE) { - /* Wait until TEACK flag is set */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_ISR_TEACK, RESET, tickstart, USART_TEACK_REACK_TIMEOUT) != HAL_OK) { - /* Timeout occurred */ - return HAL_TIMEOUT; - } - } - /* Check if the Receiver is enabled */ - if ((husart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE) { - /* Wait until REACK flag is set */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_ISR_REACK, RESET, tickstart, USART_TEACK_REACK_TIMEOUT) != HAL_OK) { - /* Timeout occurred */ - return HAL_TIMEOUT; - } - } - - /* Initialize the USART state*/ - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Simplex send an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Transmit_IT(). - * @note The USART errors are not managed to avoid the overrun error. - * @note ISR function executed when FIFO mode is disabled and when the - * data word length is less than 9 bits long. - * @param husart USART handle. - * @retval None - */ -static void USART_TxISR_8BIT(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - - /* Check that a Tx process is ongoing */ - if ((state == HAL_USART_STATE_BUSY_TX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - if (husart->TxXferCount == 0U) { - /* Disable the USART Transmit data register empty - * interrupt */ - __HAL_USART_DISABLE_IT(husart, USART_IT_TXE); - - /* Enable the USART Transmit Complete Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TC); - } else { - husart->Instance->TDR = (uint8_t)(*husart->pTxBuffPtr & (uint8_t)0xFF); - husart->pTxBuffPtr++; - husart->TxXferCount--; - } - } -} - -/** - * @brief Simplex send an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Transmit_IT(). - * @note The USART errors are not managed to avoid the overrun error. - * @note ISR function executed when FIFO mode is disabled and when the - * data word length is 9 bits long. - * @param husart USART handle. - * @retval None - */ -static void USART_TxISR_16BIT(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - const uint16_t *tmp; - - if ((state == HAL_USART_STATE_BUSY_TX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - if (husart->TxXferCount == 0U) { - /* Disable the USART Transmit data register empty - * interrupt */ - __HAL_USART_DISABLE_IT(husart, USART_IT_TXE); - - /* Enable the USART Transmit Complete Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TC); - } else { - tmp = (const uint16_t *)husart->pTxBuffPtr; - husart->Instance->TDR = (uint16_t)(*tmp & 0x01FFU); - husart->pTxBuffPtr += 2U; - husart->TxXferCount--; - } - } -} - -/** - * @brief Simplex send an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Transmit_IT(). - * @note The USART errors are not managed to avoid the overrun error. - * @note ISR function executed when FIFO mode is enabled and when the - * data word length is less than 9 bits long. - * @param husart USART handle. - * @retval None - */ -static void USART_TxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - uint16_t nb_tx_data; - - /* Check that a Tx process is ongoing */ - if ((state == HAL_USART_STATE_BUSY_TX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - for (nb_tx_data = husart->NbTxDataToProcess; nb_tx_data > 0U; nb_tx_data--) { - if (husart->TxXferCount == 0U) { - /* Disable the TX FIFO threshold interrupt */ - __HAL_USART_DISABLE_IT(husart, USART_IT_TXFT); - - /* Enable the USART Transmit Complete Interrupt - */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TC); - - break; /* force exit loop */ - } else if (__HAL_USART_GET_FLAG(husart, USART_FLAG_TXFNF) == SET) { - husart->Instance->TDR = (uint8_t)(*husart->pTxBuffPtr & (uint8_t)0xFF); - husart->pTxBuffPtr++; - husart->TxXferCount--; - } else { - /* Nothing to do */ - } - } - } -} - -/** - * @brief Simplex send an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Transmit_IT(). - * @note The USART errors are not managed to avoid the overrun error. - * @note ISR function executed when FIFO mode is enabled and when the - * data word length is 9 bits long. - * @param husart USART handle. - * @retval None - */ -static void USART_TxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - const uint16_t *tmp; - uint16_t nb_tx_data; - - /* Check that a Tx process is ongoing */ - if ((state == HAL_USART_STATE_BUSY_TX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - for (nb_tx_data = husart->NbTxDataToProcess; nb_tx_data > 0U; nb_tx_data--) { - if (husart->TxXferCount == 0U) { - /* Disable the TX FIFO threshold interrupt */ - __HAL_USART_DISABLE_IT(husart, USART_IT_TXFT); - - /* Enable the USART Transmit Complete Interrupt - */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TC); - - break; /* force exit loop */ - } else if (__HAL_USART_GET_FLAG(husart, USART_FLAG_TXFNF) == SET) { - tmp = (const uint16_t *)husart->pTxBuffPtr; - husart->Instance->TDR = (uint16_t)(*tmp & 0x01FFU); - husart->pTxBuffPtr += 2U; - husart->TxXferCount--; - } else { - /* Nothing to do */ - } - } - } -} - -/** - * @brief Wraps up transmission in non-blocking mode. - * @param husart Pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval None - */ -static void USART_EndTransmit_IT(USART_HandleTypeDef *husart) -{ - /* Disable the USART Transmit Complete Interrupt */ - __HAL_USART_DISABLE_IT(husart, USART_IT_TC); - - /* Disable the USART Error Interrupt: (Frame error, noise error, overrun - * error) */ - __HAL_USART_DISABLE_IT(husart, USART_IT_ERR); - - /* Clear TxISR function pointer */ - husart->TxISR = NULL; - - if (husart->State == HAL_USART_STATE_BUSY_TX) { - /* Clear overrun flag and discard the received data */ - __HAL_USART_CLEAR_OREFLAG(husart); - __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); - - /* Tx process is completed, restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Complete Callback */ - husart->TxCpltCallback(husart); -#else - /* Call legacy weak Tx Complete Callback */ - HAL_USART_TxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else if (husart->RxXferCount == 0U) { - /* TxRx process is completed, restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Rx Complete Callback */ - husart->TxRxCpltCallback(husart); -#else - /* Call legacy weak Tx Rx Complete Callback */ - HAL_USART_TxRxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else { - /* Nothing to do */ - } -} - -/** - * @brief Simplex receive an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Receive_IT(). - * @note ISR function executed when FIFO mode is disabled and when the - * data word length is less than 9 bits long. - * @param husart USART handle - * @retval None - */ -static void USART_RxISR_8BIT(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - uint16_t txdatacount; - uint16_t uhMask = husart->Mask; - uint32_t txftie; - - if ((state == HAL_USART_STATE_BUSY_RX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - *husart->pRxBuffPtr = (uint8_t)(husart->Instance->RDR & (uint8_t)uhMask); - husart->pRxBuffPtr++; - husart->RxXferCount--; - - if (husart->RxXferCount == 0U) { - /* Disable the USART Parity Error Interrupt and RXNE - * interrupt*/ - CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)); - - /* Disable the USART Error Interrupt: (Frame error, - * noise error, overrun error) */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Clear RxISR function pointer */ - husart->RxISR = NULL; - - /* txftie and txdatacount are temporary variables for - * MISRAC2012-Rule-13.5 */ - txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE); - txdatacount = husart->TxXferCount; - - if (state == HAL_USART_STATE_BUSY_RX) { - /* Clear SPI slave underrun flag and discard - * transmit data */ - if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) { - __HAL_USART_CLEAR_UDRFLAG(husart); - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - } - - /* Rx process is completed, restore - * husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Complete Callback */ - husart->RxCpltCallback(husart); -#else - /* Call legacy weak Rx Complete Callback */ - HAL_USART_RxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) && (txftie != USART_CR3_TXFTIE) && (txdatacount == 0U)) { - /* TxRx process is completed, restore - * husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Rx Complete Callback */ - husart->TxRxCpltCallback(husart); -#else - /* Call legacy weak Tx Rx Complete Callback */ - HAL_USART_TxRxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else { - /* Nothing to do */ - } - } else if ((state == HAL_USART_STATE_BUSY_RX) && (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) { - /* Send dummy byte in order to generate the clock for - * the Slave to Send the next data */ - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } else { - /* Nothing to do */ - } - } -} - -/** - * @brief Simplex receive an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Receive_IT(). - * @note ISR function executed when FIFO mode is disabled and when the - * data word length is 9 bits long. - * @param husart USART handle - * @retval None - */ -static void USART_RxISR_16BIT(USART_HandleTypeDef *husart) -{ - const HAL_USART_StateTypeDef state = husart->State; - uint16_t txdatacount; - uint16_t *tmp; - uint16_t uhMask = husart->Mask; - uint32_t txftie; - - if ((state == HAL_USART_STATE_BUSY_RX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - tmp = (uint16_t *)husart->pRxBuffPtr; - *tmp = (uint16_t)(husart->Instance->RDR & uhMask); - husart->pRxBuffPtr += 2U; - husart->RxXferCount--; - - if (husart->RxXferCount == 0U) { - /* Disable the USART Parity Error Interrupt and RXNE - * interrupt*/ - CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)); - - /* Disable the USART Error Interrupt: (Frame error, - * noise error, overrun error) */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE); - - /* Clear RxISR function pointer */ - husart->RxISR = NULL; - - /* txftie and txdatacount are temporary variables for - * MISRAC2012-Rule-13.5 */ - txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE); - txdatacount = husart->TxXferCount; - - if (state == HAL_USART_STATE_BUSY_RX) { - /* Clear SPI slave underrun flag and discard - * transmit data */ - if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) { - __HAL_USART_CLEAR_UDRFLAG(husart); - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - } - - /* Rx process is completed, restore - * husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Complete Callback */ - husart->RxCpltCallback(husart); -#else - /* Call legacy weak Rx Complete Callback */ - HAL_USART_RxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) && (txftie != USART_CR3_TXFTIE) && (txdatacount == 0U)) { - /* TxRx process is completed, restore - * husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Rx Complete Callback */ - husart->TxRxCpltCallback(husart); -#else - /* Call legacy weak Tx Rx Complete Callback */ - HAL_USART_TxRxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else { - /* Nothing to do */ - } - } else if ((state == HAL_USART_STATE_BUSY_RX) && (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) { - /* Send dummy byte in order to generate the clock for - * the Slave to Send the next data */ - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } else { - /* Nothing to do */ - } - } -} - -/** - * @brief Simplex receive an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Receive_IT(). - * @note ISR function executed when FIFO mode is enabled and when the - * data word length is less than 9 bits long. - * @param husart USART handle - * @retval None - */ -static void USART_RxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart) -{ - HAL_USART_StateTypeDef state = husart->State; - uint16_t txdatacount; - uint16_t rxdatacount; - uint16_t uhMask = husart->Mask; - uint16_t nb_rx_data; - uint32_t txftie; - - /* Check that a Rx process is ongoing */ - if ((state == HAL_USART_STATE_BUSY_RX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - for (nb_rx_data = husart->NbRxDataToProcess; nb_rx_data > 0U; nb_rx_data--) { - if (__HAL_USART_GET_FLAG(husart, USART_FLAG_RXFNE) == SET) { - *husart->pRxBuffPtr = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU)); - husart->pRxBuffPtr++; - husart->RxXferCount--; - - if (husart->RxXferCount == 0U) { - /* Disable the USART Parity Error - * Interrupt */ - CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE); - - /* Disable the USART Error Interrupt: - (Frame error, noise error, overrun - error) and RX FIFO Threshold - interrupt */ - CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE)); - - /* Clear RxISR function pointer */ - husart->RxISR = NULL; - - /* txftie and txdatacount are temporary - * variables for MISRAC2012-Rule-13.5 */ - txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE); - txdatacount = husart->TxXferCount; - - if (state == HAL_USART_STATE_BUSY_RX) { - /* Clear SPI slave underrun flag - * and discard transmit data */ - if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) { - __HAL_USART_CLEAR_UDRFLAG(husart); - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - } - - /* Rx process is completed, - * restore husart->State to - * Ready */ - husart->State = HAL_USART_STATE_READY; - state = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Complete - * Callback */ - husart->RxCpltCallback(husart); -#else - /* Call legacy weak Rx Complete - * Callback */ - HAL_USART_RxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) && (txftie != USART_CR3_TXFTIE) && (txdatacount == 0U)) { - /* TxRx process is completed, - * restore husart->State to - * Ready */ - husart->State = HAL_USART_STATE_READY; - state = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Rx - * Complete Callback */ - husart->TxRxCpltCallback(husart); -#else - /* Call legacy weak Tx Rx - * Complete Callback */ - HAL_USART_TxRxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else { - /* Nothing to do */ - } - } else if ((state == HAL_USART_STATE_BUSY_RX) && (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) { - /* Send dummy byte in order to generate - * the clock for the Slave to Send the - * next data */ - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } else { - /* Nothing to do */ - } - } - } - - /* When remaining number of bytes to receive is less than the RX - FIFO threshold, next incoming frames are processed as if FIFO - mode was disabled (i.e. one interrupt per received frame). - */ - rxdatacount = husart->RxXferCount; - if (((rxdatacount != 0U)) && (rxdatacount < husart->NbRxDataToProcess)) { - /* Disable the USART RXFT interrupt*/ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_RXFTIE); - - /* Update the RxISR function pointer */ - husart->RxISR = USART_RxISR_8BIT; - - /* Enable the USART Data Register Not Empty interrupt */ - SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); - - if ((husart->TxXferCount == 0U) && (state == HAL_USART_STATE_BUSY_TX_RX) && (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) { - /* Send dummy byte in order to generate the - * clock for the Slave to Send the next data */ - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } - } - } else { - /* Clear RXNE interrupt flag */ - __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); - } -} - -/** - * @brief Simplex receive an amount of data in non-blocking mode. - * @note Function called under interruption only, once - * interruptions have been enabled by HAL_USART_Receive_IT(). - * @note ISR function executed when FIFO mode is enabled and when the - * data word length is 9 bits long. - * @param husart USART handle - * @retval None - */ -static void USART_RxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart) -{ - HAL_USART_StateTypeDef state = husart->State; - uint16_t txdatacount; - uint16_t rxdatacount; - uint16_t *tmp; - uint16_t uhMask = husart->Mask; - uint16_t nb_rx_data; - uint32_t txftie; - - /* Check that a Tx process is ongoing */ - if ((state == HAL_USART_STATE_BUSY_RX) || (state == HAL_USART_STATE_BUSY_TX_RX)) { - for (nb_rx_data = husart->NbRxDataToProcess; nb_rx_data > 0U; nb_rx_data--) { - if (__HAL_USART_GET_FLAG(husart, USART_FLAG_RXFNE) == SET) { - tmp = (uint16_t *)husart->pRxBuffPtr; - *tmp = (uint16_t)(husart->Instance->RDR & uhMask); - husart->pRxBuffPtr += 2U; - husart->RxXferCount--; - - if (husart->RxXferCount == 0U) { - /* Disable the USART Parity Error - * Interrupt */ - CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE); - - /* Disable the USART Error Interrupt: - (Frame error, noise error, overrun - error) and RX FIFO Threshold - interrupt */ - CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE)); - - /* Clear RxISR function pointer */ - husart->RxISR = NULL; - - /* txftie and txdatacount are temporary - * variables for MISRAC2012-Rule-13.5 */ - txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE); - txdatacount = husart->TxXferCount; - - if (state == HAL_USART_STATE_BUSY_RX) { - /* Clear SPI slave underrun flag - * and discard transmit data */ - if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) { - __HAL_USART_CLEAR_UDRFLAG(husart); - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - } - - /* Rx process is completed, - * restore husart->State to - * Ready */ - husart->State = HAL_USART_STATE_READY; - state = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Rx Complete - * Callback */ - husart->RxCpltCallback(husart); -#else - /* Call legacy weak Rx Complete - * Callback */ - HAL_USART_RxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) && (txftie != USART_CR3_TXFTIE) && (txdatacount == 0U)) { - /* TxRx process is completed, - * restore husart->State to - * Ready */ - husart->State = HAL_USART_STATE_READY; - state = HAL_USART_STATE_READY; - -#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) - /* Call registered Tx Rx - * Complete Callback */ - husart->TxRxCpltCallback(husart); -#else - /* Call legacy weak Tx Rx - * Complete Callback */ - HAL_USART_TxRxCpltCallback(husart); -#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ - } else { - /* Nothing to do */ - } - } else if ((state == HAL_USART_STATE_BUSY_RX) && (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) { - /* Send dummy byte in order to generate - * the clock for the Slave to Send the - * next data */ - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } else { - /* Nothing to do */ - } - } - } - - /* When remaining number of bytes to receive is less than the RX - FIFO threshold, next incoming frames are processed as if FIFO - mode was disabled (i.e. one interrupt per received frame). - */ - rxdatacount = husart->RxXferCount; - if (((rxdatacount != 0U)) && (rxdatacount < husart->NbRxDataToProcess)) { - /* Disable the USART RXFT interrupt*/ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_RXFTIE); - - /* Update the RxISR function pointer */ - husart->RxISR = USART_RxISR_16BIT; - - /* Enable the USART Data Register Not Empty interrupt */ - SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); - - if ((husart->TxXferCount == 0U) && (state == HAL_USART_STATE_BUSY_TX_RX) && (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) { - /* Send dummy byte in order to generate the - * clock for the Slave to Send the next data */ - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); - } - } - } else { - /* Clear RXNE interrupt flag */ - __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); - } -} - -/** - * @} - */ - -#endif /* HAL_USART_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/Onboarding/W3_G4SPI_Transmit/Core/Src/stm32g4xx_hal_usart_ex.c b/Onboarding/W3_G4SPI_Transmit/Core/Src/stm32g4xx_hal_usart_ex.c deleted file mode 100644 index df556a120..000000000 --- a/Onboarding/W3_G4SPI_Transmit/Core/Src/stm32g4xx_hal_usart_ex.c +++ /dev/null @@ -1,538 +0,0 @@ -/** - ****************************************************************************** - * @file stm32g4xx_hal_usart_ex.c - * @author MCD Application Team - * @brief Extended USART HAL module driver. - * This file provides firmware functions to manage the following - extended - * functionalities of the Universal Synchronous Receiver Transmitter - Peripheral (USART). - * + Peripheral Control functions - * - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### USART peripheral extended features ##### - ============================================================================== - - (#) FIFO mode enabling/disabling and RX/TX FIFO threshold programming. - - -@- When USART operates in FIFO mode, FIFO mode must be enabled prior - starting RX/TX transfers. Also RX/TX FIFO thresholds must be - configured prior starting RX/TX transfers. - - (#) Slave mode enabling/disabling and NSS pin configuration. - - -@- When USART operates in Slave mode, Slave mode must be enabled prior - starting RX/TX transfers. - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_hal.h" - -/** @addtogroup STM32G4xx_HAL_Driver - * @{ - */ - -/** @defgroup USARTEx USARTEx - * @brief USART Extended HAL module driver - * @{ - */ - -#ifdef HAL_USART_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/** @defgroup USARTEx_Private_Constants USARTEx Private Constants - * @{ - */ -/* USART RX FIFO depth */ -#define RX_FIFO_DEPTH 8U - -/* USART TX FIFO depth */ -#define TX_FIFO_DEPTH 8U -/** - * @} - */ - -/* Private define ------------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @defgroup USARTEx_Private_Functions USARTEx Private Functions - * @{ - */ -static void USARTEx_SetNbDataToProcess(USART_HandleTypeDef *husart); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup USARTEx_Exported_Functions USARTEx Exported Functions - * @{ - */ - -/** @defgroup USARTEx_Exported_Functions_Group1 IO operation functions - * @brief Extended USART Transmit/Receive functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - This subsection provides a set of FIFO mode related callback functions. - - (#) TX/RX Fifos Callbacks: - (+) HAL_USARTEx_RxFifoFullCallback() - (+) HAL_USARTEx_TxFifoEmptyCallback() - -@endverbatim - * @{ - */ - -/** - * @brief USART RX Fifo full callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USARTEx_RxFifoFullCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USARTEx_RxFifoFullCallback can be implemented in the - user file. - */ -} - -/** - * @brief USART TX Fifo empty callback. - * @param husart USART handle. - * @retval None - */ -__weak void HAL_USARTEx_TxFifoEmptyCallback(USART_HandleTypeDef *husart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(husart); - - /* NOTE : This function should not be modified, when the callback is - needed, the HAL_USARTEx_TxFifoEmptyCallback can be implemented in the - user file. - */ -} - -/** - * @} - */ - -/** @defgroup USARTEx_Exported_Functions_Group2 Peripheral Control functions - * @brief Extended Peripheral Control functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] This section provides the following functions: - (+) HAL_USARTEx_EnableSPISlaveMode() API enables the SPI slave mode - (+) HAL_USARTEx_DisableSPISlaveMode() API disables the SPI slave mode - (+) HAL_USARTEx_ConfigNSS API configures the Slave Select input pin (NSS) - (+) HAL_USARTEx_EnableFifoMode() API enables the FIFO mode - (+) HAL_USARTEx_DisableFifoMode() API disables the FIFO mode - (+) HAL_USARTEx_SetTxFifoThreshold() API sets the TX FIFO threshold - (+) HAL_USARTEx_SetRxFifoThreshold() API sets the RX FIFO threshold - - -@endverbatim - * @{ - */ - -/** - * @brief Enable the SPI slave mode. - * @note When the USART operates in SPI slave mode, it handles data flow using - * the serial interface clock derived from the external SCLK signal - * provided by the external master SPI device. - * @note In SPI slave mode, the USART must be enabled before starting the master - * communications (or between frames while the clock is stable). - * Otherwise, if the USART slave is enabled while the master is in the middle of - * a frame, it will become desynchronized with the master. - * @note The data register of the slave needs to be ready before the first edge - * of the communication clock or before the end of the ongoing - * communication, otherwise the SPI slave will transmit zeros. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USARTEx_EnableSlaveMode(USART_HandleTypeDef *husart) -{ - uint32_t tmpcr1; - - /* Check parameters */ - assert_param(IS_UART_SPI_SLAVE_INSTANCE(husart->Instance)); - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->State = HAL_USART_STATE_BUSY; - - /* Save actual USART configuration */ - tmpcr1 = READ_REG(husart->Instance->CR1); - - /* Disable USART */ - __HAL_USART_DISABLE(husart); - - /* In SPI slave mode mode, the following bits must be kept cleared: - - LINEN and CLKEN bit in the USART_CR2 register - - HDSEL, SCEN and IREN bits in the USART_CR3 register.*/ - CLEAR_BIT(husart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); - CLEAR_BIT(husart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); - - /* Enable SPI slave mode */ - SET_BIT(husart->Instance->CR2, USART_CR2_SLVEN); - - /* Restore USART configuration */ - WRITE_REG(husart->Instance->CR1, tmpcr1); - - husart->SlaveMode = USART_SLAVEMODE_ENABLE; - - husart->State = HAL_USART_STATE_READY; - - /* Enable USART */ - __HAL_USART_ENABLE(husart); - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Disable the SPI slave mode. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USARTEx_DisableSlaveMode(USART_HandleTypeDef *husart) -{ - uint32_t tmpcr1; - - /* Check parameters */ - assert_param(IS_UART_SPI_SLAVE_INSTANCE(husart->Instance)); - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->State = HAL_USART_STATE_BUSY; - - /* Save actual USART configuration */ - tmpcr1 = READ_REG(husart->Instance->CR1); - - /* Disable USART */ - __HAL_USART_DISABLE(husart); - - /* Disable SPI slave mode */ - CLEAR_BIT(husart->Instance->CR2, USART_CR2_SLVEN); - - /* Restore USART configuration */ - WRITE_REG(husart->Instance->CR1, tmpcr1); - - husart->SlaveMode = USART_SLAVEMODE_DISABLE; - - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Configure the Slave Select input pin (NSS). - * @note Software NSS management: SPI slave will always be selected and NSS - * input pin will be ignored. - * @note Hardware NSS management: the SPI slave selection depends on NSS - * input pin. The slave is selected when NSS is low and deselected when - * NSS is high. - * @param husart USART handle. - * @param NSSConfig NSS configuration. - * This parameter can be one of the following values: - * @arg @ref USART_NSS_HARD - * @arg @ref USART_NSS_SOFT - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USARTEx_ConfigNSS(USART_HandleTypeDef *husart, uint32_t NSSConfig) -{ - uint32_t tmpcr1; - - /* Check parameters */ - assert_param(IS_UART_SPI_SLAVE_INSTANCE(husart->Instance)); - assert_param(IS_USART_NSS(NSSConfig)); - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->State = HAL_USART_STATE_BUSY; - - /* Save actual USART configuration */ - tmpcr1 = READ_REG(husart->Instance->CR1); - - /* Disable USART */ - __HAL_USART_DISABLE(husart); - - /* Program DIS_NSS bit in the USART_CR2 register */ - MODIFY_REG(husart->Instance->CR2, USART_CR2_DIS_NSS, NSSConfig); - - /* Restore USART configuration */ - WRITE_REG(husart->Instance->CR1, tmpcr1); - - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Enable the FIFO mode. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USARTEx_EnableFifoMode(USART_HandleTypeDef *husart) -{ - uint32_t tmpcr1; - - /* Check parameters */ - assert_param(IS_UART_FIFO_INSTANCE(husart->Instance)); - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->State = HAL_USART_STATE_BUSY; - - /* Save actual USART configuration */ - tmpcr1 = READ_REG(husart->Instance->CR1); - - /* Disable USART */ - __HAL_USART_DISABLE(husart); - - /* Enable FIFO mode */ - SET_BIT(tmpcr1, USART_CR1_FIFOEN); - husart->FifoMode = USART_FIFOMODE_ENABLE; - - /* Restore USART configuration */ - WRITE_REG(husart->Instance->CR1, tmpcr1); - - /* Determine the number of data to process during RX/TX ISR execution */ - USARTEx_SetNbDataToProcess(husart); - - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Disable the FIFO mode. - * @param husart USART handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USARTEx_DisableFifoMode(USART_HandleTypeDef *husart) -{ - uint32_t tmpcr1; - - /* Check parameters */ - assert_param(IS_UART_FIFO_INSTANCE(husart->Instance)); - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->State = HAL_USART_STATE_BUSY; - - /* Save actual USART configuration */ - tmpcr1 = READ_REG(husart->Instance->CR1); - - /* Disable USART */ - __HAL_USART_DISABLE(husart); - - /* Disable FIFO mode */ - CLEAR_BIT(tmpcr1, USART_CR1_FIFOEN); - husart->FifoMode = USART_FIFOMODE_DISABLE; - - /* Restore USART configuration */ - WRITE_REG(husart->Instance->CR1, tmpcr1); - - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Set the TXFIFO threshold. - * @param husart USART handle. - * @param Threshold TX FIFO threshold value - * This parameter can be one of the following values: - * @arg @ref USART_TXFIFO_THRESHOLD_1_8 - * @arg @ref USART_TXFIFO_THRESHOLD_1_4 - * @arg @ref USART_TXFIFO_THRESHOLD_1_2 - * @arg @ref USART_TXFIFO_THRESHOLD_3_4 - * @arg @ref USART_TXFIFO_THRESHOLD_7_8 - * @arg @ref USART_TXFIFO_THRESHOLD_8_8 - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USARTEx_SetTxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold) -{ - uint32_t tmpcr1; - - /* Check parameters */ - assert_param(IS_UART_FIFO_INSTANCE(husart->Instance)); - assert_param(IS_USART_TXFIFO_THRESHOLD(Threshold)); - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->State = HAL_USART_STATE_BUSY; - - /* Save actual USART configuration */ - tmpcr1 = READ_REG(husart->Instance->CR1); - - /* Disable USART */ - __HAL_USART_DISABLE(husart); - - /* Update TX threshold configuration */ - MODIFY_REG(husart->Instance->CR3, USART_CR3_TXFTCFG, Threshold); - - /* Determine the number of data to process during RX/TX ISR execution */ - USARTEx_SetNbDataToProcess(husart); - - /* Restore USART configuration */ - WRITE_REG(husart->Instance->CR1, tmpcr1); - - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Set the RXFIFO threshold. - * @param husart USART handle. - * @param Threshold RX FIFO threshold value - * This parameter can be one of the following values: - * @arg @ref USART_RXFIFO_THRESHOLD_1_8 - * @arg @ref USART_RXFIFO_THRESHOLD_1_4 - * @arg @ref USART_RXFIFO_THRESHOLD_1_2 - * @arg @ref USART_RXFIFO_THRESHOLD_3_4 - * @arg @ref USART_RXFIFO_THRESHOLD_7_8 - * @arg @ref USART_RXFIFO_THRESHOLD_8_8 - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USARTEx_SetRxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold) -{ - uint32_t tmpcr1; - - /* Check the parameters */ - assert_param(IS_UART_FIFO_INSTANCE(husart->Instance)); - assert_param(IS_USART_RXFIFO_THRESHOLD(Threshold)); - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->State = HAL_USART_STATE_BUSY; - - /* Save actual USART configuration */ - tmpcr1 = READ_REG(husart->Instance->CR1); - - /* Disable USART */ - __HAL_USART_DISABLE(husart); - - /* Update RX threshold configuration */ - MODIFY_REG(husart->Instance->CR3, USART_CR3_RXFTCFG, Threshold); - - /* Determine the number of data to process during RX/TX ISR execution */ - USARTEx_SetNbDataToProcess(husart); - - /* Restore USART configuration */ - WRITE_REG(husart->Instance->CR1, tmpcr1); - - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup USARTEx_Private_Functions - * @{ - */ - -/** - * @brief Calculate the number of data to process in RX/TX ISR. - * @note The RX FIFO depth and the TX FIFO depth is extracted from - * the USART configuration registers. - * @param husart USART handle. - * @retval None - */ -static void USARTEx_SetNbDataToProcess(USART_HandleTypeDef *husart) -{ - uint8_t rx_fifo_depth; - uint8_t tx_fifo_depth; - uint8_t rx_fifo_threshold; - uint8_t tx_fifo_threshold; - /* 2 0U/1U added for MISRAC2012-Rule-18.1_b and MISRAC2012-Rule-18.1_d - */ - static const uint8_t numerator[] = {1U, 1U, 1U, 3U, 7U, 1U, 0U, 0U}; - static const uint8_t denominator[] = {8U, 4U, 2U, 4U, 8U, 1U, 1U, 1U}; - - if (husart->FifoMode == USART_FIFOMODE_DISABLE) { - husart->NbTxDataToProcess = 1U; - husart->NbRxDataToProcess = 1U; - } else { - rx_fifo_depth = RX_FIFO_DEPTH; - tx_fifo_depth = TX_FIFO_DEPTH; - rx_fifo_threshold = (uint8_t)((READ_BIT(husart->Instance->CR3, USART_CR3_RXFTCFG) >> USART_CR3_RXFTCFG_Pos) & 0xFFU); - tx_fifo_threshold = (uint8_t)((READ_BIT(husart->Instance->CR3, USART_CR3_TXFTCFG) >> USART_CR3_TXFTCFG_Pos) & 0xFFU); - husart->NbTxDataToProcess = ((uint16_t)tx_fifo_depth * numerator[tx_fifo_threshold]) / (uint16_t)denominator[tx_fifo_threshold]; - husart->NbRxDataToProcess = ((uint16_t)rx_fifo_depth * numerator[rx_fifo_threshold]) / (uint16_t)denominator[rx_fifo_threshold]; - } -} -/** - * @} - */ - -#endif /* HAL_USART_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/Onboarding/W3_G4SPI_Transmit/Core/Src/stm32g4xx_it.c b/Onboarding/W3_G4SPI_Transmit/Core/Src/stm32g4xx_it.c deleted file mode 100644 index b8f0c7de5..000000000 --- a/Onboarding/W3_G4SPI_Transmit/Core/Src/stm32g4xx_it.c +++ /dev/null @@ -1,198 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32g4xx_it.c - * @brief Interrupt Service Routines. - ****************************************************************************** - * @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 "stm32g4xx_it.h" - -#include "main.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 --------------------------------------------------------*/ - -/* USER CODE BEGIN EV */ - -/* USER CODE END EV */ - -/******************************************************************************/ -/* Cortex-M4 Processor Interruption and Exception Handlers */ -/******************************************************************************/ -/** - * @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 */ -} - -/** - * @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 */ - } -} - -/** - * @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 */ - } -} - -/** - * @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 */ - } -} - -/** - * @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 */ - } -} - -/** - * @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 */ -} - -/** - * @brief This function handles Debug monitor. - */ -void DebugMon_Handler(void) -{ - /* USER CODE BEGIN DebugMonitor_IRQn 0 */ - - /* 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 */ - - /* 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 */ -} - -/******************************************************************************/ -/* STM32G4xx Peripheral Interrupt Handlers */ -/* Add here the Interrupt Handlers for the used peripherals. */ -/* For the available peripheral interrupt handler names, */ -/* please refer to the startup file (startup_stm32g4xx.s). */ -/******************************************************************************/ - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/Onboarding/W3_Peripherals_Workshop.md b/Onboarding/W3_Peripherals_Workshop.md deleted file mode 100644 index 42747418e..000000000 --- a/Onboarding/W3_Peripherals_Workshop.md +++ /dev/null @@ -1,53 +0,0 @@ -# STM32G474 G4SPI - -Nucleo-G474RE-C04 - -## 0. Prerequisites - -- 2 Nucleo-G474RE Discovery Boards -- 2 Micro-USB connectors to access the onboard STLink probe and provide power. -- 4 female-to-female jumper cables. -- A little faith. - -## 1. Wiring - -Wire the boards together by referring to the [MCU pin functions](https://wiki.gauchoracing.com/link/404#bkmrk-g4-pin-functions) and [Nucleo Board Pinout](https://wiki.gauchoracing.com/link/404#bkmrk-nucleo-pinout). Either board can act as transmitter or receiver with this wiring setup. - -- You only need to wire the pins that are labeled SPI. -- You should only need to use the female jumper cables to connect male headers together. -- The pin labeled PA5 controls the [User LED](https://wiki.gauchoracing.com/link/404#bkmrk-user-led) on each board. - -## 2. Compilation - -Give the code for both boards a quick look and try to guess what their behaviour will look like. You only need to look at the main() functions in [W3_G4SPI_Receive](W3_G4SPI_Receive/Core/Src/main.c) and [W3_G4SPI_Transmit](W3_G4SPI_Transmit/Core/Src/main.c). - -To verify your predictions, you will need to flash the boards with G4SPI_Transmit.elf and G4SPI_Receive.elf. From the root directory of Firmware, run the cmake commands: - -- `cmake --preset Debug` -- `cmake --build build/Debug` - -## 3. Flashing - -Wait for the files to compile. Once you have the .elf files, select the Run and Debug tab on the left-hand side of VSCode. In the window that pops up, click on the dropdown next to the green play button. and select either "SPI Receive W3 WS" or "SPI Transmit W3 WS", depending on the board you would like to flash. You may have to disconnect one board while you program the other one. If multiple boards are connected at a time, openocd may just flash the first board it detects. - -## 4. Verification - -Once both boards are flashed plug them both back to the USB connectors so that they both have power. - -- If nothing happened right after flashing, try pressing the black reset buttons on both boards. -- It may also help to check that your wiring is correct. -- Occasionally, there are glitches in the receiver board. These should also get resolved by hitting the reset button. - -If you think that the boards are working correctly (the User LEDs on both boards should both be blinking), see if the LED pattern matches your expectations from the code. Here are some other questions you could ask yourself: - -- SPI can be used in either full-duplex or half-duplex mode. What do these terms mean, and which mode is it being used in right now? -- Out of the 4 wires used to connect the boards together, are there any that are non-critical? Remove it and see if the board still functions as expected. -- What happens when you remove a line that is critical? Again, see if this matches your expectation from the code. - -## 5. Beyond HAL - -You will probably need to dive deeper than the HAL API throughout the rest of this season, and interact with registers directly. - -- Take a look at MX_SPI2_Init() inside either transmitter or receiver [main.c](W3_G4SPI_Receive/Core/Src/main.c) file. The code in this function should correspond roughly to SPI parameters in CubeMX. -- Right-click on HAL_SPI_Init() at the end of MX_SPI2_Init(). Scroll past the assert statements until you get to the section that modifies the CR1 and CR2 registers. -- These correspond directly to registers described in the datasheet for the STM32NucleoG474RE. Hopefully this removes the mystery behind the CubeMX magic.