# Release Notes for STM32F1xx HAL Drivers

Copyright © 2016 STMicroelectronics

# License

This software component is licensed by ST under BSD 3-Clause license, the “License”; You may not use this component except in compliance with the License. You may obtain a copy of the License at:
https://opensource.org/licenses/BSD-3-Clause

# Update History

V1.1.4 / 26-June-2019

## Main Changes

- General updates to fix known defects and enhancements implementation
- Add support of HAL callback registration feature
- Add new HAL EXTI driver
- General updates to fix CodeSonar compilation warnings
- General updates to fix the user manual .chm files
- The following changes done on the HAL drivers require an update on the application code based on older HAL versions
  - HAL/LL Generic update
    - Add support of HAL callback registration feature
      - The feature disabled by default is available for the following HAL drivers:
        - ADC, CEC, CAN, DAC, ETH, HCD, UART, USART, IRDA, SMARTCARD,
        - MMC, NAND, NOR, PCCARD, PCD, RTC, SD, SRAM, I2C, SPI, I2S, TIM and WWDG
      - The feature may be enabled individually per HAL PPP driver by setting the corresponding definition USE_HAL_PPP_REGISTER_CALLBACKS to 1U in stm32f1xx_hal_conf.h project configuration file (template file stm32f1xx_hal_conf_template.h available from Drivers/STM32F1xx_HAL_Driver/Inc)
      - Once enabled , the user application may resort to HAL_PPP_RegisterCallback() to register specific callback function(s) and unregister it(them) with HAL_PPP_UnRegisterCallback()
- HAL/LL Generic update
  - General updates to fix MISRA 2012 compilation errors
    - “stdio.h” include updated with “stddef.h”
  - Add HAL_GetUIDw0(), HAL_GetUIDw1() and HAL_GetUIDw2() API in order to returns the unique device identifier
- HAL CAN update
  - Update HAL_CAN_GetRxMessage() API to correct the remote CAN transmission request.
- HAL CEC update
  - Update HAL CEC State management method:
    - Remove HAL_CEC_StateTypeDef structure parameters
    - Add new defines for CEC states
- HAL CRC update
  - Update HAL_CRC_DeInit() API to be more safe
  - Remove lock mechanism on the followings API’s:
    - HAL_CRC_Accumulate()
    - HAL_CRC_Calculate()
- HAL DAC update
  - General updates for more efficiency implementation
  - Update HAL_DAC_IRQHandler() to manage DAC Under-run error only once DAC DMAUDR interrupt is enabled
- HAL GPIO update
  - HAL_GPIO_TogglePin() API implementation update: to improve robustness
  - HAL_GPIO_DeInit() API update to ensure clear all GPIO EXTI pending interrupts.
- HAL IRDA driver
  - Align HAL IRDA driver with latest updates and enhancements
  - Add callback registration feature
    - Add HAL_IRDA_RegisterCallback() and HAL_IRDA_UnRegisterCallback() APIs
    - Add callback identifiers in HAL_IRDA_CallbackIDTypeDef enumerated typedef
  - Review IRDA state machine to avoid cases where IRDA state is overwritten by IRDA IRQ
  - Implement new APIs for HAL IRDA Abort management:
    - HAL_IRDA_Abort(), HAL_IRDA_AbortTransmit(), HAL_IRDA_AbortReceive(), HAL_IRDA_Abort_IT(), HAL_IRDA_AbortTransmit_IT(), HAL_IRDA_AbortReceive_IT()
  - Optimize WaitOnFlag management in IRDA_Transmit() function
  - Optimize all HAL IRQ Handler routines
  - Optimize HAL IRDA to avoid using macros as argument of function calls
- HAL SMARTCARD driver
  - Align HAL SMARTCARD driver with latest updates and enhancements
  - Add callback registration feature
    - Add HAL_SMARTCARD_RegisterCallback() and HAL_SMARTCARD_UnRegisterCallback() APIs
    - Add callback identifiers in HAL_SMARTCARD_CallbackIDTypeDef enumerated typedef
  - Review SMARTCARD state machine to avoid cases where SMARTCARD state is overwritten by SMARTCARD IRQ
  - Implement new APIs for HAL SMARTCARD Abort management:
    - HAL_SMARTCARD_Abort(), HAL_SMARTCARD_AbortTransmit(), HAL_SMARTCARD_AbortReceive(), HAL_SMARTCARD_Abort_IT(), HAL_SMARTCARD_AbortTransmit_IT(), HAL_SMARTCARD_AbortReceive_IT()
  - Optimize WaitOnFlag management in SMARTCARD_Transmit() function
  - Optimize all HAL IRQ Handler routines
  - Optimize HAL SMARTCARD to avoid using macros as argument of function calls
- HAL UART/USART driver
  - Align HAL UART/USART driver with latest updates and enhancements
  - Add callback registration feature
    - Add HAL_UART/USART_RegisterCallback() and HAL_UART/USART_UnRegisterCallback() APIs
    - Add callback identifiers in HAL_UART/USART_CallbackIDTypeDef enumerated typedef
  - Add missing __IO in UART/USART_HandleTypeDef definition (for TxXferCount and RxXferCount)
  - Review UART/USART state machine to avoid cases where UART/USART state is overwritten by UART/USART IRQ
  - Implement new APIs for HAL UART/USART Abort management:
    - HAL_UART/USART_Abort(), HAL_UART/USART_AbortTransmit(), HAL_UART/USART_AbortReceive(), HAL_UART/USART_Abort_IT(), HAL_UART/USART_AbortTransmit_IT(), HAL_UART/USART_AbortReceive_IT()
  - Optimize WaitOnFlag management in UART/USART_Transmit() function
  - Optimize all HAL IRQ Handler routines
  - Align __HAL_UART_GET_IT and __HAL_UART_GET_IT_SOURCE with other series
  - Optimize HAL UART/USART to avoid using macros as argument of function calls
  - Update USART BRR calculation
