Started working on the fw. Created LTR329 light sensor library. Fixed the error in SHT4x library.
This commit is contained in:
		
							
								
								
									
										6094
									
								
								fw/Drivers/CMSIS/Device/ST/STM32L0xx/Include/stm32l031xx.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6094
									
								
								fw/Drivers/CMSIS/Device/ST/STM32L0xx/Include/stm32l031xx.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										275
									
								
								fw/Drivers/CMSIS/Device/ST/STM32L0xx/Include/stm32l0xx.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										275
									
								
								fw/Drivers/CMSIS/Device/ST/STM32L0xx/Include/stm32l0xx.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,275 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx.h | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   CMSIS Cortex-M0+ Device Peripheral Access Layer Header File.  | ||||
|   *          This file contains all the peripheral register's definitions, bits  | ||||
|   *          definitions and memory mapping for STM32L0xx devices.             | ||||
|   *             | ||||
|   *          The file is the unique include file that the application programmer | ||||
|   *          is using in the C source code, usually in main.c. This file contains: | ||||
|   *           - Configuration section that allows to select: | ||||
|   *              - The device used in the target application | ||||
|   *              - To use or not the peripheral's drivers in application code(i.e.  | ||||
|   *                code will be based on direct access to peripheral's registers  | ||||
|   *                rather than drivers API), this option is controlled by  | ||||
|   *                "#define USE_HAL_DRIVER" | ||||
|   *   | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright(c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ******************************************************************************   | ||||
|   */  | ||||
|  | ||||
| /** @addtogroup CMSIS | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup stm32l0xx | ||||
|   * @{ | ||||
|   */ | ||||
|      | ||||
| #ifndef __STM32L0xx_H | ||||
| #define __STM32L0xx_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif /* __cplusplus */ | ||||
|     | ||||
| /** @addtogroup Library_configuration_section | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief STM32 Family | ||||
|   */ | ||||
| #if !defined (STM32L0) | ||||
| #define STM32L0 | ||||
| #endif /* STM32L0 */ | ||||
|  | ||||
| /* Uncomment the line below according to the target STM32 device used in your | ||||
|    application  | ||||
|   */ | ||||
|  | ||||
| #if !defined (STM32L010x4) && !defined (STM32L010x6) && !defined (STM32L010x8) && !defined (STM32L010xB) && \ | ||||
|     !defined (STM32L011xx) && !defined (STM32L021xx) && \ | ||||
|     !defined (STM32L031xx) && !defined (STM32L041xx) && \ | ||||
|     !defined (STM32L051xx) && !defined (STM32L052xx) && !defined (STM32L053xx) && \ | ||||
|     !defined (STM32L062xx) && !defined (STM32L063xx) && \ | ||||
|     !defined (STM32L071xx) && !defined (STM32L072xx) && !defined (STM32L073xx) && \ | ||||
|     !defined (STM32L081xx) && !defined (STM32L082xx) && !defined (STM32L083xx) | ||||
|   /* #define STM32L010x4 */   /*!< STM32L010K4, STM32L010F4 Devices                                                                                                                      */ | ||||
|   /* #define STM32L010x6 */   /*!< STM32L010C6 Devices                                                                                                                                   */ | ||||
|   /* #define STM32L010x8 */   /*!< STM32L010K8, STM32L010R8 Devices                                                                                                                      */ | ||||
|   /* #define STM32L010xB */   /*!< STM32L010RB Devices                                                                                                                                   */ | ||||
|   /* #define STM32L011xx */   /*!< STM32L031C6, STM32L031E6, STM32L031F6, STM32L031G6, STM32L031K6 Devices                                                                               */ | ||||
|   /* #define STM32L021xx */   /*!< STM32L021D4, STM32L021F4, STM32L021G4, STM32L021K4 Devices                                                                                            */ | ||||
|   /* #define STM32L031xx */   /*!< STM32L031C6, STM32L031E6, STM32L031F6, STM32L031G6, STM32L031K6 Devices                                                                               */ | ||||
|   /* #define STM32L041xx */   /*!< STM32L041C6, STM32L041K6, STM32L041G6, STM32L041F6, STM32L041E6 Devices                                                                               */ | ||||
|   /* #define STM32L051xx */   /*!< STM32L051K8, STM32L051C6, STM32L051C8, STM32L051R6, STM32L051R8, STM32L051K6, STM32L051T6, STM32L051T8 Devices                                        */ | ||||
|   /* #define STM32L052xx */   /*!< STM32L052K6, STM32L052K8, STM32L052C6, STM32L052C8, STM32L052R6, STM32L052R8, STM32L052T6, STM32L052T8 Devices                                        */ | ||||
|   /* #define STM32L053xx */   /*!< STM32L053C6, STM32L053C8, STM32L053R6, STM32L053R8 Devices                                                                                            */ | ||||
|   /* #define STM32L062xx */   /*!< STM32L062K8 Devices                                                                                                                                   */ | ||||
|   /* #define STM32L063xx */   /*!< STM32L063C8, STM32L063R8 Devices                                                                                                                      */ | ||||
|   /* #define STM32L071xx */   /*!< STM32L071V8, STM32L071K8, STM32L071VB, STM32L071RB, STM32L071CB, STM32L071KB, STM32L071VZ, STM32L071RZ, STM32L071CZ, STM32L071KZ, STM32L071C8 Devices */ | ||||
|   /* #define STM32L072xx */   /*!< STM32L072V8, STM32L072VB, STM32L072RB, STM32L072CB, STM32L072VZ, STM32L072RZ, STM32L072CZ, STM32L072KB, STM32L072KZ Devices                           */ | ||||
|   /* #define STM32L073xx */   /*!< STM32L073V8, STM32L073VB, STM32L073RB, STM32L073VZ, STM32L073RZ, STM32L073CB, STM32L073CZ Devices                                                     */ | ||||
|   /* #define STM32L081xx */   /*!< STM32L081CB, STM32L081CZ, STM32L081KZ Devices                                                                                                         */ | ||||
|   /* #define STM32L082xx */   /*!< STM32L082KB, STM32L082KZ, STM32L082CZ Devices                                                                                                         */ | ||||
|   /* #define STM32L083xx */   /*!< STM32L083V8, STM32L083VB, STM32L083RB, STM32L083VZ, STM32L083RZ, STM32L083CB, STM32L083CZ Devices                                                     */ | ||||
| #endif | ||||
|     | ||||
| /*  Tip: To avoid modifying this file each time you need to switch between these | ||||
|         devices, you can define the device in your toolchain compiler preprocessor. | ||||
|   */ | ||||
| #if !defined  (USE_HAL_DRIVER) | ||||
| /** | ||||
|  * @brief Comment the line below if you will not use the peripherals drivers. | ||||
|    In this case, these drivers will not be included and the application code will  | ||||
|    be based on direct access to peripherals registers  | ||||
|    */ | ||||
|   /*#define USE_HAL_DRIVER */ | ||||
| #endif /* USE_HAL_DRIVER */ | ||||
|  | ||||
| /** | ||||
|   * @brief CMSIS Device version number | ||||
|   */ | ||||
| #define __STM32L0xx_CMSIS_VERSION_MAIN   (0x01) /*!< [31:24] main version */ | ||||
| #define __STM32L0xx_CMSIS_VERSION_SUB1   (0x09) /*!< [23:16] sub1 version */ | ||||
| #define __STM32L0xx_CMSIS_VERSION_SUB2   (0x02) /*!< [15:8]  sub2 version */ | ||||
| #define __STM32L0xx_CMSIS_VERSION_RC     (0x00) /*!< [7:0]  release candidate */ | ||||
| #define __STM32L0xx_CMSIS_VERSION        ((__STM32L0xx_CMSIS_VERSION_MAIN     << 24)\ | ||||
|                                          |(__STM32L0xx_CMSIS_VERSION_SUB1 << 16)\ | ||||
|                                          |(__STM32L0xx_CMSIS_VERSION_SUB2 << 8 )\ | ||||
|                                          |(__STM32L0xx_CMSIS_VERSION_RC)) | ||||
|                                               | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup Device_Included | ||||
|   * @{ | ||||
|   */ | ||||
| #if defined(STM32L010xB) | ||||
|   #include "stm32l010xb.h" | ||||
| #elif defined(STM32L010x8) | ||||
|   #include "stm32l010x8.h" | ||||
| #elif defined(STM32L010x6) | ||||
|   #include "stm32l010x6.h" | ||||
| #elif defined(STM32L010x4) | ||||
|   #include "stm32l010x4.h" | ||||
| #elif defined(STM32L011xx) | ||||
|   #include "stm32l011xx.h" | ||||
| #elif defined(STM32L021xx) | ||||
|   #include "stm32l021xx.h" | ||||
| #elif defined(STM32L031xx) | ||||
|   #include "stm32l031xx.h" | ||||
| #elif defined(STM32L041xx) | ||||
|   #include "stm32l041xx.h" | ||||
| #elif defined(STM32L051xx) | ||||
|   #include "stm32l051xx.h" | ||||
| #elif defined(STM32L052xx) | ||||
|   #include "stm32l052xx.h" | ||||
| #elif defined(STM32L053xx) | ||||
|   #include "stm32l053xx.h" | ||||
| #elif defined(STM32L062xx) | ||||
|   #include "stm32l062xx.h" | ||||
| #elif defined(STM32L063xx) | ||||
|   #include "stm32l063xx.h" | ||||
| #elif defined(STM32L071xx) | ||||
|   #include "stm32l071xx.h" | ||||
| #elif defined(STM32L072xx) | ||||
|   #include "stm32l072xx.h" | ||||
| #elif defined(STM32L073xx) | ||||
|   #include "stm32l073xx.h" | ||||
| #elif defined(STM32L082xx) | ||||
|   #include "stm32l082xx.h" | ||||
| #elif defined(STM32L083xx) | ||||
|   #include "stm32l083xx.h" | ||||
| #elif defined(STM32L081xx) | ||||
|   #include "stm32l081xx.h" | ||||
| #else | ||||
|  #error "Please select first the target STM32L0xx device used in your application (in stm32l0xx.h file)" | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup Exported_types | ||||
|   * @{ | ||||
|   */  | ||||
| typedef enum  | ||||
| { | ||||
|   RESET = 0,  | ||||
|   SET = !RESET | ||||
| } FlagStatus, ITStatus; | ||||
|  | ||||
| typedef enum  | ||||
| { | ||||
|   DISABLE = 0,  | ||||
|   ENABLE = !DISABLE | ||||
| } FunctionalState; | ||||
| #define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) | ||||
|  | ||||
| typedef enum  | ||||
| { | ||||
|   SUCCESS = 0, | ||||
|   ERROR = !SUCCESS | ||||
| } ErrorStatus; | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
|  | ||||
| /** @addtogroup Exported_macro | ||||
|   * @{ | ||||
|   */ | ||||
| #define SET_BIT(REG, BIT)     ((REG) |= (BIT)) | ||||
|  | ||||
| #define CLEAR_BIT(REG, BIT)   ((REG) &= ~(BIT)) | ||||
|  | ||||
| #define READ_BIT(REG, BIT)    ((REG) & (BIT)) | ||||
|  | ||||
| #define CLEAR_REG(REG)        ((REG) = (0x0)) | ||||
|  | ||||
| #define WRITE_REG(REG, VAL)   ((REG) = (VAL)) | ||||
|  | ||||
| #define READ_REG(REG)         ((REG)) | ||||
|  | ||||
| #define MODIFY_REG(REG, CLEARMASK, SETMASK)  WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) | ||||
|  | ||||
| /* Use of interrupt control for register exclusive access */ | ||||
| /* Atomic 32-bit register access macro to set one or several bits */ | ||||
| #define ATOMIC_SET_BIT(REG, BIT)                             \ | ||||
|   do {                                                       \ | ||||
|     uint32_t primask;                                        \ | ||||
|     primask = __get_PRIMASK();                               \ | ||||
|     __set_PRIMASK(1);                                        \ | ||||
|     SET_BIT((REG), (BIT));                                   \ | ||||
|     __set_PRIMASK(primask);                                  \ | ||||
|   } while(0) | ||||
|  | ||||
| /* Atomic 32-bit register access macro to clear one or several bits */ | ||||
| #define ATOMIC_CLEAR_BIT(REG, BIT)                           \ | ||||
|   do {                                                       \ | ||||
|     uint32_t primask;                                        \ | ||||
|     primask = __get_PRIMASK();                               \ | ||||
|     __set_PRIMASK(1);                                        \ | ||||
|     CLEAR_BIT((REG), (BIT));                                 \ | ||||
|     __set_PRIMASK(primask);                                  \ | ||||
|   } while(0) | ||||
|  | ||||
| /* Atomic 32-bit register access macro to clear and set one or several bits */ | ||||
| #define ATOMIC_MODIFY_REG(REG, CLEARMSK, SETMASK)            \ | ||||
|   do {                                                       \ | ||||
|     uint32_t primask;                                        \ | ||||
|     primask = __get_PRIMASK();                               \ | ||||
|     __set_PRIMASK(1);                                        \ | ||||
|     MODIFY_REG((REG), (CLEARMSK), (SETMASK));                \ | ||||
|     __set_PRIMASK(primask);                                  \ | ||||
|   } while(0) | ||||
|  | ||||
| /* Atomic 16-bit register access macro to set one or several bits */ | ||||
| #define ATOMIC_SETH_BIT(REG, BIT) ATOMIC_SET_BIT(REG, BIT)                                   \ | ||||
|  | ||||
| /* Atomic 16-bit register access macro to clear one or several bits */ | ||||
| #define ATOMIC_CLEARH_BIT(REG, BIT) ATOMIC_CLEAR_BIT(REG, BIT)                               \ | ||||
|  | ||||
| /* Atomic 16-bit register access macro to clear and set one or several bits */ | ||||
| #define ATOMIC_MODIFYH_REG(REG, CLEARMSK, SETMASK) ATOMIC_MODIFY_REG(REG, CLEARMSK, SETMASK) \ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #if defined (USE_HAL_DRIVER) | ||||
|  #include "stm32l0xx_hal.h" | ||||
| #endif /* USE_HAL_DRIVER */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif /* __cplusplus */ | ||||
|  | ||||
| #endif /* __STM32L0xx_H */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|    | ||||
|  | ||||
|  | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										109
									
								
								fw/Drivers/CMSIS/Device/ST/STM32L0xx/Include/system_stm32l0xx.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								fw/Drivers/CMSIS/Device/ST/STM32L0xx/Include/system_stm32l0xx.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,109 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    system_stm32l0xx.h | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   CMSIS Cortex-M0+ Device Peripheral Access Layer System Header File. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright(c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup CMSIS | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup stm32l0xx_system | ||||
|   * @{ | ||||
|   */   | ||||
|    | ||||
| /** | ||||
|   * @brief Define to prevent recursive inclusion | ||||
|   */ | ||||
| #ifndef __SYSTEM_STM32L0XX_H | ||||
| #define __SYSTEM_STM32L0XX_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif  | ||||
|  | ||||
| /** @addtogroup STM32L0xx_System_Includes | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
|  | ||||
| /** @addtogroup STM32L0xx_System_Exported_types | ||||
|   * @{ | ||||
|   */ | ||||
|   /* This variable is updated in three ways: | ||||
|       1) by calling CMSIS function SystemCoreClockUpdate() | ||||
|       2) by calling HAL API function HAL_RCC_GetSysClockFreq() | ||||
|       3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency  | ||||
|          Note: If you use this function to configure the system clock; then there | ||||
|                is no need to call the 2 first functions listed above, since SystemCoreClock | ||||
|                variable is updated automatically. | ||||
|   */ | ||||
| extern uint32_t SystemCoreClock;          /*!< System Clock Frequency (Core Clock) */ | ||||
| /* | ||||
| */ | ||||
| extern const uint8_t AHBPrescTable[16];   /*!< AHB prescalers table values */ | ||||
| extern const uint8_t APBPrescTable[8];    /*!< APB prescalers table values */ | ||||
| extern const uint8_t PLLMulTable[9];      /*!< PLL multipiers table values */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup STM32L0xx_System_Exported_Constants | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup STM32L0xx_System_Exported_Macros | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup STM32L0xx_System_Exported_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|    | ||||
| extern void SystemInit(void); | ||||
| extern void SystemCoreClockUpdate(void); | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /*__SYSTEM_STM32L0XX_H */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|    | ||||
| /** | ||||
|   * @} | ||||
|   */   | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										83
									
								
								fw/Drivers/CMSIS/Device/ST/STM32L0xx/License.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								fw/Drivers/CMSIS/Device/ST/STM32L0xx/License.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| Apache License | ||||
|  Version 2.0, January 2004 | ||||
|  http://www.apache.org/licenses/ | ||||
|  | ||||
| TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
| 1. Definitions. | ||||
|  | ||||
| "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
| "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. | ||||
|  | ||||
| "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
| "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. | ||||
|  | ||||
| "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. | ||||
|  | ||||
| "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. | ||||
|  | ||||
| "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). | ||||
|  | ||||
| "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. | ||||
|  | ||||
| "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
| "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. | ||||
|  | ||||
| 2. Grant of Copyright License. | ||||
|  | ||||
| Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
| 3. Grant of Patent License. | ||||
|  | ||||
| Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. | ||||
|  | ||||
| 4. Redistribution. | ||||
|  | ||||
| You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: | ||||
| 1.You must give any other recipients of the Work or Derivative Works a copy of this License; and | ||||
| 2.You must cause any modified files to carry prominent notices stating that You changed the files; and | ||||
| 3.You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and | ||||
| 4.If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. | ||||
|  | ||||
| You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. | ||||
|  | ||||
| 5. Submission of Contributions. | ||||
|  | ||||
| Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. | ||||
|  | ||||
| 6. Trademarks. | ||||
|  | ||||
| This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
| 7. Disclaimer of Warranty. | ||||
|  | ||||
| Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
| 8. Limitation of Liability. | ||||
|  | ||||
| In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. | ||||
|  | ||||
| 9. Accepting Warranty or Additional Liability. | ||||
|  | ||||
| While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. | ||||
|  | ||||
| END OF TERMS AND CONDITIONS | ||||
|  | ||||
| APPENDIX: | ||||
|  | ||||
|    Copyright [2019] [STMicroelectronics] | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
							
								
								
									
										865
									
								
								fw/Drivers/CMSIS/Include/cmsis_armcc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										865
									
								
								fw/Drivers/CMSIS/Include/cmsis_armcc.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,865 @@ | ||||
| /**************************************************************************//** | ||||
|  * @file     cmsis_armcc.h | ||||
|  * @brief    CMSIS compiler ARMCC (Arm Compiler 5) header file | ||||
|  * @version  V5.0.4 | ||||
|  * @date     10. January 2018 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2009-2018 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the License); you may | ||||
|  * not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an AS IS BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #ifndef __CMSIS_ARMCC_H | ||||
| #define __CMSIS_ARMCC_H | ||||
|  | ||||
|  | ||||
| #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) | ||||
|   #error "Please use Arm Compiler Toolchain V4.0.677 or later!" | ||||
| #endif | ||||
|  | ||||
| /* CMSIS compiler control architecture macros */ | ||||
| #if ((defined (__TARGET_ARCH_6_M  ) && (__TARGET_ARCH_6_M   == 1)) || \ | ||||
|      (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M  == 1))   ) | ||||
|   #define __ARM_ARCH_6M__           1 | ||||
| #endif | ||||
|  | ||||
| #if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M  == 1)) | ||||
|   #define __ARM_ARCH_7M__           1 | ||||
| #endif | ||||
|  | ||||
| #if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) | ||||
|   #define __ARM_ARCH_7EM__          1 | ||||
| #endif | ||||
|  | ||||
|   /* __ARM_ARCH_8M_BASE__  not applicable */ | ||||
|   /* __ARM_ARCH_8M_MAIN__  not applicable */ | ||||
|  | ||||
|  | ||||
| /* CMSIS compiler specific defines */ | ||||
| #ifndef   __ASM | ||||
|   #define __ASM                                  __asm | ||||
| #endif | ||||
| #ifndef   __INLINE | ||||
|   #define __INLINE                               __inline | ||||
| #endif | ||||
| #ifndef   __STATIC_INLINE | ||||
|   #define __STATIC_INLINE                        static __inline | ||||
| #endif | ||||
| #ifndef   __STATIC_FORCEINLINE                  | ||||
|   #define __STATIC_FORCEINLINE                   static __forceinline | ||||
| #endif            | ||||
| #ifndef   __NO_RETURN | ||||
|   #define __NO_RETURN                            __declspec(noreturn) | ||||
| #endif | ||||
| #ifndef   __USED | ||||
|   #define __USED                                 __attribute__((used)) | ||||
| #endif | ||||
| #ifndef   __WEAK | ||||
|   #define __WEAK                                 __attribute__((weak)) | ||||
| #endif | ||||
| #ifndef   __PACKED | ||||
|   #define __PACKED                               __attribute__((packed)) | ||||
| #endif | ||||
| #ifndef   __PACKED_STRUCT | ||||
|   #define __PACKED_STRUCT                        __packed struct | ||||
| #endif | ||||
| #ifndef   __PACKED_UNION | ||||
|   #define __PACKED_UNION                         __packed union | ||||
| #endif | ||||
| #ifndef   __UNALIGNED_UINT32        /* deprecated */ | ||||
|   #define __UNALIGNED_UINT32(x)                  (*((__packed uint32_t *)(x))) | ||||
| #endif | ||||
| #ifndef   __UNALIGNED_UINT16_WRITE | ||||
|   #define __UNALIGNED_UINT16_WRITE(addr, val)    ((*((__packed uint16_t *)(addr))) = (val)) | ||||
| #endif | ||||
| #ifndef   __UNALIGNED_UINT16_READ | ||||
|   #define __UNALIGNED_UINT16_READ(addr)          (*((const __packed uint16_t *)(addr))) | ||||
| #endif | ||||
| #ifndef   __UNALIGNED_UINT32_WRITE | ||||
|   #define __UNALIGNED_UINT32_WRITE(addr, val)    ((*((__packed uint32_t *)(addr))) = (val)) | ||||
| #endif | ||||
| #ifndef   __UNALIGNED_UINT32_READ | ||||
|   #define __UNALIGNED_UINT32_READ(addr)          (*((const __packed uint32_t *)(addr))) | ||||
| #endif | ||||
| #ifndef   __ALIGNED | ||||
|   #define __ALIGNED(x)                           __attribute__((aligned(x))) | ||||
| #endif | ||||
| #ifndef   __RESTRICT | ||||
|   #define __RESTRICT                             __restrict | ||||
| #endif | ||||
|  | ||||
| /* ###########################  Core Function Access  ########################### */ | ||||
| /** \ingroup  CMSIS_Core_FunctionInterface | ||||
|     \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief   Enable IRQ Interrupts | ||||
|   \details Enables IRQ interrupts by clearing the I-bit in the CPSR. | ||||
|            Can only be executed in Privileged modes. | ||||
|  */ | ||||
| /* intrinsic void __enable_irq();     */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Disable IRQ Interrupts | ||||
|   \details Disables IRQ interrupts by setting the I-bit in the CPSR. | ||||
|            Can only be executed in Privileged modes. | ||||
|  */ | ||||
| /* intrinsic void __disable_irq();    */ | ||||
|  | ||||
| /** | ||||
|   \brief   Get Control Register | ||||
|   \details Returns the content of the Control Register. | ||||
|   \return               Control Register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_CONTROL(void) | ||||
| { | ||||
|   register uint32_t __regControl         __ASM("control"); | ||||
|   return(__regControl); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Control Register | ||||
|   \details Writes the given value to the Control Register. | ||||
|   \param [in]    control  Control Register value to set | ||||
|  */ | ||||
| __STATIC_INLINE void __set_CONTROL(uint32_t control) | ||||
| { | ||||
|   register uint32_t __regControl         __ASM("control"); | ||||
|   __regControl = control; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get IPSR Register | ||||
|   \details Returns the content of the IPSR Register. | ||||
|   \return               IPSR Register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_IPSR(void) | ||||
| { | ||||
|   register uint32_t __regIPSR          __ASM("ipsr"); | ||||
|   return(__regIPSR); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get APSR Register | ||||
|   \details Returns the content of the APSR Register. | ||||
|   \return               APSR Register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_APSR(void) | ||||
| { | ||||
|   register uint32_t __regAPSR          __ASM("apsr"); | ||||
|   return(__regAPSR); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get xPSR Register | ||||
|   \details Returns the content of the xPSR Register. | ||||
|   \return               xPSR Register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_xPSR(void) | ||||
| { | ||||
|   register uint32_t __regXPSR          __ASM("xpsr"); | ||||
|   return(__regXPSR); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Process Stack Pointer | ||||
|   \details Returns the current value of the Process Stack Pointer (PSP). | ||||
|   \return               PSP Register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_PSP(void) | ||||
| { | ||||
|   register uint32_t __regProcessStackPointer  __ASM("psp"); | ||||
|   return(__regProcessStackPointer); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Process Stack Pointer | ||||
|   \details Assigns the given value to the Process Stack Pointer (PSP). | ||||
|   \param [in]    topOfProcStack  Process Stack Pointer value to set | ||||
|  */ | ||||
| __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) | ||||
| { | ||||
|   register uint32_t __regProcessStackPointer  __ASM("psp"); | ||||
|   __regProcessStackPointer = topOfProcStack; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Main Stack Pointer | ||||
|   \details Returns the current value of the Main Stack Pointer (MSP). | ||||
|   \return               MSP Register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_MSP(void) | ||||
| { | ||||
|   register uint32_t __regMainStackPointer     __ASM("msp"); | ||||
|   return(__regMainStackPointer); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Main Stack Pointer | ||||
|   \details Assigns the given value to the Main Stack Pointer (MSP). | ||||
|   \param [in]    topOfMainStack  Main Stack Pointer value to set | ||||
|  */ | ||||
| __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) | ||||
| { | ||||
|   register uint32_t __regMainStackPointer     __ASM("msp"); | ||||
|   __regMainStackPointer = topOfMainStack; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Priority Mask | ||||
|   \details Returns the current state of the priority mask bit from the Priority Mask Register. | ||||
|   \return               Priority Mask value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_PRIMASK(void) | ||||
| { | ||||
|   register uint32_t __regPriMask         __ASM("primask"); | ||||
|   return(__regPriMask); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Priority Mask | ||||
|   \details Assigns the given value to the Priority Mask Register. | ||||
|   \param [in]    priMask  Priority Mask | ||||
|  */ | ||||
| __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) | ||||
| { | ||||
|   register uint32_t __regPriMask         __ASM("primask"); | ||||
|   __regPriMask = (priMask); | ||||
| } | ||||
|  | ||||
|  | ||||
| #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \ | ||||
|      (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) | ||||
|  | ||||
| /** | ||||
|   \brief   Enable FIQ | ||||
|   \details Enables FIQ interrupts by clearing the F-bit in the CPSR. | ||||
|            Can only be executed in Privileged modes. | ||||
|  */ | ||||
| #define __enable_fault_irq                __enable_fiq | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Disable FIQ | ||||
|   \details Disables FIQ interrupts by setting the F-bit in the CPSR. | ||||
|            Can only be executed in Privileged modes. | ||||
|  */ | ||||
| #define __disable_fault_irq               __disable_fiq | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Base Priority | ||||
|   \details Returns the current value of the Base Priority register. | ||||
|   \return               Base Priority register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t  __get_BASEPRI(void) | ||||
| { | ||||
|   register uint32_t __regBasePri         __ASM("basepri"); | ||||
|   return(__regBasePri); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Base Priority | ||||
|   \details Assigns the given value to the Base Priority register. | ||||
|   \param [in]    basePri  Base Priority value to set | ||||
|  */ | ||||
| __STATIC_INLINE void __set_BASEPRI(uint32_t basePri) | ||||
| { | ||||
|   register uint32_t __regBasePri         __ASM("basepri"); | ||||
|   __regBasePri = (basePri & 0xFFU); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Base Priority with condition | ||||
|   \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, | ||||
|            or the new value increases the BASEPRI priority level. | ||||
|   \param [in]    basePri  Base Priority value to set | ||||
|  */ | ||||
| __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) | ||||
| { | ||||
|   register uint32_t __regBasePriMax      __ASM("basepri_max"); | ||||
|   __regBasePriMax = (basePri & 0xFFU); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Fault Mask | ||||
|   \details Returns the current value of the Fault Mask register. | ||||
|   \return               Fault Mask register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_FAULTMASK(void) | ||||
| { | ||||
|   register uint32_t __regFaultMask       __ASM("faultmask"); | ||||
|   return(__regFaultMask); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Fault Mask | ||||
|   \details Assigns the given value to the Fault Mask register. | ||||
|   \param [in]    faultMask  Fault Mask value to set | ||||
|  */ | ||||
| __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) | ||||
| { | ||||
|   register uint32_t __regFaultMask       __ASM("faultmask"); | ||||
|   __regFaultMask = (faultMask & (uint32_t)1U); | ||||
| } | ||||
|  | ||||
| #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \ | ||||
|            (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get FPSCR | ||||
|   \details Returns the current value of the Floating Point Status/Control register. | ||||
|   \return               Floating Point Status/Control register value | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __get_FPSCR(void) | ||||
| { | ||||
| #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ | ||||
|      (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     ) | ||||
|   register uint32_t __regfpscr         __ASM("fpscr"); | ||||
|   return(__regfpscr); | ||||
| #else | ||||
|    return(0U); | ||||
| #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set FPSCR | ||||
|   \details Assigns the given value to the Floating Point Status/Control register. | ||||
|   \param [in]    fpscr  Floating Point Status/Control value to set | ||||
|  */ | ||||
| __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) | ||||
| { | ||||
| #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ | ||||
|      (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     ) | ||||
|   register uint32_t __regfpscr         __ASM("fpscr"); | ||||
|   __regfpscr = (fpscr); | ||||
| #else | ||||
|   (void)fpscr; | ||||
| #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /*@} end of CMSIS_Core_RegAccFunctions */ | ||||
|  | ||||
|  | ||||
| /* ##########################  Core Instruction Access  ######################### */ | ||||
| /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface | ||||
|   Access to dedicated instructions | ||||
|   @{ | ||||
| */ | ||||
|  | ||||
| /** | ||||
|   \brief   No Operation | ||||
|   \details No Operation does nothing. This instruction can be used for code alignment purposes. | ||||
|  */ | ||||
| #define __NOP                             __nop | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Wait For Interrupt | ||||
|   \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. | ||||
|  */ | ||||
| #define __WFI                             __wfi | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Wait For Event | ||||
|   \details Wait For Event is a hint instruction that permits the processor to enter | ||||
|            a low-power state until one of a number of events occurs. | ||||
|  */ | ||||
| #define __WFE                             __wfe | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Send Event | ||||
|   \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. | ||||
|  */ | ||||
| #define __SEV                             __sev | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Instruction Synchronization Barrier | ||||
|   \details Instruction Synchronization Barrier flushes the pipeline in the processor, | ||||
|            so that all instructions following the ISB are fetched from cache or memory, | ||||
|            after the instruction has been completed. | ||||
|  */ | ||||
| #define __ISB() do {\ | ||||
|                    __schedule_barrier();\ | ||||
|                    __isb(0xF);\ | ||||
|                    __schedule_barrier();\ | ||||
|                 } while (0U) | ||||
|  | ||||
| /** | ||||
|   \brief   Data Synchronization Barrier | ||||
|   \details Acts as a special kind of Data Memory Barrier. | ||||
|            It completes when all explicit memory accesses before this instruction complete. | ||||
|  */ | ||||
| #define __DSB() do {\ | ||||
|                    __schedule_barrier();\ | ||||
|                    __dsb(0xF);\ | ||||
|                    __schedule_barrier();\ | ||||
|                 } while (0U) | ||||
|  | ||||
| /** | ||||
|   \brief   Data Memory Barrier | ||||
|   \details Ensures the apparent order of the explicit memory operations before | ||||
|            and after the instruction, without ensuring their completion. | ||||
|  */ | ||||
| #define __DMB() do {\ | ||||
|                    __schedule_barrier();\ | ||||
|                    __dmb(0xF);\ | ||||
|                    __schedule_barrier();\ | ||||
|                 } while (0U) | ||||
|  | ||||
|                    | ||||
| /** | ||||
|   \brief   Reverse byte order (32 bit) | ||||
|   \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. | ||||
|   \param [in]    value  Value to reverse | ||||
|   \return               Reversed value | ||||
|  */ | ||||
| #define __REV                             __rev | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Reverse byte order (16 bit) | ||||
|   \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. | ||||
|   \param [in]    value  Value to reverse | ||||
|   \return               Reversed value | ||||
|  */ | ||||
| #ifndef __NO_EMBEDDED_ASM | ||||
| __attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) | ||||
| { | ||||
|   rev16 r0, r0 | ||||
|   bx lr | ||||
| } | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Reverse byte order (16 bit) | ||||
|   \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. | ||||
|   \param [in]    value  Value to reverse | ||||
|   \return               Reversed value | ||||
|  */ | ||||
| #ifndef __NO_EMBEDDED_ASM | ||||
| __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) | ||||
| { | ||||
|   revsh r0, r0 | ||||
|   bx lr | ||||
| } | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Rotate Right in unsigned value (32 bit) | ||||
|   \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. | ||||
|   \param [in]    op1  Value to rotate | ||||
|   \param [in]    op2  Number of Bits to rotate | ||||
|   \return               Rotated value | ||||
|  */ | ||||
| #define __ROR                             __ror | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Breakpoint | ||||
|   \details Causes the processor to enter Debug state. | ||||
|            Debug tools can use this to investigate system state when the instruction at a particular address is reached. | ||||
|   \param [in]    value  is ignored by the processor. | ||||
|                  If required, a debugger can use it to store additional information about the breakpoint. | ||||
|  */ | ||||
| #define __BKPT(value)                       __breakpoint(value) | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Reverse bit order of value | ||||
|   \details Reverses the bit order of the given value. | ||||
|   \param [in]    value  Value to reverse | ||||
|   \return               Reversed value | ||||
|  */ | ||||
| #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \ | ||||
|      (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) | ||||
|   #define __RBIT                          __rbit | ||||
| #else | ||||
| __attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) | ||||
| { | ||||
|   uint32_t result; | ||||
|   uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ | ||||
|  | ||||
|   result = value;                      /* r will be reversed bits of v; first get LSB of v */ | ||||
|   for (value >>= 1U; value != 0U; value >>= 1U) | ||||
|   { | ||||
|     result <<= 1U; | ||||
|     result |= value & 1U; | ||||
|     s--; | ||||
|   } | ||||
|   result <<= s;                        /* shift when v's highest bits are zero */ | ||||
|   return result; | ||||
| } | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Count leading zeros | ||||
|   \details Counts the number of leading zeros of a data value. | ||||
|   \param [in]  value  Value to count the leading zeros | ||||
|   \return             number of leading zeros in value | ||||
|  */ | ||||
| #define __CLZ                             __clz | ||||
|  | ||||
|  | ||||
| #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \ | ||||
|      (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) | ||||
|  | ||||
| /** | ||||
|   \brief   LDR Exclusive (8 bit) | ||||
|   \details Executes a exclusive LDR instruction for 8 bit value. | ||||
|   \param [in]    ptr  Pointer to data | ||||
|   \return             value of type uint8_t at (*ptr) | ||||
|  */ | ||||
| #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | ||||
|   #define __LDREXB(ptr)                                                        ((uint8_t ) __ldrex(ptr)) | ||||
| #else | ||||
|   #define __LDREXB(ptr)          _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr))  _Pragma("pop") | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   LDR Exclusive (16 bit) | ||||
|   \details Executes a exclusive LDR instruction for 16 bit values. | ||||
|   \param [in]    ptr  Pointer to data | ||||
|   \return        value of type uint16_t at (*ptr) | ||||
|  */ | ||||
| #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | ||||
|   #define __LDREXH(ptr)                                                        ((uint16_t) __ldrex(ptr)) | ||||
| #else | ||||
|   #define __LDREXH(ptr)          _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr))  _Pragma("pop") | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   LDR Exclusive (32 bit) | ||||
|   \details Executes a exclusive LDR instruction for 32 bit values. | ||||
|   \param [in]    ptr  Pointer to data | ||||
|   \return        value of type uint32_t at (*ptr) | ||||
|  */ | ||||
| #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | ||||
|   #define __LDREXW(ptr)                                                        ((uint32_t ) __ldrex(ptr)) | ||||
| #else | ||||
|   #define __LDREXW(ptr)          _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr))  _Pragma("pop") | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   STR Exclusive (8 bit) | ||||
|   \details Executes a exclusive STR instruction for 8 bit values. | ||||
|   \param [in]  value  Value to store | ||||
|   \param [in]    ptr  Pointer to location | ||||
|   \return          0  Function succeeded | ||||
|   \return          1  Function failed | ||||
|  */ | ||||
| #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | ||||
|   #define __STREXB(value, ptr)                                                 __strex(value, ptr) | ||||
| #else | ||||
|   #define __STREXB(value, ptr)   _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr)        _Pragma("pop") | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   STR Exclusive (16 bit) | ||||
|   \details Executes a exclusive STR instruction for 16 bit values. | ||||
|   \param [in]  value  Value to store | ||||
|   \param [in]    ptr  Pointer to location | ||||
|   \return          0  Function succeeded | ||||
|   \return          1  Function failed | ||||
|  */ | ||||
| #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | ||||
|   #define __STREXH(value, ptr)                                                 __strex(value, ptr) | ||||
| #else | ||||
|   #define __STREXH(value, ptr)   _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr)        _Pragma("pop") | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   STR Exclusive (32 bit) | ||||
|   \details Executes a exclusive STR instruction for 32 bit values. | ||||
|   \param [in]  value  Value to store | ||||
|   \param [in]    ptr  Pointer to location | ||||
|   \return          0  Function succeeded | ||||
|   \return          1  Function failed | ||||
|  */ | ||||
| #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | ||||
|   #define __STREXW(value, ptr)                                                 __strex(value, ptr) | ||||
| #else | ||||
|   #define __STREXW(value, ptr)   _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr)        _Pragma("pop") | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Remove the exclusive lock | ||||
|   \details Removes the exclusive lock which is created by LDREX. | ||||
|  */ | ||||
| #define __CLREX                           __clrex | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Signed Saturate | ||||
|   \details Saturates a signed value. | ||||
|   \param [in]  value  Value to be saturated | ||||
|   \param [in]    sat  Bit position to saturate to (1..32) | ||||
|   \return             Saturated value | ||||
|  */ | ||||
| #define __SSAT                            __ssat | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Unsigned Saturate | ||||
|   \details Saturates an unsigned value. | ||||
|   \param [in]  value  Value to be saturated | ||||
|   \param [in]    sat  Bit position to saturate to (0..31) | ||||
|   \return             Saturated value | ||||
|  */ | ||||
| #define __USAT                            __usat | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Rotate Right with Extend (32 bit) | ||||
|   \details Moves each bit of a bitstring right by one bit. | ||||
|            The carry input is shifted in at the left end of the bitstring. | ||||
|   \param [in]    value  Value to rotate | ||||
|   \return               Rotated value | ||||
|  */ | ||||
| #ifndef __NO_EMBEDDED_ASM | ||||
| __attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) | ||||
| { | ||||
|   rrx r0, r0 | ||||
|   bx lr | ||||
| } | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   LDRT Unprivileged (8 bit) | ||||
|   \details Executes a Unprivileged LDRT instruction for 8 bit value. | ||||
|   \param [in]    ptr  Pointer to data | ||||
|   \return             value of type uint8_t at (*ptr) | ||||
|  */ | ||||
| #define __LDRBT(ptr)                      ((uint8_t )  __ldrt(ptr)) | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   LDRT Unprivileged (16 bit) | ||||
|   \details Executes a Unprivileged LDRT instruction for 16 bit values. | ||||
|   \param [in]    ptr  Pointer to data | ||||
|   \return        value of type uint16_t at (*ptr) | ||||
|  */ | ||||
| #define __LDRHT(ptr)                      ((uint16_t)  __ldrt(ptr)) | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   LDRT Unprivileged (32 bit) | ||||
|   \details Executes a Unprivileged LDRT instruction for 32 bit values. | ||||
|   \param [in]    ptr  Pointer to data | ||||
|   \return        value of type uint32_t at (*ptr) | ||||
|  */ | ||||
| #define __LDRT(ptr)                       ((uint32_t ) __ldrt(ptr)) | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   STRT Unprivileged (8 bit) | ||||
|   \details Executes a Unprivileged STRT instruction for 8 bit values. | ||||
|   \param [in]  value  Value to store | ||||
|   \param [in]    ptr  Pointer to location | ||||
|  */ | ||||
| #define __STRBT(value, ptr)               __strt(value, ptr) | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   STRT Unprivileged (16 bit) | ||||
|   \details Executes a Unprivileged STRT instruction for 16 bit values. | ||||
|   \param [in]  value  Value to store | ||||
|   \param [in]    ptr  Pointer to location | ||||
|  */ | ||||
| #define __STRHT(value, ptr)               __strt(value, ptr) | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   STRT Unprivileged (32 bit) | ||||
|   \details Executes a Unprivileged STRT instruction for 32 bit values. | ||||
|   \param [in]  value  Value to store | ||||
|   \param [in]    ptr  Pointer to location | ||||
|  */ | ||||
| #define __STRT(value, ptr)                __strt(value, ptr) | ||||
|  | ||||
| #else  /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \ | ||||
|            (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */ | ||||
|  | ||||
| /** | ||||
|   \brief   Signed Saturate | ||||
|   \details Saturates a signed value. | ||||
|   \param [in]  value  Value to be saturated | ||||
|   \param [in]    sat  Bit position to saturate to (1..32) | ||||
|   \return             Saturated value | ||||
|  */ | ||||
| __attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) | ||||
| { | ||||
|   if ((sat >= 1U) && (sat <= 32U)) | ||||
|   { | ||||
|     const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); | ||||
|     const int32_t min = -1 - max ; | ||||
|     if (val > max) | ||||
|     { | ||||
|       return max; | ||||
|     } | ||||
|     else if (val < min) | ||||
|     { | ||||
|       return min; | ||||
|     } | ||||
|   } | ||||
|   return val; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   \brief   Unsigned Saturate | ||||
|   \details Saturates an unsigned value. | ||||
|   \param [in]  value  Value to be saturated | ||||
|   \param [in]    sat  Bit position to saturate to (0..31) | ||||
|   \return             Saturated value | ||||
|  */ | ||||
| __attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) | ||||
| { | ||||
|   if (sat <= 31U) | ||||
|   { | ||||
|     const uint32_t max = ((1U << sat) - 1U); | ||||
|     if (val > (int32_t)max) | ||||
|     { | ||||
|       return max; | ||||
|     } | ||||
|     else if (val < 0) | ||||
|     { | ||||
|       return 0U; | ||||
|     } | ||||
|   } | ||||
|   return (uint32_t)val; | ||||
| } | ||||
|  | ||||
| #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \ | ||||
|            (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */ | ||||
|  | ||||
| /*@}*/ /* end of group CMSIS_Core_InstructionInterface */ | ||||
|  | ||||
|  | ||||
| /* ###################  Compiler specific Intrinsics  ########################### */ | ||||
| /** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics | ||||
|   Access to dedicated SIMD instructions | ||||
|   @{ | ||||
| */ | ||||
|  | ||||
| #if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) | ||||
|  | ||||
| #define __SADD8                           __sadd8 | ||||
| #define __QADD8                           __qadd8 | ||||
| #define __SHADD8                          __shadd8 | ||||
| #define __UADD8                           __uadd8 | ||||
| #define __UQADD8                          __uqadd8 | ||||
| #define __UHADD8                          __uhadd8 | ||||
| #define __SSUB8                           __ssub8 | ||||
| #define __QSUB8                           __qsub8 | ||||
| #define __SHSUB8                          __shsub8 | ||||
| #define __USUB8                           __usub8 | ||||
| #define __UQSUB8                          __uqsub8 | ||||
| #define __UHSUB8                          __uhsub8 | ||||
| #define __SADD16                          __sadd16 | ||||
| #define __QADD16                          __qadd16 | ||||
| #define __SHADD16                         __shadd16 | ||||
| #define __UADD16                          __uadd16 | ||||
| #define __UQADD16                         __uqadd16 | ||||
| #define __UHADD16                         __uhadd16 | ||||
| #define __SSUB16                          __ssub16 | ||||
| #define __QSUB16                          __qsub16 | ||||
| #define __SHSUB16                         __shsub16 | ||||
| #define __USUB16                          __usub16 | ||||
| #define __UQSUB16                         __uqsub16 | ||||
| #define __UHSUB16                         __uhsub16 | ||||
| #define __SASX                            __sasx | ||||
| #define __QASX                            __qasx | ||||
| #define __SHASX                           __shasx | ||||
| #define __UASX                            __uasx | ||||
| #define __UQASX                           __uqasx | ||||
| #define __UHASX                           __uhasx | ||||
| #define __SSAX                            __ssax | ||||
| #define __QSAX                            __qsax | ||||
| #define __SHSAX                           __shsax | ||||
| #define __USAX                            __usax | ||||
| #define __UQSAX                           __uqsax | ||||
| #define __UHSAX                           __uhsax | ||||
| #define __USAD8                           __usad8 | ||||
| #define __USADA8                          __usada8 | ||||
| #define __SSAT16                          __ssat16 | ||||
| #define __USAT16                          __usat16 | ||||
| #define __UXTB16                          __uxtb16 | ||||
| #define __UXTAB16                         __uxtab16 | ||||
| #define __SXTB16                          __sxtb16 | ||||
| #define __SXTAB16                         __sxtab16 | ||||
| #define __SMUAD                           __smuad | ||||
| #define __SMUADX                          __smuadx | ||||
| #define __SMLAD                           __smlad | ||||
| #define __SMLADX                          __smladx | ||||
| #define __SMLALD                          __smlald | ||||
| #define __SMLALDX                         __smlaldx | ||||
| #define __SMUSD                           __smusd | ||||
| #define __SMUSDX                          __smusdx | ||||
| #define __SMLSD                           __smlsd | ||||
| #define __SMLSDX                          __smlsdx | ||||
| #define __SMLSLD                          __smlsld | ||||
| #define __SMLSLDX                         __smlsldx | ||||
| #define __SEL                             __sel | ||||
| #define __QADD                            __qadd | ||||
| #define __QSUB                            __qsub | ||||
|  | ||||
| #define __PKHBT(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0x0000FFFFUL) |  \ | ||||
|                                            ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL)  ) | ||||
|  | ||||
| #define __PKHTB(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0xFFFF0000UL) |  \ | ||||
|                                            ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL)  ) | ||||
|  | ||||
| #define __SMMLA(ARG1,ARG2,ARG3)          ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ | ||||
|                                                       ((int64_t)(ARG3) << 32U)     ) >> 32U)) | ||||
|  | ||||
| #endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */ | ||||
| /*@} end of group CMSIS_SIMD_intrinsics */ | ||||
|  | ||||
|  | ||||
| #endif /* __CMSIS_ARMCC_H */ | ||||
							
								
								
									
										1869
									
								
								fw/Drivers/CMSIS/Include/cmsis_armclang.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1869
									
								
								fw/Drivers/CMSIS/Include/cmsis_armclang.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										266
									
								
								fw/Drivers/CMSIS/Include/cmsis_compiler.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										266
									
								
								fw/Drivers/CMSIS/Include/cmsis_compiler.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,266 @@ | ||||
| /**************************************************************************//** | ||||
|  * @file     cmsis_compiler.h | ||||
|  * @brief    CMSIS compiler generic header file | ||||
|  * @version  V5.0.4 | ||||
|  * @date     10. January 2018 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2009-2018 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the License); you may | ||||
|  * not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an AS IS BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #ifndef __CMSIS_COMPILER_H | ||||
| #define __CMSIS_COMPILER_H | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| /* | ||||
|  * Arm Compiler 4/5 | ||||
|  */ | ||||
| #if   defined ( __CC_ARM ) | ||||
|   #include "cmsis_armcc.h" | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Arm Compiler 6 (armclang) | ||||
|  */ | ||||
| #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) | ||||
|   #include "cmsis_armclang.h" | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * GNU Compiler | ||||
|  */ | ||||
| #elif defined ( __GNUC__ ) | ||||
|   #include "cmsis_gcc.h" | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * IAR Compiler | ||||
|  */ | ||||
| #elif defined ( __ICCARM__ ) | ||||
|   #include <cmsis_iccarm.h> | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * TI Arm Compiler | ||||
|  */ | ||||
| #elif defined ( __TI_ARM__ ) | ||||
|   #include <cmsis_ccs.h> | ||||
|  | ||||
|   #ifndef   __ASM | ||||
|     #define __ASM                                  __asm | ||||
|   #endif | ||||
|   #ifndef   __INLINE | ||||
|     #define __INLINE                               inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_INLINE | ||||
|     #define __STATIC_INLINE                        static inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_FORCEINLINE | ||||
|     #define __STATIC_FORCEINLINE                   __STATIC_INLINE | ||||
|   #endif | ||||
|   #ifndef   __NO_RETURN | ||||
|     #define __NO_RETURN                            __attribute__((noreturn)) | ||||
|   #endif | ||||
|   #ifndef   __USED | ||||
|     #define __USED                                 __attribute__((used)) | ||||
|   #endif | ||||
|   #ifndef   __WEAK | ||||
|     #define __WEAK                                 __attribute__((weak)) | ||||
|   #endif | ||||
|   #ifndef   __PACKED | ||||
|     #define __PACKED                               __attribute__((packed)) | ||||
|   #endif | ||||
|   #ifndef   __PACKED_STRUCT | ||||
|     #define __PACKED_STRUCT                        struct __attribute__((packed)) | ||||
|   #endif | ||||
|   #ifndef   __PACKED_UNION | ||||
|     #define __PACKED_UNION                         union __attribute__((packed)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32        /* deprecated */ | ||||
|     struct __attribute__((packed)) T_UINT32 { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_WRITE | ||||
|     __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_READ | ||||
|     __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_WRITE | ||||
|     __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_READ | ||||
|     __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __ALIGNED | ||||
|     #define __ALIGNED(x)                           __attribute__((aligned(x))) | ||||
|   #endif | ||||
|   #ifndef   __RESTRICT | ||||
|     #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. | ||||
|     #define __RESTRICT | ||||
|   #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * TASKING Compiler | ||||
|  */ | ||||
| #elif defined ( __TASKING__ ) | ||||
|   /* | ||||
|    * The CMSIS functions have been implemented as intrinsics in the compiler. | ||||
|    * Please use "carm -?i" to get an up to date list of all intrinsics, | ||||
|    * Including the CMSIS ones. | ||||
|    */ | ||||
|  | ||||
|   #ifndef   __ASM | ||||
|     #define __ASM                                  __asm | ||||
|   #endif | ||||
|   #ifndef   __INLINE | ||||
|     #define __INLINE                               inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_INLINE | ||||
|     #define __STATIC_INLINE                        static inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_FORCEINLINE | ||||
|     #define __STATIC_FORCEINLINE                   __STATIC_INLINE | ||||
|   #endif | ||||
|   #ifndef   __NO_RETURN | ||||
|     #define __NO_RETURN                            __attribute__((noreturn)) | ||||
|   #endif | ||||
|   #ifndef   __USED | ||||
|     #define __USED                                 __attribute__((used)) | ||||
|   #endif | ||||
|   #ifndef   __WEAK | ||||
|     #define __WEAK                                 __attribute__((weak)) | ||||
|   #endif | ||||
|   #ifndef   __PACKED | ||||
|     #define __PACKED                               __packed__ | ||||
|   #endif | ||||
|   #ifndef   __PACKED_STRUCT | ||||
|     #define __PACKED_STRUCT                        struct __packed__ | ||||
|   #endif | ||||
|   #ifndef   __PACKED_UNION | ||||
|     #define __PACKED_UNION                         union __packed__ | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32        /* deprecated */ | ||||
|     struct __packed__ T_UINT32 { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_WRITE | ||||
|     __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_READ | ||||
|     __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_WRITE | ||||
|     __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_READ | ||||
|     __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __ALIGNED | ||||
|     #define __ALIGNED(x)              __align(x) | ||||
|   #endif | ||||
|   #ifndef   __RESTRICT | ||||
|     #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. | ||||
|     #define __RESTRICT | ||||
|   #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * COSMIC Compiler | ||||
|  */ | ||||
| #elif defined ( __CSMC__ ) | ||||
|    #include <cmsis_csm.h> | ||||
|  | ||||
|  #ifndef   __ASM | ||||
|     #define __ASM                                  _asm | ||||
|   #endif | ||||
|   #ifndef   __INLINE | ||||
|     #define __INLINE                               inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_INLINE | ||||
|     #define __STATIC_INLINE                        static inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_FORCEINLINE | ||||
|     #define __STATIC_FORCEINLINE                   __STATIC_INLINE | ||||
|   #endif | ||||
|   #ifndef   __NO_RETURN | ||||
|     // NO RETURN is automatically detected hence no warning here | ||||
|     #define __NO_RETURN | ||||
|   #endif | ||||
|   #ifndef   __USED | ||||
|     #warning No compiler specific solution for __USED. __USED is ignored. | ||||
|     #define __USED | ||||
|   #endif | ||||
|   #ifndef   __WEAK | ||||
|     #define __WEAK                                 __weak | ||||
|   #endif | ||||
|   #ifndef   __PACKED | ||||
|     #define __PACKED                               @packed | ||||
|   #endif | ||||
|   #ifndef   __PACKED_STRUCT | ||||
|     #define __PACKED_STRUCT                        @packed struct | ||||
|   #endif | ||||
|   #ifndef   __PACKED_UNION | ||||
|     #define __PACKED_UNION                         @packed union | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32        /* deprecated */ | ||||
|     @packed struct T_UINT32 { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_WRITE | ||||
|     __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_READ | ||||
|     __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_WRITE | ||||
|     __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_READ | ||||
|     __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __ALIGNED | ||||
|     #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. | ||||
|     #define __ALIGNED(x) | ||||
|   #endif | ||||
|   #ifndef   __RESTRICT | ||||
|     #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. | ||||
|     #define __RESTRICT | ||||
|   #endif | ||||
|  | ||||
|  | ||||
| #else | ||||
|   #error Unknown compiler. | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #endif /* __CMSIS_COMPILER_H */ | ||||
|  | ||||
							
								
								
									
										2085
									
								
								fw/Drivers/CMSIS/Include/cmsis_gcc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2085
									
								
								fw/Drivers/CMSIS/Include/cmsis_gcc.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										935
									
								
								fw/Drivers/CMSIS/Include/cmsis_iccarm.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										935
									
								
								fw/Drivers/CMSIS/Include/cmsis_iccarm.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,935 @@ | ||||
| /**************************************************************************//** | ||||
|  * @file     cmsis_iccarm.h | ||||
|  * @brief    CMSIS compiler ICCARM (IAR Compiler for Arm) header file | ||||
|  * @version  V5.0.7 | ||||
|  * @date     19. June 2018 | ||||
|  ******************************************************************************/ | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // | ||||
| // Copyright (c) 2017-2018 IAR Systems | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License") | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
| // | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
|  | ||||
| #ifndef __CMSIS_ICCARM_H__ | ||||
| #define __CMSIS_ICCARM_H__ | ||||
|  | ||||
| #ifndef __ICCARM__ | ||||
|   #error This file should only be compiled by ICCARM | ||||
| #endif | ||||
|  | ||||
| #pragma system_include | ||||
|  | ||||
| #define __IAR_FT _Pragma("inline=forced") __intrinsic | ||||
|  | ||||
| #if (__VER__ >= 8000000) | ||||
|   #define __ICCARM_V8 1 | ||||
| #else | ||||
|   #define __ICCARM_V8 0 | ||||
| #endif | ||||
|  | ||||
| #ifndef __ALIGNED | ||||
|   #if __ICCARM_V8 | ||||
|     #define __ALIGNED(x) __attribute__((aligned(x))) | ||||
|   #elif (__VER__ >= 7080000) | ||||
|     /* Needs IAR language extensions */ | ||||
|     #define __ALIGNED(x) __attribute__((aligned(x))) | ||||
|   #else | ||||
|     #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. | ||||
|     #define __ALIGNED(x) | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* Define compiler macros for CPU architecture, used in CMSIS 5. | ||||
|  */ | ||||
| #if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ | ||||
| /* Macros already defined */ | ||||
| #else | ||||
|   #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) | ||||
|     #define __ARM_ARCH_8M_MAIN__ 1 | ||||
|   #elif defined(__ARM8M_BASELINE__) | ||||
|     #define __ARM_ARCH_8M_BASE__ 1 | ||||
|   #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' | ||||
|     #if __ARM_ARCH == 6 | ||||
|       #define __ARM_ARCH_6M__ 1 | ||||
|     #elif __ARM_ARCH == 7 | ||||
|       #if __ARM_FEATURE_DSP | ||||
|         #define __ARM_ARCH_7EM__ 1 | ||||
|       #else | ||||
|         #define __ARM_ARCH_7M__ 1 | ||||
|       #endif | ||||
|     #endif /* __ARM_ARCH */ | ||||
|   #endif /* __ARM_ARCH_PROFILE == 'M' */ | ||||
| #endif | ||||
|  | ||||
| /* Alternativ core deduction for older ICCARM's */ | ||||
| #if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ | ||||
|     !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) | ||||
|   #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) | ||||
|     #define __ARM_ARCH_6M__ 1 | ||||
|   #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) | ||||
|     #define __ARM_ARCH_7M__ 1 | ||||
|   #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) | ||||
|     #define __ARM_ARCH_7EM__  1 | ||||
|   #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) | ||||
|     #define __ARM_ARCH_8M_BASE__ 1 | ||||
|   #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) | ||||
|     #define __ARM_ARCH_8M_MAIN__ 1 | ||||
|   #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) | ||||
|     #define __ARM_ARCH_8M_MAIN__ 1 | ||||
|   #else | ||||
|     #error "Unknown target." | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
| #if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 | ||||
|   #define __IAR_M0_FAMILY  1 | ||||
| #elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 | ||||
|   #define __IAR_M0_FAMILY  1 | ||||
| #else | ||||
|   #define __IAR_M0_FAMILY  0 | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifndef __ASM | ||||
|   #define __ASM __asm | ||||
| #endif | ||||
|  | ||||
| #ifndef __INLINE | ||||
|   #define __INLINE inline | ||||
| #endif | ||||
|  | ||||
| #ifndef   __NO_RETURN | ||||
|   #if __ICCARM_V8 | ||||
|     #define __NO_RETURN __attribute__((__noreturn__)) | ||||
|   #else | ||||
|     #define __NO_RETURN _Pragma("object_attribute=__noreturn") | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef   __PACKED | ||||
|   #if __ICCARM_V8 | ||||
|     #define __PACKED __attribute__((packed, aligned(1))) | ||||
|   #else | ||||
|     /* Needs IAR language extensions */ | ||||
|     #define __PACKED __packed | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef   __PACKED_STRUCT | ||||
|   #if __ICCARM_V8 | ||||
|     #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) | ||||
|   #else | ||||
|     /* Needs IAR language extensions */ | ||||
|     #define __PACKED_STRUCT __packed struct | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef   __PACKED_UNION | ||||
|   #if __ICCARM_V8 | ||||
|     #define __PACKED_UNION union __attribute__((packed, aligned(1))) | ||||
|   #else | ||||
|     /* Needs IAR language extensions */ | ||||
|     #define __PACKED_UNION __packed union | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef   __RESTRICT | ||||
|   #define __RESTRICT            __restrict | ||||
| #endif | ||||
|  | ||||
| #ifndef   __STATIC_INLINE | ||||
|   #define __STATIC_INLINE       static inline | ||||
| #endif | ||||
|  | ||||
| #ifndef   __FORCEINLINE | ||||
|   #define __FORCEINLINE         _Pragma("inline=forced") | ||||
| #endif | ||||
|  | ||||
| #ifndef   __STATIC_FORCEINLINE | ||||
|   #define __STATIC_FORCEINLINE  __FORCEINLINE __STATIC_INLINE | ||||
| #endif | ||||
|  | ||||
| #ifndef __UNALIGNED_UINT16_READ | ||||
| #pragma language=save | ||||
| #pragma language=extended | ||||
| __IAR_FT uint16_t __iar_uint16_read(void const *ptr) | ||||
| { | ||||
|   return *(__packed uint16_t*)(ptr); | ||||
| } | ||||
| #pragma language=restore | ||||
| #define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifndef __UNALIGNED_UINT16_WRITE | ||||
| #pragma language=save | ||||
| #pragma language=extended | ||||
| __IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) | ||||
| { | ||||
|   *(__packed uint16_t*)(ptr) = val;; | ||||
| } | ||||
| #pragma language=restore | ||||
| #define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) | ||||
| #endif | ||||
|  | ||||
| #ifndef __UNALIGNED_UINT32_READ | ||||
| #pragma language=save | ||||
| #pragma language=extended | ||||
| __IAR_FT uint32_t __iar_uint32_read(void const *ptr) | ||||
| { | ||||
|   return *(__packed uint32_t*)(ptr); | ||||
| } | ||||
| #pragma language=restore | ||||
| #define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) | ||||
| #endif | ||||
|  | ||||
| #ifndef __UNALIGNED_UINT32_WRITE | ||||
| #pragma language=save | ||||
| #pragma language=extended | ||||
| __IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) | ||||
| { | ||||
|   *(__packed uint32_t*)(ptr) = val;; | ||||
| } | ||||
| #pragma language=restore | ||||
| #define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) | ||||
| #endif | ||||
|  | ||||
| #ifndef __UNALIGNED_UINT32   /* deprecated */ | ||||
| #pragma language=save | ||||
| #pragma language=extended | ||||
| __packed struct  __iar_u32 { uint32_t v; }; | ||||
| #pragma language=restore | ||||
| #define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) | ||||
| #endif | ||||
|  | ||||
| #ifndef   __USED | ||||
|   #if __ICCARM_V8 | ||||
|     #define __USED __attribute__((used)) | ||||
|   #else | ||||
|     #define __USED _Pragma("__root") | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef   __WEAK | ||||
|   #if __ICCARM_V8 | ||||
|     #define __WEAK __attribute__((weak)) | ||||
|   #else | ||||
|     #define __WEAK _Pragma("__weak") | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifndef __ICCARM_INTRINSICS_VERSION__ | ||||
|   #define __ICCARM_INTRINSICS_VERSION__  0 | ||||
| #endif | ||||
|  | ||||
| #if __ICCARM_INTRINSICS_VERSION__ == 2 | ||||
|  | ||||
|   #if defined(__CLZ) | ||||
|     #undef __CLZ | ||||
|   #endif | ||||
|   #if defined(__REVSH) | ||||
|     #undef __REVSH | ||||
|   #endif | ||||
|   #if defined(__RBIT) | ||||
|     #undef __RBIT | ||||
|   #endif | ||||
|   #if defined(__SSAT) | ||||
|     #undef __SSAT | ||||
|   #endif | ||||
|   #if defined(__USAT) | ||||
|     #undef __USAT | ||||
|   #endif | ||||
|  | ||||
|   #include "iccarm_builtin.h" | ||||
|  | ||||
|   #define __disable_fault_irq __iar_builtin_disable_fiq | ||||
|   #define __disable_irq       __iar_builtin_disable_interrupt | ||||
|   #define __enable_fault_irq  __iar_builtin_enable_fiq | ||||
|   #define __enable_irq        __iar_builtin_enable_interrupt | ||||
|   #define __arm_rsr           __iar_builtin_rsr | ||||
|   #define __arm_wsr           __iar_builtin_wsr | ||||
|  | ||||
|  | ||||
|   #define __get_APSR()                (__arm_rsr("APSR")) | ||||
|   #define __get_BASEPRI()             (__arm_rsr("BASEPRI")) | ||||
|   #define __get_CONTROL()             (__arm_rsr("CONTROL")) | ||||
|   #define __get_FAULTMASK()           (__arm_rsr("FAULTMASK")) | ||||
|  | ||||
|   #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ | ||||
|        (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     ) | ||||
|     #define __get_FPSCR()             (__arm_rsr("FPSCR")) | ||||
|     #define __set_FPSCR(VALUE)        (__arm_wsr("FPSCR", (VALUE))) | ||||
|   #else | ||||
|     #define __get_FPSCR()             ( 0 ) | ||||
|     #define __set_FPSCR(VALUE)        ((void)VALUE) | ||||
|   #endif | ||||
|  | ||||
|   #define __get_IPSR()                (__arm_rsr("IPSR")) | ||||
|   #define __get_MSP()                 (__arm_rsr("MSP")) | ||||
|   #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | ||||
|        (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) | ||||
|     // without main extensions, the non-secure MSPLIM is RAZ/WI | ||||
|     #define __get_MSPLIM()            (0U) | ||||
|   #else | ||||
|     #define __get_MSPLIM()            (__arm_rsr("MSPLIM")) | ||||
|   #endif | ||||
|   #define __get_PRIMASK()             (__arm_rsr("PRIMASK")) | ||||
|   #define __get_PSP()                 (__arm_rsr("PSP")) | ||||
|  | ||||
|   #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | ||||
|        (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) | ||||
|     // without main extensions, the non-secure PSPLIM is RAZ/WI | ||||
|     #define __get_PSPLIM()            (0U) | ||||
|   #else | ||||
|     #define __get_PSPLIM()            (__arm_rsr("PSPLIM")) | ||||
|   #endif | ||||
|  | ||||
|   #define __get_xPSR()                (__arm_rsr("xPSR")) | ||||
|  | ||||
|   #define __set_BASEPRI(VALUE)        (__arm_wsr("BASEPRI", (VALUE))) | ||||
|   #define __set_BASEPRI_MAX(VALUE)    (__arm_wsr("BASEPRI_MAX", (VALUE))) | ||||
|   #define __set_CONTROL(VALUE)        (__arm_wsr("CONTROL", (VALUE))) | ||||
|   #define __set_FAULTMASK(VALUE)      (__arm_wsr("FAULTMASK", (VALUE))) | ||||
|   #define __set_MSP(VALUE)            (__arm_wsr("MSP", (VALUE))) | ||||
|  | ||||
|   #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | ||||
|        (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) | ||||
|     // without main extensions, the non-secure MSPLIM is RAZ/WI | ||||
|     #define __set_MSPLIM(VALUE)       ((void)(VALUE)) | ||||
|   #else | ||||
|     #define __set_MSPLIM(VALUE)       (__arm_wsr("MSPLIM", (VALUE))) | ||||
|   #endif | ||||
|   #define __set_PRIMASK(VALUE)        (__arm_wsr("PRIMASK", (VALUE))) | ||||
|   #define __set_PSP(VALUE)            (__arm_wsr("PSP", (VALUE))) | ||||
|   #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | ||||
|        (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) | ||||
|     // without main extensions, the non-secure PSPLIM is RAZ/WI | ||||
|     #define __set_PSPLIM(VALUE)       ((void)(VALUE)) | ||||
|   #else | ||||
|     #define __set_PSPLIM(VALUE)       (__arm_wsr("PSPLIM", (VALUE))) | ||||
|   #endif | ||||
|  | ||||
|   #define __TZ_get_CONTROL_NS()       (__arm_rsr("CONTROL_NS")) | ||||
|   #define __TZ_set_CONTROL_NS(VALUE)  (__arm_wsr("CONTROL_NS", (VALUE))) | ||||
|   #define __TZ_get_PSP_NS()           (__arm_rsr("PSP_NS")) | ||||
|   #define __TZ_set_PSP_NS(VALUE)      (__arm_wsr("PSP_NS", (VALUE))) | ||||
|   #define __TZ_get_MSP_NS()           (__arm_rsr("MSP_NS")) | ||||
|   #define __TZ_set_MSP_NS(VALUE)      (__arm_wsr("MSP_NS", (VALUE))) | ||||
|   #define __TZ_get_SP_NS()            (__arm_rsr("SP_NS")) | ||||
|   #define __TZ_set_SP_NS(VALUE)       (__arm_wsr("SP_NS", (VALUE))) | ||||
|   #define __TZ_get_PRIMASK_NS()       (__arm_rsr("PRIMASK_NS")) | ||||
|   #define __TZ_set_PRIMASK_NS(VALUE)  (__arm_wsr("PRIMASK_NS", (VALUE))) | ||||
|   #define __TZ_get_BASEPRI_NS()       (__arm_rsr("BASEPRI_NS")) | ||||
|   #define __TZ_set_BASEPRI_NS(VALUE)  (__arm_wsr("BASEPRI_NS", (VALUE))) | ||||
|   #define __TZ_get_FAULTMASK_NS()     (__arm_rsr("FAULTMASK_NS")) | ||||
|   #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) | ||||
|  | ||||
|   #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | ||||
|        (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) | ||||
|     // without main extensions, the non-secure PSPLIM is RAZ/WI | ||||
|     #define __TZ_get_PSPLIM_NS()      (0U) | ||||
|     #define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE)) | ||||
|   #else | ||||
|     #define __TZ_get_PSPLIM_NS()      (__arm_rsr("PSPLIM_NS")) | ||||
|     #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) | ||||
|   #endif | ||||
|  | ||||
|   #define __TZ_get_MSPLIM_NS()        (__arm_rsr("MSPLIM_NS")) | ||||
|   #define __TZ_set_MSPLIM_NS(VALUE)   (__arm_wsr("MSPLIM_NS", (VALUE))) | ||||
|  | ||||
|   #define __NOP     __iar_builtin_no_operation | ||||
|  | ||||
|   #define __CLZ     __iar_builtin_CLZ | ||||
|   #define __CLREX   __iar_builtin_CLREX | ||||
|  | ||||
|   #define __DMB     __iar_builtin_DMB | ||||
|   #define __DSB     __iar_builtin_DSB | ||||
|   #define __ISB     __iar_builtin_ISB | ||||
|  | ||||
|   #define __LDREXB  __iar_builtin_LDREXB | ||||
|   #define __LDREXH  __iar_builtin_LDREXH | ||||
|   #define __LDREXW  __iar_builtin_LDREX | ||||
|  | ||||
|   #define __RBIT    __iar_builtin_RBIT | ||||
|   #define __REV     __iar_builtin_REV | ||||
|   #define __REV16   __iar_builtin_REV16 | ||||
|  | ||||
|   __IAR_FT int16_t __REVSH(int16_t val) | ||||
|   { | ||||
|     return (int16_t) __iar_builtin_REVSH(val); | ||||
|   } | ||||
|  | ||||
|   #define __ROR     __iar_builtin_ROR | ||||
|   #define __RRX     __iar_builtin_RRX | ||||
|  | ||||
|   #define __SEV     __iar_builtin_SEV | ||||
|  | ||||
|   #if !__IAR_M0_FAMILY | ||||
|     #define __SSAT    __iar_builtin_SSAT | ||||
|   #endif | ||||
|  | ||||
|   #define __STREXB  __iar_builtin_STREXB | ||||
|   #define __STREXH  __iar_builtin_STREXH | ||||
|   #define __STREXW  __iar_builtin_STREX | ||||
|  | ||||
|   #if !__IAR_M0_FAMILY | ||||
|     #define __USAT    __iar_builtin_USAT | ||||
|   #endif | ||||
|  | ||||
|   #define __WFE     __iar_builtin_WFE | ||||
|   #define __WFI     __iar_builtin_WFI | ||||
|  | ||||
|   #if __ARM_MEDIA__ | ||||
|     #define __SADD8   __iar_builtin_SADD8 | ||||
|     #define __QADD8   __iar_builtin_QADD8 | ||||
|     #define __SHADD8  __iar_builtin_SHADD8 | ||||
|     #define __UADD8   __iar_builtin_UADD8 | ||||
|     #define __UQADD8  __iar_builtin_UQADD8 | ||||
|     #define __UHADD8  __iar_builtin_UHADD8 | ||||
|     #define __SSUB8   __iar_builtin_SSUB8 | ||||
|     #define __QSUB8   __iar_builtin_QSUB8 | ||||
|     #define __SHSUB8  __iar_builtin_SHSUB8 | ||||
|     #define __USUB8   __iar_builtin_USUB8 | ||||
|     #define __UQSUB8  __iar_builtin_UQSUB8 | ||||
|     #define __UHSUB8  __iar_builtin_UHSUB8 | ||||
|     #define __SADD16  __iar_builtin_SADD16 | ||||
|     #define __QADD16  __iar_builtin_QADD16 | ||||
|     #define __SHADD16 __iar_builtin_SHADD16 | ||||
|     #define __UADD16  __iar_builtin_UADD16 | ||||
|     #define __UQADD16 __iar_builtin_UQADD16 | ||||
|     #define __UHADD16 __iar_builtin_UHADD16 | ||||
|     #define __SSUB16  __iar_builtin_SSUB16 | ||||
|     #define __QSUB16  __iar_builtin_QSUB16 | ||||
|     #define __SHSUB16 __iar_builtin_SHSUB16 | ||||
|     #define __USUB16  __iar_builtin_USUB16 | ||||
|     #define __UQSUB16 __iar_builtin_UQSUB16 | ||||
|     #define __UHSUB16 __iar_builtin_UHSUB16 | ||||
|     #define __SASX    __iar_builtin_SASX | ||||
|     #define __QASX    __iar_builtin_QASX | ||||
|     #define __SHASX   __iar_builtin_SHASX | ||||
|     #define __UASX    __iar_builtin_UASX | ||||
|     #define __UQASX   __iar_builtin_UQASX | ||||
|     #define __UHASX   __iar_builtin_UHASX | ||||
|     #define __SSAX    __iar_builtin_SSAX | ||||
|     #define __QSAX    __iar_builtin_QSAX | ||||
|     #define __SHSAX   __iar_builtin_SHSAX | ||||
|     #define __USAX    __iar_builtin_USAX | ||||
|     #define __UQSAX   __iar_builtin_UQSAX | ||||
|     #define __UHSAX   __iar_builtin_UHSAX | ||||
|     #define __USAD8   __iar_builtin_USAD8 | ||||
|     #define __USADA8  __iar_builtin_USADA8 | ||||
|     #define __SSAT16  __iar_builtin_SSAT16 | ||||
|     #define __USAT16  __iar_builtin_USAT16 | ||||
|     #define __UXTB16  __iar_builtin_UXTB16 | ||||
|     #define __UXTAB16 __iar_builtin_UXTAB16 | ||||
|     #define __SXTB16  __iar_builtin_SXTB16 | ||||
|     #define __SXTAB16 __iar_builtin_SXTAB16 | ||||
|     #define __SMUAD   __iar_builtin_SMUAD | ||||
|     #define __SMUADX  __iar_builtin_SMUADX | ||||
|     #define __SMMLA   __iar_builtin_SMMLA | ||||
|     #define __SMLAD   __iar_builtin_SMLAD | ||||
|     #define __SMLADX  __iar_builtin_SMLADX | ||||
|     #define __SMLALD  __iar_builtin_SMLALD | ||||
|     #define __SMLALDX __iar_builtin_SMLALDX | ||||
|     #define __SMUSD   __iar_builtin_SMUSD | ||||
|     #define __SMUSDX  __iar_builtin_SMUSDX | ||||
|     #define __SMLSD   __iar_builtin_SMLSD | ||||
|     #define __SMLSDX  __iar_builtin_SMLSDX | ||||
|     #define __SMLSLD  __iar_builtin_SMLSLD | ||||
|     #define __SMLSLDX __iar_builtin_SMLSLDX | ||||
|     #define __SEL     __iar_builtin_SEL | ||||
|     #define __QADD    __iar_builtin_QADD | ||||
|     #define __QSUB    __iar_builtin_QSUB | ||||
|     #define __PKHBT   __iar_builtin_PKHBT | ||||
|     #define __PKHTB   __iar_builtin_PKHTB | ||||
|   #endif | ||||
|  | ||||
| #else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ | ||||
|  | ||||
|   #if __IAR_M0_FAMILY | ||||
|    /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ | ||||
|     #define __CLZ  __cmsis_iar_clz_not_active | ||||
|     #define __SSAT __cmsis_iar_ssat_not_active | ||||
|     #define __USAT __cmsis_iar_usat_not_active | ||||
|     #define __RBIT __cmsis_iar_rbit_not_active | ||||
|     #define __get_APSR  __cmsis_iar_get_APSR_not_active | ||||
|   #endif | ||||
|  | ||||
|  | ||||
|   #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ | ||||
|          (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )) | ||||
|     #define __get_FPSCR __cmsis_iar_get_FPSR_not_active | ||||
|     #define __set_FPSCR __cmsis_iar_set_FPSR_not_active | ||||
|   #endif | ||||
|  | ||||
|   #ifdef __INTRINSICS_INCLUDED | ||||
|   #error intrinsics.h is already included previously! | ||||
|   #endif | ||||
|  | ||||
|   #include <intrinsics.h> | ||||
|  | ||||
|   #if __IAR_M0_FAMILY | ||||
|    /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ | ||||
|     #undef __CLZ | ||||
|     #undef __SSAT | ||||
|     #undef __USAT | ||||
|     #undef __RBIT | ||||
|     #undef __get_APSR | ||||
|  | ||||
|     __STATIC_INLINE uint8_t __CLZ(uint32_t data) | ||||
|     { | ||||
|       if (data == 0U) { return 32U; } | ||||
|  | ||||
|       uint32_t count = 0U; | ||||
|       uint32_t mask = 0x80000000U; | ||||
|  | ||||
|       while ((data & mask) == 0U) | ||||
|       { | ||||
|         count += 1U; | ||||
|         mask = mask >> 1U; | ||||
|       } | ||||
|       return count; | ||||
|     } | ||||
|  | ||||
|     __STATIC_INLINE uint32_t __RBIT(uint32_t v) | ||||
|     { | ||||
|       uint8_t sc = 31U; | ||||
|       uint32_t r = v; | ||||
|       for (v >>= 1U; v; v >>= 1U) | ||||
|       { | ||||
|         r <<= 1U; | ||||
|         r |= v & 1U; | ||||
|         sc--; | ||||
|       } | ||||
|       return (r << sc); | ||||
|     } | ||||
|  | ||||
|     __STATIC_INLINE  uint32_t __get_APSR(void) | ||||
|     { | ||||
|       uint32_t res; | ||||
|       __asm("MRS      %0,APSR" : "=r" (res)); | ||||
|       return res; | ||||
|     } | ||||
|  | ||||
|   #endif | ||||
|  | ||||
|   #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ | ||||
|          (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )) | ||||
|     #undef __get_FPSCR | ||||
|     #undef __set_FPSCR | ||||
|     #define __get_FPSCR()       (0) | ||||
|     #define __set_FPSCR(VALUE)  ((void)VALUE) | ||||
|   #endif | ||||
|  | ||||
|   #pragma diag_suppress=Pe940 | ||||
|   #pragma diag_suppress=Pe177 | ||||
|  | ||||
|   #define __enable_irq    __enable_interrupt | ||||
|   #define __disable_irq   __disable_interrupt | ||||
|   #define __NOP           __no_operation | ||||
|  | ||||
|   #define __get_xPSR      __get_PSR | ||||
|  | ||||
|   #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) | ||||
|  | ||||
|     __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) | ||||
|     { | ||||
|       return __LDREX((unsigned long *)ptr); | ||||
|     } | ||||
|  | ||||
|     __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) | ||||
|     { | ||||
|       return __STREX(value, (unsigned long *)ptr); | ||||
|     } | ||||
|   #endif | ||||
|  | ||||
|  | ||||
|   /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ | ||||
|   #if (__CORTEX_M >= 0x03) | ||||
|  | ||||
|     __IAR_FT uint32_t __RRX(uint32_t value) | ||||
|     { | ||||
|       uint32_t result; | ||||
|       __ASM("RRX      %0, %1" : "=r"(result) : "r" (value) : "cc"); | ||||
|       return(result); | ||||
|     } | ||||
|  | ||||
|     __IAR_FT void __set_BASEPRI_MAX(uint32_t value) | ||||
|     { | ||||
|       __asm volatile("MSR      BASEPRI_MAX,%0"::"r" (value)); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     #define __enable_fault_irq  __enable_fiq | ||||
|     #define __disable_fault_irq __disable_fiq | ||||
|  | ||||
|  | ||||
|   #endif /* (__CORTEX_M >= 0x03) */ | ||||
|  | ||||
|   __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) | ||||
|   { | ||||
|     return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); | ||||
|   } | ||||
|  | ||||
|   #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ | ||||
|        (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    ) | ||||
|  | ||||
|    __IAR_FT uint32_t __get_MSPLIM(void) | ||||
|     { | ||||
|       uint32_t res; | ||||
|     #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | ||||
|          (!defined (__ARM_FEATURE_CMSE  ) || (__ARM_FEATURE_CMSE   < 3))) | ||||
|       // without main extensions, the non-secure MSPLIM is RAZ/WI | ||||
|       res = 0U; | ||||
|     #else | ||||
|       __asm volatile("MRS      %0,MSPLIM" : "=r" (res)); | ||||
|     #endif | ||||
|       return res; | ||||
|     } | ||||
|  | ||||
|     __IAR_FT void   __set_MSPLIM(uint32_t value) | ||||
|     { | ||||
|     #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | ||||
|          (!defined (__ARM_FEATURE_CMSE  ) || (__ARM_FEATURE_CMSE   < 3))) | ||||
|       // without main extensions, the non-secure MSPLIM is RAZ/WI | ||||
|       (void)value; | ||||
|     #else | ||||
|       __asm volatile("MSR      MSPLIM,%0" :: "r" (value)); | ||||
|     #endif | ||||
|     } | ||||
|  | ||||
|     __IAR_FT uint32_t __get_PSPLIM(void) | ||||
|     { | ||||
|       uint32_t res; | ||||
|     #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | ||||
|          (!defined (__ARM_FEATURE_CMSE  ) || (__ARM_FEATURE_CMSE   < 3))) | ||||
|       // without main extensions, the non-secure PSPLIM is RAZ/WI | ||||
|       res = 0U; | ||||
|     #else | ||||
|       __asm volatile("MRS      %0,PSPLIM" : "=r" (res)); | ||||
|     #endif | ||||
|       return res; | ||||
|     } | ||||
|  | ||||
|     __IAR_FT void   __set_PSPLIM(uint32_t value) | ||||
|     { | ||||
|     #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | ||||
|          (!defined (__ARM_FEATURE_CMSE  ) || (__ARM_FEATURE_CMSE   < 3))) | ||||
|       // without main extensions, the non-secure PSPLIM is RAZ/WI | ||||
|       (void)value; | ||||
|     #else | ||||
|       __asm volatile("MSR      PSPLIM,%0" :: "r" (value)); | ||||
|     #endif | ||||
|     } | ||||
|  | ||||
|     __IAR_FT uint32_t __TZ_get_CONTROL_NS(void) | ||||
|     { | ||||
|       uint32_t res; | ||||
|       __asm volatile("MRS      %0,CONTROL_NS" : "=r" (res)); | ||||
|       return res; | ||||
|     } | ||||
|  | ||||
|     __IAR_FT void   __TZ_set_CONTROL_NS(uint32_t value) | ||||
|     { | ||||
|       __asm volatile("MSR      CONTROL_NS,%0" :: "r" (value)); | ||||
|     } | ||||
|  | ||||
|     __IAR_FT uint32_t   __TZ_get_PSP_NS(void) | ||||
|     { | ||||
|       uint32_t res; | ||||
|       __asm volatile("MRS      %0,PSP_NS" : "=r" (res)); | ||||
|       return res; | ||||
|     } | ||||
|  | ||||
|     __IAR_FT void   __TZ_set_PSP_NS(uint32_t value) | ||||
|     { | ||||
|       __asm volatile("MSR      PSP_NS,%0" :: "r" (value)); | ||||
|     } | ||||
|  | ||||
|     __IAR_FT uint32_t   __TZ_get_MSP_NS(void) | ||||
|     { | ||||
|       uint32_t res; | ||||
|       __asm volatile("MRS      %0,MSP_NS" : "=r" (res)); | ||||
|       return res; | ||||
|     } | ||||
|  | ||||
|     __IAR_FT void   __TZ_set_MSP_NS(uint32_t value) | ||||
|     { | ||||
|       __asm volatile("MSR      MSP_NS,%0" :: "r" (value)); | ||||
|     } | ||||
|  | ||||
|     __IAR_FT uint32_t   __TZ_get_SP_NS(void) | ||||
|     { | ||||
|       uint32_t res; | ||||
|       __asm volatile("MRS      %0,SP_NS" : "=r" (res)); | ||||
|       return res; | ||||
|     } | ||||
|     __IAR_FT void   __TZ_set_SP_NS(uint32_t value) | ||||
|     { | ||||
|       __asm volatile("MSR      SP_NS,%0" :: "r" (value)); | ||||
|     } | ||||
|  | ||||
|     __IAR_FT uint32_t   __TZ_get_PRIMASK_NS(void) | ||||
|     { | ||||
|       uint32_t res; | ||||
|       __asm volatile("MRS      %0,PRIMASK_NS" : "=r" (res)); | ||||
|       return res; | ||||
|     } | ||||
|  | ||||
|     __IAR_FT void   __TZ_set_PRIMASK_NS(uint32_t value) | ||||
|     { | ||||
|       __asm volatile("MSR      PRIMASK_NS,%0" :: "r" (value)); | ||||
|     } | ||||
|  | ||||
|     __IAR_FT uint32_t   __TZ_get_BASEPRI_NS(void) | ||||
|     { | ||||
|       uint32_t res; | ||||
|       __asm volatile("MRS      %0,BASEPRI_NS" : "=r" (res)); | ||||
|       return res; | ||||
|     } | ||||
|  | ||||
|     __IAR_FT void   __TZ_set_BASEPRI_NS(uint32_t value) | ||||
|     { | ||||
|       __asm volatile("MSR      BASEPRI_NS,%0" :: "r" (value)); | ||||
|     } | ||||
|  | ||||
|     __IAR_FT uint32_t   __TZ_get_FAULTMASK_NS(void) | ||||
|     { | ||||
|       uint32_t res; | ||||
|       __asm volatile("MRS      %0,FAULTMASK_NS" : "=r" (res)); | ||||
|       return res; | ||||
|     } | ||||
|  | ||||
|     __IAR_FT void   __TZ_set_FAULTMASK_NS(uint32_t value) | ||||
|     { | ||||
|       __asm volatile("MSR      FAULTMASK_NS,%0" :: "r" (value)); | ||||
|     } | ||||
|  | ||||
|     __IAR_FT uint32_t   __TZ_get_PSPLIM_NS(void) | ||||
|     { | ||||
|       uint32_t res; | ||||
|     #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | ||||
|          (!defined (__ARM_FEATURE_CMSE  ) || (__ARM_FEATURE_CMSE   < 3))) | ||||
|       // without main extensions, the non-secure PSPLIM is RAZ/WI | ||||
|       res = 0U; | ||||
|     #else | ||||
|       __asm volatile("MRS      %0,PSPLIM_NS" : "=r" (res)); | ||||
|     #endif | ||||
|       return res; | ||||
|     } | ||||
|  | ||||
|     __IAR_FT void   __TZ_set_PSPLIM_NS(uint32_t value) | ||||
|     { | ||||
|     #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | ||||
|          (!defined (__ARM_FEATURE_CMSE  ) || (__ARM_FEATURE_CMSE   < 3))) | ||||
|       // without main extensions, the non-secure PSPLIM is RAZ/WI | ||||
|       (void)value; | ||||
|     #else | ||||
|       __asm volatile("MSR      PSPLIM_NS,%0" :: "r" (value)); | ||||
|     #endif | ||||
|     } | ||||
|  | ||||
|     __IAR_FT uint32_t   __TZ_get_MSPLIM_NS(void) | ||||
|     { | ||||
|       uint32_t res; | ||||
|       __asm volatile("MRS      %0,MSPLIM_NS" : "=r" (res)); | ||||
|       return res; | ||||
|     } | ||||
|  | ||||
|     __IAR_FT void   __TZ_set_MSPLIM_NS(uint32_t value) | ||||
|     { | ||||
|       __asm volatile("MSR      MSPLIM_NS,%0" :: "r" (value)); | ||||
|     } | ||||
|  | ||||
|   #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ | ||||
|  | ||||
| #endif   /* __ICCARM_INTRINSICS_VERSION__ == 2 */ | ||||
|  | ||||
| #define __BKPT(value)    __asm volatile ("BKPT     %0" : : "i"(value)) | ||||
|  | ||||
| #if __IAR_M0_FAMILY | ||||
|   __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) | ||||
|   { | ||||
|     if ((sat >= 1U) && (sat <= 32U)) | ||||
|     { | ||||
|       const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); | ||||
|       const int32_t min = -1 - max ; | ||||
|       if (val > max) | ||||
|       { | ||||
|         return max; | ||||
|       } | ||||
|       else if (val < min) | ||||
|       { | ||||
|         return min; | ||||
|       } | ||||
|     } | ||||
|     return val; | ||||
|   } | ||||
|  | ||||
|   __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) | ||||
|   { | ||||
|     if (sat <= 31U) | ||||
|     { | ||||
|       const uint32_t max = ((1U << sat) - 1U); | ||||
|       if (val > (int32_t)max) | ||||
|       { | ||||
|         return max; | ||||
|       } | ||||
|       else if (val < 0) | ||||
|       { | ||||
|         return 0U; | ||||
|       } | ||||
|     } | ||||
|     return (uint32_t)val; | ||||
|   } | ||||
| #endif | ||||
|  | ||||
| #if (__CORTEX_M >= 0x03)   /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ | ||||
|  | ||||
|   __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) | ||||
|   { | ||||
|     uint32_t res; | ||||
|     __ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); | ||||
|     return ((uint8_t)res); | ||||
|   } | ||||
|  | ||||
|   __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) | ||||
|   { | ||||
|     uint32_t res; | ||||
|     __ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); | ||||
|     return ((uint16_t)res); | ||||
|   } | ||||
|  | ||||
|   __IAR_FT uint32_t __LDRT(volatile uint32_t *addr) | ||||
|   { | ||||
|     uint32_t res; | ||||
|     __ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); | ||||
|     return res; | ||||
|   } | ||||
|  | ||||
|   __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) | ||||
|   { | ||||
|     __ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); | ||||
|   } | ||||
|  | ||||
|   __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) | ||||
|   { | ||||
|     __ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); | ||||
|   } | ||||
|  | ||||
|   __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) | ||||
|   { | ||||
|     __ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); | ||||
|   } | ||||
|  | ||||
| #endif /* (__CORTEX_M >= 0x03) */ | ||||
|  | ||||
| #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ | ||||
|      (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    ) | ||||
|  | ||||
|  | ||||
|   __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) | ||||
|   { | ||||
|     uint32_t res; | ||||
|     __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); | ||||
|     return ((uint8_t)res); | ||||
|   } | ||||
|  | ||||
|   __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) | ||||
|   { | ||||
|     uint32_t res; | ||||
|     __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); | ||||
|     return ((uint16_t)res); | ||||
|   } | ||||
|  | ||||
|   __IAR_FT uint32_t __LDA(volatile uint32_t *ptr) | ||||
|   { | ||||
|     uint32_t res; | ||||
|     __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); | ||||
|     return res; | ||||
|   } | ||||
|  | ||||
|   __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) | ||||
|   { | ||||
|     __ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); | ||||
|   } | ||||
|  | ||||
|   __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) | ||||
|   { | ||||
|     __ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); | ||||
|   } | ||||
|  | ||||
|   __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) | ||||
|   { | ||||
|     __ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); | ||||
|   } | ||||
|  | ||||
|   __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) | ||||
|   { | ||||
|     uint32_t res; | ||||
|     __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); | ||||
|     return ((uint8_t)res); | ||||
|   } | ||||
|  | ||||
|   __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) | ||||
|   { | ||||
|     uint32_t res; | ||||
|     __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); | ||||
|     return ((uint16_t)res); | ||||
|   } | ||||
|  | ||||
|   __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) | ||||
|   { | ||||
|     uint32_t res; | ||||
|     __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); | ||||
|     return res; | ||||
|   } | ||||
|  | ||||
|   __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) | ||||
|   { | ||||
|     uint32_t res; | ||||
|     __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); | ||||
|     return res; | ||||
|   } | ||||
|  | ||||
|   __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) | ||||
|   { | ||||
|     uint32_t res; | ||||
|     __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); | ||||
|     return res; | ||||
|   } | ||||
|  | ||||
|   __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) | ||||
|   { | ||||
|     uint32_t res; | ||||
|     __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); | ||||
|     return res; | ||||
|   } | ||||
|  | ||||
| #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ | ||||
|  | ||||
| #undef __IAR_FT | ||||
| #undef __IAR_M0_FAMILY | ||||
| #undef __ICCARM_V8 | ||||
|  | ||||
| #pragma diag_default=Pe940 | ||||
| #pragma diag_default=Pe177 | ||||
|  | ||||
| #endif /* __CMSIS_ICCARM_H__ */ | ||||
							
								
								
									
										39
									
								
								fw/Drivers/CMSIS/Include/cmsis_version.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								fw/Drivers/CMSIS/Include/cmsis_version.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| /**************************************************************************//** | ||||
|  * @file     cmsis_version.h | ||||
|  * @brief    CMSIS Core(M) Version definitions | ||||
|  * @version  V5.0.2 | ||||
|  * @date     19. April 2017 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2009-2017 ARM Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the License); you may | ||||
|  * not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an AS IS BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header   /* treat file as system include file */ | ||||
| #endif | ||||
|  | ||||
| #ifndef __CMSIS_VERSION_H | ||||
| #define __CMSIS_VERSION_H | ||||
|  | ||||
| /*  CMSIS Version definitions */ | ||||
| #define __CM_CMSIS_VERSION_MAIN  ( 5U)                                      /*!< [31:16] CMSIS Core(M) main version */ | ||||
| #define __CM_CMSIS_VERSION_SUB   ( 1U)                                      /*!< [15:0]  CMSIS Core(M) sub version */ | ||||
| #define __CM_CMSIS_VERSION       ((__CM_CMSIS_VERSION_MAIN << 16U) | \ | ||||
|                                    __CM_CMSIS_VERSION_SUB           )       /*!< CMSIS Core(M) version number */ | ||||
| #endif | ||||
							
								
								
									
										1918
									
								
								fw/Drivers/CMSIS/Include/core_armv8mbl.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1918
									
								
								fw/Drivers/CMSIS/Include/core_armv8mbl.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2927
									
								
								fw/Drivers/CMSIS/Include/core_armv8mml.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2927
									
								
								fw/Drivers/CMSIS/Include/core_armv8mml.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										949
									
								
								fw/Drivers/CMSIS/Include/core_cm0.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										949
									
								
								fw/Drivers/CMSIS/Include/core_cm0.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,949 @@ | ||||
| /**************************************************************************//** | ||||
|  * @file     core_cm0.h | ||||
|  * @brief    CMSIS Cortex-M0 Core Peripheral Access Layer Header File | ||||
|  * @version  V5.0.5 | ||||
|  * @date     28. May 2018 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2009-2018 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the License); you may | ||||
|  * not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an AS IS BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header   /* treat file as system include file */ | ||||
| #endif | ||||
|  | ||||
| #ifndef __CORE_CM0_H_GENERIC | ||||
| #define __CORE_CM0_H_GENERIC | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|   \page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions | ||||
|   CMSIS violates the following MISRA-C:2004 rules: | ||||
|  | ||||
|    \li Required Rule 8.5, object/function definition in header file.<br> | ||||
|      Function definitions in header files are used to allow 'inlining'. | ||||
|  | ||||
|    \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br> | ||||
|      Unions are used for effective representation of core registers. | ||||
|  | ||||
|    \li Advisory Rule 19.7, Function-like macro defined.<br> | ||||
|      Function-like macros are used to allow more efficient code. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| /******************************************************************************* | ||||
|  *                 CMSIS definitions | ||||
|  ******************************************************************************/ | ||||
| /** | ||||
|   \ingroup Cortex_M0 | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| #include "cmsis_version.h" | ||||
|   | ||||
| /*  CMSIS CM0 definitions */ | ||||
| #define __CM0_CMSIS_VERSION_MAIN  (__CM_CMSIS_VERSION_MAIN)              /*!< \deprecated [31:16] CMSIS HAL main version */ | ||||
| #define __CM0_CMSIS_VERSION_SUB   (__CM_CMSIS_VERSION_SUB)               /*!< \deprecated [15:0]  CMSIS HAL sub version */ | ||||
| #define __CM0_CMSIS_VERSION       ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ | ||||
|                                     __CM0_CMSIS_VERSION_SUB           )  /*!< \deprecated CMSIS HAL version number */ | ||||
|  | ||||
| #define __CORTEX_M                (0U)                                   /*!< Cortex-M Core */ | ||||
|  | ||||
| /** __FPU_USED indicates whether an FPU is used or not. | ||||
|     This core does not support an FPU at all | ||||
| */ | ||||
| #define __FPU_USED       0U | ||||
|  | ||||
| #if defined ( __CC_ARM ) | ||||
|   #if defined __TARGET_FPU_VFP | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) | ||||
|   #if defined __ARM_PCS_VFP | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __GNUC__ ) | ||||
|   #if defined (__VFP_FP__) && !defined(__SOFTFP__) | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __ICCARM__ ) | ||||
|   #if defined __ARMVFP__ | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __TI_ARM__ ) | ||||
|   #if defined __TI_VFP_SUPPORT__ | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __TASKING__ ) | ||||
|   #if defined __FPU_VFP__ | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __CSMC__ ) | ||||
|   #if ( __CSMC__ & 0x400U) | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #include "cmsis_compiler.h"               /* CMSIS compiler specific defines */ | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __CORE_CM0_H_GENERIC */ | ||||
|  | ||||
| #ifndef __CMSIS_GENERIC | ||||
|  | ||||
| #ifndef __CORE_CM0_H_DEPENDANT | ||||
| #define __CORE_CM0_H_DEPENDANT | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* check device defines and use defaults */ | ||||
| #if defined __CHECK_DEVICE_DEFINES | ||||
|   #ifndef __CM0_REV | ||||
|     #define __CM0_REV               0x0000U | ||||
|     #warning "__CM0_REV not defined in device header file; using default!" | ||||
|   #endif | ||||
|  | ||||
|   #ifndef __NVIC_PRIO_BITS | ||||
|     #define __NVIC_PRIO_BITS          2U | ||||
|     #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" | ||||
|   #endif | ||||
|  | ||||
|   #ifndef __Vendor_SysTickConfig | ||||
|     #define __Vendor_SysTickConfig    0U | ||||
|     #warning "__Vendor_SysTickConfig not defined in device header file; using default!" | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| /* IO definitions (access restrictions to peripheral registers) */ | ||||
| /** | ||||
|     \defgroup CMSIS_glob_defs CMSIS Global Defines | ||||
|  | ||||
|     <strong>IO Type Qualifiers</strong> are used | ||||
|     \li to specify the access to peripheral variables. | ||||
|     \li for automatic generation of peripheral register debug information. | ||||
| */ | ||||
| #ifdef __cplusplus | ||||
|   #define   __I     volatile             /*!< Defines 'read only' permissions */ | ||||
| #else | ||||
|   #define   __I     volatile const       /*!< Defines 'read only' permissions */ | ||||
| #endif | ||||
| #define     __O     volatile             /*!< Defines 'write only' permissions */ | ||||
| #define     __IO    volatile             /*!< Defines 'read / write' permissions */ | ||||
|  | ||||
| /* following defines should be used for structure members */ | ||||
| #define     __IM     volatile const      /*! Defines 'read only' structure member permissions */ | ||||
| #define     __OM     volatile            /*! Defines 'write only' structure member permissions */ | ||||
| #define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */ | ||||
|  | ||||
| /*@} end of group Cortex_M0 */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /******************************************************************************* | ||||
|  *                 Register Abstraction | ||||
|   Core Register contain: | ||||
|   - Core Register | ||||
|   - Core NVIC Register | ||||
|   - Core SCB Register | ||||
|   - Core SysTick Register | ||||
|  ******************************************************************************/ | ||||
| /** | ||||
|   \defgroup CMSIS_core_register Defines and Type Definitions | ||||
|   \brief Type definitions and defines for Cortex-M processor based devices. | ||||
| */ | ||||
|  | ||||
| /** | ||||
|   \ingroup    CMSIS_core_register | ||||
|   \defgroup   CMSIS_CORE  Status and Control Registers | ||||
|   \brief      Core Register type definitions. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief  Union type to access the Application Program Status Register (APSR). | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t _reserved0:28;              /*!< bit:  0..27  Reserved */ | ||||
|     uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */ | ||||
|     uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */ | ||||
|     uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */ | ||||
|     uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */ | ||||
|   } b;                                   /*!< Structure used for bit  access */ | ||||
|   uint32_t w;                            /*!< Type      used for word access */ | ||||
| } APSR_Type; | ||||
|  | ||||
| /* APSR Register Definitions */ | ||||
| #define APSR_N_Pos                         31U                                            /*!< APSR: N Position */ | ||||
| #define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */ | ||||
|  | ||||
| #define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */ | ||||
| #define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */ | ||||
|  | ||||
| #define APSR_C_Pos                         29U                                            /*!< APSR: C Position */ | ||||
| #define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */ | ||||
|  | ||||
| #define APSR_V_Pos                         28U                                            /*!< APSR: V Position */ | ||||
| #define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief  Union type to access the Interrupt Program Status Register (IPSR). | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */ | ||||
|     uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */ | ||||
|   } b;                                   /*!< Structure used for bit  access */ | ||||
|   uint32_t w;                            /*!< Type      used for word access */ | ||||
| } IPSR_Type; | ||||
|  | ||||
| /* IPSR Register Definitions */ | ||||
| #define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */ | ||||
| #define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief  Union type to access the Special-Purpose Program Status Registers (xPSR). | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */ | ||||
|     uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved */ | ||||
|     uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0) */ | ||||
|     uint32_t _reserved1:3;               /*!< bit: 25..27  Reserved */ | ||||
|     uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */ | ||||
|     uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */ | ||||
|     uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */ | ||||
|     uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */ | ||||
|   } b;                                   /*!< Structure used for bit  access */ | ||||
|   uint32_t w;                            /*!< Type      used for word access */ | ||||
| } xPSR_Type; | ||||
|  | ||||
| /* xPSR Register Definitions */ | ||||
| #define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */ | ||||
| #define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */ | ||||
|  | ||||
| #define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */ | ||||
| #define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */ | ||||
|  | ||||
| #define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */ | ||||
| #define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */ | ||||
|  | ||||
| #define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */ | ||||
| #define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */ | ||||
|  | ||||
| #define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */ | ||||
| #define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */ | ||||
|  | ||||
| #define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */ | ||||
| #define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief  Union type to access the Control Registers (CONTROL). | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t _reserved0:1;               /*!< bit:      0  Reserved */ | ||||
|     uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used */ | ||||
|     uint32_t _reserved1:30;              /*!< bit:  2..31  Reserved */ | ||||
|   } b;                                   /*!< Structure used for bit  access */ | ||||
|   uint32_t w;                            /*!< Type      used for word access */ | ||||
| } CONTROL_Type; | ||||
|  | ||||
| /* CONTROL Register Definitions */ | ||||
| #define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */ | ||||
| #define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */ | ||||
|  | ||||
| /*@} end of group CMSIS_CORE */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup    CMSIS_core_register | ||||
|   \defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC) | ||||
|   \brief      Type definitions for the NVIC Registers | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC). | ||||
|  */ | ||||
| typedef struct | ||||
| { | ||||
|   __IOM uint32_t ISER[1U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */ | ||||
|         uint32_t RESERVED0[31U]; | ||||
|   __IOM uint32_t ICER[1U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */ | ||||
|         uint32_t RSERVED1[31U]; | ||||
|   __IOM uint32_t ISPR[1U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */ | ||||
|         uint32_t RESERVED2[31U]; | ||||
|   __IOM uint32_t ICPR[1U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */ | ||||
|         uint32_t RESERVED3[31U]; | ||||
|         uint32_t RESERVED4[64U]; | ||||
|   __IOM uint32_t IP[8U];                 /*!< Offset: 0x300 (R/W)  Interrupt Priority Register */ | ||||
| }  NVIC_Type; | ||||
|  | ||||
| /*@} end of group CMSIS_NVIC */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup  CMSIS_core_register | ||||
|   \defgroup CMSIS_SCB     System Control Block (SCB) | ||||
|   \brief    Type definitions for the System Control Block Registers | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief  Structure type to access the System Control Block (SCB). | ||||
|  */ | ||||
| typedef struct | ||||
| { | ||||
|   __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */ | ||||
|   __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */ | ||||
|         uint32_t RESERVED0; | ||||
|   __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */ | ||||
|   __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */ | ||||
|   __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */ | ||||
|         uint32_t RESERVED1; | ||||
|   __IOM uint32_t SHP[2U];                /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED */ | ||||
|   __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */ | ||||
| } SCB_Type; | ||||
|  | ||||
| /* SCB CPUID Register Definitions */ | ||||
| #define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */ | ||||
| #define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */ | ||||
|  | ||||
| #define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */ | ||||
| #define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */ | ||||
|  | ||||
| #define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */ | ||||
| #define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */ | ||||
|  | ||||
| #define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */ | ||||
| #define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */ | ||||
|  | ||||
| #define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */ | ||||
| #define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */ | ||||
|  | ||||
| /* SCB Interrupt Control State Register Definitions */ | ||||
| #define SCB_ICSR_NMIPENDSET_Pos            31U                                            /*!< SCB ICSR: NMIPENDSET Position */ | ||||
| #define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */ | ||||
| #define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */ | ||||
| #define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */ | ||||
| #define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */ | ||||
| #define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */ | ||||
|  | ||||
| #define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */ | ||||
| #define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */ | ||||
|  | ||||
| #define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */ | ||||
| #define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */ | ||||
|  | ||||
| #define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */ | ||||
| #define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */ | ||||
|  | ||||
| #define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */ | ||||
| #define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */ | ||||
|  | ||||
| /* SCB Application Interrupt and Reset Control Register Definitions */ | ||||
| #define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */ | ||||
| #define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */ | ||||
| #define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */ | ||||
| #define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */ | ||||
| #define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */ | ||||
| #define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */ | ||||
|  | ||||
| /* SCB System Control Register Definitions */ | ||||
| #define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */ | ||||
| #define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */ | ||||
|  | ||||
| #define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */ | ||||
| #define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */ | ||||
|  | ||||
| #define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */ | ||||
| #define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */ | ||||
|  | ||||
| /* SCB Configuration Control Register Definitions */ | ||||
| #define SCB_CCR_STKALIGN_Pos                9U                                            /*!< SCB CCR: STKALIGN Position */ | ||||
| #define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */ | ||||
|  | ||||
| #define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */ | ||||
| #define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */ | ||||
|  | ||||
| /* SCB System Handler Control and State Register Definitions */ | ||||
| #define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */ | ||||
| #define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */ | ||||
|  | ||||
| /*@} end of group CMSIS_SCB */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup  CMSIS_core_register | ||||
|   \defgroup CMSIS_SysTick     System Tick Timer (SysTick) | ||||
|   \brief    Type definitions for the System Timer Registers. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief  Structure type to access the System Timer (SysTick). | ||||
|  */ | ||||
| typedef struct | ||||
| { | ||||
|   __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */ | ||||
|   __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */ | ||||
|   __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */ | ||||
|   __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */ | ||||
| } SysTick_Type; | ||||
|  | ||||
| /* SysTick Control / Status Register Definitions */ | ||||
| #define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */ | ||||
| #define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */ | ||||
|  | ||||
| #define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */ | ||||
| #define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */ | ||||
|  | ||||
| #define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */ | ||||
| #define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */ | ||||
|  | ||||
| #define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */ | ||||
| #define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */ | ||||
|  | ||||
| /* SysTick Reload Register Definitions */ | ||||
| #define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */ | ||||
| #define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */ | ||||
|  | ||||
| /* SysTick Current Register Definitions */ | ||||
| #define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */ | ||||
| #define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */ | ||||
|  | ||||
| /* SysTick Calibration Register Definitions */ | ||||
| #define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */ | ||||
| #define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */ | ||||
|  | ||||
| #define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */ | ||||
| #define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */ | ||||
|  | ||||
| #define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */ | ||||
| #define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */ | ||||
|  | ||||
| /*@} end of group CMSIS_SysTick */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup  CMSIS_core_register | ||||
|   \defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug) | ||||
|   \brief    Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. | ||||
|             Therefore they are not covered by the Cortex-M0 header file. | ||||
|   @{ | ||||
|  */ | ||||
| /*@} end of group CMSIS_CoreDebug */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup    CMSIS_core_register | ||||
|   \defgroup   CMSIS_core_bitfield     Core register bit field macros | ||||
|   \brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk). | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief   Mask and shift a bit field value for use in a register bit range. | ||||
|   \param[in] field  Name of the register bit field. | ||||
|   \param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type. | ||||
|   \return           Masked and shifted value. | ||||
| */ | ||||
| #define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk) | ||||
|  | ||||
| /** | ||||
|   \brief     Mask and shift a register value to extract a bit filed value. | ||||
|   \param[in] field  Name of the register bit field. | ||||
|   \param[in] value  Value of register. This parameter is interpreted as an uint32_t type. | ||||
|   \return           Masked and shifted bit field value. | ||||
| */ | ||||
| #define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) | ||||
|  | ||||
| /*@} end of group CMSIS_core_bitfield */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup    CMSIS_core_register | ||||
|   \defgroup   CMSIS_core_base     Core Definitions | ||||
|   \brief      Definitions for base addresses, unions, and structures. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /* Memory mapping of Core Hardware */ | ||||
| #define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */ | ||||
| #define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address */ | ||||
| #define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address */ | ||||
| #define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */ | ||||
|  | ||||
| #define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct */ | ||||
| #define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct */ | ||||
| #define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct */ | ||||
|  | ||||
|  | ||||
| /*@} */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /******************************************************************************* | ||||
|  *                Hardware Abstraction Layer | ||||
|   Core Function Interface contains: | ||||
|   - Core NVIC Functions | ||||
|   - Core SysTick Functions | ||||
|   - Core Register Access Functions | ||||
|  ******************************************************************************/ | ||||
| /** | ||||
|   \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference | ||||
| */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /* ##########################   NVIC functions  #################################### */ | ||||
| /** | ||||
|   \ingroup  CMSIS_Core_FunctionInterface | ||||
|   \defgroup CMSIS_Core_NVICFunctions NVIC Functions | ||||
|   \brief    Functions that manage interrupts and exceptions via the NVIC. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| #ifdef CMSIS_NVIC_VIRTUAL | ||||
|   #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE | ||||
|     #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" | ||||
|   #endif | ||||
|   #include CMSIS_NVIC_VIRTUAL_HEADER_FILE | ||||
| #else | ||||
|   #define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping | ||||
|   #define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping | ||||
|   #define NVIC_EnableIRQ              __NVIC_EnableIRQ | ||||
|   #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ | ||||
|   #define NVIC_DisableIRQ             __NVIC_DisableIRQ | ||||
|   #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ | ||||
|   #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ | ||||
|   #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ | ||||
| /*#define NVIC_GetActive              __NVIC_GetActive             not available for Cortex-M0 */ | ||||
|   #define NVIC_SetPriority            __NVIC_SetPriority | ||||
|   #define NVIC_GetPriority            __NVIC_GetPriority | ||||
|   #define NVIC_SystemReset            __NVIC_SystemReset | ||||
| #endif /* CMSIS_NVIC_VIRTUAL */ | ||||
|  | ||||
| #ifdef CMSIS_VECTAB_VIRTUAL | ||||
|   #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE | ||||
|     #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" | ||||
|   #endif | ||||
|   #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE | ||||
| #else | ||||
|   #define NVIC_SetVector              __NVIC_SetVector | ||||
|   #define NVIC_GetVector              __NVIC_GetVector | ||||
| #endif  /* (CMSIS_VECTAB_VIRTUAL) */ | ||||
|  | ||||
| #define NVIC_USER_IRQ_OFFSET          16 | ||||
|  | ||||
|  | ||||
| /* The following EXC_RETURN values are saved the LR on exception entry */ | ||||
| #define EXC_RETURN_HANDLER         (0xFFFFFFF1UL)     /* return to Handler mode, uses MSP after return                               */ | ||||
| #define EXC_RETURN_THREAD_MSP      (0xFFFFFFF9UL)     /* return to Thread mode, uses MSP after return                                */ | ||||
| #define EXC_RETURN_THREAD_PSP      (0xFFFFFFFDUL)     /* return to Thread mode, uses PSP after return                                */ | ||||
|  | ||||
|  | ||||
| /* Interrupt Priorities are WORD accessible only under Armv6-M                  */ | ||||
| /* The following MACROS handle generation of the register offset and byte masks */ | ||||
| #define _BIT_SHIFT(IRQn)         (  ((((uint32_t)(int32_t)(IRQn))         )      &  0x03UL) * 8UL) | ||||
| #define _SHP_IDX(IRQn)           ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >>    2UL)      ) | ||||
| #define _IP_IDX(IRQn)            (   (((uint32_t)(int32_t)(IRQn))                >>    2UL)      ) | ||||
|  | ||||
| #define __NVIC_SetPriorityGrouping(X) (void)(X) | ||||
| #define __NVIC_GetPriorityGrouping()  (0U) | ||||
|  | ||||
| /** | ||||
|   \brief   Enable Interrupt | ||||
|   \details Enables a device specific interrupt in the NVIC interrupt controller. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Interrupt Enable status | ||||
|   \details Returns a device specific interrupt enable status from the NVIC interrupt controller. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \return             0  Interrupt is not enabled. | ||||
|   \return             1  Interrupt is enabled. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return(0U); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Disable Interrupt | ||||
|   \details Disables a device specific interrupt in the NVIC interrupt controller. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Pending Interrupt | ||||
|   \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \return             0  Interrupt status is not pending. | ||||
|   \return             1  Interrupt status is pending. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return(0U); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Pending Interrupt | ||||
|   \details Sets the pending bit of a device specific interrupt in the NVIC pending register. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Clear Pending Interrupt | ||||
|   \details Clears the pending bit of a device specific interrupt in the NVIC pending register. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Interrupt Priority | ||||
|   \details Sets the priority of a device specific interrupt or a processor exception. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|   \param [in]      IRQn  Interrupt number. | ||||
|   \param [in]  priority  Priority to set. | ||||
|   \note    The priority cannot be set for every processor exception. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->IP[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) | | ||||
|        (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | | ||||
|        (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Interrupt Priority | ||||
|   \details Reads the priority of a device specific interrupt or a processor exception. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|   \param [in]   IRQn  Interrupt number. | ||||
|   \return             Interrupt Priority. | ||||
|                       Value is aligned automatically to the implemented priority bits of the microcontroller. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) | ||||
| { | ||||
|  | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Encode Priority | ||||
|   \details Encodes the priority for an interrupt with the given priority group, | ||||
|            preemptive priority value, and subpriority value. | ||||
|            In case of a conflict between priority grouping and available | ||||
|            priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. | ||||
|   \param [in]     PriorityGroup  Used priority group. | ||||
|   \param [in]   PreemptPriority  Preemptive priority value (starting from 0). | ||||
|   \param [in]       SubPriority  Subpriority value (starting from 0). | ||||
|   \return                        Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) | ||||
| { | ||||
|   uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */ | ||||
|   uint32_t PreemptPriorityBits; | ||||
|   uint32_t SubPriorityBits; | ||||
|  | ||||
|   PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); | ||||
|   SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); | ||||
|  | ||||
|   return ( | ||||
|            ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | | ||||
|            ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL))) | ||||
|          ); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Decode Priority | ||||
|   \details Decodes an interrupt priority value with a given priority group to | ||||
|            preemptive priority value and subpriority value. | ||||
|            In case of a conflict between priority grouping and available | ||||
|            priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. | ||||
|   \param [in]         Priority   Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). | ||||
|   \param [in]     PriorityGroup  Used priority group. | ||||
|   \param [out] pPreemptPriority  Preemptive priority value (starting from 0). | ||||
|   \param [out]     pSubPriority  Subpriority value (starting from 0). | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) | ||||
| { | ||||
|   uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */ | ||||
|   uint32_t PreemptPriorityBits; | ||||
|   uint32_t SubPriorityBits; | ||||
|  | ||||
|   PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); | ||||
|   SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); | ||||
|  | ||||
|   *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); | ||||
|   *pSubPriority     = (Priority                   ) & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Interrupt Vector | ||||
|   \details Sets an interrupt vector in SRAM based interrupt vector table. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|            Address 0 must be mapped to SRAM. | ||||
|   \param [in]   IRQn      Interrupt number | ||||
|   \param [in]   vector    Address of interrupt handler function | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) | ||||
| { | ||||
|   uint32_t *vectors = (uint32_t *)0x0U; | ||||
|   vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Interrupt Vector | ||||
|   \details Reads an interrupt vector from interrupt vector table. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|   \param [in]   IRQn      Interrupt number. | ||||
|   \return                 Address of interrupt handler function | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) | ||||
| { | ||||
|   uint32_t *vectors = (uint32_t *)0x0U; | ||||
|   return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   System Reset | ||||
|   \details Initiates a system reset request to reset the MCU. | ||||
|  */ | ||||
| __NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) | ||||
| { | ||||
|   __DSB();                                                          /* Ensure all outstanding memory accesses included | ||||
|                                                                        buffered write are completed before reset */ | ||||
|   SCB->AIRCR  = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | | ||||
|                  SCB_AIRCR_SYSRESETREQ_Msk); | ||||
|   __DSB();                                                          /* Ensure completion of memory access */ | ||||
|  | ||||
|   for(;;)                                                           /* wait until reset */ | ||||
|   { | ||||
|     __NOP(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /*@} end of CMSIS_Core_NVICFunctions */ | ||||
|  | ||||
|  | ||||
| /* ##########################  FPU functions  #################################### */ | ||||
| /** | ||||
|   \ingroup  CMSIS_Core_FunctionInterface | ||||
|   \defgroup CMSIS_Core_FpuFunctions FPU Functions | ||||
|   \brief    Function that provides FPU type. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief   get FPU type | ||||
|   \details returns the FPU type | ||||
|   \returns | ||||
|    - \b  0: No FPU | ||||
|    - \b  1: Single precision FPU | ||||
|    - \b  2: Double + Single precision FPU | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t SCB_GetFPUType(void) | ||||
| { | ||||
|     return 0U;           /* No FPU */ | ||||
| } | ||||
|  | ||||
|  | ||||
| /*@} end of CMSIS_Core_FpuFunctions */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /* ##################################    SysTick function  ############################################ */ | ||||
| /** | ||||
|   \ingroup  CMSIS_Core_FunctionInterface | ||||
|   \defgroup CMSIS_Core_SysTickFunctions SysTick Functions | ||||
|   \brief    Functions that configure the System. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| #if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) | ||||
|  | ||||
| /** | ||||
|   \brief   System Tick Configuration | ||||
|   \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. | ||||
|            Counter is in free running mode to generate periodic interrupts. | ||||
|   \param [in]  ticks  Number of ticks between two interrupts. | ||||
|   \return          0  Function succeeded. | ||||
|   \return          1  Function failed. | ||||
|   \note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the | ||||
|            function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b> | ||||
|            must contain a vendor-specific implementation of this function. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) | ||||
| { | ||||
|   if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) | ||||
|   { | ||||
|     return (1UL);                                                   /* Reload value impossible */ | ||||
|   } | ||||
|  | ||||
|   SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */ | ||||
|   NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ | ||||
|   SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */ | ||||
|   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | | ||||
|                    SysTick_CTRL_TICKINT_Msk   | | ||||
|                    SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */ | ||||
|   return (0UL);                                                     /* Function successful */ | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| /*@} end of CMSIS_Core_SysTickFunctions */ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __CORE_CM0_H_DEPENDANT */ | ||||
|  | ||||
| #endif /* __CMSIS_GENERIC */ | ||||
							
								
								
									
										1083
									
								
								fw/Drivers/CMSIS/Include/core_cm0plus.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1083
									
								
								fw/Drivers/CMSIS/Include/core_cm0plus.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										976
									
								
								fw/Drivers/CMSIS/Include/core_cm1.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										976
									
								
								fw/Drivers/CMSIS/Include/core_cm1.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,976 @@ | ||||
| /**************************************************************************//** | ||||
|  * @file     core_cm1.h | ||||
|  * @brief    CMSIS Cortex-M1 Core Peripheral Access Layer Header File | ||||
|  * @version  V1.0.0 | ||||
|  * @date     23. July 2018 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2009-2018 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the License); you may | ||||
|  * not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an AS IS BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header   /* treat file as system include file */ | ||||
| #endif | ||||
|  | ||||
| #ifndef __CORE_CM1_H_GENERIC | ||||
| #define __CORE_CM1_H_GENERIC | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|   \page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions | ||||
|   CMSIS violates the following MISRA-C:2004 rules: | ||||
|  | ||||
|    \li Required Rule 8.5, object/function definition in header file.<br> | ||||
|      Function definitions in header files are used to allow 'inlining'. | ||||
|  | ||||
|    \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br> | ||||
|      Unions are used for effective representation of core registers. | ||||
|  | ||||
|    \li Advisory Rule 19.7, Function-like macro defined.<br> | ||||
|      Function-like macros are used to allow more efficient code. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| /******************************************************************************* | ||||
|  *                 CMSIS definitions | ||||
|  ******************************************************************************/ | ||||
| /** | ||||
|   \ingroup Cortex_M1 | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| #include "cmsis_version.h" | ||||
|   | ||||
| /*  CMSIS CM1 definitions */ | ||||
| #define __CM1_CMSIS_VERSION_MAIN  (__CM_CMSIS_VERSION_MAIN)              /*!< \deprecated [31:16] CMSIS HAL main version */ | ||||
| #define __CM1_CMSIS_VERSION_SUB   (__CM_CMSIS_VERSION_SUB)               /*!< \deprecated [15:0]  CMSIS HAL sub version */ | ||||
| #define __CM1_CMSIS_VERSION       ((__CM1_CMSIS_VERSION_MAIN << 16U) | \ | ||||
|                                     __CM1_CMSIS_VERSION_SUB           )  /*!< \deprecated CMSIS HAL version number */ | ||||
|  | ||||
| #define __CORTEX_M                (1U)                                   /*!< Cortex-M Core */ | ||||
|  | ||||
| /** __FPU_USED indicates whether an FPU is used or not. | ||||
|     This core does not support an FPU at all | ||||
| */ | ||||
| #define __FPU_USED       0U | ||||
|  | ||||
| #if defined ( __CC_ARM ) | ||||
|   #if defined __TARGET_FPU_VFP | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) | ||||
|   #if defined __ARM_PCS_VFP | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __GNUC__ ) | ||||
|   #if defined (__VFP_FP__) && !defined(__SOFTFP__) | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __ICCARM__ ) | ||||
|   #if defined __ARMVFP__ | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __TI_ARM__ ) | ||||
|   #if defined __TI_VFP_SUPPORT__ | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __TASKING__ ) | ||||
|   #if defined __FPU_VFP__ | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #elif defined ( __CSMC__ ) | ||||
|   #if ( __CSMC__ & 0x400U) | ||||
|     #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" | ||||
|   #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #include "cmsis_compiler.h"               /* CMSIS compiler specific defines */ | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __CORE_CM1_H_GENERIC */ | ||||
|  | ||||
| #ifndef __CMSIS_GENERIC | ||||
|  | ||||
| #ifndef __CORE_CM1_H_DEPENDANT | ||||
| #define __CORE_CM1_H_DEPENDANT | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* check device defines and use defaults */ | ||||
| #if defined __CHECK_DEVICE_DEFINES | ||||
|   #ifndef __CM1_REV | ||||
|     #define __CM1_REV               0x0100U | ||||
|     #warning "__CM1_REV not defined in device header file; using default!" | ||||
|   #endif | ||||
|  | ||||
|   #ifndef __NVIC_PRIO_BITS | ||||
|     #define __NVIC_PRIO_BITS          2U | ||||
|     #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" | ||||
|   #endif | ||||
|  | ||||
|   #ifndef __Vendor_SysTickConfig | ||||
|     #define __Vendor_SysTickConfig    0U | ||||
|     #warning "__Vendor_SysTickConfig not defined in device header file; using default!" | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| /* IO definitions (access restrictions to peripheral registers) */ | ||||
| /** | ||||
|     \defgroup CMSIS_glob_defs CMSIS Global Defines | ||||
|  | ||||
|     <strong>IO Type Qualifiers</strong> are used | ||||
|     \li to specify the access to peripheral variables. | ||||
|     \li for automatic generation of peripheral register debug information. | ||||
| */ | ||||
| #ifdef __cplusplus | ||||
|   #define   __I     volatile             /*!< Defines 'read only' permissions */ | ||||
| #else | ||||
|   #define   __I     volatile const       /*!< Defines 'read only' permissions */ | ||||
| #endif | ||||
| #define     __O     volatile             /*!< Defines 'write only' permissions */ | ||||
| #define     __IO    volatile             /*!< Defines 'read / write' permissions */ | ||||
|  | ||||
| /* following defines should be used for structure members */ | ||||
| #define     __IM     volatile const      /*! Defines 'read only' structure member permissions */ | ||||
| #define     __OM     volatile            /*! Defines 'write only' structure member permissions */ | ||||
| #define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */ | ||||
|  | ||||
| /*@} end of group Cortex_M1 */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /******************************************************************************* | ||||
|  *                 Register Abstraction | ||||
|   Core Register contain: | ||||
|   - Core Register | ||||
|   - Core NVIC Register | ||||
|   - Core SCB Register | ||||
|   - Core SysTick Register | ||||
|  ******************************************************************************/ | ||||
| /** | ||||
|   \defgroup CMSIS_core_register Defines and Type Definitions | ||||
|   \brief Type definitions and defines for Cortex-M processor based devices. | ||||
| */ | ||||
|  | ||||
| /** | ||||
|   \ingroup    CMSIS_core_register | ||||
|   \defgroup   CMSIS_CORE  Status and Control Registers | ||||
|   \brief      Core Register type definitions. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief  Union type to access the Application Program Status Register (APSR). | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t _reserved0:28;              /*!< bit:  0..27  Reserved */ | ||||
|     uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */ | ||||
|     uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */ | ||||
|     uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */ | ||||
|     uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */ | ||||
|   } b;                                   /*!< Structure used for bit  access */ | ||||
|   uint32_t w;                            /*!< Type      used for word access */ | ||||
| } APSR_Type; | ||||
|  | ||||
| /* APSR Register Definitions */ | ||||
| #define APSR_N_Pos                         31U                                            /*!< APSR: N Position */ | ||||
| #define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */ | ||||
|  | ||||
| #define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */ | ||||
| #define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */ | ||||
|  | ||||
| #define APSR_C_Pos                         29U                                            /*!< APSR: C Position */ | ||||
| #define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */ | ||||
|  | ||||
| #define APSR_V_Pos                         28U                                            /*!< APSR: V Position */ | ||||
| #define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief  Union type to access the Interrupt Program Status Register (IPSR). | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */ | ||||
|     uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */ | ||||
|   } b;                                   /*!< Structure used for bit  access */ | ||||
|   uint32_t w;                            /*!< Type      used for word access */ | ||||
| } IPSR_Type; | ||||
|  | ||||
| /* IPSR Register Definitions */ | ||||
| #define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */ | ||||
| #define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief  Union type to access the Special-Purpose Program Status Registers (xPSR). | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */ | ||||
|     uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved */ | ||||
|     uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0) */ | ||||
|     uint32_t _reserved1:3;               /*!< bit: 25..27  Reserved */ | ||||
|     uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */ | ||||
|     uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */ | ||||
|     uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */ | ||||
|     uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */ | ||||
|   } b;                                   /*!< Structure used for bit  access */ | ||||
|   uint32_t w;                            /*!< Type      used for word access */ | ||||
| } xPSR_Type; | ||||
|  | ||||
| /* xPSR Register Definitions */ | ||||
| #define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */ | ||||
| #define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */ | ||||
|  | ||||
| #define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */ | ||||
| #define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */ | ||||
|  | ||||
| #define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */ | ||||
| #define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */ | ||||
|  | ||||
| #define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */ | ||||
| #define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */ | ||||
|  | ||||
| #define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */ | ||||
| #define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */ | ||||
|  | ||||
| #define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */ | ||||
| #define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief  Union type to access the Control Registers (CONTROL). | ||||
|  */ | ||||
| typedef union | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     uint32_t _reserved0:1;               /*!< bit:      0  Reserved */ | ||||
|     uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used */ | ||||
|     uint32_t _reserved1:30;              /*!< bit:  2..31  Reserved */ | ||||
|   } b;                                   /*!< Structure used for bit  access */ | ||||
|   uint32_t w;                            /*!< Type      used for word access */ | ||||
| } CONTROL_Type; | ||||
|  | ||||
| /* CONTROL Register Definitions */ | ||||
| #define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */ | ||||
| #define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */ | ||||
|  | ||||
| /*@} end of group CMSIS_CORE */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup    CMSIS_core_register | ||||
|   \defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC) | ||||
|   \brief      Type definitions for the NVIC Registers | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC). | ||||
|  */ | ||||
| typedef struct | ||||
| { | ||||
|   __IOM uint32_t ISER[1U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */ | ||||
|         uint32_t RESERVED0[31U]; | ||||
|   __IOM uint32_t ICER[1U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */ | ||||
|         uint32_t RSERVED1[31U]; | ||||
|   __IOM uint32_t ISPR[1U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */ | ||||
|         uint32_t RESERVED2[31U]; | ||||
|   __IOM uint32_t ICPR[1U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */ | ||||
|         uint32_t RESERVED3[31U]; | ||||
|         uint32_t RESERVED4[64U]; | ||||
|   __IOM uint32_t IP[8U];                 /*!< Offset: 0x300 (R/W)  Interrupt Priority Register */ | ||||
| }  NVIC_Type; | ||||
|  | ||||
| /*@} end of group CMSIS_NVIC */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup  CMSIS_core_register | ||||
|   \defgroup CMSIS_SCB     System Control Block (SCB) | ||||
|   \brief    Type definitions for the System Control Block Registers | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief  Structure type to access the System Control Block (SCB). | ||||
|  */ | ||||
| typedef struct | ||||
| { | ||||
|   __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */ | ||||
|   __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */ | ||||
|         uint32_t RESERVED0; | ||||
|   __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */ | ||||
|   __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */ | ||||
|   __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */ | ||||
|         uint32_t RESERVED1; | ||||
|   __IOM uint32_t SHP[2U];                /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED */ | ||||
|   __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */ | ||||
| } SCB_Type; | ||||
|  | ||||
| /* SCB CPUID Register Definitions */ | ||||
| #define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */ | ||||
| #define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */ | ||||
|  | ||||
| #define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */ | ||||
| #define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */ | ||||
|  | ||||
| #define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */ | ||||
| #define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */ | ||||
|  | ||||
| #define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */ | ||||
| #define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */ | ||||
|  | ||||
| #define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */ | ||||
| #define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */ | ||||
|  | ||||
| /* SCB Interrupt Control State Register Definitions */ | ||||
| #define SCB_ICSR_NMIPENDSET_Pos            31U                                            /*!< SCB ICSR: NMIPENDSET Position */ | ||||
| #define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */ | ||||
| #define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */ | ||||
| #define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */ | ||||
| #define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */ | ||||
|  | ||||
| #define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */ | ||||
| #define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */ | ||||
|  | ||||
| #define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */ | ||||
| #define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */ | ||||
|  | ||||
| #define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */ | ||||
| #define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */ | ||||
|  | ||||
| #define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */ | ||||
| #define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */ | ||||
|  | ||||
| #define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */ | ||||
| #define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */ | ||||
|  | ||||
| /* SCB Application Interrupt and Reset Control Register Definitions */ | ||||
| #define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */ | ||||
| #define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */ | ||||
| #define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */ | ||||
| #define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */ | ||||
| #define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */ | ||||
|  | ||||
| #define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */ | ||||
| #define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */ | ||||
|  | ||||
| /* SCB System Control Register Definitions */ | ||||
| #define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */ | ||||
| #define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */ | ||||
|  | ||||
| #define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */ | ||||
| #define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */ | ||||
|  | ||||
| #define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */ | ||||
| #define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */ | ||||
|  | ||||
| /* SCB Configuration Control Register Definitions */ | ||||
| #define SCB_CCR_STKALIGN_Pos                9U                                            /*!< SCB CCR: STKALIGN Position */ | ||||
| #define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */ | ||||
|  | ||||
| #define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */ | ||||
| #define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */ | ||||
|  | ||||
| /* SCB System Handler Control and State Register Definitions */ | ||||
| #define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */ | ||||
| #define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */ | ||||
|  | ||||
| /*@} end of group CMSIS_SCB */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup  CMSIS_core_register | ||||
|   \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) | ||||
|   \brief    Type definitions for the System Control and ID Register not in the SCB | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief  Structure type to access the System Control and ID Register not in the SCB. | ||||
|  */ | ||||
| typedef struct | ||||
| { | ||||
|         uint32_t RESERVED0[2U]; | ||||
|   __IOM uint32_t ACTLR;                  /*!< Offset: 0x008 (R/W)  Auxiliary Control Register */ | ||||
| } SCnSCB_Type; | ||||
|  | ||||
| /* Auxiliary Control Register Definitions */ | ||||
| #define SCnSCB_ACTLR_ITCMUAEN_Pos            4U                                        /*!< ACTLR: Instruction TCM Upper Alias Enable Position */ | ||||
| #define SCnSCB_ACTLR_ITCMUAEN_Msk           (1UL << SCnSCB_ACTLR_ITCMUAEN_Pos)         /*!< ACTLR: Instruction TCM Upper Alias Enable Mask */ | ||||
|  | ||||
| #define SCnSCB_ACTLR_ITCMLAEN_Pos            3U                                        /*!< ACTLR: Instruction TCM Lower Alias Enable Position */ | ||||
| #define SCnSCB_ACTLR_ITCMLAEN_Msk           (1UL << SCnSCB_ACTLR_ITCMLAEN_Pos)         /*!< ACTLR: Instruction TCM Lower Alias Enable Mask */ | ||||
|  | ||||
| /*@} end of group CMSIS_SCnotSCB */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup  CMSIS_core_register | ||||
|   \defgroup CMSIS_SysTick     System Tick Timer (SysTick) | ||||
|   \brief    Type definitions for the System Timer Registers. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief  Structure type to access the System Timer (SysTick). | ||||
|  */ | ||||
| typedef struct | ||||
| { | ||||
|   __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */ | ||||
|   __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */ | ||||
|   __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */ | ||||
|   __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */ | ||||
| } SysTick_Type; | ||||
|  | ||||
| /* SysTick Control / Status Register Definitions */ | ||||
| #define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */ | ||||
| #define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */ | ||||
|  | ||||
| #define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */ | ||||
| #define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */ | ||||
|  | ||||
| #define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */ | ||||
| #define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */ | ||||
|  | ||||
| #define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */ | ||||
| #define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */ | ||||
|  | ||||
| /* SysTick Reload Register Definitions */ | ||||
| #define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */ | ||||
| #define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */ | ||||
|  | ||||
| /* SysTick Current Register Definitions */ | ||||
| #define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */ | ||||
| #define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */ | ||||
|  | ||||
| /* SysTick Calibration Register Definitions */ | ||||
| #define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */ | ||||
| #define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */ | ||||
|  | ||||
| #define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */ | ||||
| #define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */ | ||||
|  | ||||
| #define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */ | ||||
| #define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */ | ||||
|  | ||||
| /*@} end of group CMSIS_SysTick */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup  CMSIS_core_register | ||||
|   \defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug) | ||||
|   \brief    Cortex-M1 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. | ||||
|             Therefore they are not covered by the Cortex-M1 header file. | ||||
|   @{ | ||||
|  */ | ||||
| /*@} end of group CMSIS_CoreDebug */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup    CMSIS_core_register | ||||
|   \defgroup   CMSIS_core_bitfield     Core register bit field macros | ||||
|   \brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk). | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief   Mask and shift a bit field value for use in a register bit range. | ||||
|   \param[in] field  Name of the register bit field. | ||||
|   \param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type. | ||||
|   \return           Masked and shifted value. | ||||
| */ | ||||
| #define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk) | ||||
|  | ||||
| /** | ||||
|   \brief     Mask and shift a register value to extract a bit filed value. | ||||
|   \param[in] field  Name of the register bit field. | ||||
|   \param[in] value  Value of register. This parameter is interpreted as an uint32_t type. | ||||
|   \return           Masked and shifted bit field value. | ||||
| */ | ||||
| #define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) | ||||
|  | ||||
| /*@} end of group CMSIS_core_bitfield */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \ingroup    CMSIS_core_register | ||||
|   \defgroup   CMSIS_core_base     Core Definitions | ||||
|   \brief      Definitions for base addresses, unions, and structures. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /* Memory mapping of Core Hardware */ | ||||
| #define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */ | ||||
| #define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address */ | ||||
| #define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address */ | ||||
| #define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */ | ||||
|  | ||||
| #define SCnSCB              ((SCnSCB_Type    *)     SCS_BASE      )   /*!< System control Register not in SCB */ | ||||
| #define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct */ | ||||
| #define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct */ | ||||
| #define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct */ | ||||
|  | ||||
|  | ||||
| /*@} */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /******************************************************************************* | ||||
|  *                Hardware Abstraction Layer | ||||
|   Core Function Interface contains: | ||||
|   - Core NVIC Functions | ||||
|   - Core SysTick Functions | ||||
|   - Core Register Access Functions | ||||
|  ******************************************************************************/ | ||||
| /** | ||||
|   \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference | ||||
| */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /* ##########################   NVIC functions  #################################### */ | ||||
| /** | ||||
|   \ingroup  CMSIS_Core_FunctionInterface | ||||
|   \defgroup CMSIS_Core_NVICFunctions NVIC Functions | ||||
|   \brief    Functions that manage interrupts and exceptions via the NVIC. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| #ifdef CMSIS_NVIC_VIRTUAL | ||||
|   #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE | ||||
|     #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" | ||||
|   #endif | ||||
|   #include CMSIS_NVIC_VIRTUAL_HEADER_FILE | ||||
| #else | ||||
|   #define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping | ||||
|   #define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping | ||||
|   #define NVIC_EnableIRQ              __NVIC_EnableIRQ | ||||
|   #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ | ||||
|   #define NVIC_DisableIRQ             __NVIC_DisableIRQ | ||||
|   #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ | ||||
|   #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ | ||||
|   #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ | ||||
| /*#define NVIC_GetActive              __NVIC_GetActive             not available for Cortex-M1 */ | ||||
|   #define NVIC_SetPriority            __NVIC_SetPriority | ||||
|   #define NVIC_GetPriority            __NVIC_GetPriority | ||||
|   #define NVIC_SystemReset            __NVIC_SystemReset | ||||
| #endif /* CMSIS_NVIC_VIRTUAL */ | ||||
|  | ||||
| #ifdef CMSIS_VECTAB_VIRTUAL | ||||
|   #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE | ||||
|     #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" | ||||
|   #endif | ||||
|   #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE | ||||
| #else | ||||
|   #define NVIC_SetVector              __NVIC_SetVector | ||||
|   #define NVIC_GetVector              __NVIC_GetVector | ||||
| #endif  /* (CMSIS_VECTAB_VIRTUAL) */ | ||||
|  | ||||
| #define NVIC_USER_IRQ_OFFSET          16 | ||||
|  | ||||
|  | ||||
| /* The following EXC_RETURN values are saved the LR on exception entry */ | ||||
| #define EXC_RETURN_HANDLER         (0xFFFFFFF1UL)     /* return to Handler mode, uses MSP after return                               */ | ||||
| #define EXC_RETURN_THREAD_MSP      (0xFFFFFFF9UL)     /* return to Thread mode, uses MSP after return                                */ | ||||
| #define EXC_RETURN_THREAD_PSP      (0xFFFFFFFDUL)     /* return to Thread mode, uses PSP after return                                */ | ||||
|  | ||||
|  | ||||
| /* Interrupt Priorities are WORD accessible only under Armv6-M                  */ | ||||
| /* The following MACROS handle generation of the register offset and byte masks */ | ||||
| #define _BIT_SHIFT(IRQn)         (  ((((uint32_t)(int32_t)(IRQn))         )      &  0x03UL) * 8UL) | ||||
| #define _SHP_IDX(IRQn)           ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >>    2UL)      ) | ||||
| #define _IP_IDX(IRQn)            (   (((uint32_t)(int32_t)(IRQn))                >>    2UL)      ) | ||||
|  | ||||
| #define __NVIC_SetPriorityGrouping(X) (void)(X) | ||||
| #define __NVIC_GetPriorityGrouping()  (0U) | ||||
|  | ||||
| /** | ||||
|   \brief   Enable Interrupt | ||||
|   \details Enables a device specific interrupt in the NVIC interrupt controller. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Interrupt Enable status | ||||
|   \details Returns a device specific interrupt enable status from the NVIC interrupt controller. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \return             0  Interrupt is not enabled. | ||||
|   \return             1  Interrupt is enabled. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return(0U); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Disable Interrupt | ||||
|   \details Disables a device specific interrupt in the NVIC interrupt controller. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|     __DSB(); | ||||
|     __ISB(); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Pending Interrupt | ||||
|   \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \return             0  Interrupt status is not pending. | ||||
|   \return             1  Interrupt status is pending. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return(0U); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Pending Interrupt | ||||
|   \details Sets the pending bit of a device specific interrupt in the NVIC pending register. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Clear Pending Interrupt | ||||
|   \details Clears the pending bit of a device specific interrupt in the NVIC pending register. | ||||
|   \param [in]      IRQn  Device specific interrupt number. | ||||
|   \note    IRQn must not be negative. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Interrupt Priority | ||||
|   \details Sets the priority of a device specific interrupt or a processor exception. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|   \param [in]      IRQn  Interrupt number. | ||||
|   \param [in]  priority  Priority to set. | ||||
|   \note    The priority cannot be set for every processor exception. | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) | ||||
| { | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     NVIC->IP[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) | | ||||
|        (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | | ||||
|        (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Interrupt Priority | ||||
|   \details Reads the priority of a device specific interrupt or a processor exception. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|   \param [in]   IRQn  Interrupt number. | ||||
|   \return             Interrupt Priority. | ||||
|                       Value is aligned automatically to the implemented priority bits of the microcontroller. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) | ||||
| { | ||||
|  | ||||
|   if ((int32_t)(IRQn) >= 0) | ||||
|   { | ||||
|     return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Encode Priority | ||||
|   \details Encodes the priority for an interrupt with the given priority group, | ||||
|            preemptive priority value, and subpriority value. | ||||
|            In case of a conflict between priority grouping and available | ||||
|            priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. | ||||
|   \param [in]     PriorityGroup  Used priority group. | ||||
|   \param [in]   PreemptPriority  Preemptive priority value (starting from 0). | ||||
|   \param [in]       SubPriority  Subpriority value (starting from 0). | ||||
|   \return                        Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) | ||||
| { | ||||
|   uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */ | ||||
|   uint32_t PreemptPriorityBits; | ||||
|   uint32_t SubPriorityBits; | ||||
|  | ||||
|   PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); | ||||
|   SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); | ||||
|  | ||||
|   return ( | ||||
|            ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | | ||||
|            ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL))) | ||||
|          ); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Decode Priority | ||||
|   \details Decodes an interrupt priority value with a given priority group to | ||||
|            preemptive priority value and subpriority value. | ||||
|            In case of a conflict between priority grouping and available | ||||
|            priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. | ||||
|   \param [in]         Priority   Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). | ||||
|   \param [in]     PriorityGroup  Used priority group. | ||||
|   \param [out] pPreemptPriority  Preemptive priority value (starting from 0). | ||||
|   \param [out]     pSubPriority  Subpriority value (starting from 0). | ||||
|  */ | ||||
| __STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) | ||||
| { | ||||
|   uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */ | ||||
|   uint32_t PreemptPriorityBits; | ||||
|   uint32_t SubPriorityBits; | ||||
|  | ||||
|   PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); | ||||
|   SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); | ||||
|  | ||||
|   *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); | ||||
|   *pSubPriority     = (Priority                   ) & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Set Interrupt Vector | ||||
|   \details Sets an interrupt vector in SRAM based interrupt vector table. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|            Address 0 must be mapped to SRAM. | ||||
|   \param [in]   IRQn      Interrupt number | ||||
|   \param [in]   vector    Address of interrupt handler function | ||||
|  */ | ||||
| __STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) | ||||
| { | ||||
|   uint32_t *vectors = (uint32_t *)0x0U; | ||||
|   vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   Get Interrupt Vector | ||||
|   \details Reads an interrupt vector from interrupt vector table. | ||||
|            The interrupt number can be positive to specify a device specific interrupt, | ||||
|            or negative to specify a processor exception. | ||||
|   \param [in]   IRQn      Interrupt number. | ||||
|   \return                 Address of interrupt handler function | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) | ||||
| { | ||||
|   uint32_t *vectors = (uint32_t *)0x0U; | ||||
|   return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   \brief   System Reset | ||||
|   \details Initiates a system reset request to reset the MCU. | ||||
|  */ | ||||
| __NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) | ||||
| { | ||||
|   __DSB();                                                          /* Ensure all outstanding memory accesses included | ||||
|                                                                        buffered write are completed before reset */ | ||||
|   SCB->AIRCR  = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | | ||||
|                  SCB_AIRCR_SYSRESETREQ_Msk); | ||||
|   __DSB();                                                          /* Ensure completion of memory access */ | ||||
|  | ||||
|   for(;;)                                                           /* wait until reset */ | ||||
|   { | ||||
|     __NOP(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /*@} end of CMSIS_Core_NVICFunctions */ | ||||
|  | ||||
|  | ||||
| /* ##########################  FPU functions  #################################### */ | ||||
| /** | ||||
|   \ingroup  CMSIS_Core_FunctionInterface | ||||
|   \defgroup CMSIS_Core_FpuFunctions FPU Functions | ||||
|   \brief    Function that provides FPU type. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|   \brief   get FPU type | ||||
|   \details returns the FPU type | ||||
|   \returns | ||||
|    - \b  0: No FPU | ||||
|    - \b  1: Single precision FPU | ||||
|    - \b  2: Double + Single precision FPU | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t SCB_GetFPUType(void) | ||||
| { | ||||
|     return 0U;           /* No FPU */ | ||||
| } | ||||
|  | ||||
|  | ||||
| /*@} end of CMSIS_Core_FpuFunctions */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /* ##################################    SysTick function  ############################################ */ | ||||
| /** | ||||
|   \ingroup  CMSIS_Core_FunctionInterface | ||||
|   \defgroup CMSIS_Core_SysTickFunctions SysTick Functions | ||||
|   \brief    Functions that configure the System. | ||||
|   @{ | ||||
|  */ | ||||
|  | ||||
| #if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) | ||||
|  | ||||
| /** | ||||
|   \brief   System Tick Configuration | ||||
|   \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. | ||||
|            Counter is in free running mode to generate periodic interrupts. | ||||
|   \param [in]  ticks  Number of ticks between two interrupts. | ||||
|   \return          0  Function succeeded. | ||||
|   \return          1  Function failed. | ||||
|   \note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the | ||||
|            function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b> | ||||
|            must contain a vendor-specific implementation of this function. | ||||
|  */ | ||||
| __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) | ||||
| { | ||||
|   if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) | ||||
|   { | ||||
|     return (1UL);                                                   /* Reload value impossible */ | ||||
|   } | ||||
|  | ||||
|   SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */ | ||||
|   NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ | ||||
|   SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */ | ||||
|   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | | ||||
|                    SysTick_CTRL_TICKINT_Msk   | | ||||
|                    SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */ | ||||
|   return (0UL);                                                     /* Function successful */ | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| /*@} end of CMSIS_Core_SysTickFunctions */ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __CORE_CM1_H_DEPENDANT */ | ||||
|  | ||||
| #endif /* __CMSIS_GENERIC */ | ||||
							
								
								
									
										1993
									
								
								fw/Drivers/CMSIS/Include/core_cm23.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1993
									
								
								fw/Drivers/CMSIS/Include/core_cm23.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1941
									
								
								fw/Drivers/CMSIS/Include/core_cm3.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1941
									
								
								fw/Drivers/CMSIS/Include/core_cm3.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3002
									
								
								fw/Drivers/CMSIS/Include/core_cm33.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3002
									
								
								fw/Drivers/CMSIS/Include/core_cm33.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2129
									
								
								fw/Drivers/CMSIS/Include/core_cm4.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2129
									
								
								fw/Drivers/CMSIS/Include/core_cm4.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2671
									
								
								fw/Drivers/CMSIS/Include/core_cm7.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2671
									
								
								fw/Drivers/CMSIS/Include/core_cm7.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1022
									
								
								fw/Drivers/CMSIS/Include/core_sc000.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1022
									
								
								fw/Drivers/CMSIS/Include/core_sc000.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1915
									
								
								fw/Drivers/CMSIS/Include/core_sc300.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1915
									
								
								fw/Drivers/CMSIS/Include/core_sc300.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										270
									
								
								fw/Drivers/CMSIS/Include/mpu_armv7.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										270
									
								
								fw/Drivers/CMSIS/Include/mpu_armv7.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,270 @@ | ||||
| /****************************************************************************** | ||||
|  * @file     mpu_armv7.h | ||||
|  * @brief    CMSIS MPU API for Armv7-M MPU | ||||
|  * @version  V5.0.4 | ||||
|  * @date     10. January 2018 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2017-2018 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the License); you may | ||||
|  * not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an AS IS BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|   | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header    /* treat file as system include file */ | ||||
| #endif | ||||
|   | ||||
| #ifndef ARM_MPU_ARMV7_H | ||||
| #define ARM_MPU_ARMV7_H | ||||
|  | ||||
| #define ARM_MPU_REGION_SIZE_32B      ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes | ||||
| #define ARM_MPU_REGION_SIZE_64B      ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes | ||||
| #define ARM_MPU_REGION_SIZE_128B     ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes | ||||
| #define ARM_MPU_REGION_SIZE_256B     ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes | ||||
| #define ARM_MPU_REGION_SIZE_512B     ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes | ||||
| #define ARM_MPU_REGION_SIZE_1KB      ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte | ||||
| #define ARM_MPU_REGION_SIZE_2KB      ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_4KB      ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_8KB      ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_16KB     ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_32KB     ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_64KB     ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_128KB    ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_256KB    ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_512KB    ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes | ||||
| #define ARM_MPU_REGION_SIZE_1MB      ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte | ||||
| #define ARM_MPU_REGION_SIZE_2MB      ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_4MB      ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_8MB      ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_16MB     ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_32MB     ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_64MB     ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_128MB    ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_256MB    ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_512MB    ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes | ||||
| #define ARM_MPU_REGION_SIZE_1GB      ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte | ||||
| #define ARM_MPU_REGION_SIZE_2GB      ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes | ||||
| #define ARM_MPU_REGION_SIZE_4GB      ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes | ||||
|  | ||||
| #define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access | ||||
| #define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only | ||||
| #define ARM_MPU_AP_URO  2U ///!< MPU Access Permission unprivileged access read-only | ||||
| #define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access | ||||
| #define ARM_MPU_AP_PRO  5U ///!< MPU Access Permission privileged access read-only | ||||
| #define ARM_MPU_AP_RO   6U ///!< MPU Access Permission read-only access | ||||
|  | ||||
| /** MPU Region Base Address Register Value | ||||
| * | ||||
| * \param Region The region to be configured, number 0 to 15. | ||||
| * \param BaseAddress The base address for the region. | ||||
| */ | ||||
| #define ARM_MPU_RBAR(Region, BaseAddress) \ | ||||
|   (((BaseAddress) & MPU_RBAR_ADDR_Msk) |  \ | ||||
|    ((Region) & MPU_RBAR_REGION_Msk)    |  \ | ||||
|    (MPU_RBAR_VALID_Msk)) | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attributes | ||||
| *  | ||||
| * \param TypeExtField      Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. | ||||
| * \param IsShareable       Region is shareable between multiple bus masters. | ||||
| * \param IsCacheable       Region is cacheable, i.e. its value may be kept in cache. | ||||
| * \param IsBufferable      Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. | ||||
| */   | ||||
| #define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable)   \ | ||||
|   ((((TypeExtField ) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk)                 | \ | ||||
|    (((IsShareable ) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk)                      | \ | ||||
|    (((IsCacheable ) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk)                      | \ | ||||
|    (((IsBufferable ) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk)) | ||||
|  | ||||
| /** | ||||
| * MPU Region Attribute and Size Register Value | ||||
| *  | ||||
| * \param DisableExec       Instruction access disable bit, 1= disable instruction fetches. | ||||
| * \param AccessPermission  Data access permissions, allows you to configure read/write access for User and Privileged mode. | ||||
| * \param AccessAttributes  Memory access attribution, see \ref ARM_MPU_ACCESS_. | ||||
| * \param SubRegionDisable  Sub-region disable field. | ||||
| * \param Size              Region size of the region to be configured, for example 4K, 8K. | ||||
| */ | ||||
| #define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size)      \ | ||||
|   ((((DisableExec ) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk)                                          | \ | ||||
|    (((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk)                                      | \ | ||||
|    (((AccessAttributes) ) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) | ||||
|    | ||||
| /** | ||||
| * MPU Region Attribute and Size Register Value | ||||
| *  | ||||
| * \param DisableExec       Instruction access disable bit, 1= disable instruction fetches. | ||||
| * \param AccessPermission  Data access permissions, allows you to configure read/write access for User and Privileged mode. | ||||
| * \param TypeExtField      Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. | ||||
| * \param IsShareable       Region is shareable between multiple bus masters. | ||||
| * \param IsCacheable       Region is cacheable, i.e. its value may be kept in cache. | ||||
| * \param IsBufferable      Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. | ||||
| * \param SubRegionDisable  Sub-region disable field. | ||||
| * \param Size              Region size of the region to be configured, for example 4K, 8K. | ||||
| */                          | ||||
| #define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ | ||||
|   ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size) | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attribute for strongly ordered memory. | ||||
| *  - TEX: 000b | ||||
| *  - Shareable | ||||
| *  - Non-cacheable | ||||
| *  - Non-bufferable | ||||
| */  | ||||
| #define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U) | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attribute for device memory. | ||||
| *  - TEX: 000b (if non-shareable) or 010b (if shareable) | ||||
| *  - Shareable or non-shareable | ||||
| *  - Non-cacheable | ||||
| *  - Bufferable (if shareable) or non-bufferable (if non-shareable) | ||||
| * | ||||
| * \param IsShareable Configures the device memory as shareable or non-shareable. | ||||
| */  | ||||
| #define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U)) | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attribute for normal memory. | ||||
| *  - TEX: 1BBb (reflecting outer cacheability rules) | ||||
| *  - Shareable or non-shareable | ||||
| *  - Cacheable or non-cacheable (reflecting inner cacheability rules) | ||||
| *  - Bufferable or non-bufferable (reflecting inner cacheability rules) | ||||
| * | ||||
| * \param OuterCp Configures the outer cache policy. | ||||
| * \param InnerCp Configures the inner cache policy. | ||||
| * \param IsShareable Configures the memory as shareable or non-shareable. | ||||
| */  | ||||
| #define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) & 2U), ((InnerCp) & 1U)) | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attribute non-cacheable policy. | ||||
| */ | ||||
| #define ARM_MPU_CACHEP_NOCACHE 0U | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attribute write-back, write and read allocate policy. | ||||
| */ | ||||
| #define ARM_MPU_CACHEP_WB_WRA 1U | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attribute write-through, no write allocate policy. | ||||
| */ | ||||
| #define ARM_MPU_CACHEP_WT_NWA 2U | ||||
|  | ||||
| /** | ||||
| * MPU Memory Access Attribute write-back, no write allocate policy. | ||||
| */ | ||||
| #define ARM_MPU_CACHEP_WB_NWA 3U | ||||
|  | ||||
|  | ||||
| /** | ||||
| * Struct for a single MPU Region | ||||
| */ | ||||
| typedef struct { | ||||
|   uint32_t RBAR; //!< The region base address register value (RBAR) | ||||
|   uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR | ||||
| } ARM_MPU_Region_t; | ||||
|      | ||||
| /** Enable the MPU. | ||||
| * \param MPU_Control Default access permissions for unconfigured regions. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) | ||||
| { | ||||
|   __DSB(); | ||||
|   __ISB(); | ||||
|   MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; | ||||
| #ifdef SCB_SHCSR_MEMFAULTENA_Msk | ||||
|   SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /** Disable the MPU. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Disable(void) | ||||
| { | ||||
|   __DSB(); | ||||
|   __ISB(); | ||||
| #ifdef SCB_SHCSR_MEMFAULTENA_Msk | ||||
|   SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; | ||||
| #endif | ||||
|   MPU->CTRL  &= ~MPU_CTRL_ENABLE_Msk; | ||||
| } | ||||
|  | ||||
| /** Clear and disable the given MPU region. | ||||
| * \param rnr Region number to be cleared. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) | ||||
| { | ||||
|   MPU->RNR = rnr; | ||||
|   MPU->RASR = 0U; | ||||
| } | ||||
|  | ||||
| /** Configure an MPU region. | ||||
| * \param rbar Value for RBAR register. | ||||
| * \param rsar Value for RSAR register. | ||||
| */    | ||||
| __STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) | ||||
| { | ||||
|   MPU->RBAR = rbar; | ||||
|   MPU->RASR = rasr; | ||||
| } | ||||
|  | ||||
| /** Configure the given MPU region. | ||||
| * \param rnr Region number to be configured. | ||||
| * \param rbar Value for RBAR register. | ||||
| * \param rsar Value for RSAR register. | ||||
| */    | ||||
| __STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) | ||||
| { | ||||
|   MPU->RNR = rnr; | ||||
|   MPU->RBAR = rbar; | ||||
|   MPU->RASR = rasr; | ||||
| } | ||||
|  | ||||
| /** Memcopy with strictly ordered memory access, e.g. for register targets. | ||||
| * \param dst Destination data is copied to. | ||||
| * \param src Source data is copied from. | ||||
| * \param len Amount of data words to be copied. | ||||
| */ | ||||
| __STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) | ||||
| { | ||||
|   uint32_t i; | ||||
|   for (i = 0U; i < len; ++i)  | ||||
|   { | ||||
|     dst[i] = src[i]; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** Load the given number of MPU regions from a table. | ||||
| * \param table Pointer to the MPU configuration table. | ||||
| * \param cnt Amount of regions to be configured. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt)  | ||||
| { | ||||
|   const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; | ||||
|   while (cnt > MPU_TYPE_RALIASES) { | ||||
|     orderedCpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); | ||||
|     table += MPU_TYPE_RALIASES; | ||||
|     cnt -= MPU_TYPE_RALIASES; | ||||
|   } | ||||
|   orderedCpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); | ||||
| } | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										333
									
								
								fw/Drivers/CMSIS/Include/mpu_armv8.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										333
									
								
								fw/Drivers/CMSIS/Include/mpu_armv8.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,333 @@ | ||||
| /****************************************************************************** | ||||
|  * @file     mpu_armv8.h | ||||
|  * @brief    CMSIS MPU API for Armv8-M MPU | ||||
|  * @version  V5.0.4 | ||||
|  * @date     10. January 2018 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2017-2018 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the License); you may | ||||
|  * not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an AS IS BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header    /* treat file as system include file */ | ||||
| #endif | ||||
|  | ||||
| #ifndef ARM_MPU_ARMV8_H | ||||
| #define ARM_MPU_ARMV8_H | ||||
|  | ||||
| /** \brief Attribute for device memory (outer only) */ | ||||
| #define ARM_MPU_ATTR_DEVICE                           ( 0U ) | ||||
|  | ||||
| /** \brief Attribute for non-cacheable, normal memory */ | ||||
| #define ARM_MPU_ATTR_NON_CACHEABLE                    ( 4U ) | ||||
|  | ||||
| /** \brief Attribute for normal memory (outer and inner) | ||||
| * \param NT Non-Transient: Set to 1 for non-transient data. | ||||
| * \param WB Write-Back: Set to 1 to use write-back update policy. | ||||
| * \param RA Read Allocation: Set to 1 to use cache allocation on read miss. | ||||
| * \param WA Write Allocation: Set to 1 to use cache allocation on write miss. | ||||
| */ | ||||
| #define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \ | ||||
|   (((NT & 1U) << 3U) | ((WB & 1U) << 2U) | ((RA & 1U) << 1U) | (WA & 1U)) | ||||
|  | ||||
| /** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */ | ||||
| #define ARM_MPU_ATTR_DEVICE_nGnRnE (0U) | ||||
|  | ||||
| /** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */ | ||||
| #define ARM_MPU_ATTR_DEVICE_nGnRE  (1U) | ||||
|  | ||||
| /** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */ | ||||
| #define ARM_MPU_ATTR_DEVICE_nGRE   (2U) | ||||
|  | ||||
| /** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */ | ||||
| #define ARM_MPU_ATTR_DEVICE_GRE    (3U) | ||||
|  | ||||
| /** \brief Memory Attribute | ||||
| * \param O Outer memory attributes | ||||
| * \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes | ||||
| */ | ||||
| #define ARM_MPU_ATTR(O, I) (((O & 0xFU) << 4U) | (((O & 0xFU) != 0U) ? (I & 0xFU) : ((I & 0x3U) << 2U))) | ||||
|  | ||||
| /** \brief Normal memory non-shareable  */ | ||||
| #define ARM_MPU_SH_NON   (0U) | ||||
|  | ||||
| /** \brief Normal memory outer shareable  */ | ||||
| #define ARM_MPU_SH_OUTER (2U) | ||||
|  | ||||
| /** \brief Normal memory inner shareable  */ | ||||
| #define ARM_MPU_SH_INNER (3U) | ||||
|  | ||||
| /** \brief Memory access permissions | ||||
| * \param RO Read-Only: Set to 1 for read-only memory. | ||||
| * \param NP Non-Privileged: Set to 1 for non-privileged memory. | ||||
| */ | ||||
| #define ARM_MPU_AP_(RO, NP) (((RO & 1U) << 1U) | (NP & 1U)) | ||||
|  | ||||
| /** \brief Region Base Address Register value | ||||
| * \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned. | ||||
| * \param SH Defines the Shareability domain for this memory region. | ||||
| * \param RO Read-Only: Set to 1 for a read-only memory region. | ||||
| * \param NP Non-Privileged: Set to 1 for a non-privileged memory region. | ||||
| * \oaram XN eXecute Never: Set to 1 for a non-executable memory region. | ||||
| */ | ||||
| #define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \ | ||||
|   ((BASE & MPU_RBAR_BASE_Msk) | \ | ||||
|   ((SH << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \ | ||||
|   ((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \ | ||||
|   ((XN << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk)) | ||||
|  | ||||
| /** \brief Region Limit Address Register value | ||||
| * \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. | ||||
| * \param IDX The attribute index to be associated with this memory region. | ||||
| */ | ||||
| #define ARM_MPU_RLAR(LIMIT, IDX) \ | ||||
|   ((LIMIT & MPU_RLAR_LIMIT_Msk) | \ | ||||
|   ((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ | ||||
|   (MPU_RLAR_EN_Msk)) | ||||
|  | ||||
| /** | ||||
| * Struct for a single MPU Region | ||||
| */ | ||||
| typedef struct { | ||||
|   uint32_t RBAR;                   /*!< Region Base Address Register value */ | ||||
|   uint32_t RLAR;                   /*!< Region Limit Address Register value */ | ||||
| } ARM_MPU_Region_t; | ||||
|      | ||||
| /** Enable the MPU. | ||||
| * \param MPU_Control Default access permissions for unconfigured regions. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) | ||||
| { | ||||
|   __DSB(); | ||||
|   __ISB(); | ||||
|   MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; | ||||
| #ifdef SCB_SHCSR_MEMFAULTENA_Msk | ||||
|   SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /** Disable the MPU. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Disable(void) | ||||
| { | ||||
|   __DSB(); | ||||
|   __ISB(); | ||||
| #ifdef SCB_SHCSR_MEMFAULTENA_Msk | ||||
|   SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; | ||||
| #endif | ||||
|   MPU->CTRL  &= ~MPU_CTRL_ENABLE_Msk; | ||||
| } | ||||
|  | ||||
| #ifdef MPU_NS | ||||
| /** Enable the Non-secure MPU. | ||||
| * \param MPU_Control Default access permissions for unconfigured regions. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control) | ||||
| { | ||||
|   __DSB(); | ||||
|   __ISB(); | ||||
|   MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; | ||||
| #ifdef SCB_SHCSR_MEMFAULTENA_Msk | ||||
|   SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /** Disable the Non-secure MPU. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Disable_NS(void) | ||||
| { | ||||
|   __DSB(); | ||||
|   __ISB(); | ||||
| #ifdef SCB_SHCSR_MEMFAULTENA_Msk | ||||
|   SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; | ||||
| #endif | ||||
|   MPU_NS->CTRL  &= ~MPU_CTRL_ENABLE_Msk; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| /** Set the memory attribute encoding to the given MPU. | ||||
| * \param mpu Pointer to the MPU to be configured. | ||||
| * \param idx The attribute index to be set [0-7] | ||||
| * \param attr The attribute value to be set. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr) | ||||
| { | ||||
|   const uint8_t reg = idx / 4U; | ||||
|   const uint32_t pos = ((idx % 4U) * 8U); | ||||
|   const uint32_t mask = 0xFFU << pos; | ||||
|    | ||||
|   if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) { | ||||
|     return; // invalid index | ||||
|   } | ||||
|    | ||||
|   mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask)); | ||||
| } | ||||
|  | ||||
| /** Set the memory attribute encoding. | ||||
| * \param idx The attribute index to be set [0-7] | ||||
| * \param attr The attribute value to be set. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr) | ||||
| { | ||||
|   ARM_MPU_SetMemAttrEx(MPU, idx, attr); | ||||
| } | ||||
|  | ||||
| #ifdef MPU_NS | ||||
| /** Set the memory attribute encoding to the Non-secure MPU. | ||||
| * \param idx The attribute index to be set [0-7] | ||||
| * \param attr The attribute value to be set. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr) | ||||
| { | ||||
|   ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| /** Clear and disable the given MPU region of the given MPU. | ||||
| * \param mpu Pointer to MPU to be used. | ||||
| * \param rnr Region number to be cleared. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr) | ||||
| { | ||||
|   mpu->RNR = rnr; | ||||
|   mpu->RLAR = 0U; | ||||
| } | ||||
|  | ||||
| /** Clear and disable the given MPU region. | ||||
| * \param rnr Region number to be cleared. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) | ||||
| { | ||||
|   ARM_MPU_ClrRegionEx(MPU, rnr); | ||||
| } | ||||
|  | ||||
| #ifdef MPU_NS | ||||
| /** Clear and disable the given Non-secure MPU region. | ||||
| * \param rnr Region number to be cleared. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr) | ||||
| {   | ||||
|   ARM_MPU_ClrRegionEx(MPU_NS, rnr); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| /** Configure the given MPU region of the given MPU. | ||||
| * \param mpu Pointer to MPU to be used. | ||||
| * \param rnr Region number to be configured. | ||||
| * \param rbar Value for RBAR register. | ||||
| * \param rlar Value for RLAR register. | ||||
| */    | ||||
| __STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar) | ||||
| { | ||||
|   mpu->RNR = rnr; | ||||
|   mpu->RBAR = rbar; | ||||
|   mpu->RLAR = rlar; | ||||
| } | ||||
|  | ||||
| /** Configure the given MPU region. | ||||
| * \param rnr Region number to be configured. | ||||
| * \param rbar Value for RBAR register. | ||||
| * \param rlar Value for RLAR register. | ||||
| */    | ||||
| __STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar) | ||||
| { | ||||
|   ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar); | ||||
| } | ||||
|  | ||||
| #ifdef MPU_NS | ||||
| /** Configure the given Non-secure MPU region. | ||||
| * \param rnr Region number to be configured. | ||||
| * \param rbar Value for RBAR register. | ||||
| * \param rlar Value for RLAR register. | ||||
| */    | ||||
| __STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar) | ||||
| { | ||||
|   ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar);   | ||||
| } | ||||
| #endif | ||||
|  | ||||
| /** Memcopy with strictly ordered memory access, e.g. for register targets. | ||||
| * \param dst Destination data is copied to. | ||||
| * \param src Source data is copied from. | ||||
| * \param len Amount of data words to be copied. | ||||
| */ | ||||
| __STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) | ||||
| { | ||||
|   uint32_t i; | ||||
|   for (i = 0U; i < len; ++i)  | ||||
|   { | ||||
|     dst[i] = src[i]; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** Load the given number of MPU regions from a table to the given MPU. | ||||
| * \param mpu Pointer to the MPU registers to be used. | ||||
| * \param rnr First region number to be configured. | ||||
| * \param table Pointer to the MPU configuration table. | ||||
| * \param cnt Amount of regions to be configured. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)  | ||||
| { | ||||
|   const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; | ||||
|   if (cnt == 1U) { | ||||
|     mpu->RNR = rnr; | ||||
|     orderedCpy(&(mpu->RBAR), &(table->RBAR), rowWordSize); | ||||
|   } else { | ||||
|     uint32_t rnrBase   = rnr & ~(MPU_TYPE_RALIASES-1U); | ||||
|     uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES; | ||||
|      | ||||
|     mpu->RNR = rnrBase; | ||||
|     while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) { | ||||
|       uint32_t c = MPU_TYPE_RALIASES - rnrOffset; | ||||
|       orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize); | ||||
|       table += c; | ||||
|       cnt -= c; | ||||
|       rnrOffset = 0U; | ||||
|       rnrBase += MPU_TYPE_RALIASES; | ||||
|       mpu->RNR = rnrBase; | ||||
|     } | ||||
|      | ||||
|     orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** Load the given number of MPU regions from a table. | ||||
| * \param rnr First region number to be configured. | ||||
| * \param table Pointer to the MPU configuration table. | ||||
| * \param cnt Amount of regions to be configured. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)  | ||||
| { | ||||
|   ARM_MPU_LoadEx(MPU, rnr, table, cnt); | ||||
| } | ||||
|  | ||||
| #ifdef MPU_NS | ||||
| /** Load the given number of MPU regions from a table to the Non-secure MPU. | ||||
| * \param rnr First region number to be configured. | ||||
| * \param table Pointer to the MPU configuration table. | ||||
| * \param cnt Amount of regions to be configured. | ||||
| */ | ||||
| __STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)  | ||||
| { | ||||
|   ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										70
									
								
								fw/Drivers/CMSIS/Include/tz_context.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								fw/Drivers/CMSIS/Include/tz_context.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| /****************************************************************************** | ||||
|  * @file     tz_context.h | ||||
|  * @brief    Context Management for Armv8-M TrustZone | ||||
|  * @version  V1.0.1 | ||||
|  * @date     10. January 2018 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2017-2018 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the License); you may | ||||
|  * not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an AS IS BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header   /* treat file as system include file */ | ||||
| #endif | ||||
|  | ||||
| #ifndef TZ_CONTEXT_H | ||||
| #define TZ_CONTEXT_H | ||||
|   | ||||
| #include <stdint.h> | ||||
|   | ||||
| #ifndef TZ_MODULEID_T | ||||
| #define TZ_MODULEID_T | ||||
| /// \details Data type that identifies secure software modules called by a process. | ||||
| typedef uint32_t TZ_ModuleId_t; | ||||
| #endif | ||||
|   | ||||
| /// \details TZ Memory ID identifies an allocated memory slot. | ||||
| typedef uint32_t TZ_MemoryId_t; | ||||
|    | ||||
| /// Initialize secure context memory system | ||||
| /// \return execution status (1: success, 0: error) | ||||
| uint32_t TZ_InitContextSystem_S (void); | ||||
|   | ||||
| /// Allocate context memory for calling secure software modules in TrustZone | ||||
| /// \param[in]  module   identifies software modules called from non-secure mode | ||||
| /// \return value != 0 id TrustZone memory slot identifier | ||||
| /// \return value 0    no memory available or internal error | ||||
| TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module); | ||||
|   | ||||
| /// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S | ||||
| /// \param[in]  id  TrustZone memory slot identifier | ||||
| /// \return execution status (1: success, 0: error) | ||||
| uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id); | ||||
|   | ||||
| /// Load secure context (called on RTOS thread context switch) | ||||
| /// \param[in]  id  TrustZone memory slot identifier | ||||
| /// \return execution status (1: success, 0: error) | ||||
| uint32_t TZ_LoadContext_S (TZ_MemoryId_t id); | ||||
|   | ||||
| /// Store secure context (called on RTOS thread context switch) | ||||
| /// \param[in]  id  TrustZone memory slot identifier | ||||
| /// \return execution status (1: success, 0: error) | ||||
| uint32_t TZ_StoreContext_S (TZ_MemoryId_t id); | ||||
|   | ||||
| #endif  // TZ_CONTEXT_H | ||||
							
								
								
									
										201
									
								
								fw/Drivers/CMSIS/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								fw/Drivers/CMSIS/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,201 @@ | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "{}" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright {yyyy} {name of copyright owner} | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
							
								
								
									
										1171
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_bus.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1171
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_bus.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										590
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_cortex.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										590
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_cortex.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,590 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx_ll_cortex.h | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   Header file of CORTEX LL module. | ||||
|   @verbatim | ||||
|   ============================================================================== | ||||
|                      ##### How to use this driver ##### | ||||
|   ============================================================================== | ||||
|     [..] | ||||
|     The LL CORTEX driver contains a set of generic APIs that can be | ||||
|     used by user: | ||||
|       (+) SYSTICK configuration used by LL_mDelay and LL_Init1msTick | ||||
|           functions | ||||
|       (+) Low power mode configuration (SCB register of Cortex-MCU) | ||||
|       (+) MPU API to configure and enable regions | ||||
|       (+) API to access to MCU info (CPUID register) | ||||
|  | ||||
|   @endverbatim | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright(c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __STM32L0xx_LL_CORTEX_H | ||||
| #define __STM32L0xx_LL_CORTEX_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32l0xx.h" | ||||
|  | ||||
| /** @addtogroup STM32L0xx_LL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CORTEX_LL CORTEX | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
|  | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
|  | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
|  | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| /** @defgroup CORTEX_LL_Exported_Constants CORTEX Exported Constants | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CORTEX_LL_EC_CLKSOURCE_HCLK SYSTICK Clock Source | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_SYSTICK_CLKSOURCE_HCLK_DIV8     (0x00000000U)                 /*!< AHB clock divided by 8 selected as SysTick clock source.*/ | ||||
| #define LL_SYSTICK_CLKSOURCE_HCLK          (SysTick_CTRL_CLKSOURCE_Msk) /*!< AHB clock selected as SysTick clock source. */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #if __MPU_PRESENT | ||||
|  | ||||
| /** @defgroup CORTEX_LL_EC_CTRL_HFNMI_PRIVDEF MPU Control | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_MPU_CTRL_HFNMI_PRIVDEF_NONE     (0x00000000U)                            /*!< Disable NMI and privileged SW access */ | ||||
| #define LL_MPU_CTRL_HARDFAULT_NMI          MPU_CTRL_HFNMIENA_Msk                             /*!< Enables the operation of MPU during hard fault, NMI, and FAULTMASK handlers */ | ||||
| #define LL_MPU_CTRL_PRIVILEGED_DEFAULT     MPU_CTRL_PRIVDEFENA_Msk                           /*!< Enable privileged software access to default memory map */ | ||||
| #define LL_MPU_CTRL_HFNMI_PRIVDEF          (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) /*!< Enable NMI and privileged SW access */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CORTEX_LL_EC_REGION MPU Region Number | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_MPU_REGION_NUMBER0              (0x00U) /*!< REGION Number 0 */ | ||||
| #define LL_MPU_REGION_NUMBER1              (0x01U) /*!< REGION Number 1 */ | ||||
| #define LL_MPU_REGION_NUMBER2              (0x02U) /*!< REGION Number 2 */ | ||||
| #define LL_MPU_REGION_NUMBER3              (0x03U) /*!< REGION Number 3 */ | ||||
| #define LL_MPU_REGION_NUMBER4              (0x04U) /*!< REGION Number 4 */ | ||||
| #define LL_MPU_REGION_NUMBER5              (0x05U) /*!< REGION Number 5 */ | ||||
| #define LL_MPU_REGION_NUMBER6              (0x06U) /*!< REGION Number 6 */ | ||||
| #define LL_MPU_REGION_NUMBER7              (0x07U) /*!< REGION Number 7 */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CORTEX_LL_EC_REGION_SIZE MPU Region Size | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_MPU_REGION_SIZE_32B             ((uint32_t)(0x04U << MPU_RASR_SIZE_Pos)) /*!< 32B Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_64B             ((uint32_t)(0x05U << MPU_RASR_SIZE_Pos)) /*!< 64B Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_128B            ((uint32_t)(0x06U << MPU_RASR_SIZE_Pos)) /*!< 128B Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_256B            ((uint32_t)(0x07U << MPU_RASR_SIZE_Pos)) /*!< 256B Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_512B            ((uint32_t)(0x08U << MPU_RASR_SIZE_Pos)) /*!< 512B Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_1KB             ((uint32_t)(0x09U << MPU_RASR_SIZE_Pos)) /*!< 1KB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_2KB             ((uint32_t)(0x0AU << MPU_RASR_SIZE_Pos)) /*!< 2KB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_4KB             ((uint32_t)(0x0BU << MPU_RASR_SIZE_Pos)) /*!< 4KB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_8KB             ((uint32_t)(0x0CU << MPU_RASR_SIZE_Pos)) /*!< 8KB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_16KB            ((uint32_t)(0x0DU << MPU_RASR_SIZE_Pos)) /*!< 16KB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_32KB            ((uint32_t)(0x0EU << MPU_RASR_SIZE_Pos)) /*!< 32KB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_64KB            ((uint32_t)(0x0FU << MPU_RASR_SIZE_Pos)) /*!< 64KB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_128KB           ((uint32_t)(0x10U << MPU_RASR_SIZE_Pos)) /*!< 128KB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_256KB           ((uint32_t)(0x11U << MPU_RASR_SIZE_Pos)) /*!< 256KB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_512KB           ((uint32_t)(0x12U << MPU_RASR_SIZE_Pos)) /*!< 512KB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_1MB             ((uint32_t)(0x13U << MPU_RASR_SIZE_Pos)) /*!< 1MB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_2MB             ((uint32_t)(0x14U << MPU_RASR_SIZE_Pos)) /*!< 2MB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_4MB             ((uint32_t)(0x15U << MPU_RASR_SIZE_Pos)) /*!< 4MB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_8MB             ((uint32_t)(0x16U << MPU_RASR_SIZE_Pos)) /*!< 8MB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_16MB            ((uint32_t)(0x17U << MPU_RASR_SIZE_Pos)) /*!< 16MB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_32MB            ((uint32_t)(0x18U << MPU_RASR_SIZE_Pos)) /*!< 32MB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_64MB            ((uint32_t)(0x19U << MPU_RASR_SIZE_Pos)) /*!< 64MB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_128MB           ((uint32_t)(0x1AU << MPU_RASR_SIZE_Pos)) /*!< 128MB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_256MB           ((uint32_t)(0x1BU << MPU_RASR_SIZE_Pos)) /*!< 256MB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_512MB           ((uint32_t)(0x1CU << MPU_RASR_SIZE_Pos)) /*!< 512MB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_1GB             ((uint32_t)(0x1DU << MPU_RASR_SIZE_Pos)) /*!< 1GB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_2GB             ((uint32_t)(0x1EU << MPU_RASR_SIZE_Pos)) /*!< 2GB Size of the MPU protection region */ | ||||
| #define LL_MPU_REGION_SIZE_4GB             ((uint32_t)(0x1FU << MPU_RASR_SIZE_Pos)) /*!< 4GB Size of the MPU protection region */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CORTEX_LL_EC_REGION_PRIVILEDGES MPU Region Privileges | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_MPU_REGION_NO_ACCESS            ((uint32_t)(0x00U << MPU_RASR_AP_Pos)) /*!< No access*/ | ||||
| #define LL_MPU_REGION_PRIV_RW              ((uint32_t)(0x01U << MPU_RASR_AP_Pos)) /*!< RW privileged (privileged access only)*/ | ||||
| #define LL_MPU_REGION_PRIV_RW_URO          ((uint32_t)(0x02U << MPU_RASR_AP_Pos)) /*!< RW privileged - RO user (Write in a user program generates a fault) */ | ||||
| #define LL_MPU_REGION_FULL_ACCESS          ((uint32_t)(0x03U << MPU_RASR_AP_Pos)) /*!< RW privileged & user (Full access) */ | ||||
| #define LL_MPU_REGION_PRIV_RO              ((uint32_t)(0x05U << MPU_RASR_AP_Pos)) /*!< RO privileged (privileged read only)*/ | ||||
| #define LL_MPU_REGION_PRIV_RO_URO          ((uint32_t)(0x06U << MPU_RASR_AP_Pos)) /*!< RO privileged & user (read only) */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CORTEX_LL_EC_TEX MPU TEX Level | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_MPU_TEX_LEVEL0                  ((uint32_t)(0x00U << MPU_RASR_TEX_Pos)) /*!< b000 for TEX bits */ | ||||
| #define LL_MPU_TEX_LEVEL1                  ((uint32_t)(0x01U << MPU_RASR_TEX_Pos)) /*!< b001 for TEX bits */ | ||||
| #define LL_MPU_TEX_LEVEL2                  ((uint32_t)(0x02U << MPU_RASR_TEX_Pos)) /*!< b010 for TEX bits */ | ||||
| #define LL_MPU_TEX_LEVEL4                  ((uint32_t)(0x04U << MPU_RASR_TEX_Pos)) /*!< b100 for TEX bits */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CORTEX_LL_EC_INSTRUCTION_ACCESS MPU Instruction Access | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_MPU_INSTRUCTION_ACCESS_ENABLE   (0x00U) /*!< Instruction fetches enabled */ | ||||
| #define LL_MPU_INSTRUCTION_ACCESS_DISABLE  MPU_RASR_XN_Msk  /*!< Instruction fetches disabled*/ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CORTEX_LL_EC_SHAREABLE_ACCESS MPU Shareable Access | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_MPU_ACCESS_SHAREABLE            MPU_RASR_S_Msk   /*!< Shareable memory attribute */ | ||||
| #define LL_MPU_ACCESS_NOT_SHAREABLE        (0x00U) /*!< Not Shareable memory attribute */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CORTEX_LL_EC_CACHEABLE_ACCESS MPU Cacheable Access | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_MPU_ACCESS_CACHEABLE            MPU_RASR_C_Msk   /*!< Cacheable memory attribute */ | ||||
| #define LL_MPU_ACCESS_NOT_CACHEABLE        (0x00U) /*!< Not Cacheable memory attribute */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CORTEX_LL_EC_BUFFERABLE_ACCESS MPU Bufferable Access | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_MPU_ACCESS_BUFFERABLE           MPU_RASR_B_Msk   /*!< Bufferable memory attribute */ | ||||
| #define LL_MPU_ACCESS_NOT_BUFFERABLE       (0x00U) /*!< Not Bufferable memory attribute */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| #endif /* __MPU_PRESENT */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Exported macro ------------------------------------------------------------*/ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @defgroup CORTEX_LL_Exported_Functions CORTEX Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CORTEX_LL_EF_SYSTICK SYSTICK | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  This function checks if the Systick counter flag is active or not. | ||||
|   * @note   It can be used in timeout function on application side. | ||||
|   * @rmtoll STK_CTRL     COUNTFLAG     LL_SYSTICK_IsActiveCounterFlag | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_SYSTICK_IsActiveCounterFlag(void) | ||||
| { | ||||
|   return ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configures the SysTick clock source | ||||
|   * @rmtoll STK_CTRL     CLKSOURCE     LL_SYSTICK_SetClkSource | ||||
|   * @param  Source This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8 | ||||
|   *         @arg @ref LL_SYSTICK_CLKSOURCE_HCLK | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_SYSTICK_SetClkSource(uint32_t Source) | ||||
| { | ||||
|   if (Source == LL_SYSTICK_CLKSOURCE_HCLK) | ||||
|   { | ||||
|     SET_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     CLEAR_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get the SysTick clock source | ||||
|   * @rmtoll STK_CTRL     CLKSOURCE     LL_SYSTICK_GetClkSource | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8 | ||||
|   *         @arg @ref LL_SYSTICK_CLKSOURCE_HCLK | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_SYSTICK_GetClkSource(void) | ||||
| { | ||||
|   return READ_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable SysTick exception request | ||||
|   * @rmtoll STK_CTRL     TICKINT       LL_SYSTICK_EnableIT | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_SYSTICK_EnableIT(void) | ||||
| { | ||||
|   SET_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable SysTick exception request | ||||
|   * @rmtoll STK_CTRL     TICKINT       LL_SYSTICK_DisableIT | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_SYSTICK_DisableIT(void) | ||||
| { | ||||
|   CLEAR_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Checks if the SYSTICK interrupt is enabled or disabled. | ||||
|   * @rmtoll STK_CTRL     TICKINT       LL_SYSTICK_IsEnabledIT | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_SYSTICK_IsEnabledIT(void) | ||||
| { | ||||
|   return (READ_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk) == (SysTick_CTRL_TICKINT_Msk)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CORTEX_LL_EF_LOW_POWER_MODE LOW POWER MODE | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Processor uses sleep as its low power mode | ||||
|   * @rmtoll SCB_SCR      SLEEPDEEP     LL_LPM_EnableSleep | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_LPM_EnableSleep(void) | ||||
| { | ||||
|   /* Clear SLEEPDEEP bit of Cortex System Control Register */ | ||||
|   CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Processor uses deep sleep as its low power mode | ||||
|   * @rmtoll SCB_SCR      SLEEPDEEP     LL_LPM_EnableDeepSleep | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_LPM_EnableDeepSleep(void) | ||||
| { | ||||
|   /* Set SLEEPDEEP bit of Cortex System Control Register */ | ||||
|   SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configures sleep-on-exit when returning from Handler mode to Thread mode. | ||||
|   * @note   Setting this bit to 1 enables an interrupt-driven application to avoid returning to an | ||||
|   *         empty main application. | ||||
|   * @rmtoll SCB_SCR      SLEEPONEXIT   LL_LPM_EnableSleepOnExit | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_LPM_EnableSleepOnExit(void) | ||||
| { | ||||
|   /* Set SLEEPONEXIT bit of Cortex System Control Register */ | ||||
|   SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Do not sleep when returning to Thread mode. | ||||
|   * @rmtoll SCB_SCR      SLEEPONEXIT   LL_LPM_DisableSleepOnExit | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_LPM_DisableSleepOnExit(void) | ||||
| { | ||||
|   /* Clear SLEEPONEXIT bit of Cortex System Control Register */ | ||||
|   CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enabled events and all interrupts, including disabled interrupts, can wakeup the | ||||
|   *         processor. | ||||
|   * @rmtoll SCB_SCR      SEVEONPEND    LL_LPM_EnableEventOnPend | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_LPM_EnableEventOnPend(void) | ||||
| { | ||||
|   /* Set SEVEONPEND bit of Cortex System Control Register */ | ||||
|   SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Only enabled interrupts or events can wakeup the processor, disabled interrupts are | ||||
|   *         excluded | ||||
|   * @rmtoll SCB_SCR      SEVEONPEND    LL_LPM_DisableEventOnPend | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_LPM_DisableEventOnPend(void) | ||||
| { | ||||
|   /* Clear SEVEONPEND bit of Cortex System Control Register */ | ||||
|   CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CORTEX_LL_EF_MCU_INFO MCU INFO | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Get Implementer code | ||||
|   * @rmtoll SCB_CPUID    IMPLEMENTER   LL_CPUID_GetImplementer | ||||
|   * @retval Value should be equal to 0x41 for ARM | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CPUID_GetImplementer(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_IMPLEMENTER_Msk) >> SCB_CPUID_IMPLEMENTER_Pos); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get Variant number (The r value in the rnpn product revision identifier) | ||||
|   * @rmtoll SCB_CPUID    VARIANT       LL_CPUID_GetVariant | ||||
|   * @retval Value between 0 and 255 (0x0: revision 0) | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CPUID_GetVariant(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_VARIANT_Msk) >> SCB_CPUID_VARIANT_Pos); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get Architecture number  | ||||
|   * @rmtoll SCB_CPUID    ARCHITECTURE  LL_CPUID_GetArchitecture | ||||
|   * @retval Value should be equal to 0xC for Cortex-M0+ devices | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CPUID_GetArchitecture(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_ARCHITECTURE_Msk) >> SCB_CPUID_ARCHITECTURE_Pos); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get Part number | ||||
|   * @rmtoll SCB_CPUID    PARTNO        LL_CPUID_GetParNo | ||||
|   * @retval Value should be equal to 0xC60 for Cortex-M0+ | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CPUID_GetParNo(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_PARTNO_Msk) >> SCB_CPUID_PARTNO_Pos); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get Revision number (The p value in the rnpn product revision identifier, indicates patch release) | ||||
|   * @rmtoll SCB_CPUID    REVISION      LL_CPUID_GetRevision | ||||
|   * @retval Value between 0 and 255 (0x1: patch 1) | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CPUID_GetRevision(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_REVISION_Msk) >> SCB_CPUID_REVISION_Pos); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #if __MPU_PRESENT | ||||
| /** @defgroup CORTEX_LL_EF_MPU MPU | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable MPU with input options | ||||
|   * @rmtoll MPU_CTRL     ENABLE        LL_MPU_Enable | ||||
|   * @param  Options This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF_NONE | ||||
|   *         @arg @ref LL_MPU_CTRL_HARDFAULT_NMI | ||||
|   *         @arg @ref LL_MPU_CTRL_PRIVILEGED_DEFAULT | ||||
|   *         @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_MPU_Enable(uint32_t Options) | ||||
| { | ||||
|   /* Enable the MPU*/ | ||||
|   WRITE_REG(MPU->CTRL, (MPU_CTRL_ENABLE_Msk | Options)); | ||||
|   /* Ensure MPU settings take effects */ | ||||
|   __DSB(); | ||||
|   /* Sequence instruction fetches using update settings */ | ||||
|   __ISB(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable MPU | ||||
|   * @rmtoll MPU_CTRL     ENABLE        LL_MPU_Disable | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_MPU_Disable(void) | ||||
| { | ||||
|   /* Make sure outstanding transfers are done */ | ||||
|   __DMB(); | ||||
|   /* Disable MPU*/ | ||||
|   WRITE_REG(MPU->CTRL, 0U); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if MPU is enabled or not | ||||
|   * @rmtoll MPU_CTRL     ENABLE        LL_MPU_IsEnabled | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_MPU_IsEnabled(void) | ||||
| { | ||||
|   return (READ_BIT(MPU->CTRL, MPU_CTRL_ENABLE_Msk) == (MPU_CTRL_ENABLE_Msk)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable a MPU region | ||||
|   * @rmtoll MPU_RASR     ENABLE        LL_MPU_EnableRegion | ||||
|   * @param  Region This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER0 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER1 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER2 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER3 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER4 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER5 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER6 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER7 | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_MPU_EnableRegion(uint32_t Region) | ||||
| { | ||||
|   /* Set Region number */ | ||||
|   WRITE_REG(MPU->RNR, Region); | ||||
|   /* Enable the MPU region */ | ||||
|   SET_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure and enable a region | ||||
|   * @rmtoll MPU_RNR      REGION        LL_MPU_ConfigRegion\n | ||||
|   *         MPU_RBAR     REGION        LL_MPU_ConfigRegion\n | ||||
|   *         MPU_RBAR     ADDR          LL_MPU_ConfigRegion\n | ||||
|   *         MPU_RASR     XN            LL_MPU_ConfigRegion\n | ||||
|   *         MPU_RASR     AP            LL_MPU_ConfigRegion\n | ||||
|   *         MPU_RASR     S             LL_MPU_ConfigRegion\n | ||||
|   *         MPU_RASR     C             LL_MPU_ConfigRegion\n | ||||
|   *         MPU_RASR     B             LL_MPU_ConfigRegion\n | ||||
|   *         MPU_RASR     SIZE          LL_MPU_ConfigRegion | ||||
|   * @param  Region This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER0 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER1 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER2 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER3 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER4 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER5 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER6 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER7 | ||||
|   * @param  Address Value of region base address | ||||
|   * @param  SubRegionDisable Sub-region disable value between Min_Data = 0x00 and Max_Data = 0xFF | ||||
|   * @param  Attributes This parameter can be a combination of the following values: | ||||
|   *         @arg @ref LL_MPU_REGION_SIZE_32B or @ref LL_MPU_REGION_SIZE_64B or @ref LL_MPU_REGION_SIZE_128B or @ref LL_MPU_REGION_SIZE_256B or @ref LL_MPU_REGION_SIZE_512B | ||||
|   *           or @ref LL_MPU_REGION_SIZE_1KB or @ref LL_MPU_REGION_SIZE_2KB or @ref LL_MPU_REGION_SIZE_4KB or @ref LL_MPU_REGION_SIZE_8KB or @ref LL_MPU_REGION_SIZE_16KB | ||||
|   *           or @ref LL_MPU_REGION_SIZE_32KB or @ref LL_MPU_REGION_SIZE_64KB or @ref LL_MPU_REGION_SIZE_128KB or @ref LL_MPU_REGION_SIZE_256KB or @ref LL_MPU_REGION_SIZE_512KB | ||||
|   *           or @ref LL_MPU_REGION_SIZE_1MB or @ref LL_MPU_REGION_SIZE_2MB or @ref LL_MPU_REGION_SIZE_4MB or @ref LL_MPU_REGION_SIZE_8MB or @ref LL_MPU_REGION_SIZE_16MB | ||||
|   *           or @ref LL_MPU_REGION_SIZE_32MB or @ref LL_MPU_REGION_SIZE_64MB or @ref LL_MPU_REGION_SIZE_128MB or @ref LL_MPU_REGION_SIZE_256MB or @ref LL_MPU_REGION_SIZE_512MB | ||||
|   *           or @ref LL_MPU_REGION_SIZE_1GB or @ref LL_MPU_REGION_SIZE_2GB or @ref LL_MPU_REGION_SIZE_4GB | ||||
|   *         @arg @ref LL_MPU_REGION_NO_ACCESS or @ref LL_MPU_REGION_PRIV_RW or @ref LL_MPU_REGION_PRIV_RW_URO or @ref LL_MPU_REGION_FULL_ACCESS | ||||
|   *           or @ref LL_MPU_REGION_PRIV_RO or @ref LL_MPU_REGION_PRIV_RO_URO | ||||
|   *         @arg @ref LL_MPU_TEX_LEVEL0 or @ref LL_MPU_TEX_LEVEL1 or @ref LL_MPU_TEX_LEVEL2 or @ref LL_MPU_TEX_LEVEL4 | ||||
|   *         @arg @ref LL_MPU_INSTRUCTION_ACCESS_ENABLE or  @ref LL_MPU_INSTRUCTION_ACCESS_DISABLE | ||||
|   *         @arg @ref LL_MPU_ACCESS_SHAREABLE or @ref LL_MPU_ACCESS_NOT_SHAREABLE | ||||
|   *         @arg @ref LL_MPU_ACCESS_CACHEABLE or @ref LL_MPU_ACCESS_NOT_CACHEABLE | ||||
|   *         @arg @ref LL_MPU_ACCESS_BUFFERABLE or @ref LL_MPU_ACCESS_NOT_BUFFERABLE | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_MPU_ConfigRegion(uint32_t Region, uint32_t SubRegionDisable, uint32_t Address, uint32_t Attributes) | ||||
| { | ||||
|   /* Set Region number */ | ||||
|   WRITE_REG(MPU->RNR, Region); | ||||
|   /* Set base address */ | ||||
|   WRITE_REG(MPU->RBAR, (Address & 0xFFFFFFE0U)); | ||||
|   /* Configure MPU */ | ||||
|   WRITE_REG(MPU->RASR, (MPU_RASR_ENABLE_Msk | Attributes | SubRegionDisable << MPU_RASR_SRD_Pos)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable a region | ||||
|   * @rmtoll MPU_RNR      REGION        LL_MPU_DisableRegion\n | ||||
|   *         MPU_RASR     ENABLE        LL_MPU_DisableRegion | ||||
|   * @param  Region This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER0 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER1 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER2 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER3 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER4 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER5 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER6 | ||||
|   *         @arg @ref LL_MPU_REGION_NUMBER7 | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_MPU_DisableRegion(uint32_t Region) | ||||
| { | ||||
|   /* Set Region number */ | ||||
|   WRITE_REG(MPU->RNR, Region); | ||||
|   /* Disable the MPU region */ | ||||
|   CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* __MPU_PRESENT */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __STM32L0xx_LL_CORTEX_H */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										798
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_crs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										798
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_crs.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,798 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx_ll_crs.h | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   Header file of CRS LL module. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright(c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __STM32L0xx_LL_CRS_H | ||||
| #define __STM32L0xx_LL_CRS_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32l0xx.h" | ||||
|  | ||||
| /** @addtogroup STM32L0xx_LL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #if defined(CRS) | ||||
|  | ||||
| /** @defgroup CRS_LL CRS | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
|  | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
| /** @defgroup CRS_LL_Private_Constants CRS Private Constants | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Defines used for the bit position in the register and perform offsets*/ | ||||
| #define CRS_POSITION_TRIM        (CRS_CR_TRIM_Pos)     /* bit position in CR reg */ | ||||
| #define CRS_POSITION_FECAP       (CRS_ISR_FECAP_Pos)   /* bit position in ISR reg */ | ||||
| #define CRS_POSITION_FELIM       (CRS_CFGR_FELIM_Pos)  /* bit position in CFGR reg */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
|  | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| /** @defgroup CRS_LL_Exported_Constants CRS Exported Constants | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRS_LL_EC_GET_FLAG Get Flags Defines | ||||
|   * @brief    Flags defines which can be used with LL_CRS_ReadReg function | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_CRS_ISR_SYNCOKF                 CRS_ISR_SYNCOKF | ||||
| #define LL_CRS_ISR_SYNCWARNF               CRS_ISR_SYNCWARNF | ||||
| #define LL_CRS_ISR_ERRF                    CRS_ISR_ERRF | ||||
| #define LL_CRS_ISR_ESYNCF                  CRS_ISR_ESYNCF | ||||
| #define LL_CRS_ISR_SYNCERR                 CRS_ISR_SYNCERR | ||||
| #define LL_CRS_ISR_SYNCMISS                CRS_ISR_SYNCMISS | ||||
| #define LL_CRS_ISR_TRIMOVF                 CRS_ISR_TRIMOVF | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRS_LL_EC_IT IT Defines | ||||
|   * @brief    IT defines which can be used with LL_CRS_ReadReg and  LL_CRS_WriteReg functions | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_CRS_CR_SYNCOKIE                 CRS_CR_SYNCOKIE | ||||
| #define LL_CRS_CR_SYNCWARNIE               CRS_CR_SYNCWARNIE | ||||
| #define LL_CRS_CR_ERRIE                    CRS_CR_ERRIE | ||||
| #define LL_CRS_CR_ESYNCIE                  CRS_CR_ESYNCIE | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRS_LL_EC_SYNC_DIV Synchronization Signal Divider | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_CRS_SYNC_DIV_1                  (0x00U)                         /*!< Synchro Signal not divided (default) */ | ||||
| #define LL_CRS_SYNC_DIV_2                  CRS_CFGR_SYNCDIV_0                        /*!< Synchro Signal divided by 2 */ | ||||
| #define LL_CRS_SYNC_DIV_4                  CRS_CFGR_SYNCDIV_1                        /*!< Synchro Signal divided by 4 */ | ||||
| #define LL_CRS_SYNC_DIV_8                  (CRS_CFGR_SYNCDIV_1 | CRS_CFGR_SYNCDIV_0) /*!< Synchro Signal divided by 8 */ | ||||
| #define LL_CRS_SYNC_DIV_16                 CRS_CFGR_SYNCDIV_2                        /*!< Synchro Signal divided by 16 */ | ||||
| #define LL_CRS_SYNC_DIV_32                 (CRS_CFGR_SYNCDIV_2 | CRS_CFGR_SYNCDIV_0) /*!< Synchro Signal divided by 32 */ | ||||
| #define LL_CRS_SYNC_DIV_64                 (CRS_CFGR_SYNCDIV_2 | CRS_CFGR_SYNCDIV_1) /*!< Synchro Signal divided by 64 */ | ||||
| #define LL_CRS_SYNC_DIV_128                CRS_CFGR_SYNCDIV                          /*!< Synchro Signal divided by 128 */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRS_LL_EC_SYNC_SOURCE Synchronization Signal Source | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_CRS_SYNC_SOURCE_GPIO            (0x00U)       /*!< Synchro Signal soucre GPIO */ | ||||
| #define LL_CRS_SYNC_SOURCE_LSE             CRS_CFGR_SYNCSRC_0      /*!< Synchro Signal source LSE */ | ||||
| #define LL_CRS_SYNC_SOURCE_USB             CRS_CFGR_SYNCSRC_1      /*!< Synchro Signal source USB SOF (default)*/ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRS_LL_EC_SYNC_POLARITY Synchronization Signal Polarity | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_CRS_SYNC_POLARITY_RISING        (0x00U)     /*!< Synchro Active on rising edge (default) */ | ||||
| #define LL_CRS_SYNC_POLARITY_FALLING       CRS_CFGR_SYNCPOL      /*!< Synchro Active on falling edge */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRS_LL_EC_FREQERRORDIR Frequency Error Direction | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_CRS_FREQ_ERROR_DIR_UP             (0x00U)         /*!< Upcounting direction, the actual frequency is above the target */ | ||||
| #define LL_CRS_FREQ_ERROR_DIR_DOWN           CRS_ISR_FEDIR /*!< Downcounting direction, the actual frequency is below the target */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRS_LL_EC_DEFAULTVALUES Default Values | ||||
|   * @{ | ||||
|   */ | ||||
| /** | ||||
|   * @brief Reset value of the RELOAD field | ||||
|   * @note The reset value of the RELOAD field corresponds to a target frequency of 48 MHz | ||||
|   *       and a synchronization signal frequency of 1 kHz (SOF signal from USB) | ||||
|   */ | ||||
| #define LL_CRS_RELOADVALUE_DEFAULT         (0xBB7FU)       | ||||
|  | ||||
| /** | ||||
|   * @brief Reset value of Frequency error limit. | ||||
|   */ | ||||
| #define LL_CRS_ERRORLIMIT_DEFAULT          (0x22U)       | ||||
|  | ||||
| /** | ||||
|   * @brief Reset value of the HSI48 Calibration field | ||||
|   * @note The default value is 32, which corresponds to the middle of the trimming interval.  | ||||
|   *       The trimming step is around 67 kHz between two consecutive TRIM steps.  | ||||
|   *       A higher TRIM value corresponds to a higher output frequency | ||||
|   */ | ||||
| #define LL_CRS_HSI48CALIBRATION_DEFAULT    (0x20U)       | ||||
| /** | ||||
|   * @} | ||||
|   */  | ||||
|    | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Exported macro ------------------------------------------------------------*/ | ||||
| /** @defgroup CRS_LL_Exported_Macros CRS Exported Macros | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRS_LL_EM_WRITE_READ Common Write and read registers Macros | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Write a value in CRS register | ||||
|   * @param  __INSTANCE__ CRS Instance | ||||
|   * @param  __REG__ Register to be written | ||||
|   * @param  __VALUE__ Value to be written in the register | ||||
|   * @retval None | ||||
|   */ | ||||
| #define LL_CRS_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) | ||||
|  | ||||
| /** | ||||
|   * @brief  Read a value in CRS register | ||||
|   * @param  __INSTANCE__ CRS Instance | ||||
|   * @param  __REG__ Register to be read | ||||
|   * @retval Register value | ||||
|   */ | ||||
| #define LL_CRS_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRS_LL_EM_Exported_Macros_Calculate_Reload Exported_Macros_Calculate_Reload | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Macro to calculate reload value to be set in CRS register according to target and sync frequencies | ||||
|   * @note   The RELOAD value should be selected according to the ratio between  | ||||
|   *         the target frequency and the frequency of the synchronization source after | ||||
|   *         prescaling. It is then decreased by one in order to reach the expected | ||||
|   *         synchronization on the zero value. The formula is the following: | ||||
|   *              RELOAD = (fTARGET / fSYNC) -1 | ||||
|   * @param  __FTARGET__ Target frequency (value in Hz) | ||||
|   * @param  __FSYNC__ Synchronization signal frequency (value in Hz) | ||||
|   * @retval Reload value (in Hz) | ||||
|   */ | ||||
| #define __LL_CRS_CALC_CALCULATE_RELOADVALUE(__FTARGET__, __FSYNC__) (((__FTARGET__) / (__FSYNC__)) - 1U) | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @defgroup CRS_LL_Exported_Functions CRS Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRS_LL_EF_Configuration Configuration | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable Frequency error counter | ||||
|   * @note When this bit is set, the CRS_CFGR register is write-protected and cannot be modified | ||||
|   * @rmtoll CR           CEN           LL_CRS_EnableFreqErrorCounter | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_EnableFreqErrorCounter(void) | ||||
| { | ||||
|   SET_BIT(CRS->CR, CRS_CR_CEN); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable Frequency error counter | ||||
|   * @rmtoll CR           CEN           LL_CRS_DisableFreqErrorCounter | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_DisableFreqErrorCounter(void) | ||||
| { | ||||
|   CLEAR_BIT(CRS->CR, CRS_CR_CEN); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if Frequency error counter is enabled or not | ||||
|   * @rmtoll CR           CEN           LL_CRS_IsEnabledFreqErrorCounter | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_IsEnabledFreqErrorCounter(void) | ||||
| { | ||||
|   return (READ_BIT(CRS->CR, CRS_CR_CEN) == (CRS_CR_CEN)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable Automatic trimming counter | ||||
|   * @rmtoll CR           AUTOTRIMEN    LL_CRS_EnableAutoTrimming | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_EnableAutoTrimming(void) | ||||
| { | ||||
|   SET_BIT(CRS->CR, CRS_CR_AUTOTRIMEN); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable Automatic trimming counter | ||||
|   * @rmtoll CR           AUTOTRIMEN    LL_CRS_DisableAutoTrimming | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_DisableAutoTrimming(void) | ||||
| { | ||||
|   CLEAR_BIT(CRS->CR, CRS_CR_AUTOTRIMEN); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if Automatic trimming is enabled or not | ||||
|   * @rmtoll CR           AUTOTRIMEN    LL_CRS_IsEnabledAutoTrimming | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_IsEnabledAutoTrimming(void) | ||||
| { | ||||
|   return (READ_BIT(CRS->CR, CRS_CR_AUTOTRIMEN) == (CRS_CR_AUTOTRIMEN)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set HSI48 oscillator smooth trimming | ||||
|   * @note   When the AUTOTRIMEN bit is set, this field is controlled by hardware and is read-only | ||||
|   * @rmtoll CR           TRIM          LL_CRS_SetHSI48SmoothTrimming | ||||
|   * @param  Value a number between Min_Data = 0 and Max_Data = 63 | ||||
|   * @note   Default value can be set thanks to @ref LL_CRS_HSI48CALIBRATION_DEFAULT  | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_SetHSI48SmoothTrimming(uint32_t Value) | ||||
| { | ||||
|   MODIFY_REG(CRS->CR, CRS_CR_TRIM, Value << CRS_POSITION_TRIM); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get HSI48 oscillator smooth trimming | ||||
|   * @rmtoll CR           TRIM          LL_CRS_GetHSI48SmoothTrimming | ||||
|   * @retval a number between Min_Data = 0 and Max_Data = 63 | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_GetHSI48SmoothTrimming(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(CRS->CR, CRS_CR_TRIM) >> CRS_POSITION_TRIM); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set counter reload value | ||||
|   * @rmtoll CFGR         RELOAD        LL_CRS_SetReloadCounter | ||||
|   * @param  Value a number between Min_Data = 0 and Max_Data = 0xFFFF | ||||
|   * @note   Default value can be set thanks to @ref LL_CRS_RELOADVALUE_DEFAULT  | ||||
|   *         Otherwise it can be calculated in using macro @ref __LL_CRS_CALC_CALCULATE_RELOADVALUE (_FTARGET_, _FSYNC_) | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_SetReloadCounter(uint32_t Value) | ||||
| { | ||||
|   MODIFY_REG(CRS->CFGR, CRS_CFGR_RELOAD, Value); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get counter reload value | ||||
|   * @rmtoll CFGR         RELOAD        LL_CRS_GetReloadCounter | ||||
|   * @retval a number between Min_Data = 0 and Max_Data = 0xFFFF | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_GetReloadCounter(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(CRS->CFGR, CRS_CFGR_RELOAD)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set frequency error limit | ||||
|   * @rmtoll CFGR         FELIM         LL_CRS_SetFreqErrorLimit | ||||
|   * @param  Value a number between Min_Data = 0 and Max_Data = 255 | ||||
|   * @note   Default value can be set thanks to @ref LL_CRS_ERRORLIMIT_DEFAULT  | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_SetFreqErrorLimit(uint32_t Value) | ||||
| { | ||||
|   MODIFY_REG(CRS->CFGR, CRS_CFGR_FELIM, Value << CRS_POSITION_FELIM); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get frequency error limit | ||||
|   * @rmtoll CFGR         FELIM         LL_CRS_GetFreqErrorLimit | ||||
|   * @retval A number between Min_Data = 0 and Max_Data = 255 | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_GetFreqErrorLimit(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(CRS->CFGR, CRS_CFGR_FELIM) >> CRS_POSITION_FELIM); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set division factor for SYNC signal | ||||
|   * @rmtoll CFGR         SYNCDIV       LL_CRS_SetSyncDivider | ||||
|   * @param  Divider This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_1 | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_2 | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_4 | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_8 | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_16 | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_32 | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_64 | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_128 | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_SetSyncDivider(uint32_t Divider) | ||||
| { | ||||
|   MODIFY_REG(CRS->CFGR, CRS_CFGR_SYNCDIV, Divider); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get division factor for SYNC signal | ||||
|   * @rmtoll CFGR         SYNCDIV       LL_CRS_GetSyncDivider | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_1 | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_2 | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_4 | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_8 | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_16 | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_32 | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_64 | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_128 | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_GetSyncDivider(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(CRS->CFGR, CRS_CFGR_SYNCDIV)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set SYNC signal source | ||||
|   * @rmtoll CFGR         SYNCSRC       LL_CRS_SetSyncSignalSource | ||||
|   * @param  Source This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_CRS_SYNC_SOURCE_GPIO | ||||
|   *         @arg @ref LL_CRS_SYNC_SOURCE_LSE | ||||
|   *         @arg @ref LL_CRS_SYNC_SOURCE_USB | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_SetSyncSignalSource(uint32_t Source) | ||||
| { | ||||
|   MODIFY_REG(CRS->CFGR, CRS_CFGR_SYNCSRC, Source); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get SYNC signal source | ||||
|   * @rmtoll CFGR         SYNCSRC       LL_CRS_GetSyncSignalSource | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_CRS_SYNC_SOURCE_GPIO | ||||
|   *         @arg @ref LL_CRS_SYNC_SOURCE_LSE | ||||
|   *         @arg @ref LL_CRS_SYNC_SOURCE_USB | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_GetSyncSignalSource(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(CRS->CFGR, CRS_CFGR_SYNCSRC)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set input polarity for the SYNC signal source | ||||
|   * @rmtoll CFGR         SYNCPOL       LL_CRS_SetSyncPolarity | ||||
|   * @param  Polarity This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_CRS_SYNC_POLARITY_RISING | ||||
|   *         @arg @ref LL_CRS_SYNC_POLARITY_FALLING | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_SetSyncPolarity(uint32_t Polarity) | ||||
| { | ||||
|   MODIFY_REG(CRS->CFGR, CRS_CFGR_SYNCPOL, Polarity); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get input polarity for the SYNC signal source | ||||
|   * @rmtoll CFGR         SYNCPOL       LL_CRS_GetSyncPolarity | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_CRS_SYNC_POLARITY_RISING | ||||
|   *         @arg @ref LL_CRS_SYNC_POLARITY_FALLING | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_GetSyncPolarity(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(CRS->CFGR, CRS_CFGR_SYNCPOL)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure CRS for the synchronization | ||||
|   * @rmtoll CR           TRIM          LL_CRS_ConfigSynchronization\n | ||||
|   *         CFGR         RELOAD        LL_CRS_ConfigSynchronization\n | ||||
|   *         CFGR         FELIM         LL_CRS_ConfigSynchronization\n | ||||
|   *         CFGR         SYNCDIV       LL_CRS_ConfigSynchronization\n | ||||
|   *         CFGR         SYNCSRC       LL_CRS_ConfigSynchronization\n | ||||
|   *         CFGR         SYNCPOL       LL_CRS_ConfigSynchronization | ||||
|   * @param  HSI48CalibrationValue a number between Min_Data = 0 and Max_Data = 63 | ||||
|   * @param  ErrorLimitValue a number between Min_Data = 0 and Max_Data = 0xFFFF | ||||
|   * @param  ReloadValue a number between Min_Data = 0 and Max_Data = 255 | ||||
|   * @param  Settings This parameter can be a combination of the following values: | ||||
|   *         @arg @ref LL_CRS_SYNC_DIV_1 or @ref LL_CRS_SYNC_DIV_2 or @ref LL_CRS_SYNC_DIV_4 or @ref LL_CRS_SYNC_DIV_8 | ||||
|   *              or @ref LL_CRS_SYNC_DIV_16 or @ref LL_CRS_SYNC_DIV_32 or @ref LL_CRS_SYNC_DIV_64 or @ref LL_CRS_SYNC_DIV_128 | ||||
|   *         @arg @ref LL_CRS_SYNC_SOURCE_GPIO or @ref LL_CRS_SYNC_SOURCE_LSE or @ref LL_CRS_SYNC_SOURCE_USB | ||||
|   *         @arg @ref LL_CRS_SYNC_POLARITY_RISING or @ref LL_CRS_SYNC_POLARITY_FALLING | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_ConfigSynchronization(uint32_t HSI48CalibrationValue, uint32_t ErrorLimitValue, uint32_t ReloadValue, uint32_t Settings) | ||||
| { | ||||
|   MODIFY_REG(CRS->CR, CRS_CR_TRIM, HSI48CalibrationValue); | ||||
|   MODIFY_REG(CRS->CFGR,  | ||||
|              CRS_CFGR_RELOAD | CRS_CFGR_FELIM | CRS_CFGR_SYNCDIV | CRS_CFGR_SYNCSRC | CRS_CFGR_SYNCPOL,  | ||||
|              ReloadValue | (ErrorLimitValue << CRS_POSITION_FELIM) | Settings); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRS_LL_EF_CRS_Management CRS_Management | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Generate software SYNC event | ||||
|   * @rmtoll CR           SWSYNC        LL_CRS_GenerateEvent_SWSYNC | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_GenerateEvent_SWSYNC(void) | ||||
| { | ||||
|   SET_BIT(CRS->CR, CRS_CR_SWSYNC); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get the frequency error direction latched in the time of the last  | ||||
|   * SYNC event | ||||
|   * @rmtoll ISR          FEDIR         LL_CRS_GetFreqErrorDirection | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_CRS_FREQ_ERROR_DIR_UP | ||||
|   *         @arg @ref LL_CRS_FREQ_ERROR_DIR_DOWN | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_GetFreqErrorDirection(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(CRS->ISR, CRS_ISR_FEDIR)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get the frequency error counter value latched in the time of the last SYNC event | ||||
|   * @rmtoll ISR          FECAP         LL_CRS_GetFreqErrorCapture | ||||
|   * @retval A number between Min_Data = 0x0000 and Max_Data = 0xFFFF | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_GetFreqErrorCapture(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(CRS->ISR, CRS_ISR_FECAP) >> CRS_POSITION_FECAP); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRS_LL_EF_FLAG_Management FLAG_Management | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if SYNC event OK signal occurred or not | ||||
|   * @rmtoll ISR          SYNCOKF       LL_CRS_IsActiveFlag_SYNCOK | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_IsActiveFlag_SYNCOK(void) | ||||
| { | ||||
|   return (READ_BIT(CRS->ISR, CRS_ISR_SYNCOKF) == (CRS_ISR_SYNCOKF)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if SYNC warning signal occurred or not | ||||
|   * @rmtoll ISR          SYNCWARNF     LL_CRS_IsActiveFlag_SYNCWARN | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_IsActiveFlag_SYNCWARN(void) | ||||
| { | ||||
|   return (READ_BIT(CRS->ISR, CRS_ISR_SYNCWARNF) == (CRS_ISR_SYNCWARNF)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if Synchronization or trimming error signal occurred or not | ||||
|   * @rmtoll ISR          ERRF          LL_CRS_IsActiveFlag_ERR | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_IsActiveFlag_ERR(void) | ||||
| { | ||||
|   return (READ_BIT(CRS->ISR, CRS_ISR_ERRF) == (CRS_ISR_ERRF)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if Expected SYNC signal occurred or not | ||||
|   * @rmtoll ISR          ESYNCF        LL_CRS_IsActiveFlag_ESYNC | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_IsActiveFlag_ESYNC(void) | ||||
| { | ||||
|   return (READ_BIT(CRS->ISR, CRS_ISR_ESYNCF) == (CRS_ISR_ESYNCF)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if SYNC error signal occurred or not | ||||
|   * @rmtoll ISR          SYNCERR       LL_CRS_IsActiveFlag_SYNCERR | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_IsActiveFlag_SYNCERR(void) | ||||
| { | ||||
|   return (READ_BIT(CRS->ISR, CRS_ISR_SYNCERR) == (CRS_ISR_SYNCERR)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if SYNC missed error signal occurred or not | ||||
|   * @rmtoll ISR          SYNCMISS      LL_CRS_IsActiveFlag_SYNCMISS | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_IsActiveFlag_SYNCMISS(void) | ||||
| { | ||||
|   return (READ_BIT(CRS->ISR, CRS_ISR_SYNCMISS) == (CRS_ISR_SYNCMISS)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if Trimming overflow or underflow occurred or not | ||||
|   * @rmtoll ISR          TRIMOVF       LL_CRS_IsActiveFlag_TRIMOVF | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_IsActiveFlag_TRIMOVF(void) | ||||
| { | ||||
|   return (READ_BIT(CRS->ISR, CRS_ISR_TRIMOVF) == (CRS_ISR_TRIMOVF)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Clear the SYNC event OK flag | ||||
|   * @rmtoll ICR          SYNCOKC       LL_CRS_ClearFlag_SYNCOK | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_ClearFlag_SYNCOK(void) | ||||
| { | ||||
|   WRITE_REG(CRS->ICR, CRS_ICR_SYNCOKC); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Clear the  SYNC warning flag | ||||
|   * @rmtoll ICR          SYNCWARNC     LL_CRS_ClearFlag_SYNCWARN | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_ClearFlag_SYNCWARN(void) | ||||
| { | ||||
|   WRITE_REG(CRS->ICR, CRS_ICR_SYNCWARNC); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Clear TRIMOVF, SYNCMISS and SYNCERR bits and consequently also  | ||||
|   * the ERR flag | ||||
|   * @rmtoll ICR          ERRC          LL_CRS_ClearFlag_ERR | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_ClearFlag_ERR(void) | ||||
| { | ||||
|   WRITE_REG(CRS->ICR, CRS_ICR_ERRC); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Clear Expected SYNC flag | ||||
|   * @rmtoll ICR          ESYNCC        LL_CRS_ClearFlag_ESYNC | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_ClearFlag_ESYNC(void) | ||||
| { | ||||
|   WRITE_REG(CRS->ICR, CRS_ICR_ESYNCC); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRS_LL_EF_IT_Management IT_Management | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable SYNC event OK interrupt | ||||
|   * @rmtoll CR           SYNCOKIE      LL_CRS_EnableIT_SYNCOK | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_EnableIT_SYNCOK(void) | ||||
| { | ||||
|   SET_BIT(CRS->CR, CRS_CR_SYNCOKIE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable SYNC event OK interrupt | ||||
|   * @rmtoll CR           SYNCOKIE      LL_CRS_DisableIT_SYNCOK | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_DisableIT_SYNCOK(void) | ||||
| { | ||||
|   CLEAR_BIT(CRS->CR, CRS_CR_SYNCOKIE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if SYNC event OK interrupt is enabled or not | ||||
|   * @rmtoll CR           SYNCOKIE      LL_CRS_IsEnabledIT_SYNCOK | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_IsEnabledIT_SYNCOK(void) | ||||
| { | ||||
|   return (READ_BIT(CRS->CR, CRS_CR_SYNCOKIE) == (CRS_CR_SYNCOKIE)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable SYNC warning interrupt | ||||
|   * @rmtoll CR           SYNCWARNIE    LL_CRS_EnableIT_SYNCWARN | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_EnableIT_SYNCWARN(void) | ||||
| { | ||||
|   SET_BIT(CRS->CR, CRS_CR_SYNCWARNIE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable SYNC warning interrupt | ||||
|   * @rmtoll CR           SYNCWARNIE    LL_CRS_DisableIT_SYNCWARN | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_DisableIT_SYNCWARN(void) | ||||
| { | ||||
|   CLEAR_BIT(CRS->CR, CRS_CR_SYNCWARNIE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if SYNC warning interrupt is enabled or not | ||||
|   * @rmtoll CR           SYNCWARNIE    LL_CRS_IsEnabledIT_SYNCWARN | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_IsEnabledIT_SYNCWARN(void) | ||||
| { | ||||
|   return (READ_BIT(CRS->CR, CRS_CR_SYNCWARNIE) == (CRS_CR_SYNCWARNIE)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable Synchronization or trimming error interrupt | ||||
|   * @rmtoll CR           ERRIE         LL_CRS_EnableIT_ERR | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_EnableIT_ERR(void) | ||||
| { | ||||
|   SET_BIT(CRS->CR, CRS_CR_ERRIE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable Synchronization or trimming error interrupt | ||||
|   * @rmtoll CR           ERRIE         LL_CRS_DisableIT_ERR | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_DisableIT_ERR(void) | ||||
| { | ||||
|   CLEAR_BIT(CRS->CR, CRS_CR_ERRIE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if Synchronization or trimming error interrupt is enabled or not | ||||
|   * @rmtoll CR           ERRIE         LL_CRS_IsEnabledIT_ERR | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_IsEnabledIT_ERR(void) | ||||
| { | ||||
|   return (READ_BIT(CRS->CR, CRS_CR_ERRIE) == (CRS_CR_ERRIE)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable Expected SYNC interrupt | ||||
|   * @rmtoll CR           ESYNCIE       LL_CRS_EnableIT_ESYNC | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_EnableIT_ESYNC(void) | ||||
| { | ||||
|   SET_BIT(CRS->CR, CRS_CR_ESYNCIE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable Expected SYNC interrupt | ||||
|   * @rmtoll CR           ESYNCIE       LL_CRS_DisableIT_ESYNC | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_CRS_DisableIT_ESYNC(void) | ||||
| { | ||||
|   CLEAR_BIT(CRS->CR, CRS_CR_ESYNCIE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if Expected SYNC interrupt is enabled or not | ||||
|   * @rmtoll CR           ESYNCIE       LL_CRS_IsEnabledIT_ESYNC | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_CRS_IsEnabledIT_ESYNC(void) | ||||
| { | ||||
|   return (READ_BIT(CRS->CR, CRS_CR_ESYNCIE) == (CRS_CR_ESYNCIE)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #if defined(USE_FULL_LL_DRIVER) | ||||
| /** @defgroup CRS_LL_EF_Init Initialization and de-initialization functions | ||||
|   * @{ | ||||
|   */ | ||||
|    | ||||
| ErrorStatus LL_CRS_DeInit(void); | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| #endif /* USE_FULL_LL_DRIVER */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* defined(CRS) */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __STM32L0xx_LL_CRS_H */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										2129
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_dma.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2129
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_dma.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1016
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_exti.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1016
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_exti.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										945
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_gpio.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										945
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_gpio.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,945 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx_ll_gpio.h | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   Header file of GPIO LL module. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright(c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __STM32L0xx_LL_GPIO_H | ||||
| #define __STM32L0xx_LL_GPIO_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32l0xx.h" | ||||
|  | ||||
| /** @addtogroup STM32L0xx_LL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOH) | ||||
|  | ||||
| /** @defgroup GPIO_LL GPIO | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| #if defined(USE_FULL_LL_DRIVER) | ||||
| /** @defgroup GPIO_LL_Private_Macros GPIO Private Macros | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| #endif /*USE_FULL_LL_DRIVER*/ | ||||
|  | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| #if defined(USE_FULL_LL_DRIVER) | ||||
| /** @defgroup GPIO_LL_ES_INIT GPIO Exported Init structures | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief LL GPIO Init Structure definition | ||||
|   */ | ||||
| typedef struct | ||||
| { | ||||
|   uint32_t Pin;          /*!< Specifies the GPIO pins to be configured. | ||||
|                               This parameter can be any value of @ref GPIO_LL_EC_PIN */ | ||||
|  | ||||
|   uint32_t Mode;         /*!< Specifies the operating mode for the selected pins. | ||||
|                               This parameter can be a value of @ref GPIO_LL_EC_MODE. | ||||
|  | ||||
|                               GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinMode().*/ | ||||
|  | ||||
|   uint32_t Speed;        /*!< Specifies the speed for the selected pins. | ||||
|                               This parameter can be a value of @ref GPIO_LL_EC_SPEED. | ||||
|  | ||||
|                               GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinSpeed().*/ | ||||
|  | ||||
|   uint32_t OutputType;   /*!< Specifies the operating output type for the selected pins. | ||||
|                               This parameter can be a value of @ref GPIO_LL_EC_OUTPUT. | ||||
|  | ||||
|                               GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinOutputType().*/ | ||||
|  | ||||
|   uint32_t Pull;         /*!< Specifies the operating Pull-up/Pull down for the selected pins. | ||||
|                               This parameter can be a value of @ref GPIO_LL_EC_PULL. | ||||
|  | ||||
|                               GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinPull().*/ | ||||
|  | ||||
|   uint32_t Alternate;    /*!< Specifies the Peripheral to be connected to the selected pins. | ||||
|                               This parameter can be a value of @ref GPIO_LL_EC_AF. | ||||
|  | ||||
|                               GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetAFPin_0_7() and LL_GPIO_SetAFPin_8_15().*/ | ||||
| } LL_GPIO_InitTypeDef; | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| #endif /* USE_FULL_LL_DRIVER */ | ||||
|  | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| /** @defgroup GPIO_LL_Exported_Constants GPIO Exported Constants | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup GPIO_LL_EC_PIN PIN | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_GPIO_PIN_0                      GPIO_BSRR_BS_0 /*!< Select pin 0 */ | ||||
| #define LL_GPIO_PIN_1                      GPIO_BSRR_BS_1 /*!< Select pin 1 */ | ||||
| #define LL_GPIO_PIN_2                      GPIO_BSRR_BS_2 /*!< Select pin 2 */ | ||||
| #define LL_GPIO_PIN_3                      GPIO_BSRR_BS_3 /*!< Select pin 3 */ | ||||
| #define LL_GPIO_PIN_4                      GPIO_BSRR_BS_4 /*!< Select pin 4 */ | ||||
| #define LL_GPIO_PIN_5                      GPIO_BSRR_BS_5 /*!< Select pin 5 */ | ||||
| #define LL_GPIO_PIN_6                      GPIO_BSRR_BS_6 /*!< Select pin 6 */ | ||||
| #define LL_GPIO_PIN_7                      GPIO_BSRR_BS_7 /*!< Select pin 7 */ | ||||
| #define LL_GPIO_PIN_8                      GPIO_BSRR_BS_8 /*!< Select pin 8 */ | ||||
| #define LL_GPIO_PIN_9                      GPIO_BSRR_BS_9 /*!< Select pin 9 */ | ||||
| #define LL_GPIO_PIN_10                     GPIO_BSRR_BS_10 /*!< Select pin 10 */ | ||||
| #define LL_GPIO_PIN_11                     GPIO_BSRR_BS_11 /*!< Select pin 11 */ | ||||
| #define LL_GPIO_PIN_12                     GPIO_BSRR_BS_12 /*!< Select pin 12 */ | ||||
| #define LL_GPIO_PIN_13                     GPIO_BSRR_BS_13 /*!< Select pin 13 */ | ||||
| #define LL_GPIO_PIN_14                     GPIO_BSRR_BS_14 /*!< Select pin 14 */ | ||||
| #define LL_GPIO_PIN_15                     GPIO_BSRR_BS_15 /*!< Select pin 15 */ | ||||
| #define LL_GPIO_PIN_ALL                    (GPIO_BSRR_BS_0 | GPIO_BSRR_BS_1  | GPIO_BSRR_BS_2  | \ | ||||
|                                            GPIO_BSRR_BS_3  | GPIO_BSRR_BS_4  | GPIO_BSRR_BS_5  | \ | ||||
|                                            GPIO_BSRR_BS_6  | GPIO_BSRR_BS_7  | GPIO_BSRR_BS_8  | \ | ||||
|                                            GPIO_BSRR_BS_9  | GPIO_BSRR_BS_10 | GPIO_BSRR_BS_11 | \ | ||||
|                                            GPIO_BSRR_BS_12 | GPIO_BSRR_BS_13 | GPIO_BSRR_BS_14 | \ | ||||
|                                            GPIO_BSRR_BS_15) /*!< Select all pins */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup GPIO_LL_EC_MODE Mode | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_GPIO_MODE_INPUT                 (0x00000000U)       /*!< Select input mode */ | ||||
| #define LL_GPIO_MODE_OUTPUT                GPIO_MODER_MODE0_0  /*!< Select output mode */ | ||||
| #define LL_GPIO_MODE_ALTERNATE             GPIO_MODER_MODE0_1  /*!< Select alternate function mode */ | ||||
| #define LL_GPIO_MODE_ANALOG                GPIO_MODER_MODE0    /*!< Select analog mode */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup GPIO_LL_EC_OUTPUT Output Type | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_GPIO_OUTPUT_PUSHPULL            (0x00000000U)    /*!< Select push-pull as output type */ | ||||
| #define LL_GPIO_OUTPUT_OPENDRAIN           GPIO_OTYPER_OT_0 /*!< Select open-drain as output type */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup GPIO_LL_EC_SPEED Output Speed | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_GPIO_SPEED_FREQ_LOW             (0x00000000U)           /*!< Select I/O low output speed    */ | ||||
| #define LL_GPIO_SPEED_FREQ_MEDIUM          GPIO_OSPEEDER_OSPEED0_0 /*!< Select I/O medium output speed */ | ||||
| #define LL_GPIO_SPEED_FREQ_HIGH            GPIO_OSPEEDER_OSPEED0_1 /*!< Select I/O fast output speed   */ | ||||
| #define LL_GPIO_SPEED_FREQ_VERY_HIGH       GPIO_OSPEEDER_OSPEED0   /*!< Select I/O high output speed   */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| #define LL_GPIO_SPEED_LOW                  LL_GPIO_SPEED_FREQ_LOW | ||||
| #define LL_GPIO_SPEED_MEDIUM               LL_GPIO_SPEED_FREQ_MEDIUM | ||||
| #define LL_GPIO_SPEED_FAST                 LL_GPIO_SPEED_FREQ_HIGH | ||||
| #define LL_GPIO_SPEED_HIGH                 LL_GPIO_SPEED_FREQ_VERY_HIGH | ||||
|  | ||||
| /** @defgroup GPIO_LL_EC_PULL Pull Up Pull Down | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_GPIO_PULL_NO                    (0x00000000U)      /*!< Select I/O no pull */ | ||||
| #define LL_GPIO_PULL_UP                    GPIO_PUPDR_PUPD0_0 /*!< Select I/O pull up */ | ||||
| #define LL_GPIO_PULL_DOWN                  GPIO_PUPDR_PUPD0_1 /*!< Select I/O pull down */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup GPIO_LL_EC_AF Alternate Function | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_GPIO_AF_0                       (0x0000000U) /*!< Select alternate function 0 */ | ||||
| #define LL_GPIO_AF_1                       (0x0000001U) /*!< Select alternate function 1 */ | ||||
| #define LL_GPIO_AF_2                       (0x0000002U) /*!< Select alternate function 2 */ | ||||
| #define LL_GPIO_AF_3                       (0x0000003U) /*!< Select alternate function 3 */ | ||||
| #define LL_GPIO_AF_4                       (0x0000004U) /*!< Select alternate function 4 */ | ||||
| #define LL_GPIO_AF_5                       (0x0000005U) /*!< Select alternate function 5 */ | ||||
| #define LL_GPIO_AF_6                       (0x0000006U) /*!< Select alternate function 6 */ | ||||
| #define LL_GPIO_AF_7                       (0x0000007U) /*!< Select alternate function 7 */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Exported macro ------------------------------------------------------------*/ | ||||
| /** @defgroup GPIO_LL_Exported_Macros GPIO Exported Macros | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup GPIO_LL_EM_WRITE_READ Common Write and read registers Macros | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Write a value in GPIO register | ||||
|   * @param  __INSTANCE__ GPIO Instance | ||||
|   * @param  __REG__ Register to be written | ||||
|   * @param  __VALUE__ Value to be written in the register | ||||
|   * @retval None | ||||
|   */ | ||||
| #define LL_GPIO_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) | ||||
|  | ||||
| /** | ||||
|   * @brief  Read a value in GPIO register | ||||
|   * @param  __INSTANCE__ GPIO Instance | ||||
|   * @param  __REG__ Register to be read | ||||
|   * @retval Register value | ||||
|   */ | ||||
| #define LL_GPIO_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @defgroup GPIO_LL_Exported_Functions GPIO Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup GPIO_LL_EF_Port_Configuration Port Configuration | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure gpio mode for a dedicated pin on dedicated port. | ||||
|   * @note   I/O mode can be Input mode, General purpose output, Alternate function mode or Analog. | ||||
|   * @note   Warning: only one pin can be passed as parameter. | ||||
|   * @rmtoll MODER        MODEy         LL_GPIO_SetPinMode | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  Pin This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   * @param  Mode This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_MODE_INPUT | ||||
|   *         @arg @ref LL_GPIO_MODE_OUTPUT | ||||
|   *         @arg @ref LL_GPIO_MODE_ALTERNATE | ||||
|   *         @arg @ref LL_GPIO_MODE_ANALOG | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode) | ||||
| { | ||||
|   MODIFY_REG(GPIOx->MODER, ((Pin * Pin) * GPIO_MODER_MODE0), ((Pin * Pin) * Mode)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return gpio mode for a dedicated pin on dedicated port. | ||||
|   * @note   I/O mode can be Input mode, General purpose output, Alternate function mode or Analog. | ||||
|   * @note   Warning: only one pin can be passed as parameter. | ||||
|   * @rmtoll MODER        MODEy         LL_GPIO_GetPinMode | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  Pin This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_MODE_INPUT | ||||
|   *         @arg @ref LL_GPIO_MODE_OUTPUT | ||||
|   *         @arg @ref LL_GPIO_MODE_ALTERNATE | ||||
|   *         @arg @ref LL_GPIO_MODE_ANALOG | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GPIO_GetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(GPIOx->MODER, ((Pin * Pin) * GPIO_MODER_MODE0)) / (Pin * Pin)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure gpio output type for several pins on dedicated port. | ||||
|   * @note   Output type as to be set when gpio pin is in output or | ||||
|   *         alternate modes. Possible type are Push-pull or Open-drain. | ||||
|   * @rmtoll OTYPER       OTy           LL_GPIO_SetPinOutputType | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  PinMask This parameter can be a combination of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   *         @arg @ref LL_GPIO_PIN_ALL | ||||
|   * @param  OutputType This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_OUTPUT_PUSHPULL | ||||
|   *         @arg @ref LL_GPIO_OUTPUT_OPENDRAIN | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_GPIO_SetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t PinMask, uint32_t OutputType) | ||||
| { | ||||
|   MODIFY_REG(GPIOx->OTYPER, PinMask, (PinMask * OutputType)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return gpio output type for several pins on dedicated port. | ||||
|   * @note   Output type as to be set when gpio pin is in output or | ||||
|   *         alternate modes. Possible type are Push-pull or Open-drain. | ||||
|   * @note   Warning: only one pin can be passed as parameter. | ||||
|   * @rmtoll OTYPER       OTy           LL_GPIO_GetPinOutputType | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  Pin This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   *         @arg @ref LL_GPIO_PIN_ALL | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_OUTPUT_PUSHPULL | ||||
|   *         @arg @ref LL_GPIO_OUTPUT_OPENDRAIN | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GPIO_GetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t Pin) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(GPIOx->OTYPER, Pin) / Pin); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure gpio speed for a dedicated pin on dedicated port. | ||||
|   * @note   I/O speed can be Low, Medium, Fast or High speed. | ||||
|   * @note   Warning: only one pin can be passed as parameter. | ||||
|   * @note   Refer to datasheet for frequency specifications and the power | ||||
|   *         supply and load conditions for each speed. | ||||
|   * @rmtoll OSPEEDR      OSPEEDy       LL_GPIO_SetPinSpeed | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  Pin This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   * @param  Speed This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_SPEED_FREQ_LOW | ||||
|   *         @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM | ||||
|   *         @arg @ref LL_GPIO_SPEED_FREQ_HIGH | ||||
|   *         @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_GPIO_SetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t  Speed) | ||||
| { | ||||
|   MODIFY_REG(GPIOx->OSPEEDR, ((Pin * Pin) * GPIO_OSPEEDER_OSPEED0), ((Pin * Pin) * Speed)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return gpio speed for a dedicated pin on dedicated port. | ||||
|   * @note   I/O speed can be Low, Medium, Fast or High speed. | ||||
|   * @note   Warning: only one pin can be passed as parameter. | ||||
|   * @note   Refer to datasheet for frequency specifications and the power | ||||
|   *         supply and load conditions for each speed. | ||||
|   * @rmtoll OSPEEDR      OSPEEDy       LL_GPIO_GetPinSpeed | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  Pin This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_SPEED_FREQ_LOW | ||||
|   *         @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM | ||||
|   *         @arg @ref LL_GPIO_SPEED_FREQ_HIGH | ||||
|   *         @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GPIO_GetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(GPIOx->OSPEEDR, ((Pin * Pin) * GPIO_OSPEEDER_OSPEED0)) / (Pin * Pin)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure gpio pull-up or pull-down for a dedicated pin on a dedicated port. | ||||
|   * @note   Warning: only one pin can be passed as parameter. | ||||
|   * @rmtoll PUPDR        PUPDy         LL_GPIO_SetPinPull | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  Pin This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   * @param  Pull This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_PULL_NO | ||||
|   *         @arg @ref LL_GPIO_PULL_UP | ||||
|   *         @arg @ref LL_GPIO_PULL_DOWN | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_GPIO_SetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Pull) | ||||
| { | ||||
|   MODIFY_REG(GPIOx->PUPDR, ((Pin * Pin) * GPIO_PUPDR_PUPD0), ((Pin * Pin) * Pull)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return gpio pull-up or pull-down for a dedicated pin on a dedicated port | ||||
|   * @note   Warning: only one pin can be passed as parameter. | ||||
|   * @rmtoll PUPDR        PUPDy         LL_GPIO_GetPinPull | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  Pin This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_PULL_NO | ||||
|   *         @arg @ref LL_GPIO_PULL_UP | ||||
|   *         @arg @ref LL_GPIO_PULL_DOWN | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GPIO_GetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(GPIOx->PUPDR, ((Pin * Pin) * GPIO_PUPDR_PUPD0)) / (Pin * Pin)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port. | ||||
|   * @note   Possible values are from AF0 to AF7 depending on target. | ||||
|   * @note   Warning: only one pin can be passed as parameter. | ||||
|   * @rmtoll AFRL         AFSELy        LL_GPIO_SetAFPin_0_7 | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  Pin This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   * @param  Alternate This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_AF_0 | ||||
|   *         @arg @ref LL_GPIO_AF_1 | ||||
|   *         @arg @ref LL_GPIO_AF_2 | ||||
|   *         @arg @ref LL_GPIO_AF_3 | ||||
|   *         @arg @ref LL_GPIO_AF_4 | ||||
|   *         @arg @ref LL_GPIO_AF_5 | ||||
|   *         @arg @ref LL_GPIO_AF_6 | ||||
|   *         @arg @ref LL_GPIO_AF_7 | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_GPIO_SetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate) | ||||
| { | ||||
|   MODIFY_REG(GPIOx->AFR[0], ((((Pin * Pin) * Pin) * Pin) * GPIO_AFRL_AFSEL0), | ||||
|              ((((Pin * Pin) * Pin) * Pin) * Alternate)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port. | ||||
|   * @rmtoll AFRL         AFSELy        LL_GPIO_GetAFPin_0_7 | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  Pin This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_AF_0 | ||||
|   *         @arg @ref LL_GPIO_AF_1 | ||||
|   *         @arg @ref LL_GPIO_AF_2 | ||||
|   *         @arg @ref LL_GPIO_AF_3 | ||||
|   *         @arg @ref LL_GPIO_AF_4 | ||||
|   *         @arg @ref LL_GPIO_AF_5 | ||||
|   *         @arg @ref LL_GPIO_AF_6 | ||||
|   *         @arg @ref LL_GPIO_AF_7 | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GPIO_GetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(GPIOx->AFR[0], | ||||
|                              ((((Pin * Pin) * Pin) * Pin) * GPIO_AFRL_AFSEL0)) / (((Pin * Pin) * Pin) * Pin)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port. | ||||
|   * @note   Possible values are from AF0 to AF7 depending on target. | ||||
|   * @note   Warning: only one pin can be passed as parameter. | ||||
|   * @rmtoll AFRH         AFSELy        LL_GPIO_SetAFPin_8_15 | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  Pin This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   * @param  Alternate This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_AF_0 | ||||
|   *         @arg @ref LL_GPIO_AF_1 | ||||
|   *         @arg @ref LL_GPIO_AF_2 | ||||
|   *         @arg @ref LL_GPIO_AF_3 | ||||
|   *         @arg @ref LL_GPIO_AF_4 | ||||
|   *         @arg @ref LL_GPIO_AF_5 | ||||
|   *         @arg @ref LL_GPIO_AF_6 | ||||
|   *         @arg @ref LL_GPIO_AF_7 | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_GPIO_SetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate) | ||||
| { | ||||
|   MODIFY_REG(GPIOx->AFR[1], (((((Pin >> 8U) * (Pin >> 8U)) * (Pin >> 8U)) * (Pin >> 8U)) * GPIO_AFRH_AFSEL8), | ||||
|              (((((Pin >> 8U) * (Pin >> 8U)) * (Pin >> 8U)) * (Pin >> 8U)) * Alternate)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port. | ||||
|   * @note   Possible values are from AF0 to AF7 depending on target. | ||||
|   * @rmtoll AFRH         AFSELy        LL_GPIO_GetAFPin_8_15 | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  Pin This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_GPIO_AF_0 | ||||
|   *         @arg @ref LL_GPIO_AF_1 | ||||
|   *         @arg @ref LL_GPIO_AF_2 | ||||
|   *         @arg @ref LL_GPIO_AF_3 | ||||
|   *         @arg @ref LL_GPIO_AF_4 | ||||
|   *         @arg @ref LL_GPIO_AF_5 | ||||
|   *         @arg @ref LL_GPIO_AF_6 | ||||
|   *         @arg @ref LL_GPIO_AF_7 | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GPIO_GetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(GPIOx->AFR[1], | ||||
|                              (((((Pin >> 8U) * (Pin >> 8U)) * (Pin >> 8U)) * (Pin >> 8U)) * GPIO_AFRH_AFSEL8)) / ((((Pin >> 8U) * | ||||
|                                  (Pin >> 8U)) * (Pin >> 8U)) * (Pin >> 8U))); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   * @brief  Lock configuration of several pins for a dedicated port. | ||||
|   * @note   When the lock sequence has been applied on a port bit, the | ||||
|   *         value of this port bit can no longer be modified until the | ||||
|   *         next reset. | ||||
|   * @note   Each lock bit freezes a specific configuration register | ||||
|   *         (control and alternate function registers). | ||||
|   * @rmtoll LCKR         LCKK          LL_GPIO_LockPin | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  PinMask This parameter can be a combination of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   *         @arg @ref LL_GPIO_PIN_ALL | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) | ||||
| { | ||||
|   __IO uint32_t temp; | ||||
|   WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask); | ||||
|   WRITE_REG(GPIOx->LCKR, PinMask); | ||||
|   WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask); | ||||
|   /* Read LCKK register. This read is mandatory to complete key lock sequence */ | ||||
|   temp = READ_REG(GPIOx->LCKR); | ||||
|   (void) temp; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return 1 if all pins passed as parameter, of a dedicated port, are locked. else Return 0. | ||||
|   * @rmtoll LCKR         LCKy          LL_GPIO_IsPinLocked | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  PinMask This parameter can be a combination of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   *         @arg @ref LL_GPIO_PIN_ALL | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GPIO_IsPinLocked(GPIO_TypeDef *GPIOx, uint32_t PinMask) | ||||
| { | ||||
|   return (READ_BIT(GPIOx->LCKR, PinMask) == (PinMask)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return 1 if one of the pin of a dedicated port is locked. else return 0. | ||||
|   * @rmtoll LCKR         LCKK          LL_GPIO_IsAnyPinLocked | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GPIO_IsAnyPinLocked(GPIO_TypeDef *GPIOx) | ||||
| { | ||||
|   return (READ_BIT(GPIOx->LCKR, GPIO_LCKR_LCKK) == (GPIO_LCKR_LCKK)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup GPIO_LL_EF_Data_Access Data Access | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Return full input data register value for a dedicated port. | ||||
|   * @rmtoll IDR          IDy           LL_GPIO_ReadInputPort | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @retval Input data register value of port | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GPIO_ReadInputPort(GPIO_TypeDef *GPIOx) | ||||
| { | ||||
|   return (uint32_t)(READ_REG(GPIOx->IDR)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return if input data level for several pins of dedicated port is high or low. | ||||
|   * @rmtoll IDR          IDy           LL_GPIO_IsInputPinSet | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  PinMask This parameter can be a combination of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   *         @arg @ref LL_GPIO_PIN_ALL | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GPIO_IsInputPinSet(GPIO_TypeDef *GPIOx, uint32_t PinMask) | ||||
| { | ||||
|   return (READ_BIT(GPIOx->IDR, PinMask) == (PinMask)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Write output data register for the port. | ||||
|   * @rmtoll ODR          ODy           LL_GPIO_WriteOutputPort | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  PortValue Level value for each pin of the port | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_GPIO_WriteOutputPort(GPIO_TypeDef *GPIOx, uint32_t PortValue) | ||||
| { | ||||
|   WRITE_REG(GPIOx->ODR, PortValue); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return full output data register value for a dedicated port. | ||||
|   * @rmtoll ODR          ODy           LL_GPIO_ReadOutputPort | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @retval Output data register value of port | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GPIO_ReadOutputPort(GPIO_TypeDef *GPIOx) | ||||
| { | ||||
|   return (uint32_t)(READ_REG(GPIOx->ODR)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return if input data level for several pins of dedicated port is high or low. | ||||
|   * @rmtoll ODR          ODy           LL_GPIO_IsOutputPinSet | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  PinMask This parameter can be a combination of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   *         @arg @ref LL_GPIO_PIN_ALL | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GPIO_IsOutputPinSet(GPIO_TypeDef *GPIOx, uint32_t PinMask) | ||||
| { | ||||
|   return (READ_BIT(GPIOx->ODR, PinMask) == (PinMask)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set several pins to high level on dedicated gpio port. | ||||
|   * @rmtoll BSRR         BSy           LL_GPIO_SetOutputPin | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  PinMask This parameter can be a combination of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   *         @arg @ref LL_GPIO_PIN_ALL | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) | ||||
| { | ||||
|   WRITE_REG(GPIOx->BSRR, PinMask); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set several pins to low level on dedicated gpio port. | ||||
|   * @rmtoll BRR          BRy           LL_GPIO_ResetOutputPin | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  PinMask This parameter can be a combination of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   *         @arg @ref LL_GPIO_PIN_ALL | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_GPIO_ResetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) | ||||
| { | ||||
|   WRITE_REG(GPIOx->BRR, PinMask); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Toggle data value for several pin of dedicated port. | ||||
|   * @rmtoll ODR          ODy           LL_GPIO_TogglePin | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  PinMask This parameter can be a combination of the following values: | ||||
|   *         @arg @ref LL_GPIO_PIN_0 | ||||
|   *         @arg @ref LL_GPIO_PIN_1 | ||||
|   *         @arg @ref LL_GPIO_PIN_2 | ||||
|   *         @arg @ref LL_GPIO_PIN_3 | ||||
|   *         @arg @ref LL_GPIO_PIN_4 | ||||
|   *         @arg @ref LL_GPIO_PIN_5 | ||||
|   *         @arg @ref LL_GPIO_PIN_6 | ||||
|   *         @arg @ref LL_GPIO_PIN_7 | ||||
|   *         @arg @ref LL_GPIO_PIN_8 | ||||
|   *         @arg @ref LL_GPIO_PIN_9 | ||||
|   *         @arg @ref LL_GPIO_PIN_10 | ||||
|   *         @arg @ref LL_GPIO_PIN_11 | ||||
|   *         @arg @ref LL_GPIO_PIN_12 | ||||
|   *         @arg @ref LL_GPIO_PIN_13 | ||||
|   *         @arg @ref LL_GPIO_PIN_14 | ||||
|   *         @arg @ref LL_GPIO_PIN_15 | ||||
|   *         @arg @ref LL_GPIO_PIN_ALL | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint32_t PinMask) | ||||
| { | ||||
|   uint32_t odr = READ_REG(GPIOx->ODR); | ||||
|   WRITE_REG(GPIOx->BSRR, ((odr & PinMask) << 16u) | (~odr & PinMask)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #if defined(USE_FULL_LL_DRIVER) | ||||
| /** @defgroup GPIO_LL_EF_Init Initialization and de-initialization functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| ErrorStatus LL_GPIO_DeInit(GPIO_TypeDef *GPIOx); | ||||
| ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStruct); | ||||
| void        LL_GPIO_StructInit(LL_GPIO_InitTypeDef *GPIO_InitStruct); | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| #endif /* USE_FULL_LL_DRIVER */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOH) */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __STM32L0xx_LL_GPIO_H */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										2275
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_i2c.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2275
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_i2c.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										341
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_iwdg.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										341
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_iwdg.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,341 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx_ll_iwdg.h | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   Header file of IWDG LL module. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef STM32L0xx_LL_IWDG_H | ||||
| #define STM32L0xx_LL_IWDG_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32l0xx.h" | ||||
|  | ||||
| /** @addtogroup STM32L0xx_LL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #if defined(IWDG) | ||||
|  | ||||
| /** @defgroup IWDG_LL IWDG | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
|  | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
| /** @defgroup IWDG_LL_Private_Constants IWDG Private Constants | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_IWDG_KEY_RELOAD                 0x0000AAAAU               /*!< IWDG Reload Counter Enable   */ | ||||
| #define LL_IWDG_KEY_ENABLE                 0x0000CCCCU               /*!< IWDG Peripheral Enable       */ | ||||
| #define LL_IWDG_KEY_WR_ACCESS_ENABLE       0x00005555U               /*!< IWDG KR Write Access Enable  */ | ||||
| #define LL_IWDG_KEY_WR_ACCESS_DISABLE      0x00000000U               /*!< IWDG KR Write Access Disable */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
|  | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| /** @defgroup IWDG_LL_Exported_Constants IWDG Exported Constants | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup IWDG_LL_EC_GET_FLAG Get Flags Defines | ||||
|   * @brief    Flags defines which can be used with LL_IWDG_ReadReg function | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_IWDG_SR_PVU                     IWDG_SR_PVU                           /*!< Watchdog prescaler value update */ | ||||
| #define LL_IWDG_SR_RVU                     IWDG_SR_RVU                           /*!< Watchdog counter reload value update */ | ||||
| #define LL_IWDG_SR_WVU                     IWDG_SR_WVU                           /*!< Watchdog counter window value update */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup IWDG_LL_EC_PRESCALER  Prescaler Divider | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_IWDG_PRESCALER_4                0x00000000U                           /*!< Divider by 4   */ | ||||
| #define LL_IWDG_PRESCALER_8                (IWDG_PR_PR_0)                        /*!< Divider by 8   */ | ||||
| #define LL_IWDG_PRESCALER_16               (IWDG_PR_PR_1)                        /*!< Divider by 16  */ | ||||
| #define LL_IWDG_PRESCALER_32               (IWDG_PR_PR_1 | IWDG_PR_PR_0)         /*!< Divider by 32  */ | ||||
| #define LL_IWDG_PRESCALER_64               (IWDG_PR_PR_2)                        /*!< Divider by 64  */ | ||||
| #define LL_IWDG_PRESCALER_128              (IWDG_PR_PR_2 | IWDG_PR_PR_0)         /*!< Divider by 128 */ | ||||
| #define LL_IWDG_PRESCALER_256              (IWDG_PR_PR_2 | IWDG_PR_PR_1)         /*!< Divider by 256 */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Exported macro ------------------------------------------------------------*/ | ||||
| /** @defgroup IWDG_LL_Exported_Macros IWDG Exported Macros | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup IWDG_LL_EM_WRITE_READ Common Write and read registers Macros | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Write a value in IWDG register | ||||
|   * @param  __INSTANCE__ IWDG Instance | ||||
|   * @param  __REG__ Register to be written | ||||
|   * @param  __VALUE__ Value to be written in the register | ||||
|   * @retval None | ||||
|   */ | ||||
| #define LL_IWDG_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) | ||||
|  | ||||
| /** | ||||
|   * @brief  Read a value in IWDG register | ||||
|   * @param  __INSTANCE__ IWDG Instance | ||||
|   * @param  __REG__ Register to be read | ||||
|   * @retval Register value | ||||
|   */ | ||||
| #define LL_IWDG_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @defgroup IWDG_LL_Exported_Functions IWDG Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
| /** @defgroup IWDG_LL_EF_Configuration Configuration | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Start the Independent Watchdog | ||||
|   * @note   Except if the hardware watchdog option is selected | ||||
|   * @rmtoll KR           KEY           LL_IWDG_Enable | ||||
|   * @param  IWDGx IWDG Instance | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_IWDG_Enable(IWDG_TypeDef *IWDGx) | ||||
| { | ||||
|   WRITE_REG(IWDGx->KR, LL_IWDG_KEY_ENABLE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Reloads IWDG counter with value defined in the reload register | ||||
|   * @rmtoll KR           KEY           LL_IWDG_ReloadCounter | ||||
|   * @param  IWDGx IWDG Instance | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_IWDG_ReloadCounter(IWDG_TypeDef *IWDGx) | ||||
| { | ||||
|   WRITE_REG(IWDGx->KR, LL_IWDG_KEY_RELOAD); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable write access to IWDG_PR, IWDG_RLR and IWDG_WINR registers | ||||
|   * @rmtoll KR           KEY           LL_IWDG_EnableWriteAccess | ||||
|   * @param  IWDGx IWDG Instance | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_IWDG_EnableWriteAccess(IWDG_TypeDef *IWDGx) | ||||
| { | ||||
|   WRITE_REG(IWDGx->KR, LL_IWDG_KEY_WR_ACCESS_ENABLE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable write access to IWDG_PR, IWDG_RLR and IWDG_WINR registers | ||||
|   * @rmtoll KR           KEY           LL_IWDG_DisableWriteAccess | ||||
|   * @param  IWDGx IWDG Instance | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_IWDG_DisableWriteAccess(IWDG_TypeDef *IWDGx) | ||||
| { | ||||
|   WRITE_REG(IWDGx->KR, LL_IWDG_KEY_WR_ACCESS_DISABLE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Select the prescaler of the IWDG | ||||
|   * @rmtoll PR           PR            LL_IWDG_SetPrescaler | ||||
|   * @param  IWDGx IWDG Instance | ||||
|   * @param  Prescaler This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_IWDG_PRESCALER_4 | ||||
|   *         @arg @ref LL_IWDG_PRESCALER_8 | ||||
|   *         @arg @ref LL_IWDG_PRESCALER_16 | ||||
|   *         @arg @ref LL_IWDG_PRESCALER_32 | ||||
|   *         @arg @ref LL_IWDG_PRESCALER_64 | ||||
|   *         @arg @ref LL_IWDG_PRESCALER_128 | ||||
|   *         @arg @ref LL_IWDG_PRESCALER_256 | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_IWDG_SetPrescaler(IWDG_TypeDef *IWDGx, uint32_t Prescaler) | ||||
| { | ||||
|   WRITE_REG(IWDGx->PR, IWDG_PR_PR & Prescaler); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get the selected prescaler of the IWDG | ||||
|   * @rmtoll PR           PR            LL_IWDG_GetPrescaler | ||||
|   * @param  IWDGx IWDG Instance | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_IWDG_PRESCALER_4 | ||||
|   *         @arg @ref LL_IWDG_PRESCALER_8 | ||||
|   *         @arg @ref LL_IWDG_PRESCALER_16 | ||||
|   *         @arg @ref LL_IWDG_PRESCALER_32 | ||||
|   *         @arg @ref LL_IWDG_PRESCALER_64 | ||||
|   *         @arg @ref LL_IWDG_PRESCALER_128 | ||||
|   *         @arg @ref LL_IWDG_PRESCALER_256 | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_IWDG_GetPrescaler(IWDG_TypeDef *IWDGx) | ||||
| { | ||||
|   return (READ_REG(IWDGx->PR)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Specify the IWDG down-counter reload value | ||||
|   * @rmtoll RLR          RL            LL_IWDG_SetReloadCounter | ||||
|   * @param  IWDGx IWDG Instance | ||||
|   * @param  Counter Value between Min_Data=0 and Max_Data=0x0FFF | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_IWDG_SetReloadCounter(IWDG_TypeDef *IWDGx, uint32_t Counter) | ||||
| { | ||||
|   WRITE_REG(IWDGx->RLR, IWDG_RLR_RL & Counter); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get the specified IWDG down-counter reload value | ||||
|   * @rmtoll RLR          RL            LL_IWDG_GetReloadCounter | ||||
|   * @param  IWDGx IWDG Instance | ||||
|   * @retval Value between Min_Data=0 and Max_Data=0x0FFF | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_IWDG_GetReloadCounter(IWDG_TypeDef *IWDGx) | ||||
| { | ||||
|   return (READ_REG(IWDGx->RLR)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Specify high limit of the window value to be compared to the down-counter. | ||||
|   * @rmtoll WINR         WIN           LL_IWDG_SetWindow | ||||
|   * @param  IWDGx IWDG Instance | ||||
|   * @param  Window Value between Min_Data=0 and Max_Data=0x0FFF | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_IWDG_SetWindow(IWDG_TypeDef *IWDGx, uint32_t Window) | ||||
| { | ||||
|   WRITE_REG(IWDGx->WINR, IWDG_WINR_WIN & Window); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get the high limit of the window value specified. | ||||
|   * @rmtoll WINR         WIN           LL_IWDG_GetWindow | ||||
|   * @param  IWDGx IWDG Instance | ||||
|   * @retval Value between Min_Data=0 and Max_Data=0x0FFF | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_IWDG_GetWindow(IWDG_TypeDef *IWDGx) | ||||
| { | ||||
|   return (READ_REG(IWDGx->WINR)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup IWDG_LL_EF_FLAG_Management FLAG_Management | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if flag Prescaler Value Update is set or not | ||||
|   * @rmtoll SR           PVU           LL_IWDG_IsActiveFlag_PVU | ||||
|   * @param  IWDGx IWDG Instance | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_IWDG_IsActiveFlag_PVU(IWDG_TypeDef *IWDGx) | ||||
| { | ||||
|   return ((READ_BIT(IWDGx->SR, IWDG_SR_PVU) == (IWDG_SR_PVU)) ? 1UL : 0UL); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if flag Reload Value Update is set or not | ||||
|   * @rmtoll SR           RVU           LL_IWDG_IsActiveFlag_RVU | ||||
|   * @param  IWDGx IWDG Instance | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_IWDG_IsActiveFlag_RVU(IWDG_TypeDef *IWDGx) | ||||
| { | ||||
|   return ((READ_BIT(IWDGx->SR, IWDG_SR_RVU) == (IWDG_SR_RVU)) ? 1UL : 0UL); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if flag Window Value Update is set or not | ||||
|   * @rmtoll SR           WVU           LL_IWDG_IsActiveFlag_WVU | ||||
|   * @param  IWDGx IWDG Instance | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_IWDG_IsActiveFlag_WVU(IWDG_TypeDef *IWDGx) | ||||
| { | ||||
|   return ((READ_BIT(IWDGx->SR, IWDG_SR_WVU) == (IWDG_SR_WVU)) ? 1UL : 0UL); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if all flags Prescaler, Reload & Window Value Update are reset or not | ||||
|   * @rmtoll SR           PVU           LL_IWDG_IsReady\n | ||||
|   *         SR           RVU           LL_IWDG_IsReady\n | ||||
|   *         SR           WVU           LL_IWDG_IsReady | ||||
|   * @param  IWDGx IWDG Instance | ||||
|   * @retval State of bits (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_IWDG_IsReady(IWDG_TypeDef *IWDGx) | ||||
| { | ||||
|   return ((READ_BIT(IWDGx->SR, IWDG_SR_PVU | IWDG_SR_RVU | IWDG_SR_WVU) == 0U) ? 1UL : 0UL); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* IWDG */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* STM32L0xx_LL_IWDG_H */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										746
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_pwr.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										746
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_pwr.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,746 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx_ll_pwr.h | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   Header file of PWR LL module. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright(c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __STM32L0xx_LL_PWR_H | ||||
| #define __STM32L0xx_LL_PWR_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32l0xx.h" | ||||
|  | ||||
| /** @addtogroup STM32L0xx_LL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #if defined(PWR) | ||||
|  | ||||
| /** @defgroup PWR_LL PWR | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| /** @defgroup PWR_LL_Exported_Constants PWR Exported Constants | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup PWR_LL_EC_CLEAR_FLAG Clear Flags Defines | ||||
|   * @brief    Flags defines which can be used with LL_PWR_WriteReg function | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_PWR_CR_CSBF                     PWR_CR_CSBF            /*!< Clear standby flag */ | ||||
| #define LL_PWR_CR_CWUF                     PWR_CR_CWUF            /*!< Clear wakeup flag */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup PWR_LL_EC_GET_FLAG Get Flags Defines | ||||
|   * @brief    Flags defines which can be used with LL_PWR_ReadReg function | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_PWR_CSR_WUF                     PWR_CSR_WUF            /*!< Wakeup flag */ | ||||
| #define LL_PWR_CSR_SBF                     PWR_CSR_SBF            /*!< Standby flag */ | ||||
| #if defined(PWR_PVD_SUPPORT) | ||||
| #define LL_PWR_CSR_PVDO                    PWR_CSR_PVDO           /*!< Power voltage detector output flag */ | ||||
| #endif /* PWR_PVD_SUPPORT */ | ||||
| #if defined(PWR_CSR_VREFINTRDYF) | ||||
| #define LL_PWR_CSR_VREFINTRDYF             PWR_CSR_VREFINTRDYF    /*!< VREFINT ready flag */ | ||||
| #endif /* PWR_CSR_VREFINTRDYF */ | ||||
| #define LL_PWR_CSR_VOS                     PWR_CSR_VOSF           /*!< Voltage scaling select flag */ | ||||
| #define LL_PWR_CSR_REGLPF                  PWR_CSR_REGLPF         /*!< Regulator low power flag */ | ||||
| #define LL_PWR_CSR_EWUP1                   PWR_CSR_EWUP1          /*!< Enable WKUP pin 1 */ | ||||
| #define LL_PWR_CSR_EWUP2                   PWR_CSR_EWUP2          /*!< Enable WKUP pin 2 */ | ||||
| #if defined(PWR_CSR_EWUP3) | ||||
| #define LL_PWR_CSR_EWUP3                   PWR_CSR_EWUP3          /*!< Enable WKUP pin 3 */ | ||||
| #endif /* PWR_CSR_EWUP3 */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup PWR_LL_EC_REGU_VOLTAGE Regulator Voltage | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_PWR_REGU_VOLTAGE_SCALE1         (PWR_CR_VOS_0)                   /*!< 1.8V (range 1) */ | ||||
| #define LL_PWR_REGU_VOLTAGE_SCALE2         (PWR_CR_VOS_1)                   /*!< 1.5V (range 2) */ | ||||
| #define LL_PWR_REGU_VOLTAGE_SCALE3         (PWR_CR_VOS_0 | PWR_CR_VOS_1)    /*!< 1.2V (range 3) */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup PWR_LL_EC_MODE_PWR Mode Power | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_PWR_MODE_STOP                      0x00000000U                    /*!< Enter Stop mode when the CPU enters deepsleep */ | ||||
| #define LL_PWR_MODE_STANDBY                   (PWR_CR_PDDS)                  /*!< Enter Standby mode when the CPU enters deepsleep */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup PWR_LL_EC_REGU_MODE_LP_MODES  Regulator Mode In Low Power Modes | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_PWR_REGU_LPMODES_MAIN           0x00000000U        /*!< Voltage regulator in main mode during deepsleep/sleep/low-power run mode */ | ||||
| #define LL_PWR_REGU_LPMODES_LOW_POWER      (PWR_CR_LPSDSR)    /*!< Voltage regulator in low-power mode during deepsleep/sleep/low-power run mode */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| #if defined(PWR_CR_LPDS) | ||||
| /** @defgroup PWR_LL_EC_REGU_MODE_DS_MODE  Regulator Mode In Deep Sleep Mode | ||||
|  * @{ | ||||
|  */ | ||||
| #define LL_PWR_REGU_DSMODE_MAIN        0x00000000U           /*!< Voltage regulator in main mode during deepsleep mode when PWR_CR_LPSDSR = 0 */ | ||||
| #define LL_PWR_REGU_DSMODE_LOW_POWER   (PWR_CR_LPDS)         /*!< Voltage regulator in low-power mode during deepsleep mode when PWR_CR_LPSDSR = 0 */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| #endif /* PWR_CR_LPDS */ | ||||
|  | ||||
| #if defined(PWR_PVD_SUPPORT) | ||||
| /** @defgroup PWR_LL_EC_PVDLEVEL Power Voltage Detector Level | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_PWR_PVDLEVEL_0                  (PWR_CR_PLS_LEV0)      /*!< Voltage threshold detected by PVD 1.9 V */ | ||||
| #define LL_PWR_PVDLEVEL_1                  (PWR_CR_PLS_LEV1)      /*!< Voltage threshold detected by PVD 2.1 V */ | ||||
| #define LL_PWR_PVDLEVEL_2                  (PWR_CR_PLS_LEV2)      /*!< Voltage threshold detected by PVD 2.3 V */ | ||||
| #define LL_PWR_PVDLEVEL_3                  (PWR_CR_PLS_LEV3)      /*!< Voltage threshold detected by PVD 2.5 V */ | ||||
| #define LL_PWR_PVDLEVEL_4                  (PWR_CR_PLS_LEV4)      /*!< Voltage threshold detected by PVD 2.7 V */ | ||||
| #define LL_PWR_PVDLEVEL_5                  (PWR_CR_PLS_LEV5)      /*!< Voltage threshold detected by PVD 2.9 V */ | ||||
| #define LL_PWR_PVDLEVEL_6                  (PWR_CR_PLS_LEV6)      /*!< Voltage threshold detected by PVD 3.1 V */ | ||||
| #define LL_PWR_PVDLEVEL_7                  (PWR_CR_PLS_LEV7)      /*!< External input analog voltage   (Compare internally to VREFINT) */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| #endif /* PWR_PVD_SUPPORT */ | ||||
| /** @defgroup PWR_LL_EC_WAKEUP_PIN  Wakeup Pins | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_PWR_WAKEUP_PIN1                 (PWR_CSR_EWUP1)        /*!< WKUP pin 1 : PA0 */ | ||||
| #define LL_PWR_WAKEUP_PIN2                 (PWR_CSR_EWUP2)        /*!< WKUP pin 2 : PC13 */ | ||||
| #if defined(PWR_CSR_EWUP3) | ||||
| #define LL_PWR_WAKEUP_PIN3                 (PWR_CSR_EWUP3)        /*!< WKUP pin 3 : PE6 or PA2 according to device */ | ||||
| #endif /* PWR_CSR_EWUP3 */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
|  | ||||
| /* Exported macro ------------------------------------------------------------*/ | ||||
| /** @defgroup PWR_LL_Exported_Macros PWR Exported Macros | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup PWR_LL_EM_WRITE_READ Common write and read registers Macros | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Write a value in PWR register | ||||
|   * @param  __REG__ Register to be written | ||||
|   * @param  __VALUE__ Value to be written in the register | ||||
|   * @retval None | ||||
|   */ | ||||
| #define LL_PWR_WriteReg(__REG__, __VALUE__) WRITE_REG(PWR->__REG__, (__VALUE__)) | ||||
|  | ||||
| /** | ||||
|   * @brief  Read a value in PWR register | ||||
|   * @param  __REG__ Register to be read | ||||
|   * @retval Register value | ||||
|   */ | ||||
| #define LL_PWR_ReadReg(__REG__) READ_REG(PWR->__REG__) | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @defgroup PWR_LL_Exported_Functions PWR Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup PWR_LL_EF_Configuration Configuration | ||||
|   * @{ | ||||
|   */ | ||||
| /** | ||||
|   * @brief  Switch the regulator from main mode to low-power mode | ||||
|   * @rmtoll CR    LPRUN       LL_PWR_EnableLowPowerRunMode | ||||
|   * @note   Remind to set the regulator to low power before enabling | ||||
|   *         LowPower run mode (bit @ref LL_PWR_REGU_LPMODES_LOW_POWER). | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_EnableLowPowerRunMode(void) | ||||
| { | ||||
|   SET_BIT(PWR->CR, PWR_CR_LPRUN); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Switch the regulator from low-power mode to main mode | ||||
|   * @rmtoll CR    LPRUN       LL_PWR_DisableLowPowerRunMode | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_DisableLowPowerRunMode(void) | ||||
| { | ||||
|   CLEAR_BIT(PWR->CR, PWR_CR_LPRUN); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if the regulator is in low-power mode | ||||
|   * @rmtoll CR    LPRUN       LL_PWR_IsEnabledLowPowerRunMode | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_IsEnabledLowPowerRunMode(void) | ||||
| { | ||||
|   return (READ_BIT(PWR->CR, PWR_CR_LPRUN) == (PWR_CR_LPRUN)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set voltage regulator to low-power and switch from  | ||||
|   *         run main mode to run low-power mode. | ||||
|   * @rmtoll CR    LPSDSR       LL_PWR_EnterLowPowerRunMode\n | ||||
|   *         CR    LPRUN        LL_PWR_EnterLowPowerRunMode | ||||
|   * @note   This "high level" function is introduced to provide functional | ||||
|   *         compatibility with other families. Notice that the two registers | ||||
|   *         have to be written sequentially, so this function is not atomic. | ||||
|   *         To assure atomicity you can call separately the following functions: | ||||
|   *         - @ref LL_PWR_SetRegulModeLP(@ref LL_PWR_REGU_LPMODES_LOW_POWER); | ||||
|   *         - @ref LL_PWR_EnableLowPowerRunMode(); | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_EnterLowPowerRunMode(void) | ||||
| { | ||||
|   SET_BIT(PWR->CR, PWR_CR_LPSDSR); /* => LL_PWR_SetRegulModeLP(LL_PWR_REGU_LPMODES_LOW_POWER) */ | ||||
|   SET_BIT(PWR->CR, PWR_CR_LPRUN);  /* => LL_PWR_EnableLowPowerRunMode() */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set voltage regulator to main and switch from  | ||||
|   *         run main mode to low-power mode. | ||||
|   * @rmtoll CR    LPSDSR       LL_PWR_ExitLowPowerRunMode\n | ||||
|   *         CR    LPRUN        LL_PWR_ExitLowPowerRunMode | ||||
|   * @note   This "high level" function is introduced to provide functional    | ||||
|   *         compatibility with other families. Notice that the two registers  | ||||
|   *         have to be written sequentially, so this function is not atomic. | ||||
|   *         To assure atomicity you can call separately the following functions: | ||||
|   *         - @ref LL_PWR_DisableLowPowerRunMode(); | ||||
|   *         - @ref LL_PWR_SetRegulModeLP(@ref LL_PWR_REGU_LPMODES_MAIN); | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_ExitLowPowerRunMode(void) | ||||
| { | ||||
|   CLEAR_BIT(PWR->CR, PWR_CR_LPRUN);   /* => LL_PWR_DisableLowPowerRunMode() */ | ||||
|   CLEAR_BIT(PWR->CR, PWR_CR_LPSDSR);  /* => LL_PWR_SetRegulModeLP(LL_PWR_REGU_LPMODES_MAIN) */ | ||||
| } | ||||
| /** | ||||
|   * @brief  Set the main internal regulator output voltage | ||||
|   * @rmtoll CR    VOS       LL_PWR_SetRegulVoltageScaling | ||||
|   * @param  VoltageScaling This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_PWR_REGU_VOLTAGE_SCALE1 | ||||
|   *         @arg @ref LL_PWR_REGU_VOLTAGE_SCALE2 | ||||
|   *         @arg @ref LL_PWR_REGU_VOLTAGE_SCALE3 | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_SetRegulVoltageScaling(uint32_t VoltageScaling) | ||||
| { | ||||
|   MODIFY_REG(PWR->CR, PWR_CR_VOS, VoltageScaling); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get the main internal regulator output voltage | ||||
|   * @rmtoll CR    VOS       LL_PWR_GetRegulVoltageScaling | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_PWR_REGU_VOLTAGE_SCALE1 | ||||
|   *         @arg @ref LL_PWR_REGU_VOLTAGE_SCALE2 | ||||
|   *         @arg @ref LL_PWR_REGU_VOLTAGE_SCALE3 | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_GetRegulVoltageScaling(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_VOS)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable access to the backup domain | ||||
|   * @rmtoll CR    DBP       LL_PWR_EnableBkUpAccess | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_EnableBkUpAccess(void) | ||||
| { | ||||
|   SET_BIT(PWR->CR, PWR_CR_DBP); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable access to the backup domain | ||||
|   * @rmtoll CR    DBP       LL_PWR_DisableBkUpAccess | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_DisableBkUpAccess(void) | ||||
| { | ||||
|   CLEAR_BIT(PWR->CR, PWR_CR_DBP); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if the backup domain is enabled | ||||
|   * @rmtoll CR    DBP       LL_PWR_IsEnabledBkUpAccess | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_IsEnabledBkUpAccess(void) | ||||
| { | ||||
|   return (READ_BIT(PWR->CR, PWR_CR_DBP) == (PWR_CR_DBP)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set voltage regulator mode during low power modes | ||||
|   * @rmtoll CR    LPSDSR       LL_PWR_SetRegulModeLP | ||||
|   * @param  RegulMode This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_PWR_REGU_LPMODES_MAIN | ||||
|   *         @arg @ref LL_PWR_REGU_LPMODES_LOW_POWER | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_SetRegulModeLP(uint32_t RegulMode) | ||||
| { | ||||
|   MODIFY_REG(PWR->CR, PWR_CR_LPSDSR, RegulMode); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get voltage regulator mode during low power modes | ||||
|   * @rmtoll CR    LPSDSR       LL_PWR_GetRegulModeLP | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_PWR_REGU_LPMODES_MAIN | ||||
|   *         @arg @ref LL_PWR_REGU_LPMODES_LOW_POWER | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_GetRegulModeLP(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_LPSDSR)); | ||||
| } | ||||
|  | ||||
| #if defined(PWR_CR_LPDS) | ||||
| /** | ||||
|   * @brief  Set voltage regulator mode during deep sleep mode | ||||
|   * @rmtoll CR    LPDS         LL_PWR_SetRegulModeDS | ||||
|   * @param  RegulMode This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_PWR_REGU_DSMODE_MAIN | ||||
|   *         @arg @ref LL_PWR_REGU_DSMODE_LOW_POWER | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_SetRegulModeDS(uint32_t RegulMode) | ||||
| { | ||||
|   MODIFY_REG(PWR->CR, PWR_CR_LPDS, RegulMode); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get voltage regulator mode during deep sleep mode | ||||
|   * @rmtoll CR    LPDS         LL_PWR_GetRegulModeDS | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_PWR_REGU_DSMODE_MAIN | ||||
|   *         @arg @ref LL_PWR_REGU_DSMODE_LOW_POWER | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_GetRegulModeDS(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_LPDS)); | ||||
| } | ||||
| #endif /* PWR_CR_LPDS */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Set power down mode when CPU enters deepsleep | ||||
|   * @rmtoll CR    PDDS         LL_PWR_SetPowerMode | ||||
|   * @param  PDMode This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_PWR_MODE_STOP | ||||
|   *         @arg @ref LL_PWR_MODE_STANDBY | ||||
|   * @note   Set the regulator to low power (bit @ref LL_PWR_REGU_LPMODES_LOW_POWER)   | ||||
|   *         before setting MODE_STOP. If the regulator remains in "main mode",    | ||||
|   *         it consumes more power without providing any additional feature.  | ||||
|   *         In MODE_STANDBY the regulator is automatically off. | ||||
|   * @note   It is forbidden to configure both EN_VREFINT=1 and ULP=1 if the device is | ||||
|   *         in Stop mode or in Sleep/Low-power sleep mode. If the device is not in  | ||||
|   *         low-power mode, VREFINT is always enabled whatever the state of EN_VREFINT and ULP | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_SetPowerMode(uint32_t PDMode) | ||||
| { | ||||
|   MODIFY_REG(PWR->CR, PWR_CR_PDDS, PDMode); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get power down mode when CPU enters deepsleep | ||||
|   * @rmtoll CR    PDDS         LL_PWR_GetPowerMode | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_PWR_MODE_STOP | ||||
|   *         @arg @ref LL_PWR_MODE_STANDBY | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_GetPowerMode(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_PDDS)); | ||||
| } | ||||
|  | ||||
| #if defined(PWR_PVD_SUPPORT) | ||||
| /** | ||||
|   * @brief  Configure the voltage threshold detected by the Power Voltage Detector | ||||
|   * @rmtoll CR    PLS       LL_PWR_SetPVDLevel | ||||
|   * @param  PVDLevel This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_0 | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_1 | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_2 | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_3 | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_4 | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_5 | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_6 | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_7 | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_SetPVDLevel(uint32_t PVDLevel) | ||||
| { | ||||
|   MODIFY_REG(PWR->CR, PWR_CR_PLS, PVDLevel); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get the voltage threshold detection | ||||
|   * @rmtoll CR    PLS       LL_PWR_GetPVDLevel | ||||
|   * @retval Returned value can be one of the following values: | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_0 | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_1 | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_2 | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_3 | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_4 | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_5 | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_6 | ||||
|   *         @arg @ref LL_PWR_PVDLEVEL_7 | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_GetPVDLevel(void) | ||||
| { | ||||
|   return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_PLS)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable Power Voltage Detector | ||||
|   * @rmtoll CR    PVDE       LL_PWR_EnablePVD | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_EnablePVD(void) | ||||
| { | ||||
|   SET_BIT(PWR->CR, PWR_CR_PVDE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable Power Voltage Detector | ||||
|   * @rmtoll CR    PVDE       LL_PWR_DisablePVD | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_DisablePVD(void) | ||||
| { | ||||
|   CLEAR_BIT(PWR->CR, PWR_CR_PVDE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if Power Voltage Detector is enabled | ||||
|   * @rmtoll CR    PVDE       LL_PWR_IsEnabledPVD | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_IsEnabledPVD(void) | ||||
| { | ||||
|   return (READ_BIT(PWR->CR, PWR_CR_PVDE) == (PWR_CR_PVDE)); | ||||
| } | ||||
| #endif /* PWR_PVD_SUPPORT */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable the WakeUp PINx functionality | ||||
|   * @rmtoll CSR   EWUP1       LL_PWR_EnableWakeUpPin\n | ||||
|   * @rmtoll CSR   EWUP2       LL_PWR_EnableWakeUpPin\n | ||||
|   * @rmtoll CSR   EWUP3       LL_PWR_EnableWakeUpPin | ||||
|   * @param  WakeUpPin This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_PWR_WAKEUP_PIN1 | ||||
|   *         @arg @ref LL_PWR_WAKEUP_PIN2 | ||||
|   *         @arg @ref LL_PWR_WAKEUP_PIN3 (*) | ||||
|   * | ||||
|   *         (*) not available on all devices | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_EnableWakeUpPin(uint32_t WakeUpPin) | ||||
| { | ||||
|   SET_BIT(PWR->CSR, WakeUpPin); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable the WakeUp PINx functionality | ||||
|   * @rmtoll CSR   EWUP1       LL_PWR_DisableWakeUpPin\n | ||||
|   * @rmtoll CSR   EWUP2       LL_PWR_DisableWakeUpPin\n | ||||
|   * @rmtoll CSR   EWUP3       LL_PWR_DisableWakeUpPin | ||||
|   * @param  WakeUpPin This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_PWR_WAKEUP_PIN1 | ||||
|   *         @arg @ref LL_PWR_WAKEUP_PIN2 | ||||
|   *         @arg @ref LL_PWR_WAKEUP_PIN3 (*) | ||||
|   * | ||||
|   *         (*) not available on all devices | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_DisableWakeUpPin(uint32_t WakeUpPin) | ||||
| { | ||||
|   CLEAR_BIT(PWR->CSR, WakeUpPin); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if the WakeUp PINx functionality is enabled | ||||
|   * @rmtoll CSR   EWUP1       LL_PWR_IsEnabledWakeUpPin\n | ||||
|   * @rmtoll CSR   EWUP2       LL_PWR_IsEnabledWakeUpPin\n | ||||
|   * @rmtoll CSR   EWUP3       LL_PWR_IsEnabledWakeUpPin | ||||
|   * @param  WakeUpPin This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_PWR_WAKEUP_PIN1 | ||||
|   *         @arg @ref LL_PWR_WAKEUP_PIN2 | ||||
|   *         @arg @ref LL_PWR_WAKEUP_PIN3 (*) | ||||
|   * | ||||
|   *         (*) not available on all devices | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_IsEnabledWakeUpPin(uint32_t WakeUpPin) | ||||
| { | ||||
|   return (READ_BIT(PWR->CSR, WakeUpPin) == (WakeUpPin)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable ultra low-power mode by enabling VREFINT switch off in low-power modes | ||||
|   * @rmtoll CR    ULP       LL_PWR_EnableUltraLowPower | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_EnableUltraLowPower(void) | ||||
| { | ||||
|   SET_BIT(PWR->CR, PWR_CR_ULP); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable ultra low-power mode by disabling VREFINT switch off in low-power modes | ||||
|   * @rmtoll CR    ULP       LL_PWR_DisableUltraLowPower | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_DisableUltraLowPower(void) | ||||
| { | ||||
|   CLEAR_BIT(PWR->CR, PWR_CR_ULP); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if ultra low-power mode is enabled by checking if VREFINT switch off in low-power modes is enabled | ||||
|   * @rmtoll CR    ULP       LL_PWR_IsEnabledUltraLowPower | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_IsEnabledUltraLowPower(void) | ||||
| { | ||||
|   return (READ_BIT(PWR->CR, PWR_CR_ULP) == (PWR_CR_ULP)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable fast wakeup by ignoring VREFINT startup time when exiting from low-power mode | ||||
|   * @rmtoll CR    FWU       LL_PWR_EnableFastWakeUp | ||||
|   * @note   Works in conjunction with ultra low power mode. | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_EnableFastWakeUp(void) | ||||
| { | ||||
|   SET_BIT(PWR->CR, PWR_CR_FWU); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable fast wakeup by waiting VREFINT startup time when exiting from low-power mode | ||||
|   * @rmtoll CR    FWU       LL_PWR_DisableFastWakeUp | ||||
|   * @note   Works in conjunction with ultra low power mode. | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_DisableFastWakeUp(void) | ||||
| { | ||||
|   CLEAR_BIT(PWR->CR, PWR_CR_FWU); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if fast wakeup is enabled by checking if VREFINT startup time when exiting from low-power mode is ignored | ||||
|   * @rmtoll CR    FWU       LL_PWR_IsEnabledFastWakeUp | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_IsEnabledFastWakeUp(void) | ||||
| { | ||||
|   return (READ_BIT(PWR->CR, PWR_CR_FWU) == (PWR_CR_FWU)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable non-volatile memory (Flash and EEPROM) keeping off feature when exiting from low-power mode | ||||
|   * @rmtoll CR    DS_EE_KOFF       LL_PWR_EnableNVMKeptOff | ||||
|   * @note   When enabled, after entering low-power mode (Stop or Standby only), if RUN_PD of FLASH_ACR register | ||||
|   *         is also set, the Flash memory will not be woken up when exiting from deepsleep mode. | ||||
|   *         When enabled, the EEPROM will not be woken up when exiting from low-power mode (if the bit RUN_PD is set) | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_EnableNVMKeptOff(void) | ||||
| { | ||||
|   SET_BIT(PWR->CR, PWR_CR_DSEEKOFF); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable non-volatile memory (Flash and EEPROM) keeping off feature when exiting from low-power mode | ||||
|   * @rmtoll CR    DS_EE_KOFF       LL_PWR_DisableNVMKeptOff | ||||
|   * @note   When disabled, Flash memory is woken up when exiting from deepsleep mode even if the bit RUN_PD is set | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_DisableNVMKeptOff(void) | ||||
| { | ||||
|   CLEAR_BIT(PWR->CR, PWR_CR_DSEEKOFF); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Check if non-volatile memory (Flash and EEPROM) keeping off feature when exiting from low-power mode is enabled | ||||
|   * @rmtoll CR    DS_EE_KOFF       LL_PWR_IsEnabledNVMKeptOff | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_IsEnabledNVMKeptOff(void) | ||||
| { | ||||
|   return (READ_BIT(PWR->CR, PWR_CR_DSEEKOFF) == (PWR_CR_DSEEKOFF)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup PWR_LL_EF_FLAG_Management FLAG_Management | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Get Wake-up Flag | ||||
|   * @rmtoll CSR   WUF       LL_PWR_IsActiveFlag_WU | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_WU(void) | ||||
| { | ||||
|   return (READ_BIT(PWR->CSR, PWR_CSR_WUF) == (PWR_CSR_WUF)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get Standby Flag | ||||
|   * @rmtoll CSR   SBF       LL_PWR_IsActiveFlag_SB | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_SB(void) | ||||
| { | ||||
|   return (READ_BIT(PWR->CSR, PWR_CSR_SBF) == (PWR_CSR_SBF)); | ||||
| } | ||||
|  | ||||
| #if defined(PWR_PVD_SUPPORT) | ||||
| /** | ||||
|   * @brief  Indicate whether VDD voltage is below the selected PVD threshold | ||||
|   * @rmtoll CSR   PVDO       LL_PWR_IsActiveFlag_PVDO | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_PVDO(void) | ||||
| { | ||||
|   return (READ_BIT(PWR->CSR, PWR_CSR_PVDO) == (PWR_CSR_PVDO)); | ||||
| } | ||||
| #endif /* PWR_PVD_SUPPORT */ | ||||
|  | ||||
| #if defined(PWR_CSR_VREFINTRDYF) | ||||
| /** | ||||
|   * @brief  Get Internal Reference VrefInt Flag | ||||
|   * @rmtoll CSR   VREFINTRDYF       LL_PWR_IsActiveFlag_VREFINTRDY | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_VREFINTRDY(void) | ||||
| { | ||||
|   return (READ_BIT(PWR->CSR, PWR_CSR_VREFINTRDYF) == (PWR_CSR_VREFINTRDYF)); | ||||
| } | ||||
| #endif /* PWR_CSR_VREFINTRDYF */ | ||||
| /** | ||||
|   * @brief  Indicate whether the regulator is ready in the selected voltage range or if its output voltage is still changing to the required voltage level | ||||
|   * @rmtoll CSR   VOSF       LL_PWR_IsActiveFlag_VOS | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_VOS(void) | ||||
| { | ||||
|   return (READ_BIT(PWR->CSR, LL_PWR_CSR_VOS) == (LL_PWR_CSR_VOS)); | ||||
| } | ||||
| /** | ||||
|   * @brief Indicate whether the regulator is ready in main mode or is in low-power mode | ||||
|   * @rmtoll CSR   REGLPF       LL_PWR_IsActiveFlag_REGLPF | ||||
|   * @note Take care, return value "0" means the regulator is ready.  Return value "1" means the output voltage range is still changing. | ||||
|   * @retval State of bit (1 or 0). | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_REGLPF(void) | ||||
| { | ||||
|   return (READ_BIT(PWR->CSR, PWR_CSR_REGLPF) == (PWR_CSR_REGLPF)); | ||||
| } | ||||
| /** | ||||
|   * @brief  Clear Standby Flag | ||||
|   * @rmtoll CR   CSBF       LL_PWR_ClearFlag_SB | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_ClearFlag_SB(void) | ||||
| { | ||||
|   SET_BIT(PWR->CR, PWR_CR_CSBF); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Clear Wake-up Flags | ||||
|   * @rmtoll CR   CWUF       LL_PWR_ClearFlag_WU | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_PWR_ClearFlag_WU(void) | ||||
| { | ||||
|   SET_BIT(PWR->CR, PWR_CR_CWUF); | ||||
| } | ||||
| #if defined(USE_FULL_LL_DRIVER) | ||||
| /** @defgroup PWR_LL_EF_Init De-initialization function | ||||
|   * @{ | ||||
|   */ | ||||
| ErrorStatus LL_PWR_DeInit(void); | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| #endif /* USE_FULL_LL_DRIVER */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* defined(PWR) */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __STM32L0xx_LL_PWR_H */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										2497
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_rcc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2497
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_rcc.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1089
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_system.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1089
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_system.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3320
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_tim.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3320
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_tim.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3751
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_usart.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3751
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_usart.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										269
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_utils.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										269
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_ll_utils.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,269 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx_ll_utils.h | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   Header file of UTILS LL module. | ||||
|   @verbatim | ||||
|   ============================================================================== | ||||
|                      ##### How to use this driver ##### | ||||
|   ============================================================================== | ||||
|     [..] | ||||
|     The LL UTILS driver contains a set of generic APIs that can be | ||||
|     used by user: | ||||
|       (+) Device electronic signature | ||||
|       (+) Timing functions | ||||
|       (+) PLL configuration functions | ||||
|  | ||||
|   @endverbatim | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright(c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __STM32L0xx_LL_UTILS_H | ||||
| #define __STM32L0xx_LL_UTILS_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32l0xx.h" | ||||
|  | ||||
| /** @addtogroup STM32L0xx_LL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup UTILS_LL UTILS | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
|  | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
| /** @defgroup UTILS_LL_Private_Constants UTILS Private Constants | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Max delay can be used in LL_mDelay */ | ||||
| #define LL_MAX_DELAY                  0xFFFFFFFFU | ||||
|  | ||||
| /** | ||||
|  * @brief Unique device ID register base address | ||||
|  */ | ||||
| #define UID_BASE_ADDRESS              UID_BASE | ||||
|  | ||||
| /** | ||||
|  * @brief Flash size data register base address | ||||
|  */ | ||||
| #define FLASHSIZE_BASE_ADDRESS        FLASHSIZE_BASE | ||||
|  | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /** @defgroup UTILS_LL_Private_Macros UTILS Private Macros | ||||
|   * @{ | ||||
|   */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| /* Exported types ------------------------------------------------------------*/ | ||||
| /** @defgroup UTILS_LL_ES_INIT UTILS Exported structures | ||||
|   * @{ | ||||
|   */ | ||||
| /** | ||||
|   * @brief  UTILS PLL structure definition | ||||
|   */ | ||||
| typedef struct | ||||
| { | ||||
|   uint32_t PLLMul;   /*!< Multiplication factor for PLL VCO input clock. | ||||
|                           This parameter can be a value of @ref RCC_LL_EC_PLL_MUL | ||||
|  | ||||
|                           This feature can be modified afterwards using unitary function | ||||
|                           @ref LL_RCC_PLL_ConfigDomain_SYS(). */ | ||||
|  | ||||
|   uint32_t PLLDiv;   /*!< Division factor for PLL VCO output clock. | ||||
|                           This parameter can be a value of @ref RCC_LL_EC_PLL_DIV  | ||||
|    | ||||
|                           This feature can be modified afterwards using unitary function | ||||
|                           @ref LL_RCC_PLL_ConfigDomain_SYS(). */ | ||||
| } LL_UTILS_PLLInitTypeDef; | ||||
|  | ||||
| /** | ||||
|   * @brief  UTILS System, AHB and APB buses clock configuration structure definition | ||||
|   */ | ||||
| typedef struct | ||||
| { | ||||
|   uint32_t AHBCLKDivider;         /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). | ||||
|                                        This parameter can be a value of @ref RCC_LL_EC_SYSCLK_DIV | ||||
|  | ||||
|                                        This feature can be modified afterwards using unitary function | ||||
|                                        @ref LL_RCC_SetAHBPrescaler(). */ | ||||
|  | ||||
|   uint32_t APB1CLKDivider;        /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). | ||||
|                                        This parameter can be a value of @ref RCC_LL_EC_APB1_DIV | ||||
|  | ||||
|                                        This feature can be modified afterwards using unitary function | ||||
|                                        @ref LL_RCC_SetAPB1Prescaler(). */ | ||||
|  | ||||
|   uint32_t APB2CLKDivider;        /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). | ||||
|                                        This parameter can be a value of @ref RCC_LL_EC_APB2_DIV | ||||
|  | ||||
|                                        This feature can be modified afterwards using unitary function | ||||
|                                        @ref LL_RCC_SetAPB2Prescaler(). */ | ||||
|  | ||||
| } LL_UTILS_ClkInitTypeDef; | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Exported constants --------------------------------------------------------*/ | ||||
| /** @defgroup UTILS_LL_Exported_Constants UTILS Exported Constants | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup UTILS_EC_HSE_BYPASS HSE Bypass activation | ||||
|   * @{ | ||||
|   */ | ||||
| #define LL_UTILS_HSEBYPASS_OFF        0x00000000U       /*!< HSE Bypass is not enabled                */ | ||||
| #define LL_UTILS_HSEBYPASS_ON         0x00000001U       /*!< HSE Bypass is enabled                    */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Exported macro ------------------------------------------------------------*/ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @defgroup UTILS_LL_Exported_Functions UTILS Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup UTILS_EF_DEVICE_ELECTRONIC_SIGNATURE DEVICE ELECTRONIC SIGNATURE | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Get Word0 of the unique device identifier (UID based on 96 bits) | ||||
|   * @retval UID[31:0] | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GetUID_Word0(void) | ||||
| { | ||||
|   return (uint32_t)(READ_REG(*((uint32_t *)UID_BASE_ADDRESS))); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get Word1 of the unique device identifier (UID based on 96 bits) | ||||
|   * @retval UID[63:32] | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GetUID_Word1(void) | ||||
| { | ||||
|   return (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE_ADDRESS + 0x04U)))); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get Word2 of the unique device identifier (UID based on 96 bits) | ||||
|   * @retval UID[95:64] | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GetUID_Word2(void) | ||||
| { | ||||
|   return (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE_ADDRESS + 0x14U)))); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get Flash memory size | ||||
|   * @note   This bitfield indicates the size of the device Flash memory expressed in | ||||
|   *         Kbytes. As an example, 0x040 corresponds to 64 Kbytes. | ||||
|   * @retval FLASH_SIZE[15:0]: Flash memory size | ||||
|   */ | ||||
| __STATIC_INLINE uint32_t LL_GetFlashSize(void) | ||||
| { | ||||
|   return (uint32_t)(READ_REG(*((uint32_t *)FLASHSIZE_BASE_ADDRESS)) & 0xFFFF); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup UTILS_LL_EF_DELAY DELAY | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  This function configures the Cortex-M SysTick source of the time base. | ||||
|   * @param  HCLKFrequency HCLK frequency in Hz (can be calculated thanks to RCC helper macro) | ||||
|   * @note   When a RTOS is used, it is recommended to avoid changing the SysTick  | ||||
|   *         configuration by calling this function, for a delay use rather osDelay RTOS service. | ||||
|   * @param  Ticks Number of ticks | ||||
|   * @retval None | ||||
|   */ | ||||
| __STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks) | ||||
| { | ||||
|   /* Configure the SysTick to have interrupt in 1ms time base */ | ||||
|   SysTick->LOAD  = (uint32_t)((HCLKFrequency / Ticks) - 1UL);  /* set reload register */ | ||||
|   SysTick->VAL   = 0UL;                                       /* Load the SysTick Counter Value */ | ||||
|   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | | ||||
|                    SysTick_CTRL_ENABLE_Msk;                   /* Enable the Systick Timer */ | ||||
| } | ||||
|  | ||||
| void        LL_Init1msTick(uint32_t HCLKFrequency); | ||||
| void        LL_mDelay(uint32_t Delay); | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup UTILS_EF_SYSTEM SYSTEM | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| void        LL_SetSystemCoreClock(uint32_t HCLKFrequency); | ||||
| ErrorStatus LL_SetFlashLatency(uint32_t HCLKFrequency); | ||||
| ErrorStatus LL_PLL_ConfigSystemClock_HSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, | ||||
|                                          LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); | ||||
| ErrorStatus LL_PLL_ConfigSystemClock_HSE(uint32_t HSEFrequency, uint32_t HSEBypass, | ||||
|                                          LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __STM32L0xx_LL_UTILS_H */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										3
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/License.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/License.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| # Copyright (c) 2016 STMicroelectronics | ||||
|  | ||||
| This software component is licensed by STMicroelectronics under the **BSD 3-Clause** license. You may not use this file except in compliance with this license. You may obtain a copy of the license [here](https://opensource.org/licenses/BSD-3-Clause). | ||||
							
								
								
									
										379
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_dma.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										379
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_dma.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,379 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx_ll_dma.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   DMA LL module driver. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| #if defined(USE_FULL_LL_DRIVER) | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32l0xx_ll_dma.h" | ||||
| #include "stm32l0xx_ll_bus.h" | ||||
| #ifdef  USE_FULL_ASSERT | ||||
| #include "stm32_assert.h" | ||||
| #else | ||||
| #define assert_param(expr) ((void)0U) | ||||
| #endif | ||||
|  | ||||
| /** @addtogroup STM32L0xx_LL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #if defined (DMA1) | ||||
|  | ||||
| /** @defgroup DMA_LL DMA | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /** @addtogroup DMA_LL_Private_Macros | ||||
|   * @{ | ||||
|   */ | ||||
| #define IS_LL_DMA_DIRECTION(__VALUE__)          (((__VALUE__) == LL_DMA_DIRECTION_PERIPH_TO_MEMORY) || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_DIRECTION_MEMORY_TO_PERIPH) || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_DIRECTION_MEMORY_TO_MEMORY)) | ||||
|  | ||||
| #define IS_LL_DMA_MODE(__VALUE__)               (((__VALUE__) == LL_DMA_MODE_NORMAL) || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_MODE_CIRCULAR)) | ||||
|  | ||||
| #define IS_LL_DMA_PERIPHINCMODE(__VALUE__)      (((__VALUE__) == LL_DMA_PERIPH_INCREMENT) || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_PERIPH_NOINCREMENT)) | ||||
|  | ||||
| #define IS_LL_DMA_MEMORYINCMODE(__VALUE__)      (((__VALUE__) == LL_DMA_MEMORY_INCREMENT) || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_MEMORY_NOINCREMENT)) | ||||
|  | ||||
| #define IS_LL_DMA_PERIPHDATASIZE(__VALUE__)     (((__VALUE__) == LL_DMA_PDATAALIGN_BYTE)      || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_PDATAALIGN_HALFWORD)  || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_PDATAALIGN_WORD)) | ||||
|  | ||||
| #define IS_LL_DMA_MEMORYDATASIZE(__VALUE__)     (((__VALUE__) == LL_DMA_MDATAALIGN_BYTE)      || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_MDATAALIGN_HALFWORD)  || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_MDATAALIGN_WORD)) | ||||
|  | ||||
| #define IS_LL_DMA_NBDATA(__VALUE__)             ((__VALUE__)  <=  0x0000FFFFU) | ||||
|  | ||||
| #define IS_LL_DMA_PERIPHREQUEST(__VALUE__)      (((__VALUE__) == LL_DMA_REQUEST_0)  || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_REQUEST_1)  || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_REQUEST_2)  || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_REQUEST_3)  || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_REQUEST_4)  || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_REQUEST_5)  || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_REQUEST_6)  || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_REQUEST_7)  || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_REQUEST_8)  || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_REQUEST_9)  || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_REQUEST_10) || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_REQUEST_11) || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_REQUEST_12) || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_REQUEST_13) || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_REQUEST_14) || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_REQUEST_15)) | ||||
|  | ||||
| #define IS_LL_DMA_PRIORITY(__VALUE__)           (((__VALUE__) == LL_DMA_PRIORITY_LOW)    || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_PRIORITY_MEDIUM) || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_PRIORITY_HIGH)   || \ | ||||
|                                                  ((__VALUE__) == LL_DMA_PRIORITY_VERYHIGH)) | ||||
|  | ||||
| #if defined (DMA1_Channel6) && defined (DMA1_Channel7) | ||||
| #define IS_LL_DMA_ALL_CHANNEL_INSTANCE(INSTANCE, CHANNEL)  ((((INSTANCE) == DMA1) && \ | ||||
|                                                             (((CHANNEL) == LL_DMA_CHANNEL_1)|| \ | ||||
|                                                             ((CHANNEL) == LL_DMA_CHANNEL_2) || \ | ||||
|                                                             ((CHANNEL) == LL_DMA_CHANNEL_3) || \ | ||||
|                                                             ((CHANNEL) == LL_DMA_CHANNEL_4) || \ | ||||
|                                                             ((CHANNEL) == LL_DMA_CHANNEL_5) || \ | ||||
|                                                             ((CHANNEL) == LL_DMA_CHANNEL_6) || \ | ||||
|                                                             ((CHANNEL) == LL_DMA_CHANNEL_7)))) | ||||
| #elif defined (DMA1_Channel6) | ||||
| #define IS_LL_DMA_ALL_CHANNEL_INSTANCE(INSTANCE, CHANNEL)  ((((INSTANCE) == DMA1) && \ | ||||
|                                                             (((CHANNEL) == LL_DMA_CHANNEL_1)|| \ | ||||
|                                                             ((CHANNEL) == LL_DMA_CHANNEL_2) || \ | ||||
|                                                             ((CHANNEL) == LL_DMA_CHANNEL_3) || \ | ||||
|                                                             ((CHANNEL) == LL_DMA_CHANNEL_4) || \ | ||||
|                                                             ((CHANNEL) == LL_DMA_CHANNEL_5) || \ | ||||
|                                                             ((CHANNEL) == LL_DMA_CHANNEL_6)))) | ||||
| #else | ||||
| #define IS_LL_DMA_ALL_CHANNEL_INSTANCE(INSTANCE, CHANNEL)  ((((INSTANCE) == DMA1) && \ | ||||
|                                                             (((CHANNEL) == LL_DMA_CHANNEL_1)|| \ | ||||
|                                                             ((CHANNEL) == LL_DMA_CHANNEL_2) || \ | ||||
|                                                             ((CHANNEL) == LL_DMA_CHANNEL_3) || \ | ||||
|                                                             ((CHANNEL) == LL_DMA_CHANNEL_4) || \ | ||||
|                                                             ((CHANNEL) == LL_DMA_CHANNEL_5)))) | ||||
| #endif /* DMA1_Channel6 && DMA1_Channel7 */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @addtogroup DMA_LL_Exported_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup DMA_LL_EF_Init | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  De-initialize the DMA registers to their default reset values. | ||||
|   * @param  DMAx DMAx Instance | ||||
|   * @param  Channel This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_DMA_CHANNEL_1 | ||||
|   *         @arg @ref LL_DMA_CHANNEL_2 | ||||
|   *         @arg @ref LL_DMA_CHANNEL_3 | ||||
|   *         @arg @ref LL_DMA_CHANNEL_4 | ||||
|   *         @arg @ref LL_DMA_CHANNEL_5 | ||||
|   *         @arg @ref LL_DMA_CHANNEL_6 (*) | ||||
|   *         @arg @ref LL_DMA_CHANNEL_7 (*) | ||||
|   *         @arg @ref LL_DMA_CHANNEL_ALL | ||||
|   * | ||||
|   *         (*) value not defined in all devices | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: DMA registers are de-initialized | ||||
|   *          - ERROR: DMA registers are not de-initialized | ||||
|   */ | ||||
| ErrorStatus LL_DMA_DeInit(DMA_TypeDef *DMAx, uint32_t Channel) | ||||
| { | ||||
|   DMA_Channel_TypeDef *tmp = (DMA_Channel_TypeDef *)DMA1_Channel1; | ||||
|   ErrorStatus status = SUCCESS; | ||||
|  | ||||
|   /* Check the DMA Instance DMAx and Channel parameters*/ | ||||
|   assert_param(IS_LL_DMA_ALL_CHANNEL_INSTANCE(DMAx, Channel) || (Channel == LL_DMA_CHANNEL_ALL)); | ||||
|  | ||||
|   if (Channel == LL_DMA_CHANNEL_ALL) | ||||
|   { | ||||
|     if (DMAx == DMA1) | ||||
|     { | ||||
|       /* Force reset of DMA clock */ | ||||
|       LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_DMA1); | ||||
|  | ||||
|       /* Release reset of DMA clock */ | ||||
|       LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_DMA1); | ||||
|     } | ||||
| #if defined(DMA2) | ||||
|     else if (DMAx == DMA2) | ||||
|     { | ||||
|       /* Force reset of DMA clock */ | ||||
|       LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_DMA2); | ||||
|  | ||||
|       /* Release reset of DMA clock */ | ||||
|       LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_DMA2); | ||||
|     } | ||||
| #endif | ||||
|     else | ||||
|     { | ||||
|       status = ERROR; | ||||
|     } | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     tmp = (DMA_Channel_TypeDef *)(__LL_DMA_GET_CHANNEL_INSTANCE(DMAx, Channel)); | ||||
|  | ||||
|     /* Disable the selected DMAx_Channely */ | ||||
|     CLEAR_BIT(tmp->CCR, DMA_CCR_EN); | ||||
|  | ||||
|     /* Reset DMAx_Channely control register */ | ||||
|     LL_DMA_WriteReg(tmp, CCR, 0U); | ||||
|  | ||||
|     /* Reset DMAx_Channely remaining bytes register */ | ||||
|     LL_DMA_WriteReg(tmp, CNDTR, 0U); | ||||
|  | ||||
|     /* Reset DMAx_Channely peripheral address register */ | ||||
|     LL_DMA_WriteReg(tmp, CPAR, 0U); | ||||
|  | ||||
|     /* Reset DMAx_Channely memory address register */ | ||||
|     LL_DMA_WriteReg(tmp, CMAR, 0U); | ||||
|  | ||||
|     /* Reset Request register field for DMAx Channel */ | ||||
|     LL_DMA_SetPeriphRequest(DMAx, Channel, LL_DMA_REQUEST_0); | ||||
|  | ||||
|     if (Channel == LL_DMA_CHANNEL_1) | ||||
|     { | ||||
|       /* Reset interrupt pending bits for DMAx Channel1 */ | ||||
|       LL_DMA_ClearFlag_GI1(DMAx); | ||||
|     } | ||||
|     else if (Channel == LL_DMA_CHANNEL_2) | ||||
|     { | ||||
|       /* Reset interrupt pending bits for DMAx Channel2 */ | ||||
|       LL_DMA_ClearFlag_GI2(DMAx); | ||||
|     } | ||||
|     else if (Channel == LL_DMA_CHANNEL_3) | ||||
|     { | ||||
|       /* Reset interrupt pending bits for DMAx Channel3 */ | ||||
|       LL_DMA_ClearFlag_GI3(DMAx); | ||||
|     } | ||||
|     else if (Channel == LL_DMA_CHANNEL_4) | ||||
|     { | ||||
|       /* Reset interrupt pending bits for DMAx Channel4 */ | ||||
|       LL_DMA_ClearFlag_GI4(DMAx); | ||||
|     } | ||||
|     else if (Channel == LL_DMA_CHANNEL_5) | ||||
|     { | ||||
|       /* Reset interrupt pending bits for DMAx Channel5 */ | ||||
|       LL_DMA_ClearFlag_GI5(DMAx); | ||||
|     } | ||||
|  | ||||
| #if defined(DMA1_Channel6) | ||||
|     else if (Channel == LL_DMA_CHANNEL_6) | ||||
|     { | ||||
|       /* Reset interrupt pending bits for DMAx Channel6 */ | ||||
|       LL_DMA_ClearFlag_GI6(DMAx); | ||||
|     } | ||||
| #endif | ||||
| #if defined(DMA1_Channel7) | ||||
|     else if (Channel == LL_DMA_CHANNEL_7) | ||||
|     { | ||||
|       /* Reset interrupt pending bits for DMAx Channel7 */ | ||||
|       LL_DMA_ClearFlag_GI7(DMAx); | ||||
|     } | ||||
| #endif | ||||
|     else | ||||
|     { | ||||
|       status = ERROR; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Initialize the DMA registers according to the specified parameters in DMA_InitStruct. | ||||
|   * @note   To convert DMAx_Channely Instance to DMAx Instance and Channely, use helper macros : | ||||
|   *         @arg @ref __LL_DMA_GET_INSTANCE | ||||
|   *         @arg @ref __LL_DMA_GET_CHANNEL | ||||
|   * @param  DMAx DMAx Instance | ||||
|   * @param  Channel This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_DMA_CHANNEL_1 | ||||
|   *         @arg @ref LL_DMA_CHANNEL_2 | ||||
|   *         @arg @ref LL_DMA_CHANNEL_3 | ||||
|   *         @arg @ref LL_DMA_CHANNEL_4 | ||||
|   *         @arg @ref LL_DMA_CHANNEL_5 | ||||
|   *         @arg @ref LL_DMA_CHANNEL_6 (*) | ||||
|   *         @arg @ref LL_DMA_CHANNEL_7 (*) | ||||
|   * | ||||
|   *         (*) value not defined in all devices | ||||
|   * @param  DMA_InitStruct pointer to a @ref LL_DMA_InitTypeDef structure. | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: DMA registers are initialized | ||||
|   *          - ERROR: Not applicable | ||||
|   */ | ||||
| ErrorStatus LL_DMA_Init(DMA_TypeDef *DMAx, uint32_t Channel, LL_DMA_InitTypeDef *DMA_InitStruct) | ||||
| { | ||||
|   /* Check the DMA Instance DMAx and Channel parameters*/ | ||||
|   assert_param(IS_LL_DMA_ALL_CHANNEL_INSTANCE(DMAx, Channel)); | ||||
|  | ||||
|   /* Check the DMA parameters from DMA_InitStruct */ | ||||
|   assert_param(IS_LL_DMA_DIRECTION(DMA_InitStruct->Direction)); | ||||
|   assert_param(IS_LL_DMA_MODE(DMA_InitStruct->Mode)); | ||||
|   assert_param(IS_LL_DMA_PERIPHINCMODE(DMA_InitStruct->PeriphOrM2MSrcIncMode)); | ||||
|   assert_param(IS_LL_DMA_MEMORYINCMODE(DMA_InitStruct->MemoryOrM2MDstIncMode)); | ||||
|   assert_param(IS_LL_DMA_PERIPHDATASIZE(DMA_InitStruct->PeriphOrM2MSrcDataSize)); | ||||
|   assert_param(IS_LL_DMA_MEMORYDATASIZE(DMA_InitStruct->MemoryOrM2MDstDataSize)); | ||||
|   assert_param(IS_LL_DMA_NBDATA(DMA_InitStruct->NbData)); | ||||
|   assert_param(IS_LL_DMA_PERIPHREQUEST(DMA_InitStruct->PeriphRequest)); | ||||
|   assert_param(IS_LL_DMA_PRIORITY(DMA_InitStruct->Priority)); | ||||
|  | ||||
|   /*---------------------------- DMAx CCR Configuration ------------------------ | ||||
|    * Configure DMAx_Channely: data transfer direction, data transfer mode, | ||||
|    *                          peripheral and memory increment mode, | ||||
|    *                          data size alignment and  priority level with parameters : | ||||
|    * - Direction:      DMA_CCR_DIR and DMA_CCR_MEM2MEM bits | ||||
|    * - Mode:           DMA_CCR_CIRC bit | ||||
|    * - PeriphOrM2MSrcIncMode:  DMA_CCR_PINC bit | ||||
|    * - MemoryOrM2MDstIncMode:  DMA_CCR_MINC bit | ||||
|    * - PeriphOrM2MSrcDataSize: DMA_CCR_PSIZE[1:0] bits | ||||
|    * - MemoryOrM2MDstDataSize: DMA_CCR_MSIZE[1:0] bits | ||||
|    * - Priority:               DMA_CCR_PL[1:0] bits | ||||
|    */ | ||||
|   LL_DMA_ConfigTransfer(DMAx, Channel, DMA_InitStruct->Direction              | \ | ||||
|                         DMA_InitStruct->Mode                   | \ | ||||
|                         DMA_InitStruct->PeriphOrM2MSrcIncMode  | \ | ||||
|                         DMA_InitStruct->MemoryOrM2MDstIncMode  | \ | ||||
|                         DMA_InitStruct->PeriphOrM2MSrcDataSize | \ | ||||
|                         DMA_InitStruct->MemoryOrM2MDstDataSize | \ | ||||
|                         DMA_InitStruct->Priority); | ||||
|  | ||||
|   /*-------------------------- DMAx CMAR Configuration ------------------------- | ||||
|    * Configure the memory or destination base address with parameter : | ||||
|    * - MemoryOrM2MDstAddress: DMA_CMAR_MA[31:0] bits | ||||
|    */ | ||||
|   LL_DMA_SetMemoryAddress(DMAx, Channel, DMA_InitStruct->MemoryOrM2MDstAddress); | ||||
|  | ||||
|   /*-------------------------- DMAx CPAR Configuration ------------------------- | ||||
|    * Configure the peripheral or source base address with parameter : | ||||
|    * - PeriphOrM2MSrcAddress: DMA_CPAR_PA[31:0] bits | ||||
|    */ | ||||
|   LL_DMA_SetPeriphAddress(DMAx, Channel, DMA_InitStruct->PeriphOrM2MSrcAddress); | ||||
|  | ||||
|   /*--------------------------- DMAx CNDTR Configuration ----------------------- | ||||
|    * Configure the peripheral base address with parameter : | ||||
|    * - NbData: DMA_CNDTR_NDT[15:0] bits | ||||
|    */ | ||||
|   LL_DMA_SetDataLength(DMAx, Channel, DMA_InitStruct->NbData); | ||||
|  | ||||
|   /*--------------------------- DMAx CSELR Configuration ----------------------- | ||||
|    * Configure the DMA request for DMA instance on Channel x with parameter : | ||||
|    * - PeriphRequest: DMA_CSELR[31:0] bits | ||||
|    */ | ||||
|   LL_DMA_SetPeriphRequest(DMAx, Channel, DMA_InitStruct->PeriphRequest); | ||||
|  | ||||
|   return SUCCESS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set each @ref LL_DMA_InitTypeDef field to default value. | ||||
|   * @param  DMA_InitStruct Pointer to a @ref LL_DMA_InitTypeDef structure. | ||||
|   * @retval None | ||||
|   */ | ||||
| void LL_DMA_StructInit(LL_DMA_InitTypeDef *DMA_InitStruct) | ||||
| { | ||||
|   /* Set DMA_InitStruct fields to default values */ | ||||
|   DMA_InitStruct->PeriphOrM2MSrcAddress  = 0x00000000U; | ||||
|   DMA_InitStruct->MemoryOrM2MDstAddress  = 0x00000000U; | ||||
|   DMA_InitStruct->Direction              = LL_DMA_DIRECTION_PERIPH_TO_MEMORY; | ||||
|   DMA_InitStruct->Mode                   = LL_DMA_MODE_NORMAL; | ||||
|   DMA_InitStruct->PeriphOrM2MSrcIncMode  = LL_DMA_PERIPH_NOINCREMENT; | ||||
|   DMA_InitStruct->MemoryOrM2MDstIncMode  = LL_DMA_MEMORY_NOINCREMENT; | ||||
|   DMA_InitStruct->PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_BYTE; | ||||
|   DMA_InitStruct->MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_BYTE; | ||||
|   DMA_InitStruct->NbData                 = 0x00000000U; | ||||
|   DMA_InitStruct->PeriphRequest          = LL_DMA_REQUEST_0; | ||||
|   DMA_InitStruct->Priority               = LL_DMA_PRIORITY_LOW; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* DMA1 */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* USE_FULL_LL_DRIVER */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										214
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_exti.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_exti.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,214 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx_ll_exti.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   EXTI LL module driver. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright(c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| #if defined(USE_FULL_LL_DRIVER) | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32l0xx_ll_exti.h" | ||||
| #ifdef  USE_FULL_ASSERT | ||||
| #include "stm32_assert.h" | ||||
| #else | ||||
| #define assert_param(expr) ((void)0U) | ||||
| #endif | ||||
|  | ||||
| /** @addtogroup STM32L0xx_LL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #if defined (EXTI) | ||||
|  | ||||
| /** @defgroup EXTI_LL EXTI | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /** @addtogroup EXTI_LL_Private_Macros | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #define IS_LL_EXTI_LINE_0_31(__VALUE__)              (((__VALUE__) & ~LL_EXTI_LINE_ALL_0_31) == 0x00000000U) | ||||
|  | ||||
| #define IS_LL_EXTI_MODE(__VALUE__)                   (((__VALUE__) == LL_EXTI_MODE_IT)            \ | ||||
|                                                    || ((__VALUE__) == LL_EXTI_MODE_EVENT)         \ | ||||
|                                                    || ((__VALUE__) == LL_EXTI_MODE_IT_EVENT)) | ||||
|  | ||||
|  | ||||
| #define IS_LL_EXTI_TRIGGER(__VALUE__)                (((__VALUE__) == LL_EXTI_TRIGGER_NONE)       \ | ||||
|                                                    || ((__VALUE__) == LL_EXTI_TRIGGER_RISING)     \ | ||||
|                                                    || ((__VALUE__) == LL_EXTI_TRIGGER_FALLING)    \ | ||||
|                                                    || ((__VALUE__) == LL_EXTI_TRIGGER_RISING_FALLING)) | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @addtogroup EXTI_LL_Exported_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup EXTI_LL_EF_Init | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  De-initialize the EXTI registers to their default reset values. | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: EXTI registers are de-initialized | ||||
|   *          - ERROR: not applicable | ||||
|   */ | ||||
| uint32_t LL_EXTI_DeInit(void) | ||||
| { | ||||
|   /* Interrupt mask register set to default reset values */ | ||||
|   LL_EXTI_WriteReg(IMR,   0x3F840000U); | ||||
|   /* Event mask register set to default reset values */ | ||||
|   LL_EXTI_WriteReg(EMR,   0x00000000U); | ||||
|   /* Rising Trigger selection register set to default reset values */ | ||||
|   LL_EXTI_WriteReg(RTSR,  0x00000000U); | ||||
|   /* Falling Trigger selection register set to default reset values */ | ||||
|   LL_EXTI_WriteReg(FTSR,  0x00000000U); | ||||
|   /* Software interrupt event register set to default reset values */ | ||||
|   LL_EXTI_WriteReg(SWIER, 0x00000000U); | ||||
|   /* Pending register set to default reset values */ | ||||
|   LL_EXTI_WriteReg(PR,    0x007BFFFFU); | ||||
|  | ||||
|   return SUCCESS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Initialize the EXTI registers according to the specified parameters in EXTI_InitStruct. | ||||
|   * @param  EXTI_InitStruct pointer to a @ref LL_EXTI_InitTypeDef structure. | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: EXTI registers are initialized | ||||
|   *          - ERROR: not applicable | ||||
|   */ | ||||
| uint32_t LL_EXTI_Init(LL_EXTI_InitTypeDef *EXTI_InitStruct) | ||||
| { | ||||
|   ErrorStatus status = SUCCESS; | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_LL_EXTI_LINE_0_31(EXTI_InitStruct->Line_0_31)); | ||||
|   assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->LineCommand)); | ||||
|   assert_param(IS_LL_EXTI_MODE(EXTI_InitStruct->Mode)); | ||||
|  | ||||
|   /* ENABLE LineCommand */ | ||||
|   if (EXTI_InitStruct->LineCommand != DISABLE) | ||||
|   { | ||||
|     assert_param(IS_LL_EXTI_TRIGGER(EXTI_InitStruct->Trigger)); | ||||
|  | ||||
|     /* Configure EXTI Lines in range from 0 to 31 */ | ||||
|     if (EXTI_InitStruct->Line_0_31 != LL_EXTI_LINE_NONE) | ||||
|     { | ||||
|       switch (EXTI_InitStruct->Mode) | ||||
|       { | ||||
|         case LL_EXTI_MODE_IT: | ||||
|           /* First Disable Event on provided Lines */ | ||||
|           LL_EXTI_DisableEvent_0_31(EXTI_InitStruct->Line_0_31); | ||||
|           /* Then Enable IT on provided Lines */ | ||||
|           LL_EXTI_EnableIT_0_31(EXTI_InitStruct->Line_0_31); | ||||
|           break; | ||||
|         case LL_EXTI_MODE_EVENT: | ||||
|           /* First Disable IT on provided Lines */ | ||||
|           LL_EXTI_DisableIT_0_31(EXTI_InitStruct->Line_0_31); | ||||
|           /* Then Enable Event on provided Lines */ | ||||
|           LL_EXTI_EnableEvent_0_31(EXTI_InitStruct->Line_0_31); | ||||
|           break; | ||||
|         case LL_EXTI_MODE_IT_EVENT: | ||||
|           /* Directly Enable IT & Event on provided Lines */ | ||||
|           LL_EXTI_EnableIT_0_31(EXTI_InitStruct->Line_0_31); | ||||
|           LL_EXTI_EnableEvent_0_31(EXTI_InitStruct->Line_0_31); | ||||
|           break; | ||||
|         default: | ||||
|           status = ERROR; | ||||
|           break; | ||||
|       } | ||||
|       if (EXTI_InitStruct->Trigger != LL_EXTI_TRIGGER_NONE) | ||||
|       { | ||||
|         switch (EXTI_InitStruct->Trigger) | ||||
|         { | ||||
|           case LL_EXTI_TRIGGER_RISING: | ||||
|             /* First Disable Falling Trigger on provided Lines */ | ||||
|             LL_EXTI_DisableFallingTrig_0_31(EXTI_InitStruct->Line_0_31); | ||||
|             /* Then Enable Rising Trigger on provided Lines */ | ||||
|             LL_EXTI_EnableRisingTrig_0_31(EXTI_InitStruct->Line_0_31); | ||||
|             break; | ||||
|           case LL_EXTI_TRIGGER_FALLING: | ||||
|             /* First Disable Rising Trigger on provided Lines */ | ||||
|             LL_EXTI_DisableRisingTrig_0_31(EXTI_InitStruct->Line_0_31); | ||||
|             /* Then Enable Falling Trigger on provided Lines */ | ||||
|             LL_EXTI_EnableFallingTrig_0_31(EXTI_InitStruct->Line_0_31); | ||||
|             break; | ||||
|           case LL_EXTI_TRIGGER_RISING_FALLING: | ||||
|             LL_EXTI_EnableRisingTrig_0_31(EXTI_InitStruct->Line_0_31); | ||||
|             LL_EXTI_EnableFallingTrig_0_31(EXTI_InitStruct->Line_0_31); | ||||
|             break; | ||||
|           default: | ||||
|             status = ERROR; | ||||
|             break; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   /* DISABLE LineCommand */ | ||||
|   else | ||||
|   { | ||||
|     /* De-configure EXTI Lines in range from 0 to 31 */ | ||||
|     LL_EXTI_DisableIT_0_31(EXTI_InitStruct->Line_0_31); | ||||
|     LL_EXTI_DisableEvent_0_31(EXTI_InitStruct->Line_0_31); | ||||
|   } | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set each @ref LL_EXTI_InitTypeDef field to default value. | ||||
|   * @param  EXTI_InitStruct Pointer to a @ref LL_EXTI_InitTypeDef structure. | ||||
|   * @retval None | ||||
|   */ | ||||
| void LL_EXTI_StructInit(LL_EXTI_InitTypeDef *EXTI_InitStruct) | ||||
| { | ||||
|   EXTI_InitStruct->Line_0_31      = LL_EXTI_LINE_NONE; | ||||
|   EXTI_InitStruct->LineCommand    = DISABLE; | ||||
|   EXTI_InitStruct->Mode           = LL_EXTI_MODE_IT; | ||||
|   EXTI_InitStruct->Trigger        = LL_EXTI_TRIGGER_FALLING; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* defined (EXTI) */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* USE_FULL_LL_DRIVER */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										263
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_gpio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										263
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_gpio.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,263 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx_ll_gpio.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   GPIO LL module driver. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright(c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| #if defined(USE_FULL_LL_DRIVER) | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32l0xx_ll_gpio.h" | ||||
| #include "stm32l0xx_ll_bus.h" | ||||
| #ifdef  USE_FULL_ASSERT | ||||
| #include "stm32_assert.h" | ||||
| #else | ||||
| #define assert_param(expr) ((void)0U) | ||||
| #endif | ||||
|  | ||||
| /** @addtogroup STM32L0xx_LL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOH) | ||||
|  | ||||
| /** @addtogroup GPIO_LL | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /** @addtogroup GPIO_LL_Private_Macros | ||||
|   * @{ | ||||
|   */ | ||||
| #define IS_LL_GPIO_PIN(__VALUE__)          (((0x00000000UL) < (__VALUE__)) && ((__VALUE__) <= (LL_GPIO_PIN_ALL))) | ||||
|  | ||||
| #define IS_LL_GPIO_MODE(__VALUE__)         (((__VALUE__) == LL_GPIO_MODE_INPUT)     ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_MODE_OUTPUT)    ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_MODE_ALTERNATE) ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_MODE_ANALOG)) | ||||
|  | ||||
| #define IS_LL_GPIO_OUTPUT_TYPE(__VALUE__)  (((__VALUE__) == LL_GPIO_OUTPUT_PUSHPULL)  ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_OUTPUT_OPENDRAIN)) | ||||
|  | ||||
| #define IS_LL_GPIO_SPEED(__VALUE__)        (((__VALUE__) == LL_GPIO_SPEED_FREQ_LOW)       ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_SPEED_FREQ_MEDIUM)    ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_SPEED_FREQ_HIGH)      ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_SPEED_FREQ_VERY_HIGH)) | ||||
|  | ||||
| #define IS_LL_GPIO_PULL(__VALUE__)         (((__VALUE__) == LL_GPIO_PULL_NO)   ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_PULL_UP)   ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_PULL_DOWN)) | ||||
|  | ||||
| #define IS_LL_GPIO_ALTERNATE(__VALUE__)    (((__VALUE__) == LL_GPIO_AF_0  )   ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_AF_1  )   ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_AF_2  )   ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_AF_3  )   ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_AF_4  )   ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_AF_5  )   ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_AF_6  )   ||\ | ||||
|                                             ((__VALUE__) == LL_GPIO_AF_7 )) | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @addtogroup GPIO_LL_Exported_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup GPIO_LL_EF_Init | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  De-initialize GPIO registers (Registers restored to their default values). | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: GPIO registers are de-initialized | ||||
|   *          - ERROR:   Wrong GPIO Port | ||||
|   */ | ||||
| ErrorStatus LL_GPIO_DeInit(GPIO_TypeDef *GPIOx) | ||||
| { | ||||
|   ErrorStatus status = SUCCESS; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); | ||||
|  | ||||
|   /* Force and Release reset on clock of GPIOx Port */ | ||||
|   if (GPIOx == GPIOA) | ||||
|   { | ||||
|     LL_IOP_GRP1_ForceReset(LL_IOP_GRP1_PERIPH_GPIOA); | ||||
|     LL_IOP_GRP1_ReleaseReset(LL_IOP_GRP1_PERIPH_GPIOA); | ||||
|   } | ||||
|   else if (GPIOx == GPIOB) | ||||
|   { | ||||
|     LL_IOP_GRP1_ForceReset(LL_IOP_GRP1_PERIPH_GPIOB); | ||||
|     LL_IOP_GRP1_ReleaseReset(LL_IOP_GRP1_PERIPH_GPIOB); | ||||
|   } | ||||
|   else if (GPIOx == GPIOC) | ||||
|   { | ||||
|     LL_IOP_GRP1_ForceReset(LL_IOP_GRP1_PERIPH_GPIOC); | ||||
|     LL_IOP_GRP1_ReleaseReset(LL_IOP_GRP1_PERIPH_GPIOC); | ||||
|   } | ||||
| #if defined(GPIOD) | ||||
|   else if (GPIOx == GPIOD) | ||||
|   { | ||||
|     LL_IOP_GRP1_ForceReset(LL_IOP_GRP1_PERIPH_GPIOD); | ||||
|     LL_IOP_GRP1_ReleaseReset(LL_IOP_GRP1_PERIPH_GPIOD); | ||||
|   } | ||||
| #endif /* GPIOD */ | ||||
| #if defined(GPIOE) | ||||
|   else if (GPIOx == GPIOE) | ||||
|   { | ||||
|     LL_IOP_GRP1_ForceReset(LL_IOP_GRP1_PERIPH_GPIOE); | ||||
|     LL_IOP_GRP1_ReleaseReset(LL_IOP_GRP1_PERIPH_GPIOE); | ||||
|   } | ||||
| #endif /* GPIOE */ | ||||
| #if defined(GPIOH) | ||||
|   else if (GPIOx == GPIOH) | ||||
|   { | ||||
|     LL_IOP_GRP1_ForceReset(LL_IOP_GRP1_PERIPH_GPIOH); | ||||
|     LL_IOP_GRP1_ReleaseReset(LL_IOP_GRP1_PERIPH_GPIOH); | ||||
|   } | ||||
| #endif /* GPIOH */ | ||||
|   else | ||||
|   { | ||||
|     status = ERROR; | ||||
|   } | ||||
|  | ||||
|   return (status); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Initialize GPIO registers according to the specified parameters in GPIO_InitStruct. | ||||
|   * @param  GPIOx GPIO Port | ||||
|   * @param  GPIO_InitStruct pointer to a @ref LL_GPIO_InitTypeDef structure | ||||
|   *         that contains the configuration information for the specified GPIO peripheral. | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: GPIO registers are initialized according to GPIO_InitStruct content | ||||
|   *          - ERROR:   Not applicable | ||||
|   */ | ||||
| ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStruct) | ||||
| { | ||||
|   uint32_t pinpos     = 0x00000000U; | ||||
|   uint32_t currentpin = 0x00000000U; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); | ||||
|   assert_param(IS_LL_GPIO_PIN(GPIO_InitStruct->Pin)); | ||||
|   assert_param(IS_LL_GPIO_MODE(GPIO_InitStruct->Mode)); | ||||
|   assert_param(IS_LL_GPIO_PULL(GPIO_InitStruct->Pull)); | ||||
|  | ||||
|   /* ------------------------- Configure the port pins ---------------- */ | ||||
|   /* Initialize  pinpos on first pin set */ | ||||
|   /* pinpos = 0; useless as already done in default initialization */ | ||||
|  | ||||
|   /* Configure the port pins */ | ||||
|   while (((GPIO_InitStruct->Pin) >> pinpos) != 0x00000000U) | ||||
|   { | ||||
|     /* Get current io position */ | ||||
|     currentpin = (GPIO_InitStruct->Pin) & (0x00000001U << pinpos); | ||||
|  | ||||
|     if (currentpin) | ||||
|     { | ||||
|       if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE)) | ||||
|       { | ||||
|         /* Check Speed mode parameters */ | ||||
|         assert_param(IS_LL_GPIO_SPEED(GPIO_InitStruct->Speed)); | ||||
|  | ||||
|         /* Speed mode configuration */ | ||||
|         LL_GPIO_SetPinSpeed(GPIOx, currentpin, GPIO_InitStruct->Speed); | ||||
|  | ||||
|         /* Check Output mode parameters */ | ||||
|         assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType)); | ||||
|  | ||||
|         /* Output mode configuration*/ | ||||
|         LL_GPIO_SetPinOutputType(GPIOx, GPIO_InitStruct->Pin, GPIO_InitStruct->OutputType); | ||||
|       } | ||||
|  | ||||
|       /* Pull-up Pull down resistor configuration*/ | ||||
|       LL_GPIO_SetPinPull(GPIOx, currentpin, GPIO_InitStruct->Pull); | ||||
|  | ||||
|       if (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE) | ||||
|       { | ||||
|         /* Check Alternate parameter */ | ||||
|         assert_param(IS_LL_GPIO_ALTERNATE(GPIO_InitStruct->Alternate)); | ||||
|  | ||||
|         /* Speed mode configuration */ | ||||
|         if (currentpin < LL_GPIO_PIN_8) | ||||
|         { | ||||
|           LL_GPIO_SetAFPin_0_7(GPIOx, currentpin, GPIO_InitStruct->Alternate); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|           LL_GPIO_SetAFPin_8_15(GPIOx, currentpin, GPIO_InitStruct->Alternate); | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       /* Pin Mode configuration */ | ||||
|       LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode); | ||||
|     } | ||||
|     pinpos++; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   return (SUCCESS); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Set each @ref LL_GPIO_InitTypeDef field to default value. | ||||
|   * @param GPIO_InitStruct: pointer to a @ref LL_GPIO_InitTypeDef structure | ||||
|   *                          whose fields will be set to default values. | ||||
|   * @retval None | ||||
|   */ | ||||
|  | ||||
| void LL_GPIO_StructInit(LL_GPIO_InitTypeDef *GPIO_InitStruct) | ||||
| { | ||||
|   /* Reset GPIO init structure parameters values */ | ||||
|   GPIO_InitStruct->Pin        = LL_GPIO_PIN_ALL; | ||||
|   GPIO_InitStruct->Mode       = LL_GPIO_MODE_ANALOG; | ||||
|   GPIO_InitStruct->Speed      = LL_GPIO_SPEED_FREQ_LOW; | ||||
|   GPIO_InitStruct->OutputType = LL_GPIO_OUTPUT_PUSHPULL; | ||||
|   GPIO_InitStruct->Pull       = LL_GPIO_PULL_NO; | ||||
|   GPIO_InitStruct->Alternate  = LL_GPIO_AF_0; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOH) */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* USE_FULL_LL_DRIVER */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
|  | ||||
							
								
								
									
										239
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_i2c.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										239
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_i2c.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,239 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx_ll_i2c.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   I2C LL module driver. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| #if defined(USE_FULL_LL_DRIVER) | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32l0xx_ll_i2c.h" | ||||
| #include "stm32l0xx_ll_bus.h" | ||||
| #ifdef  USE_FULL_ASSERT | ||||
| #include "stm32_assert.h" | ||||
| #else | ||||
| #define assert_param(expr) ((void)0U) | ||||
| #endif /* USE_FULL_ASSERT */ | ||||
|  | ||||
| /** @addtogroup STM32L0xx_LL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #if defined (I2C1) || defined (I2C2) || defined (I2C3) | ||||
|  | ||||
| /** @defgroup I2C_LL I2C | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /** @addtogroup I2C_LL_Private_Macros | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #define IS_LL_I2C_PERIPHERAL_MODE(__VALUE__)    (((__VALUE__) == LL_I2C_MODE_I2C)          || \ | ||||
|                                                  ((__VALUE__) == LL_I2C_MODE_SMBUS_HOST)   || \ | ||||
|                                                  ((__VALUE__) == LL_I2C_MODE_SMBUS_DEVICE) || \ | ||||
|                                                  ((__VALUE__) == LL_I2C_MODE_SMBUS_DEVICE_ARP)) | ||||
|  | ||||
| #define IS_LL_I2C_ANALOG_FILTER(__VALUE__)      (((__VALUE__) == LL_I2C_ANALOGFILTER_ENABLE) || \ | ||||
|                                                  ((__VALUE__) == LL_I2C_ANALOGFILTER_DISABLE)) | ||||
|  | ||||
| #define IS_LL_I2C_DIGITAL_FILTER(__VALUE__)     ((__VALUE__) <= 0x0000000FU) | ||||
|  | ||||
| #define IS_LL_I2C_OWN_ADDRESS1(__VALUE__)       ((__VALUE__) <= 0x000003FFU) | ||||
|  | ||||
| #define IS_LL_I2C_TYPE_ACKNOWLEDGE(__VALUE__)   (((__VALUE__) == LL_I2C_ACK) || \ | ||||
|                                                  ((__VALUE__) == LL_I2C_NACK)) | ||||
|  | ||||
| #define IS_LL_I2C_OWN_ADDRSIZE(__VALUE__)       (((__VALUE__) == LL_I2C_OWNADDRESS1_7BIT) || \ | ||||
|                                                  ((__VALUE__) == LL_I2C_OWNADDRESS1_10BIT)) | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @addtogroup I2C_LL_Exported_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup I2C_LL_EF_Init | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  De-initialize the I2C registers to their default reset values. | ||||
|   * @param  I2Cx I2C Instance. | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: I2C registers are de-initialized | ||||
|   *          - ERROR: I2C registers are not de-initialized | ||||
|   */ | ||||
| ErrorStatus LL_I2C_DeInit(I2C_TypeDef *I2Cx) | ||||
| { | ||||
|   ErrorStatus status = SUCCESS; | ||||
|  | ||||
|   /* Check the I2C Instance I2Cx */ | ||||
|   assert_param(IS_I2C_ALL_INSTANCE(I2Cx)); | ||||
|  | ||||
|   if (I2Cx == I2C1) | ||||
|   { | ||||
|     /* Force reset of I2C clock */ | ||||
|     LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_I2C1); | ||||
|  | ||||
|     /* Release reset of I2C clock */ | ||||
|     LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_I2C1); | ||||
|   } | ||||
| #if defined(I2C2) | ||||
|   else if (I2Cx == I2C2) | ||||
|   { | ||||
|     /* Force reset of I2C clock */ | ||||
|     LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_I2C2); | ||||
|  | ||||
|     /* Release reset of I2C clock */ | ||||
|     LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_I2C2); | ||||
|  | ||||
|   } | ||||
| #endif /* I2C2 */ | ||||
| #if defined(I2C3) | ||||
|   else if (I2Cx == I2C3) | ||||
|   { | ||||
|     /* Force reset of I2C clock */ | ||||
|     LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_I2C3); | ||||
|  | ||||
|     /* Release reset of I2C clock */ | ||||
|     LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_I2C3); | ||||
|   } | ||||
| #endif /* I2C3 */ | ||||
|   else | ||||
|   { | ||||
|     status = ERROR; | ||||
|   } | ||||
|  | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Initialize the I2C registers according to the specified parameters in I2C_InitStruct. | ||||
|   * @param  I2Cx I2C Instance. | ||||
|   * @param  I2C_InitStruct pointer to a @ref LL_I2C_InitTypeDef structure. | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: I2C registers are initialized | ||||
|   *          - ERROR: Not applicable | ||||
|   */ | ||||
| ErrorStatus LL_I2C_Init(I2C_TypeDef *I2Cx, LL_I2C_InitTypeDef *I2C_InitStruct) | ||||
| { | ||||
|   /* Check the I2C Instance I2Cx */ | ||||
|   assert_param(IS_I2C_ALL_INSTANCE(I2Cx)); | ||||
|  | ||||
|   /* Check the I2C parameters from I2C_InitStruct */ | ||||
|   assert_param(IS_LL_I2C_PERIPHERAL_MODE(I2C_InitStruct->PeripheralMode)); | ||||
|   assert_param(IS_LL_I2C_ANALOG_FILTER(I2C_InitStruct->AnalogFilter)); | ||||
|   assert_param(IS_LL_I2C_DIGITAL_FILTER(I2C_InitStruct->DigitalFilter)); | ||||
|   assert_param(IS_LL_I2C_OWN_ADDRESS1(I2C_InitStruct->OwnAddress1)); | ||||
|   assert_param(IS_LL_I2C_TYPE_ACKNOWLEDGE(I2C_InitStruct->TypeAcknowledge)); | ||||
|   assert_param(IS_LL_I2C_OWN_ADDRSIZE(I2C_InitStruct->OwnAddrSize)); | ||||
|  | ||||
|   /* Disable the selected I2Cx Peripheral */ | ||||
|   LL_I2C_Disable(I2Cx); | ||||
|  | ||||
|   /*---------------------------- I2Cx CR1 Configuration ------------------------ | ||||
|    * Configure the analog and digital noise filters with parameters : | ||||
|    * - AnalogFilter: I2C_CR1_ANFOFF bit | ||||
|    * - DigitalFilter: I2C_CR1_DNF[3:0] bits | ||||
|    */ | ||||
|   LL_I2C_ConfigFilters(I2Cx, I2C_InitStruct->AnalogFilter, I2C_InitStruct->DigitalFilter); | ||||
|  | ||||
|   /*---------------------------- I2Cx TIMINGR Configuration -------------------- | ||||
|    * Configure the SDA setup, hold time and the SCL high, low period with parameter : | ||||
|    * - Timing: I2C_TIMINGR_PRESC[3:0], I2C_TIMINGR_SCLDEL[3:0], I2C_TIMINGR_SDADEL[3:0], | ||||
|    *           I2C_TIMINGR_SCLH[7:0] and I2C_TIMINGR_SCLL[7:0] bits | ||||
|    */ | ||||
|   LL_I2C_SetTiming(I2Cx, I2C_InitStruct->Timing); | ||||
|  | ||||
|   /* Enable the selected I2Cx Peripheral */ | ||||
|   LL_I2C_Enable(I2Cx); | ||||
|  | ||||
|   /*---------------------------- I2Cx OAR1 Configuration ----------------------- | ||||
|    * Disable, Configure and Enable I2Cx device own address 1 with parameters : | ||||
|    * - OwnAddress1:  I2C_OAR1_OA1[9:0] bits | ||||
|    * - OwnAddrSize:  I2C_OAR1_OA1MODE bit | ||||
|    */ | ||||
|   LL_I2C_DisableOwnAddress1(I2Cx); | ||||
|   LL_I2C_SetOwnAddress1(I2Cx, I2C_InitStruct->OwnAddress1, I2C_InitStruct->OwnAddrSize); | ||||
|  | ||||
|   /* OwnAdress1 == 0 is reserved for General Call address */ | ||||
|   if (I2C_InitStruct->OwnAddress1 != 0U) | ||||
|   { | ||||
|     LL_I2C_EnableOwnAddress1(I2Cx); | ||||
|   } | ||||
|  | ||||
|   /*---------------------------- I2Cx MODE Configuration ----------------------- | ||||
|   * Configure I2Cx peripheral mode with parameter : | ||||
|    * - PeripheralMode: I2C_CR1_SMBDEN and I2C_CR1_SMBHEN bits | ||||
|    */ | ||||
|   LL_I2C_SetMode(I2Cx, I2C_InitStruct->PeripheralMode); | ||||
|  | ||||
|   /*---------------------------- I2Cx CR2 Configuration ------------------------ | ||||
|    * Configure the ACKnowledge or Non ACKnowledge condition | ||||
|    * after the address receive match code or next received byte with parameter : | ||||
|    * - TypeAcknowledge: I2C_CR2_NACK bit | ||||
|    */ | ||||
|   LL_I2C_AcknowledgeNextData(I2Cx, I2C_InitStruct->TypeAcknowledge); | ||||
|  | ||||
|   return SUCCESS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set each @ref LL_I2C_InitTypeDef field to default value. | ||||
|   * @param  I2C_InitStruct Pointer to a @ref LL_I2C_InitTypeDef structure. | ||||
|   * @retval None | ||||
|   */ | ||||
| void LL_I2C_StructInit(LL_I2C_InitTypeDef *I2C_InitStruct) | ||||
| { | ||||
|   /* Set I2C_InitStruct fields to default values */ | ||||
|   I2C_InitStruct->PeripheralMode  = LL_I2C_MODE_I2C; | ||||
|   I2C_InitStruct->Timing          = 0U; | ||||
|   I2C_InitStruct->AnalogFilter    = LL_I2C_ANALOGFILTER_ENABLE; | ||||
|   I2C_InitStruct->DigitalFilter   = 0U; | ||||
|   I2C_InitStruct->OwnAddress1     = 0U; | ||||
|   I2C_InitStruct->TypeAcknowledge = LL_I2C_NACK; | ||||
|   I2C_InitStruct->OwnAddrSize     = LL_I2C_OWNADDRESS1_7BIT; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* I2C1 || I2C2 || I2C3 */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* USE_FULL_LL_DRIVER */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										85
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_pwr.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_pwr.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx_ll_pwr.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   PWR LL module driver. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright(c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| #if defined(USE_FULL_LL_DRIVER) | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32l0xx_ll_pwr.h" | ||||
| #include "stm32l0xx_ll_bus.h" | ||||
|  | ||||
| /** @addtogroup STM32L0xx_LL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #if defined(PWR) | ||||
|  | ||||
| /** @defgroup PWR_LL PWR | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @addtogroup PWR_LL_Exported_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup PWR_LL_EF_Init | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  De-initialize the PWR registers to their default reset values. | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: PWR registers are de-initialized | ||||
|   *          - ERROR: not applicable | ||||
|   */ | ||||
| ErrorStatus LL_PWR_DeInit(void) | ||||
| { | ||||
|   /* Force reset of PWR clock */ | ||||
|   LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_PWR); | ||||
|  | ||||
|   /* Release reset of PWR clock */ | ||||
|   LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_PWR); | ||||
|  | ||||
|   return SUCCESS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| #endif /* defined(PWR) */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* USE_FULL_LL_DRIVER */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										698
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_rcc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										698
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_rcc.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,698 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx_ll_rcc.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   RCC LL module driver. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright(c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| #if defined(USE_FULL_LL_DRIVER) | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32l0xx_ll_rcc.h" | ||||
| #ifdef  USE_FULL_ASSERT | ||||
|   #include "stm32_assert.h" | ||||
| #else | ||||
|   #define assert_param(expr) ((void)0U) | ||||
| #endif /* USE_FULL_ASSERT */ | ||||
| /** @addtogroup STM32L0xx_LL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #if defined(RCC) | ||||
|  | ||||
| /** @defgroup RCC_LL RCC | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
|  | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /** @addtogroup RCC_LL_Private_Macros | ||||
|   * @{ | ||||
|   */ | ||||
| #if defined(RCC_CCIPR_USART1SEL) && defined(RCC_CCIPR_USART2SEL) | ||||
| #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \ | ||||
|                                             || ((__VALUE__) == LL_RCC_USART2_CLKSOURCE)) | ||||
| #elif defined(RCC_CCIPR_USART1SEL) && !defined(RCC_CCIPR_USART2SEL) | ||||
| #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_USART1_CLKSOURCE)) | ||||
| #else | ||||
| #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_USART2_CLKSOURCE)) | ||||
| #endif /* RCC_CCIPR_USART1SEL && RCC_CCIPR_USART2SEL */ | ||||
|  | ||||
| #define IS_LL_RCC_LPUART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPUART1_CLKSOURCE)) | ||||
|  | ||||
| #if defined(RCC_CCIPR_I2C3SEL) | ||||
| #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \ | ||||
|                                             || ((__VALUE__) == LL_RCC_I2C3_CLKSOURCE)) | ||||
| #else | ||||
| #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__)     ((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) | ||||
| #endif /* RCC_CCIPR_I2C3SEL */ | ||||
|  | ||||
| #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__)  ((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE) | ||||
|  | ||||
| #if defined(USB) | ||||
| #define IS_LL_RCC_USB_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_USB_CLKSOURCE)) | ||||
| #endif /* USB */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /** @defgroup RCC_LL_Private_Functions RCC Private functions | ||||
|   * @{ | ||||
|   */ | ||||
| static uint32_t RCC_GetSystemClockFreq(void); | ||||
| static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency); | ||||
| static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency); | ||||
| static uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency); | ||||
| static uint32_t RCC_PLL_GetFreqDomain_SYS(void); | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @addtogroup RCC_LL_Exported_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup RCC_LL_EF_Init | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Reset the RCC clock configuration to the default reset state. | ||||
|   * @note   The default reset state of the clock configuration is given below: | ||||
|   *         - MSI  ON and used as system clock source | ||||
|   *         - HSE, HSI and PLL OFF | ||||
|   *         - AHB, APB1 and APB2 prescaler set to 1. | ||||
|   *         - CSS, MCO OFF | ||||
|   *         - All interrupts disabled | ||||
|   * @note   This function doesn't modify the configuration of the | ||||
|   *         - Peripheral clocks | ||||
|   *         - LSI, LSE and RTC clocks | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: RCC registers are de-initialized | ||||
|   *          - ERROR: not applicable | ||||
|   */ | ||||
| ErrorStatus LL_RCC_DeInit(void) | ||||
| { | ||||
|   __IO uint32_t vl_mask; | ||||
|  | ||||
|   /* Set MSION bit */ | ||||
|   LL_RCC_MSI_Enable(); | ||||
|  | ||||
|   /* Insure MSIRDY bit is set before writing default MSIRANGE value */ | ||||
|   while (LL_RCC_MSI_IsReady() == 0U) | ||||
|   { | ||||
|     __NOP(); | ||||
|   } | ||||
|  | ||||
|   /* Set MSIRANGE default value */ | ||||
|   LL_RCC_MSI_SetRange(LL_RCC_MSIRANGE_5); | ||||
|   /* Set MSITRIM bits to the reset value*/ | ||||
|   LL_RCC_MSI_SetCalibTrimming(0U); | ||||
|  | ||||
|   /* Set HSITRIM bits to the reset value*/ | ||||
|   LL_RCC_HSI_SetCalibTrimming(0x10U); | ||||
|  | ||||
|   /* Reset SW, HPRE, PPRE1, PPRE2, MCOSEL and MCOPRE bits */ | ||||
|   vl_mask = 0xFFFFFFFFU; | ||||
|   CLEAR_BIT(vl_mask, RCC_CFGR_SW | RCC_CFGR_HPRE | RCC_CFGR_PPRE1 | RCC_CFGR_PPRE2 | \ | ||||
|                      RCC_CFGR_MCOSEL | RCC_CFGR_MCOPRE); | ||||
|   LL_RCC_WriteReg(CFGR, vl_mask); | ||||
|  | ||||
|   /* Reset HSI, HSE, PLL */ | ||||
|   vl_mask = LL_RCC_ReadReg(CR); | ||||
| #if defined(RCC_CR_HSIOUTEN) | ||||
|   CLEAR_BIT(vl_mask, RCC_CR_HSION| RCC_CR_HSIKERON| RCC_CR_HSIDIVEN | RCC_CR_HSIOUTEN | \ | ||||
|                      RCC_CR_HSEON | RCC_CR_PLLON); | ||||
| #else | ||||
|   CLEAR_BIT(vl_mask, RCC_CR_HSION| RCC_CR_HSIKERON| RCC_CR_HSIDIVEN | \ | ||||
|                      RCC_CR_HSEON | RCC_CR_PLLON); | ||||
| #endif | ||||
|   LL_RCC_WriteReg(CR, vl_mask); | ||||
|   /* Delay after an RCC peripheral clock */ | ||||
|   vl_mask = LL_RCC_ReadReg(CR); | ||||
|  | ||||
|   /* Reset HSEBYP bit */ | ||||
|   LL_RCC_HSE_DisableBypass(); | ||||
|  | ||||
|   /* Set RCC_CR_RTCPRE to 0b00*/ | ||||
|   CLEAR_BIT(vl_mask, RCC_CR_RTCPRE); | ||||
|   LL_RCC_WriteReg(CR, vl_mask); | ||||
|  | ||||
|   /* Insure PLL is disabled before to reset PLLSRC/PLLMUL/PLLDIV in CFGR register */ | ||||
|   while(LL_RCC_PLL_IsReady() != 0U) {}; | ||||
|  | ||||
|   /* Reset CFGR register */ | ||||
|   LL_RCC_WriteReg(CFGR, 0x00000000U); | ||||
|  | ||||
| #if defined(RCC_HSI48_SUPPORT) | ||||
|  | ||||
|   /* Reset CRRCR register to disable HSI48 */ | ||||
| #if defined(RCC_CRRCR_HSI48DIV6OUTEN) | ||||
|   CLEAR_BIT(RCC->CRRCR, (RCC_CRRCR_HSI48ON | RCC_CRRCR_HSI48DIV6OUTEN)); | ||||
| #else | ||||
|   CLEAR_BIT(RCC->CRRCR, RCC_CRRCR_HSI48ON); | ||||
| #endif | ||||
|  | ||||
| #endif /*RCC_HSI48_SUPPORT*/ | ||||
|  | ||||
|   /* Disable all interrupts */ | ||||
|   LL_RCC_WriteReg(CIER, 0x00000000U); | ||||
|  | ||||
|   /* Disable all interrupt flags */ | ||||
|   LL_RCC_WriteReg(CICR, 0xFFFFFFFFU); | ||||
|  | ||||
|   /* Clear reset flags */ | ||||
|   LL_RCC_ClearResetFlags(); | ||||
|  | ||||
|   return SUCCESS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup RCC_LL_EF_Get_Freq | ||||
|   * @brief  Return the frequencies of different on chip clocks;  System, AHB, APB1 and APB2 buses clocks | ||||
|   *         and different peripheral clocks available on the device. | ||||
|   * @note   If SYSCLK source is MSI, function returns values based on MSI clock(*) | ||||
|   * @note   If SYSCLK source is HSI, function returns values based on HSI_VALUE(**) | ||||
|   * @note   If SYSCLK source is HSE, function returns values based on HSE_VALUE(***) | ||||
|   * @note   If SYSCLK source is PLL, function returns values based on | ||||
|   *         HSI_VALUE(**) or HSE_VALUE(***) multiplied/divided by the PLL factors. | ||||
|   * @note   (*) MSI clock depends on the selected MSI range but the real value | ||||
|   *             may vary depending on the variations in voltage and temperature. | ||||
|   * @note   (**) HSI_VALUE is a defined constant but the real value may vary | ||||
|   *              depending on the variations in voltage and temperature. | ||||
|   * @note   (***) HSE_VALUE is a defined constant, user has to ensure that | ||||
|   *               HSE_VALUE is same as the real frequency of the crystal used. | ||||
|   *               Otherwise, this function may have wrong result. | ||||
|   * @note   The result of this function could be incorrect when using fractional | ||||
|   *         value for HSE crystal. | ||||
|   * @note   This function can be used by the user application to compute the | ||||
|   *         baud-rate for the communication peripherals or configure other parameters. | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Return the frequencies of different on chip clocks;  System, AHB, APB1 and APB2 buses clocks | ||||
|   * @note   Each time SYSCLK, HCLK, PCLK1 and/or PCLK2 clock changes, this function | ||||
|   *         must be called to update structure fields. Otherwise, any | ||||
|   *         configuration based on this function will be incorrect. | ||||
|   * @param  RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies | ||||
|   * @retval None | ||||
|   */ | ||||
| void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks) | ||||
| { | ||||
|   /* Get SYSCLK frequency */ | ||||
|   RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq(); | ||||
|  | ||||
|   /* HCLK clock frequency */ | ||||
|   RCC_Clocks->HCLK_Frequency   = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency); | ||||
|  | ||||
|   /* PCLK1 clock frequency */ | ||||
|   RCC_Clocks->PCLK1_Frequency  = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency); | ||||
|  | ||||
|   /* PCLK2 clock frequency */ | ||||
|   RCC_Clocks->PCLK2_Frequency  = RCC_GetPCLK2ClockFreq(RCC_Clocks->HCLK_Frequency); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return USARTx clock frequency | ||||
|   * @param  USARTxSource This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_RCC_USART1_CLKSOURCE | ||||
|   *         @arg @ref LL_RCC_USART2_CLKSOURCE (*) | ||||
|   * | ||||
|   *         (*) value not defined in all devices. | ||||
|   * @retval USART clock frequency (in Hz) | ||||
|   *         @arg @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready | ||||
|   */ | ||||
| uint32_t LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource) | ||||
| { | ||||
|   uint32_t usart_frequency = LL_RCC_PERIPH_FREQUENCY_NO; | ||||
|  | ||||
|   /* Check parameter */ | ||||
|   assert_param(IS_LL_RCC_USART_CLKSOURCE(USARTxSource)); | ||||
| #if defined(RCC_CCIPR_USART1SEL) | ||||
|   if (USARTxSource == LL_RCC_USART1_CLKSOURCE) | ||||
|   { | ||||
|     /* USART1CLK clock frequency */ | ||||
|     switch (LL_RCC_GetUSARTClockSource(USARTxSource)) | ||||
|     { | ||||
|       case LL_RCC_USART1_CLKSOURCE_SYSCLK: /* USART1 Clock is System Clock */ | ||||
|         usart_frequency = RCC_GetSystemClockFreq(); | ||||
|         break; | ||||
|  | ||||
|       case LL_RCC_USART1_CLKSOURCE_HSI:    /* USART1 Clock is HSI Osc. */ | ||||
|         if (LL_RCC_HSI_IsReady() != 0U) | ||||
|         { | ||||
|           if (LL_RCC_IsActiveFlag_HSIDIV() != 0U) | ||||
|           { | ||||
|             usart_frequency = (HSI_VALUE >> 2U); | ||||
|           } | ||||
|           else | ||||
|           { | ||||
|             usart_frequency = HSI_VALUE; | ||||
|           } | ||||
|         } | ||||
|         break; | ||||
|  | ||||
|       case LL_RCC_USART1_CLKSOURCE_LSE:    /* USART1 Clock is LSE Osc. */ | ||||
|         if (LL_RCC_LSE_IsReady() != 0U) | ||||
|         { | ||||
|           usart_frequency = LSE_VALUE; | ||||
|         } | ||||
|         break; | ||||
|  | ||||
|       case LL_RCC_USART1_CLKSOURCE_PCLK2:  /* USART1 Clock is PCLK2 */ | ||||
|       default: | ||||
|         usart_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
| #endif /* RCC_CCIPR_USART1SEL  */ | ||||
|  | ||||
| #if defined(RCC_CCIPR_USART2SEL) | ||||
|   if (USARTxSource == LL_RCC_USART2_CLKSOURCE) | ||||
|   { | ||||
|     /* USART2CLK clock frequency */ | ||||
|     switch (LL_RCC_GetUSARTClockSource(USARTxSource)) | ||||
|     { | ||||
|       case LL_RCC_USART2_CLKSOURCE_SYSCLK: /* USART2 Clock is System Clock */ | ||||
|         usart_frequency = RCC_GetSystemClockFreq(); | ||||
|         break; | ||||
|  | ||||
|       case LL_RCC_USART2_CLKSOURCE_HSI:    /* USART2 Clock is HSI Osc. */ | ||||
|         if (LL_RCC_HSI_IsReady() != 0U) | ||||
|         { | ||||
|           if (LL_RCC_IsActiveFlag_HSIDIV() != 0U) | ||||
|           { | ||||
|             usart_frequency = (HSI_VALUE >> 2U); | ||||
|           } | ||||
|           else | ||||
|           { | ||||
|             usart_frequency = HSI_VALUE; | ||||
|           } | ||||
|         } | ||||
|         break; | ||||
|  | ||||
|       case LL_RCC_USART2_CLKSOURCE_LSE:    /* USART2 Clock is LSE Osc. */ | ||||
|         if (LL_RCC_LSE_IsReady() != 0U) | ||||
|         { | ||||
|           usart_frequency = LSE_VALUE; | ||||
|         } | ||||
|         break; | ||||
|  | ||||
|       case LL_RCC_USART2_CLKSOURCE_PCLK1:  /* USART2 Clock is PCLK1 */ | ||||
|       default: | ||||
|         usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
| #endif /* RCC_CCIPR_USART2SEL */ | ||||
|  | ||||
|   return usart_frequency; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return I2Cx clock frequency | ||||
|   * @param  I2CxSource This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_RCC_I2C1_CLKSOURCE | ||||
|   *         @arg @ref LL_RCC_I2C3_CLKSOURCE (*) | ||||
|   * | ||||
|   *         (*) value not defined in all devices | ||||
|   * @retval I2C clock frequency (in Hz) | ||||
|   *         @arg @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that HSI oscillator is not ready | ||||
|   */ | ||||
| uint32_t LL_RCC_GetI2CClockFreq(uint32_t I2CxSource) | ||||
| { | ||||
|   uint32_t i2c_frequency = LL_RCC_PERIPH_FREQUENCY_NO; | ||||
|  | ||||
|   /* Check parameter */ | ||||
|   assert_param(IS_LL_RCC_I2C_CLKSOURCE(I2CxSource)); | ||||
|  | ||||
|   /* I2C1 CLK clock frequency */ | ||||
|   if (I2CxSource == LL_RCC_I2C1_CLKSOURCE) | ||||
|   { | ||||
|     switch (LL_RCC_GetI2CClockSource(I2CxSource)) | ||||
|     { | ||||
|       case LL_RCC_I2C1_CLKSOURCE_SYSCLK: /* I2C1 Clock is System Clock */ | ||||
|         i2c_frequency = RCC_GetSystemClockFreq(); | ||||
|         break; | ||||
|  | ||||
|       case LL_RCC_I2C1_CLKSOURCE_HSI:    /* I2C1 Clock is HSI Osc. */ | ||||
|         if (LL_RCC_HSI_IsReady() != 0U) | ||||
|         { | ||||
|           if (LL_RCC_IsActiveFlag_HSIDIV() != 0U) | ||||
|           { | ||||
|             i2c_frequency = (HSI_VALUE >> 2U); | ||||
|           } | ||||
|           else | ||||
|           { | ||||
|             i2c_frequency = HSI_VALUE; | ||||
|           } | ||||
|         } | ||||
|         break; | ||||
|  | ||||
|       case LL_RCC_I2C1_CLKSOURCE_PCLK1:  /* I2C1 Clock is PCLK1 */ | ||||
|       default: | ||||
|         i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
|  | ||||
| #if defined(RCC_CCIPR_I2C3SEL) | ||||
|   /* I2C3 CLK clock frequency */ | ||||
|   if (I2CxSource == LL_RCC_I2C3_CLKSOURCE) | ||||
|   { | ||||
|     switch (LL_RCC_GetI2CClockSource(I2CxSource)) | ||||
|     { | ||||
|       case LL_RCC_I2C3_CLKSOURCE_SYSCLK: /* I2C3 Clock is System Clock */ | ||||
|         i2c_frequency = RCC_GetSystemClockFreq(); | ||||
|         break; | ||||
|  | ||||
|       case LL_RCC_I2C3_CLKSOURCE_HSI:    /* I2C3 Clock is HSI Osc. */ | ||||
|         if (LL_RCC_HSI_IsReady() != 0U) | ||||
|         { | ||||
|           if (LL_RCC_IsActiveFlag_HSIDIV() != 0U) | ||||
|           { | ||||
|             i2c_frequency = (HSI_VALUE >> 2U); | ||||
|           } | ||||
|           else | ||||
|           { | ||||
|             i2c_frequency = HSI_VALUE; | ||||
|           } | ||||
|         } | ||||
|         break; | ||||
|  | ||||
|       case LL_RCC_I2C3_CLKSOURCE_PCLK1:  /* I2C3 Clock is PCLK1 */ | ||||
|       default: | ||||
|         i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
| #endif /*RCC_CCIPR_I2C3SEL*/ | ||||
|  | ||||
|   return i2c_frequency; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return LPUARTx clock frequency | ||||
|   * @param  LPUARTxSource This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_RCC_LPUART1_CLKSOURCE | ||||
|   * @retval LPUART clock frequency (in Hz) | ||||
|   *         @arg @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready | ||||
|   */ | ||||
| uint32_t LL_RCC_GetLPUARTClockFreq(uint32_t LPUARTxSource) | ||||
| { | ||||
|   uint32_t lpuart_frequency = LL_RCC_PERIPH_FREQUENCY_NO; | ||||
|  | ||||
|   /* Check parameter */ | ||||
|   assert_param(IS_LL_RCC_LPUART_CLKSOURCE(LPUARTxSource)); | ||||
|  | ||||
|   /* LPUART1CLK clock frequency */ | ||||
|   switch (LL_RCC_GetLPUARTClockSource(LPUARTxSource)) | ||||
|   { | ||||
|     case LL_RCC_LPUART1_CLKSOURCE_SYSCLK: /* LPUART1 Clock is System Clock */ | ||||
|       lpuart_frequency = RCC_GetSystemClockFreq(); | ||||
|       break; | ||||
|  | ||||
|     case LL_RCC_LPUART1_CLKSOURCE_HSI:    /* LPUART1 Clock is HSI Osc. */ | ||||
|       if (LL_RCC_HSI_IsReady() != 0U) | ||||
|       { | ||||
|         if (LL_RCC_IsActiveFlag_HSIDIV() != 0U) | ||||
|         { | ||||
|           lpuart_frequency = (HSI_VALUE >> 2U); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|           lpuart_frequency = HSI_VALUE; | ||||
|         } | ||||
|       } | ||||
|       break; | ||||
|  | ||||
|     case LL_RCC_LPUART1_CLKSOURCE_LSE:    /* LPUART1 Clock is LSE Osc. */ | ||||
|       if (LL_RCC_LSE_IsReady() != 0U) | ||||
|       { | ||||
|         lpuart_frequency = LSE_VALUE; | ||||
|       } | ||||
|       break; | ||||
|  | ||||
|     case LL_RCC_LPUART1_CLKSOURCE_PCLK1:  /* LPUART1 Clock is PCLK1 */ | ||||
|     default: | ||||
|       lpuart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); | ||||
|       break; | ||||
|   } | ||||
|  | ||||
|   return lpuart_frequency; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return LPTIMx clock frequency | ||||
|   * @param  LPTIMxSource This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_RCC_LPTIM1_CLKSOURCE | ||||
|   * @retval LPTIM clock frequency (in Hz) | ||||
|   *         @arg @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready | ||||
|   */ | ||||
| uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource) | ||||
| { | ||||
|   uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO; | ||||
|  | ||||
|   /* Check parameter */ | ||||
|   assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource)); | ||||
|  | ||||
|   if (LPTIMxSource == LL_RCC_LPTIM1_CLKSOURCE) | ||||
|   { | ||||
|     /* LPTIM1CLK clock frequency */ | ||||
|     switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource)) | ||||
|     { | ||||
|       case LL_RCC_LPTIM1_CLKSOURCE_LSI:    /* LPTIM1 Clock is LSI Osc. */ | ||||
|         if (LL_RCC_LSI_IsReady() != 0U) | ||||
|         { | ||||
|           lptim_frequency = LSI_VALUE; | ||||
|         } | ||||
|         break; | ||||
|  | ||||
|       case LL_RCC_LPTIM1_CLKSOURCE_HSI:    /* LPTIM1 Clock is HSI Osc. */ | ||||
|         if (LL_RCC_HSI_IsReady() != 0U) | ||||
|         { | ||||
|           if (LL_RCC_IsActiveFlag_HSIDIV() != 0U) | ||||
|           { | ||||
|             lptim_frequency = (HSI_VALUE >> 2U); | ||||
|           } | ||||
|           else | ||||
|           { | ||||
|             lptim_frequency = HSI_VALUE; | ||||
|           } | ||||
|         } | ||||
|         break; | ||||
|  | ||||
|       case LL_RCC_LPTIM1_CLKSOURCE_LSE:    /* LPTIM1 Clock is LSE Osc. */ | ||||
|         if (LL_RCC_LSE_IsReady() != 0U) | ||||
|         { | ||||
|           lptim_frequency = LSE_VALUE; | ||||
|         } | ||||
|         break; | ||||
|  | ||||
|       case LL_RCC_LPTIM1_CLKSOURCE_PCLK1:  /* LPTIM1 Clock is PCLK1 */ | ||||
|       default: | ||||
|         lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return lptim_frequency; | ||||
| } | ||||
|  | ||||
| #if defined(USB) | ||||
| /** | ||||
|   * @brief  Return USBx clock frequency | ||||
|   * @param  USBxSource This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_RCC_USB_CLKSOURCE | ||||
|   * @retval USB clock frequency (in Hz) | ||||
|   *         @arg @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI48) or PLL is not ready | ||||
|   *         @arg @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected | ||||
|   */ | ||||
| uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource) | ||||
| { | ||||
|   uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO; | ||||
|  | ||||
|   /* Check parameter */ | ||||
|   assert_param(IS_LL_RCC_USB_CLKSOURCE(USBxSource)); | ||||
|  | ||||
|   /* USBCLK clock frequency */ | ||||
|   switch (LL_RCC_GetUSBClockSource(USBxSource)) | ||||
|   { | ||||
|     case LL_RCC_USB_CLKSOURCE_PLL:        /* PLL clock used as USB clock source */ | ||||
|       if (LL_RCC_PLL_IsReady() != 0U) | ||||
|       { | ||||
|         usb_frequency = RCC_PLL_GetFreqDomain_SYS(); | ||||
|       } | ||||
|       break; | ||||
|  | ||||
|     case LL_RCC_USB_CLKSOURCE_HSI48:      /* HSI48 clock used as USB clock source */ | ||||
|     default: | ||||
|       if (LL_RCC_HSI48_IsReady() != 0U) | ||||
|       { | ||||
|         usb_frequency = HSI48_VALUE; | ||||
|       } | ||||
|       break; | ||||
|   } | ||||
|  | ||||
|   return usb_frequency; | ||||
| } | ||||
| #endif /* USB */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup RCC_LL_Private_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Return SYSTEM clock frequency | ||||
|   * @retval SYSTEM clock frequency (in Hz) | ||||
|   */ | ||||
| static uint32_t RCC_GetSystemClockFreq(void) | ||||
| { | ||||
|   uint32_t frequency; | ||||
|  | ||||
|   /* Get SYSCLK source -------------------------------------------------------*/ | ||||
|   switch (LL_RCC_GetSysClkSource()) | ||||
|   { | ||||
|     case LL_RCC_SYS_CLKSOURCE_STATUS_MSI:  /* MSI used as system clock source */ | ||||
|       frequency = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_GetRange()); | ||||
|       break; | ||||
|  | ||||
|     case LL_RCC_SYS_CLKSOURCE_STATUS_HSI:  /* HSI used as system clock source */ | ||||
|       if (LL_RCC_IsActiveFlag_HSIDIV() != 0U) | ||||
|       { | ||||
|         frequency = (HSI_VALUE >> 2U); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         frequency = HSI_VALUE; | ||||
|       } | ||||
|       break; | ||||
|  | ||||
|     case LL_RCC_SYS_CLKSOURCE_STATUS_HSE:  /* HSE used as system clock source */ | ||||
|       frequency = HSE_VALUE; | ||||
|       break; | ||||
|  | ||||
|     case LL_RCC_SYS_CLKSOURCE_STATUS_PLL:  /* PLL used as system clock  source */ | ||||
|       frequency = RCC_PLL_GetFreqDomain_SYS(); | ||||
|       break; | ||||
|  | ||||
|     default: | ||||
|       frequency = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_GetRange()); | ||||
|       break; | ||||
|   } | ||||
|  | ||||
|   return frequency; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return HCLK clock frequency | ||||
|   * @param  SYSCLK_Frequency SYSCLK clock frequency | ||||
|   * @retval HCLK clock frequency (in Hz) | ||||
|   */ | ||||
| static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency) | ||||
| { | ||||
|   /* HCLK clock frequency */ | ||||
|   return __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler()); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return PCLK1 clock frequency | ||||
|   * @param  HCLK_Frequency HCLK clock frequency | ||||
|   * @retval PCLK1 clock frequency (in Hz) | ||||
|   */ | ||||
| static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency) | ||||
| { | ||||
|   /* PCLK1 clock frequency */ | ||||
|   return __LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler()); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return PCLK2 clock frequency | ||||
|   * @param  HCLK_Frequency HCLK clock frequency | ||||
|   * @retval PCLK2 clock frequency (in Hz) | ||||
|   */ | ||||
| static uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency) | ||||
| { | ||||
|   /* PCLK2 clock frequency */ | ||||
|   return __LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler()); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Return PLL clock frequency used for system domain | ||||
|   * @retval PLL clock frequency (in Hz) | ||||
|   */ | ||||
| static uint32_t RCC_PLL_GetFreqDomain_SYS(void) | ||||
| { | ||||
|   uint32_t pllinputfreq, pllsource; | ||||
|  | ||||
|   /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL divider) * PLL Multiplicator */ | ||||
|  | ||||
|   /* Get PLL source */ | ||||
|   pllsource = LL_RCC_PLL_GetMainSource(); | ||||
|  | ||||
|   switch (pllsource) | ||||
|   { | ||||
|     case LL_RCC_PLLSOURCE_HSI:       /* HSI used as PLL clock source */ | ||||
|       if (LL_RCC_IsActiveFlag_HSIDIV() != 0U) | ||||
|       { | ||||
|         pllinputfreq = (HSI_VALUE >> 2U); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         pllinputfreq = HSI_VALUE; | ||||
|       } | ||||
|       break; | ||||
|  | ||||
|     default:       /* HSE used as PLL clock source */ | ||||
|       pllinputfreq = HSE_VALUE; | ||||
|       break; | ||||
|   } | ||||
|   return __LL_RCC_CALC_PLLCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetMultiplicator(), LL_RCC_PLL_GetDivider()); | ||||
| } | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* defined(RCC) */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* USE_FULL_LL_DRIVER */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										854
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_tim.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										854
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_tim.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,854 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx_ll_tim.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   TIM LL module driver. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| #if defined(USE_FULL_LL_DRIVER) | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32l0xx_ll_tim.h" | ||||
| #include "stm32l0xx_ll_bus.h" | ||||
|  | ||||
| #ifdef  USE_FULL_ASSERT | ||||
| #include "stm32_assert.h" | ||||
| #else | ||||
| #define assert_param(expr) ((void)0U) | ||||
| #endif /* USE_FULL_ASSERT */ | ||||
|  | ||||
| /** @addtogroup STM32L0xx_LL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #if defined (TIM2) || defined (TIM3) || defined (TIM21) || defined (TIM22) || defined (TIM6) || defined (TIM7) | ||||
|  | ||||
| /** @addtogroup TIM_LL | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /** @addtogroup TIM_LL_Private_Macros | ||||
|   * @{ | ||||
|   */ | ||||
| #define IS_LL_TIM_COUNTERMODE(__VALUE__) (((__VALUE__) == LL_TIM_COUNTERMODE_UP) \ | ||||
|                                           || ((__VALUE__) == LL_TIM_COUNTERMODE_DOWN) \ | ||||
|                                           || ((__VALUE__) == LL_TIM_COUNTERMODE_CENTER_UP) \ | ||||
|                                           || ((__VALUE__) == LL_TIM_COUNTERMODE_CENTER_DOWN) \ | ||||
|                                           || ((__VALUE__) == LL_TIM_COUNTERMODE_CENTER_UP_DOWN)) | ||||
|  | ||||
| #define IS_LL_TIM_CLOCKDIVISION(__VALUE__) (((__VALUE__) == LL_TIM_CLOCKDIVISION_DIV1) \ | ||||
|                                             || ((__VALUE__) == LL_TIM_CLOCKDIVISION_DIV2) \ | ||||
|                                             || ((__VALUE__) == LL_TIM_CLOCKDIVISION_DIV4)) | ||||
|  | ||||
| #define IS_LL_TIM_OCMODE(__VALUE__) (((__VALUE__) == LL_TIM_OCMODE_FROZEN) \ | ||||
|                                      || ((__VALUE__) == LL_TIM_OCMODE_ACTIVE) \ | ||||
|                                      || ((__VALUE__) == LL_TIM_OCMODE_INACTIVE) \ | ||||
|                                      || ((__VALUE__) == LL_TIM_OCMODE_TOGGLE) \ | ||||
|                                      || ((__VALUE__) == LL_TIM_OCMODE_FORCED_INACTIVE) \ | ||||
|                                      || ((__VALUE__) == LL_TIM_OCMODE_FORCED_ACTIVE) \ | ||||
|                                      || ((__VALUE__) == LL_TIM_OCMODE_PWM1) \ | ||||
|                                      || ((__VALUE__) == LL_TIM_OCMODE_PWM2)) | ||||
|  | ||||
| #define IS_LL_TIM_OCSTATE(__VALUE__) (((__VALUE__) == LL_TIM_OCSTATE_DISABLE) \ | ||||
|                                       || ((__VALUE__) == LL_TIM_OCSTATE_ENABLE)) | ||||
|  | ||||
| #define IS_LL_TIM_OCPOLARITY(__VALUE__) (((__VALUE__) == LL_TIM_OCPOLARITY_HIGH) \ | ||||
|                                          || ((__VALUE__) == LL_TIM_OCPOLARITY_LOW)) | ||||
|  | ||||
| #define IS_LL_TIM_ACTIVEINPUT(__VALUE__) (((__VALUE__) == LL_TIM_ACTIVEINPUT_DIRECTTI) \ | ||||
|                                           || ((__VALUE__) == LL_TIM_ACTIVEINPUT_INDIRECTTI) \ | ||||
|                                           || ((__VALUE__) == LL_TIM_ACTIVEINPUT_TRC)) | ||||
|  | ||||
| #define IS_LL_TIM_ICPSC(__VALUE__) (((__VALUE__) == LL_TIM_ICPSC_DIV1) \ | ||||
|                                     || ((__VALUE__) == LL_TIM_ICPSC_DIV2) \ | ||||
|                                     || ((__VALUE__) == LL_TIM_ICPSC_DIV4) \ | ||||
|                                     || ((__VALUE__) == LL_TIM_ICPSC_DIV8)) | ||||
|  | ||||
| #define IS_LL_TIM_IC_FILTER(__VALUE__) (((__VALUE__) == LL_TIM_IC_FILTER_FDIV1) \ | ||||
|                                         || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV1_N2) \ | ||||
|                                         || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV1_N4) \ | ||||
|                                         || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV1_N8) \ | ||||
|                                         || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV2_N6) \ | ||||
|                                         || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV2_N8) \ | ||||
|                                         || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV4_N6) \ | ||||
|                                         || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV4_N8) \ | ||||
|                                         || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV8_N6) \ | ||||
|                                         || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV8_N8) \ | ||||
|                                         || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV16_N5) \ | ||||
|                                         || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV16_N6) \ | ||||
|                                         || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV16_N8) \ | ||||
|                                         || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV32_N5) \ | ||||
|                                         || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV32_N6) \ | ||||
|                                         || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV32_N8)) | ||||
|  | ||||
| #define IS_LL_TIM_IC_POLARITY(__VALUE__) (((__VALUE__) == LL_TIM_IC_POLARITY_RISING) \ | ||||
|                                           || ((__VALUE__) == LL_TIM_IC_POLARITY_FALLING) \ | ||||
|                                           || ((__VALUE__) == LL_TIM_IC_POLARITY_BOTHEDGE)) | ||||
|  | ||||
| #define IS_LL_TIM_ENCODERMODE(__VALUE__) (((__VALUE__) == LL_TIM_ENCODERMODE_X2_TI1) \ | ||||
|                                           || ((__VALUE__) == LL_TIM_ENCODERMODE_X2_TI2) \ | ||||
|                                           || ((__VALUE__) == LL_TIM_ENCODERMODE_X4_TI12)) | ||||
|  | ||||
| #define IS_LL_TIM_IC_POLARITY_ENCODER(__VALUE__) (((__VALUE__) == LL_TIM_IC_POLARITY_RISING) \ | ||||
|                                                   || ((__VALUE__) == LL_TIM_IC_POLARITY_FALLING)) | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
|  | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /** @defgroup TIM_LL_Private_Functions TIM Private Functions | ||||
|   * @{ | ||||
|   */ | ||||
| static ErrorStatus OC1Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct); | ||||
| static ErrorStatus OC2Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct); | ||||
| static ErrorStatus OC3Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct); | ||||
| static ErrorStatus OC4Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct); | ||||
| static ErrorStatus IC1Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); | ||||
| static ErrorStatus IC2Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); | ||||
| static ErrorStatus IC3Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); | ||||
| static ErrorStatus IC4Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @addtogroup TIM_LL_Exported_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup TIM_LL_EF_Init | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Set TIMx registers to their reset values. | ||||
|   * @param  TIMx Timer instance | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: TIMx registers are de-initialized | ||||
|   *          - ERROR: invalid TIMx instance | ||||
|   */ | ||||
| ErrorStatus LL_TIM_DeInit(TIM_TypeDef *TIMx) | ||||
| { | ||||
|   ErrorStatus result = SUCCESS; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_TIM_INSTANCE(TIMx)); | ||||
|  | ||||
|   if (TIMx == TIM2) | ||||
|   { | ||||
|     LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM2); | ||||
|     LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM2); | ||||
|   } | ||||
| #if defined(TIM3) | ||||
|   else if (TIMx == TIM3) | ||||
|   { | ||||
|     LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM3); | ||||
|     LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM3); | ||||
|   } | ||||
| #endif /* TIM3 */ | ||||
| #if defined(TIM6) | ||||
|   else if (TIMx == TIM6) | ||||
|   { | ||||
|     LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM6); | ||||
|     LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM6); | ||||
|   } | ||||
| #endif /* TIM6 */ | ||||
| #if defined(TIM7) | ||||
|   else if (TIMx == TIM7) | ||||
|   { | ||||
|     LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM7); | ||||
|     LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM7); | ||||
|   } | ||||
| #endif /* TIM7 */ | ||||
|   else if (TIMx == TIM21) | ||||
|   { | ||||
|     LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_TIM21); | ||||
|     LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_TIM21); | ||||
|   } | ||||
| #if defined(TIM22) | ||||
|   else if (TIMx == TIM22) | ||||
|   { | ||||
|     LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_TIM22); | ||||
|     LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_TIM22); | ||||
|   } | ||||
| #endif /* TIM22 */ | ||||
|   else | ||||
|   { | ||||
|     result = ERROR; | ||||
|   } | ||||
|  | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set the fields of the time base unit configuration data structure | ||||
|   *         to their default values. | ||||
|   * @param  TIM_InitStruct pointer to a @ref LL_TIM_InitTypeDef structure (time base unit configuration data structure) | ||||
|   * @retval None | ||||
|   */ | ||||
| void LL_TIM_StructInit(LL_TIM_InitTypeDef *TIM_InitStruct) | ||||
| { | ||||
|   /* Set the default configuration */ | ||||
|   TIM_InitStruct->Prescaler         = (uint16_t)0x0000; | ||||
|   TIM_InitStruct->CounterMode       = LL_TIM_COUNTERMODE_UP; | ||||
|   TIM_InitStruct->Autoreload        = 0xFFFFFFFFU; | ||||
|   TIM_InitStruct->ClockDivision     = LL_TIM_CLOCKDIVISION_DIV1; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure the TIMx time base unit. | ||||
|   * @param  TIMx Timer Instance | ||||
|   * @param  TIM_InitStruct pointer to a @ref LL_TIM_InitTypeDef structure | ||||
|   *         (TIMx time base unit configuration data structure) | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: TIMx registers are de-initialized | ||||
|   *          - ERROR: not applicable | ||||
|   */ | ||||
| ErrorStatus LL_TIM_Init(TIM_TypeDef *TIMx, LL_TIM_InitTypeDef *TIM_InitStruct) | ||||
| { | ||||
|   uint32_t tmpcr1; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_TIM_INSTANCE(TIMx)); | ||||
|   assert_param(IS_LL_TIM_COUNTERMODE(TIM_InitStruct->CounterMode)); | ||||
|   assert_param(IS_LL_TIM_CLOCKDIVISION(TIM_InitStruct->ClockDivision)); | ||||
|  | ||||
|   tmpcr1 = LL_TIM_ReadReg(TIMx, CR1); | ||||
|  | ||||
|   if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx)) | ||||
|   { | ||||
|     /* Select the Counter Mode */ | ||||
|     MODIFY_REG(tmpcr1, (TIM_CR1_DIR | TIM_CR1_CMS), TIM_InitStruct->CounterMode); | ||||
|   } | ||||
|  | ||||
|   if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx)) | ||||
|   { | ||||
|     /* Set the clock division */ | ||||
|     MODIFY_REG(tmpcr1, TIM_CR1_CKD, TIM_InitStruct->ClockDivision); | ||||
|   } | ||||
|  | ||||
|   /* Write to TIMx CR1 */ | ||||
|   LL_TIM_WriteReg(TIMx, CR1, tmpcr1); | ||||
|  | ||||
|   /* Set the Autoreload value */ | ||||
|   LL_TIM_SetAutoReload(TIMx, TIM_InitStruct->Autoreload); | ||||
|  | ||||
|   /* Set the Prescaler value */ | ||||
|   LL_TIM_SetPrescaler(TIMx, TIM_InitStruct->Prescaler); | ||||
|   /* Generate an update event to reload the Prescaler | ||||
|      and the repetition counter value (if applicable) immediately */ | ||||
|   LL_TIM_GenerateEvent_UPDATE(TIMx); | ||||
|  | ||||
|   return SUCCESS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set the fields of the TIMx output channel configuration data | ||||
|   *         structure to their default values. | ||||
|   * @param  TIM_OC_InitStruct pointer to a @ref LL_TIM_OC_InitTypeDef structure | ||||
|   *         (the output channel configuration data structure) | ||||
|   * @retval None | ||||
|   */ | ||||
| void LL_TIM_OC_StructInit(LL_TIM_OC_InitTypeDef *TIM_OC_InitStruct) | ||||
| { | ||||
|   /* Set the default configuration */ | ||||
|   TIM_OC_InitStruct->OCMode       = LL_TIM_OCMODE_FROZEN; | ||||
|   TIM_OC_InitStruct->OCState      = LL_TIM_OCSTATE_DISABLE; | ||||
|   TIM_OC_InitStruct->CompareValue = 0x00000000U; | ||||
|   TIM_OC_InitStruct->OCPolarity   = LL_TIM_OCPOLARITY_HIGH; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure the TIMx output channel. | ||||
|   * @param  TIMx Timer Instance | ||||
|   * @param  Channel This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_TIM_CHANNEL_CH1 | ||||
|   *         @arg @ref LL_TIM_CHANNEL_CH2 | ||||
|   *         @arg @ref LL_TIM_CHANNEL_CH3 | ||||
|   *         @arg @ref LL_TIM_CHANNEL_CH4 | ||||
|   * @param  TIM_OC_InitStruct pointer to a @ref LL_TIM_OC_InitTypeDef structure (TIMx output channel configuration | ||||
|   *         data structure) | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: TIMx output channel is initialized | ||||
|   *          - ERROR: TIMx output channel is not initialized | ||||
|   */ | ||||
| ErrorStatus LL_TIM_OC_Init(TIM_TypeDef *TIMx, uint32_t Channel, LL_TIM_OC_InitTypeDef *TIM_OC_InitStruct) | ||||
| { | ||||
|   ErrorStatus result = ERROR; | ||||
|  | ||||
|   switch (Channel) | ||||
|   { | ||||
|     case LL_TIM_CHANNEL_CH1: | ||||
|       result = OC1Config(TIMx, TIM_OC_InitStruct); | ||||
|       break; | ||||
|     case LL_TIM_CHANNEL_CH2: | ||||
|       result = OC2Config(TIMx, TIM_OC_InitStruct); | ||||
|       break; | ||||
|     case LL_TIM_CHANNEL_CH3: | ||||
|       result = OC3Config(TIMx, TIM_OC_InitStruct); | ||||
|       break; | ||||
|     case LL_TIM_CHANNEL_CH4: | ||||
|       result = OC4Config(TIMx, TIM_OC_InitStruct); | ||||
|       break; | ||||
|     default: | ||||
|       break; | ||||
|   } | ||||
|  | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set the fields of the TIMx input channel configuration data | ||||
|   *         structure to their default values. | ||||
|   * @param  TIM_ICInitStruct pointer to a @ref LL_TIM_IC_InitTypeDef structure (the input channel configuration | ||||
|   *         data structure) | ||||
|   * @retval None | ||||
|   */ | ||||
| void LL_TIM_IC_StructInit(LL_TIM_IC_InitTypeDef *TIM_ICInitStruct) | ||||
| { | ||||
|   /* Set the default configuration */ | ||||
|   TIM_ICInitStruct->ICPolarity    = LL_TIM_IC_POLARITY_RISING; | ||||
|   TIM_ICInitStruct->ICActiveInput = LL_TIM_ACTIVEINPUT_DIRECTTI; | ||||
|   TIM_ICInitStruct->ICPrescaler   = LL_TIM_ICPSC_DIV1; | ||||
|   TIM_ICInitStruct->ICFilter      = LL_TIM_IC_FILTER_FDIV1; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure the TIMx input channel. | ||||
|   * @param  TIMx Timer Instance | ||||
|   * @param  Channel This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_TIM_CHANNEL_CH1 | ||||
|   *         @arg @ref LL_TIM_CHANNEL_CH2 | ||||
|   *         @arg @ref LL_TIM_CHANNEL_CH3 | ||||
|   *         @arg @ref LL_TIM_CHANNEL_CH4 | ||||
|   * @param  TIM_IC_InitStruct pointer to a @ref LL_TIM_IC_InitTypeDef structure (TIMx input channel configuration data | ||||
|   *         structure) | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: TIMx output channel is initialized | ||||
|   *          - ERROR: TIMx output channel is not initialized | ||||
|   */ | ||||
| ErrorStatus LL_TIM_IC_Init(TIM_TypeDef *TIMx, uint32_t Channel, LL_TIM_IC_InitTypeDef *TIM_IC_InitStruct) | ||||
| { | ||||
|   ErrorStatus result = ERROR; | ||||
|  | ||||
|   switch (Channel) | ||||
|   { | ||||
|     case LL_TIM_CHANNEL_CH1: | ||||
|       result = IC1Config(TIMx, TIM_IC_InitStruct); | ||||
|       break; | ||||
|     case LL_TIM_CHANNEL_CH2: | ||||
|       result = IC2Config(TIMx, TIM_IC_InitStruct); | ||||
|       break; | ||||
|     case LL_TIM_CHANNEL_CH3: | ||||
|       result = IC3Config(TIMx, TIM_IC_InitStruct); | ||||
|       break; | ||||
|     case LL_TIM_CHANNEL_CH4: | ||||
|       result = IC4Config(TIMx, TIM_IC_InitStruct); | ||||
|       break; | ||||
|     default: | ||||
|       break; | ||||
|   } | ||||
|  | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Fills each TIM_EncoderInitStruct field with its default value | ||||
|   * @param  TIM_EncoderInitStruct pointer to a @ref LL_TIM_ENCODER_InitTypeDef structure (encoder interface | ||||
|   *         configuration data structure) | ||||
|   * @retval None | ||||
|   */ | ||||
| void LL_TIM_ENCODER_StructInit(LL_TIM_ENCODER_InitTypeDef *TIM_EncoderInitStruct) | ||||
| { | ||||
|   /* Set the default configuration */ | ||||
|   TIM_EncoderInitStruct->EncoderMode    = LL_TIM_ENCODERMODE_X2_TI1; | ||||
|   TIM_EncoderInitStruct->IC1Polarity    = LL_TIM_IC_POLARITY_RISING; | ||||
|   TIM_EncoderInitStruct->IC1ActiveInput = LL_TIM_ACTIVEINPUT_DIRECTTI; | ||||
|   TIM_EncoderInitStruct->IC1Prescaler   = LL_TIM_ICPSC_DIV1; | ||||
|   TIM_EncoderInitStruct->IC1Filter      = LL_TIM_IC_FILTER_FDIV1; | ||||
|   TIM_EncoderInitStruct->IC2Polarity    = LL_TIM_IC_POLARITY_RISING; | ||||
|   TIM_EncoderInitStruct->IC2ActiveInput = LL_TIM_ACTIVEINPUT_DIRECTTI; | ||||
|   TIM_EncoderInitStruct->IC2Prescaler   = LL_TIM_ICPSC_DIV1; | ||||
|   TIM_EncoderInitStruct->IC2Filter      = LL_TIM_IC_FILTER_FDIV1; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure the encoder interface of the timer instance. | ||||
|   * @param  TIMx Timer Instance | ||||
|   * @param  TIM_EncoderInitStruct pointer to a @ref LL_TIM_ENCODER_InitTypeDef structure (TIMx encoder interface | ||||
|   *         configuration data structure) | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: TIMx registers are de-initialized | ||||
|   *          - ERROR: not applicable | ||||
|   */ | ||||
| ErrorStatus LL_TIM_ENCODER_Init(TIM_TypeDef *TIMx, LL_TIM_ENCODER_InitTypeDef *TIM_EncoderInitStruct) | ||||
| { | ||||
|   uint32_t tmpccmr1; | ||||
|   uint32_t tmpccer; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(TIMx)); | ||||
|   assert_param(IS_LL_TIM_ENCODERMODE(TIM_EncoderInitStruct->EncoderMode)); | ||||
|   assert_param(IS_LL_TIM_IC_POLARITY_ENCODER(TIM_EncoderInitStruct->IC1Polarity)); | ||||
|   assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_EncoderInitStruct->IC1ActiveInput)); | ||||
|   assert_param(IS_LL_TIM_ICPSC(TIM_EncoderInitStruct->IC1Prescaler)); | ||||
|   assert_param(IS_LL_TIM_IC_FILTER(TIM_EncoderInitStruct->IC1Filter)); | ||||
|   assert_param(IS_LL_TIM_IC_POLARITY_ENCODER(TIM_EncoderInitStruct->IC2Polarity)); | ||||
|   assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_EncoderInitStruct->IC2ActiveInput)); | ||||
|   assert_param(IS_LL_TIM_ICPSC(TIM_EncoderInitStruct->IC2Prescaler)); | ||||
|   assert_param(IS_LL_TIM_IC_FILTER(TIM_EncoderInitStruct->IC2Filter)); | ||||
|  | ||||
|   /* Disable the CC1 and CC2: Reset the CC1E and CC2E Bits */ | ||||
|   TIMx->CCER &= (uint32_t)~(TIM_CCER_CC1E | TIM_CCER_CC2E); | ||||
|  | ||||
|   /* Get the TIMx CCMR1 register value */ | ||||
|   tmpccmr1 = LL_TIM_ReadReg(TIMx, CCMR1); | ||||
|  | ||||
|   /* Get the TIMx CCER register value */ | ||||
|   tmpccer = LL_TIM_ReadReg(TIMx, CCER); | ||||
|  | ||||
|   /* Configure TI1 */ | ||||
|   tmpccmr1 &= (uint32_t)~(TIM_CCMR1_CC1S | TIM_CCMR1_IC1F  | TIM_CCMR1_IC1PSC); | ||||
|   tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC1ActiveInput >> 16U); | ||||
|   tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC1Filter >> 16U); | ||||
|   tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC1Prescaler >> 16U); | ||||
|  | ||||
|   /* Configure TI2 */ | ||||
|   tmpccmr1 &= (uint32_t)~(TIM_CCMR1_CC2S | TIM_CCMR1_IC2F  | TIM_CCMR1_IC2PSC); | ||||
|   tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC2ActiveInput >> 8U); | ||||
|   tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC2Filter >> 8U); | ||||
|   tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC2Prescaler >> 8U); | ||||
|  | ||||
|   /* Set TI1 and TI2 polarity and enable TI1 and TI2 */ | ||||
|   tmpccer &= (uint32_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP | TIM_CCER_CC2P | TIM_CCER_CC2NP); | ||||
|   tmpccer |= (uint32_t)(TIM_EncoderInitStruct->IC1Polarity); | ||||
|   tmpccer |= (uint32_t)(TIM_EncoderInitStruct->IC2Polarity << 4U); | ||||
|   tmpccer |= (uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E); | ||||
|  | ||||
|   /* Set encoder mode */ | ||||
|   LL_TIM_SetEncoderMode(TIMx, TIM_EncoderInitStruct->EncoderMode); | ||||
|  | ||||
|   /* Write to TIMx CCMR1 */ | ||||
|   LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); | ||||
|  | ||||
|   /* Write to TIMx CCER */ | ||||
|   LL_TIM_WriteReg(TIMx, CCER, tmpccer); | ||||
|  | ||||
|   return SUCCESS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup TIM_LL_Private_Functions TIM Private Functions | ||||
|   *  @brief   Private functions | ||||
|   * @{ | ||||
|   */ | ||||
| /** | ||||
|   * @brief  Configure the TIMx output channel 1. | ||||
|   * @param  TIMx Timer Instance | ||||
|   * @param  TIM_OCInitStruct pointer to the the TIMx output channel 1 configuration data structure | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: TIMx registers are de-initialized | ||||
|   *          - ERROR: not applicable | ||||
|   */ | ||||
| static ErrorStatus OC1Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct) | ||||
| { | ||||
|   uint32_t tmpccmr1; | ||||
|   uint32_t tmpccer; | ||||
|   uint32_t tmpcr2; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_TIM_CC1_INSTANCE(TIMx)); | ||||
|   assert_param(IS_LL_TIM_OCMODE(TIM_OCInitStruct->OCMode)); | ||||
|   assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCState)); | ||||
|   assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCPolarity)); | ||||
|  | ||||
|   /* Disable the Channel 1: Reset the CC1E Bit */ | ||||
|   CLEAR_BIT(TIMx->CCER, TIM_CCER_CC1E); | ||||
|  | ||||
|   /* Get the TIMx CCER register value */ | ||||
|   tmpccer = LL_TIM_ReadReg(TIMx, CCER); | ||||
|  | ||||
|   /* Get the TIMx CR2 register value */ | ||||
|   tmpcr2 = LL_TIM_ReadReg(TIMx, CR2); | ||||
|  | ||||
|   /* Get the TIMx CCMR1 register value */ | ||||
|   tmpccmr1 = LL_TIM_ReadReg(TIMx, CCMR1); | ||||
|  | ||||
|   /* Reset Capture/Compare selection Bits */ | ||||
|   CLEAR_BIT(tmpccmr1, TIM_CCMR1_CC1S); | ||||
|  | ||||
|   /* Set the Output Compare Mode */ | ||||
|   MODIFY_REG(tmpccmr1, TIM_CCMR1_OC1M, TIM_OCInitStruct->OCMode); | ||||
|  | ||||
|   /* Set the Output Compare Polarity */ | ||||
|   MODIFY_REG(tmpccer, TIM_CCER_CC1P, TIM_OCInitStruct->OCPolarity); | ||||
|  | ||||
|   /* Set the Output State */ | ||||
|   MODIFY_REG(tmpccer, TIM_CCER_CC1E, TIM_OCInitStruct->OCState); | ||||
|  | ||||
|   /* Write to TIMx CR2 */ | ||||
|   LL_TIM_WriteReg(TIMx, CR2, tmpcr2); | ||||
|  | ||||
|   /* Write to TIMx CCMR1 */ | ||||
|   LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); | ||||
|  | ||||
|   /* Set the Capture Compare Register value */ | ||||
|   LL_TIM_OC_SetCompareCH1(TIMx, TIM_OCInitStruct->CompareValue); | ||||
|  | ||||
|   /* Write to TIMx CCER */ | ||||
|   LL_TIM_WriteReg(TIMx, CCER, tmpccer); | ||||
|  | ||||
|   return SUCCESS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure the TIMx output channel 2. | ||||
|   * @param  TIMx Timer Instance | ||||
|   * @param  TIM_OCInitStruct pointer to the the TIMx output channel 2 configuration data structure | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: TIMx registers are de-initialized | ||||
|   *          - ERROR: not applicable | ||||
|   */ | ||||
| static ErrorStatus OC2Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct) | ||||
| { | ||||
|   uint32_t tmpccmr1; | ||||
|   uint32_t tmpccer; | ||||
|   uint32_t tmpcr2; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_TIM_CC2_INSTANCE(TIMx)); | ||||
|   assert_param(IS_LL_TIM_OCMODE(TIM_OCInitStruct->OCMode)); | ||||
|   assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCState)); | ||||
|   assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCPolarity)); | ||||
|  | ||||
|   /* Disable the Channel 2: Reset the CC2E Bit */ | ||||
|   CLEAR_BIT(TIMx->CCER, TIM_CCER_CC2E); | ||||
|  | ||||
|   /* Get the TIMx CCER register value */ | ||||
|   tmpccer =  LL_TIM_ReadReg(TIMx, CCER); | ||||
|  | ||||
|   /* Get the TIMx CR2 register value */ | ||||
|   tmpcr2 = LL_TIM_ReadReg(TIMx, CR2); | ||||
|  | ||||
|   /* Get the TIMx CCMR1 register value */ | ||||
|   tmpccmr1 = LL_TIM_ReadReg(TIMx, CCMR1); | ||||
|  | ||||
|   /* Reset Capture/Compare selection Bits */ | ||||
|   CLEAR_BIT(tmpccmr1, TIM_CCMR1_CC2S); | ||||
|  | ||||
|   /* Select the Output Compare Mode */ | ||||
|   MODIFY_REG(tmpccmr1, TIM_CCMR1_OC2M, TIM_OCInitStruct->OCMode << 8U); | ||||
|  | ||||
|   /* Set the Output Compare Polarity */ | ||||
|   MODIFY_REG(tmpccer, TIM_CCER_CC2P, TIM_OCInitStruct->OCPolarity << 4U); | ||||
|  | ||||
|   /* Set the Output State */ | ||||
|   MODIFY_REG(tmpccer, TIM_CCER_CC2E, TIM_OCInitStruct->OCState << 4U); | ||||
|  | ||||
|   /* Write to TIMx CR2 */ | ||||
|   LL_TIM_WriteReg(TIMx, CR2, tmpcr2); | ||||
|  | ||||
|   /* Write to TIMx CCMR1 */ | ||||
|   LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); | ||||
|  | ||||
|   /* Set the Capture Compare Register value */ | ||||
|   LL_TIM_OC_SetCompareCH2(TIMx, TIM_OCInitStruct->CompareValue); | ||||
|  | ||||
|   /* Write to TIMx CCER */ | ||||
|   LL_TIM_WriteReg(TIMx, CCER, tmpccer); | ||||
|  | ||||
|   return SUCCESS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure the TIMx output channel 3. | ||||
|   * @param  TIMx Timer Instance | ||||
|   * @param  TIM_OCInitStruct pointer to the the TIMx output channel 3 configuration data structure | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: TIMx registers are de-initialized | ||||
|   *          - ERROR: not applicable | ||||
|   */ | ||||
| static ErrorStatus OC3Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct) | ||||
| { | ||||
|   uint32_t tmpccmr2; | ||||
|   uint32_t tmpccer; | ||||
|   uint32_t tmpcr2; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_TIM_CC3_INSTANCE(TIMx)); | ||||
|   assert_param(IS_LL_TIM_OCMODE(TIM_OCInitStruct->OCMode)); | ||||
|   assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCState)); | ||||
|   assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCPolarity)); | ||||
|  | ||||
|   /* Disable the Channel 3: Reset the CC3E Bit */ | ||||
|   CLEAR_BIT(TIMx->CCER, TIM_CCER_CC3E); | ||||
|  | ||||
|   /* Get the TIMx CCER register value */ | ||||
|   tmpccer =  LL_TIM_ReadReg(TIMx, CCER); | ||||
|  | ||||
|   /* Get the TIMx CR2 register value */ | ||||
|   tmpcr2 = LL_TIM_ReadReg(TIMx, CR2); | ||||
|  | ||||
|   /* Get the TIMx CCMR2 register value */ | ||||
|   tmpccmr2 = LL_TIM_ReadReg(TIMx, CCMR2); | ||||
|  | ||||
|   /* Reset Capture/Compare selection Bits */ | ||||
|   CLEAR_BIT(tmpccmr2, TIM_CCMR2_CC3S); | ||||
|  | ||||
|   /* Select the Output Compare Mode */ | ||||
|   MODIFY_REG(tmpccmr2, TIM_CCMR2_OC3M, TIM_OCInitStruct->OCMode); | ||||
|  | ||||
|   /* Set the Output Compare Polarity */ | ||||
|   MODIFY_REG(tmpccer, TIM_CCER_CC3P, TIM_OCInitStruct->OCPolarity << 8U); | ||||
|  | ||||
|   /* Set the Output State */ | ||||
|   MODIFY_REG(tmpccer, TIM_CCER_CC3E, TIM_OCInitStruct->OCState << 8U); | ||||
|  | ||||
|   /* Write to TIMx CR2 */ | ||||
|   LL_TIM_WriteReg(TIMx, CR2, tmpcr2); | ||||
|  | ||||
|   /* Write to TIMx CCMR2 */ | ||||
|   LL_TIM_WriteReg(TIMx, CCMR2, tmpccmr2); | ||||
|  | ||||
|   /* Set the Capture Compare Register value */ | ||||
|   LL_TIM_OC_SetCompareCH3(TIMx, TIM_OCInitStruct->CompareValue); | ||||
|  | ||||
|   /* Write to TIMx CCER */ | ||||
|   LL_TIM_WriteReg(TIMx, CCER, tmpccer); | ||||
|  | ||||
|   return SUCCESS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure the TIMx output channel 4. | ||||
|   * @param  TIMx Timer Instance | ||||
|   * @param  TIM_OCInitStruct pointer to the the TIMx output channel 4 configuration data structure | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: TIMx registers are de-initialized | ||||
|   *          - ERROR: not applicable | ||||
|   */ | ||||
| static ErrorStatus OC4Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct) | ||||
| { | ||||
|   uint32_t tmpccmr2; | ||||
|   uint32_t tmpccer; | ||||
|   uint32_t tmpcr2; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_TIM_CC4_INSTANCE(TIMx)); | ||||
|   assert_param(IS_LL_TIM_OCMODE(TIM_OCInitStruct->OCMode)); | ||||
|   assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCState)); | ||||
|   assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCPolarity)); | ||||
|  | ||||
|   /* Disable the Channel 4: Reset the CC4E Bit */ | ||||
|   CLEAR_BIT(TIMx->CCER, TIM_CCER_CC4E); | ||||
|  | ||||
|   /* Get the TIMx CCER register value */ | ||||
|   tmpccer = LL_TIM_ReadReg(TIMx, CCER); | ||||
|  | ||||
|   /* Get the TIMx CR2 register value */ | ||||
|   tmpcr2 =  LL_TIM_ReadReg(TIMx, CR2); | ||||
|  | ||||
|   /* Get the TIMx CCMR2 register value */ | ||||
|   tmpccmr2 = LL_TIM_ReadReg(TIMx, CCMR2); | ||||
|  | ||||
|   /* Reset Capture/Compare selection Bits */ | ||||
|   CLEAR_BIT(tmpccmr2, TIM_CCMR2_CC4S); | ||||
|  | ||||
|   /* Select the Output Compare Mode */ | ||||
|   MODIFY_REG(tmpccmr2, TIM_CCMR2_OC4M, TIM_OCInitStruct->OCMode << 8U); | ||||
|  | ||||
|   /* Set the Output Compare Polarity */ | ||||
|   MODIFY_REG(tmpccer, TIM_CCER_CC4P, TIM_OCInitStruct->OCPolarity << 12U); | ||||
|  | ||||
|   /* Set the Output State */ | ||||
|   MODIFY_REG(tmpccer, TIM_CCER_CC4E, TIM_OCInitStruct->OCState << 12U); | ||||
|  | ||||
|   /* Write to TIMx CR2 */ | ||||
|   LL_TIM_WriteReg(TIMx, CR2, tmpcr2); | ||||
|  | ||||
|   /* Write to TIMx CCMR2 */ | ||||
|   LL_TIM_WriteReg(TIMx, CCMR2, tmpccmr2); | ||||
|  | ||||
|   /* Set the Capture Compare Register value */ | ||||
|   LL_TIM_OC_SetCompareCH4(TIMx, TIM_OCInitStruct->CompareValue); | ||||
|  | ||||
|   /* Write to TIMx CCER */ | ||||
|   LL_TIM_WriteReg(TIMx, CCER, tmpccer); | ||||
|  | ||||
|   return SUCCESS; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure the TIMx input channel 1. | ||||
|   * @param  TIMx Timer Instance | ||||
|   * @param  TIM_ICInitStruct pointer to the the TIMx input channel 1 configuration data structure | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: TIMx registers are de-initialized | ||||
|   *          - ERROR: not applicable | ||||
|   */ | ||||
| static ErrorStatus IC1Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_TIM_CC1_INSTANCE(TIMx)); | ||||
|   assert_param(IS_LL_TIM_IC_POLARITY(TIM_ICInitStruct->ICPolarity)); | ||||
|   assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_ICInitStruct->ICActiveInput)); | ||||
|   assert_param(IS_LL_TIM_ICPSC(TIM_ICInitStruct->ICPrescaler)); | ||||
|   assert_param(IS_LL_TIM_IC_FILTER(TIM_ICInitStruct->ICFilter)); | ||||
|  | ||||
|   /* Disable the Channel 1: Reset the CC1E Bit */ | ||||
|   TIMx->CCER &= (uint32_t)~TIM_CCER_CC1E; | ||||
|  | ||||
|   /* Select the Input and set the filter and the prescaler value */ | ||||
|   MODIFY_REG(TIMx->CCMR1, | ||||
|              (TIM_CCMR1_CC1S | TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC), | ||||
|              (TIM_ICInitStruct->ICActiveInput | TIM_ICInitStruct->ICFilter | TIM_ICInitStruct->ICPrescaler) >> 16U); | ||||
|  | ||||
|   /* Select the Polarity and set the CC1E Bit */ | ||||
|   MODIFY_REG(TIMx->CCER, | ||||
|              (TIM_CCER_CC1P | TIM_CCER_CC1NP), | ||||
|              (TIM_ICInitStruct->ICPolarity | TIM_CCER_CC1E)); | ||||
|  | ||||
|   return SUCCESS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure the TIMx input channel 2. | ||||
|   * @param  TIMx Timer Instance | ||||
|   * @param  TIM_ICInitStruct pointer to the the TIMx input channel 2 configuration data structure | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: TIMx registers are de-initialized | ||||
|   *          - ERROR: not applicable | ||||
|   */ | ||||
| static ErrorStatus IC2Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_TIM_CC2_INSTANCE(TIMx)); | ||||
|   assert_param(IS_LL_TIM_IC_POLARITY(TIM_ICInitStruct->ICPolarity)); | ||||
|   assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_ICInitStruct->ICActiveInput)); | ||||
|   assert_param(IS_LL_TIM_ICPSC(TIM_ICInitStruct->ICPrescaler)); | ||||
|   assert_param(IS_LL_TIM_IC_FILTER(TIM_ICInitStruct->ICFilter)); | ||||
|  | ||||
|   /* Disable the Channel 2: Reset the CC2E Bit */ | ||||
|   TIMx->CCER &= (uint32_t)~TIM_CCER_CC2E; | ||||
|  | ||||
|   /* Select the Input and set the filter and the prescaler value */ | ||||
|   MODIFY_REG(TIMx->CCMR1, | ||||
|              (TIM_CCMR1_CC2S | TIM_CCMR1_IC2F | TIM_CCMR1_IC2PSC), | ||||
|              (TIM_ICInitStruct->ICActiveInput | TIM_ICInitStruct->ICFilter | TIM_ICInitStruct->ICPrescaler) >> 8U); | ||||
|  | ||||
|   /* Select the Polarity and set the CC2E Bit */ | ||||
|   MODIFY_REG(TIMx->CCER, | ||||
|              (TIM_CCER_CC2P | TIM_CCER_CC2NP), | ||||
|              ((TIM_ICInitStruct->ICPolarity << 4U) | TIM_CCER_CC2E)); | ||||
|  | ||||
|   return SUCCESS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure the TIMx input channel 3. | ||||
|   * @param  TIMx Timer Instance | ||||
|   * @param  TIM_ICInitStruct pointer to the the TIMx input channel 3 configuration data structure | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: TIMx registers are de-initialized | ||||
|   *          - ERROR: not applicable | ||||
|   */ | ||||
| static ErrorStatus IC3Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_TIM_CC3_INSTANCE(TIMx)); | ||||
|   assert_param(IS_LL_TIM_IC_POLARITY(TIM_ICInitStruct->ICPolarity)); | ||||
|   assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_ICInitStruct->ICActiveInput)); | ||||
|   assert_param(IS_LL_TIM_ICPSC(TIM_ICInitStruct->ICPrescaler)); | ||||
|   assert_param(IS_LL_TIM_IC_FILTER(TIM_ICInitStruct->ICFilter)); | ||||
|  | ||||
|   /* Disable the Channel 3: Reset the CC3E Bit */ | ||||
|   TIMx->CCER &= (uint32_t)~TIM_CCER_CC3E; | ||||
|  | ||||
|   /* Select the Input and set the filter and the prescaler value */ | ||||
|   MODIFY_REG(TIMx->CCMR2, | ||||
|              (TIM_CCMR2_CC3S | TIM_CCMR2_IC3F | TIM_CCMR2_IC3PSC), | ||||
|              (TIM_ICInitStruct->ICActiveInput | TIM_ICInitStruct->ICFilter | TIM_ICInitStruct->ICPrescaler) >> 16U); | ||||
|  | ||||
|   /* Select the Polarity and set the CC3E Bit */ | ||||
|   MODIFY_REG(TIMx->CCER, | ||||
|              (TIM_CCER_CC3P | TIM_CCER_CC3NP), | ||||
|              ((TIM_ICInitStruct->ICPolarity << 8U) | TIM_CCER_CC3E)); | ||||
|  | ||||
|   return SUCCESS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure the TIMx input channel 4. | ||||
|   * @param  TIMx Timer Instance | ||||
|   * @param  TIM_ICInitStruct pointer to the the TIMx input channel 4 configuration data structure | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: TIMx registers are de-initialized | ||||
|   *          - ERROR: not applicable | ||||
|   */ | ||||
| static ErrorStatus IC4Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_TIM_CC4_INSTANCE(TIMx)); | ||||
|   assert_param(IS_LL_TIM_IC_POLARITY(TIM_ICInitStruct->ICPolarity)); | ||||
|   assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_ICInitStruct->ICActiveInput)); | ||||
|   assert_param(IS_LL_TIM_ICPSC(TIM_ICInitStruct->ICPrescaler)); | ||||
|   assert_param(IS_LL_TIM_IC_FILTER(TIM_ICInitStruct->ICFilter)); | ||||
|  | ||||
|   /* Disable the Channel 4: Reset the CC4E Bit */ | ||||
|   TIMx->CCER &= (uint32_t)~TIM_CCER_CC4E; | ||||
|  | ||||
|   /* Select the Input and set the filter and the prescaler value */ | ||||
|   MODIFY_REG(TIMx->CCMR2, | ||||
|              (TIM_CCMR2_CC4S | TIM_CCMR2_IC4F | TIM_CCMR2_IC4PSC), | ||||
|              (TIM_ICInitStruct->ICActiveInput | TIM_ICInitStruct->ICFilter | TIM_ICInitStruct->ICPrescaler) >> 8U); | ||||
|  | ||||
|   /* Select the Polarity and set the CC2E Bit */ | ||||
|   MODIFY_REG(TIMx->CCER, | ||||
|              (TIM_CCER_CC4P | TIM_CCER_CC4NP), | ||||
|              ((TIM_ICInitStruct->ICPolarity << 12U) | TIM_CCER_CC4E)); | ||||
|  | ||||
|   return SUCCESS; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* TIM1 || TIM3 || TIM21 || TIM22 || TIM6 || TIM7 */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* USE_FULL_LL_DRIVER */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
							
								
								
									
										420
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_usart.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										420
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_usart.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,420 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx_ll_usart.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   USART LL module driver. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| #if defined(USE_FULL_LL_DRIVER) | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32l0xx_ll_usart.h" | ||||
| #include "stm32l0xx_ll_rcc.h" | ||||
| #include "stm32l0xx_ll_bus.h" | ||||
| #ifdef USE_FULL_ASSERT | ||||
| #include "stm32_assert.h" | ||||
| #else | ||||
| #define assert_param(expr) ((void)0U) | ||||
| #endif /* USE_FULL_ASSERT */ | ||||
|  | ||||
| /** @addtogroup STM32L0xx_LL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #if defined (USART1) || defined (USART2) || defined (USART4) || defined (USART5) | ||||
|  | ||||
| /** @addtogroup USART_LL | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /** @addtogroup USART_LL_Private_Macros | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* __BAUDRATE__ The maximum Baud Rate is derived from the maximum clock available | ||||
|  *              divided by the smallest oversampling used on the USART (i.e. 8)    */ | ||||
| #define IS_LL_USART_BAUDRATE(__BAUDRATE__) ((__BAUDRATE__) <= 4000000U) | ||||
|  | ||||
| /* __VALUE__ In case of oversampling by 16 and 8, BRR content must be greater than or equal to 16d. */ | ||||
| #define IS_LL_USART_BRR_MIN(__VALUE__) ((__VALUE__) >= 16U) | ||||
|  | ||||
| #define IS_LL_USART_DIRECTION(__VALUE__) (((__VALUE__) == LL_USART_DIRECTION_NONE) \ | ||||
|                                           || ((__VALUE__) == LL_USART_DIRECTION_RX) \ | ||||
|                                           || ((__VALUE__) == LL_USART_DIRECTION_TX) \ | ||||
|                                           || ((__VALUE__) == LL_USART_DIRECTION_TX_RX)) | ||||
|  | ||||
| #define IS_LL_USART_PARITY(__VALUE__) (((__VALUE__) == LL_USART_PARITY_NONE) \ | ||||
|                                        || ((__VALUE__) == LL_USART_PARITY_EVEN) \ | ||||
|                                        || ((__VALUE__) == LL_USART_PARITY_ODD)) | ||||
|  | ||||
| #define IS_LL_USART_DATAWIDTH(__VALUE__) (((__VALUE__) == LL_USART_DATAWIDTH_7B) \ | ||||
|                                           || ((__VALUE__) == LL_USART_DATAWIDTH_8B) \ | ||||
|                                           || ((__VALUE__) == LL_USART_DATAWIDTH_9B)) | ||||
|  | ||||
| #define IS_LL_USART_OVERSAMPLING(__VALUE__) (((__VALUE__) == LL_USART_OVERSAMPLING_16) \ | ||||
|                                              || ((__VALUE__) == LL_USART_OVERSAMPLING_8)) | ||||
|  | ||||
| #define IS_LL_USART_LASTBITCLKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_LASTCLKPULSE_NO_OUTPUT) \ | ||||
|                                                  || ((__VALUE__) == LL_USART_LASTCLKPULSE_OUTPUT)) | ||||
|  | ||||
| #define IS_LL_USART_CLOCKPHASE(__VALUE__) (((__VALUE__) == LL_USART_PHASE_1EDGE) \ | ||||
|                                            || ((__VALUE__) == LL_USART_PHASE_2EDGE)) | ||||
|  | ||||
| #define IS_LL_USART_CLOCKPOLARITY(__VALUE__) (((__VALUE__) == LL_USART_POLARITY_LOW) \ | ||||
|                                               || ((__VALUE__) == LL_USART_POLARITY_HIGH)) | ||||
|  | ||||
| #define IS_LL_USART_CLOCKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_CLOCK_DISABLE) \ | ||||
|                                             || ((__VALUE__) == LL_USART_CLOCK_ENABLE)) | ||||
|  | ||||
| #define IS_LL_USART_STOPBITS(__VALUE__) (((__VALUE__) == LL_USART_STOPBITS_0_5) \ | ||||
|                                          || ((__VALUE__) == LL_USART_STOPBITS_1) \ | ||||
|                                          || ((__VALUE__) == LL_USART_STOPBITS_1_5) \ | ||||
|                                          || ((__VALUE__) == LL_USART_STOPBITS_2)) | ||||
|  | ||||
| #define IS_LL_USART_HWCONTROL(__VALUE__) (((__VALUE__) == LL_USART_HWCONTROL_NONE) \ | ||||
|                                           || ((__VALUE__) == LL_USART_HWCONTROL_RTS) \ | ||||
|                                           || ((__VALUE__) == LL_USART_HWCONTROL_CTS) \ | ||||
|                                           || ((__VALUE__) == LL_USART_HWCONTROL_RTS_CTS)) | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @addtogroup USART_LL_Exported_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup USART_LL_EF_Init | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  De-initialize USART registers (Registers restored to their default values). | ||||
|   * @param  USARTx USART Instance | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: USART registers are de-initialized | ||||
|   *          - ERROR: USART registers are not de-initialized | ||||
|   */ | ||||
| ErrorStatus LL_USART_DeInit(USART_TypeDef *USARTx) | ||||
| { | ||||
|   ErrorStatus status = SUCCESS; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_UART_INSTANCE(USARTx)); | ||||
|  | ||||
| #if defined(USART1) | ||||
|   if (USARTx == USART1) | ||||
|   { | ||||
|     /* Force reset of USART clock */ | ||||
|     LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_USART1); | ||||
|  | ||||
|     /* Release reset of USART clock */ | ||||
|     LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_USART1); | ||||
|   } | ||||
| #endif /* USART1 */ | ||||
| #if defined(USART1) | ||||
|   else if (USARTx == USART2) | ||||
| #else | ||||
|   if (USARTx == USART2) | ||||
| #endif /* USART1 */ | ||||
|   { | ||||
|     /* Force reset of USART clock */ | ||||
|     LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_USART2); | ||||
|  | ||||
|     /* Release reset of USART clock */ | ||||
|     LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_USART2); | ||||
|   } | ||||
| #if defined(USART4) | ||||
|   else if (USARTx == USART4) | ||||
|   { | ||||
|     /* Force reset of USART clock */ | ||||
|     LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_USART4); | ||||
|  | ||||
|     /* Release reset of USART clock */ | ||||
|     LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_USART4); | ||||
|   } | ||||
| #endif /* USART4 */ | ||||
| #if defined(USART5) | ||||
|   else if (USARTx == USART5) | ||||
|   { | ||||
|     /* Force reset of USART clock */ | ||||
|     LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_USART5); | ||||
|  | ||||
|     /* Release reset of USART clock */ | ||||
|     LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_USART5); | ||||
|   } | ||||
| #endif /* USART5 */ | ||||
|   else | ||||
|   { | ||||
|     status = ERROR; | ||||
|   } | ||||
|  | ||||
|   return (status); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Initialize USART registers according to the specified | ||||
|   *         parameters in USART_InitStruct. | ||||
|   * @note   As some bits in USART configuration registers can only be written when | ||||
|   *         the USART is disabled (USART_CR1_UE bit =0), USART Peripheral should be in disabled state prior calling | ||||
|   *         this function. Otherwise, ERROR result will be returned. | ||||
|   * @note   Baud rate value stored in USART_InitStruct BaudRate field, should be valid (different from 0). | ||||
|   * @param  USARTx USART Instance | ||||
|   * @param  USART_InitStruct pointer to a LL_USART_InitTypeDef structure | ||||
|   *         that contains the configuration information for the specified USART peripheral. | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: USART registers are initialized according to USART_InitStruct content | ||||
|   *          - ERROR: Problem occurred during USART Registers initialization | ||||
|   */ | ||||
| ErrorStatus LL_USART_Init(USART_TypeDef *USARTx, LL_USART_InitTypeDef *USART_InitStruct) | ||||
| { | ||||
|   ErrorStatus status = ERROR; | ||||
|   uint32_t periphclk = LL_RCC_PERIPH_FREQUENCY_NO; | ||||
| #if defined(USART4) || defined(USART5) | ||||
|   LL_RCC_ClocksTypeDef RCC_Clocks; | ||||
| #endif /* USART4 || USART5 */ | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_UART_INSTANCE(USARTx)); | ||||
|   assert_param(IS_LL_USART_BAUDRATE(USART_InitStruct->BaudRate)); | ||||
|   assert_param(IS_LL_USART_DATAWIDTH(USART_InitStruct->DataWidth)); | ||||
|   assert_param(IS_LL_USART_STOPBITS(USART_InitStruct->StopBits)); | ||||
|   assert_param(IS_LL_USART_PARITY(USART_InitStruct->Parity)); | ||||
|   assert_param(IS_LL_USART_DIRECTION(USART_InitStruct->TransferDirection)); | ||||
|   assert_param(IS_LL_USART_HWCONTROL(USART_InitStruct->HardwareFlowControl)); | ||||
|   assert_param(IS_LL_USART_OVERSAMPLING(USART_InitStruct->OverSampling)); | ||||
|  | ||||
|   /* USART needs to be in disabled state, in order to be able to configure some bits in | ||||
|      CRx registers */ | ||||
|   if (LL_USART_IsEnabled(USARTx) == 0U) | ||||
|   { | ||||
|     /*---------------------------- USART CR1 Configuration --------------------- | ||||
|      * Configure USARTx CR1 (USART Word Length, Parity, Mode and Oversampling bits) with parameters: | ||||
|      * - DataWidth:          USART_CR1_M bits according to USART_InitStruct->DataWidth value | ||||
|      * - Parity:             USART_CR1_PCE, USART_CR1_PS bits according to USART_InitStruct->Parity value | ||||
|      * - TransferDirection:  USART_CR1_TE, USART_CR1_RE bits according to USART_InitStruct->TransferDirection value | ||||
|      * - Oversampling:       USART_CR1_OVER8 bit according to USART_InitStruct->OverSampling value. | ||||
|      */ | ||||
|     MODIFY_REG(USARTx->CR1, | ||||
|                (USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | | ||||
|                 USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8), | ||||
|                (USART_InitStruct->DataWidth | USART_InitStruct->Parity | | ||||
|                 USART_InitStruct->TransferDirection | USART_InitStruct->OverSampling)); | ||||
|  | ||||
|     /*---------------------------- USART CR2 Configuration --------------------- | ||||
|      * Configure USARTx CR2 (Stop bits) with parameters: | ||||
|      * - Stop Bits:          USART_CR2_STOP bits according to USART_InitStruct->StopBits value. | ||||
|      * - CLKEN, CPOL, CPHA and LBCL bits are to be configured using LL_USART_ClockInit(). | ||||
|      */ | ||||
|     LL_USART_SetStopBitsLength(USARTx, USART_InitStruct->StopBits); | ||||
|  | ||||
|     /*---------------------------- USART CR3 Configuration --------------------- | ||||
|      * Configure USARTx CR3 (Hardware Flow Control) with parameters: | ||||
|      * - HardwareFlowControl: USART_CR3_RTSE, USART_CR3_CTSE bits according to | ||||
|      *   USART_InitStruct->HardwareFlowControl value. | ||||
|      */ | ||||
|     LL_USART_SetHWFlowCtrl(USARTx, USART_InitStruct->HardwareFlowControl); | ||||
|  | ||||
|     /*---------------------------- USART BRR Configuration --------------------- | ||||
|      * Retrieve Clock frequency used for USART Peripheral | ||||
|      */ | ||||
| #if defined(USART1) | ||||
|     if (USARTx == USART1) | ||||
|     { | ||||
|       periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART1_CLKSOURCE); | ||||
|     } | ||||
| #endif /* USART1 */ | ||||
| #if defined(USART1) | ||||
|     else if (USARTx == USART2) | ||||
| #else | ||||
|     if (USARTx == USART2) | ||||
| #endif /* USART1 */ | ||||
|     { | ||||
|       periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART2_CLKSOURCE); | ||||
|     } | ||||
| #if defined(USART4) | ||||
|     else if (USARTx == USART4) | ||||
|     { | ||||
|       /* USART4 clock is PCLK1 */ | ||||
|       LL_RCC_GetSystemClocksFreq(&RCC_Clocks); | ||||
|       periphclk = RCC_Clocks.PCLK1_Frequency; | ||||
|     } | ||||
| #endif /* USART4 */ | ||||
| #if defined(USART5) | ||||
|     else if (USARTx == USART5) | ||||
|     { | ||||
|       /* USART5 clock is PCLK1 */ | ||||
|       LL_RCC_GetSystemClocksFreq(&RCC_Clocks); | ||||
|       periphclk = RCC_Clocks.PCLK1_Frequency; | ||||
|     } | ||||
| #endif /* USART5 */ | ||||
|     else | ||||
|     { | ||||
|       /* Nothing to do, as error code is already assigned to ERROR value */ | ||||
|     } | ||||
|  | ||||
|     /* Configure the USART Baud Rate : | ||||
|        - valid baud rate value (different from 0) is required | ||||
|        - Peripheral clock as returned by RCC service, should be valid (different from 0). | ||||
|     */ | ||||
|     if ((periphclk != LL_RCC_PERIPH_FREQUENCY_NO) | ||||
|         && (USART_InitStruct->BaudRate != 0U)) | ||||
|     { | ||||
|       status = SUCCESS; | ||||
|       LL_USART_SetBaudRate(USARTx, | ||||
|                            periphclk, | ||||
|                            USART_InitStruct->OverSampling, | ||||
|                            USART_InitStruct->BaudRate); | ||||
|  | ||||
|       /* Check BRR is greater than or equal to 16d */ | ||||
|       assert_param(IS_LL_USART_BRR_MIN(USARTx->BRR)); | ||||
|     } | ||||
|   } | ||||
|   /* Endif (=> USART not in Disabled state => return ERROR) */ | ||||
|  | ||||
|   return (status); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Set each @ref LL_USART_InitTypeDef field to default value. | ||||
|   * @param USART_InitStruct pointer to a @ref LL_USART_InitTypeDef structure | ||||
|   *                         whose fields will be set to default values. | ||||
|   * @retval None | ||||
|   */ | ||||
|  | ||||
| void LL_USART_StructInit(LL_USART_InitTypeDef *USART_InitStruct) | ||||
| { | ||||
|   /* Set USART_InitStruct fields to default values */ | ||||
|   USART_InitStruct->BaudRate            = 9600U; | ||||
|   USART_InitStruct->DataWidth           = LL_USART_DATAWIDTH_8B; | ||||
|   USART_InitStruct->StopBits            = LL_USART_STOPBITS_1; | ||||
|   USART_InitStruct->Parity              = LL_USART_PARITY_NONE ; | ||||
|   USART_InitStruct->TransferDirection   = LL_USART_DIRECTION_TX_RX; | ||||
|   USART_InitStruct->HardwareFlowControl = LL_USART_HWCONTROL_NONE; | ||||
|   USART_InitStruct->OverSampling        = LL_USART_OVERSAMPLING_16; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Initialize USART Clock related settings according to the | ||||
|   *         specified parameters in the USART_ClockInitStruct. | ||||
|   * @note   As some bits in USART configuration registers can only be written when | ||||
|   *         the USART is disabled (USART_CR1_UE bit =0), USART Peripheral should be in disabled state prior calling | ||||
|   *         this function. Otherwise, ERROR result will be returned. | ||||
|   * @param  USARTx USART Instance | ||||
|   * @param  USART_ClockInitStruct pointer to a @ref LL_USART_ClockInitTypeDef structure | ||||
|   *         that contains the Clock configuration information for the specified USART peripheral. | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: USART registers related to Clock settings are initialized according | ||||
|   *                     to USART_ClockInitStruct content | ||||
|   *          - ERROR: Problem occurred during USART Registers initialization | ||||
|   */ | ||||
| ErrorStatus LL_USART_ClockInit(USART_TypeDef *USARTx, LL_USART_ClockInitTypeDef *USART_ClockInitStruct) | ||||
| { | ||||
|   ErrorStatus status = SUCCESS; | ||||
|  | ||||
|   /* Check USART Instance and Clock signal output parameters */ | ||||
|   assert_param(IS_UART_INSTANCE(USARTx)); | ||||
|   assert_param(IS_LL_USART_CLOCKOUTPUT(USART_ClockInitStruct->ClockOutput)); | ||||
|  | ||||
|   /* USART needs to be in disabled state, in order to be able to configure some bits in | ||||
|      CRx registers */ | ||||
|   if (LL_USART_IsEnabled(USARTx) == 0U) | ||||
|   { | ||||
|     /* If USART Clock signal is disabled */ | ||||
|     if (USART_ClockInitStruct->ClockOutput == LL_USART_CLOCK_DISABLE) | ||||
|     { | ||||
|       /* Deactivate Clock signal delivery : | ||||
|        * - Disable Clock Output:        USART_CR2_CLKEN cleared | ||||
|        */ | ||||
|       LL_USART_DisableSCLKOutput(USARTx); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       /* Ensure USART instance is USART capable */ | ||||
|       assert_param(IS_USART_INSTANCE(USARTx)); | ||||
|  | ||||
|       /* Check clock related parameters */ | ||||
|       assert_param(IS_LL_USART_CLOCKPOLARITY(USART_ClockInitStruct->ClockPolarity)); | ||||
|       assert_param(IS_LL_USART_CLOCKPHASE(USART_ClockInitStruct->ClockPhase)); | ||||
|       assert_param(IS_LL_USART_LASTBITCLKOUTPUT(USART_ClockInitStruct->LastBitClockPulse)); | ||||
|  | ||||
|       /*---------------------------- USART CR2 Configuration ----------------------- | ||||
|        * Configure USARTx CR2 (Clock signal related bits) with parameters: | ||||
|        * - Enable Clock Output:         USART_CR2_CLKEN set | ||||
|        * - Clock Polarity:              USART_CR2_CPOL bit according to USART_ClockInitStruct->ClockPolarity value | ||||
|        * - Clock Phase:                 USART_CR2_CPHA bit according to USART_ClockInitStruct->ClockPhase value | ||||
|        * - Last Bit Clock Pulse Output: USART_CR2_LBCL bit according to USART_ClockInitStruct->LastBitClockPulse value. | ||||
|        */ | ||||
|       MODIFY_REG(USARTx->CR2, | ||||
|                  USART_CR2_CLKEN | USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_LBCL, | ||||
|                  USART_CR2_CLKEN | USART_ClockInitStruct->ClockPolarity | | ||||
|                  USART_ClockInitStruct->ClockPhase | USART_ClockInitStruct->LastBitClockPulse); | ||||
|     } | ||||
|   } | ||||
|   /* Else (USART not in Disabled state => return ERROR */ | ||||
|   else | ||||
|   { | ||||
|     status = ERROR; | ||||
|   } | ||||
|  | ||||
|   return (status); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Set each field of a @ref LL_USART_ClockInitTypeDef type structure to default value. | ||||
|   * @param USART_ClockInitStruct pointer to a @ref LL_USART_ClockInitTypeDef structure | ||||
|   *                              whose fields will be set to default values. | ||||
|   * @retval None | ||||
|   */ | ||||
| void LL_USART_ClockStructInit(LL_USART_ClockInitTypeDef *USART_ClockInitStruct) | ||||
| { | ||||
|   /* Set LL_USART_ClockInitStruct fields with default values */ | ||||
|   USART_ClockInitStruct->ClockOutput       = LL_USART_CLOCK_DISABLE; | ||||
|   USART_ClockInitStruct->ClockPolarity     = LL_USART_POLARITY_LOW;            /* Not relevant when ClockOutput = | ||||
|                                                                                   LL_USART_CLOCK_DISABLE */ | ||||
|   USART_ClockInitStruct->ClockPhase        = LL_USART_PHASE_1EDGE;             /* Not relevant when ClockOutput = | ||||
|                                                                                   LL_USART_CLOCK_DISABLE */ | ||||
|   USART_ClockInitStruct->LastBitClockPulse = LL_USART_LASTCLKPULSE_NO_OUTPUT;  /* Not relevant when ClockOutput = | ||||
|                                                                                   LL_USART_CLOCK_DISABLE */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* USART1 || USART2 || USART4 || USART5 */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* USE_FULL_LL_DRIVER */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
|  | ||||
							
								
								
									
										591
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_utils.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										591
									
								
								fw/Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_ll_utils.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,591 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32l0xx_ll_utils.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   UTILS LL module driver. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright(c) 2016 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32l0xx_ll_rcc.h" | ||||
| #include "stm32l0xx_ll_utils.h" | ||||
| #include "stm32l0xx_ll_system.h" | ||||
| #include "stm32l0xx_ll_pwr.h" | ||||
| #ifdef  USE_FULL_ASSERT | ||||
| #include "stm32_assert.h" | ||||
| #else | ||||
| #define assert_param(expr) ((void)0U) | ||||
| #endif | ||||
|  | ||||
| /** @addtogroup STM32L0xx_LL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup UTILS_LL | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
| /** @addtogroup UTILS_LL_Private_Constants | ||||
|   * @{ | ||||
|   */ | ||||
| #define UTILS_MAX_FREQUENCY_SCALE1  (32000000U)        /*!< Maximum frequency for system clock at power scale1, in Hz */ | ||||
| #define UTILS_MAX_FREQUENCY_SCALE2  (16000000U)        /*!< Maximum frequency for system clock at power scale2, in Hz */ | ||||
| #define UTILS_MAX_FREQUENCY_SCALE3  (4194304U)         /*!< Maximum frequency for system clock at power scale3, in Hz */ | ||||
|  | ||||
| /* Defines used for PLL range */ | ||||
| #define UTILS_PLLVCO_OUTPUT_SCALE1  (96000000U)        /*!< Frequency max for PLLVCO output at power scale1, in Hz  */ | ||||
| #define UTILS_PLLVCO_OUTPUT_SCALE2  (48000000U)        /*!< Frequency max for PLLVCO output at power scale2, in Hz  */ | ||||
| #define UTILS_PLLVCO_OUTPUT_SCALE3  (24000000U)        /*!< Frequency max for PLLVCO output at power scale3, in Hz  */ | ||||
|  | ||||
| /* Defines used for HSE range */ | ||||
| #define UTILS_HSE_FREQUENCY_MIN     (1000000U)         /*!< Frequency min for HSE frequency, in Hz   */ | ||||
| #define UTILS_HSE_FREQUENCY_MAX     (24000000U)        /*!< Frequency max for HSE frequency, in Hz   */ | ||||
|  | ||||
| /* Defines used for FLASH latency according to HCLK Frequency */ | ||||
| #define UTILS_SCALE1_LATENCY1_FREQ  (16000000U)        /*!< HCLK frequency to set FLASH latency 1 in power scale 1 */ | ||||
| #define UTILS_SCALE2_LATENCY1_FREQ  (8000000U)         /*!< HCLK frequency to set FLASH latency 1 in power scale 2 */ | ||||
| #define UTILS_SCALE3_LATENCY1_FREQ  (2000000U)         /*!< HCLK frequency to set FLASH latency 1 in power scale 3 */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /** @addtogroup UTILS_LL_Private_Macros | ||||
|   * @{ | ||||
|   */ | ||||
| #define IS_LL_UTILS_SYSCLK_DIV(__VALUE__) (((__VALUE__) == LL_RCC_SYSCLK_DIV_1)   \ | ||||
|                                         || ((__VALUE__) == LL_RCC_SYSCLK_DIV_2)   \ | ||||
|                                         || ((__VALUE__) == LL_RCC_SYSCLK_DIV_4)   \ | ||||
|                                         || ((__VALUE__) == LL_RCC_SYSCLK_DIV_8)   \ | ||||
|                                         || ((__VALUE__) == LL_RCC_SYSCLK_DIV_16)  \ | ||||
|                                         || ((__VALUE__) == LL_RCC_SYSCLK_DIV_64)  \ | ||||
|                                         || ((__VALUE__) == LL_RCC_SYSCLK_DIV_128) \ | ||||
|                                         || ((__VALUE__) == LL_RCC_SYSCLK_DIV_256) \ | ||||
|                                         || ((__VALUE__) == LL_RCC_SYSCLK_DIV_512)) | ||||
|  | ||||
| #define IS_LL_UTILS_APB1_DIV(__VALUE__) (((__VALUE__) == LL_RCC_APB1_DIV_1) \ | ||||
|                                       || ((__VALUE__) == LL_RCC_APB1_DIV_2) \ | ||||
|                                       || ((__VALUE__) == LL_RCC_APB1_DIV_4) \ | ||||
|                                       || ((__VALUE__) == LL_RCC_APB1_DIV_8) \ | ||||
|                                       || ((__VALUE__) == LL_RCC_APB1_DIV_16)) | ||||
|  | ||||
| #define IS_LL_UTILS_APB2_DIV(__VALUE__) (((__VALUE__) == LL_RCC_APB2_DIV_1) \ | ||||
|                                       || ((__VALUE__) == LL_RCC_APB2_DIV_2) \ | ||||
|                                       || ((__VALUE__) == LL_RCC_APB2_DIV_4) \ | ||||
|                                       || ((__VALUE__) == LL_RCC_APB2_DIV_8) \ | ||||
|                                       || ((__VALUE__) == LL_RCC_APB2_DIV_16)) | ||||
|  | ||||
| #define IS_LL_UTILS_PLLMUL_VALUE(__VALUE__) (((__VALUE__) == LL_RCC_PLL_MUL_3) \ | ||||
|                                           || ((__VALUE__) == LL_RCC_PLL_MUL_4) \ | ||||
|                                           || ((__VALUE__) == LL_RCC_PLL_MUL_6) \ | ||||
|                                           || ((__VALUE__) == LL_RCC_PLL_MUL_8) \ | ||||
|                                           || ((__VALUE__) == LL_RCC_PLL_MUL_12) \ | ||||
|                                           || ((__VALUE__) == LL_RCC_PLL_MUL_16) \ | ||||
|                                           || ((__VALUE__) == LL_RCC_PLL_MUL_24) \ | ||||
|                                           || ((__VALUE__) == LL_RCC_PLL_MUL_32) \ | ||||
|                                           || ((__VALUE__) == LL_RCC_PLL_MUL_48)) | ||||
|  | ||||
| #define IS_LL_UTILS_PLLDIV_VALUE(__VALUE__) (((__VALUE__) == LL_RCC_PLL_DIV_2) || ((__VALUE__) == LL_RCC_PLL_DIV_3) || \ | ||||
|                                              ((__VALUE__) == LL_RCC_PLL_DIV_4)) | ||||
|  | ||||
| #define IS_LL_UTILS_PLLVCO_OUTPUT(__VALUE__) ((LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE1) ? ((__VALUE__) <= UTILS_PLLVCO_OUTPUT_SCALE1) : \ | ||||
|                                              ((LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE2) ? ((__VALUE__) <= UTILS_PLLVCO_OUTPUT_SCALE2) : \ | ||||
|                                              ((__VALUE__) <= UTILS_PLLVCO_OUTPUT_SCALE3))) | ||||
|  | ||||
| #define IS_LL_UTILS_PLL_FREQUENCY(__VALUE__) ((LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE1) ? ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE1) : \ | ||||
|                                              ((LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE2) ? ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE2) : \ | ||||
|                                              ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE3))) | ||||
|  | ||||
| #define IS_LL_UTILS_HSE_BYPASS(__STATE__) (((__STATE__) == LL_UTILS_HSEBYPASS_ON) \ | ||||
|                                         || ((__STATE__) == LL_UTILS_HSEBYPASS_OFF)) | ||||
|  | ||||
| #define IS_LL_UTILS_HSE_FREQUENCY(__FREQUENCY__) (((__FREQUENCY__) >= UTILS_HSE_FREQUENCY_MIN) && ((__FREQUENCY__) <= UTILS_HSE_FREQUENCY_MAX)) | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /** @defgroup UTILS_LL_Private_Functions UTILS Private functions | ||||
|   * @{ | ||||
|   */ | ||||
| static uint32_t    UTILS_GetPLLOutputFrequency(uint32_t PLL_InputFrequency, | ||||
|                                                LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct); | ||||
| static ErrorStatus UTILS_EnablePLLAndSwitchSystem(uint32_t SYSCLK_Frequency, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); | ||||
| static ErrorStatus UTILS_PLL_IsBusy(void); | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @addtogroup UTILS_LL_Exported_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup UTILS_LL_EF_DELAY | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  This function configures the Cortex-M SysTick source to have 1ms time base. | ||||
|   * @note   When a RTOS is used, it is recommended to avoid changing the Systick | ||||
|   *         configuration by calling this function, for a delay use rather osDelay RTOS service. | ||||
|   * @param  HCLKFrequency HCLK frequency in Hz | ||||
|   * @note   HCLK frequency can be calculated thanks to RCC helper macro or function @ref LL_RCC_GetSystemClocksFreq | ||||
|   * @retval None | ||||
|   */ | ||||
| void LL_Init1msTick(uint32_t HCLKFrequency) | ||||
| { | ||||
|   /* Use frequency provided in argument */ | ||||
|   LL_InitTick(HCLKFrequency, 1000U); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  This function provides accurate delay (in milliseconds) based | ||||
|   *         on SysTick counter flag | ||||
|   * @note   When a RTOS is used, it is recommended to avoid using blocking delay | ||||
|   *         and use rather osDelay service. | ||||
|   * @note   To respect 1ms timebase, user should call @ref LL_Init1msTick function which | ||||
|   *         will configure Systick to 1ms | ||||
|   * @param  Delay specifies the delay time length, in milliseconds. | ||||
|   * @retval None | ||||
|   */ | ||||
| void LL_mDelay(uint32_t Delay) | ||||
| { | ||||
|   __IO uint32_t  tmp = SysTick->CTRL;  /* Clear the COUNTFLAG first */ | ||||
|   /* Add this code to indicate that local variable is not used */ | ||||
|   ((void)tmp); | ||||
|  | ||||
|   /* Add a period to guaranty minimum wait */ | ||||
|   if (Delay < LL_MAX_DELAY) | ||||
|   { | ||||
|     Delay++; | ||||
|   } | ||||
|  | ||||
|   while (Delay) | ||||
|   { | ||||
|     if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != 0U) | ||||
|     { | ||||
|       Delay--; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup UTILS_EF_SYSTEM | ||||
|   *  @brief    System Configuration functions | ||||
|   * | ||||
|   @verbatim | ||||
|  =============================================================================== | ||||
|            ##### System Configuration functions ##### | ||||
|  =============================================================================== | ||||
|     [..] | ||||
|          System, AHB and APB buses clocks configuration | ||||
|  | ||||
|          (+) The maximum frequency of the SYSCLK, HCLK, PCLK1 and PCLK2 is 32000000 Hz. | ||||
|   @endverbatim | ||||
|   @internal | ||||
|              Depending on the device voltage range, the maximum frequency should be | ||||
|              adapted accordingly: | ||||
|              (++) +----------------------------------------------------------------+ | ||||
|              (++) |  Wait states  |                HCLK clock frequency (MHz)      | | ||||
|              (++) |               |------------------------------------------------| | ||||
|              (++) |   (Latency)   |            voltage range       | voltage range | | ||||
|              (++) |               |            1.65 V - 3.6 V      | 2.0 V - 3.6 V | | ||||
|              (++) |               |----------------|---------------|---------------| | ||||
|              (++) |               |  VCORE = 1.2 V | VCORE = 1.5 V | VCORE = 1.8 V | | ||||
|              (++) |-------------- |----------------|---------------|---------------| | ||||
|              (++) |0WS(1CPU cycle)|0 < HCLK <= 2   |0 < HCLK <= 8  |0 < HCLK <= 16 | | ||||
|              (++) |---------------|----------------|---------------|---------------| | ||||
|              (++) |1WS(2CPU cycle)|2 < HCLK <= 4   |8 < HCLK <= 16 |16 < HCLK <= 32| | ||||
|              (++) +----------------------------------------------------------------+ | ||||
|   @endinternal | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  This function sets directly SystemCoreClock CMSIS variable. | ||||
|   * @note   Variable can be calculated also through SystemCoreClockUpdate function. | ||||
|   * @param  HCLKFrequency HCLK frequency in Hz (can be calculated thanks to RCC helper macro) | ||||
|   * @retval None | ||||
|   */ | ||||
| void LL_SetSystemCoreClock(uint32_t HCLKFrequency) | ||||
| { | ||||
|   /* HCLK clock frequency */ | ||||
|   SystemCoreClock = HCLKFrequency; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Update number of Flash wait states in line with new frequency and current | ||||
|             voltage range. | ||||
|   * @param  Frequency  HCLK frequency | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: Latency has been modified | ||||
|   *          - ERROR: Latency cannot be modified | ||||
|   */ | ||||
| ErrorStatus LL_SetFlashLatency(uint32_t Frequency) | ||||
| { | ||||
|   uint32_t timeout; | ||||
|   uint32_t getlatency; | ||||
|   uint32_t latency; | ||||
|   ErrorStatus status = SUCCESS; | ||||
|  | ||||
|   /* Frequency cannot be equal to 0 */ | ||||
|   if ((Frequency == 0U) || (Frequency > UTILS_MAX_FREQUENCY_SCALE1)) | ||||
|   { | ||||
|     status = ERROR; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     if (LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE1) | ||||
|     { | ||||
|       if (Frequency > UTILS_SCALE1_LATENCY1_FREQ) | ||||
|       { | ||||
|         /* 16 < HCLK <= 32 => 1WS (2 CPU cycles) */ | ||||
|         latency = LL_FLASH_LATENCY_1; | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         /* else HCLK < 16MHz default LL_FLASH_LATENCY_0 0WS */ | ||||
|         latency = LL_FLASH_LATENCY_0; | ||||
|       } | ||||
|     } | ||||
|     else if (LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE2) | ||||
|     { | ||||
|       if (Frequency > UTILS_SCALE2_LATENCY1_FREQ) | ||||
|       { | ||||
|         /* 8 < HCLK <= 16 => 1WS (2 CPU cycles) */ | ||||
|         latency = LL_FLASH_LATENCY_1; | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         /* else HCLK < 8MHz default LL_FLASH_LATENCY_0 0WS */ | ||||
|         latency = LL_FLASH_LATENCY_0; | ||||
|       } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       if (Frequency > UTILS_SCALE3_LATENCY1_FREQ) | ||||
|       { | ||||
|         /* 2 < HCLK <= 4 => 1WS (2 CPU cycles) */ | ||||
|         latency = LL_FLASH_LATENCY_1; | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         /* else HCLK < 2MHz default LL_FLASH_LATENCY_0 0WS */ | ||||
|         latency = LL_FLASH_LATENCY_0; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if (status != ERROR) | ||||
|     { | ||||
|       LL_FLASH_SetLatency(latency); | ||||
|  | ||||
|       /* Check that the new number of wait states is taken into account to access the Flash | ||||
|            memory by reading the FLASH_ACR register */ | ||||
|       timeout = 2; | ||||
|       do | ||||
|       { | ||||
|       /* Wait for Flash latency to be updated */ | ||||
|       getlatency = LL_FLASH_GetLatency(); | ||||
|       timeout--; | ||||
|       } while ((getlatency != latency) && (timeout > 0)); | ||||
|  | ||||
|       if(getlatency != latency) | ||||
|       { | ||||
|         status = ERROR; | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         status = SUCCESS; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  This function configures system clock with HSI as clock source of the PLL | ||||
|   * @note   The application need to ensure that PLL is disabled. | ||||
|   * @note   Function is based on the following formula: | ||||
|   *         - PLL output frequency = ((HSI frequency * PLLMul) / PLLDiv) | ||||
|   *         - PLLMul: The application software must set correctly the PLL multiplication factor to ensure | ||||
|   *           - PLLVCO does not exceed 96 MHz when the product is in range 1, | ||||
|   *           - PLLVCO does not exceed 48 MHz when the product is in range 2, | ||||
|   *           - PLLVCO does not exceed 24 MHz when the product is in range 3 | ||||
|   * @note   FLASH latency can be modified through this function.  | ||||
|   * @param  UTILS_PLLInitStruct pointer to a @ref LL_UTILS_PLLInitTypeDef structure that contains | ||||
|   *                             the configuration information for the PLL. | ||||
|   * @param  UTILS_ClkInitStruct pointer to a @ref LL_UTILS_ClkInitTypeDef structure that contains | ||||
|   *                             the configuration information for the BUS prescalers. | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: Max frequency configuration done | ||||
|   *          - ERROR: Max frequency configuration not done | ||||
|   */ | ||||
| ErrorStatus LL_PLL_ConfigSystemClock_HSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, | ||||
|                                          LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct) | ||||
| { | ||||
|   ErrorStatus status = SUCCESS; | ||||
|   uint32_t pllfreq = 0U; | ||||
|  | ||||
|   /* Check if one of the PLL is enabled */ | ||||
|   if (UTILS_PLL_IsBusy() == SUCCESS) | ||||
|   { | ||||
|     /* Calculate the new PLL output frequency */ | ||||
|     pllfreq = UTILS_GetPLLOutputFrequency(HSI_VALUE, UTILS_PLLInitStruct); | ||||
|  | ||||
|     /* Enable HSI if not enabled */ | ||||
|     if (LL_RCC_HSI_IsReady() != 1U) | ||||
|     { | ||||
|       LL_RCC_HSI_Enable(); | ||||
|       while (LL_RCC_HSI_IsReady() != 1U) | ||||
|       { | ||||
|         /* Wait for HSI ready */ | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     /* Configure PLL */ | ||||
|     LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI, UTILS_PLLInitStruct->PLLMul, UTILS_PLLInitStruct->PLLDiv); | ||||
|  | ||||
|     /* Enable PLL and switch system clock to PLL */ | ||||
|     status = UTILS_EnablePLLAndSwitchSystem(pllfreq, UTILS_ClkInitStruct); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     /* Current PLL configuration cannot be modified */ | ||||
|     status = ERROR; | ||||
|   } | ||||
|  | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  This function configures system clock with HSE as clock source of the PLL | ||||
|   * @note   The application need to ensure that PLL is disabled. | ||||
|   * @note   Function is based on the following formula: | ||||
|   *         - PLL output frequency = ((HSE frequency * PLLMul) / PLLDiv) | ||||
|   *         - PLLMul: The application software must set correctly the PLL multiplication factor to to ensure | ||||
|   *           - PLLVCO does not exceed 96 MHz when the product is in range 1, | ||||
|   *           - PLLVCO does not exceed 48 MHz when the product is in range 2, | ||||
|   *           - PLLVCO does not exceed 24 MHz when the product is in range 3 | ||||
|   * @note   FLASH latency can be modified through this function.  | ||||
|   * @param  HSEFrequency Value between Min_Data = 1000000 and Max_Data = 24000000 | ||||
|   * @param  HSEBypass This parameter can be one of the following values: | ||||
|   *         @arg @ref LL_UTILS_HSEBYPASS_ON | ||||
|   *         @arg @ref LL_UTILS_HSEBYPASS_OFF | ||||
|   * @param  UTILS_PLLInitStruct pointer to a @ref LL_UTILS_PLLInitTypeDef structure that contains | ||||
|   *                             the configuration information for the PLL. | ||||
|   * @param  UTILS_ClkInitStruct pointer to a @ref LL_UTILS_ClkInitTypeDef structure that contains | ||||
|   *                             the configuration information for the BUS prescalers. | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: Max frequency configuration done | ||||
|   *          - ERROR: Max frequency configuration not done | ||||
|   */ | ||||
| ErrorStatus LL_PLL_ConfigSystemClock_HSE(uint32_t HSEFrequency, uint32_t HSEBypass, | ||||
|                                          LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct) | ||||
| { | ||||
|   ErrorStatus status = SUCCESS; | ||||
|   uint32_t pllfreq = 0U; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_LL_UTILS_HSE_FREQUENCY(HSEFrequency)); | ||||
|   assert_param(IS_LL_UTILS_HSE_BYPASS(HSEBypass)); | ||||
|  | ||||
|   /* Check if one of the PLL is enabled */ | ||||
|   if (UTILS_PLL_IsBusy() == SUCCESS) | ||||
|   { | ||||
|     /* Calculate the new PLL output frequency */ | ||||
|     pllfreq = UTILS_GetPLLOutputFrequency(HSEFrequency, UTILS_PLLInitStruct); | ||||
|  | ||||
|     /* Enable HSE if not enabled */ | ||||
|     if (LL_RCC_HSE_IsReady() != 1U) | ||||
|     { | ||||
|       /* Check if need to enable HSE bypass feature or not */ | ||||
|       if (HSEBypass == LL_UTILS_HSEBYPASS_ON) | ||||
|       { | ||||
|         LL_RCC_HSE_EnableBypass(); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         LL_RCC_HSE_DisableBypass(); | ||||
|       } | ||||
|  | ||||
|       /* Enable HSE */ | ||||
|       LL_RCC_HSE_Enable(); | ||||
|       while (LL_RCC_HSE_IsReady() != 1U) | ||||
|       { | ||||
|         /* Wait for HSE ready */ | ||||
|       } | ||||
|     } | ||||
|  | ||||
|       /* Configure PLL */ | ||||
|       LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, UTILS_PLLInitStruct->PLLMul, UTILS_PLLInitStruct->PLLDiv); | ||||
|  | ||||
|     /* Enable PLL and switch system clock to PLL */ | ||||
|     status = UTILS_EnablePLLAndSwitchSystem(pllfreq, UTILS_ClkInitStruct); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     /* Current PLL configuration cannot be modified */ | ||||
|     status = ERROR; | ||||
|   } | ||||
|  | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup UTILS_LL_Private_Functions | ||||
|   * @{ | ||||
|   */ | ||||
| /** | ||||
|   * @brief  Function to check that PLL can be modified | ||||
|   * @param  PLL_InputFrequency  PLL input frequency (in Hz) | ||||
|   * @param  UTILS_PLLInitStruct pointer to a @ref LL_UTILS_PLLInitTypeDef structure that contains | ||||
|   *                             the configuration information for the PLL. | ||||
|   * @retval PLL output frequency (in Hz) | ||||
|   */ | ||||
| static uint32_t UTILS_GetPLLOutputFrequency(uint32_t PLL_InputFrequency, LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct) | ||||
| { | ||||
|   uint32_t pllfreq = 0U; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_LL_UTILS_PLLMUL_VALUE(UTILS_PLLInitStruct->PLLMul)); | ||||
|   assert_param(IS_LL_UTILS_PLLDIV_VALUE(UTILS_PLLInitStruct->PLLDiv)); | ||||
|  | ||||
|   /* Check different PLL parameters according to RM                          */ | ||||
|   /* The application software must set correctly the PLL multiplication factor to avoid exceeding | ||||
|      96 MHz as PLLVCO when the product is in range 1, | ||||
|      48 MHz as PLLVCO when the product is in range 2, | ||||
|      24 MHz when the product is in range 3. */ | ||||
|   pllfreq = PLL_InputFrequency * (PLLMulTable[UTILS_PLLInitStruct->PLLMul >> RCC_CFGR_PLLMUL_Pos]); | ||||
|   assert_param(IS_LL_UTILS_PLLVCO_OUTPUT(pllfreq)); | ||||
|  | ||||
|   /* The application software must set correctly the PLL multiplication factor to avoid exceeding  | ||||
|      maximum frequency 32000000 in range 1 */ | ||||
|   pllfreq = pllfreq / ((UTILS_PLLInitStruct->PLLDiv >> RCC_CFGR_PLLDIV_Pos)+1U); | ||||
|   assert_param(IS_LL_UTILS_PLL_FREQUENCY(pllfreq)); | ||||
|  | ||||
|   return pllfreq; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Function to check that PLL can be modified | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: PLL modification can be done | ||||
|   *          - ERROR: PLL is busy | ||||
|   */ | ||||
| static ErrorStatus UTILS_PLL_IsBusy(void) | ||||
| { | ||||
|   ErrorStatus status = SUCCESS; | ||||
|  | ||||
|   /* Check if PLL is busy*/ | ||||
|   if (LL_RCC_PLL_IsReady() != 0U) | ||||
|   { | ||||
|     /* PLL configuration cannot be modified */ | ||||
|     status = ERROR; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Function to enable PLL and switch system clock to PLL | ||||
|   * @param  SYSCLK_Frequency SYSCLK frequency | ||||
|   * @param  UTILS_ClkInitStruct pointer to a @ref LL_UTILS_ClkInitTypeDef structure that contains | ||||
|   *                             the configuration information for the BUS prescalers. | ||||
|   * @retval An ErrorStatus enumeration value: | ||||
|   *          - SUCCESS: No problem to switch system to PLL | ||||
|   *          - ERROR: Problem to switch system to PLL | ||||
|   */ | ||||
| static ErrorStatus UTILS_EnablePLLAndSwitchSystem(uint32_t SYSCLK_Frequency, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct) | ||||
| { | ||||
|   ErrorStatus status = SUCCESS; | ||||
|   uint32_t hclk_frequency = 0U; | ||||
|  | ||||
|   assert_param(IS_LL_UTILS_SYSCLK_DIV(UTILS_ClkInitStruct->AHBCLKDivider)); | ||||
|   assert_param(IS_LL_UTILS_APB1_DIV(UTILS_ClkInitStruct->APB1CLKDivider)); | ||||
|   assert_param(IS_LL_UTILS_APB2_DIV(UTILS_ClkInitStruct->APB2CLKDivider)); | ||||
|  | ||||
|   /* Calculate HCLK frequency */ | ||||
|   hclk_frequency = __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, UTILS_ClkInitStruct->AHBCLKDivider); | ||||
|  | ||||
|   /* Increasing the number of wait states because of higher CPU frequency */ | ||||
|   if (SystemCoreClock < hclk_frequency) | ||||
|   { | ||||
|     /* Set FLASH latency to highest latency */ | ||||
|     status = LL_SetFlashLatency(hclk_frequency); | ||||
|   } | ||||
|  | ||||
|   /* Update system clock configuration */ | ||||
|   if (status == SUCCESS) | ||||
|   { | ||||
|     /* Enable PLL */ | ||||
|     LL_RCC_PLL_Enable(); | ||||
|     while (LL_RCC_PLL_IsReady() != 1U) | ||||
|     { | ||||
|       /* Wait for PLL ready */ | ||||
|     } | ||||
|  | ||||
|     /* Sysclk activation on the main PLL */ | ||||
|     LL_RCC_SetAHBPrescaler(UTILS_ClkInitStruct->AHBCLKDivider); | ||||
|     LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); | ||||
|     while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) | ||||
|     { | ||||
|       /* Wait for system clock switch to PLL */ | ||||
|     } | ||||
|  | ||||
|     /* Set APB1 & APB2 prescaler*/ | ||||
|     LL_RCC_SetAPB1Prescaler(UTILS_ClkInitStruct->APB1CLKDivider); | ||||
|     LL_RCC_SetAPB2Prescaler(UTILS_ClkInitStruct->APB2CLKDivider); | ||||
|   } | ||||
|  | ||||
|   /* Decreasing the number of wait states because of lower CPU frequency */ | ||||
|   if (SystemCoreClock > hclk_frequency) | ||||
|   { | ||||
|     /* Set FLASH latency to lowest latency */ | ||||
|     status = LL_SetFlashLatency(hclk_frequency); | ||||
|   } | ||||
|  | ||||
|   /* Update SystemCoreClock variable */ | ||||
|   if (status == SUCCESS) | ||||
|   { | ||||
|     LL_SetSystemCoreClock(hclk_frequency); | ||||
|   } | ||||
|  | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
		Reference in New Issue
	
	Block a user
	 David Žaitlík
					David Žaitlík