Back to Release page
# Release Notes for STM32F1xx HAL Drivers Copyright 2016 STMicroelectronics
## Update History ### V1.1.0 / 14-April-2017 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\HAL_TimeBase_RTC and HAL\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", SMARTCARD state information related to Rx Operations Rename "state" field in UART_HandleTypeDef structure by "gstate": SMARTCARD state 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: (#) 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 ## License Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of STMicroelectronics nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. For complete documentation on STM32 Microcontrollers visit www.st.com/STM32