- HAL SDMMC update
  - Align HAL SDMMC driver with latest updates and enhancements
  - Due to limitation SDIO hardware flow control indicated in Errata Sheet :
    - In 4-bits bus wide mode, do not use the HAL_SD_WriteBlocks_IT() or HAL_SD_WriteBlocks() APIs otherwise underrun will occur and there is not possibility to activate the flow control
    - Use DMA mode when using 4-bits bus wide mode or decrease the frequency
  - Add callback registration feature
    - Add HAL_SD_RegisterCallback(),HAL_SD_UnRegisterCallback(), HAL_SD_RegisterTransceiverCallback() and HAL_SD_UnRegisterTransceiverCallback APIs
    - Add callback identifiers in HAL_SD_CallbackIDTypeDef enumerated typedef
- HAL I2C update
  - I2C API changes for MISRA-C 2012 compliance:
    - Rename HAL_I2C_Master_Sequential_Transmit_IT() to HAL_I2C_Master_Seq_Transmit_IT()
    - Rename HAL_I2C_Master_Sequentiel_Receive_IT() to HAL_I2C_Master_Seq_Receive_IT()
    - Rename HAL_I2C_Slave_Sequentiel_Transmit_IT() to HAL_I2C_Slave_Seq_Transmit_IT()
    - Rename HAL_I2C_Slave_Sequentiel_Receive_DMA() to HAL_I2C_Slave_Seq_Receive_DMA()
  - Add support of I2C repeated start feature in DMA Mode With the following new API’s
    - HAL_I2C_Master_Seq_Transmit_DMA()
    - HAL_I2C_Master_Seq_Receive_DMA()
    - HAL_I2C_Slave_Seq_Transmit_DMA()
    - HAL_I2C_Slave_Seq_Receive_DMA()
  - Add new I2C transfer options to easy manage the sequential transfers
    - I2C_OTHER_FRAME
    - I2C_OTHER_AND_LAST_FRAME
  - Fix I2C send break issue in IT processes
    - Add additional check on hi2c->hdmatxand hi2c->hdmarx to avoid the DMA request enable when ITmode is used.
- HAL SPI update
  - Align HAL/LL SPI driver with latest updates and enhancements
  - Fix issue in HAL_SPI_Transmit() and HAL_SPI_TransmitReceive() functions
  - Add SPI Abort transfer API’s:
    - HAL_SPI_Abort()
    - HAL_SPI_Abort_IT()
  - Update HAL/LL SPI driver to manage TI mode not supported by all STM32F1xx devices
  - Add callback registration feature
    - Add HAL_SPI_RegisterCallback() and HAL_SPI_UnRegisterCallback() APIs
    - Add callback identifiers in HAL_SPI_CallbackIDTypeDef enumerated typedef
- HAL I2S update
  - Align HAL I2S driver with latest updates and enhancements
  - Add callback registration feature
    - Add HAL_I2S_RegisterCallback() and HAL_I2S_UnRegisterCallback() APIs
    - Add callback identifiers in HAL_I2S_CallbackIDTypeDef enumerated typedef
- HAL/LL TIM update
  - Move the following TIM structures from stm32f1xx_hal_tim_ex.h into stm32f1xx_hal_tim.h
    - TIM_MasterConfigTypeDef()
    - TIM_BreakDeadTimeConfigTypeDef()
  - Add new TIM Callbacks API’s:
    - HAL_TIM_PeriodElapsedHalfCpltCallback()
    - HAL_TIM_IC_CaptureHalfCpltCallback()
    - HAL_TIM_PWM_PulseFinishedHalfCpltCallback()
    - HAL_TIM_TriggerHalfCpltCallback()
  - TIM API changes for MISRA-C 2012 compliance:
    - Rename HAL_TIM_SlaveConfigSynchronization to HAL_TIM_SlaveConfigSynchro
    - Rename HAL_TIM_SlaveConfigSynchronization_IT to HAL_TIM_SlaveConfigSynchro_IT
    - Rename HAL_TIMEx_ConfigCommutationEvent to HAL_TIMEx_ConfigCommutEvent
    - Rename HAL_TIMEx_ConfigCommutationEvent_IT to HAL_TIMEx_ConfigCommutEvent_IT
    - Rename HAL_TIMEx_ConfigCommutationEvent_DMA to HAL_TIMEx_ConfigCommutEvent_DMA
    - Rename HAL_TIMEx_CommutationCallback to HAL_TIMEx_CommutCallback
    - Rename HAL_TIMEx_DMACommutationCplt to TIMEx_DMACommutationCplt
  - Add a call to HAL_DMA_Abort_IT from HAL_TIM_XXX_Stop_DMA
- HAL/LL USB update
  - Rework USB interrupt handler and improve HS DMA support in Device mode
  - Fix BCD handling of OTG instance in device mode
  - cleanup reference to low speed in device mode
  - Allow writing TX FIFO when transfer length is equal to available space in the TX FIFO
  - Fix Toggle OUT interrupt channel in host mode
  - Add new callback to be used to handle the usb device connection/disconnection
    - HAL_HCD_PortEnabled_Callback()
    - HAL_HCD_PortDisabled_Callback()
  - Update to prevent reactivate host interrupt channel
  - Updated USB_WritePacket(), USB_ReadPacket()APIs to prevent compilation warning with GCC GNU v8.2.0
  - Rework USB_EPStartXfer() API to enable theUSB endpoint before unmasking the TX FiFo empty interrupt in case DMA is not used
  - Update USB HAL_HCD_Init() and HAL_PCD_Init() APIs to avoid enabling USB DMA feature for OTG FS instance, USB DMAfeature is available only on OTG HS Instance
  - Remove duplicated line in hal_hcd.c header file comment section
  - Rework USB HAL driver to use instancePCD_SPEED_xxx, HCD_SPEED_xx instead of OTG register Core speed definition during the instance initialization
  - Software Quality improvement with a fix of CodeSonar warnings on PCD_Port_IRQHandler() and HCD_Port_IRQHandler()interrupt handlers

V1.1.3 / 09-October-2018

## Main Changes

- Maintenance release to fix known defects and enhancements implementation
- Generic drivers changes
- Some global variables on stm32xxx_hal.c updated to be declared as extern
- HAL drivers changes
- The following changes done on the HAL drivers require an update on the application code based on older HAL versions
  - Rework of HAL CAN driver (compatibility break)
    - A new HAL CAN driver has been redesigned with new APIs, to bypass limitations on CAN Tx/Rx FIFO management present with previous HAL CAN driver version.
    - The new HAL CAN driver is the recommended version. It is located as usual in Drivers/STM32F1xx_HAL_Driver/Src and Drivers/STM32f1xx_HAL_Driver/Inc folders. It can be enabled through switch HAL_CAN_MODULE_ENABLED in stm32f1xx_hal_conf.h
    - The legacy HAL CAN driver is also present in the release in Drivers/STM32F1xx_HAL_Driver/Src/Legacy and Drivers/STM32F1xx_HAL_Driver/Inc/Legacy folders for software compatibility reasons. Its usage is not recommended as deprecated. It can however be enabled through switch HAL_CAN_LEGACY_MODULE_ENABLED in stm32f1xx_hal_conf.h
- HAL update
  - Add definiton of HAL_CAN_LEGACY_MODULE_ENABLED swith in stm32f1xx_hal_conf_template.h
- HAL CAN update
  - Fields of CAN_InitTypeDef structure are reworked:
    - SJW to SyncJumpWidth, BS1 to TimeSeg1, BS2 to TimeSeg2, TTCM to TimeTriggeredMode, ABOM to AutoBusOff, AWUM to AutoWakeUp, NART to AutoRetransmission (inversed), RFLM to ReceiveFifoLocked and TXFP to TransmitFifoPriority
  - HAL_CAN_Init() is split into both HAL_CAN_Init() and HAL_CAN_Start() API’s
  - HAL_CAN_Transmit() is replaced by HAL_CAN_AddTxMessage() to place Tx Request, then HAL_CAN_GetTxMailboxesFreeLevel() for polling until completion.
  - HAL_CAN_Transmit_IT() is replaced by HAL_CAN_ActivateNotification() to enable transmit IT, then HAL_CAN_AddTxMessage() for place Tx request.
  - HAL_CAN_Receive() is replaced by HAL_CAN_GetRxFifoFillLevel() for polling until reception, then HAL_CAN_GetRxMessage()
  - to get Rx message.
  - HAL_CAN_Receive_IT() is replaced by HAL_CAN_ActivateNotification() to enable receive IT, then HAL_CAN_GetRxMessage()
  - in the receivecallback to get Rx message
  - HAL_CAN_Slepp() is renamed as HAL_CAN_RequestSleep()
  - HAL_CAN_TxCpltCallback() is split into HAL_CAN_TxMailbox0CompleteCallback(), HAL_CAN_TxMailbox1CompleteCallback() and HAL_CAN_TxMailbox2CompleteCallback().
  - HAL_CAN_RxCpltCallback is split into HAL_CAN_RxFifo0MsgPendingCallback() and HAL_CAN_RxFifo1MsgPendingCallback().
  - More complete “How to use the new driver” is detailed in the driver header section itself.

V1.1.2 / 09-March-2018

## Main Changes

- General updates to fix known defects and enhancements implementation
- Remove Date and version from header files
- HAL Generic update
  - stm32f1xx_hal_def.h file changes:
    - Update UNUSED() macro implementation to avoid GCC warning
      - The warning is detected when the UNUSED() macro is called from C++ file
    - Update __weak and __packed defined values for ARM compiler
    - Update __ALIGN_BEGIN and __ALIGN_END defined values for ARM compiler
    - Update to make RAMFUNC define as generic type instead of HAL_StatusTypdef type
- stm32f1xx_hal.c/.h file changes:
  - Update HAL driver to allow user to change systick period to 1ms, 10 ms or 100 ms:
    - Add the following APIs:
      - HAL_GetTickPrio(): Returns a tick priority
      - HAL_SetTickFreq(): Sets new tick frequency
      - HAL_GetTickFreq(): Returns tick frequency
  - Add HAL_TickFreqTypeDef enumeration for the different Tick Frequencies: 10 Hz, 100 Hz and 1KHz (default)
- stm32f1xx_hal_conf_template.h file changes:
  - Fix wrong defined value of LSI
- HAL GPIO update
  - Rework AFIO remap macros to avoid issue with Read-modify-write sequence on AFIO_MAPR register
- HAL I2C update
  - Fix wrong check of data size in HAL_I2C_Slave Receive() API
  - Add a check on the minimum allowed PCLK1 frequency in HAL_I2C_Init() API
  - Fix I2C_SPEED_FAST() and I2C_SPEED_STANDARD() speed calculation macros to not let I2C SCL to go beyond 400KHz in some conditions
- HAL RCC update
  - Update HAL_RCC_DeInit() and LL_RCC_DeInit() APIs to
    - Be able to return HAL/LL status
    - Add checks for HSI, PLL and PLLI2S ready before modifying RCC CFGR registers
    - Clear all interrupt flags
    - Initialize systick interrupt period
  - Update HAL_RCC_GetSysClockFreq() to avoid risk of rounding error which may leads to a wrong returned value.
- HAL SMARTCARD update
  - Update data processing in HAL smartcard transmit/receive processes(Polling/IT) to fix memory corruption issue.
- LL GPIO update
  - Fix wrong management of GPIO pin position in LL_GPIO_Init() API when configuring GPIOx_CRH register
  - Fix wrong check conditions on GPIO mode in LL_GPIO_Init() API
- LL I2C update
  - Rename IS_I2C_CLOCK_SPEED() and IS_I2C_DUTY_CYCLE() respectively to IS_LL_I2C_CLOCK_SPEED() and IS_LL_I2C_DUTY_CYCLE() to avoid incompatible macros redefinition.
- LL RCC update
  - Add LL_RCC_PLL_SetMainSource() macro to configure PLL main clock source

V1.1.1 / 12-May-2017

## Main Changes

- General updates to fix known defects and enhancements implementation
- HAL Generic update
  - stm32f1xx_hal_conf_template.h fix typo: update to refer to stm32f1xx_hal_mmc.h instead of stm32f4xx_hal_mmc.h
- LL SYSTEM update
  - LL_DBGMCU_APB1_GRP1_I2C1_STOP and LL_DBGMCU_APB1_GRP1_I2C2_STOP literals are retarget to an available literals
  - LL_DBGMCU_APB1_GRP1_RTC_STOP literal is not available for all STM32F1 devices
- HAL MMC update
  - Add missing () to fix compilation warning detected with SW4STM32 when extra feature is enabled.
- HAL I2C update
  - Update HAL I2C processes to manage correctly the I2C state to allow the possibility to call HAL_I2C_Master_Sequential_Receive_IT() followed by a call HAL_I2C_Master_Sequential_Transmit_IT()

V1.1.0 / 14-April-2017

## Main Changes

- Add Low Layer drivers allowing performance and footprint optimization
  - Low Layer drivers APIs provide register level programming: require deep knowledge of peripherals described in STM32F1xx Reference Manuals
  - Low Layer drivers are available for: ADC, Cortex, CRC, DAC, DMA, EXTI, GPIO, I2C, IWDG, PWR, RCC, RTC, SPI, TIM, USART, WWDG peripherals and additionnal Low Level Bus, System and Utilities APIs.
  - Low Layer drivers APIs are implemented as static inline function in new Inc/stm32f1xx_ll_ppp.h files for PPP peripherals, there is no configuration file and each stm32f1xx_ll_ppp.h file must be included in user code.
- Add new HAL MMC driver
- General updates to fix known defects and enhancements implementation
- Enhance HAL delay and time base implementation:
  - Add new drivers stm32f1xx_hal_timebase_rtc_alarm_template.c and stm32f1xx_hal_timebase_tim_template.c which override the native HAL time base functions (defined as weak) to either use the RTC/TIM as time base tick source. For more details about the usage of these drivers, please refer to HAL_TimeBase_RTC and HAL_TimeBase_TIM examples and FreeRTOS-based applications
- Fix extra warnings with GCC compiler
- HAL drivers clean up: update ‘uint32_t’ cast with ‘U’
- Update to used the new defined Bit_Pos CMSIS defines insetad of POSITION_VAL() macro
- Update HAL weak empty callbacks to prevent unused argument compilation warnings with some compilers by calling the following line:
  - UNUSED(hppp);
- STM32Fxxx_User_Manual.chm files regenerated for HAL V1.1.0
- The following changes done on the HAL drivers require an update on the application code based on older HAL versions
  - HAL UART, USART, IRDA, SMARTCARD, SPI, I2C (referenced as PPP here below) drivers
    - Add PPP error management during DMA process. This requires the following updates on user application:
      - Configure and enable the PPP IRQ in HAL_PPP_MspInit() function
      - In stm32f1xx_it.c file, PPP_IRQHandler() function: add a call to HAL_PPP_IRQHandler() function
      - Add customize the Error Callback API: HAL_PPP_ErrorCallback()
  - HAL SD driver:
    - Overall rework of the driver for a more efficient implementation
      - Modify initialization API and structures
      - Modify Read / Write sequences: separate transfer process and SD Cards state management
      - Adding interrupt mode for Read / Write operations
      - Update the HAL_SD_IRQHandler function by optimizing the management of interrupt errors
    - Refer to the following example to identify the changes: BSP example and USB_Device/MSC_Standalone application
  - HAL NAND driver:
    - Modify NAND_AddressTypeDef, NAND_DeviceConfigTypeDef and NAND_HandleTypeDef structures fields
    - Add new HAL_NAND_ConfigDevice API
  - HAL CEC driver: Overall driver rework with compatibility break versus previous HAL version
    - Remove HAL CEC polling Process functions: HAL_CEC_Transmit() and HAL_CEC_Receive()
    - Remove HAL CEC receive interrupt process function HAL_CEC_Receive_IT() and enable the “receive” mode during the Init phase
    - Rename HAL_CEC_GetReceivedFrameSize() funtion to HAL_CEC_GetLastReceivedFrameSize()
    - Add new HAL APIs: HAL_CEC_SetDeviceAddress() and HAL_CEC_ChangeRxBuffer()
    - Remove the ‘InitiatorAddress’ field from the CEC_InitTypeDef structure and manage it as a parameter in the HAL_CEC_Transmit_IT() function
    - Add new parameter ‘RxFrameSize’ in HAL_CEC_RxCpltCallback() function
    - Move CEC Rx buffer pointer from CEC_HandleTypeDef structure to CEC_InitTypeDef structure
  - HAL IWDG driver: rework overall driver for better implementation
    - Remove HAL_IWDG_Start(), HAL_IWDG_MspInit() and HAL_IWDG_GetState() APIs
  - HAL WWDG driver: rework overall driver for better implementation
    - Remove HAL_WWDG_Start(), HAL_WWDG_Start_IT(), HAL_WWDG_MspDeInit() and HAL_WWDG_GetState() APIs
    - Update the HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg, uint32_t counter) function and API by removing the “counter” parameter
- HAL GENERIC update
  - Modifiy default HAL_Delay implementation to guarantee minimum delay
  - stm32f1xx_hal_conf_template.h
    - Add new define LSI_VALUE
    - Add new define USE_SPI_CRC for code cleanup when the CRC calculation is disabled.
- HAL CORTEX update
  - Move HAL_MPU_Disable() and HAL_MPU_Enable() from stm32f4xx_hal_cortex.h to stm32f4xx_hal_cortex.c
  - Clear the whole MPU control register in HAL_MPU_Disable() API
- HAL FLASH update
  - HAL_FLASH_OB_Launch(): fix static code analyzer warning: The removed code will not execute under any circumstances
- HAL GPIO update
  - Update IS_GPIO_PIN() macro implementation to be more safe
  - Update remap macros implementation to use CLEAR_BIT()/SET_BIT() macros instead of MODIFY_REG() macro.
- HAL RCC update
  - Update LSI workaround delay to use CPU cycles instead of systick
  - Move LSI_VALUE define from RCC HAL driver to stm32f1xx_hal_conf.h file
  - Adjust defined PLL MUL values in aPLLMULFactorTable[]
- HAL ADC update
  - HAL_ADCEx_MultiModeStart_DMA() and HAL_ADCEx_MultiModeStop_DMA() API’s update to fix code static analyzer warning: Redundant Condition / Unreachable Computation
- HAL DMA update
  - HAL_DMA_Init(): update to check compatibility between FIFO threshold level and size of the memory burst
  - Global driver code optimization to reduce memory footprint
  - New APIs HAL_DMA_RegisterCallback() and HAL_DMA_UnRegisterCallback() to register/unregister the different possible callbacks identified by enum typedef HAL_DMA_CallbackIDTypeDef
  - Add new Error Codes: HAL_DMA_ERROR_NO_XFER and HAL_DMA_ERROR_NOT_SUPPORTED
- HAL USART update
  - Add Transfer abort functions and callbacks
  - DMA Receive process; the code has been updated to clear the USART OVR flag before enabling DMA receive request.
  - Update HAL_USART_IRQHandler() to add a check on interrupt source before managing the error
- HAL UART update
  - Several update on HAL UART driver to implement the new UART state machine:
    - Add new field in UART_HandleTypeDef structure: “rxState”, UART state information related to Rx Operations
    - Rename “state” field in UART_HandleTypeDef structure by “gstate”: UART state information related to global Handle management and Tx Operations
    - Update UART process to manage the new UART states.
    - Update __HAL_UART_RESET_HANDLE_STATE() macro to handle the new UART state parameters (gState, rxState)
  - Add Transfer abort functions and callbacks
  - Update HAL_UART_IRQHandler() to add a check on interrupt source before managing the error
  - DMA Receive process; the code has been updated to clear the USART OVR flag before enabling DMA receive request.
- HAL IRDA update
  - Several update on HAL IRDA driver to implement the new UART state machine:
    - Add new field in IRDA_HandleTypeDef structure: “rxState”, IRDA state information related to Rx Operations
    - Rename “state” field in UART_HandleTypeDef structure by “gstate”: IRDA state information related to global Handle management and Tx Operations
    - Update IRDA process to manage the new UART states.
    - Update __HAL_IRDA_RESET_HANDLE_STATE() macro to handle the new IRDA state parameters (gState, rxState)
  - Removal of IRDA_TIMEOUT_VALUE define
  - Add Transfer abort functions and callbacks
  - Update HAL_IRDA_IRQHandler() to add a check on interrupt source before managing the error
  - DMA Receive process; the code has been updated to clear the USART OVR flag before enabling DMA receive request.
- HAL SMARTCARD update
  - Several update on HAL SMARTCARD driver to implement the new UART state machine:
    - Add new field in SMARTCARD_HandleTypeDef structure: “rxState”, SMARTCARDstate information related to Rx Operations
    - Rename “state” field in UART_HandleTypeDef structure by “gstate”: SMARTCARDstate information related to global Handle management and Tx Operations
    - Update SMARTCARD process to manage the new UART states.
    - Update __HAL_SMARTCARD_RESET_HANDLE_STATE() macro to handle the new SMARTCARD state parameters (gState, rxState)
  - Add Transfer abort functions and callbacks
  - Update HAL_SMARTCARD_IRQHandler() to add a check on interrupt source before managing the error
  - DMA Receive process; the code has been updated to clear the USART OVR flag before enabling DMA receive request.
- HAL CAN update
  - Add management of overrun error.
  - Allow possibility to receive messages from the 2 RX FIFOs in parallel via interrupt.
  - Fix message lost issue with specific sequence of transmit requests.
  - Handle transmission failure with error callback, when NART is enabled.
  - Add __HAL_CAN_CANCEL_TRANSMIT() call to abort transmission when timeout is reached
- HAL TIM update
  - Add __HAL_TIM_MOE_DISABLE_UNCONDITIONALLY() macro to disable Master output without check on TIM channel state.
  - Update HAL_TIMEx_ConfigBreakDeadTime() to fix TIM BDTR register corruption.
  - Update Input Capture polarity by removing non-supported “TIM_INPUTCHANNELPOLARITY_BOTHEDGE” define.
  - Update HAL_TIM_ConfigOCrefClear() API by removing the usage of non-existant SMCR OCCS bit.
  - Add “AutoReloadPreload” field to TIM_Base_InitTypeDef structure and corresponding macros __HAL_TIM_ENABLE_OCxPRELOAD() and __HAL_TIM_DISABLE_OCxPRELOAD() .
  - Update TIM_Base_SetConfig() API to set the auto-reload preload.
- HAL I2C update
  - Update HAL_I2C_Master_Transmit() and HAL_I2C_Slave_Transmit() to avoid sending extra bytes at the end of the transmit processes
  - Update HAL_I2C_Mem_Read() API to fix wrong check on misused parameter “Size”
  - Update I2C_MasterReceive_RXNE() and I2C_MasterReceive_BTF() static APIs to enhance Master sequential reception process.
- HAL SPI update
  - Major Update to improve performance in polling/interrupt mode to reach max frequency:
    - Polling mode :
      - Replace use of SPI_WaitOnFlagUnitTimeout() funnction by “if” statement to check on RXNE/TXE flage while transferring data.
      - Use API data pointer instead of SPI handle data pointer.
    - Use a Goto implementation instead of “if..else” statements
    - Interrupt mode
      - Minimize access on SPI registers.
      - Split the SPI modes into dedicated static functions to minimize checking statements under HAL_IRQHandler():
        - 1lines/2lines modes
        - 8 bit/ 16 bits data formats
        - CRC calculation enabled/disabled.
    - Remove waiting loop under ISR when closing the communication.
    - All modes:
      - Adding switch USE_SPI_CRC to minimize number of statements when CRC calculation is disabled.
      - Update Timeout management to check on global process.
      - Update Error code management in all processes.
  - Add note to the max frequencies reached in all modes.
  - Add note about Master Receive mode restrictions :
  - Master Receive mode restriction:
    - 1. In Master unidirectional receive-only mode (MSTR =1, BIDIMODE=0, RXONLY=0) or
    - bidirectional receive mode (MSTR=1, BIDIMODE=1, BIDIOE=0), to ensure that the SPI
  - does not initiate a new transfer the following procedure has to be respected:
    - (##) HAL_SPI_DeInit()
    - (##) HAL_SPI_Init()
  - Add transfer abort APIs and associated callbacks in interrupt mode
    - HAL_SPI_Abort()
    - HAL_SPI_Abort_IT()
    - HAL_SPI_AbortCpltCallback()
- HAL CEC update
  - Overall driver rework with break of compatibility with HAL V1.0.5
    - Remove the HAL CEC polling Process: HAL_CEC_Transmit() and HAL_CEC_Receive()
    - Remove the HAL CEC receive interrupt process (HAL_CEC_Receive_IT()) and manage the “Receive” mode enable within the Init phase
    - Rename HAL_CEC_GetReceivedFrameSize() function to HAL_CEC_GetLastReceivedFrameSize() function
    - Add new HAL APIs: HAL_CEC_SetDeviceAddress() and HAL_CEC_ChangeRxBuffer()
    - Remove the ‘InitiatorAddress’ field from the CEC_InitTypeDef structure and manage it as a parameter in the HAL_CEC_Transmit_IT() function
    - Add new parameter ‘RxFrameSize’ in HAL_CEC_RxCpltCallback() function
    - Move CEC Rx buffer pointer from CEC_HandleTypeDef structure to CEC_InitTypeDef structure
  - Update driver to implement the new CEC state machine:
    - Add new “rxState” field in CEC_HandleTypeDef structure to provide the CEC state information related to Rx Operations
    - Rename “state” field in CEC_HandleTypeDef structure to “gstate”: CEC state information related to global Handle management and Tx Operations
    - Update CEC process to manage the new CEC states.
    - Update __HAL_CEC_RESET_HANDLE_STATE() macro to handle the new CEC state parameters (gState, rxState)
- HAL I2S update
  - Update I2S Transmit/Receive polling process to manage Overrun and Underrun errors
  - HAL I2S driver ovall clean-up and optimization
  - HAL_I2S_Init() API updated to
    - Fix wrong I2S clock calculation when PCM mode is used.
    - Return state HAL_I2S_ERROR_PRESCALER when the I2S clock is wrongly configured
- HAL NAND update
  - Modify NAND_AddressTypeDef, NAND_DeviceConfigTypeDef and NAND_HandleTypeDef structures fields
  - Add new HAL_NAND_ConfigDevice API
- HAL USB PCD update
  - Flush all TX FIFOs on USB Reset
  - Remove Lock mechanism from HAL_PCD_EP_Transmit() and HAL_PCD_EP_Receive() API’s
- LL USB update
  - Enable DMA Burst mode for USB OTG HS
  - Fix SD card detection issue
- LL SDMMC update
  - Add new SDMMC_CmdSDEraseStartAdd, SDMMC_CmdSDEraseEndAdd, SDMMC_CmdOpCondition and SDMMC_CmdSwitch functions

V1.0.5 / 06-December-2016

## Main Changes

- General updates to fix mainly known I2C defects and enhancements implementation
- The following changes done on the HAL drivers require an update on the application code based on HAL V1.0.4
  - HAL I2C driver:
  - Add I2C error management during DMA process. This requires the following updates on user application:
    - Configure and enable the I2C IRQ in HAL_I2C_MspInit() function
    - In stm32f1xx_it.c file, I2C _IRQHandler() function: add a call to HAL_I2C_IRQHandler() function
    - Add and customize the Error Callback API: HAL_I2C_ErrorCallback()
  - Update to avoid waiting on STOPF/BTF/AF flag under DMA ISR by using the I2C end of transfer interrupt in the DMA transfer process. This requires the following updates on user application:
  - Configure and enable the I2C IRQ in HAL_I2C_MspInit() function
  - In stm32f1xx_it.c file, I2C_IRQHandler() function: add a call to HAL_I2C_IRQHandler() function
  - I2C transfer processes IT update: NACK during addressing phase is managed through I2C Error interrupt instead of HAL state
- HAL I2C update
  - Add support of I2C repeated start feature:
  - With the following new API’s
    - HAL_I2C_Master_Sequential_Transmit_IT()
    - HAL_I2C_Master_Sequential_Receive_IT()
    - HAL_I2C_Master_Abort_IT()
    - HAL_I2C_Slave_Sequential_Transmit_IT()
    - HAL_I2C_Slave_Sequential_Receive_IT()
    - HAL_I2C_EnableListen_IT()
    - HAL_I2C_DisableListen_IT()
  - Add new user callbacks:
    - HAL_I2C_ListenCpltCallback()
    - HAL_I2C_AddrCallback()
  - IRQ handler optimization: read registers status only once
  - I2C addressing phase is updated to be managed using interrupt instead of polling
    - Add new static functions to manage I2C SB, ADDR and ADD10 flags
  - I2C IT transfer processes update: NACK during addressing phase is managed through I2C Error interrupt instead of HAL state
  - Update to generate STOP condition when a acknowledge failure error is detected
  - Update I2C_WaitOnFlagUntilTimeout() to manage the NACK feature.
  - Update I2C transmission process to support the case data size equal 0
  - Update Polling management:
    - The Timeout value must be estimated for the overall process duration: the Timeout measurement is cumulative
  - Add the management of Abort service: Abort DMA transfer through interrupt
    - In the case of Master Abort IT transfer usage:
      - Add new user HAL_I2C_AbortCpltCallback() to inform user of the end of abort process
      - A new abort state is defined in the HAL_I2C_StateTypeDef structure
  - Add the management of I2C peripheral errors, ACK failure and STOP condition detection during DMA process. This requires the following updates on user application:
    - Configure and enable the I2C IRQ in HAL_I2C_MspInit() function
    - In stm32f1xx_it.c file, I2C_IRQHandler() function: add a call to HAL_I2C_IRQHandler() function
    - Add and customize the Error Callback API: HAL_I2C_ErrorCallback()
  - Update to avoid waiting on STOPF/BTF/AF flag under DMA ISR by using the I2C end of transfer interrupt in the DMA transfer process. This requires the following updates on user application:
    - Configure and enable the I2C IRQ in HAL_I2C_MspInit() function
    - In stm32f1xx_it.c file, I2C_IRQHandler() function: add a call to HAL_I2C_IRQHandler() function
  - Add a check if the I2C is already enabled at start of all I2C API’s.
  - Update I2C API’s (Polling, IT, DMA interfaces) to use hi2c->XferSize and hi2c->XferCount instead of size
  - parameter to help user to get information of counter in case of error
- HAL DMA update
  - Add new API HAL_DMA_Abort_IT() to abort DMA transfer under interrupt context
    - The new registered Abort callback is called when DMA transfer abortion is completed
- HAL ETH update
  - Remove ETH MAC debug register defines
- HAL DAC update
  - Clean up: remove the following literals that aren’t used
    - DAC_WAVE_NOISE
    - DAC_WAVE_TRIANGLE

V1.0.4 / 29-April-2016

## Main Changes

- General updates to fix known defects and enhancements implementation.
- HAL RCC
  - Add suffix U for defines equals to 0xFFFFFFFF (fix MISRA error 10.6)
  - Optimization of HAL_RCC_ClockConfig().
  - Replace aAPBAHBPrescTable by APBPrescTable and AHBPrescTable defined inside system_stm32f1xx.c.
  - When using HAL_RCC_OscConfig to activate LSE, if LSE is already ON, it remains in its state ON. Previously, it was turned OFF then ON in all cases.
  - The backup domain is no more reset when changing the RTC clock source from reset value.
  - Correct strange behavior in HAL_RCCEx_PeriphCLKConfig.
- HAL UART
  - Correct the macro UART_BRR_SAMPLING16
- HAL SMARTCARD
  - Correct the macro SMARTCARD_BRR
- HAL IRDA
  - Correct the macro IRDA_BRR
  - EIE bit is no more activated in transmit (this bit only triggers errors in reception)
  - EIE bit is reset at the end of the reception.
- HAL DMA
  - Add macro __HAL_DMA_GET_COUNTER to get the number of remaining data units in the current channel.
- HAL FSMC
  - Adapt FSMC_NAND_Init behavior to the others STM32 series by reseting the bit FSMC_PCRx_PBKEN.

V1.0.3 / 11-January-2016

## Main Changes

- Remove the #if defined(USE_HAL_LEGACY) condition to include Legacy/stm32_hal_legacy.h by default, in stm32f1xx_hal_def.h.

V1.0.2 / 18-December-2015

## Main Changes

- General updates to fix known defects and enhancements implementation.
- HAL generic
  - Insure that do {} while(0) are used in in multi statement macros. (hal eth and pcd)
  - Manage simultaneous errors in IRQHandler. (hal uart, smartcard, usart and uart)
  - To ensure the full compatibility of the GPIO interfaces across all the STM32 families, the gpio speed definition have been renamed:
    - GPIO_SPEED_LOW to GPIO_SPEED_FREQ_LOW
    - GPIO_SPEED_MEDIUM to GPIO_SPEED_FREQ_MEDIUM
    - GPIO_SPEED_HIGH to GPIO_SPEED_FREQ_HIGH
    - aliases are created to keep backward compatibility
  - Reduce the default timeout value for the startup of the HSE form 5s to 100ms.
  - Update HAL weak empty callbacks to prevent unused argument compilation warnings with some compilers.
- HAL ADC
  - Remove useless state HAL_ADC_STATE_REG_OVR and HAL_ADC_STATE_REG_EOSMP.
  - Add an error case if init is done with both continuous and discontinuous modes.
  - HAL_ADC_PollForEvent returns HAL_TIMEOUT if a timeout occurs instead of HAL_ERROR.
  - Trigger the assert_param of the number of discontinuous conversion only if the discontinuous mode is enabled.
  - Enhance the check for ScanConvMode in HAL_ADC_Init.
- HAL CAN
  - Clear the ERRI bit in HAL_CAN_IRQHandler.
- HAL CORTEX
  - Remove the macro __HAL_CORTEX_SYSTICKCLK_CONFIG as duplicated by HAL_SYSTICK_CLKSourceConfig.
    - Create an alias to HAL_SYSTICK_CLKSourceConfig for backward compatibility.
- HAL FLASH
  - The parameter ReturnValue of HAL_FLASH_EndOfOperationCallback, in the case of Pages Erase, now take the value of 0xFFFFFFFF if all the selected pages have been erased.
  - Add a new interface HAL_FLASHEx_OBGetUserData to get the option byte user data.
- HAL GPIO
  - Remove a useless assert_param on the pull mode in HAL_GPIO_Init.
- HAL I2C
  - Correct issue at reception of 2 bytes using memory polling and IT interface.
  - Correct a wrong management of the AF flag.
- HAL RCC
  - Reduce the timeout of HSI, LSI and PLL to be closer to HW specifications:
    - HSI_TIMEOUT_VALUE reduced from 100ms to 2ms
    - LSI_TIMEOUT_VALUE reduced from 100ms to 2ms
    - PLL_TIMEOUT_VALUE reduced from 100ms to 2ms
- HAL SD
  - Correct wrong calculation of the capacity for High Capacity cards.
- HAL SPI
  - Remove incorrect reset of DMA parameter in HAL_SPI_Receive_DMA and HAL_SPI_Transmit_DMA.
- HAL TIM
  - Remove useless assert_param.
  - Rewrite the assert_param when setting clock source.
- HAL UART
  - Manage the case of reception of a character while the driver is not expecting one. This was causing a crash of the driver.
- LL USB
  - Remove the NoVbusSensing feature from driver. (feature not present on STM32F1xx)

V1.0.1 / 31-July-2015

## Main Changes

- General updates to fix known defects and enhancements implementation.
- HAL generic
  - stm32f1xx_hal_def.h
    - Update NULL definition to fix C++ compilation issue.
- HAL ADC
  - Optimization of macro __HAL_ADC_CLEAR_FLAG.
  - ADC poll for conversion now return error status in case of ADC-DMA mode.
  - ADC polling functions now return HAL_TIMEOUT (or HAL_ERROR in case of configuration error).
  - Removing field NbrOfConversionRank of ADC_HandleTypeDef. This field was useless on STM32F1xx.
  - Improving the ADC state machine.
- HAL CAN
  - Field Data of CanRxMsgTypeDef and CanTxMsgTypeDef is changed from uint32_t to uint8_t.
- HAL Cortex
  - Add MPU APIs in Cortex HAL driver.
- HAL CRC
  - Correcting a wrong definition of __HAL_CRC_SET_IDR macro.
- HAL DAC
  - HAL_IS_BIT_SET is nowused properly in HAL_DAC_Start.
  - Add 2 defines: DAC_WAVEGENERATION_NOISE and DAC_WAVEGENERATION_TRIANGLE.
  - HAL_DAC_Stop now disable DAC software conversion.
- HAL DMA
  - Minor typographic updates.
- HAL ETH
  - ETH_MAC_READCONTROLLER_FLUSHING: Removing a space in the middle of the name.
  - Removing some duplicated macros.
- HAL FLASH
  - FLASH_OB_GetRDP returns uint32_t instead of FlagStatus. (internal function). This permit a more coherent use for HAL_FLASHEx_OBGetConfig and HAL_FLASHEx_OBProgram.
  - Correct an issue making impossible to set Flash read protection level1 and level2.
  - The activation of backup domain in RCC is systematic.
- HAL I2C
  - Correct an issue depending of APB/I2C frequency which was preventing the STOP bit to be cleared.
    - The POS bit is now cleared at the beginning of each I2C API.
    - The POS bit is no more cleared near STOP generation.
- HAL I2S
  - HAL_I2S_Transmit() API is updated to keep the check on busy flag only for the slave.
- HAL NAND
  - Review __ARRAY_ADDRESS macro and adapt tests to detect bad blocks
- HAL RCC
  - In HAL_RCCEx_PeriphCLKConfig, Reset backup domain only if RTC clock source has been changed.
  - Update of HAL_RCC_OscConfig functionto correctly check LSEState.
  - Rework __HAL_RCC_LSE_CONFIG macro to manage correctly LSE_Bypass.
  - New HAL RCC macro to configure the SYSCLK clock source: __HAL_RCC_SYSCLK_CONFIG(RCC_SYSCLKSOURCE).
  - Adding macro: __HAL_RCC_MCO_CONFIG.
  - For some RPN, the prediv source management in HAL_RCC_OscConfig function was not used.
- HAL RTC
  - CMSIS mask definition used instead of hardcoded values.
- HAL SMARTCARD
  - Improve documentation
- HAL TIM
  - All STM32F101xx and STM32F102xx defines were missing in the file stm32f1xx_hal_tim_ex.h.
  - The assert on trigger polarity for TI1F_ED is removed.
- HAL USB
  - Correct issue preventing USB Device double-buffering mode for IN endpoints to correctly behave.
  - Correct a bad configuration of Turnaround Time.
  - Correct USB_FlushTxFifo function which was leading to a GRSTCTL register corruption.
  - Replaced the access to USB_OTG_HCCHAR_CHDIS and USB_OTG_HCCHAR_CHENA from a sequencial access to a simultaneous access.

V1.0.0 / 15-December-2014

## Main Changes

- First Official release of STM32F1xx HAL Drivers for all STM32F1 devices.
- This release is in line with STM32Cube Firmware specification Rev1.0 document