From 3c25b8f7d02617763672629726449ed79303692e Mon Sep 17 00:00:00 2001 From: N1netyNine99 Date: Wed, 25 Feb 2026 23:19:22 +0800 Subject: [PATCH 1/4] =?UTF-8?q?[feat]=E8=AE=A9EK=E6=A1=86=E6=9E=B6?= =?UTF-8?q?=E5=86=85=E9=83=A8=E7=BB=B4=E6=8A=A4=E4=BA=86=E4=B8=80=E5=A5=97?= =?UTF-8?q?=E9=80=9A=E7=94=A8ld=EF=BC=8C=E7=94=A8=E6=88=B7=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E9=80=9A=E8=BF=87=E9=85=8D=E7=BD=AE=E5=AF=B9=E9=A5=AE?= =?UTF-8?q?=E7=9A=84=20L1=5FMCU/your=5Fmcu=5Fborad/CMakeLists.txt=20?= =?UTF-8?q?=E6=9D=A5=E5=BF=AB=E9=80=9F=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 7 +- CMakeLists.txt | 2 + L1_MCU/CMakeLists.txt | 8 + L1_MCU/GD32F470ZGT6/CMakeLists.txt | 10 + L1_MCU/STM32F429ZIT6_GCC/CMakeLists.txt | 10 + L1_MCU/STM32F429ZIT6_STARM/CMakeLists.txt | 10 + cmake/EkLinkerScript.cmake | 122 ++++++++++ cmake/gcc-arm-none-eabi.cmake | 1 - cmake/ld/ek_generic.ld.in | 264 ++++++++++++++++++++++ cmake/starm-clang.cmake | 3 +- justfile | 3 - 11 files changed, 429 insertions(+), 11 deletions(-) create mode 100644 cmake/EkLinkerScript.cmake create mode 100644 cmake/ld/ek_generic.ld.in diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5139ef2..e816181 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -49,8 +49,7 @@ jobs: cmake -B build -G Ninja \ -DCMAKE_TOOLCHAIN_FILE="cmake/gcc-arm-none-eabi.cmake" \ -DCMAKE_BUILD_TYPE=Debug \ - -DLINKER_SCRIPT="L1_MCU/STM32F429ZIT6_GCC/stm32f429zit6_flash.ld" \ - -DMCU_MODEL="STM32F429ZIT6_GCC"\ + -DMCU_MODEL="STM32F429ZIT6_GCC" \ -DUSE_FREERTOS=${{ matrix.config.freertos }} \ -DUSE_FATFS=OFF \ -DUSE_LVGL=${{ matrix.config.lvgl }} @@ -96,12 +95,10 @@ jobs: cmake -B build -G Ninja ` -DCMAKE_TOOLCHAIN_FILE="cmake/gcc-arm-none-eabi.cmake" ` -DCMAKE_BUILD_TYPE=Debug ` - -DLINKER_SCRIPT="L1_MCU/STM32F429ZIT6_GCC/stm32f429zit6_flash.ld" ` -DMCU_MODEL="STM32F429ZIT6_GCC" ` -DUSE_FREERTOS=${{ matrix.config.freertos }} ` -DUSE_FATFS=OFF ` - -DUSE_LVGL=${{ matrix.config.lvgl }} ` - -DUSE_LVGL_THORVG=${{ matrix.config.thorvg }} + -DUSE_LVGL=${{ matrix.config.lvgl }} ninja -C build test: diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a57962..d0786b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,6 +63,8 @@ set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES OUTPUT_NAME ${CMAKE_PROJE # 添加子目录 add_subdirectory(L0_Assets) add_subdirectory(L1_MCU) +# L1_MCU 子目录已生成链接脚本并更新了 LINKER_SCRIPT,在此应用 +target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-T${LINKER_SCRIPT}") add_subdirectory(L2_Core) add_subdirectory(L3_Middlewares) add_subdirectory(L4_Components) diff --git a/L1_MCU/CMakeLists.txt b/L1_MCU/CMakeLists.txt index 72c2111..90f9b84 100644 --- a/L1_MCU/CMakeLists.txt +++ b/L1_MCU/CMakeLists.txt @@ -18,3 +18,11 @@ if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${MCU_MODEL}") endif() add_subdirectory(${MCU_MODEL}) + +# MCU 子目录通过 PARENT_SCOPE 设置了内存参数,生成链接脚本 +include(EkLinkerScript) +ek_configure_linker_script() + +# 用生成的链接脚本覆盖工具链文件设置的默认值 +set(LINKER_SCRIPT "${EK_GENERATED_LINKER_SCRIPT}" + CACHE FILEPATH "The path to the linker script" FORCE) diff --git a/L1_MCU/GD32F470ZGT6/CMakeLists.txt b/L1_MCU/GD32F470ZGT6/CMakeLists.txt index 76eabc8..a39a934 100644 --- a/L1_MCU/GD32F470ZGT6/CMakeLists.txt +++ b/L1_MCU/GD32F470ZGT6/CMakeLists.txt @@ -36,3 +36,13 @@ target_compile_definitions(l1_mcu PUBLIC GD32F470 $<$:DEBUG> ) + +# 链接脚本内存参数 +set(EK_FLASH_ORIGIN "0x08000000" PARENT_SCOPE) +set(EK_FLASH_LENGTH "1024K" PARENT_SCOPE) +set(EK_RAM_ORIGIN "0x20000000" PARENT_SCOPE) +set(EK_RAM_LENGTH "448K" PARENT_SCOPE) +set(EK_CCMRAM_ORIGIN "0x10000000" PARENT_SCOPE) +set(EK_CCMRAM_LENGTH "64K" PARENT_SCOPE) +set(EK_SDRAM1_ORIGIN "0xC0000000" PARENT_SCOPE) +set(EK_SDRAM1_LENGTH "32M" PARENT_SCOPE) diff --git a/L1_MCU/STM32F429ZIT6_GCC/CMakeLists.txt b/L1_MCU/STM32F429ZIT6_GCC/CMakeLists.txt index b7e18c4..d2dec07 100644 --- a/L1_MCU/STM32F429ZIT6_GCC/CMakeLists.txt +++ b/L1_MCU/STM32F429ZIT6_GCC/CMakeLists.txt @@ -32,3 +32,13 @@ target_compile_definitions(l1_mcu PUBLIC STM32F429xx $<$:DEBUG> ) + +# 链接脚本内存参数 +set(EK_FLASH_ORIGIN "0x08000000" PARENT_SCOPE) +set(EK_FLASH_LENGTH "2048K" PARENT_SCOPE) +set(EK_RAM_ORIGIN "0x20000000" PARENT_SCOPE) +set(EK_RAM_LENGTH "192K" PARENT_SCOPE) +set(EK_CCMRAM_ORIGIN "0x10000000" PARENT_SCOPE) +set(EK_CCMRAM_LENGTH "64K" PARENT_SCOPE) +set(EK_SDRAM1_ORIGIN "0xD0000000" PARENT_SCOPE) +set(EK_SDRAM1_LENGTH "8M" PARENT_SCOPE) diff --git a/L1_MCU/STM32F429ZIT6_STARM/CMakeLists.txt b/L1_MCU/STM32F429ZIT6_STARM/CMakeLists.txt index b7e18c4..d2dec07 100644 --- a/L1_MCU/STM32F429ZIT6_STARM/CMakeLists.txt +++ b/L1_MCU/STM32F429ZIT6_STARM/CMakeLists.txt @@ -32,3 +32,13 @@ target_compile_definitions(l1_mcu PUBLIC STM32F429xx $<$:DEBUG> ) + +# 链接脚本内存参数 +set(EK_FLASH_ORIGIN "0x08000000" PARENT_SCOPE) +set(EK_FLASH_LENGTH "2048K" PARENT_SCOPE) +set(EK_RAM_ORIGIN "0x20000000" PARENT_SCOPE) +set(EK_RAM_LENGTH "192K" PARENT_SCOPE) +set(EK_CCMRAM_ORIGIN "0x10000000" PARENT_SCOPE) +set(EK_CCMRAM_LENGTH "64K" PARENT_SCOPE) +set(EK_SDRAM1_ORIGIN "0xD0000000" PARENT_SCOPE) +set(EK_SDRAM1_LENGTH "8M" PARENT_SCOPE) diff --git a/cmake/EkLinkerScript.cmake b/cmake/EkLinkerScript.cmake new file mode 100644 index 0000000..58b7b31 --- /dev/null +++ b/cmake/EkLinkerScript.cmake @@ -0,0 +1,122 @@ +# cmake/EkLinkerScript.cmake +# 根据 MCU 内存参数生成链接脚本的辅助函数 +# +# 必选变量(通过 MCU 子目录 CMakeLists.txt 的 PARENT_SCOPE 设置): +# EK_FLASH_ORIGIN / EK_FLASH_LENGTH - Flash 起始地址和大小 +# EK_RAM_ORIGIN / EK_RAM_LENGTH - RAM 起始地址和大小 +# +# 可选变量(不设置则对应内存区域和段完全省略): +# EK_CCMRAM_ORIGIN / EK_CCMRAM_LENGTH - CCM-RAM 起始地址和大小 +# EK_SDRAM1_ORIGIN / EK_SDRAM1_LENGTH - SDRAM1 起始地址和大小 +# EK_SDRAM2_ORIGIN / EK_SDRAM2_LENGTH - SDRAM2 起始地址和大小 +# +# 可选变量(有默认值): +# EK_MIN_HEAP_SIZE - 最小堆大小(默认 0x200) +# EK_MIN_STACK_SIZE - 最小栈大小(默认 0x400) + +function(ek_configure_linker_script) + + # --- 必选参数检查 --- + foreach(_var + EK_FLASH_ORIGIN EK_FLASH_LENGTH + EK_RAM_ORIGIN EK_RAM_LENGTH + ) + if(NOT DEFINED ${_var}) + message(FATAL_ERROR + "ek_configure_linker_script: ${_var} is not set.\n" + "Please set it in ${MCU_MODEL}/CMakeLists.txt with PARENT_SCOPE.") + endif() + endforeach() + + # --- 可选参数默认值 --- + if(NOT DEFINED EK_MIN_HEAP_SIZE) + set(EK_MIN_HEAP_SIZE "0x200") + endif() + if(NOT DEFINED EK_MIN_STACK_SIZE) + set(EK_MIN_STACK_SIZE "0x400") + endif() + + # --- CCMRAM 可选区域 --- + if(DEFINED EK_CCMRAM_ORIGIN AND DEFINED EK_CCMRAM_LENGTH) + set(EK_LD_CCMRAM_REGION + "CCMRAM (xrw) : ORIGIN = ${EK_CCMRAM_ORIGIN}, LENGTH = ${EK_CCMRAM_LENGTH}") + set(EK_LD_CCMRAM_SECTION +" _siccmram = LOADADDR(.ccmram); + + /* CCM-RAM section + * + * IMPORTANT NOTE! + * If initialized variables will be placed in this section, + * the startup code needs to be modified to copy the init-values. + */ + .ccmram : + { + . = ALIGN(4); + _sccmram = .; /* create a global symbol at ccmram start */ + *(.ccmram) + *(.ccmram*) + *(.tcmram) /* GD32 TCM-RAM alias */ + *(.tcmram*) + + . = ALIGN(4); + _eccmram = .; /* create a global symbol at ccmram end */ + } >CCMRAM AT> FLASH +") + else() + set(EK_LD_CCMRAM_REGION "") + set(EK_LD_CCMRAM_SECTION "") + endif() + if(DEFINED EK_SDRAM1_ORIGIN AND DEFINED EK_SDRAM1_LENGTH) + set(EK_LD_SDRAM1_REGION + "SDRAM (xrw) : ORIGIN = ${EK_SDRAM1_ORIGIN}, LENGTH = ${EK_SDRAM1_LENGTH}") + set(EK_LD_SDRAM1_SECTION +" /* SDRAM1 数据段(需要外部 SDRAM 初始化后才可用) */ + .sdram1_data (NOLOAD) : + { + . = ALIGN(4); + _sdram1_data_start = .; + *(.sdram1_data) + *(.sdram1_data*) + . = ALIGN(4); + _sdram1_data_end = .; + } >SDRAM +") + else() + set(EK_LD_SDRAM1_REGION "") + set(EK_LD_SDRAM1_SECTION "") + endif() + + # --- SDRAM2 可选区域 --- + if(DEFINED EK_SDRAM2_ORIGIN AND DEFINED EK_SDRAM2_LENGTH) + set(EK_LD_SDRAM2_REGION + "SDRAM2 (xrw) : ORIGIN = ${EK_SDRAM2_ORIGIN}, LENGTH = ${EK_SDRAM2_LENGTH}") + set(EK_LD_SDRAM2_SECTION +" /* SDRAM2 数据段 */ + .sdram2_data (NOLOAD) : + { + . = ALIGN(4); + _sdram2_data_start = .; + *(.sdram2_data) + *(.sdram2_data*) + . = ALIGN(4); + _sdram2_data_end = .; + } >SDRAM2 +") + else() + set(EK_LD_SDRAM2_REGION "") + set(EK_LD_SDRAM2_SECTION "") + endif() + + # --- 生成链接脚本 --- + set(_output "${CMAKE_BINARY_DIR}/generated_${MCU_MODEL}.ld") + + configure_file( + "${CMAKE_SOURCE_DIR}/cmake/ld/ek_generic.ld.in" + "${_output}" + @ONLY + ) + + set(EK_GENERATED_LINKER_SCRIPT "${_output}" PARENT_SCOPE) + message(STATUS "Generated linker script: ${_output}") + +endfunction() diff --git a/cmake/gcc-arm-none-eabi.cmake b/cmake/gcc-arm-none-eabi.cmake index f85fc29..fa6d624 100644 --- a/cmake/gcc-arm-none-eabi.cmake +++ b/cmake/gcc-arm-none-eabi.cmake @@ -42,7 +42,6 @@ set(CMAKE_CXX_FLAGS_RELEASE "-Os -g0") set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -fno-rtti -fno-exceptions -fno-threadsafe-statics") set(CMAKE_EXE_LINKER_FLAGS "${TARGET_FLAGS}") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T \"${LINKER_SCRIPT}\"") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=nano.specs") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${CMAKE_PROJECT_NAME}.map -Wl,--gc-sections") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--print-memory-usage") diff --git a/cmake/ld/ek_generic.ld.in b/cmake/ld/ek_generic.ld.in new file mode 100644 index 0000000..051a94e --- /dev/null +++ b/cmake/ld/ek_generic.ld.in @@ -0,0 +1,264 @@ +/* +****************************************************************************** +** +** File : ek_generic.ld.in +** +** Abstract : 由 CMake configure_file 自动生成的通用链接脚本模板 +** 请勿手动编辑生成后的 .ld 文件,修改此 .ld.in 模板 +** +** Memory : 通过各 MCU 子目录的 CMakeLists.txt 配置以下变量: +** +** 必选: +** EK_FLASH_ORIGIN / EK_FLASH_LENGTH - Flash 起始地址和大小 +** EK_RAM_ORIGIN / EK_RAM_LENGTH - RAM 起始地址和大小 +** +** 可选(不设置则对应区域和段完全省略): +** EK_CCMRAM_ORIGIN / EK_CCMRAM_LENGTH - CCM-RAM 起始地址和大小 +** EK_SDRAM1_ORIGIN / EK_SDRAM1_LENGTH - SDRAM1 起始地址和大小 +** EK_SDRAM2_ORIGIN / EK_SDRAM2_LENGTH - SDRAM2 起始地址和大小 +** +** 可选(有默认值): +** EK_MIN_HEAP_SIZE - 最小堆大小(默认 0x200) +** EK_MIN_STACK_SIZE - 最小栈大小(默认 0x400) +** +****************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of RAM */ + +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = @EK_MIN_HEAP_SIZE@; /* required amount of heap */ +_Min_Stack_Size = @EK_MIN_STACK_SIZE@; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +RAM (xrw) : ORIGIN = @EK_RAM_ORIGIN@, LENGTH = @EK_RAM_LENGTH@ +FLASH (rx) : ORIGIN = @EK_FLASH_ORIGIN@, LENGTH = @EK_FLASH_LENGTH@ +@EK_LD_CCMRAM_REGION@ +@EK_LD_SDRAM1_REGION@ +@EK_LD_SDRAM2_REGION@ +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code - STM32 */ + KEEP(*(.vectors)) /* Startup code - GD32 */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab (READONLY) : + { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >FLASH + + .ARM (READONLY) : + { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >FLASH + + .preinit_array (READONLY) : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >FLASH + + .init_array (READONLY) : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >FLASH + + .fini_array (READONLY) : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >FLASH + + /* EmbeddedKit 自动导出段 */ + .ek_export : + { + . = ALIGN(4); + _ek_export_fn_start = .; + KEEP(*(SORT(.ek_export_fn*))) + . = ALIGN(4); + _ek_export_fn_end = .; + } >FLASH + + /* letter_shell 命令表段 */ + .shellCommand : + { + . = ALIGN(4); + _shell_command_start = .; + KEEP(*(SORT(.shellCommand*))) + . = ALIGN(4); + _shell_command_end = .; + } >FLASH + + /* letter_shell 变量表段 */ + .shellVariable : + { + . = ALIGN(4); + _shell_variable_start = .; + KEEP(*(SORT(.shellVariable*))) + . = ALIGN(4); + _shell_variable_end = .; + } >FLASH + +@EK_LD_CCMRAM_SECTION@ + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + *(.RamFunc) /* .RamFunc sections */ + *(.RamFunc*) /* .RamFunc* sections */ + + . = ALIGN(4); + } >RAM AT> FLASH + + /* Initialized TLS data section */ + .tdata : ALIGN(4) + { + *(.tdata .tdata.* .gnu.linkonce.td.*) + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + PROVIDE(__data_end = .); + PROVIDE(__tdata_end = .); + } >RAM AT> FLASH + + PROVIDE( __tdata_start = ADDR(.tdata) ); + PROVIDE( __tdata_size = __tdata_end - __tdata_start ); + + PROVIDE( __data_start = ADDR(.data) ); + PROVIDE( __data_size = __data_end - __data_start ); + + PROVIDE( __tdata_source = LOADADDR(.tdata) ); + PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) ); + PROVIDE( __tdata_source_size = __tdata_source_end - __tdata_source ); + + PROVIDE( __data_source = LOADADDR(.data) ); + PROVIDE( __data_source_end = __tdata_source_end ); + PROVIDE( __data_source_size = __data_source_end - __data_source ); + + /* Uninitialized TLS data section */ + .tbss (NOLOAD) : ALIGN(4) + { + /* This is used by the startup in order to initialize the .bss section */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.tbss .tbss.*) + . = ALIGN(4); + PROVIDE( __tbss_end = . ); + } >RAM + + PROVIDE( __tbss_start = ADDR(.tbss) ); + PROVIDE( __tbss_size = __tbss_end - __tbss_start ); + PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) ); + + PROVIDE( __tls_base = __tdata_start ); + PROVIDE( __tls_end = __tbss_end ); + PROVIDE( __tls_size = __tls_end - __tls_base ); + PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) ); + PROVIDE( __tls_size_align = (__tls_size + __tls_align - 1) & ~(__tls_align - 1) ); + PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) ); + PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) ); + + /* Uninitialized data section */ + .bss (NOLOAD) : ALIGN(4) + { + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + PROVIDE( __bss_end = . ); + } >RAM + + PROVIDE( __non_tls_bss_start = ADDR(.bss) ); + PROVIDE( __bss_start = __tbss_start ); + PROVIDE( __bss_size = __bss_end - __bss_start ); + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack (NOLOAD) : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } + +@EK_LD_SDRAM1_SECTION@ +@EK_LD_SDRAM2_SECTION@ +} diff --git a/cmake/starm-clang.cmake b/cmake/starm-clang.cmake index 04c2377..59529cc 100644 --- a/cmake/starm-clang.cmake +++ b/cmake/starm-clang.cmake @@ -41,7 +41,7 @@ set(CMAKE_CXX_FLAGS_RELEASE "-Oz -g0") set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -fno-rtti -fno-exceptions -fno-threadsafe-statics") # 链接脚本路径 (可通过 -DLINKER_SCRIPT 覆盖) -set(LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/L1_MCU/STM32F429ZIT6/stm32f429zit6_flash.ld" +set(LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/L1_MCU/STM32F429ZIT6_STARM/stm32f429zit6_flash.ld" CACHE FILEPATH "The path to the linker script") if(NOT CMAKE_SOURCE_DIR MATCHES "CMakeScratch") @@ -60,7 +60,6 @@ elseif(STARM_TOOLCHAIN_CONFIG STREQUAL "STARM_PICOLIBC") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lcrt0-hosted -z norelro") endif() -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T \"${LINKER_SCRIPT}\"") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${CMAKE_PROJECT_NAME}.map -Wl,--gc-sections") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -z noexecstack") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--print-memory-usage") diff --git a/justfile b/justfile index 616754b..6dae449 100644 --- a/justfile +++ b/justfile @@ -8,7 +8,6 @@ build: @cmake -B build -G Ninja \ -DCMAKE_TOOLCHAIN_FILE="cmake/gcc-arm-none-eabi.cmake" \ -DCMAKE_BUILD_TYPE=Debug \ - -DLINKER_SCRIPT="L1_MCU/STM32F429ZIT6_GCC/stm32f429zit6_flash.ld" \ -DMCU_MODEL="STM32F429ZIT6_GCC" \ -DUSE_FREERTOS=OFF \ -DUSE_FATFS=OFF \ @@ -19,7 +18,6 @@ build-gd: @cmake -B build -G Ninja \ -DCMAKE_TOOLCHAIN_FILE="cmake/gcc-arm-none-eabi.cmake" \ -DCMAKE_BUILD_TYPE=Debug \ - -DLINKER_SCRIPT="L1_MCU/GD32F470ZGT6/gd32f470zgt6_flash.ld" \ -DMCU_MODEL="GD32F470ZGT6" \ -DUSE_FREERTOS=OFF \ -DUSE_FATFS=OFF \ @@ -30,7 +28,6 @@ build-starm: @cmake -B build -G Ninja \ -DCMAKE_TOOLCHAIN_FILE="cmake/starm-clang.cmake" \ -DCMAKE_BUILD_TYPE=Debug \ - -DLINKER_SCRIPT="L1_MCU/STM32F429ZIT6_STARM/stm32f429zit6_flash.ld" \ -DMCU_MODEL="STM32F429ZIT6_STARM" \ -DUSE_FREERTOS=OFF \ -DUSE_FATFS=OFF \ From 418490307d5edcc773df75694b6e098e2e32ba6d Mon Sep 17 00:00:00 2001 From: N1netyNine99 Date: Wed, 25 Feb 2026 23:51:56 +0800 Subject: [PATCH 2/4] =?UTF-8?q?[update]=E4=B8=8D=E5=86=8D=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20starm-clang?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- L1_MCU/STM32F429ZIT6_STARM/.mxproject | 50 - L1_MCU/STM32F429ZIT6_STARM/CMakeLists.txt | 44 - L1_MCU/STM32F429ZIT6_STARM/CMakePresets.json | 38 - L1_MCU/STM32F429ZIT6_STARM/Core/Inc/dma.h | 52 - L1_MCU/STM32F429ZIT6_STARM/Core/Inc/dma2d.h | 52 - L1_MCU/STM32F429ZIT6_STARM/Core/Inc/fmc.h | 59 - L1_MCU/STM32F429ZIT6_STARM/Core/Inc/gpio.h | 49 - L1_MCU/STM32F429ZIT6_STARM/Core/Inc/i2c.h | 52 - L1_MCU/STM32F429ZIT6_STARM/Core/Inc/ltdc.h | 52 - L1_MCU/STM32F429ZIT6_STARM/Core/Inc/main.h | 81 - L1_MCU/STM32F429ZIT6_STARM/Core/Inc/spi.h | 52 - .../Core/Inc/stm32f4xx_hal_conf.h | 495 - .../Core/Inc/stm32f4xx_it.h | 70 - L1_MCU/STM32F429ZIT6_STARM/Core/Inc/usart.h | 52 - L1_MCU/STM32F429ZIT6_STARM/Core/Src/dma.c | 58 - L1_MCU/STM32F429ZIT6_STARM/Core/Src/dma2d.c | 96 - L1_MCU/STM32F429ZIT6_STARM/Core/Src/fmc.c | 298 - L1_MCU/STM32F429ZIT6_STARM/Core/Src/gpio.c | 97 - L1_MCU/STM32F429ZIT6_STARM/Core/Src/i2c.c | 138 - L1_MCU/STM32F429ZIT6_STARM/Core/Src/ltdc.c | 259 - L1_MCU/STM32F429ZIT6_STARM/Core/Src/main.c | 229 - L1_MCU/STM32F429ZIT6_STARM/Core/Src/spi.c | 119 - .../Core/Src/stm32f4xx_hal_msp.c | 84 - .../Core/Src/stm32f4xx_hal_timebase_tim.c | 137 - .../Core/Src/stm32f4xx_it.c | 266 - .../STM32F429ZIT6_STARM/Core/Src/syscalls.c | 244 - L1_MCU/STM32F429ZIT6_STARM/Core/Src/sysmem.c | 87 - .../Core/Src/system_stm32f4xx.c | 747 - L1_MCU/STM32F429ZIT6_STARM/Core/Src/usart.c | 162 - .../Device/ST/STM32F4xx/Include/stm32f429xx.h | 17192 ---------------- .../Device/ST/STM32F4xx/Include/stm32f4xx.h | 301 - .../ST/STM32F4xx/Include/system_stm32f4xx.h | 104 - .../CMSIS/Device/ST/STM32F4xx/LICENSE.txt | 6 - .../Drivers/CMSIS/Include/cachel1_armv7.h | 411 - .../Drivers/CMSIS/Include/cmsis_armcc.h | 888 - .../Drivers/CMSIS/Include/cmsis_armclang.h | 1503 -- .../CMSIS/Include/cmsis_armclang_ltm.h | 1928 -- .../Drivers/CMSIS/Include/cmsis_compiler.h | 283 - .../Drivers/CMSIS/Include/cmsis_gcc.h | 2211 -- .../Drivers/CMSIS/Include/cmsis_iccarm.h | 1002 - .../Drivers/CMSIS/Include/cmsis_version.h | 39 - .../Drivers/CMSIS/Include/core_armv81mml.h | 4228 ---- .../Drivers/CMSIS/Include/core_armv8mbl.h | 2222 -- .../Drivers/CMSIS/Include/core_armv8mml.h | 3209 --- .../Drivers/CMSIS/Include/core_cm0.h | 952 - .../Drivers/CMSIS/Include/core_cm0plus.h | 1087 - .../Drivers/CMSIS/Include/core_cm1.h | 979 - .../Drivers/CMSIS/Include/core_cm23.h | 2297 --- .../Drivers/CMSIS/Include/core_cm3.h | 1943 -- .../Drivers/CMSIS/Include/core_cm33.h | 3277 --- .../Drivers/CMSIS/Include/core_cm35p.h | 3277 --- .../Drivers/CMSIS/Include/core_cm4.h | 2129 -- .../Drivers/CMSIS/Include/core_cm55.h | 4817 ----- .../Drivers/CMSIS/Include/core_cm7.h | 2366 --- .../Drivers/CMSIS/Include/core_cm85.h | 4672 ----- .../Drivers/CMSIS/Include/core_sc000.h | 1030 - .../Drivers/CMSIS/Include/core_sc300.h | 1917 -- .../Drivers/CMSIS/Include/core_starmc1.h | 3592 ---- .../Drivers/CMSIS/Include/mpu_armv7.h | 275 - .../Drivers/CMSIS/Include/mpu_armv8.h | 352 - .../Drivers/CMSIS/Include/pac_armv81.h | 206 - .../Drivers/CMSIS/Include/pmu_armv8.h | 337 - .../Drivers/CMSIS/Include/tz_context.h | 70 - .../Drivers/CMSIS/LICENSE.txt | 201 - .../Inc/Legacy/stm32_hal_legacy.h | 4422 ---- .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h | 297 - .../Inc/stm32f4xx_hal_cortex.h | 410 - .../Inc/stm32f4xx_hal_def.h | 212 - .../Inc/stm32f4xx_hal_dma.h | 802 - .../Inc/stm32f4xx_hal_dma2d.h | 638 - .../Inc/stm32f4xx_hal_dma_ex.h | 102 - .../Inc/stm32f4xx_hal_dsi.h | 1377 -- .../Inc/stm32f4xx_hal_exti.h | 366 - .../Inc/stm32f4xx_hal_flash.h | 425 - .../Inc/stm32f4xx_hal_flash_ex.h | 1063 - .../Inc/stm32f4xx_hal_flash_ramfunc.h | 76 - .../Inc/stm32f4xx_hal_gpio.h | 325 - .../Inc/stm32f4xx_hal_gpio_ex.h | 1590 -- .../Inc/stm32f4xx_hal_i2c.h | 741 - .../Inc/stm32f4xx_hal_i2c_ex.h | 115 - .../Inc/stm32f4xx_hal_ltdc.h | 720 - .../Inc/stm32f4xx_hal_ltdc_ex.h | 83 - .../Inc/stm32f4xx_hal_nand.h | 387 - .../Inc/stm32f4xx_hal_nor.h | 330 - .../Inc/stm32f4xx_hal_pccard.h | 286 - .../Inc/stm32f4xx_hal_pwr.h | 436 - .../Inc/stm32f4xx_hal_pwr_ex.h | 340 - .../Inc/stm32f4xx_hal_rcc.h | 1458 -- .../Inc/stm32f4xx_hal_rcc_ex.h | 7190 ------- .../Inc/stm32f4xx_hal_sdram.h | 238 - .../Inc/stm32f4xx_hal_spi.h | 733 - .../Inc/stm32f4xx_hal_sram.h | 236 - .../Inc/stm32f4xx_hal_tim.h | 2157 -- .../Inc/stm32f4xx_hal_tim_ex.h | 357 - .../Inc/stm32f4xx_hal_uart.h | 909 - .../Inc/stm32f4xx_ll_bus.h | 2105 -- .../Inc/stm32f4xx_ll_cortex.h | 647 - .../Inc/stm32f4xx_ll_dma.h | 2868 --- .../Inc/stm32f4xx_ll_dma2d.h | 1900 -- .../Inc/stm32f4xx_ll_exti.h | 954 - .../Inc/stm32f4xx_ll_fmc.h | 1423 -- .../Inc/stm32f4xx_ll_gpio.h | 981 - .../Inc/stm32f4xx_ll_i2c.h | 1890 -- .../Inc/stm32f4xx_ll_pwr.h | 985 - .../Inc/stm32f4xx_ll_rcc.h | 7101 ------- .../Inc/stm32f4xx_ll_spi.h | 2042 -- .../Inc/stm32f4xx_ll_system.h | 1711 -- .../Inc/stm32f4xx_ll_usart.h | 2521 --- .../Inc/stm32f4xx_ll_utils.h | 307 - .../Drivers/STM32F4xx_HAL_Driver/LICENSE.txt | 6 - .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c | 616 - .../Src/stm32f4xx_hal_cortex.c | 538 - .../Src/stm32f4xx_hal_dma.c | 1305 -- .../Src/stm32f4xx_hal_dma2d.c | 2127 -- .../Src/stm32f4xx_hal_dma_ex.c | 313 - .../Src/stm32f4xx_hal_dsi.c | 3172 --- .../Src/stm32f4xx_hal_exti.c | 553 - .../Src/stm32f4xx_hal_flash.c | 776 - .../Src/stm32f4xx_hal_flash_ex.c | 1344 -- .../Src/stm32f4xx_hal_flash_ramfunc.c | 172 - .../Src/stm32f4xx_hal_gpio.c | 533 - .../Src/stm32f4xx_hal_i2c.c | 7567 ------- .../Src/stm32f4xx_hal_i2c_ex.c | 182 - .../Src/stm32f4xx_hal_ltdc.c | 2215 -- .../Src/stm32f4xx_hal_ltdc_ex.c | 154 - .../Src/stm32f4xx_hal_nand.c | 2395 --- .../Src/stm32f4xx_hal_nor.c | 1641 -- .../Src/stm32f4xx_hal_pccard.c | 961 - .../Src/stm32f4xx_hal_pwr.c | 598 - .../Src/stm32f4xx_hal_pwr_ex.c | 600 - .../Src/stm32f4xx_hal_rcc.c | 1124 - .../Src/stm32f4xx_hal_rcc_ex.c | 3833 ---- .../Src/stm32f4xx_hal_sdram.c | 1313 -- .../Src/stm32f4xx_hal_spi.c | 3945 ---- .../Src/stm32f4xx_hal_sram.c | 1117 - .../Src/stm32f4xx_hal_tim.c | 7629 ------- .../Src/stm32f4xx_hal_tim_ex.c | 2410 --- .../Src/stm32f4xx_hal_uart.c | 3807 ---- .../Src/stm32f4xx_ll_fmc.c | 1497 -- .../Middlewares/ST/ARM/DSP/Inc/arm_math.h | 8970 -------- .../ST/ARM/DSP/Lib/libarm_cortexM4lf_math.a | Bin 6421864 -> 0 bytes .../Third_Party/ARM/DSP/LICENSE.txt | 201 - .../STM32F429ZIT6_STARM/STM32F429XX_FLASH.ld | 269 - .../STM32F429ZIT6_STARM.ioc | 513 - .../cmake/gcc-arm-none-eabi.cmake | 43 - .../cmake/starm-clang.cmake | 65 - .../cmake/stm32cubemx/CMakeLists.txt | 116 - .../STM32F429ZIT6_STARM/startup_stm32f429xx.s | 543 - .../stm32f429zit6_flash.ld | 276 - cmake/starm-clang.cmake | 65 - justfile | 11 - 151 files changed, 197293 deletions(-) delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/.mxproject delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/CMakeLists.txt delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/CMakePresets.json delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Inc/dma.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Inc/dma2d.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Inc/fmc.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Inc/gpio.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Inc/i2c.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Inc/ltdc.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Inc/main.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Inc/spi.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Inc/stm32f4xx_hal_conf.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Inc/stm32f4xx_it.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Inc/usart.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Src/dma.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Src/dma2d.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Src/fmc.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Src/gpio.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Src/i2c.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Src/ltdc.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Src/main.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Src/spi.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Src/stm32f4xx_hal_msp.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Src/stm32f4xx_hal_timebase_tim.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Src/stm32f4xx_it.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Src/syscalls.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Src/sysmem.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Src/system_stm32f4xx.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Core/Src/usart.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f429xx.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cachel1_armv7.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_armcc.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_armclang.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_armclang_ltm.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_compiler.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_gcc.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_iccarm.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_version.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_armv81mml.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_armv8mbl.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_armv8mml.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm0.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm0plus.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm1.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm23.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm3.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm33.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm35p.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm4.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm55.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm7.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm85.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_sc000.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_sc300.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_starmc1.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/mpu_armv7.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/mpu_armv8.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/pac_armv81.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/pmu_armv8.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/tz_context.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/LICENSE.txt delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma2d.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dsi.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc_ex.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nand.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nor.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pccard.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sram.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma2d.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Middlewares/ST/ARM/DSP/Inc/arm_math.h delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Middlewares/ST/ARM/DSP/Lib/libarm_cortexM4lf_math.a delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/Middlewares/Third_Party/ARM/DSP/LICENSE.txt delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/STM32F429XX_FLASH.ld delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/STM32F429ZIT6_STARM.ioc delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/cmake/gcc-arm-none-eabi.cmake delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/cmake/starm-clang.cmake delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/cmake/stm32cubemx/CMakeLists.txt delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/startup_stm32f429xx.s delete mode 100644 L1_MCU/STM32F429ZIT6_STARM/stm32f429zit6_flash.ld delete mode 100644 cmake/starm-clang.cmake diff --git a/L1_MCU/STM32F429ZIT6_STARM/.mxproject b/L1_MCU/STM32F429ZIT6_STARM/.mxproject deleted file mode 100644 index 299347a..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/.mxproject +++ /dev/null @@ -1,50 +0,0 @@ -[PreviousLibFiles] -LibFiles=Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma2d.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma2d.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dmamux.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nor.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sram.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nand.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pccard.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dsi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma2d.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma2d.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dmamux.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nor.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sram.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nand.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pccard.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dsi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f429xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;Drivers/CMSIS/Include/core_cm35p.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/pmu_armv8.h;Drivers/CMSIS/Include/cachel1_armv7.h;Drivers/CMSIS/Include/cmsis_armclang_ltm.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_cm55.h;Drivers/CMSIS/Include/tz_context.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/core_starmc1.h;Drivers/CMSIS/Include/core_cm85.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/pac_armv81.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/core_armv81mml.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm0plus.h; - -[PreviousUsedCMakes] -SourceFiles=Core/Src/main.c;Core/Src/gpio.c;Core/Src/dma.c;Core/Src/dma2d.c;Core/Src/fmc.c;Core/Src/i2c.c;Core/Src/ltdc.c;Core/Src/spi.c;Core/Src/usart.c;Core/Src/stm32f4xx_it.c;Core/Src/stm32f4xx_hal_msp.c;Core/Src/stm32f4xx_hal_timebase_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;Core/Src/system_stm32f4xx.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;Core/Src/system_stm32f4xx.c;;; -HeaderPath=Drivers/STM32F4xx_HAL_Driver/Inc;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;Drivers/CMSIS/Device/ST/STM32F4xx/Include;Drivers/CMSIS/Include;Middlewares/ST/ARM/DSP/Inc;Core/Inc; -CDefines=USE_HAL_DRIVER;STM32F429xx;USE_HAL_DRIVER;USE_HAL_DRIVER; - -[PreviousGenFiles] -AdvancedFolderStructure=true -HeaderFileListSize=11 -HeaderFiles#0=../Core/Inc/gpio.h -HeaderFiles#1=../Core/Inc/dma.h -HeaderFiles#2=../Core/Inc/dma2d.h -HeaderFiles#3=../Core/Inc/fmc.h -HeaderFiles#4=../Core/Inc/i2c.h -HeaderFiles#5=../Core/Inc/ltdc.h -HeaderFiles#6=../Core/Inc/spi.h -HeaderFiles#7=../Core/Inc/usart.h -HeaderFiles#8=../Core/Inc/stm32f4xx_it.h -HeaderFiles#9=../Core/Inc/stm32f4xx_hal_conf.h -HeaderFiles#10=../Core/Inc/main.h -HeaderFolderListSize=1 -HeaderPath#0=../Core/Inc -HeaderFiles=; -SourceFileListSize=12 -SourceFiles#0=../Core/Src/gpio.c -SourceFiles#1=../Core/Src/dma.c -SourceFiles#2=../Core/Src/dma2d.c -SourceFiles#3=../Core/Src/fmc.c -SourceFiles#4=../Core/Src/i2c.c -SourceFiles#5=../Core/Src/ltdc.c -SourceFiles#6=../Core/Src/spi.c -SourceFiles#7=../Core/Src/usart.c -SourceFiles#8=../Core/Src/stm32f4xx_it.c -SourceFiles#9=../Core/Src/stm32f4xx_hal_msp.c -SourceFiles#10=../Core/Src/stm32f4xx_hal_timebase_tim.c -SourceFiles#11=../Core/Src/main.c -SourceFolderListSize=1 -SourcePath#0=../Core/Src -SourceFiles=; - -[ThirdPartyIp] -ThirdPartyIpNumber=1 -ThirdPartyIpName#0=STMicroelectronics.X-CUBE-ALGOBUILD.1.4.0 - -[ThirdPartyIp#STMicroelectronics.X-CUBE-ALGOBUILD.1.4.0] -library=../Middlewares/ST/ARM/DSP/Lib/libarm_cortexM4lf_math.a; -header=../Middlewares/ST/ARM/DSP/Inc/arm_math.h; - diff --git a/L1_MCU/STM32F429ZIT6_STARM/CMakeLists.txt b/L1_MCU/STM32F429ZIT6_STARM/CMakeLists.txt deleted file mode 100644 index d2dec07..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/CMakeLists.txt +++ /dev/null @@ -1,44 +0,0 @@ -# STM32 头文件路径 -set(MX_Include_Dirs - ${CMAKE_CURRENT_SOURCE_DIR}/Core/Inc - ${CMAKE_CURRENT_SOURCE_DIR}/Drivers/STM32F4xx_HAL_Driver/Inc - ${CMAKE_CURRENT_SOURCE_DIR}/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy - ${CMAKE_CURRENT_SOURCE_DIR}/Drivers/CMSIS/Device/ST/STM32F4xx/Include - ${CMAKE_CURRENT_SOURCE_DIR}/Drivers/CMSIS/Include - ${CMAKE_CURRENT_SOURCE_DIR}/Middlewares/ST/ARM/DSP/Inc -) - -# 收集源文件 -file(GLOB MX_Start_S ${CMAKE_CURRENT_SOURCE_DIR}/*.s) -aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/Core/Src MX_Core_Src) -aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/Drivers/STM32F4xx_HAL_Driver/Src MX_Driver_Src) - -# 直接将源文件添加到 l1_mcu OBJECT 库中 -# CMake 不支持 OBJECT 库的嵌套对象文件传递,所以不创建 cubemx_hal 子库 -target_sources(l1_mcu PRIVATE - ${MX_Start_S} - ${MX_Core_Src} - ${MX_Driver_Src} - ${CMAKE_CURRENT_SOURCE_DIR}/Middlewares/ST/ARM/DSP/Lib/libarm_cortexM4lf_math.a -) - -# 将头文件路径和宏定义传递给 l1_mcu -target_include_directories(l1_mcu PUBLIC - ${MX_Include_Dirs} -) - -target_compile_definitions(l1_mcu PUBLIC - USE_HAL_DRIVER - STM32F429xx - $<$:DEBUG> -) - -# 链接脚本内存参数 -set(EK_FLASH_ORIGIN "0x08000000" PARENT_SCOPE) -set(EK_FLASH_LENGTH "2048K" PARENT_SCOPE) -set(EK_RAM_ORIGIN "0x20000000" PARENT_SCOPE) -set(EK_RAM_LENGTH "192K" PARENT_SCOPE) -set(EK_CCMRAM_ORIGIN "0x10000000" PARENT_SCOPE) -set(EK_CCMRAM_LENGTH "64K" PARENT_SCOPE) -set(EK_SDRAM1_ORIGIN "0xD0000000" PARENT_SCOPE) -set(EK_SDRAM1_LENGTH "8M" PARENT_SCOPE) diff --git a/L1_MCU/STM32F429ZIT6_STARM/CMakePresets.json b/L1_MCU/STM32F429ZIT6_STARM/CMakePresets.json deleted file mode 100644 index 5324542..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/CMakePresets.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "version": 3, - "configurePresets": [ - { - "name": "default", - "hidden": true, - "generator": "Ninja", - "binaryDir": "${sourceDir}/build/${presetName}", - "toolchainFile": "${sourceDir}/cmake/starm-clang.cmake", - "cacheVariables": { - } - }, - { - "name": "Debug", - "inherits": "default", - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Debug" - } - }, - { - "name": "Release", - "inherits": "default", - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Release" - } - } - ], - "buildPresets": [ - { - "name": "Debug", - "configurePreset": "Debug" - }, - { - "name": "Release", - "configurePreset": "Release" - } - ] -} \ No newline at end of file diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/dma.h b/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/dma.h deleted file mode 100644 index cbf3957..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/dma.h +++ /dev/null @@ -1,52 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file dma.h - * @brief This file contains all the function prototypes for - * the dma.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __DMA_H__ -#define __DMA_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* DMA memory to memory transfer handles -------------------------------------*/ - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_DMA_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __DMA_H__ */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/dma2d.h b/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/dma2d.h deleted file mode 100644 index 2bcacf5..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/dma2d.h +++ /dev/null @@ -1,52 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file dma2d.h - * @brief This file contains all the function prototypes for - * the dma2d.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __DMA2D_H__ -#define __DMA2D_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern DMA2D_HandleTypeDef hdma2d; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_DMA2D_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __DMA2D_H__ */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/fmc.h b/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/fmc.h deleted file mode 100644 index e030809..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/fmc.h +++ /dev/null @@ -1,59 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * File Name : FMC.h - * Description : This file provides code for the configuration - * of the FMC peripheral. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __FMC_H -#define __FMC_H -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern SDRAM_HandleTypeDef hsdram1; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_FMC_Init(void); -void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef* hsdram); -void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef* hsdram); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif -#endif /*__FMC_H */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/gpio.h b/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/gpio.h deleted file mode 100644 index 1204b1d..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/gpio.h +++ /dev/null @@ -1,49 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file gpio.h - * @brief This file contains all the function prototypes for - * the gpio.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GPIO_H__ -#define __GPIO_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_GPIO_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif -#endif /*__ GPIO_H__ */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/i2c.h b/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/i2c.h deleted file mode 100644 index f7172c7..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/i2c.h +++ /dev/null @@ -1,52 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file i2c.h - * @brief This file contains all the function prototypes for - * the i2c.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __I2C_H__ -#define __I2C_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern I2C_HandleTypeDef hi2c3; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_I2C3_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __I2C_H__ */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/ltdc.h b/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/ltdc.h deleted file mode 100644 index 3e1d742..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/ltdc.h +++ /dev/null @@ -1,52 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file ltdc.h - * @brief This file contains all the function prototypes for - * the ltdc.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __LTDC_H__ -#define __LTDC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern LTDC_HandleTypeDef hltdc; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_LTDC_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __LTDC_H__ */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/main.h b/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/main.h deleted file mode 100644 index f01bff5..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/main.h +++ /dev/null @@ -1,81 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.h - * @brief : Header for main.c file. - * This file contains the common defines of the application. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MAIN_H -#define __MAIN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ - -/* USER CODE END ET */ - -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ - -/* USER CODE END EC */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void Error_Handler(void); - -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -/* Private defines -----------------------------------------------------------*/ -#define LCD_NCS_Pin GPIO_PIN_2 -#define LCD_NCS_GPIO_Port GPIOC -#define USER_KEY_Pin GPIO_PIN_0 -#define USER_KEY_GPIO_Port GPIOA -#define LCD_RDX_Pin GPIO_PIN_12 -#define LCD_RDX_GPIO_Port GPIOD -#define LCD_WRX_Pin GPIO_PIN_13 -#define LCD_WRX_GPIO_Port GPIOD -#define LED_GREEN_Pin GPIO_PIN_13 -#define LED_GREEN_GPIO_Port GPIOG -#define LED_RED_Pin GPIO_PIN_14 -#define LED_RED_GPIO_Port GPIOG - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -#ifdef __cplusplus -} -#endif - -#endif /* __MAIN_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/spi.h b/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/spi.h deleted file mode 100644 index 8fe8dfc..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/spi.h +++ /dev/null @@ -1,52 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file spi.h - * @brief This file contains all the function prototypes for - * the spi.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPI_H__ -#define __SPI_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern SPI_HandleTypeDef hspi5; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_SPI5_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __SPI_H__ */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/stm32f4xx_hal_conf.h b/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/stm32f4xx_hal_conf.h deleted file mode 100644 index d0ca2fb..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/stm32f4xx_hal_conf.h +++ /dev/null @@ -1,495 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_hal_conf_template.h - * @author MCD Application Team - * @brief HAL configuration template file. - * This file should be copied to the application folder and renamed - * to stm32f4xx_hal_conf.h. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_CONF_H -#define __STM32F4xx_HAL_CONF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED - - /* #define HAL_CRYP_MODULE_ENABLED */ -/* #define HAL_ADC_MODULE_ENABLED */ -/* #define HAL_CAN_MODULE_ENABLED */ -/* #define HAL_CRC_MODULE_ENABLED */ -/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ -/* #define HAL_DAC_MODULE_ENABLED */ -/* #define HAL_DCMI_MODULE_ENABLED */ -#define HAL_DMA2D_MODULE_ENABLED -/* #define HAL_ETH_MODULE_ENABLED */ -/* #define HAL_ETH_LEGACY_MODULE_ENABLED */ -/* #define HAL_NAND_MODULE_ENABLED */ -/* #define HAL_NOR_MODULE_ENABLED */ -/* #define HAL_PCCARD_MODULE_ENABLED */ -/* #define HAL_SRAM_MODULE_ENABLED */ -#define HAL_SDRAM_MODULE_ENABLED -/* #define HAL_HASH_MODULE_ENABLED */ -#define HAL_I2C_MODULE_ENABLED -/* #define HAL_I2S_MODULE_ENABLED */ -/* #define HAL_IWDG_MODULE_ENABLED */ -#define HAL_LTDC_MODULE_ENABLED -/* #define HAL_RNG_MODULE_ENABLED */ -/* #define HAL_RTC_MODULE_ENABLED */ -/* #define HAL_SAI_MODULE_ENABLED */ -/* #define HAL_SD_MODULE_ENABLED */ -/* #define HAL_MMC_MODULE_ENABLED */ -#define HAL_SPI_MODULE_ENABLED -#define HAL_TIM_MODULE_ENABLED -#define HAL_UART_MODULE_ENABLED -/* #define HAL_USART_MODULE_ENABLED */ -/* #define HAL_IRDA_MODULE_ENABLED */ -/* #define HAL_SMARTCARD_MODULE_ENABLED */ -/* #define HAL_SMBUS_MODULE_ENABLED */ -/* #define HAL_WWDG_MODULE_ENABLED */ -/* #define HAL_PCD_MODULE_ENABLED */ -/* #define HAL_HCD_MODULE_ENABLED */ -/* #define HAL_DSI_MODULE_ENABLED */ -/* #define HAL_QSPI_MODULE_ENABLED */ -/* #define HAL_QSPI_MODULE_ENABLED */ -/* #define HAL_CEC_MODULE_ENABLED */ -/* #define HAL_FMPI2C_MODULE_ENABLED */ -/* #define HAL_FMPSMBUS_MODULE_ENABLED */ -/* #define HAL_SPDIFRX_MODULE_ENABLED */ -/* #define HAL_DFSDM_MODULE_ENABLED */ -/* #define HAL_LPTIM_MODULE_ENABLED */ -#define HAL_GPIO_MODULE_ENABLED -#define HAL_EXTI_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED - -/* ########################## HSE/HSI Values adaptation ##################### */ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined (LSI_VALUE) - #define LSI_VALUE 32000U /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature.*/ -/** - * @brief External Low Speed oscillator (LSE) value. - */ -#if !defined (LSE_VALUE) - #define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -#if !defined (LSE_STARTUP_TIMEOUT) - #define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -/** - * @brief External clock source for I2S peripheral - * This value is used by the I2S HAL module to compute the I2S clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined (EXTERNAL_CLOCK_VALUE) - #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External audio frequency in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#define VDD_VALUE 3300U /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */ -#define USE_RTOS 0U -#define PREFETCH_ENABLE 1U -#define INSTRUCTION_CACHE_ENABLE 1U -#define DATA_CACHE_ENABLE 1U - -#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ -#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ -#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ -#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ -#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ -#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ -#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ -#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ -#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ -#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ -#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ -#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ -#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ -#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ -#define USE_HAL_FMPSMBUS_REGISTER_CALLBACKS 0U /* FMPSMBUS register callback disabled */ -#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ -#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ -#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ -#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ -#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ -#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ -#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ -#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ -#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ -#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ -#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ -#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ -#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ -#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ -#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ -#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ -#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ -#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ -#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ -#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ -#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ -#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ -#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ -#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1U */ - -/* ################## Ethernet peripheral configuration ##################### */ - -/* Section 1 : Ethernet peripheral configuration */ - -/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ -#define MAC_ADDR0 2U -#define MAC_ADDR1 0U -#define MAC_ADDR2 0U -#define MAC_ADDR3 0U -#define MAC_ADDR4 0U -#define MAC_ADDR5 0U - -/* Definition of the Ethernet driver buffers size and count */ -#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ -#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ -#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ - -/* Section 2: PHY configuration section */ - -/* DP83848_PHY_ADDRESS Address*/ -#define DP83848_PHY_ADDRESS -/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ -#define PHY_RESET_DELAY 0x000000FFU -/* PHY Configuration delay */ -#define PHY_CONFIG_DELAY 0x00000FFFU - -#define PHY_READ_TO 0x0000FFFFU -#define PHY_WRITE_TO 0x0000FFFFU - -/* Section 3: Common PHY Registers */ - -#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ -#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ - -#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ -#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ -#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ -#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ -#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ -#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ -#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ -#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ -#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ -#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ - -#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ -#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ -#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ - -/* Section 4: Extended PHY Registers */ -#define PHY_SR ((uint16_t)) /*!< PHY status register Offset */ - -#define PHY_SPEED_STATUS ((uint16_t)) /*!< PHY Speed mask */ -#define PHY_DUPLEX_STATUS ((uint16_t)) /*!< PHY Duplex mask */ - -/* ################## SPI peripheral configuration ########################## */ - -/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver -* Activated: CRC code is present inside driver -* Deactivated: CRC code cleaned from driver -*/ - -#define USE_SPI_CRC 0U - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED - #include "stm32f4xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED - #include "stm32f4xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED - #include "stm32f4xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED - #include "stm32f4xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - #include "stm32f4xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED - #include "stm32f4xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_CAN_MODULE_ENABLED - #include "stm32f4xx_hal_can.h" -#endif /* HAL_CAN_MODULE_ENABLED */ - -#ifdef HAL_CAN_LEGACY_MODULE_ENABLED - #include "stm32f4xx_hal_can_legacy.h" -#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED - #include "stm32f4xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED - #include "stm32f4xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DMA2D_MODULE_ENABLED - #include "stm32f4xx_hal_dma2d.h" -#endif /* HAL_DMA2D_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED - #include "stm32f4xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_DCMI_MODULE_ENABLED - #include "stm32f4xx_hal_dcmi.h" -#endif /* HAL_DCMI_MODULE_ENABLED */ - -#ifdef HAL_ETH_MODULE_ENABLED - #include "stm32f4xx_hal_eth.h" -#endif /* HAL_ETH_MODULE_ENABLED */ - -#ifdef HAL_ETH_LEGACY_MODULE_ENABLED - #include "stm32f4xx_hal_eth_legacy.h" -#endif /* HAL_ETH_LEGACY_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED - #include "stm32f4xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED - #include "stm32f4xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED - #include "stm32f4xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_PCCARD_MODULE_ENABLED - #include "stm32f4xx_hal_pccard.h" -#endif /* HAL_PCCARD_MODULE_ENABLED */ - -#ifdef HAL_SDRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sdram.h" -#endif /* HAL_SDRAM_MODULE_ENABLED */ - -#ifdef HAL_HASH_MODULE_ENABLED - #include "stm32f4xx_hal_hash.h" -#endif /* HAL_HASH_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED - #include "stm32f4xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED - #include "stm32f4xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED - #include "stm32f4xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED - #include "stm32f4xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_LTDC_MODULE_ENABLED - #include "stm32f4xx_hal_ltdc.h" -#endif /* HAL_LTDC_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED - #include "stm32f4xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED - #include "stm32f4xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED - #include "stm32f4xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED - #include "stm32f4xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED - #include "stm32f4xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED - #include "stm32f4xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED - #include "stm32f4xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED - #include "stm32f4xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED - #include "stm32f4xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED - #include "stm32f4xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED - #include "stm32f4xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED - #include "stm32f4xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED - #include "stm32f4xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED - #include "stm32f4xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -#ifdef HAL_DSI_MODULE_ENABLED - #include "stm32f4xx_hal_dsi.h" -#endif /* HAL_DSI_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED - #include "stm32f4xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_CEC_MODULE_ENABLED - #include "stm32f4xx_hal_cec.h" -#endif /* HAL_CEC_MODULE_ENABLED */ - -#ifdef HAL_FMPI2C_MODULE_ENABLED - #include "stm32f4xx_hal_fmpi2c.h" -#endif /* HAL_FMPI2C_MODULE_ENABLED */ - -#ifdef HAL_FMPSMBUS_MODULE_ENABLED - #include "stm32f4xx_hal_fmpsmbus.h" -#endif /* HAL_FMPSMBUS_MODULE_ENABLED */ - -#ifdef HAL_SPDIFRX_MODULE_ENABLED - #include "stm32f4xx_hal_spdifrx.h" -#endif /* HAL_SPDIFRX_MODULE_ENABLED */ - -#ifdef HAL_DFSDM_MODULE_ENABLED - #include "stm32f4xx_hal_dfsdm.h" -#endif /* HAL_DFSDM_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED - #include "stm32f4xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -#ifdef HAL_MMC_MODULE_ENABLED - #include "stm32f4xx_hal_mmc.h" -#endif /* HAL_MMC_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_CONF_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/stm32f4xx_it.h b/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/stm32f4xx_it.h deleted file mode 100644 index 35030e0..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/stm32f4xx_it.h +++ /dev/null @@ -1,70 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_it.h - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_IT_H -#define __STM32F4xx_IT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ - -/* USER CODE END ET */ - -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ - -/* USER CODE END EC */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void NMI_Handler(void); -void HardFault_Handler(void); -void MemManage_Handler(void); -void BusFault_Handler(void); -void UsageFault_Handler(void); -void SVC_Handler(void); -void DebugMon_Handler(void); -void PendSV_Handler(void); -void SysTick_Handler(void); -void USART1_IRQHandler(void); -void TIM6_DAC_IRQHandler(void); -void DMA2_Stream2_IRQHandler(void); -void DMA2_Stream7_IRQHandler(void); -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_IT_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/usart.h b/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/usart.h deleted file mode 100644 index a13cfca..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Inc/usart.h +++ /dev/null @@ -1,52 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file usart.h - * @brief This file contains all the function prototypes for - * the usart.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USART_H__ -#define __USART_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern UART_HandleTypeDef huart1; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_USART1_UART_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USART_H__ */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/dma.c b/L1_MCU/STM32F429ZIT6_STARM/Core/Src/dma.c deleted file mode 100644 index 6791d3e..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/dma.c +++ /dev/null @@ -1,58 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file dma.c - * @brief This file provides code for the configuration - * of all the requested memory to memory DMA transfers. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "dma.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/*----------------------------------------------------------------------------*/ -/* Configure DMA */ -/*----------------------------------------------------------------------------*/ - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/** - * Enable DMA controller clock - */ -void MX_DMA_Init(void) -{ - - /* DMA controller clock enable */ - __HAL_RCC_DMA2_CLK_ENABLE(); - - /* DMA interrupt init */ - /* DMA2_Stream2_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 2, 0); - HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); - /* DMA2_Stream7_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 2, 0); - HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); - -} - -/* USER CODE BEGIN 2 */ - -/* USER CODE END 2 */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/dma2d.c b/L1_MCU/STM32F429ZIT6_STARM/Core/Src/dma2d.c deleted file mode 100644 index cd948b7..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/dma2d.c +++ /dev/null @@ -1,96 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file dma2d.c - * @brief This file provides code for the configuration - * of the DMA2D instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "dma2d.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -DMA2D_HandleTypeDef hdma2d; - -/* DMA2D init function */ -void MX_DMA2D_Init(void) -{ - - /* USER CODE BEGIN DMA2D_Init 0 */ - - /* USER CODE END DMA2D_Init 0 */ - - /* USER CODE BEGIN DMA2D_Init 1 */ - - /* USER CODE END DMA2D_Init 1 */ - hdma2d.Instance = DMA2D; - hdma2d.Init.Mode = DMA2D_M2M; - hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB565; - hdma2d.Init.OutputOffset = 0; - hdma2d.LayerCfg[1].InputOffset = 0; - hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB565; - hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA; - hdma2d.LayerCfg[1].InputAlpha = 0; - if (HAL_DMA2D_Init(&hdma2d) != HAL_OK) - { - Error_Handler(); - } - if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN DMA2D_Init 2 */ - - /* USER CODE END DMA2D_Init 2 */ - -} - -void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef* dma2dHandle) -{ - - if(dma2dHandle->Instance==DMA2D) - { - /* USER CODE BEGIN DMA2D_MspInit 0 */ - - /* USER CODE END DMA2D_MspInit 0 */ - /* DMA2D clock enable */ - __HAL_RCC_DMA2D_CLK_ENABLE(); - /* USER CODE BEGIN DMA2D_MspInit 1 */ - - /* USER CODE END DMA2D_MspInit 1 */ - } -} - -void HAL_DMA2D_MspDeInit(DMA2D_HandleTypeDef* dma2dHandle) -{ - - if(dma2dHandle->Instance==DMA2D) - { - /* USER CODE BEGIN DMA2D_MspDeInit 0 */ - - /* USER CODE END DMA2D_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_DMA2D_CLK_DISABLE(); - /* USER CODE BEGIN DMA2D_MspDeInit 1 */ - - /* USER CODE END DMA2D_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/fmc.c b/L1_MCU/STM32F429ZIT6_STARM/Core/Src/fmc.c deleted file mode 100644 index 4d0fa3f..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/fmc.c +++ /dev/null @@ -1,298 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * File Name : FMC.c - * Description : This file provides code for the configuration - * of the FMC peripheral. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "fmc.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -SDRAM_HandleTypeDef hsdram1; - -/* FMC initialization function */ -void MX_FMC_Init(void) -{ - /* USER CODE BEGIN FMC_Init 0 */ - - /* USER CODE END FMC_Init 0 */ - - FMC_SDRAM_TimingTypeDef SdramTiming = {0}; - - /* USER CODE BEGIN FMC_Init 1 */ - - /* USER CODE END FMC_Init 1 */ - - /** Perform the SDRAM1 memory initialization sequence - */ - hsdram1.Instance = FMC_SDRAM_DEVICE; - /* hsdram1.Init */ - hsdram1.Init.SDBank = FMC_SDRAM_BANK2; - hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8; - hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12; - hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16; - hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; - hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3; - hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; - hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2; - hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE; - hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; - /* SdramTiming */ - SdramTiming.LoadToActiveDelay = 2; - SdramTiming.ExitSelfRefreshDelay = 7; - SdramTiming.SelfRefreshTime = 4; - SdramTiming.RowCycleDelay = 7; - SdramTiming.WriteRecoveryTime = 3; - SdramTiming.RPDelay = 2; - SdramTiming.RCDDelay = 2; - - if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK) - { - Error_Handler( ); - } - - /* USER CODE BEGIN FMC_Init 2 */ - - /* USER CODE END FMC_Init 2 */ -} - -static uint32_t FMC_Initialized = 0; - -static void HAL_FMC_MspInit(void){ - /* USER CODE BEGIN FMC_MspInit 0 */ - - /* USER CODE END FMC_MspInit 0 */ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (FMC_Initialized) { - return; - } - FMC_Initialized = 1; - - /* Peripheral clock enable */ - __HAL_RCC_FMC_CLK_ENABLE(); - - /** FMC GPIO Configuration - PF0 ------> FMC_A0 - PF1 ------> FMC_A1 - PF2 ------> FMC_A2 - PF3 ------> FMC_A3 - PF4 ------> FMC_A4 - PF5 ------> FMC_A5 - PC0 ------> FMC_SDNWE - PF11 ------> FMC_SDNRAS - PF12 ------> FMC_A6 - PF13 ------> FMC_A7 - PF14 ------> FMC_A8 - PF15 ------> FMC_A9 - PG0 ------> FMC_A10 - PG1 ------> FMC_A11 - PE7 ------> FMC_D4 - PE8 ------> FMC_D5 - PE9 ------> FMC_D6 - PE10 ------> FMC_D7 - PE11 ------> FMC_D8 - PE12 ------> FMC_D9 - PE13 ------> FMC_D10 - PE14 ------> FMC_D11 - PE15 ------> FMC_D12 - PD8 ------> FMC_D13 - PD9 ------> FMC_D14 - PD10 ------> FMC_D15 - PD14 ------> FMC_D0 - PD15 ------> FMC_D1 - PG4 ------> FMC_BA0 - PG5 ------> FMC_BA1 - PG8 ------> FMC_SDCLK - PD0 ------> FMC_D2 - PD1 ------> FMC_D3 - PG15 ------> FMC_SDNCAS - PB5 ------> FMC_SDCKE1 - PB6 ------> FMC_SDNE1 - PE0 ------> FMC_NBL0 - PE1 ------> FMC_NBL1 - */ - /* GPIO_InitStruct */ - GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 - |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_11|GPIO_PIN_12 - |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_FMC; - - HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); - - /* GPIO_InitStruct */ - GPIO_InitStruct.Pin = GPIO_PIN_0; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_FMC; - - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - /* GPIO_InitStruct */ - GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5 - |GPIO_PIN_8|GPIO_PIN_15; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_FMC; - - HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); - - /* GPIO_InitStruct */ - GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10 - |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14 - |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_FMC; - - HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); - - /* GPIO_InitStruct */ - GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14 - |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_FMC; - - HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - - /* GPIO_InitStruct */ - GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_FMC; - - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN FMC_MspInit 1 */ - - /* USER CODE END FMC_MspInit 1 */ -} - -void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef* sdramHandle){ - /* USER CODE BEGIN SDRAM_MspInit 0 */ - - /* USER CODE END SDRAM_MspInit 0 */ - HAL_FMC_MspInit(); - /* USER CODE BEGIN SDRAM_MspInit 1 */ - - /* USER CODE END SDRAM_MspInit 1 */ -} - -static uint32_t FMC_DeInitialized = 0; - -static void HAL_FMC_MspDeInit(void){ - /* USER CODE BEGIN FMC_MspDeInit 0 */ - - /* USER CODE END FMC_MspDeInit 0 */ - if (FMC_DeInitialized) { - return; - } - FMC_DeInitialized = 1; - /* Peripheral clock enable */ - __HAL_RCC_FMC_CLK_DISABLE(); - - /** FMC GPIO Configuration - PF0 ------> FMC_A0 - PF1 ------> FMC_A1 - PF2 ------> FMC_A2 - PF3 ------> FMC_A3 - PF4 ------> FMC_A4 - PF5 ------> FMC_A5 - PC0 ------> FMC_SDNWE - PF11 ------> FMC_SDNRAS - PF12 ------> FMC_A6 - PF13 ------> FMC_A7 - PF14 ------> FMC_A8 - PF15 ------> FMC_A9 - PG0 ------> FMC_A10 - PG1 ------> FMC_A11 - PE7 ------> FMC_D4 - PE8 ------> FMC_D5 - PE9 ------> FMC_D6 - PE10 ------> FMC_D7 - PE11 ------> FMC_D8 - PE12 ------> FMC_D9 - PE13 ------> FMC_D10 - PE14 ------> FMC_D11 - PE15 ------> FMC_D12 - PD8 ------> FMC_D13 - PD9 ------> FMC_D14 - PD10 ------> FMC_D15 - PD14 ------> FMC_D0 - PD15 ------> FMC_D1 - PG4 ------> FMC_BA0 - PG5 ------> FMC_BA1 - PG8 ------> FMC_SDCLK - PD0 ------> FMC_D2 - PD1 ------> FMC_D3 - PG15 ------> FMC_SDNCAS - PB5 ------> FMC_SDCKE1 - PB6 ------> FMC_SDNE1 - PE0 ------> FMC_NBL0 - PE1 ------> FMC_NBL1 - */ - - HAL_GPIO_DeInit(GPIOF, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 - |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_11|GPIO_PIN_12 - |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15); - - HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0); - - HAL_GPIO_DeInit(GPIOG, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5 - |GPIO_PIN_8|GPIO_PIN_15); - - HAL_GPIO_DeInit(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10 - |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14 - |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1); - - HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14 - |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1); - - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_5|GPIO_PIN_6); - - /* USER CODE BEGIN FMC_MspDeInit 1 */ - - /* USER CODE END FMC_MspDeInit 1 */ -} - -void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef* sdramHandle){ - /* USER CODE BEGIN SDRAM_MspDeInit 0 */ - - /* USER CODE END SDRAM_MspDeInit 0 */ - HAL_FMC_MspDeInit(); - /* USER CODE BEGIN SDRAM_MspDeInit 1 */ - - /* USER CODE END SDRAM_MspDeInit 1 */ -} -/** - * @} - */ - -/** - * @} - */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/gpio.c b/L1_MCU/STM32F429ZIT6_STARM/Core/Src/gpio.c deleted file mode 100644 index bad415d..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/gpio.c +++ /dev/null @@ -1,97 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file gpio.c - * @brief This file provides code for the configuration - * of all used GPIO pins. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "gpio.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/*----------------------------------------------------------------------------*/ -/* Configure GPIO */ -/*----------------------------------------------------------------------------*/ -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/** Configure pins as - * Analog - * Input - * Output - * EVENT_OUT - * EXTI -*/ -void MX_GPIO_Init(void) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOF_CLK_ENABLE(); - __HAL_RCC_GPIOH_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOG_CLK_ENABLE(); - __HAL_RCC_GPIOE_CLK_ENABLE(); - __HAL_RCC_GPIOD_CLK_ENABLE(); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(LCD_NCS_GPIO_Port, LCD_NCS_Pin, GPIO_PIN_RESET); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOD, LCD_RDX_Pin|LCD_WRX_Pin, GPIO_PIN_RESET); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOG, LED_GREEN_Pin|LED_RED_Pin, GPIO_PIN_RESET); - - /*Configure GPIO pin : LCD_NCS_Pin */ - GPIO_InitStruct.Pin = LCD_NCS_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - HAL_GPIO_Init(LCD_NCS_GPIO_Port, &GPIO_InitStruct); - - /*Configure GPIO pin : USER_KEY_Pin */ - GPIO_InitStruct.Pin = USER_KEY_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(USER_KEY_GPIO_Port, &GPIO_InitStruct); - - /*Configure GPIO pins : LCD_RDX_Pin LCD_WRX_Pin */ - GPIO_InitStruct.Pin = LCD_RDX_Pin|LCD_WRX_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - - /*Configure GPIO pins : LED_GREEN_Pin LED_RED_Pin */ - GPIO_InitStruct.Pin = LED_GREEN_Pin|LED_RED_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); - -} - -/* USER CODE BEGIN 2 */ - -/* USER CODE END 2 */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/i2c.c b/L1_MCU/STM32F429ZIT6_STARM/Core/Src/i2c.c deleted file mode 100644 index f90f4ee..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/i2c.c +++ /dev/null @@ -1,138 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file i2c.c - * @brief This file provides code for the configuration - * of the I2C instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "i2c.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -I2C_HandleTypeDef hi2c3; - -/* I2C3 init function */ -void MX_I2C3_Init(void) -{ - - /* USER CODE BEGIN I2C3_Init 0 */ - - /* USER CODE END I2C3_Init 0 */ - - /* USER CODE BEGIN I2C3_Init 1 */ - - /* USER CODE END I2C3_Init 1 */ - hi2c3.Instance = I2C3; - hi2c3.Init.ClockSpeed = 100000; - hi2c3.Init.DutyCycle = I2C_DUTYCYCLE_2; - hi2c3.Init.OwnAddress1 = 0; - hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; - hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; - hi2c3.Init.OwnAddress2 = 0; - hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; - hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - if (HAL_I2C_Init(&hi2c3) != HAL_OK) - { - Error_Handler(); - } - - /** Configure Analogue filter - */ - if (HAL_I2CEx_ConfigAnalogFilter(&hi2c3, I2C_ANALOGFILTER_ENABLE) != HAL_OK) - { - Error_Handler(); - } - - /** Configure Digital filter - */ - if (HAL_I2CEx_ConfigDigitalFilter(&hi2c3, 0) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN I2C3_Init 2 */ - - /* USER CODE END I2C3_Init 2 */ - -} - -void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(i2cHandle->Instance==I2C3) - { - /* USER CODE BEGIN I2C3_MspInit 0 */ - - /* USER CODE END I2C3_MspInit 0 */ - - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**I2C3 GPIO Configuration - PC9 ------> I2C3_SDA - PA8 ------> I2C3_SCL - */ - GPIO_InitStruct.Pin = GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C3; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_8; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C3; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* I2C3 clock enable */ - __HAL_RCC_I2C3_CLK_ENABLE(); - /* USER CODE BEGIN I2C3_MspInit 1 */ - - /* USER CODE END I2C3_MspInit 1 */ - } -} - -void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) -{ - - if(i2cHandle->Instance==I2C3) - { - /* USER CODE BEGIN I2C3_MspDeInit 0 */ - - /* USER CODE END I2C3_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_I2C3_CLK_DISABLE(); - - /**I2C3 GPIO Configuration - PC9 ------> I2C3_SDA - PA8 ------> I2C3_SCL - */ - HAL_GPIO_DeInit(GPIOC, GPIO_PIN_9); - - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_8); - - /* USER CODE BEGIN I2C3_MspDeInit 1 */ - - /* USER CODE END I2C3_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/ltdc.c b/L1_MCU/STM32F429ZIT6_STARM/Core/Src/ltdc.c deleted file mode 100644 index e88d32e..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/ltdc.c +++ /dev/null @@ -1,259 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file ltdc.c - * @brief This file provides code for the configuration - * of the LTDC instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "ltdc.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -LTDC_HandleTypeDef hltdc; - -/* LTDC init function */ -void MX_LTDC_Init(void) -{ - - /* USER CODE BEGIN LTDC_Init 0 */ - - /* USER CODE END LTDC_Init 0 */ - - LTDC_LayerCfgTypeDef pLayerCfg = {0}; - - /* USER CODE BEGIN LTDC_Init 1 */ - - /* USER CODE END LTDC_Init 1 */ - hltdc.Instance = LTDC; - hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL; - hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL; - hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL; - hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC; - hltdc.Init.HorizontalSync = 9; - hltdc.Init.VerticalSync = 1; - hltdc.Init.AccumulatedHBP = 29; - hltdc.Init.AccumulatedVBP = 3; - hltdc.Init.AccumulatedActiveW = 269; - hltdc.Init.AccumulatedActiveH = 323; - hltdc.Init.TotalWidth = 279; - hltdc.Init.TotalHeigh = 327; - hltdc.Init.Backcolor.Blue = 0; - hltdc.Init.Backcolor.Green = 0; - hltdc.Init.Backcolor.Red = 0; - if (HAL_LTDC_Init(&hltdc) != HAL_OK) - { - Error_Handler(); - } - pLayerCfg.WindowX0 = 0; - pLayerCfg.WindowX1 = 240; - pLayerCfg.WindowY0 = 0; - pLayerCfg.WindowY1 = 320; - pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; - pLayerCfg.Alpha = 255; - pLayerCfg.Alpha0 = 0; - pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; - pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; - pLayerCfg.FBStartAdress = 0; - pLayerCfg.ImageWidth = 240; - pLayerCfg.ImageHeight = 320; - pLayerCfg.Backcolor.Blue = 0; - pLayerCfg.Backcolor.Green = 0; - pLayerCfg.Backcolor.Red = 0; - if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN LTDC_Init 2 */ - - /* USER CODE END LTDC_Init 2 */ - -} - -void HAL_LTDC_MspInit(LTDC_HandleTypeDef* ltdcHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; - if(ltdcHandle->Instance==LTDC) - { - /* USER CODE BEGIN LTDC_MspInit 0 */ - - /* USER CODE END LTDC_MspInit 0 */ - - /** Initializes the peripherals clock - */ - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; - PeriphClkInitStruct.PLLSAI.PLLSAIN = 50; - PeriphClkInitStruct.PLLSAI.PLLSAIR = 4; - PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_4; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) - { - Error_Handler(); - } - - /* LTDC clock enable */ - __HAL_RCC_LTDC_CLK_ENABLE(); - - __HAL_RCC_GPIOF_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOG_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOD_CLK_ENABLE(); - /**LTDC GPIO Configuration - PF10 ------> LTDC_DE - PA3 ------> LTDC_B5 - PA4 ------> LTDC_VSYNC - PA6 ------> LTDC_G2 - PB0 ------> LTDC_R3 - PB1 ------> LTDC_R6 - PB10 ------> LTDC_G4 - PB11 ------> LTDC_G5 - PG6 ------> LTDC_R7 - PG7 ------> LTDC_CLK - PC6 ------> LTDC_HSYNC - PC7 ------> LTDC_G6 - PA11 ------> LTDC_R4 - PA12 ------> LTDC_R5 - PD3 ------> LTDC_G7 - PG10 ------> LTDC_G3 - PG11 ------> LTDC_B3 - PG12 ------> LTDC_B4 - PB8 ------> LTDC_B6 - PB9 ------> LTDC_B7 - */ - GPIO_InitStruct.Pin = GPIO_PIN_10; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF14_LTDC; - HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_11 - |GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF14_LTDC; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF9_LTDC; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_8|GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF14_LTDC; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_11; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF14_LTDC; - HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF14_LTDC; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_3; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF14_LTDC; - HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF9_LTDC; - HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); - - /* USER CODE BEGIN LTDC_MspInit 1 */ - - /* USER CODE END LTDC_MspInit 1 */ - } -} - -void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef* ltdcHandle) -{ - - if(ltdcHandle->Instance==LTDC) - { - /* USER CODE BEGIN LTDC_MspDeInit 0 */ - - /* USER CODE END LTDC_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_LTDC_CLK_DISABLE(); - - /**LTDC GPIO Configuration - PF10 ------> LTDC_DE - PA3 ------> LTDC_B5 - PA4 ------> LTDC_VSYNC - PA6 ------> LTDC_G2 - PB0 ------> LTDC_R3 - PB1 ------> LTDC_R6 - PB10 ------> LTDC_G4 - PB11 ------> LTDC_G5 - PG6 ------> LTDC_R7 - PG7 ------> LTDC_CLK - PC6 ------> LTDC_HSYNC - PC7 ------> LTDC_G6 - PA11 ------> LTDC_R4 - PA12 ------> LTDC_R5 - PD3 ------> LTDC_G7 - PG10 ------> LTDC_G3 - PG11 ------> LTDC_B3 - PG12 ------> LTDC_B4 - PB8 ------> LTDC_B6 - PB9 ------> LTDC_B7 - */ - HAL_GPIO_DeInit(GPIOF, GPIO_PIN_10); - - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_11 - |GPIO_PIN_12); - - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11 - |GPIO_PIN_8|GPIO_PIN_9); - - HAL_GPIO_DeInit(GPIOG, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_10|GPIO_PIN_11 - |GPIO_PIN_12); - - HAL_GPIO_DeInit(GPIOC, GPIO_PIN_6|GPIO_PIN_7); - - HAL_GPIO_DeInit(GPIOD, GPIO_PIN_3); - - /* USER CODE BEGIN LTDC_MspDeInit 1 */ - - /* USER CODE END LTDC_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/main.c b/L1_MCU/STM32F429ZIT6_STARM/Core/Src/main.c deleted file mode 100644 index be91ee2..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/main.c +++ /dev/null @@ -1,229 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.c - * @brief : Main program body - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -#include "dma.h" -#include "dma2d.h" -#include "i2c.h" -#include "ltdc.h" -#include "spi.h" -#include "usart.h" -#include "gpio.h" -#include "fmc.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN PTD */ - -/* USER CODE END PTD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ - -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -void SystemClock_Config(void); -/* USER CODE BEGIN PFP */ -extern void ek_main(void); -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/** - * @brief The application entry point. - * @retval int - */ -int main(void) -{ - - /* USER CODE BEGIN 1 */ - - /* USER CODE END 1 */ - - /* MCU Configuration--------------------------------------------------------*/ - - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); - - /* USER CODE BEGIN Init */ - - /* USER CODE END Init */ - - /* Configure the system clock */ - SystemClock_Config(); - - /* USER CODE BEGIN SysInit */ - - /* USER CODE END SysInit */ - - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_DMA_Init(); - MX_USART1_UART_Init(); - MX_LTDC_Init(); - MX_FMC_Init(); - MX_SPI5_Init(); - MX_I2C3_Init(); - MX_DMA2D_Init(); - /* USER CODE BEGIN 2 */ - ek_main(); - /* USER CODE END 2 */ - - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - while (1) - { - /* USER CODE END WHILE */ - - /* USER CODE BEGIN 3 */ - } - /* USER CODE END 3 */ -} - -/** - * @brief System Clock Configuration - * @retval None - */ -void SystemClock_Config(void) -{ - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - - /** Configure the main internal regulator output voltage - */ - __HAL_RCC_PWR_CLK_ENABLE(); - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - - /** Initializes the RCC Oscillators according to the specified parameters - * in the RCC_OscInitTypeDef structure. - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 4; - RCC_OscInitStruct.PLL.PLLN = 180; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 8; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) - { - Error_Handler(); - } - - /** Activate the Over-Drive mode - */ - if (HAL_PWREx_EnableOverDrive() != HAL_OK) - { - Error_Handler(); - } - - /** Initializes the CPU, AHB and APB buses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) - { - Error_Handler(); - } - - /** Enables the Clock Security System - */ - HAL_RCC_EnableCSS(); -} - -/* USER CODE BEGIN 4 */ - -/* USER CODE END 4 */ - -/** - * @brief Period elapsed callback in non blocking mode - * @note This function is called when TIM6 interrupt took place, inside - * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment - * a global variable "uwTick" used as application time base. - * @param htim : TIM handle - * @retval None - */ -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) -{ - /* USER CODE BEGIN Callback 0 */ - - /* USER CODE END Callback 0 */ - if (htim->Instance == TIM6) - { - HAL_IncTick(); - } - /* USER CODE BEGIN Callback 1 */ - - /* USER CODE END Callback 1 */ -} - -/** - * @brief This function is executed in case of error occurrence. - * @retval None - */ -void Error_Handler(void) -{ - /* USER CODE BEGIN Error_Handler_Debug */ - /* User can add his own implementation to report the HAL error return state */ - __disable_irq(); - while (1) - { - } - /* USER CODE END Error_Handler_Debug */ -} -#ifdef USE_FULL_ASSERT -/** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ -void assert_failed(uint8_t *file, uint32_t line) -{ - /* USER CODE BEGIN 6 */ - /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ -} -#endif /* USE_FULL_ASSERT */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/spi.c b/L1_MCU/STM32F429ZIT6_STARM/Core/Src/spi.c deleted file mode 100644 index e3a963d..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/spi.c +++ /dev/null @@ -1,119 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file spi.c - * @brief This file provides code for the configuration - * of the SPI instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "spi.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -SPI_HandleTypeDef hspi5; - -/* SPI5 init function */ -void MX_SPI5_Init(void) -{ - - /* USER CODE BEGIN SPI5_Init 0 */ - - /* USER CODE END SPI5_Init 0 */ - - /* USER CODE BEGIN SPI5_Init 1 */ - - /* USER CODE END SPI5_Init 1 */ - hspi5.Instance = SPI5; - hspi5.Init.Mode = SPI_MODE_MASTER; - hspi5.Init.Direction = SPI_DIRECTION_2LINES; - hspi5.Init.DataSize = SPI_DATASIZE_8BIT; - hspi5.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi5.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi5.Init.NSS = SPI_NSS_SOFT; - hspi5.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; - hspi5.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi5.Init.TIMode = SPI_TIMODE_DISABLE; - hspi5.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi5.Init.CRCPolynomial = 10; - if (HAL_SPI_Init(&hspi5) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN SPI5_Init 2 */ - - /* USER CODE END SPI5_Init 2 */ - -} - -void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(spiHandle->Instance==SPI5) - { - /* USER CODE BEGIN SPI5_MspInit 0 */ - - /* USER CODE END SPI5_MspInit 0 */ - /* SPI5 clock enable */ - __HAL_RCC_SPI5_CLK_ENABLE(); - - __HAL_RCC_GPIOF_CLK_ENABLE(); - /**SPI5 GPIO Configuration - PF7 ------> SPI5_SCK - PF8 ------> SPI5_MISO - PF9 ------> SPI5_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI5; - HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI5_MspInit 1 */ - - /* USER CODE END SPI5_MspInit 1 */ - } -} - -void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) -{ - - if(spiHandle->Instance==SPI5) - { - /* USER CODE BEGIN SPI5_MspDeInit 0 */ - - /* USER CODE END SPI5_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI5_CLK_DISABLE(); - - /**SPI5 GPIO Configuration - PF7 ------> SPI5_SCK - PF8 ------> SPI5_MISO - PF9 ------> SPI5_MOSI - */ - HAL_GPIO_DeInit(GPIOF, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9); - - /* USER CODE BEGIN SPI5_MspDeInit 1 */ - - /* USER CODE END SPI5_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/stm32f4xx_hal_msp.c b/L1_MCU/STM32F429ZIT6_STARM/Core/Src/stm32f4xx_hal_msp.c deleted file mode 100644 index 602a04f..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/stm32f4xx_hal_msp.c +++ /dev/null @@ -1,84 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_hal_msp.c - * @brief This file provides code for the MSP Initialization - * and de-Initialization codes. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN Define */ - -/* USER CODE END Define */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN Macro */ - -/* USER CODE END Macro */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* External functions --------------------------------------------------------*/ -/* USER CODE BEGIN ExternalFunctions */ - -/* USER CODE END ExternalFunctions */ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ -/** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) -{ - - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - - __HAL_RCC_SYSCFG_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - /* PendSV_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0); - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/stm32f4xx_hal_timebase_tim.c b/L1_MCU/STM32F429ZIT6_STARM/Core/Src/stm32f4xx_hal_timebase_tim.c deleted file mode 100644 index 374e864..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/stm32f4xx_hal_timebase_tim.c +++ /dev/null @@ -1,137 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_hal_timebase_tim.c - * @brief HAL time base based on the hardware TIM. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" -#include "stm32f4xx_hal_tim.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -TIM_HandleTypeDef htim6; -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief This function configures the TIM6 as a time base source. - * The time source is configured to have 1ms time base with a dedicated - * Tick interrupt priority. - * @note This function is called automatically at the beginning of program after - * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). - * @param TickPriority: Tick interrupt priority. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) -{ - RCC_ClkInitTypeDef clkconfig; - uint32_t uwTimclock, uwAPB1Prescaler = 0U; - - uint32_t uwPrescalerValue = 0U; - uint32_t pFLatency; - - HAL_StatusTypeDef status; - - /* Enable TIM6 clock */ - __HAL_RCC_TIM6_CLK_ENABLE(); - - /* Get clock configuration */ - HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); - - /* Get APB1 prescaler */ - uwAPB1Prescaler = clkconfig.APB1CLKDivider; - /* Compute TIM6 clock */ - if (uwAPB1Prescaler == RCC_HCLK_DIV1) - { - uwTimclock = HAL_RCC_GetPCLK1Freq(); - } - else - { - uwTimclock = 2UL * HAL_RCC_GetPCLK1Freq(); - } - - /* Compute the prescaler value to have TIM6 counter clock equal to 1MHz */ - uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U); - - /* Initialize TIM6 */ - htim6.Instance = TIM6; - - /* Initialize TIMx peripheral as follow: - * Period = [(TIM6CLK/1000) - 1]. to have a (1/1000) s time base. - * Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. - * ClockDivision = 0 - * Counter direction = Up - */ - htim6.Init.Period = (1000000U / 1000U) - 1U; - htim6.Init.Prescaler = uwPrescalerValue; - htim6.Init.ClockDivision = 0; - htim6.Init.CounterMode = TIM_COUNTERMODE_UP; - htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - - status = HAL_TIM_Base_Init(&htim6); - if (status == HAL_OK) - { - /* Start the TIM time Base generation in interrupt mode */ - status = HAL_TIM_Base_Start_IT(&htim6); - if (status == HAL_OK) - { - /* Enable the TIM6 global Interrupt */ - HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); - /* Configure the SysTick IRQ priority */ - if (TickPriority < (1UL << __NVIC_PRIO_BITS)) - { - /* Configure the TIM IRQ priority */ - HAL_NVIC_SetPriority(TIM6_DAC_IRQn, TickPriority, 0U); - uwTickPrio = TickPriority; - } - else - { - status = HAL_ERROR; - } - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Suspend Tick increment. - * @note Disable the tick increment by disabling TIM6 update interrupt. - * @param None - * @retval None - */ -void HAL_SuspendTick(void) -{ - /* Disable TIM6 update Interrupt */ - __HAL_TIM_DISABLE_IT(&htim6, TIM_IT_UPDATE); -} - -/** - * @brief Resume Tick increment. - * @note Enable the tick increment by Enabling TIM6 update interrupt. - * @param None - * @retval None - */ -void HAL_ResumeTick(void) -{ - /* Enable TIM6 Update interrupt */ - __HAL_TIM_ENABLE_IT(&htim6, TIM_IT_UPDATE); -} - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/stm32f4xx_it.c b/L1_MCU/STM32F429ZIT6_STARM/Core/Src/stm32f4xx_it.c deleted file mode 100644 index 89b601e..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/stm32f4xx_it.c +++ /dev/null @@ -1,266 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_it.c - * @brief Interrupt Service Routines. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -#include "stm32f4xx_it.h" -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/* External variables --------------------------------------------------------*/ -extern DMA_HandleTypeDef hdma_usart1_rx; -extern DMA_HandleTypeDef hdma_usart1_tx; -extern UART_HandleTypeDef huart1; -extern TIM_HandleTypeDef htim6; - -/* USER CODE BEGIN EV */ -__weak void SysTick_Handler(void); -__weak void SVC_Handler(void); -__weak void PendSV_Handler(void); -/* USER CODE END EV */ - -/******************************************************************************/ -/* Cortex-M4 Processor Interruption and Exception Handlers */ -/******************************************************************************/ -/** - * @brief This function handles Non maskable interrupt. - */ -void NMI_Handler(void) -{ - /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ - - /* USER CODE END NonMaskableInt_IRQn 0 */ - HAL_RCC_NMI_IRQHandler(); - /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ - while (1) - { - } - /* USER CODE END NonMaskableInt_IRQn 1 */ -} - -/** - * @brief This function handles Hard fault interrupt. - */ -void HardFault_Handler(void) -{ - /* USER CODE BEGIN HardFault_IRQn 0 */ - - /* USER CODE END HardFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_HardFault_IRQn 0 */ - /* USER CODE END W1_HardFault_IRQn 0 */ - } -} - -/** - * @brief This function handles Memory management fault. - */ -void MemManage_Handler(void) -{ - /* USER CODE BEGIN MemoryManagement_IRQn 0 */ - - /* USER CODE END MemoryManagement_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ - /* USER CODE END W1_MemoryManagement_IRQn 0 */ - } -} - -/** - * @brief This function handles Pre-fetch fault, memory access fault. - */ -void BusFault_Handler(void) -{ - /* USER CODE BEGIN BusFault_IRQn 0 */ - - /* USER CODE END BusFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_BusFault_IRQn 0 */ - /* USER CODE END W1_BusFault_IRQn 0 */ - } -} - -/** - * @brief This function handles Undefined instruction or illegal state. - */ -void UsageFault_Handler(void) -{ - /* USER CODE BEGIN UsageFault_IRQn 0 */ - - /* USER CODE END UsageFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ - /* USER CODE END W1_UsageFault_IRQn 0 */ - } -} - -/** - * @brief This function handles System service call via SWI instruction. - */ -void SVC_Handler(void) -{ - /* USER CODE BEGIN SVCall_IRQn 0 */ - - /* USER CODE END SVCall_IRQn 0 */ - /* USER CODE BEGIN SVCall_IRQn 1 */ - - /* USER CODE END SVCall_IRQn 1 */ -} - -/** - * @brief This function handles Debug monitor. - */ -void DebugMon_Handler(void) -{ - /* USER CODE BEGIN DebugMonitor_IRQn 0 */ - - /* USER CODE END DebugMonitor_IRQn 0 */ - /* USER CODE BEGIN DebugMonitor_IRQn 1 */ - - /* USER CODE END DebugMonitor_IRQn 1 */ -} - -/** - * @brief This function handles Pendable request for system service. - */ -void PendSV_Handler(void) -{ - /* USER CODE BEGIN PendSV_IRQn 0 */ - - /* USER CODE END PendSV_IRQn 0 */ - /* USER CODE BEGIN PendSV_IRQn 1 */ - - /* USER CODE END PendSV_IRQn 1 */ -} - -/** - * @brief This function handles System tick timer. - */ -void SysTick_Handler(void) -{ - /* USER CODE BEGIN SysTick_IRQn 0 */ - - /* USER CODE END SysTick_IRQn 0 */ - - /* USER CODE BEGIN SysTick_IRQn 1 */ - - /* USER CODE END SysTick_IRQn 1 */ -} - -/******************************************************************************/ -/* STM32F4xx Peripheral Interrupt Handlers */ -/* Add here the Interrupt Handlers for the used peripherals. */ -/* For the available peripheral interrupt handler names, */ -/* please refer to the startup file (startup_stm32f4xx.s). */ -/******************************************************************************/ - -/** - * @brief This function handles USART1 global interrupt. - */ -void USART1_IRQHandler(void) -{ - /* USER CODE BEGIN USART1_IRQn 0 */ - - /* USER CODE END USART1_IRQn 0 */ - HAL_UART_IRQHandler(&huart1); - /* USER CODE BEGIN USART1_IRQn 1 */ - - /* USER CODE END USART1_IRQn 1 */ -} - -/** - * @brief This function handles TIM6 global interrupt, DAC1 and DAC2 underrun error interrupts. - */ -void TIM6_DAC_IRQHandler(void) -{ - /* USER CODE BEGIN TIM6_DAC_IRQn 0 */ - - /* USER CODE END TIM6_DAC_IRQn 0 */ - HAL_TIM_IRQHandler(&htim6); - /* USER CODE BEGIN TIM6_DAC_IRQn 1 */ - - /* USER CODE END TIM6_DAC_IRQn 1 */ -} - -/** - * @brief This function handles DMA2 stream2 global interrupt. - */ -void DMA2_Stream2_IRQHandler(void) -{ - /* USER CODE BEGIN DMA2_Stream2_IRQn 0 */ - - /* USER CODE END DMA2_Stream2_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_usart1_rx); - /* USER CODE BEGIN DMA2_Stream2_IRQn 1 */ - - /* USER CODE END DMA2_Stream2_IRQn 1 */ -} - -/** - * @brief This function handles DMA2 stream7 global interrupt. - */ -void DMA2_Stream7_IRQHandler(void) -{ - /* USER CODE BEGIN DMA2_Stream7_IRQn 0 */ - - /* USER CODE END DMA2_Stream7_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_usart1_tx); - /* USER CODE BEGIN DMA2_Stream7_IRQn 1 */ - - /* USER CODE END DMA2_Stream7_IRQn 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/syscalls.c b/L1_MCU/STM32F429ZIT6_STARM/Core/Src/syscalls.c deleted file mode 100644 index e10d76f..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/syscalls.c +++ /dev/null @@ -1,244 +0,0 @@ -/** - ****************************************************************************** - * @file syscalls.c - * @author Auto-generated by STM32CubeMX - * @brief Minimal System calls file - * - * For more information about which c-functions - * need which of these lowlevel functions - * please consult the Newlib or Picolibc libc-manual - ****************************************************************************** - * @attention - * - * Copyright (c) 2020-2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes */ -#include -#include -#include -#include -#include -#include -#include -#include - - -/* Variables */ -extern int __io_putchar(int ch) __attribute__((weak)); -extern int __io_getchar(void) __attribute__((weak)); - - -char *__env[1] = { 0 }; -char **environ = __env; - - -/* Functions */ -void initialise_monitor_handles() -{ -} - -int _getpid(void) -{ - return 1; -} - -int _kill(int pid, int sig) -{ - (void)pid; - (void)sig; - errno = EINVAL; - return -1; -} - -void _exit (int status) -{ - _kill(status, -1); - while (1) {} /* Make sure we hang here */ -} - -__attribute__((weak)) int _read(int file, char *ptr, int len) -{ - (void)file; - int DataIdx; - - for (DataIdx = 0; DataIdx < len; DataIdx++) - { - *ptr++ = __io_getchar(); - } - - return len; -} - -__attribute__((weak)) int _write(int file, char *ptr, int len) -{ - (void)file; - int DataIdx; - - for (DataIdx = 0; DataIdx < len; DataIdx++) - { - __io_putchar(*ptr++); - } - return len; -} - -int _close(int file) -{ - (void)file; - return -1; -} - - -int _fstat(int file, struct stat *st) -{ - (void)file; - st->st_mode = S_IFCHR; - return 0; -} - -int _isatty(int file) -{ - (void)file; - return 1; -} - -int _lseek(int file, int ptr, int dir) -{ - (void)file; - (void)ptr; - (void)dir; - return 0; -} - -int _open(char *path, int flags, ...) -{ - (void)path; - (void)flags; - /* Pretend like we always fail */ - return -1; -} - -int _wait(int *status) -{ - (void)status; - errno = ECHILD; - return -1; -} - -int _unlink(char *name) -{ - (void)name; - errno = ENOENT; - return -1; -} - -clock_t _times(struct tms *buf) -{ - (void)buf; - return -1; -} - -int _stat(const char *file, struct stat *st) -{ - (void)file; - st->st_mode = S_IFCHR; - return 0; -} - -int _link(char *old, char *new) -{ - (void)old; - (void)new; - errno = EMLINK; - return -1; -} - -int _fork(void) -{ - errno = EAGAIN; - return -1; -} - -int _execve(char *name, char **argv, char **env) -{ - (void)name; - (void)argv; - (void)env; - errno = ENOMEM; - return -1; -} - -// --- Picolibc Specific Section --- -#if defined(__PICOLIBC__) - -/** - * @brief Picolibc helper function to output a character to a FILE stream. - * This redirects the output to the low-level __io_putchar function. - * @param c Character to write. - * @param file FILE stream pointer (ignored). - * @retval int The character written. - */ -static int starm_putc(char c, FILE *file) -{ - (void) file; - __io_putchar(c); - return c; -} - -/** - * @brief Picolibc helper function to input a character from a FILE stream. - * This redirects the input from the low-level __io_getchar function. - * @param file FILE stream pointer (ignored). - * @retval int The character read, cast to an unsigned char then int. - */ -static int starm_getc(FILE *file) -{ - unsigned char c; - (void) file; - c = __io_getchar(); - return c; -} - -// Define and initialize the standard I/O streams for Picolibc. -// FDEV_SETUP_STREAM connects the starm_putc and starm_getc helper functions to a FILE structure. -// _FDEV_SETUP_RW indicates the stream is for reading and writing. -static FILE __stdio = FDEV_SETUP_STREAM(starm_putc, - starm_getc, - NULL, - _FDEV_SETUP_RW); - -// Assign the standard stream pointers (stdin, stdout, stderr) to the initialized stream. -// Picolibc uses these pointers for standard I/O operations (printf, scanf, etc.). -FILE *const stdin = &__stdio; -__strong_reference(stdin, stdout); -__strong_reference(stdin, stderr); - -// Create strong aliases mapping standard C library function names (without underscore) -// to the implemented system call stubs (with underscore). Picolibc uses these -// standard names internally, so this linking is required. -__strong_reference(_read, read); -__strong_reference(_write, write); -__strong_reference(_times, times); -__strong_reference(_execve, execve); -__strong_reference(_fork, fork); -__strong_reference(_link, link); -__strong_reference(_unlink, unlink); -__strong_reference(_stat, stat); -__strong_reference(_wait, wait); -__strong_reference(_open, open); -__strong_reference(_close, close); -__strong_reference(_lseek, lseek); -__strong_reference(_isatty, isatty); -__strong_reference(_fstat, fstat); -__strong_reference(_exit, exit); -__strong_reference(_kill, kill); -__strong_reference(_getpid, getpid); - -#endif //__PICOLIBC__ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/sysmem.c b/L1_MCU/STM32F429ZIT6_STARM/Core/Src/sysmem.c deleted file mode 100644 index a875d42..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/sysmem.c +++ /dev/null @@ -1,87 +0,0 @@ -/** - ****************************************************************************** - * @file sysmem.c - * @author Generated by STM32CubeMX - * @brief System Memory calls file - * - * For more information about which C functions - * need which of these lowlevel functions - * please consult the Newlib or Picolibc libc manual - ****************************************************************************** - * @attention - * - * Copyright (c) 2025 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes */ -#include -#include -#include - -/** - * Pointer to the current high watermark of the heap usage - */ -static uint8_t *__sbrk_heap_end = NULL; - -/** - * @brief _sbrk() allocates memory to the newlib heap and is used by malloc - * and others from the C library - * - * @verbatim - * ############################################################################ - * # .data # .bss # newlib heap # MSP stack # - * # # # # Reserved by _Min_Stack_Size # - * ############################################################################ - * ^-- RAM start ^-- _end _estack, RAM end --^ - * @endverbatim - * - * This implementation starts allocating at the '_end' linker symbol - * The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack - * The implementation considers '_estack' linker symbol to be RAM end - * NOTE: If the MSP stack, at any point during execution, grows larger than the - * reserved size, please increase the '_Min_Stack_Size'. - * - * @param incr Memory size - * @return Pointer to allocated memory - */ -void *_sbrk(ptrdiff_t incr) -{ - extern uint8_t _end; /* Symbol defined in the linker script */ - extern uint8_t _estack; /* Symbol defined in the linker script */ - extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ - const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; - const uint8_t *max_heap = (uint8_t *)stack_limit; - uint8_t *prev_heap_end; - - /* Initialize heap end at first call */ - if (NULL == __sbrk_heap_end) - { - __sbrk_heap_end = &_end; - } - - /* Protect heap from growing into the reserved MSP stack */ - if (__sbrk_heap_end + incr > max_heap) - { - errno = ENOMEM; - return (void *)-1; - } - - prev_heap_end = __sbrk_heap_end; - __sbrk_heap_end += incr; - - return (void *)prev_heap_end; -} - -#if defined(__PICOLIBC__) - // Picolibc expects syscalls without the leading underscore. - // This creates a strong alias so that - // calls to `sbrk()` are resolved to our `_sbrk()` implementation. - __strong_reference(_sbrk, sbrk); -#endif diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/system_stm32f4xx.c b/L1_MCU/STM32F429ZIT6_STARM/Core/Src/system_stm32f4xx.c deleted file mode 100644 index 7a61e9c..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/system_stm32f4xx.c +++ /dev/null @@ -1,747 +0,0 @@ -/** - ****************************************************************************** - * @file system_stm32f4xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f4xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f4xx_system - * @{ - */ - -/** @addtogroup STM32F4xx_System_Private_Includes - * @{ - */ - - -#include "stm32f4xx.h" - -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ -/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ - || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) -/* #define DATA_IN_ExtSRAM */ -#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\ - STM32F412Zx || STM32F412Vx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/* #define DATA_IN_ExtSDRAM */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ - STM32F479xx */ - -/* Note: Following vector table addresses must be defined in line with linker - configuration. */ -/*!< Uncomment the following line if you need to relocate the vector table - anywhere in Flash or Sram, else the vector table is kept at the automatic - remap of boot address selected */ -/* #define USER_VECT_TAB_ADDRESS */ - -#if defined(USER_VECT_TAB_ADDRESS) -/*!< Uncomment the following line if you need to relocate your vector Table - in Sram else user remap will be done in Flash. */ -/* #define VECT_TAB_SRAM */ -#if defined(VECT_TAB_SRAM) -#define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field. - This value must be a multiple of 0x200. */ -#else -#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field. - This value must be a multiple of 0x200. */ -#endif /* VECT_TAB_SRAM */ -#if !defined(VECT_TAB_OFFSET) -#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table offset field. - This value must be a multiple of 0x200. */ -#endif /* VECT_TAB_OFFSET */ -#endif /* USER_VECT_TAB_ADDRESS */ -/******************************************************************************/ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Variables - * @{ - */ - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 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. - */ -uint32_t SystemCoreClock = 16000000; -const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; -const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes - * @{ - */ - -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) - static void SystemInit_ExtMemCtl(void); -#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the FPU setting, vector table location and External memory - * configuration. - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - #endif - -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) - SystemInit_ExtMemCtl(); -#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ - - /* Configure the Vector Table location -------------------------------------*/ -#if defined(USER_VECT_TAB_ADDRESS) - SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#endif /* USER_VECT_TAB_ADDRESS */ -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value - * depends on the application requirements), user has to ensure that HSE_VALUE - * is same as the real frequency of the crystal used. Otherwise, this function - * may have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp, pllvco, pllp, pllsource, pllm; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N - SYSCLK = PLL_VCO / PLL_P - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - SystemCoreClock = pllvco/pllp; - break; - default: - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK frequency --------------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK frequency */ - SystemCoreClock >>= tmp; -} - -#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Setup the external memory controller. - * Called in startup_stm32f4xx.s before jump to main. - * This function configures the external memories (SRAM/SDRAM) - * This SRAM/SDRAM will be used as program data memory (including heap and stack). - * @param None - * @retval None - */ -void SystemInit_ExtMemCtl(void) -{ - __IO uint32_t tmp = 0x00; - - register uint32_t tmpreg = 0, timeout = 0xFFFF; - register __IO uint32_t index; - - /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */ - RCC->AHB1ENR |= 0x000001F8; - - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x00CCC0CC; - GPIOD->AFR[1] = 0xCCCCCCCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xAAAA0A8A; - /* Configure PDx pins speed to 100 MHz */ - GPIOD->OSPEEDR = 0xFFFF0FCF; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00CC0CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA828A; - /* Configure PEx pins speed to 100 MHz */ - GPIOE->OSPEEDR = 0xFFFFC3CF; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0xCCCCCCCC; - GPIOF->AFR[1] = 0xCCCCCCCC; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA800AAA; - /* Configure PFx pins speed to 50 MHz */ - GPIOF->OSPEEDR = 0xAA800AAA; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0xCCCCCCCC; - GPIOG->AFR[1] = 0xCCCCCCCC; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0xAAAAAAAA; - /* Configure PGx pins speed to 50 MHz */ - GPIOG->OSPEEDR = 0xAAAAAAAA; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - - /* Connect PHx pins to FMC Alternate function */ - GPIOH->AFR[0] = 0x00C0CC00; - GPIOH->AFR[1] = 0xCCCCCCCC; - /* Configure PHx pins in Alternate function mode */ - GPIOH->MODER = 0xAAAA08A0; - /* Configure PHx pins speed to 50 MHz */ - GPIOH->OSPEEDR = 0xAAAA08A0; - /* Configure PHx pins Output type to push-pull */ - GPIOH->OTYPER = 0x00000000; - /* No pull-up, pull-down for PHx pins */ - GPIOH->PUPDR = 0x00000000; - - /* Connect PIx pins to FMC Alternate function */ - GPIOI->AFR[0] = 0xCCCCCCCC; - GPIOI->AFR[1] = 0x00000CC0; - /* Configure PIx pins in Alternate function mode */ - GPIOI->MODER = 0x0028AAAA; - /* Configure PIx pins speed to 50 MHz */ - GPIOI->OSPEEDR = 0x0028AAAA; - /* Configure PIx pins Output type to push-pull */ - GPIOI->OTYPER = 0x00000000; - /* No pull-up, pull-down for PIx pins */ - GPIOI->PUPDR = 0x00000000; - -/*-- FMC Configuration -------------------------------------------------------*/ - /* Enable the FMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - - FMC_Bank5_6->SDCR[0] = 0x000019E4; - FMC_Bank5_6->SDTR[0] = 0x01115351; - - /* SDRAM initialization sequence */ - /* Clock enable command */ - FMC_Bank5_6->SDCMR = 0x00000011; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Delay */ - for (index = 0; index<1000; index++); - - /* PALL command */ - FMC_Bank5_6->SDCMR = 0x00000012; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Auto refresh command */ - FMC_Bank5_6->SDCMR = 0x00000073; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* MRD register program */ - FMC_Bank5_6->SDCMR = 0x00046014; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Set refresh count */ - tmpreg = FMC_Bank5_6->SDRTR; - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); - - /* Disable write protection */ - tmpreg = FMC_Bank5_6->SDCR[0]; - FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001011; - FMC_Bank1->BTCR[3] = 0x00000201; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -#if defined(STM32F469xx) || defined(STM32F479xx) - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001091; - FMC_Bank1->BTCR[3] = 0x00110212; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F469xx || STM32F479xx */ - - (void)(tmp); -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) -/** - * @brief Setup the external memory controller. - * Called in startup_stm32f4xx.s before jump to main. - * This function configures the external memories (SRAM/SDRAM) - * This SRAM/SDRAM will be used as program data memory (including heap and stack). - * @param None - * @retval None - */ -void SystemInit_ExtMemCtl(void) -{ - __IO uint32_t tmp = 0x00; -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#if defined (DATA_IN_ExtSDRAM) - register uint32_t tmpreg = 0, timeout = 0xFFFF; - register __IO uint32_t index; - -#if defined(STM32F446xx) - /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface - clock */ - RCC->AHB1ENR |= 0x0000007D; -#else - /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface - clock */ - RCC->AHB1ENR |= 0x000001F8; -#endif /* STM32F446xx */ - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); - -#if defined(STM32F446xx) - /* Connect PAx pins to FMC Alternate function */ - GPIOA->AFR[0] |= 0xC0000000; - GPIOA->AFR[1] |= 0x00000000; - /* Configure PDx pins in Alternate function mode */ - GPIOA->MODER |= 0x00008000; - /* Configure PDx pins speed to 50 MHz */ - GPIOA->OSPEEDR |= 0x00008000; - /* Configure PDx pins Output type to push-pull */ - GPIOA->OTYPER |= 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOA->PUPDR |= 0x00000000; - - /* Connect PCx pins to FMC Alternate function */ - GPIOC->AFR[0] |= 0x00CC0000; - GPIOC->AFR[1] |= 0x00000000; - /* Configure PDx pins in Alternate function mode */ - GPIOC->MODER |= 0x00000A00; - /* Configure PDx pins speed to 50 MHz */ - GPIOC->OSPEEDR |= 0x00000A00; - /* Configure PDx pins Output type to push-pull */ - GPIOC->OTYPER |= 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOC->PUPDR |= 0x00000000; -#endif /* STM32F446xx */ - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x000000CC; - GPIOD->AFR[1] = 0xCC000CCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xA02A000A; - /* Configure PDx pins speed to 50 MHz */ - GPIOD->OSPEEDR = 0xA02A000A; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00000CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA800A; - /* Configure PEx pins speed to 50 MHz */ - GPIOE->OSPEEDR = 0xAAAA800A; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0xCCCCCCCC; - GPIOF->AFR[1] = 0xCCCCCCCC; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA800AAA; - /* Configure PFx pins speed to 50 MHz */ - GPIOF->OSPEEDR = 0xAA800AAA; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0xCCCCCCCC; - GPIOG->AFR[1] = 0xCCCCCCCC; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0xAAAAAAAA; - /* Configure PGx pins speed to 50 MHz */ - GPIOG->OSPEEDR = 0xAAAAAAAA; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) - /* Connect PHx pins to FMC Alternate function */ - GPIOH->AFR[0] = 0x00C0CC00; - GPIOH->AFR[1] = 0xCCCCCCCC; - /* Configure PHx pins in Alternate function mode */ - GPIOH->MODER = 0xAAAA08A0; - /* Configure PHx pins speed to 50 MHz */ - GPIOH->OSPEEDR = 0xAAAA08A0; - /* Configure PHx pins Output type to push-pull */ - GPIOH->OTYPER = 0x00000000; - /* No pull-up, pull-down for PHx pins */ - GPIOH->PUPDR = 0x00000000; - - /* Connect PIx pins to FMC Alternate function */ - GPIOI->AFR[0] = 0xCCCCCCCC; - GPIOI->AFR[1] = 0x00000CC0; - /* Configure PIx pins in Alternate function mode */ - GPIOI->MODER = 0x0028AAAA; - /* Configure PIx pins speed to 50 MHz */ - GPIOI->OSPEEDR = 0x0028AAAA; - /* Configure PIx pins Output type to push-pull */ - GPIOI->OTYPER = 0x00000000; - /* No pull-up, pull-down for PIx pins */ - GPIOI->PUPDR = 0x00000000; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -/*-- FMC Configuration -------------------------------------------------------*/ - /* Enable the FMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - - /* Configure and enable SDRAM bank1 */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCR[0] = 0x00001954; -#else - FMC_Bank5_6->SDCR[0] = 0x000019E4; -#endif /* STM32F446xx */ - FMC_Bank5_6->SDTR[0] = 0x01115351; - - /* SDRAM initialization sequence */ - /* Clock enable command */ - FMC_Bank5_6->SDCMR = 0x00000011; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Delay */ - for (index = 0; index<1000; index++); - - /* PALL command */ - FMC_Bank5_6->SDCMR = 0x00000012; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Auto refresh command */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x000000F3; -#else - FMC_Bank5_6->SDCMR = 0x00000073; -#endif /* STM32F446xx */ - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* MRD register program */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x00044014; -#else - FMC_Bank5_6->SDCMR = 0x00046014; -#endif /* STM32F446xx */ - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Set refresh count */ - tmpreg = FMC_Bank5_6->SDRTR; -#if defined(STM32F446xx) - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); -#else - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); -#endif /* STM32F446xx */ - - /* Disable write protection */ - tmpreg = FMC_Bank5_6->SDCR[0]; - FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); -#endif /* DATA_IN_ExtSDRAM */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ - || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) - -#if defined(DATA_IN_ExtSRAM) -/*-- GPIOs Configuration -----------------------------------------------------*/ - /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ - RCC->AHB1ENR |= 0x00000078; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x00CCC0CC; - GPIOD->AFR[1] = 0xCCCCCCCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xAAAA0A8A; - /* Configure PDx pins speed to 100 MHz */ - GPIOD->OSPEEDR = 0xFFFF0FCF; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00CC0CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA828A; - /* Configure PEx pins speed to 100 MHz */ - GPIOE->OSPEEDR = 0xFFFFC3CF; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0x00CCCCCC; - GPIOF->AFR[1] = 0xCCCC0000; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA000AAA; - /* Configure PFx pins speed to 100 MHz */ - GPIOF->OSPEEDR = 0xFF000FFF; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0x00CCCCCC; - GPIOG->AFR[1] = 0x000000C0; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0x00085AAA; - /* Configure PGx pins speed to 100 MHz */ - GPIOG->OSPEEDR = 0x000CAFFF; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - -/*-- FMC/FSMC Configuration --------------------------------------------------*/ - /* Enable the FMC/FSMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001011; - FMC_Bank1->BTCR[3] = 0x00000201; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -#if defined(STM32F469xx) || defined(STM32F479xx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001091; - FMC_Bank1->BTCR[3] = 0x00110212; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F469xx || STM32F479xx */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ - || defined(STM32F412Zx) || defined(STM32F412Vx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); - /* Configure and enable Bank1_SRAM2 */ - FSMC_Bank1->BTCR[2] = 0x00001011; - FSMC_Bank1->BTCR[3] = 0x00000201; - FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */ - -#endif /* DATA_IN_ExtSRAM */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ - STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */ - (void)(tmp); -} -#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/usart.c b/L1_MCU/STM32F429ZIT6_STARM/Core/Src/usart.c deleted file mode 100644 index 1a4a57c..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Core/Src/usart.c +++ /dev/null @@ -1,162 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file usart.c - * @brief This file provides code for the configuration - * of the USART instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "usart.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -UART_HandleTypeDef huart1; -DMA_HandleTypeDef hdma_usart1_rx; -DMA_HandleTypeDef hdma_usart1_tx; - -/* USART1 init function */ - -void MX_USART1_UART_Init(void) -{ - - /* USER CODE BEGIN USART1_Init 0 */ - - /* USER CODE END USART1_Init 0 */ - - /* USER CODE BEGIN USART1_Init 1 */ - - /* USER CODE END USART1_Init 1 */ - huart1.Instance = USART1; - huart1.Init.BaudRate = 115200; - huart1.Init.WordLength = UART_WORDLENGTH_8B; - huart1.Init.StopBits = UART_STOPBITS_1; - huart1.Init.Parity = UART_PARITY_NONE; - huart1.Init.Mode = UART_MODE_TX_RX; - huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; - huart1.Init.OverSampling = UART_OVERSAMPLING_16; - if (HAL_UART_Init(&huart1) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN USART1_Init 2 */ - - /* USER CODE END USART1_Init 2 */ - -} - -void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(uartHandle->Instance==USART1) - { - /* USER CODE BEGIN USART1_MspInit 0 */ - - /* USER CODE END USART1_MspInit 0 */ - /* USART1 clock enable */ - __HAL_RCC_USART1_CLK_ENABLE(); - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**USART1 GPIO Configuration - PA9 ------> USART1_TX - PA10 ------> USART1_RX - */ - GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF7_USART1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USART1 DMA Init */ - /* USART1_RX Init */ - hdma_usart1_rx.Instance = DMA2_Stream2; - hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4; - hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; - hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE; - hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; - hdma_usart1_rx.Init.Mode = DMA_NORMAL; - hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW; - hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK) - { - Error_Handler(); - } - - __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx); - - /* USART1_TX Init */ - hdma_usart1_tx.Instance = DMA2_Stream7; - hdma_usart1_tx.Init.Channel = DMA_CHANNEL_4; - hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; - hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE; - hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; - hdma_usart1_tx.Init.Mode = DMA_NORMAL; - hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW; - hdma_usart1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK) - { - Error_Handler(); - } - - __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx); - - /* USART1 interrupt Init */ - HAL_NVIC_SetPriority(USART1_IRQn, 2, 0); - HAL_NVIC_EnableIRQ(USART1_IRQn); - /* USER CODE BEGIN USART1_MspInit 1 */ - - /* USER CODE END USART1_MspInit 1 */ - } -} - -void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) -{ - - if(uartHandle->Instance==USART1) - { - /* USER CODE BEGIN USART1_MspDeInit 0 */ - - /* USER CODE END USART1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_USART1_CLK_DISABLE(); - - /**USART1 GPIO Configuration - PA9 ------> USART1_TX - PA10 ------> USART1_RX - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); - - /* USART1 DMA DeInit */ - HAL_DMA_DeInit(uartHandle->hdmarx); - HAL_DMA_DeInit(uartHandle->hdmatx); - - /* USART1 interrupt Deinit */ - HAL_NVIC_DisableIRQ(USART1_IRQn); - /* USER CODE BEGIN USART1_MspDeInit 1 */ - - /* USER CODE END USART1_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f429xx.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f429xx.h deleted file mode 100644 index b161068..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f429xx.h +++ /dev/null @@ -1,17192 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f429xx.h - * @author MCD Application Team - * @brief CMSIS STM32F429xx Device Peripheral Access Layer Header File. - * - * This file contains: - * - Data structures and the address mapping for all peripherals - * - peripherals registers declarations and bits definition - * - Macros to access peripheral's registers hardware - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS_Device - * @{ - */ - -/** @addtogroup stm32f429xx - * @{ - */ - -#ifndef __STM32F429xx_H -#define __STM32F429xx_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief Configuration of the Cortex-M4 Processor and Core Peripherals - */ -#define __CM4_REV 0x0001U /*!< Core revision r0p1 */ -#define __MPU_PRESENT 1U /*!< STM32F4XX provides an MPU */ -#define __NVIC_PRIO_BITS 4U /*!< STM32F4XX uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ -#define __FPU_PRESENT 1U /*!< FPU present */ - -/** - * @} - */ - -/** @addtogroup Peripheral_interrupt_number_definition - * @{ - */ - -/** - * @brief STM32F4XX Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -typedef enum -{ - /****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */ - /****** STM32 specific Interrupt Numbers **********************************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ - RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ - DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ - DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ - DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ - DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ - DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ - DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ - ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ - CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ - CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ - TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ - TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ - OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ - TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ - TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ - TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ - TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare global interrupt */ - DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ - FMC_IRQn = 48, /*!< FMC global Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ - TIM7_IRQn = 55, /*!< TIM7 global interrupt */ - DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ - DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ - DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ - DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ - DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ - ETH_IRQn = 61, /*!< Ethernet global Interrupt */ - ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ - CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ - CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ - CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ - CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ - OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ - DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ - DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ - DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ - USART6_IRQn = 71, /*!< USART6 global interrupt */ - I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ - I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ - OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ - OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ - OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ - OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ - DCMI_IRQn = 78, /*!< DCMI global interrupt */ - HASH_RNG_IRQn = 80, /*!< Hash and Rng global interrupt */ - FPU_IRQn = 81, /*!< FPU global interrupt */ - UART7_IRQn = 82, /*!< UART7 global interrupt */ - UART8_IRQn = 83, /*!< UART8 global interrupt */ - SPI4_IRQn = 84, /*!< SPI4 global Interrupt */ - SPI5_IRQn = 85, /*!< SPI5 global Interrupt */ - SPI6_IRQn = 86, /*!< SPI6 global Interrupt */ - SAI1_IRQn = 87, /*!< SAI1 global Interrupt */ - LTDC_IRQn = 88, /*!< LTDC global Interrupt */ - LTDC_ER_IRQn = 89, /*!< LTDC Error global Interrupt */ - DMA2D_IRQn = 90 /*!< DMA2D global Interrupt */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */ -#include "system_stm32f4xx.h" -#include - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ - __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ - __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ - __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ - __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ - __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ - __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ - __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ - __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ - __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ - __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ - __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ - __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ - __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ - __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ - __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ - __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ - __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ - __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ - __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ - __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ - __IO uint32_t CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1 base address + 0x308 */ -} ADC_Common_TypeDef; - - -/** - * @brief Controller Area Network TxMailBox - */ - -typedef struct -{ - __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ - __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ - __IO uint32_t TDLR; /*!< CAN mailbox data low register */ - __IO uint32_t TDHR; /*!< CAN mailbox data high register */ -} CAN_TxMailBox_TypeDef; - -/** - * @brief Controller Area Network FIFOMailBox - */ - -typedef struct -{ - __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ - __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ - __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ - __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ -} CAN_FIFOMailBox_TypeDef; - -/** - * @brief Controller Area Network FilterRegister - */ - -typedef struct -{ - __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ - __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ -} CAN_FilterRegister_TypeDef; - -/** - * @brief Controller Area Network - */ - -typedef struct -{ - __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ - __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ - __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ - __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ - __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ - __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ - __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ - __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ - uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ - CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ - CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ - uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ - __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ - __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ - uint32_t RESERVED2; /*!< Reserved, 0x208 */ - __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ - uint32_t RESERVED3; /*!< Reserved, 0x210 */ - __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ - uint32_t RESERVED4; /*!< Reserved, 0x218 */ - __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ - uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ - CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ -} CAN_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ - __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ - uint8_t RESERVED0; /*!< Reserved, 0x05 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ -} CRC_TypeDef; - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ - __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ - __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ - __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ - __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ - __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ - __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ - __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ - __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ - __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ - __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ - __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ - __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ - __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ - __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ - __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ - __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ -} DBGMCU_TypeDef; - -/** - * @brief DCMI - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DCMI control register 1, Address offset: 0x00 */ - __IO uint32_t SR; /*!< DCMI status register, Address offset: 0x04 */ - __IO uint32_t RISR; /*!< DCMI raw interrupt status register, Address offset: 0x08 */ - __IO uint32_t IER; /*!< DCMI interrupt enable register, Address offset: 0x0C */ - __IO uint32_t MISR; /*!< DCMI masked interrupt status register, Address offset: 0x10 */ - __IO uint32_t ICR; /*!< DCMI interrupt clear register, Address offset: 0x14 */ - __IO uint32_t ESCR; /*!< DCMI embedded synchronization code register, Address offset: 0x18 */ - __IO uint32_t ESUR; /*!< DCMI embedded synchronization unmask register, Address offset: 0x1C */ - __IO uint32_t CWSTRTR; /*!< DCMI crop window start, Address offset: 0x20 */ - __IO uint32_t CWSIZER; /*!< DCMI crop window size, Address offset: 0x24 */ - __IO uint32_t DR; /*!< DCMI data register, Address offset: 0x28 */ -} DCMI_TypeDef; - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DMA stream x configuration register */ - __IO uint32_t NDTR; /*!< DMA stream x number of data register */ - __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ - __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ - __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ - __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ -} DMA_Stream_TypeDef; - -typedef struct -{ - __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ - __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ - __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ - __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ -} DMA_TypeDef; - -/** - * @brief DMA2D Controller - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DMA2D Control Register, Address offset: 0x00 */ - __IO uint32_t ISR; /*!< DMA2D Interrupt Status Register, Address offset: 0x04 */ - __IO uint32_t IFCR; /*!< DMA2D Interrupt Flag Clear Register, Address offset: 0x08 */ - __IO uint32_t FGMAR; /*!< DMA2D Foreground Memory Address Register, Address offset: 0x0C */ - __IO uint32_t FGOR; /*!< DMA2D Foreground Offset Register, Address offset: 0x10 */ - __IO uint32_t BGMAR; /*!< DMA2D Background Memory Address Register, Address offset: 0x14 */ - __IO uint32_t BGOR; /*!< DMA2D Background Offset Register, Address offset: 0x18 */ - __IO uint32_t FGPFCCR; /*!< DMA2D Foreground PFC Control Register, Address offset: 0x1C */ - __IO uint32_t FGCOLR; /*!< DMA2D Foreground Color Register, Address offset: 0x20 */ - __IO uint32_t BGPFCCR; /*!< DMA2D Background PFC Control Register, Address offset: 0x24 */ - __IO uint32_t BGCOLR; /*!< DMA2D Background Color Register, Address offset: 0x28 */ - __IO uint32_t FGCMAR; /*!< DMA2D Foreground CLUT Memory Address Register, Address offset: 0x2C */ - __IO uint32_t BGCMAR; /*!< DMA2D Background CLUT Memory Address Register, Address offset: 0x30 */ - __IO uint32_t OPFCCR; /*!< DMA2D Output PFC Control Register, Address offset: 0x34 */ - __IO uint32_t OCOLR; /*!< DMA2D Output Color Register, Address offset: 0x38 */ - __IO uint32_t OMAR; /*!< DMA2D Output Memory Address Register, Address offset: 0x3C */ - __IO uint32_t OOR; /*!< DMA2D Output Offset Register, Address offset: 0x40 */ - __IO uint32_t NLR; /*!< DMA2D Number of Line Register, Address offset: 0x44 */ - __IO uint32_t LWR; /*!< DMA2D Line Watermark Register, Address offset: 0x48 */ - __IO uint32_t AMTCR; /*!< DMA2D AHB Master Timer Configuration Register, Address offset: 0x4C */ - uint32_t RESERVED[236]; /*!< Reserved, 0x50-0x3FF */ - __IO uint32_t FGCLUT[256]; /*!< DMA2D Foreground CLUT, Address offset:400-7FF */ - __IO uint32_t BGCLUT[256]; /*!< DMA2D Background CLUT, Address offset:800-BFF */ -} DMA2D_TypeDef; - -/** - * @brief Ethernet MAC - */ - -typedef struct -{ - __IO uint32_t MACCR; - __IO uint32_t MACFFR; - __IO uint32_t MACHTHR; - __IO uint32_t MACHTLR; - __IO uint32_t MACMIIAR; - __IO uint32_t MACMIIDR; - __IO uint32_t MACFCR; - __IO uint32_t MACVLANTR; /* 8 */ - uint32_t RESERVED0[2]; - __IO uint32_t MACRWUFFR; /* 11 */ - __IO uint32_t MACPMTCSR; - uint32_t RESERVED1; - __IO uint32_t MACDBGR; - __IO uint32_t MACSR; /* 15 */ - __IO uint32_t MACIMR; - __IO uint32_t MACA0HR; - __IO uint32_t MACA0LR; - __IO uint32_t MACA1HR; - __IO uint32_t MACA1LR; - __IO uint32_t MACA2HR; - __IO uint32_t MACA2LR; - __IO uint32_t MACA3HR; - __IO uint32_t MACA3LR; /* 24 */ - uint32_t RESERVED2[40]; - __IO uint32_t MMCCR; /* 65 */ - __IO uint32_t MMCRIR; - __IO uint32_t MMCTIR; - __IO uint32_t MMCRIMR; - __IO uint32_t MMCTIMR; /* 69 */ - uint32_t RESERVED3[14]; - __IO uint32_t MMCTGFSCCR; /* 84 */ - __IO uint32_t MMCTGFMSCCR; - uint32_t RESERVED4[5]; - __IO uint32_t MMCTGFCR; - uint32_t RESERVED5[10]; - __IO uint32_t MMCRFCECR; - __IO uint32_t MMCRFAECR; - uint32_t RESERVED6[10]; - __IO uint32_t MMCRGUFCR; - uint32_t RESERVED7[334]; - __IO uint32_t PTPTSCR; - __IO uint32_t PTPSSIR; - __IO uint32_t PTPTSHR; - __IO uint32_t PTPTSLR; - __IO uint32_t PTPTSHUR; - __IO uint32_t PTPTSLUR; - __IO uint32_t PTPTSAR; - __IO uint32_t PTPTTHR; - __IO uint32_t PTPTTLR; - __IO uint32_t RESERVED8; - __IO uint32_t PTPTSSR; - uint32_t RESERVED9[565]; - __IO uint32_t DMABMR; - __IO uint32_t DMATPDR; - __IO uint32_t DMARPDR; - __IO uint32_t DMARDLAR; - __IO uint32_t DMATDLAR; - __IO uint32_t DMASR; - __IO uint32_t DMAOMR; - __IO uint32_t DMAIER; - __IO uint32_t DMAMFBOCR; - __IO uint32_t DMARSWTR; - uint32_t RESERVED10[8]; - __IO uint32_t DMACHTDR; - __IO uint32_t DMACHRDR; - __IO uint32_t DMACHTBAR; - __IO uint32_t DMACHRBAR; -} ETH_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ - __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ - __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ - __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ - __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ - __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ -} EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ - __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ - __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ - __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ - __IO uint32_t OPTCR; /*!< FLASH option control register , Address offset: 0x14 */ - __IO uint32_t OPTCR1; /*!< FLASH option control register 1, Address offset: 0x18 */ -} FLASH_TypeDef; - -/** - * @brief Flexible Memory Controller - */ - -typedef struct -{ - __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ -} FMC_Bank1_TypeDef; - -/** - * @brief Flexible Memory Controller Bank1E - */ - -typedef struct -{ - __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ -} FMC_Bank1E_TypeDef; -/** - * @brief Flexible Memory Controller Bank2 - */ - -typedef struct -{ - __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ - __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ - __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ - __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ - uint32_t RESERVED0; /*!< Reserved, 0x70 */ - __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ - uint32_t RESERVED1; /*!< Reserved, 0x78 */ - uint32_t RESERVED2; /*!< Reserved, 0x7C */ - __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ - __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ - __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ - __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ - uint32_t RESERVED3; /*!< Reserved, 0x90 */ - __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ -} FMC_Bank2_3_TypeDef; - -/** - * @brief Flexible Memory Controller Bank4 - */ - -typedef struct -{ - __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ - __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ - __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ - __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ - __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ -} FMC_Bank4_TypeDef; - -/** - * @brief Flexible Memory Controller Bank5_6 - */ - -typedef struct -{ - __IO uint32_t SDCR[2]; /*!< SDRAM Control registers , Address offset: 0x140-0x144 */ - __IO uint32_t SDTR[2]; /*!< SDRAM Timing registers , Address offset: 0x148-0x14C */ - __IO uint32_t SDCMR; /*!< SDRAM Command Mode register, Address offset: 0x150 */ - __IO uint32_t SDRTR; /*!< SDRAM Refresh Timer register, Address offset: 0x154 */ - __IO uint32_t SDSR; /*!< SDRAM Status register, Address offset: 0x158 */ -} FMC_Bank5_6_TypeDef; - -/** - * @brief General Purpose I/O - */ - -typedef struct -{ - __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ - __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ - __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ - __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ - __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ - __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ - __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ - __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ - __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ -} GPIO_TypeDef; - -/** - * @brief System configuration controller - */ - -typedef struct -{ - __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ - __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ - __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ - uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ - __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ -} SYSCFG_TypeDef; - -/** - * @brief Inter-integrated Circuit Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ - __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ - __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ - __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ - __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ - __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ - __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ - __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ - __IO uint32_t FLTR; /*!< I2C FLTR register, Address offset: 0x24 */ -} I2C_TypeDef; - -/** - * @brief Independent WATCHDOG - */ - -typedef struct -{ - __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ - __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ - __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ -} IWDG_TypeDef; - -/** - * @brief LCD-TFT Display Controller - */ - -typedef struct -{ - uint32_t RESERVED0[2]; /*!< Reserved, 0x00-0x04 */ - __IO uint32_t SSCR; /*!< LTDC Synchronization Size Configuration Register, Address offset: 0x08 */ - __IO uint32_t BPCR; /*!< LTDC Back Porch Configuration Register, Address offset: 0x0C */ - __IO uint32_t AWCR; /*!< LTDC Active Width Configuration Register, Address offset: 0x10 */ - __IO uint32_t TWCR; /*!< LTDC Total Width Configuration Register, Address offset: 0x14 */ - __IO uint32_t GCR; /*!< LTDC Global Control Register, Address offset: 0x18 */ - uint32_t RESERVED1[2]; /*!< Reserved, 0x1C-0x20 */ - __IO uint32_t SRCR; /*!< LTDC Shadow Reload Configuration Register, Address offset: 0x24 */ - uint32_t RESERVED2[1]; /*!< Reserved, 0x28 */ - __IO uint32_t BCCR; /*!< LTDC Background Color Configuration Register, Address offset: 0x2C */ - uint32_t RESERVED3[1]; /*!< Reserved, 0x30 */ - __IO uint32_t IER; /*!< LTDC Interrupt Enable Register, Address offset: 0x34 */ - __IO uint32_t ISR; /*!< LTDC Interrupt Status Register, Address offset: 0x38 */ - __IO uint32_t ICR; /*!< LTDC Interrupt Clear Register, Address offset: 0x3C */ - __IO uint32_t LIPCR; /*!< LTDC Line Interrupt Position Configuration Register, Address offset: 0x40 */ - __IO uint32_t CPSR; /*!< LTDC Current Position Status Register, Address offset: 0x44 */ - __IO uint32_t CDSR; /*!< LTDC Current Display Status Register, Address offset: 0x48 */ -} LTDC_TypeDef; - -/** - * @brief LCD-TFT Display layer x Controller - */ - -typedef struct -{ - __IO uint32_t CR; /*!< LTDC Layerx Control Register Address offset: 0x84 */ - __IO uint32_t WHPCR; /*!< LTDC Layerx Window Horizontal Position Configuration Register Address offset: 0x88 */ - __IO uint32_t WVPCR; /*!< LTDC Layerx Window Vertical Position Configuration Register Address offset: 0x8C */ - __IO uint32_t CKCR; /*!< LTDC Layerx Color Keying Configuration Register Address offset: 0x90 */ - __IO uint32_t PFCR; /*!< LTDC Layerx Pixel Format Configuration Register Address offset: 0x94 */ - __IO uint32_t CACR; /*!< LTDC Layerx Constant Alpha Configuration Register Address offset: 0x98 */ - __IO uint32_t DCCR; /*!< LTDC Layerx Default Color Configuration Register Address offset: 0x9C */ - __IO uint32_t BFCR; /*!< LTDC Layerx Blending Factors Configuration Register Address offset: 0xA0 */ - uint32_t RESERVED0[2]; /*!< Reserved */ - __IO uint32_t CFBAR; /*!< LTDC Layerx Color Frame Buffer Address Register Address offset: 0xAC */ - __IO uint32_t CFBLR; /*!< LTDC Layerx Color Frame Buffer Length Register Address offset: 0xB0 */ - __IO uint32_t CFBLNR; /*!< LTDC Layerx ColorFrame Buffer Line Number Register Address offset: 0xB4 */ - uint32_t RESERVED1[3]; /*!< Reserved */ - __IO uint32_t CLUTWR; /*!< LTDC Layerx CLUT Write Register Address offset: 0x144*/ -} LTDC_Layer_TypeDef; - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ - __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ -} PWR_TypeDef; - -/** - * @brief Reset and Clock Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ - __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ - __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ - __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ - __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ - __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ - __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ - uint32_t RESERVED0; /*!< Reserved, 0x1C */ - __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ - __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ - uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ - __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ - __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ - __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ - uint32_t RESERVED2; /*!< Reserved, 0x3C */ - __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ - __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ - uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ - __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ - __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ - __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ - uint32_t RESERVED4; /*!< Reserved, 0x5C */ - __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ - __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ - uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ - __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ - __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ - uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ - __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ - __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ - __IO uint32_t PLLSAICFGR; /*!< RCC PLLSAI configuration register, Address offset: 0x88 */ - __IO uint32_t DCKCFGR; /*!< RCC Dedicated Clocks configuration register, Address offset: 0x8C */ -} RCC_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ - __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ - __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ - __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ - __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ - __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ - __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ - __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ - __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ - __IO uint32_t SSR; /*!< RTC sub second register, Address offset: 0x28 */ - __IO uint32_t SHIFTR; /*!< RTC shift control register, Address offset: 0x2C */ - __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ - __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ - __IO uint32_t TSSSR; /*!< RTC time-stamp sub second register, Address offset: 0x38 */ - __IO uint32_t CALR; /*!< RTC calibration register, Address offset: 0x3C */ - __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ - __IO uint32_t ALRMASSR;/*!< RTC alarm A sub second register, Address offset: 0x44 */ - __IO uint32_t ALRMBSSR;/*!< RTC alarm B sub second register, Address offset: 0x48 */ - uint32_t RESERVED7; /*!< Reserved, 0x4C */ - __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ - __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ - __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ - __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ - __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ - __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ - __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ - __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ - __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ - __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ - __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ - __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ - __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ - __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ - __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ - __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ - __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ - __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ - __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ - __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ -} RTC_TypeDef; - -/** - * @brief Serial Audio Interface - */ - -typedef struct -{ - __IO uint32_t GCR; /*!< SAI global configuration register, Address offset: 0x00 */ -} SAI_TypeDef; - -typedef struct -{ - __IO uint32_t CR1; /*!< SAI block x configuration register 1, Address offset: 0x04 */ - __IO uint32_t CR2; /*!< SAI block x configuration register 2, Address offset: 0x08 */ - __IO uint32_t FRCR; /*!< SAI block x frame configuration register, Address offset: 0x0C */ - __IO uint32_t SLOTR; /*!< SAI block x slot register, Address offset: 0x10 */ - __IO uint32_t IMR; /*!< SAI block x interrupt mask register, Address offset: 0x14 */ - __IO uint32_t SR; /*!< SAI block x status register, Address offset: 0x18 */ - __IO uint32_t CLRFR; /*!< SAI block x clear flag register, Address offset: 0x1C */ - __IO uint32_t DR; /*!< SAI block x data register, Address offset: 0x20 */ -} SAI_Block_TypeDef; - -/** - * @brief SD host Interface - */ - -typedef struct -{ - __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ - __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ - __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ - __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ - __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ - __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ - __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ - __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ - __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ - __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ - __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ - __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ - __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ - __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ - __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ - __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ - uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ - __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ - uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ - __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ -} SDIO_TypeDef; - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ - __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ - __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ - __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ - __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ - __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ - __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ - __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ - __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ -} SPI_TypeDef; - - -/** - * @brief TIM - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ - __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ - __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ - __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ - __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ - __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ - __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ - __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ - __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ - __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ - __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ - __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ - __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ - __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ - __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ - __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ - __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ - __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ - __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ - __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ -} TIM_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ - __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ - __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ - __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ - __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ - __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ -} USART_TypeDef; - -/** - * @brief Window WATCHDOG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ - __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ - __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ -} WWDG_TypeDef; - -/** - * @brief RNG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ - __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ - __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ -} RNG_TypeDef; - -/** - * @brief USB_OTG_Core_Registers - */ -typedef struct -{ - __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register 000h */ - __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register 004h */ - __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register 008h */ - __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register 00Ch */ - __IO uint32_t GRSTCTL; /*!< Core Reset Register 010h */ - __IO uint32_t GINTSTS; /*!< Core Interrupt Register 014h */ - __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register 018h */ - __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register 01Ch */ - __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register 020h */ - __IO uint32_t GRXFSIZ; /*!< Receive FIFO Size Register 024h */ - __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register 028h */ - __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg 02Ch */ - uint32_t Reserved30[2]; /*!< Reserved 030h */ - __IO uint32_t GCCFG; /*!< General Purpose IO Register 038h */ - __IO uint32_t CID; /*!< User ID Register 03Ch */ - uint32_t Reserved40[48]; /*!< Reserved 0x40-0xFF */ - __IO uint32_t HPTXFSIZ; /*!< Host Periodic Tx FIFO Size Reg 100h */ - __IO uint32_t DIEPTXF[0x0F]; /*!< dev Periodic Transmit FIFO */ -} USB_OTG_GlobalTypeDef; - -/** - * @brief USB_OTG_device_Registers - */ -typedef struct -{ - __IO uint32_t DCFG; /*!< dev Configuration Register 800h */ - __IO uint32_t DCTL; /*!< dev Control Register 804h */ - __IO uint32_t DSTS; /*!< dev Status Register (RO) 808h */ - uint32_t Reserved0C; /*!< Reserved 80Ch */ - __IO uint32_t DIEPMSK; /*!< dev IN Endpoint Mask 810h */ - __IO uint32_t DOEPMSK; /*!< dev OUT Endpoint Mask 814h */ - __IO uint32_t DAINT; /*!< dev All Endpoints Itr Reg 818h */ - __IO uint32_t DAINTMSK; /*!< dev All Endpoints Itr Mask 81Ch */ - uint32_t Reserved20; /*!< Reserved 820h */ - uint32_t Reserved9; /*!< Reserved 824h */ - __IO uint32_t DVBUSDIS; /*!< dev VBUS discharge Register 828h */ - __IO uint32_t DVBUSPULSE; /*!< dev VBUS Pulse Register 82Ch */ - __IO uint32_t DTHRCTL; /*!< dev threshold 830h */ - __IO uint32_t DIEPEMPMSK; /*!< dev empty msk 834h */ - __IO uint32_t DEACHINT; /*!< dedicated EP interrupt 838h */ - __IO uint32_t DEACHMSK; /*!< dedicated EP msk 83Ch */ - uint32_t Reserved40; /*!< dedicated EP mask 840h */ - __IO uint32_t DINEP1MSK; /*!< dedicated EP mask 844h */ - uint32_t Reserved44[15]; /*!< Reserved 844-87Ch */ - __IO uint32_t DOUTEP1MSK; /*!< dedicated EP msk 884h */ -} USB_OTG_DeviceTypeDef; - -/** - * @brief USB_OTG_IN_Endpoint-Specific_Register - */ -typedef struct -{ - __IO uint32_t DIEPCTL; /*!< dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h */ - uint32_t Reserved04; /*!< Reserved 900h + (ep_num * 20h) + 04h */ - __IO uint32_t DIEPINT; /*!< dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h */ - uint32_t Reserved0C; /*!< Reserved 900h + (ep_num * 20h) + 0Ch */ - __IO uint32_t DIEPTSIZ; /*!< IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h */ - __IO uint32_t DIEPDMA; /*!< IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h */ - __IO uint32_t DTXFSTS; /*!< IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h */ - uint32_t Reserved18; /*!< Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch */ -} USB_OTG_INEndpointTypeDef; - -/** - * @brief USB_OTG_OUT_Endpoint-Specific_Registers - */ -typedef struct -{ - __IO uint32_t DOEPCTL; /*!< dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h */ - uint32_t Reserved04; /*!< Reserved B00h + (ep_num * 20h) + 04h */ - __IO uint32_t DOEPINT; /*!< dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h */ - uint32_t Reserved0C; /*!< Reserved B00h + (ep_num * 20h) + 0Ch */ - __IO uint32_t DOEPTSIZ; /*!< dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h */ - __IO uint32_t DOEPDMA; /*!< dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h */ - uint32_t Reserved18[2]; /*!< Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch */ -} USB_OTG_OUTEndpointTypeDef; - -/** - * @brief USB_OTG_Host_Mode_Register_Structures - */ -typedef struct -{ - __IO uint32_t HCFG; /*!< Host Configuration Register 400h */ - __IO uint32_t HFIR; /*!< Host Frame Interval Register 404h */ - __IO uint32_t HFNUM; /*!< Host Frame Nbr/Frame Remaining 408h */ - uint32_t Reserved40C; /*!< Reserved 40Ch */ - __IO uint32_t HPTXSTS; /*!< Host Periodic Tx FIFO/ Queue Status 410h */ - __IO uint32_t HAINT; /*!< Host All Channels Interrupt Register 414h */ - __IO uint32_t HAINTMSK; /*!< Host All Channels Interrupt Mask 418h */ -} USB_OTG_HostTypeDef; - -/** - * @brief USB_OTG_Host_Channel_Specific_Registers - */ -typedef struct -{ - __IO uint32_t HCCHAR; /*!< Host Channel Characteristics Register 500h */ - __IO uint32_t HCSPLT; /*!< Host Channel Split Control Register 504h */ - __IO uint32_t HCINT; /*!< Host Channel Interrupt Register 508h */ - __IO uint32_t HCINTMSK; /*!< Host Channel Interrupt Mask Register 50Ch */ - __IO uint32_t HCTSIZ; /*!< Host Channel Transfer Size Register 510h */ - __IO uint32_t HCDMA; /*!< Host Channel DMA Address Register 514h */ - uint32_t Reserved[2]; /*!< Reserved */ -} USB_OTG_HostChannelTypeDef; - -/** - * @} - */ - -/** @addtogroup Peripheral_memory_map - * @{ - */ -#define FLASH_BASE 0x08000000UL /*!< FLASH(up to 2 MB) base address in the alias region */ -#define CCMDATARAM_BASE 0x10000000UL /*!< CCM(core coupled memory) data RAM(64 KB) base address in the alias region */ -#define SRAM1_BASE 0x20000000UL /*!< SRAM1(112 KB) base address in the alias region */ -#define SRAM2_BASE 0x2001C000UL /*!< SRAM2(16 KB) base address in the alias region */ -#define SRAM3_BASE 0x20020000UL /*!< SRAM3(64 KB) base address in the alias region */ -#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */ -#define BKPSRAM_BASE 0x40024000UL /*!< Backup SRAM(4 KB) base address in the alias region */ -#define FMC_R_BASE 0xA0000000UL /*!< FMC registers base address */ -#define SRAM1_BB_BASE 0x22000000UL /*!< SRAM1(112 KB) base address in the bit-band region */ -#define SRAM2_BB_BASE 0x22380000UL /*!< SRAM2(16 KB) base address in the bit-band region */ -#define SRAM3_BB_BASE 0x22400000UL /*!< SRAM3(64 KB) base address in the bit-band region */ -#define PERIPH_BB_BASE 0x42000000UL /*!< Peripheral base address in the bit-band region */ -#define BKPSRAM_BB_BASE 0x42480000UL /*!< Backup SRAM(4 KB) base address in the bit-band region */ -#define FLASH_END 0x081FFFFFUL /*!< FLASH end address */ -#define FLASH_OTP_BASE 0x1FFF7800UL /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ -#define FLASH_OTP_END 0x1FFF7A0FUL /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ -#define CCMDATARAM_END 0x1000FFFFUL /*!< CCM data RAM end address */ - -/* Legacy defines */ -#define SRAM_BASE SRAM1_BASE -#define SRAM_BB_BASE SRAM1_BB_BASE - -/*!< Peripheral memory map */ -#define APB1PERIPH_BASE PERIPH_BASE -#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) -#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL) -#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000UL) - -/*!< APB1 peripherals */ -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000UL) -#define TIM3_BASE (APB1PERIPH_BASE + 0x0400UL) -#define TIM4_BASE (APB1PERIPH_BASE + 0x0800UL) -#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00UL) -#define TIM6_BASE (APB1PERIPH_BASE + 0x1000UL) -#define TIM7_BASE (APB1PERIPH_BASE + 0x1400UL) -#define TIM12_BASE (APB1PERIPH_BASE + 0x1800UL) -#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00UL) -#define TIM14_BASE (APB1PERIPH_BASE + 0x2000UL) -#define RTC_BASE (APB1PERIPH_BASE + 0x2800UL) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00UL) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000UL) -#define I2S2ext_BASE (APB1PERIPH_BASE + 0x3400UL) -#define SPI2_BASE (APB1PERIPH_BASE + 0x3800UL) -#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00UL) -#define I2S3ext_BASE (APB1PERIPH_BASE + 0x4000UL) -#define USART2_BASE (APB1PERIPH_BASE + 0x4400UL) -#define USART3_BASE (APB1PERIPH_BASE + 0x4800UL) -#define UART4_BASE (APB1PERIPH_BASE + 0x4C00UL) -#define UART5_BASE (APB1PERIPH_BASE + 0x5000UL) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400UL) -#define I2C2_BASE (APB1PERIPH_BASE + 0x5800UL) -#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00UL) -#define CAN1_BASE (APB1PERIPH_BASE + 0x6400UL) -#define CAN2_BASE (APB1PERIPH_BASE + 0x6800UL) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000UL) -#define DAC_BASE (APB1PERIPH_BASE + 0x7400UL) -#define UART7_BASE (APB1PERIPH_BASE + 0x7800UL) -#define UART8_BASE (APB1PERIPH_BASE + 0x7C00UL) - -/*!< APB2 peripherals */ -#define TIM1_BASE (APB2PERIPH_BASE + 0x0000UL) -#define TIM8_BASE (APB2PERIPH_BASE + 0x0400UL) -#define USART1_BASE (APB2PERIPH_BASE + 0x1000UL) -#define USART6_BASE (APB2PERIPH_BASE + 0x1400UL) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2000UL) -#define ADC2_BASE (APB2PERIPH_BASE + 0x2100UL) -#define ADC3_BASE (APB2PERIPH_BASE + 0x2200UL) -#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300UL) -/* Legacy define */ -#define ADC_BASE ADC123_COMMON_BASE -#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00UL) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000UL) -#define SPI4_BASE (APB2PERIPH_BASE + 0x3400UL) -#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800UL) -#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00UL) -#define TIM9_BASE (APB2PERIPH_BASE + 0x4000UL) -#define TIM10_BASE (APB2PERIPH_BASE + 0x4400UL) -#define TIM11_BASE (APB2PERIPH_BASE + 0x4800UL) -#define SPI5_BASE (APB2PERIPH_BASE + 0x5000UL) -#define SPI6_BASE (APB2PERIPH_BASE + 0x5400UL) -#define SAI1_BASE (APB2PERIPH_BASE + 0x5800UL) -#define SAI1_Block_A_BASE (SAI1_BASE + 0x004UL) -#define SAI1_Block_B_BASE (SAI1_BASE + 0x024UL) -#define LTDC_BASE (APB2PERIPH_BASE + 0x6800UL) -#define LTDC_Layer1_BASE (LTDC_BASE + 0x84UL) -#define LTDC_Layer2_BASE (LTDC_BASE + 0x104UL) - -/*!< AHB1 peripherals */ -#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000UL) -#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400UL) -#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800UL) -#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00UL) -#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000UL) -#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400UL) -#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800UL) -#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00UL) -#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000UL) -#define GPIOJ_BASE (AHB1PERIPH_BASE + 0x2400UL) -#define GPIOK_BASE (AHB1PERIPH_BASE + 0x2800UL) -#define CRC_BASE (AHB1PERIPH_BASE + 0x3000UL) -#define RCC_BASE (AHB1PERIPH_BASE + 0x3800UL) -#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00UL) -#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000UL) -#define DMA1_Stream0_BASE (DMA1_BASE + 0x010UL) -#define DMA1_Stream1_BASE (DMA1_BASE + 0x028UL) -#define DMA1_Stream2_BASE (DMA1_BASE + 0x040UL) -#define DMA1_Stream3_BASE (DMA1_BASE + 0x058UL) -#define DMA1_Stream4_BASE (DMA1_BASE + 0x070UL) -#define DMA1_Stream5_BASE (DMA1_BASE + 0x088UL) -#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0UL) -#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8UL) -#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400UL) -#define DMA2_Stream0_BASE (DMA2_BASE + 0x010UL) -#define DMA2_Stream1_BASE (DMA2_BASE + 0x028UL) -#define DMA2_Stream2_BASE (DMA2_BASE + 0x040UL) -#define DMA2_Stream3_BASE (DMA2_BASE + 0x058UL) -#define DMA2_Stream4_BASE (DMA2_BASE + 0x070UL) -#define DMA2_Stream5_BASE (DMA2_BASE + 0x088UL) -#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0UL) -#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8UL) -#define ETH_BASE (AHB1PERIPH_BASE + 0x8000UL) -#define ETH_MAC_BASE (ETH_BASE) -#define ETH_MMC_BASE (ETH_BASE + 0x0100UL) -#define ETH_PTP_BASE (ETH_BASE + 0x0700UL) -#define ETH_DMA_BASE (ETH_BASE + 0x1000UL) -#define DMA2D_BASE (AHB1PERIPH_BASE + 0xB000UL) - -/*!< AHB2 peripherals */ -#define DCMI_BASE (AHB2PERIPH_BASE + 0x50000UL) -#define RNG_BASE (AHB2PERIPH_BASE + 0x60800UL) - -/*!< FMC Bankx registers base address */ -#define FMC_Bank1_R_BASE (FMC_R_BASE + 0x0000UL) -#define FMC_Bank1E_R_BASE (FMC_R_BASE + 0x0104UL) -#define FMC_Bank2_3_R_BASE (FMC_R_BASE + 0x0060UL) -#define FMC_Bank4_R_BASE (FMC_R_BASE + 0x00A0UL) -#define FMC_Bank5_6_R_BASE (FMC_R_BASE + 0x0140UL) - - -/*!< Debug MCU registers base address */ -#define DBGMCU_BASE 0xE0042000UL -/*!< USB registers base address */ -#define USB_OTG_HS_PERIPH_BASE 0x40040000UL -#define USB_OTG_FS_PERIPH_BASE 0x50000000UL - -#define USB_OTG_GLOBAL_BASE 0x000UL -#define USB_OTG_DEVICE_BASE 0x800UL -#define USB_OTG_IN_ENDPOINT_BASE 0x900UL -#define USB_OTG_OUT_ENDPOINT_BASE 0xB00UL -#define USB_OTG_EP_REG_SIZE 0x20UL -#define USB_OTG_HOST_BASE 0x400UL -#define USB_OTG_HOST_PORT_BASE 0x440UL -#define USB_OTG_HOST_CHANNEL_BASE 0x500UL -#define USB_OTG_HOST_CHANNEL_SIZE 0x20UL -#define USB_OTG_PCGCCTL_BASE 0xE00UL -#define USB_OTG_FIFO_BASE 0x1000UL -#define USB_OTG_FIFO_SIZE 0x1000UL - -#define UID_BASE 0x1FFF7A10UL /*!< Unique device ID register base address */ -#define FLASHSIZE_BASE 0x1FFF7A22UL /*!< FLASH Size register base address */ -#define PACKAGE_BASE 0x1FFF7BF0UL /*!< Package size register base address */ -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM4 ((TIM_TypeDef *) TIM4_BASE) -#define TIM5 ((TIM_TypeDef *) TIM5_BASE) -#define TIM6 ((TIM_TypeDef *) TIM6_BASE) -#define TIM7 ((TIM_TypeDef *) TIM7_BASE) -#define TIM12 ((TIM_TypeDef *) TIM12_BASE) -#define TIM13 ((TIM_TypeDef *) TIM13_BASE) -#define TIM14 ((TIM_TypeDef *) TIM14_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define I2S2ext ((SPI_TypeDef *) I2S2ext_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define SPI3 ((SPI_TypeDef *) SPI3_BASE) -#define I2S3ext ((SPI_TypeDef *) I2S3ext_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define USART3 ((USART_TypeDef *) USART3_BASE) -#define UART4 ((USART_TypeDef *) UART4_BASE) -#define UART5 ((USART_TypeDef *) UART5_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define I2C3 ((I2C_TypeDef *) I2C3_BASE) -#define CAN1 ((CAN_TypeDef *) CAN1_BASE) -#define CAN2 ((CAN_TypeDef *) CAN2_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define DAC1 ((DAC_TypeDef *) DAC_BASE) -#define DAC ((DAC_TypeDef *) DAC_BASE) /* Kept for legacy purpose */ -#define UART7 ((USART_TypeDef *) UART7_BASE) -#define UART8 ((USART_TypeDef *) UART8_BASE) -#define TIM1 ((TIM_TypeDef *) TIM1_BASE) -#define TIM8 ((TIM_TypeDef *) TIM8_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC2 ((ADC_TypeDef *) ADC2_BASE) -#define ADC3 ((ADC_TypeDef *) ADC3_BASE) -#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) -/* Legacy define */ -#define ADC ADC123_COMMON -#define SDIO ((SDIO_TypeDef *) SDIO_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define SPI4 ((SPI_TypeDef *) SPI4_BASE) -#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) -#define TIM9 ((TIM_TypeDef *) TIM9_BASE) -#define TIM10 ((TIM_TypeDef *) TIM10_BASE) -#define TIM11 ((TIM_TypeDef *) TIM11_BASE) -#define SPI5 ((SPI_TypeDef *) SPI5_BASE) -#define SPI6 ((SPI_TypeDef *) SPI6_BASE) -#define SAI1 ((SAI_TypeDef *) SAI1_BASE) -#define SAI1_Block_A ((SAI_Block_TypeDef *)SAI1_Block_A_BASE) -#define SAI1_Block_B ((SAI_Block_TypeDef *)SAI1_Block_B_BASE) -#define LTDC ((LTDC_TypeDef *)LTDC_BASE) -#define LTDC_Layer1 ((LTDC_Layer_TypeDef *)LTDC_Layer1_BASE) -#define LTDC_Layer2 ((LTDC_Layer_TypeDef *)LTDC_Layer2_BASE) -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) -#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) -#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) -#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) -#define GPIOJ ((GPIO_TypeDef *) GPIOJ_BASE) -#define GPIOK ((GPIO_TypeDef *) GPIOK_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) -#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) -#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) -#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) -#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) -#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) -#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) -#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) -#define DMA2 ((DMA_TypeDef *) DMA2_BASE) -#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) -#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) -#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) -#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) -#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) -#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) -#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) -#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) -#define ETH ((ETH_TypeDef *) ETH_BASE) -#define DMA2D ((DMA2D_TypeDef *)DMA2D_BASE) -#define DCMI ((DCMI_TypeDef *) DCMI_BASE) -#define RNG ((RNG_TypeDef *) RNG_BASE) -#define FMC_Bank1 ((FMC_Bank1_TypeDef *) FMC_Bank1_R_BASE) -#define FMC_Bank1E ((FMC_Bank1E_TypeDef *) FMC_Bank1E_R_BASE) -#define FMC_Bank2_3 ((FMC_Bank2_3_TypeDef *) FMC_Bank2_3_R_BASE) -#define FMC_Bank4 ((FMC_Bank4_TypeDef *) FMC_Bank4_R_BASE) -#define FMC_Bank5_6 ((FMC_Bank5_6_TypeDef *) FMC_Bank5_6_R_BASE) -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) -#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) -#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - -/** @addtogroup Hardware_Constant_Definition - * @{ - */ -#define LSI_STARTUP_TIME 40U /*!< LSI Maximum startup time in us */ -/** - * @} - */ - -/** @addtogroup Peripheral_Registers_Bits_Definition -* @{ -*/ - -/******************************************************************************/ -/* Peripheral Registers_Bits_Definition */ -/******************************************************************************/ - -/******************************************************************************/ -/* */ -/* Analog to Digital Converter */ -/* */ -/******************************************************************************/ -/* - * @brief Specific device feature definitions (not present on all devices in the STM32F4 series) - */ -#define ADC_MULTIMODE_SUPPORT /*!> SCB_CCSIDR_ASSOCIATIVITY_Pos) -#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) - -#ifndef __SCB_DCACHE_LINE_SIZE -#define __SCB_DCACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ -#endif - -#ifndef __SCB_ICACHE_LINE_SIZE -#define __SCB_ICACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ -#endif - -/** - \brief Enable I-Cache - \details Turns on I-Cache - */ -__STATIC_FORCEINLINE void SCB_EnableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - if (SCB->CCR & SCB_CCR_IC_Msk) return; /* return if ICache is already enabled */ - - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable I-Cache - \details Turns off I-Cache - */ -__STATIC_FORCEINLINE void SCB_DisableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate I-Cache - \details Invalidates I-Cache - */ -__STATIC_FORCEINLINE void SCB_InvalidateICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; - __DSB(); - __ISB(); - #endif -} - - -/** - \brief I-Cache Invalidate by address - \details Invalidates I-Cache for the given address. - I-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. - I-Cache memory blocks which are part of given address + given size are invalidated. - \param[in] addr address - \param[in] isize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_InvalidateICache_by_Addr (volatile void *addr, int32_t isize) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - if ( isize > 0 ) { - int32_t op_size = isize + (((uint32_t)addr) & (__SCB_ICACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_ICACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->ICIMVAU = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_ICACHE_LINE_SIZE; - op_size -= __SCB_ICACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief Enable D-Cache - \details Turns on D-Cache - */ -__STATIC_FORCEINLINE void SCB_EnableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */ - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - __DSB(); - - SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable D-Cache - \details Turns off D-Cache - */ -__STATIC_FORCEINLINE void SCB_DisableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate D-Cache - \details Invalidates D-Cache - */ -__STATIC_FORCEINLINE void SCB_InvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean D-Cache - \details Cleans D-Cache - */ -__STATIC_FORCEINLINE void SCB_CleanDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | - ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean & Invalidate D-Cache - \details Cleans and Invalidates D-Cache - */ -__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief D-Cache Invalidate by address - \details Invalidates D-Cache for the given address. - D-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are invalidated. - \param[in] addr address - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_InvalidateDCache_by_Addr (volatile void *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief D-Cache Clean by address - \details Cleans D-Cache for the given address - D-Cache is cleaned starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are cleaned. - \param[in] addr address - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_CleanDCache_by_Addr (volatile void *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCCMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief D-Cache Clean and Invalidate by address - \details Cleans and invalidates D_Cache for the given address - D-Cache is cleaned and invalidated starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are cleaned and invalidated. - \param[in] addr address (aligned to 32-byte boundary) - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache_by_Addr (volatile void *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - -/*@} end of CMSIS_Core_CacheFunctions */ - -#endif /* ARM_CACHEL1_ARMV7_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_armcc.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_armcc.h deleted file mode 100644 index a955d47..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_armcc.h +++ /dev/null @@ -1,888 +0,0 @@ -/**************************************************************************//** - * @file cmsis_armcc.h - * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file - * @version V5.3.2 - * @date 27. May 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 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 */ - /* __ARM_ARCH_8_1M_MAIN__ not applicable */ - -/* CMSIS compiler control DSP macros */ -#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - #define __ARM_FEATURE_DSP 1 -#endif - -/* 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 -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __memory_changed() -#endif - -/* ######################### Startup and Lowlevel Init ######################## */ - -#ifndef __PROGRAM_START -#define __PROGRAM_START __main -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section("RESET"))) -#endif - -/* ########################## 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() __isb(0xF) - -/** - \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() __dsb(0xF) - -/** - \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() __dmb(0xF) - - -/** - \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 */ - - -/* ########################### 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 special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -/* intrinsic void __enable_irq(); */ - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting special-purpose register PRIMASK. - 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; - __ISB(); -} - - -/** - \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 special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -#define __enable_fault_irq __enable_fiq - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. - 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 */ - - -/* ################### 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)) - -#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) - -#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) - -#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCC_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_armclang.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_armclang.h deleted file mode 100644 index 6911417..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_armclang.h +++ /dev/null @@ -1,1503 +0,0 @@ -/**************************************************************************//** - * @file cmsis_armclang.h - * @brief CMSIS compiler armclang (Arm Compiler 6) header file - * @version V5.4.3 - * @date 27. May 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 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. - */ - -/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ - -#ifndef __CMSIS_ARMCLANG_H -#define __CMSIS_ARMCLANG_H - -#pragma clang system_header /* treat file as system include file */ - -/* 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 __attribute__((always_inline)) 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, aligned(1))) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed, aligned(1))) -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #pragma clang diagnostic pop - #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 - #define __RESTRICT __restrict -#endif -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __ASM volatile("":::"memory") -#endif - -/* ######################### Startup and Lowlevel Init ######################## */ - -#ifndef __PROGRAM_START -#define __PROGRAM_START __main -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section("RESET"))) -#endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#ifndef __STACK_SEAL -#define __STACK_SEAL Image$$STACKSEAL$$ZI$$Base -#endif - -#ifndef __TZ_STACK_SEAL_SIZE -#define __TZ_STACK_SEAL_SIZE 8U -#endif - -#ifndef __TZ_STACK_SEAL_VALUE -#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL -#endif - - -__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { - *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; -} -#endif - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/* Define macros for porting to both thumb1 and thumb2. - * For thumb1, use low register (r0-r7), specified by constraint "l" - * Otherwise, use general registers, specified by constraint "r" */ -#if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_RW_REG(r) "+l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) -#else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_RW_REG(r) "+r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) -#endif - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __builtin_arm_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 __builtin_arm_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 __builtin_arm_wfe - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __builtin_arm_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() __builtin_arm_isb(0xF) - -/** - \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() __builtin_arm_dsb(0xF) - - -/** - \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() __builtin_arm_dmb(0xF) - - -/** - \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(value) __builtin_bswap32(value) - - -/** - \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 - */ -#define __REV16(value) __ROR(__REV(value), 16) - - -/** - \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 - */ -#define __REVSH(value) (int16_t)__builtin_bswap16(value) - - -/** - \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 - */ -__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - op2 %= 32U; - if (op2 == 0U) - { - return op1; - } - return (op1 >> op2) | (op1 << (32U - op2)); -} - - -/** - \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) __ASM volatile ("bkpt "#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 - */ -#define __RBIT __builtin_arm_rbit - -/** - \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 - */ -__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) -{ - /* Even though __builtin_clz produces a CLZ instruction on ARM, formally - __builtin_clz(0) is undefined behaviour, so handle this case specially. - This guarantees ARM-compatible results if happening to compile on a non-ARM - target, and ensures the compiler doesn't decide to activate any - optimisations using the logic "value was passed to __builtin_clz, so it - is non-zero". - ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a - single CLZ instruction. - */ - if (value == 0U) - { - return 32U; - } - return __builtin_clz(value); -} - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 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) - */ -#define __LDREXB (uint8_t)__builtin_arm_ldrex - - -/** - \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) - */ -#define __LDREXH (uint16_t)__builtin_arm_ldrex - - -/** - \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) - */ -#define __LDREXW (uint32_t)__builtin_arm_ldrex - - -/** - \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 - */ -#define __STREXB (uint32_t)__builtin_arm_strex - - -/** - \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 - */ -#define __STREXH (uint32_t)__builtin_arm_strex - - -/** - \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 - */ -#define __STREXW (uint32_t)__builtin_arm_strex - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -#define __CLREX __builtin_arm_clrex - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 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 - */ -#define __SSAT __builtin_arm_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 __builtin_arm_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 - */ -__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \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) - */ -__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \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) - */ -__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \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) - */ -__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \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 - */ -__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \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 - */ -__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \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 - */ -__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); -} - -#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 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 - */ -__STATIC_FORCEINLINE 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 - */ -__STATIC_FORCEINLINE 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)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) - -/** - \brief Load-Acquire (8 bit) - \details Executes a LDAB instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire (16 bit) - \details Executes a LDAH instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire (32 bit) - \details Executes a LDA instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return(result); -} - - -/** - \brief Store-Release (8 bit) - \details Executes a STLB instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (16 bit) - \details Executes a STLH instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (32 bit) - \details Executes a STL instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Load-Acquire Exclusive (8 bit) - \details Executes a LDAB exclusive instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDAEXB (uint8_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (16 bit) - \details Executes a LDAH exclusive instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDAEXH (uint16_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (32 bit) - \details Executes a LDA exclusive instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDAEX (uint32_t)__builtin_arm_ldaex - - -/** - \brief Store-Release Exclusive (8 bit) - \details Executes a STLB exclusive 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 - */ -#define __STLEXB (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (16 bit) - \details Executes a STLH exclusive 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 - */ -#define __STLEXH (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (32 bit) - \details Executes a STL exclusive 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 - */ -#define __STLEX (uint32_t)__builtin_arm_stlex - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ########################### 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 special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -#ifndef __ARM_COMPAT_H -__STATIC_FORCEINLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i" : : : "memory"); -} -#endif - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -#ifndef __ARM_COMPAT_H -__STATIC_FORCEINLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i" : : : "memory"); -} -#endif - - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Control Register (non-secure) - \details Returns the content of the non-secure Control Register when in secure mode. - \return non-secure Control Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); - __ISB(); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Control Register (non-secure) - \details Writes the given value to the non-secure Control Register when in secure state. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); - __ISB(); -} -#endif - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \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_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); -} -#endif - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \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_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); -} -#endif - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Stack Pointer (non-secure) - \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. - \return SP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. - \param [in] topOfStack Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) -{ - __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); -} -#endif - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Priority Mask (non-secure) - \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Priority Mask (non-secure) - \details Assigns the given value to the non-secure Priority Mask Register when in secure state. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) -{ - __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); -} -#endif - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f" : : : "memory"); -} - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f" : : : "memory"); -} - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Base Priority (non-secure) - \details Returns the current value of the non-secure Base Priority register when in secure state. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Base Priority (non-secure) - \details Assigns the given value to the non-secure Base Priority register when in secure state. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); -} -#endif - - -/** - \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_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Fault Mask (non-secure) - \details Returns the current value of the non-secure Fault Mask register when in secure state. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Fault Mask (non-secure) - \details Assigns the given value to the non-secure Fault Mask register when in secure state. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); -} -#endif - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) - -/** - \brief Get Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim" : "=r" (result) ); - return result; -#endif -} - -#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); -#endif -} -#endif - - -/** - \brief Get Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim" : "=r" (result) ); - return result; -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). - \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. - \param [in] MainStackPtrLimit Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); -#endif -} -#endif - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr -#else -#define __get_FPSCR() ((uint32_t)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 - */ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#define __set_FPSCR __builtin_arm_set_fpscr -#else -#define __set_FPSCR(x) ((void)(x)) -#endif - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) - -#define __SADD8 __builtin_arm_sadd8 -#define __QADD8 __builtin_arm_qadd8 -#define __SHADD8 __builtin_arm_shadd8 -#define __UADD8 __builtin_arm_uadd8 -#define __UQADD8 __builtin_arm_uqadd8 -#define __UHADD8 __builtin_arm_uhadd8 -#define __SSUB8 __builtin_arm_ssub8 -#define __QSUB8 __builtin_arm_qsub8 -#define __SHSUB8 __builtin_arm_shsub8 -#define __USUB8 __builtin_arm_usub8 -#define __UQSUB8 __builtin_arm_uqsub8 -#define __UHSUB8 __builtin_arm_uhsub8 -#define __SADD16 __builtin_arm_sadd16 -#define __QADD16 __builtin_arm_qadd16 -#define __SHADD16 __builtin_arm_shadd16 -#define __UADD16 __builtin_arm_uadd16 -#define __UQADD16 __builtin_arm_uqadd16 -#define __UHADD16 __builtin_arm_uhadd16 -#define __SSUB16 __builtin_arm_ssub16 -#define __QSUB16 __builtin_arm_qsub16 -#define __SHSUB16 __builtin_arm_shsub16 -#define __USUB16 __builtin_arm_usub16 -#define __UQSUB16 __builtin_arm_uqsub16 -#define __UHSUB16 __builtin_arm_uhsub16 -#define __SASX __builtin_arm_sasx -#define __QASX __builtin_arm_qasx -#define __SHASX __builtin_arm_shasx -#define __UASX __builtin_arm_uasx -#define __UQASX __builtin_arm_uqasx -#define __UHASX __builtin_arm_uhasx -#define __SSAX __builtin_arm_ssax -#define __QSAX __builtin_arm_qsax -#define __SHSAX __builtin_arm_shsax -#define __USAX __builtin_arm_usax -#define __UQSAX __builtin_arm_uqsax -#define __UHSAX __builtin_arm_uhsax -#define __USAD8 __builtin_arm_usad8 -#define __USADA8 __builtin_arm_usada8 -#define __SSAT16 __builtin_arm_ssat16 -#define __USAT16 __builtin_arm_usat16 -#define __UXTB16 __builtin_arm_uxtb16 -#define __UXTAB16 __builtin_arm_uxtab16 -#define __SXTB16 __builtin_arm_sxtb16 -#define __SXTAB16 __builtin_arm_sxtab16 -#define __SMUAD __builtin_arm_smuad -#define __SMUADX __builtin_arm_smuadx -#define __SMLAD __builtin_arm_smlad -#define __SMLADX __builtin_arm_smladx -#define __SMLALD __builtin_arm_smlald -#define __SMLALDX __builtin_arm_smlaldx -#define __SMUSD __builtin_arm_smusd -#define __SMUSDX __builtin_arm_smusdx -#define __SMLSD __builtin_arm_smlsd -#define __SMLSDX __builtin_arm_smlsdx -#define __SMLSLD __builtin_arm_smlsld -#define __SMLSLDX __builtin_arm_smlsldx -#define __SEL __builtin_arm_sel -#define __QADD __builtin_arm_qadd -#define __QSUB __builtin_arm_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 __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) - -#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) - -__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) -{ - int32_t result; - - __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#endif /* (__ARM_FEATURE_DSP == 1) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCLANG_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_armclang_ltm.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_armclang_ltm.h deleted file mode 100644 index 1e255d5..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_armclang_ltm.h +++ /dev/null @@ -1,1928 +0,0 @@ -/**************************************************************************//** - * @file cmsis_armclang_ltm.h - * @brief CMSIS compiler armclang (Arm Compiler 6) header file - * @version V1.5.3 - * @date 27. May 2021 - ******************************************************************************/ -/* - * Copyright (c) 2018-2021 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. - */ - -/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ - -#ifndef __CMSIS_ARMCLANG_H -#define __CMSIS_ARMCLANG_H - -#pragma clang system_header /* treat file as system include file */ - -/* 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 __attribute__((always_inline)) 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, aligned(1))) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed, aligned(1))) -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #pragma clang diagnostic pop - #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 - #define __RESTRICT __restrict -#endif -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __ASM volatile("":::"memory") -#endif - -/* ######################### Startup and Lowlevel Init ######################## */ - -#ifndef __PROGRAM_START -#define __PROGRAM_START __main -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section("RESET"))) -#endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#ifndef __STACK_SEAL -#define __STACK_SEAL Image$$STACKSEAL$$ZI$$Base -#endif - -#ifndef __TZ_STACK_SEAL_SIZE -#define __TZ_STACK_SEAL_SIZE 8U -#endif - -#ifndef __TZ_STACK_SEAL_VALUE -#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL -#endif - - -__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { - *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; -} -#endif - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/* Define macros for porting to both thumb1 and thumb2. - * For thumb1, use low register (r0-r7), specified by constraint "l" - * Otherwise, use general registers, specified by constraint "r" */ -#if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) -#else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) -#endif - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __builtin_arm_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 __builtin_arm_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 __builtin_arm_wfe - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __builtin_arm_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() __builtin_arm_isb(0xF) - -/** - \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() __builtin_arm_dsb(0xF) - - -/** - \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() __builtin_arm_dmb(0xF) - - -/** - \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(value) __builtin_bswap32(value) - - -/** - \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 - */ -#define __REV16(value) __ROR(__REV(value), 16) - - -/** - \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 - */ -#define __REVSH(value) (int16_t)__builtin_bswap16(value) - - -/** - \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 - */ -__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - op2 %= 32U; - if (op2 == 0U) - { - return op1; - } - return (op1 >> op2) | (op1 << (32U - op2)); -} - - -/** - \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) __ASM volatile ("bkpt "#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 - */ -#define __RBIT __builtin_arm_rbit - -/** - \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 - */ -__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) -{ - /* Even though __builtin_clz produces a CLZ instruction on ARM, formally - __builtin_clz(0) is undefined behaviour, so handle this case specially. - This guarantees ARM-compatible results if happening to compile on a non-ARM - target, and ensures the compiler doesn't decide to activate any - optimisations using the logic "value was passed to __builtin_clz, so it - is non-zero". - ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a - single CLZ instruction. - */ - if (value == 0U) - { - return 32U; - } - return __builtin_clz(value); -} - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 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) - */ -#define __LDREXB (uint8_t)__builtin_arm_ldrex - - -/** - \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) - */ -#define __LDREXH (uint16_t)__builtin_arm_ldrex - - -/** - \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) - */ -#define __LDREXW (uint32_t)__builtin_arm_ldrex - - -/** - \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 - */ -#define __STREXB (uint32_t)__builtin_arm_strex - - -/** - \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 - */ -#define __STREXH (uint32_t)__builtin_arm_strex - - -/** - \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 - */ -#define __STREXW (uint32_t)__builtin_arm_strex - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -#define __CLREX __builtin_arm_clrex - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 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 - */ -#define __SSAT __builtin_arm_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 __builtin_arm_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 - */ -__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \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) - */ -__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \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) - */ -__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \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) - */ -__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \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 - */ -__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \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 - */ -__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \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 - */ -__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); -} - -#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 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 - */ -__STATIC_FORCEINLINE 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 - */ -__STATIC_FORCEINLINE 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)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) -/** - \brief Load-Acquire (8 bit) - \details Executes a LDAB instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire (16 bit) - \details Executes a LDAH instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire (32 bit) - \details Executes a LDA instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return(result); -} - - -/** - \brief Store-Release (8 bit) - \details Executes a STLB instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (16 bit) - \details Executes a STLH instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (32 bit) - \details Executes a STL instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Load-Acquire Exclusive (8 bit) - \details Executes a LDAB exclusive instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDAEXB (uint8_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (16 bit) - \details Executes a LDAH exclusive instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDAEXH (uint16_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (32 bit) - \details Executes a LDA exclusive instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDAEX (uint32_t)__builtin_arm_ldaex - - -/** - \brief Store-Release Exclusive (8 bit) - \details Executes a STLB exclusive 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 - */ -#define __STLEXB (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (16 bit) - \details Executes a STLH exclusive 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 - */ -#define __STLEXH (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (32 bit) - \details Executes a STL exclusive 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 - */ -#define __STLEX (uint32_t)__builtin_arm_stlex - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ########################### 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 special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -#ifndef __ARM_COMPAT_H -__STATIC_FORCEINLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i" : : : "memory"); -} -#endif - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -#ifndef __ARM_COMPAT_H -__STATIC_FORCEINLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i" : : : "memory"); -} -#endif - - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Control Register (non-secure) - \details Returns the content of the non-secure Control Register when in secure mode. - \return non-secure Control Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); - __ISB(); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Control Register (non-secure) - \details Writes the given value to the non-secure Control Register when in secure state. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); - __ISB(); -} -#endif - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \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_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); -} -#endif - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \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_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); -} -#endif - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Stack Pointer (non-secure) - \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. - \return SP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. - \param [in] topOfStack Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) -{ - __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); -} -#endif - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Priority Mask (non-secure) - \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Priority Mask (non-secure) - \details Assigns the given value to the non-secure Priority Mask Register when in secure state. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) -{ - __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); -} -#endif - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f" : : : "memory"); -} - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f" : : : "memory"); -} - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Base Priority (non-secure) - \details Returns the current value of the non-secure Base Priority register when in secure state. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Base Priority (non-secure) - \details Assigns the given value to the non-secure Base Priority register when in secure state. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); -} -#endif - - -/** - \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_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Fault Mask (non-secure) - \details Returns the current value of the non-secure Fault Mask register when in secure state. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Fault Mask (non-secure) - \details Assigns the given value to the non-secure Fault Mask register when in secure state. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); -} -#endif - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) - -/** - \brief Get Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) -{ -#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 - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim" : "=r" (result) ); - return result; -#endif -} - -#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) -{ -#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)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); -#endif -} -#endif - - -/** - \brief Get Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) -{ -#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 - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim" : "=r" (result) ); - return result; -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). - \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) -{ -#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)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. - \param [in] MainStackPtrLimit Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); -#endif -} -#endif - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr -#else -#define __get_FPSCR() ((uint32_t)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 - */ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#define __set_FPSCR __builtin_arm_set_fpscr -#else -#define __set_FPSCR(x) ((void)(x)) -#endif - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) - -__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SSAT16(ARG1,ARG2) \ -({ \ - int32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -#define __USAT16(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -#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 __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) - -#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) - -__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) -{ - int32_t result; - - __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#endif /* (__ARM_FEATURE_DSP == 1) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCLANG_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_compiler.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_compiler.h deleted file mode 100644 index adbf296..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_compiler.h +++ /dev/null @@ -1,283 +0,0 @@ -/**************************************************************************//** - * @file cmsis_compiler.h - * @brief CMSIS compiler generic header file - * @version V5.1.0 - * @date 09. October 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 - -/* - * Arm Compiler 4/5 - */ -#if defined ( __CC_ARM ) - #include "cmsis_armcc.h" - - -/* - * Arm Compiler 6.6 LTM (armclang) - */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) - #include "cmsis_armclang_ltm.h" - - /* - * Arm Compiler above 6.10.1 (armclang) - */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) - #include "cmsis_armclang.h" - - -/* - * GNU Compiler - */ -#elif defined ( __GNUC__ ) - #include "cmsis_gcc.h" - - -/* - * IAR Compiler - */ -#elif defined ( __ICCARM__ ) - #include - - -/* - * TI Arm Compiler - */ -#elif defined ( __TI_ARM__ ) - #include - - #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 - #define __RESTRICT __restrict - #endif - #ifndef __COMPILER_BARRIER - #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. - #define __COMPILER_BARRIER() (void)0 - #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 - #ifndef __COMPILER_BARRIER - #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. - #define __COMPILER_BARRIER() (void)0 - #endif - - -/* - * COSMIC Compiler - */ -#elif defined ( __CSMC__ ) - #include - - #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 - #ifndef __COMPILER_BARRIER - #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. - #define __COMPILER_BARRIER() (void)0 - #endif - - -#else - #error Unknown compiler. -#endif - - -#endif /* __CMSIS_COMPILER_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_gcc.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_gcc.h deleted file mode 100644 index 67bda4e..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_gcc.h +++ /dev/null @@ -1,2211 +0,0 @@ -/**************************************************************************//** - * @file cmsis_gcc.h - * @brief CMSIS compiler GCC header file - * @version V5.4.1 - * @date 27. May 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 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_GCC_H -#define __CMSIS_GCC_H - -/* ignore some GCC warnings */ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wsign-conversion" -#pragma GCC diagnostic ignored "-Wconversion" -#pragma GCC diagnostic ignored "-Wunused-parameter" - -/* Fallback for __has_builtin */ -#ifndef __has_builtin - #define __has_builtin(x) (0) -#endif - -/* 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 __attribute__((always_inline)) 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, aligned(1))) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed, aligned(1))) -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #pragma GCC diagnostic pop - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpacked" - #pragma GCC diagnostic ignored "-Wattributes" - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #pragma GCC diagnostic pop - #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 - #define __RESTRICT __restrict -#endif -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __ASM volatile("":::"memory") -#endif - -/* ######################### Startup and Lowlevel Init ######################## */ - -#ifndef __PROGRAM_START - -/** - \brief Initializes data and bss sections - \details This default implementations initialized all data and additional bss - sections relying on .copy.table and .zero.table specified properly - in the used linker script. - - */ -__STATIC_FORCEINLINE __NO_RETURN void __cmsis_start(void) -{ - extern void _start(void) __NO_RETURN; - - typedef struct { - uint32_t const* src; - uint32_t* dest; - uint32_t wlen; - } __copy_table_t; - - typedef struct { - uint32_t* dest; - uint32_t wlen; - } __zero_table_t; - - extern const __copy_table_t __copy_table_start__; - extern const __copy_table_t __copy_table_end__; - extern const __zero_table_t __zero_table_start__; - extern const __zero_table_t __zero_table_end__; - - for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) { - for(uint32_t i=0u; iwlen; ++i) { - pTable->dest[i] = pTable->src[i]; - } - } - - for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) { - for(uint32_t i=0u; iwlen; ++i) { - pTable->dest[i] = 0u; - } - } - - _start(); -} - -#define __PROGRAM_START __cmsis_start -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP __StackTop -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT __StackLimit -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section(".vectors"))) -#endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#ifndef __STACK_SEAL -#define __STACK_SEAL __StackSeal -#endif - -#ifndef __TZ_STACK_SEAL_SIZE -#define __TZ_STACK_SEAL_SIZE 8U -#endif - -#ifndef __TZ_STACK_SEAL_VALUE -#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL -#endif - - -__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { - *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; -} -#endif - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/* Define macros for porting to both thumb1 and thumb2. - * For thumb1, use low register (r0-r7), specified by constraint "l" - * Otherwise, use general registers, specified by constraint "r" */ -#if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_RW_REG(r) "+l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) -#else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_RW_REG(r) "+r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) -#endif - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP() __ASM volatile ("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() __ASM volatile ("wfi":::"memory") - - -/** - \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() __ASM volatile ("wfe":::"memory") - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV() __ASM volatile ("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. - */ -__STATIC_FORCEINLINE void __ISB(void) -{ - __ASM volatile ("isb 0xF":::"memory"); -} - - -/** - \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. - */ -__STATIC_FORCEINLINE void __DSB(void) -{ - __ASM volatile ("dsb 0xF":::"memory"); -} - - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -__STATIC_FORCEINLINE void __DMB(void) -{ - __ASM volatile ("dmb 0xF":::"memory"); -} - - -/** - \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 - */ -__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) -{ -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) - return __builtin_bswap32(value); -#else - uint32_t result; - - __ASM ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return result; -#endif -} - - -/** - \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 - */ -__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) -{ - uint32_t result; - - __ASM ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return result; -} - - -/** - \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 - */ -__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) -{ -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - return (int16_t)__builtin_bswap16(value); -#else - int16_t result; - - __ASM ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return result; -#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 - */ -__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - op2 %= 32U; - if (op2 == 0U) - { - return op1; - } - return (op1 >> op2) | (op1 << (32U - op2)); -} - - -/** - \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) __ASM volatile ("bkpt "#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 - */ -__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) - __ASM ("rbit %0, %1" : "=r" (result) : "r" (value) ); -#else - 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 */ -#endif - return result; -} - - -/** - \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 - */ -__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) -{ - /* Even though __builtin_clz produces a CLZ instruction on ARM, formally - __builtin_clz(0) is undefined behaviour, so handle this case specially. - This guarantees ARM-compatible results if happening to compile on a non-ARM - target, and ensures the compiler doesn't decide to activate any - optimisations using the logic "value was passed to __builtin_clz, so it - is non-zero". - ARM GCC 7.3 and possibly earlier will optimise this test away, leaving a - single CLZ instruction. - */ - if (value == 0U) - { - return 32U; - } - return __builtin_clz(value); -} - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 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) - */ -__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); -#endif - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \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) - */ -__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); -#endif - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \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) - */ -__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); - return(result); -} - - -/** - \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 - */ -__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); - return(result); -} - - -/** - \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 - */ -__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); - return(result); -} - - -/** - \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 - */ -__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); - return(result); -} - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -__STATIC_FORCEINLINE void __CLREX(void) -{ - __ASM volatile ("clrex" ::: "memory"); -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] ARG1 Value to be saturated - \param [in] ARG2 Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT(ARG1, ARG2) \ -__extension__ \ -({ \ - int32_t __RES, __ARG1 = (ARG1); \ - __ASM volatile ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ - __RES; \ - }) - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] ARG1 Value to be saturated - \param [in] ARG2 Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT(ARG1, ARG2) \ -__extension__ \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM volatile ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ - __RES; \ - }) - - -/** - \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 - */ -__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \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) - */ -__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); -#endif - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \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) - */ -__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); -#endif - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \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) - */ -__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \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 - */ -__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \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 - */ -__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \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 - */ -__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); -} - -#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 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 - */ -__STATIC_FORCEINLINE 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 - */ -__STATIC_FORCEINLINE 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)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) -/** - \brief Load-Acquire (8 bit) - \details Executes a LDAB instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire (16 bit) - \details Executes a LDAH instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire (32 bit) - \details Executes a LDA instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return(result); -} - - -/** - \brief Store-Release (8 bit) - \details Executes a STLB instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (16 bit) - \details Executes a STLH instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (32 bit) - \details Executes a STL instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Load-Acquire Exclusive (8 bit) - \details Executes a LDAB exclusive instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire Exclusive (16 bit) - \details Executes a LDAH exclusive instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire Exclusive (32 bit) - \details Executes a LDA exclusive instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return(result); -} - - -/** - \brief Store-Release Exclusive (8 bit) - \details Executes a STLB exclusive 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 - */ -__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); - return(result); -} - - -/** - \brief Store-Release Exclusive (16 bit) - \details Executes a STLH exclusive 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 - */ -__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); - return(result); -} - - -/** - \brief Store-Release Exclusive (32 bit) - \details Executes a STL exclusive 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 - */ -__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); - return(result); -} - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ########################### 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 special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i" : : : "memory"); -} - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting special-purpose register PRIMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i" : : : "memory"); -} - - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Control Register (non-secure) - \details Returns the content of the non-secure Control Register when in secure mode. - \return non-secure Control Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); - __ISB(); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Control Register (non-secure) - \details Writes the given value to the non-secure Control Register when in secure state. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); - __ISB(); -} -#endif - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \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_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); -} -#endif - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \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_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); -} -#endif - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Stack Pointer (non-secure) - \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. - \return SP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. - \param [in] topOfStack Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) -{ - __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); -} -#endif - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Priority Mask (non-secure) - \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Priority Mask (non-secure) - \details Assigns the given value to the non-secure Priority Mask Register when in secure state. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) -{ - __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); -} -#endif - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f" : : : "memory"); -} - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. - Can only be executed in Privileged modes. - */ -__STATIC_FORCEINLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f" : : : "memory"); -} - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Base Priority (non-secure) - \details Returns the current value of the non-secure Base Priority register when in secure state. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Base Priority (non-secure) - \details Assigns the given value to the non-secure Base Priority register when in secure state. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); -} -#endif - - -/** - \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_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Fault Mask (non-secure) - \details Returns the current value of the non-secure Fault Mask register when in secure state. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Fault Mask (non-secure) - \details Assigns the given value to the non-secure Fault Mask register when in secure state. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); -} -#endif - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) - -/** - \brief Get Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) -{ -#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 - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim" : "=r" (result) ); - return result; -#endif -} - -#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) -{ -#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)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); -#endif -} -#endif - - -/** - \brief Get Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) -{ -#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 - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim" : "=r" (result) ); - return result; -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). - \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) -{ -#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)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. - \param [in] MainStackPtrLimit Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) -{ -#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); -#endif -} -#endif - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ - - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#if __has_builtin(__builtin_arm_get_fpscr) -// Re-enable using built-in when GCC has been fixed -// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) - /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ - return __builtin_arm_get_fpscr(); -#else - uint32_t result; - - __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); - return(result); -#endif -#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_FORCEINLINE void __set_FPSCR(uint32_t fpscr) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#if __has_builtin(__builtin_arm_set_fpscr) -// Re-enable using built-in when GCC has been fixed -// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) - /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ - __builtin_arm_set_fpscr(fpscr); -#else - __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); -#endif -#else - (void)fpscr; -#endif -} - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) - -__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SSAT16(ARG1, ARG2) \ -__extension__ \ -({ \ - int32_t __RES, __ARG1 = (ARG1); \ - __ASM volatile ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ - __RES; \ - }) - -#define __USAT16(ARG1, ARG2) \ -__extension__ \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM volatile ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ - __RES; \ - }) - -__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SXTB16_RORn(uint32_t op1, uint32_t rotate) -{ - uint32_t result; - if (__builtin_constant_p(rotate) && ((rotate == 8U) || (rotate == 16U) || (rotate == 24U))) { - __ASM volatile ("sxtb16 %0, %1, ROR %2" : "=r" (result) : "r" (op1), "i" (rotate) ); - } else { - result = __SXTB16(__ROR(op1, rotate)) ; - } - return result; -} - -__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SXTAB16_RORn(uint32_t op1, uint32_t op2, uint32_t rotate) -{ - uint32_t result; - if (__builtin_constant_p(rotate) && ((rotate == 8U) || (rotate == 16U) || (rotate == 24U))) { - __ASM volatile ("sxtab16 %0, %1, %2, ROR %3" : "=r" (result) : "r" (op1) , "r" (op2) , "i" (rotate)); - } else { - result = __SXTAB16(op1, __ROR(op2, rotate)); - } - return result; -} - - -__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -#define __PKHBT(ARG1,ARG2,ARG3) \ -__extension__ \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - -#define __PKHTB(ARG1,ARG2,ARG3) \ -__extension__ \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - if (ARG3 == 0) \ - __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ - else \ - __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - - -__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) -{ - int32_t result; - - __ASM ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#endif /* (__ARM_FEATURE_DSP == 1) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#pragma GCC diagnostic pop - -#endif /* __CMSIS_GCC_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_iccarm.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_iccarm.h deleted file mode 100644 index 65b824b..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_iccarm.h +++ /dev/null @@ -1,1002 +0,0 @@ -/**************************************************************************//** - * @file cmsis_iccarm.h - * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file - * @version V5.3.0 - * @date 14. April 2021 - ******************************************************************************/ - -//------------------------------------------------------------------------------ -// -// Copyright (c) 2017-2021 IAR Systems -// Copyright (c) 2017-2021 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 -// 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 __COMPILER_BARRIER - #define __COMPILER_BARRIER() __ASM volatile("":::"memory") -#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 - #if __ICCARM_V8 - #define __RESTRICT __restrict - #else - /* Needs IAR language extensions */ - #define __RESTRICT restrict - #endif -#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 - -#undef __WEAK /* undo the definition from DLib_Defaults.h */ -#ifndef __WEAK - #if __ICCARM_V8 - #define __WEAK __attribute__((weak)) - #else - #define __WEAK _Pragma("__weak") - #endif -#endif - -#ifndef __PROGRAM_START -#define __PROGRAM_START __iar_program_start -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP CSTACK$$Limit -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT CSTACK$$Base -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __vector_table -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE @".intvec" -#endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#ifndef __STACK_SEAL -#define __STACK_SEAL STACKSEAL$$Base -#endif - -#ifndef __TZ_STACK_SEAL_SIZE -#define __TZ_STACK_SEAL_SIZE 8U -#endif - -#ifndef __TZ_STACK_SEAL_VALUE -#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL -#endif - -__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { - *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; -} -#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))) - -__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) -{ - __arm_wsr("CONTROL", control); - __iar_builtin_ISB(); -} - - #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")) - -__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __arm_wsr("CONTROL_NS", control); - __iar_builtin_ISB(); -} - - #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 - - #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 volatile("RRX %0, %1" : "=r"(result) : "r" (value)); - 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_builtin_ISB(); - } - - __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 volatile ("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 volatile ("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 volatile ("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); - return res; - } - - __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) - { - __ASM volatile ("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); - } - - __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) - { - __ASM volatile ("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); - } - - __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) - { - __ASM volatile ("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 - -#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) - -#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) - -#endif /* __CMSIS_ICCARM_H__ */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_version.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_version.h deleted file mode 100644 index 8b4765f..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/cmsis_version.h +++ /dev/null @@ -1,39 +0,0 @@ -/**************************************************************************//** - * @file cmsis_version.h - * @brief CMSIS Core(M) Version definitions - * @version V5.0.5 - * @date 02. February 2022 - ******************************************************************************/ -/* - * Copyright (c) 2009-2022 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 ( 6U) /*!< [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 diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_armv81mml.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_armv81mml.h deleted file mode 100644 index 94128a1..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_armv81mml.h +++ /dev/null @@ -1,4228 +0,0 @@ -/**************************************************************************//** - * @file core_armv81mml.h - * @brief CMSIS Armv8.1-M Mainline Core Peripheral Access Layer Header File - * @version V1.4.2 - * @date 13. October 2021 - ******************************************************************************/ -/* - * Copyright (c) 2018-2021 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 */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_ARMV81MML_H_GENERIC -#define __CORE_ARMV81MML_H_GENERIC - -#include - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_ARMV81MML - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS ARMV81MML definitions */ -#define __ARMv81MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __ARMv81MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __ARMv81MML_CMSIS_VERSION ((__ARMv81MML_CMSIS_VERSION_MAIN << 16U) | \ - __ARMv81MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (81U) /*!< Cortex-M Core */ - -#if defined ( __CC_ARM ) - #error Legacy Arm Compiler does not support Armv8.1-M target architecture. -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV81MML_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_ARMV81MML_H_DEPENDANT -#define __CORE_ARMV81MML_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __ARMv81MML_REV - #define __ARMv81MML_REV 0x0000U - #warning "__ARMv81MML_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #if __FPU_PRESENT != 0U - #ifndef __FPU_DP - #define __FPU_DP 0U - #warning "__FPU_DP not defined in device header file; using default!" - #endif - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __PMU_PRESENT - #define __PMU_PRESENT 0U - #warning "__PMU_PRESENT not defined in device header file; using default!" - #endif - - #if __PMU_PRESENT != 0U - #ifndef __PMU_NUM_EVENTCNT - #define __PMU_NUM_EVENTCNT 2U - #warning "__PMU_NUM_EVENTCNT not defined in device header file; using default!" - #elif (__PMU_NUM_EVENTCNT > 31 || __PMU_NUM_EVENTCNT < 2) - #error "__PMU_NUM_EVENTCNT is out of range in device header file!" */ - #endif - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #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 - - IO Type Qualifiers 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 ARMv81MML */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU 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:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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 */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE 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 nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV 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[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} 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 */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __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 */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - __IOM uint32_t RFSR; /*!< Offset: 0x204 (R/W) RAS Fault Status Register */ - uint32_t RESERVED4[14U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} 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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE 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 Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF 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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_IESB_Pos 5U /*!< SCB AIRCR: Implicit ESB Enable Position */ -#define SCB_AIRCR_IESB_Msk (1UL << SCB_AIRCR_IESB_Pos) /*!< SCB AIRCR: Implicit ESB Enable Mask */ - -#define SCB_AIRCR_DIT_Pos 4U /*!< SCB AIRCR: Data Independent Timing Position */ -#define SCB_AIRCR_DIT_Msk (1UL << SCB_AIRCR_DIT_Pos) /*!< SCB AIRCR: Data Independent Timing Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_TRD_Pos 20U /*!< SCB CCR: TRD Position */ -#define SCB_CCR_TRD_Msk (1UL << SCB_CCR_TRD_Pos) /*!< SCB CCR: TRD Mask */ - -#define SCB_CCR_LOB_Pos 19U /*!< SCB CCR: LOB Position */ -#define SCB_CCR_LOB_Msk (1UL << SCB_CCR_LOB_Pos) /*!< SCB CCR: LOB Mask */ - -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_PMU_Pos 5U /*!< SCB DFSR: PMU Position */ -#define SCB_DFSR_PMU_Msk (1UL << SCB_DFSR_PMU_Pos) /*!< SCB DFSR: PMU Mask */ - -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CP7_Pos 7U /*!< SCB NSACR: CP7 Position */ -#define SCB_NSACR_CP7_Msk (1UL << SCB_NSACR_CP7_Pos) /*!< SCB NSACR: CP7 Mask */ - -#define SCB_NSACR_CP6_Pos 6U /*!< SCB NSACR: CP6 Position */ -#define SCB_NSACR_CP6_Msk (1UL << SCB_NSACR_CP6_Pos) /*!< SCB NSACR: CP6 Mask */ - -#define SCB_NSACR_CP5_Pos 5U /*!< SCB NSACR: CP5 Position */ -#define SCB_NSACR_CP5_Msk (1UL << SCB_NSACR_CP5_Pos) /*!< SCB NSACR: CP5 Mask */ - -#define SCB_NSACR_CP4_Pos 4U /*!< SCB NSACR: CP4 Position */ -#define SCB_NSACR_CP4_Msk (1UL << SCB_NSACR_CP4_Pos) /*!< SCB NSACR: CP4 Mask */ - -#define SCB_NSACR_CP3_Pos 3U /*!< SCB NSACR: CP3 Position */ -#define SCB_NSACR_CP3_Msk (1UL << SCB_NSACR_CP3_Pos) /*!< SCB NSACR: CP3 Mask */ - -#define SCB_NSACR_CP2_Pos 2U /*!< SCB NSACR: CP2 Position */ -#define SCB_NSACR_CP2_Msk (1UL << SCB_NSACR_CP2_Pos) /*!< SCB NSACR: CP2 Mask */ - -#define SCB_NSACR_CP1_Pos 1U /*!< SCB NSACR: CP1 Position */ -#define SCB_NSACR_CP1_Msk (1UL << SCB_NSACR_CP1_Pos) /*!< SCB NSACR: CP1 Mask */ - -#define SCB_NSACR_CP0_Pos 0U /*!< SCB NSACR: CP0 Position */ -#define SCB_NSACR_CP0_Msk (1UL /*<< SCB_NSACR_CP0_Pos*/) /*!< SCB NSACR: CP0 Mask */ - -/* SCB Debug Feature Register 0 Definitions */ -#define SCB_ID_DFR_UDE_Pos 28U /*!< SCB ID_DFR: UDE Position */ -#define SCB_ID_DFR_UDE_Msk (0xFUL << SCB_ID_DFR_UDE_Pos) /*!< SCB ID_DFR: UDE Mask */ - -#define SCB_ID_DFR_MProfDbg_Pos 20U /*!< SCB ID_DFR: MProfDbg Position */ -#define SCB_ID_DFR_MProfDbg_Msk (0xFUL << SCB_ID_DFR_MProfDbg_Pos) /*!< SCB ID_DFR: MProfDbg Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB RAS Fault Status Register Definitions */ -#define SCB_RFSR_V_Pos 31U /*!< SCB RFSR: V Position */ -#define SCB_RFSR_V_Msk (1UL << SCB_RFSR_V_Pos) /*!< SCB RFSR: V Mask */ - -#define SCB_RFSR_IS_Pos 16U /*!< SCB RFSR: IS Position */ -#define SCB_RFSR_IS_Msk (0x7FFFUL << SCB_RFSR_IS_Pos) /*!< SCB RFSR: IS Mask */ - -#define SCB_RFSR_UET_Pos 0U /*!< SCB RFSR: UET Position */ -#define SCB_RFSR_UET_Msk (3UL /*<< SCB_RFSR_UET_Pos*/) /*!< SCB RFSR: UET Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set 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[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM 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_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[3U]; - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) ITM Device Type Register */ - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[809U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ - uint32_t RESERVED4[4U]; - __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ -#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFmt_Pos 0U /*!< TPI FFCR: EnFmt Position */ -#define TPI_FFCR_EnFmt_Msk (0x3UL << /*TPI_FFCR_EnFmt_Pos*/) /*!< TPI FFCR: EnFmt Mask */ - -/* TPI Periodic Synchronization Control Register Definitions */ -#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ -#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ - -/* TPI Software Lock Status Register Definitions */ -#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ -#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ - -#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ -#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ - -#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ -#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_PMU Performance Monitoring Unit (PMU) - \brief Type definitions for the Performance Monitoring Unit (PMU) - @{ - */ - -/** - \brief Structure type to access the Performance Monitoring Unit (PMU). - */ -typedef struct -{ - __IOM uint32_t EVCNTR[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x0 (R/W) PMU Event Counter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED0[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCNTR; /*!< Offset: 0x7C (R/W) PMU Cycle Counter Register */ - uint32_t RESERVED1[224]; - __IOM uint32_t EVTYPER[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x400 (R/W) PMU Event Type and Filter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED2[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCFILTR; /*!< Offset: 0x47C (R/W) PMU Cycle Counter Filter Register */ - uint32_t RESERVED3[480]; - __IOM uint32_t CNTENSET; /*!< Offset: 0xC00 (R/W) PMU Count Enable Set Register */ - uint32_t RESERVED4[7]; - __IOM uint32_t CNTENCLR; /*!< Offset: 0xC20 (R/W) PMU Count Enable Clear Register */ - uint32_t RESERVED5[7]; - __IOM uint32_t INTENSET; /*!< Offset: 0xC40 (R/W) PMU Interrupt Enable Set Register */ - uint32_t RESERVED6[7]; - __IOM uint32_t INTENCLR; /*!< Offset: 0xC60 (R/W) PMU Interrupt Enable Clear Register */ - uint32_t RESERVED7[7]; - __IOM uint32_t OVSCLR; /*!< Offset: 0xC80 (R/W) PMU Overflow Flag Status Clear Register */ - uint32_t RESERVED8[7]; - __IOM uint32_t SWINC; /*!< Offset: 0xCA0 (R/W) PMU Software Increment Register */ - uint32_t RESERVED9[7]; - __IOM uint32_t OVSSET; /*!< Offset: 0xCC0 (R/W) PMU Overflow Flag Status Set Register */ - uint32_t RESERVED10[79]; - __IOM uint32_t TYPE; /*!< Offset: 0xE00 (R/W) PMU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0xE04 (R/W) PMU Control Register */ - uint32_t RESERVED11[108]; - __IOM uint32_t AUTHSTATUS; /*!< Offset: 0xFB8 (R/W) PMU Authentication Status Register */ - __IOM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/W) PMU Device Architecture Register */ - uint32_t RESERVED12[3]; - __IOM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/W) PMU Device Type Register */ - __IOM uint32_t PIDR4; /*!< Offset: 0xFD0 (R/W) PMU Peripheral Identification Register 4 */ - uint32_t RESERVED13[3]; - __IOM uint32_t PIDR0; /*!< Offset: 0xFE0 (R/W) PMU Peripheral Identification Register 0 */ - __IOM uint32_t PIDR1; /*!< Offset: 0xFE4 (R/W) PMU Peripheral Identification Register 1 */ - __IOM uint32_t PIDR2; /*!< Offset: 0xFE8 (R/W) PMU Peripheral Identification Register 2 */ - __IOM uint32_t PIDR3; /*!< Offset: 0xFEC (R/W) PMU Peripheral Identification Register 3 */ - __IOM uint32_t CIDR0; /*!< Offset: 0xFF0 (R/W) PMU Component Identification Register 0 */ - __IOM uint32_t CIDR1; /*!< Offset: 0xFF4 (R/W) PMU Component Identification Register 1 */ - __IOM uint32_t CIDR2; /*!< Offset: 0xFF8 (R/W) PMU Component Identification Register 2 */ - __IOM uint32_t CIDR3; /*!< Offset: 0xFFC (R/W) PMU Component Identification Register 3 */ -} PMU_Type; - -/** \brief PMU Event Counter Registers (0-30) Definitions */ - -#define PMU_EVCNTR_CNT_Pos 0U /*!< PMU EVCNTR: Counter Position */ -#define PMU_EVCNTR_CNT_Msk (0xFFFFUL /*<< PMU_EVCNTRx_CNT_Pos*/) /*!< PMU EVCNTR: Counter Mask */ - -/** \brief PMU Event Type and Filter Registers (0-30) Definitions */ - -#define PMU_EVTYPER_EVENTTOCNT_Pos 0U /*!< PMU EVTYPER: Event to Count Position */ -#define PMU_EVTYPER_EVENTTOCNT_Msk (0xFFFFUL /*<< EVTYPERx_EVENTTOCNT_Pos*/) /*!< PMU EVTYPER: Event to Count Mask */ - -/** \brief PMU Count Enable Set Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENSET: Event Counter 0 Enable Set Position */ -#define PMU_CNTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENSET_CNT0_ENABLE_Pos*/) /*!< PMU CNTENSET: Event Counter 0 Enable Set Mask */ - -#define PMU_CNTENSET_CNT1_ENABLE_Pos 1U /*!< PMU CNTENSET: Event Counter 1 Enable Set Position */ -#define PMU_CNTENSET_CNT1_ENABLE_Msk (1UL << PMU_CNTENSET_CNT1_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 1 Enable Set Mask */ - -#define PMU_CNTENSET_CNT2_ENABLE_Pos 2U /*!< PMU CNTENSET: Event Counter 2 Enable Set Position */ -#define PMU_CNTENSET_CNT2_ENABLE_Msk (1UL << PMU_CNTENSET_CNT2_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 2 Enable Set Mask */ - -#define PMU_CNTENSET_CNT3_ENABLE_Pos 3U /*!< PMU CNTENSET: Event Counter 3 Enable Set Position */ -#define PMU_CNTENSET_CNT3_ENABLE_Msk (1UL << PMU_CNTENSET_CNT3_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 3 Enable Set Mask */ - -#define PMU_CNTENSET_CNT4_ENABLE_Pos 4U /*!< PMU CNTENSET: Event Counter 4 Enable Set Position */ -#define PMU_CNTENSET_CNT4_ENABLE_Msk (1UL << PMU_CNTENSET_CNT4_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 4 Enable Set Mask */ - -#define PMU_CNTENSET_CNT5_ENABLE_Pos 5U /*!< PMU CNTENSET: Event Counter 5 Enable Set Position */ -#define PMU_CNTENSET_CNT5_ENABLE_Msk (1UL << PMU_CNTENSET_CNT5_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 5 Enable Set Mask */ - -#define PMU_CNTENSET_CNT6_ENABLE_Pos 6U /*!< PMU CNTENSET: Event Counter 6 Enable Set Position */ -#define PMU_CNTENSET_CNT6_ENABLE_Msk (1UL << PMU_CNTENSET_CNT6_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 6 Enable Set Mask */ - -#define PMU_CNTENSET_CNT7_ENABLE_Pos 7U /*!< PMU CNTENSET: Event Counter 7 Enable Set Position */ -#define PMU_CNTENSET_CNT7_ENABLE_Msk (1UL << PMU_CNTENSET_CNT7_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 7 Enable Set Mask */ - -#define PMU_CNTENSET_CNT8_ENABLE_Pos 8U /*!< PMU CNTENSET: Event Counter 8 Enable Set Position */ -#define PMU_CNTENSET_CNT8_ENABLE_Msk (1UL << PMU_CNTENSET_CNT8_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 8 Enable Set Mask */ - -#define PMU_CNTENSET_CNT9_ENABLE_Pos 9U /*!< PMU CNTENSET: Event Counter 9 Enable Set Position */ -#define PMU_CNTENSET_CNT9_ENABLE_Msk (1UL << PMU_CNTENSET_CNT9_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 9 Enable Set Mask */ - -#define PMU_CNTENSET_CNT10_ENABLE_Pos 10U /*!< PMU CNTENSET: Event Counter 10 Enable Set Position */ -#define PMU_CNTENSET_CNT10_ENABLE_Msk (1UL << PMU_CNTENSET_CNT10_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 10 Enable Set Mask */ - -#define PMU_CNTENSET_CNT11_ENABLE_Pos 11U /*!< PMU CNTENSET: Event Counter 11 Enable Set Position */ -#define PMU_CNTENSET_CNT11_ENABLE_Msk (1UL << PMU_CNTENSET_CNT11_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 11 Enable Set Mask */ - -#define PMU_CNTENSET_CNT12_ENABLE_Pos 12U /*!< PMU CNTENSET: Event Counter 12 Enable Set Position */ -#define PMU_CNTENSET_CNT12_ENABLE_Msk (1UL << PMU_CNTENSET_CNT12_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 12 Enable Set Mask */ - -#define PMU_CNTENSET_CNT13_ENABLE_Pos 13U /*!< PMU CNTENSET: Event Counter 13 Enable Set Position */ -#define PMU_CNTENSET_CNT13_ENABLE_Msk (1UL << PMU_CNTENSET_CNT13_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 13 Enable Set Mask */ - -#define PMU_CNTENSET_CNT14_ENABLE_Pos 14U /*!< PMU CNTENSET: Event Counter 14 Enable Set Position */ -#define PMU_CNTENSET_CNT14_ENABLE_Msk (1UL << PMU_CNTENSET_CNT14_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 14 Enable Set Mask */ - -#define PMU_CNTENSET_CNT15_ENABLE_Pos 15U /*!< PMU CNTENSET: Event Counter 15 Enable Set Position */ -#define PMU_CNTENSET_CNT15_ENABLE_Msk (1UL << PMU_CNTENSET_CNT15_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 15 Enable Set Mask */ - -#define PMU_CNTENSET_CNT16_ENABLE_Pos 16U /*!< PMU CNTENSET: Event Counter 16 Enable Set Position */ -#define PMU_CNTENSET_CNT16_ENABLE_Msk (1UL << PMU_CNTENSET_CNT16_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 16 Enable Set Mask */ - -#define PMU_CNTENSET_CNT17_ENABLE_Pos 17U /*!< PMU CNTENSET: Event Counter 17 Enable Set Position */ -#define PMU_CNTENSET_CNT17_ENABLE_Msk (1UL << PMU_CNTENSET_CNT17_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 17 Enable Set Mask */ - -#define PMU_CNTENSET_CNT18_ENABLE_Pos 18U /*!< PMU CNTENSET: Event Counter 18 Enable Set Position */ -#define PMU_CNTENSET_CNT18_ENABLE_Msk (1UL << PMU_CNTENSET_CNT18_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 18 Enable Set Mask */ - -#define PMU_CNTENSET_CNT19_ENABLE_Pos 19U /*!< PMU CNTENSET: Event Counter 19 Enable Set Position */ -#define PMU_CNTENSET_CNT19_ENABLE_Msk (1UL << PMU_CNTENSET_CNT19_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 19 Enable Set Mask */ - -#define PMU_CNTENSET_CNT20_ENABLE_Pos 20U /*!< PMU CNTENSET: Event Counter 20 Enable Set Position */ -#define PMU_CNTENSET_CNT20_ENABLE_Msk (1UL << PMU_CNTENSET_CNT20_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 20 Enable Set Mask */ - -#define PMU_CNTENSET_CNT21_ENABLE_Pos 21U /*!< PMU CNTENSET: Event Counter 21 Enable Set Position */ -#define PMU_CNTENSET_CNT21_ENABLE_Msk (1UL << PMU_CNTENSET_CNT21_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 21 Enable Set Mask */ - -#define PMU_CNTENSET_CNT22_ENABLE_Pos 22U /*!< PMU CNTENSET: Event Counter 22 Enable Set Position */ -#define PMU_CNTENSET_CNT22_ENABLE_Msk (1UL << PMU_CNTENSET_CNT22_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 22 Enable Set Mask */ - -#define PMU_CNTENSET_CNT23_ENABLE_Pos 23U /*!< PMU CNTENSET: Event Counter 23 Enable Set Position */ -#define PMU_CNTENSET_CNT23_ENABLE_Msk (1UL << PMU_CNTENSET_CNT23_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 23 Enable Set Mask */ - -#define PMU_CNTENSET_CNT24_ENABLE_Pos 24U /*!< PMU CNTENSET: Event Counter 24 Enable Set Position */ -#define PMU_CNTENSET_CNT24_ENABLE_Msk (1UL << PMU_CNTENSET_CNT24_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 24 Enable Set Mask */ - -#define PMU_CNTENSET_CNT25_ENABLE_Pos 25U /*!< PMU CNTENSET: Event Counter 25 Enable Set Position */ -#define PMU_CNTENSET_CNT25_ENABLE_Msk (1UL << PMU_CNTENSET_CNT25_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 25 Enable Set Mask */ - -#define PMU_CNTENSET_CNT26_ENABLE_Pos 26U /*!< PMU CNTENSET: Event Counter 26 Enable Set Position */ -#define PMU_CNTENSET_CNT26_ENABLE_Msk (1UL << PMU_CNTENSET_CNT26_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 26 Enable Set Mask */ - -#define PMU_CNTENSET_CNT27_ENABLE_Pos 27U /*!< PMU CNTENSET: Event Counter 27 Enable Set Position */ -#define PMU_CNTENSET_CNT27_ENABLE_Msk (1UL << PMU_CNTENSET_CNT27_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 27 Enable Set Mask */ - -#define PMU_CNTENSET_CNT28_ENABLE_Pos 28U /*!< PMU CNTENSET: Event Counter 28 Enable Set Position */ -#define PMU_CNTENSET_CNT28_ENABLE_Msk (1UL << PMU_CNTENSET_CNT28_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 28 Enable Set Mask */ - -#define PMU_CNTENSET_CNT29_ENABLE_Pos 29U /*!< PMU CNTENSET: Event Counter 29 Enable Set Position */ -#define PMU_CNTENSET_CNT29_ENABLE_Msk (1UL << PMU_CNTENSET_CNT29_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 29 Enable Set Mask */ - -#define PMU_CNTENSET_CNT30_ENABLE_Pos 30U /*!< PMU CNTENSET: Event Counter 30 Enable Set Position */ -#define PMU_CNTENSET_CNT30_ENABLE_Msk (1UL << PMU_CNTENSET_CNT30_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 30 Enable Set Mask */ - -#define PMU_CNTENSET_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENSET: Cycle Counter Enable Set Position */ -#define PMU_CNTENSET_CCNTR_ENABLE_Msk (1UL << PMU_CNTENSET_CCNTR_ENABLE_Pos) /*!< PMU CNTENSET: Cycle Counter Enable Set Mask */ - -/** \brief PMU Count Enable Clear Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Position */ -#define PMU_CNTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU CNTENCLR: Event Counter 1 Enable Clear Position */ -#define PMU_CNTENCLR_CNT1_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT1_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 1 Enable Clear */ - -#define PMU_CNTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Position */ -#define PMU_CNTENCLR_CNT2_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT2_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Position */ -#define PMU_CNTENCLR_CNT3_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT3_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Position */ -#define PMU_CNTENCLR_CNT4_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT4_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Position */ -#define PMU_CNTENCLR_CNT5_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT5_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Position */ -#define PMU_CNTENCLR_CNT6_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT6_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Position */ -#define PMU_CNTENCLR_CNT7_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT7_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Position */ -#define PMU_CNTENCLR_CNT8_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT8_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Position */ -#define PMU_CNTENCLR_CNT9_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT9_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Position */ -#define PMU_CNTENCLR_CNT10_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT10_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Position */ -#define PMU_CNTENCLR_CNT11_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT11_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Position */ -#define PMU_CNTENCLR_CNT12_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT12_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Position */ -#define PMU_CNTENCLR_CNT13_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT13_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Position */ -#define PMU_CNTENCLR_CNT14_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT14_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Position */ -#define PMU_CNTENCLR_CNT15_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT15_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Position */ -#define PMU_CNTENCLR_CNT16_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT16_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Position */ -#define PMU_CNTENCLR_CNT17_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT17_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Position */ -#define PMU_CNTENCLR_CNT18_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT18_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Position */ -#define PMU_CNTENCLR_CNT19_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT19_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Position */ -#define PMU_CNTENCLR_CNT20_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT20_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Position */ -#define PMU_CNTENCLR_CNT21_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT21_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Position */ -#define PMU_CNTENCLR_CNT22_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT22_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Position */ -#define PMU_CNTENCLR_CNT23_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT23_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Position */ -#define PMU_CNTENCLR_CNT24_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT24_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Position */ -#define PMU_CNTENCLR_CNT25_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT25_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Position */ -#define PMU_CNTENCLR_CNT26_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT26_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Position */ -#define PMU_CNTENCLR_CNT27_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT27_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Position */ -#define PMU_CNTENCLR_CNT28_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT28_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Position */ -#define PMU_CNTENCLR_CNT29_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT29_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Position */ -#define PMU_CNTENCLR_CNT30_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT30_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Mask */ - -#define PMU_CNTENCLR_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENCLR: Cycle Counter Enable Clear Position */ -#define PMU_CNTENCLR_CCNTR_ENABLE_Msk (1UL << PMU_CNTENCLR_CCNTR_ENABLE_Pos) /*!< PMU CNTENCLR: Cycle Counter Enable Clear Mask */ - -/** \brief PMU Interrupt Enable Set Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENSET_CNT0_ENABLE_Pos*/) /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT1_ENABLE_Pos 1U /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT1_ENABLE_Msk (1UL << PMU_INTENSET_CNT1_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT2_ENABLE_Pos 2U /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT2_ENABLE_Msk (1UL << PMU_INTENSET_CNT2_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT3_ENABLE_Pos 3U /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT3_ENABLE_Msk (1UL << PMU_INTENSET_CNT3_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT4_ENABLE_Pos 4U /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT4_ENABLE_Msk (1UL << PMU_INTENSET_CNT4_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT5_ENABLE_Pos 5U /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT5_ENABLE_Msk (1UL << PMU_INTENSET_CNT5_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT6_ENABLE_Pos 6U /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT6_ENABLE_Msk (1UL << PMU_INTENSET_CNT6_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT7_ENABLE_Pos 7U /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT7_ENABLE_Msk (1UL << PMU_INTENSET_CNT7_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT8_ENABLE_Pos 8U /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT8_ENABLE_Msk (1UL << PMU_INTENSET_CNT8_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT9_ENABLE_Pos 9U /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT9_ENABLE_Msk (1UL << PMU_INTENSET_CNT9_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT10_ENABLE_Pos 10U /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT10_ENABLE_Msk (1UL << PMU_INTENSET_CNT10_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT11_ENABLE_Pos 11U /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT11_ENABLE_Msk (1UL << PMU_INTENSET_CNT11_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT12_ENABLE_Pos 12U /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT12_ENABLE_Msk (1UL << PMU_INTENSET_CNT12_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT13_ENABLE_Pos 13U /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT13_ENABLE_Msk (1UL << PMU_INTENSET_CNT13_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT14_ENABLE_Pos 14U /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT14_ENABLE_Msk (1UL << PMU_INTENSET_CNT14_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT15_ENABLE_Pos 15U /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT15_ENABLE_Msk (1UL << PMU_INTENSET_CNT15_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT16_ENABLE_Pos 16U /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT16_ENABLE_Msk (1UL << PMU_INTENSET_CNT16_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT17_ENABLE_Pos 17U /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT17_ENABLE_Msk (1UL << PMU_INTENSET_CNT17_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT18_ENABLE_Pos 18U /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT18_ENABLE_Msk (1UL << PMU_INTENSET_CNT18_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT19_ENABLE_Pos 19U /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT19_ENABLE_Msk (1UL << PMU_INTENSET_CNT19_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT20_ENABLE_Pos 20U /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT20_ENABLE_Msk (1UL << PMU_INTENSET_CNT20_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT21_ENABLE_Pos 21U /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT21_ENABLE_Msk (1UL << PMU_INTENSET_CNT21_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT22_ENABLE_Pos 22U /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT22_ENABLE_Msk (1UL << PMU_INTENSET_CNT22_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT23_ENABLE_Pos 23U /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT23_ENABLE_Msk (1UL << PMU_INTENSET_CNT23_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT24_ENABLE_Pos 24U /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT24_ENABLE_Msk (1UL << PMU_INTENSET_CNT24_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT25_ENABLE_Pos 25U /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT25_ENABLE_Msk (1UL << PMU_INTENSET_CNT25_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT26_ENABLE_Pos 26U /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT26_ENABLE_Msk (1UL << PMU_INTENSET_CNT26_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT27_ENABLE_Pos 27U /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT27_ENABLE_Msk (1UL << PMU_INTENSET_CNT27_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT28_ENABLE_Pos 28U /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT28_ENABLE_Msk (1UL << PMU_INTENSET_CNT28_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT29_ENABLE_Pos 29U /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT29_ENABLE_Msk (1UL << PMU_INTENSET_CNT29_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT30_ENABLE_Pos 30U /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT30_ENABLE_Msk (1UL << PMU_INTENSET_CNT30_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Position */ -#define PMU_INTENSET_CCYCNT_ENABLE_Msk (1UL << PMU_INTENSET_CYCCNT_ENABLE_Pos) /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Mask */ - -/** \brief PMU Interrupt Enable Clear Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT1_ENABLE_Msk (1UL << PMU_INTENCLR_CNT1_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear */ - -#define PMU_INTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT2_ENABLE_Msk (1UL << PMU_INTENCLR_CNT2_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT3_ENABLE_Msk (1UL << PMU_INTENCLR_CNT3_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT4_ENABLE_Msk (1UL << PMU_INTENCLR_CNT4_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT5_ENABLE_Msk (1UL << PMU_INTENCLR_CNT5_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT6_ENABLE_Msk (1UL << PMU_INTENCLR_CNT6_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT7_ENABLE_Msk (1UL << PMU_INTENCLR_CNT7_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT8_ENABLE_Msk (1UL << PMU_INTENCLR_CNT8_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT9_ENABLE_Msk (1UL << PMU_INTENCLR_CNT9_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT10_ENABLE_Msk (1UL << PMU_INTENCLR_CNT10_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT11_ENABLE_Msk (1UL << PMU_INTENCLR_CNT11_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT12_ENABLE_Msk (1UL << PMU_INTENCLR_CNT12_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT13_ENABLE_Msk (1UL << PMU_INTENCLR_CNT13_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT14_ENABLE_Msk (1UL << PMU_INTENCLR_CNT14_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT15_ENABLE_Msk (1UL << PMU_INTENCLR_CNT15_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT16_ENABLE_Msk (1UL << PMU_INTENCLR_CNT16_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT17_ENABLE_Msk (1UL << PMU_INTENCLR_CNT17_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT18_ENABLE_Msk (1UL << PMU_INTENCLR_CNT18_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT19_ENABLE_Msk (1UL << PMU_INTENCLR_CNT19_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT20_ENABLE_Msk (1UL << PMU_INTENCLR_CNT20_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT21_ENABLE_Msk (1UL << PMU_INTENCLR_CNT21_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT22_ENABLE_Msk (1UL << PMU_INTENCLR_CNT22_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT23_ENABLE_Msk (1UL << PMU_INTENCLR_CNT23_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT24_ENABLE_Msk (1UL << PMU_INTENCLR_CNT24_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT25_ENABLE_Msk (1UL << PMU_INTENCLR_CNT25_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT26_ENABLE_Msk (1UL << PMU_INTENCLR_CNT26_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT27_ENABLE_Msk (1UL << PMU_INTENCLR_CNT27_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT28_ENABLE_Msk (1UL << PMU_INTENCLR_CNT28_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT29_ENABLE_Msk (1UL << PMU_INTENCLR_CNT29_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT30_ENABLE_Msk (1UL << PMU_INTENCLR_CNT30_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CYCCNT_ENABLE_Msk (1UL << PMU_INTENCLR_CYCCNT_ENABLE_Pos) /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Mask */ - -/** \brief PMU Overflow Flag Status Set Register Definitions */ - -#define PMU_OVSSET_CNT0_STATUS_Pos 0U /*!< PMU OVSSET: Event Counter 0 Overflow Set Position */ -#define PMU_OVSSET_CNT0_STATUS_Msk (1UL /*<< PMU_OVSSET_CNT0_STATUS_Pos*/) /*!< PMU OVSSET: Event Counter 0 Overflow Set Mask */ - -#define PMU_OVSSET_CNT1_STATUS_Pos 1U /*!< PMU OVSSET: Event Counter 1 Overflow Set Position */ -#define PMU_OVSSET_CNT1_STATUS_Msk (1UL << PMU_OVSSET_CNT1_STATUS_Pos) /*!< PMU OVSSET: Event Counter 1 Overflow Set Mask */ - -#define PMU_OVSSET_CNT2_STATUS_Pos 2U /*!< PMU OVSSET: Event Counter 2 Overflow Set Position */ -#define PMU_OVSSET_CNT2_STATUS_Msk (1UL << PMU_OVSSET_CNT2_STATUS_Pos) /*!< PMU OVSSET: Event Counter 2 Overflow Set Mask */ - -#define PMU_OVSSET_CNT3_STATUS_Pos 3U /*!< PMU OVSSET: Event Counter 3 Overflow Set Position */ -#define PMU_OVSSET_CNT3_STATUS_Msk (1UL << PMU_OVSSET_CNT3_STATUS_Pos) /*!< PMU OVSSET: Event Counter 3 Overflow Set Mask */ - -#define PMU_OVSSET_CNT4_STATUS_Pos 4U /*!< PMU OVSSET: Event Counter 4 Overflow Set Position */ -#define PMU_OVSSET_CNT4_STATUS_Msk (1UL << PMU_OVSSET_CNT4_STATUS_Pos) /*!< PMU OVSSET: Event Counter 4 Overflow Set Mask */ - -#define PMU_OVSSET_CNT5_STATUS_Pos 5U /*!< PMU OVSSET: Event Counter 5 Overflow Set Position */ -#define PMU_OVSSET_CNT5_STATUS_Msk (1UL << PMU_OVSSET_CNT5_STATUS_Pos) /*!< PMU OVSSET: Event Counter 5 Overflow Set Mask */ - -#define PMU_OVSSET_CNT6_STATUS_Pos 6U /*!< PMU OVSSET: Event Counter 6 Overflow Set Position */ -#define PMU_OVSSET_CNT6_STATUS_Msk (1UL << PMU_OVSSET_CNT6_STATUS_Pos) /*!< PMU OVSSET: Event Counter 6 Overflow Set Mask */ - -#define PMU_OVSSET_CNT7_STATUS_Pos 7U /*!< PMU OVSSET: Event Counter 7 Overflow Set Position */ -#define PMU_OVSSET_CNT7_STATUS_Msk (1UL << PMU_OVSSET_CNT7_STATUS_Pos) /*!< PMU OVSSET: Event Counter 7 Overflow Set Mask */ - -#define PMU_OVSSET_CNT8_STATUS_Pos 8U /*!< PMU OVSSET: Event Counter 8 Overflow Set Position */ -#define PMU_OVSSET_CNT8_STATUS_Msk (1UL << PMU_OVSSET_CNT8_STATUS_Pos) /*!< PMU OVSSET: Event Counter 8 Overflow Set Mask */ - -#define PMU_OVSSET_CNT9_STATUS_Pos 9U /*!< PMU OVSSET: Event Counter 9 Overflow Set Position */ -#define PMU_OVSSET_CNT9_STATUS_Msk (1UL << PMU_OVSSET_CNT9_STATUS_Pos) /*!< PMU OVSSET: Event Counter 9 Overflow Set Mask */ - -#define PMU_OVSSET_CNT10_STATUS_Pos 10U /*!< PMU OVSSET: Event Counter 10 Overflow Set Position */ -#define PMU_OVSSET_CNT10_STATUS_Msk (1UL << PMU_OVSSET_CNT10_STATUS_Pos) /*!< PMU OVSSET: Event Counter 10 Overflow Set Mask */ - -#define PMU_OVSSET_CNT11_STATUS_Pos 11U /*!< PMU OVSSET: Event Counter 11 Overflow Set Position */ -#define PMU_OVSSET_CNT11_STATUS_Msk (1UL << PMU_OVSSET_CNT11_STATUS_Pos) /*!< PMU OVSSET: Event Counter 11 Overflow Set Mask */ - -#define PMU_OVSSET_CNT12_STATUS_Pos 12U /*!< PMU OVSSET: Event Counter 12 Overflow Set Position */ -#define PMU_OVSSET_CNT12_STATUS_Msk (1UL << PMU_OVSSET_CNT12_STATUS_Pos) /*!< PMU OVSSET: Event Counter 12 Overflow Set Mask */ - -#define PMU_OVSSET_CNT13_STATUS_Pos 13U /*!< PMU OVSSET: Event Counter 13 Overflow Set Position */ -#define PMU_OVSSET_CNT13_STATUS_Msk (1UL << PMU_OVSSET_CNT13_STATUS_Pos) /*!< PMU OVSSET: Event Counter 13 Overflow Set Mask */ - -#define PMU_OVSSET_CNT14_STATUS_Pos 14U /*!< PMU OVSSET: Event Counter 14 Overflow Set Position */ -#define PMU_OVSSET_CNT14_STATUS_Msk (1UL << PMU_OVSSET_CNT14_STATUS_Pos) /*!< PMU OVSSET: Event Counter 14 Overflow Set Mask */ - -#define PMU_OVSSET_CNT15_STATUS_Pos 15U /*!< PMU OVSSET: Event Counter 15 Overflow Set Position */ -#define PMU_OVSSET_CNT15_STATUS_Msk (1UL << PMU_OVSSET_CNT15_STATUS_Pos) /*!< PMU OVSSET: Event Counter 15 Overflow Set Mask */ - -#define PMU_OVSSET_CNT16_STATUS_Pos 16U /*!< PMU OVSSET: Event Counter 16 Overflow Set Position */ -#define PMU_OVSSET_CNT16_STATUS_Msk (1UL << PMU_OVSSET_CNT16_STATUS_Pos) /*!< PMU OVSSET: Event Counter 16 Overflow Set Mask */ - -#define PMU_OVSSET_CNT17_STATUS_Pos 17U /*!< PMU OVSSET: Event Counter 17 Overflow Set Position */ -#define PMU_OVSSET_CNT17_STATUS_Msk (1UL << PMU_OVSSET_CNT17_STATUS_Pos) /*!< PMU OVSSET: Event Counter 17 Overflow Set Mask */ - -#define PMU_OVSSET_CNT18_STATUS_Pos 18U /*!< PMU OVSSET: Event Counter 18 Overflow Set Position */ -#define PMU_OVSSET_CNT18_STATUS_Msk (1UL << PMU_OVSSET_CNT18_STATUS_Pos) /*!< PMU OVSSET: Event Counter 18 Overflow Set Mask */ - -#define PMU_OVSSET_CNT19_STATUS_Pos 19U /*!< PMU OVSSET: Event Counter 19 Overflow Set Position */ -#define PMU_OVSSET_CNT19_STATUS_Msk (1UL << PMU_OVSSET_CNT19_STATUS_Pos) /*!< PMU OVSSET: Event Counter 19 Overflow Set Mask */ - -#define PMU_OVSSET_CNT20_STATUS_Pos 20U /*!< PMU OVSSET: Event Counter 20 Overflow Set Position */ -#define PMU_OVSSET_CNT20_STATUS_Msk (1UL << PMU_OVSSET_CNT20_STATUS_Pos) /*!< PMU OVSSET: Event Counter 20 Overflow Set Mask */ - -#define PMU_OVSSET_CNT21_STATUS_Pos 21U /*!< PMU OVSSET: Event Counter 21 Overflow Set Position */ -#define PMU_OVSSET_CNT21_STATUS_Msk (1UL << PMU_OVSSET_CNT21_STATUS_Pos) /*!< PMU OVSSET: Event Counter 21 Overflow Set Mask */ - -#define PMU_OVSSET_CNT22_STATUS_Pos 22U /*!< PMU OVSSET: Event Counter 22 Overflow Set Position */ -#define PMU_OVSSET_CNT22_STATUS_Msk (1UL << PMU_OVSSET_CNT22_STATUS_Pos) /*!< PMU OVSSET: Event Counter 22 Overflow Set Mask */ - -#define PMU_OVSSET_CNT23_STATUS_Pos 23U /*!< PMU OVSSET: Event Counter 23 Overflow Set Position */ -#define PMU_OVSSET_CNT23_STATUS_Msk (1UL << PMU_OVSSET_CNT23_STATUS_Pos) /*!< PMU OVSSET: Event Counter 23 Overflow Set Mask */ - -#define PMU_OVSSET_CNT24_STATUS_Pos 24U /*!< PMU OVSSET: Event Counter 24 Overflow Set Position */ -#define PMU_OVSSET_CNT24_STATUS_Msk (1UL << PMU_OVSSET_CNT24_STATUS_Pos) /*!< PMU OVSSET: Event Counter 24 Overflow Set Mask */ - -#define PMU_OVSSET_CNT25_STATUS_Pos 25U /*!< PMU OVSSET: Event Counter 25 Overflow Set Position */ -#define PMU_OVSSET_CNT25_STATUS_Msk (1UL << PMU_OVSSET_CNT25_STATUS_Pos) /*!< PMU OVSSET: Event Counter 25 Overflow Set Mask */ - -#define PMU_OVSSET_CNT26_STATUS_Pos 26U /*!< PMU OVSSET: Event Counter 26 Overflow Set Position */ -#define PMU_OVSSET_CNT26_STATUS_Msk (1UL << PMU_OVSSET_CNT26_STATUS_Pos) /*!< PMU OVSSET: Event Counter 26 Overflow Set Mask */ - -#define PMU_OVSSET_CNT27_STATUS_Pos 27U /*!< PMU OVSSET: Event Counter 27 Overflow Set Position */ -#define PMU_OVSSET_CNT27_STATUS_Msk (1UL << PMU_OVSSET_CNT27_STATUS_Pos) /*!< PMU OVSSET: Event Counter 27 Overflow Set Mask */ - -#define PMU_OVSSET_CNT28_STATUS_Pos 28U /*!< PMU OVSSET: Event Counter 28 Overflow Set Position */ -#define PMU_OVSSET_CNT28_STATUS_Msk (1UL << PMU_OVSSET_CNT28_STATUS_Pos) /*!< PMU OVSSET: Event Counter 28 Overflow Set Mask */ - -#define PMU_OVSSET_CNT29_STATUS_Pos 29U /*!< PMU OVSSET: Event Counter 29 Overflow Set Position */ -#define PMU_OVSSET_CNT29_STATUS_Msk (1UL << PMU_OVSSET_CNT29_STATUS_Pos) /*!< PMU OVSSET: Event Counter 29 Overflow Set Mask */ - -#define PMU_OVSSET_CNT30_STATUS_Pos 30U /*!< PMU OVSSET: Event Counter 30 Overflow Set Position */ -#define PMU_OVSSET_CNT30_STATUS_Msk (1UL << PMU_OVSSET_CNT30_STATUS_Pos) /*!< PMU OVSSET: Event Counter 30 Overflow Set Mask */ - -#define PMU_OVSSET_CYCCNT_STATUS_Pos 31U /*!< PMU OVSSET: Cycle Counter Overflow Set Position */ -#define PMU_OVSSET_CYCCNT_STATUS_Msk (1UL << PMU_OVSSET_CYCCNT_STATUS_Pos) /*!< PMU OVSSET: Cycle Counter Overflow Set Mask */ - -/** \brief PMU Overflow Flag Status Clear Register Definitions */ - -#define PMU_OVSCLR_CNT0_STATUS_Pos 0U /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Position */ -#define PMU_OVSCLR_CNT0_STATUS_Msk (1UL /*<< PMU_OVSCLR_CNT0_STATUS_Pos*/) /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT1_STATUS_Pos 1U /*!< PMU OVSCLR: Event Counter 1 Overflow Clear Position */ -#define PMU_OVSCLR_CNT1_STATUS_Msk (1UL << PMU_OVSCLR_CNT1_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 1 Overflow Clear */ - -#define PMU_OVSCLR_CNT2_STATUS_Pos 2U /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Position */ -#define PMU_OVSCLR_CNT2_STATUS_Msk (1UL << PMU_OVSCLR_CNT2_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT3_STATUS_Pos 3U /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Position */ -#define PMU_OVSCLR_CNT3_STATUS_Msk (1UL << PMU_OVSCLR_CNT3_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT4_STATUS_Pos 4U /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Position */ -#define PMU_OVSCLR_CNT4_STATUS_Msk (1UL << PMU_OVSCLR_CNT4_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT5_STATUS_Pos 5U /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Position */ -#define PMU_OVSCLR_CNT5_STATUS_Msk (1UL << PMU_OVSCLR_CNT5_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT6_STATUS_Pos 6U /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Position */ -#define PMU_OVSCLR_CNT6_STATUS_Msk (1UL << PMU_OVSCLR_CNT6_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT7_STATUS_Pos 7U /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Position */ -#define PMU_OVSCLR_CNT7_STATUS_Msk (1UL << PMU_OVSCLR_CNT7_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT8_STATUS_Pos 8U /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Position */ -#define PMU_OVSCLR_CNT8_STATUS_Msk (1UL << PMU_OVSCLR_CNT8_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT9_STATUS_Pos 9U /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Position */ -#define PMU_OVSCLR_CNT9_STATUS_Msk (1UL << PMU_OVSCLR_CNT9_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT10_STATUS_Pos 10U /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Position */ -#define PMU_OVSCLR_CNT10_STATUS_Msk (1UL << PMU_OVSCLR_CNT10_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT11_STATUS_Pos 11U /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Position */ -#define PMU_OVSCLR_CNT11_STATUS_Msk (1UL << PMU_OVSCLR_CNT11_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT12_STATUS_Pos 12U /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Position */ -#define PMU_OVSCLR_CNT12_STATUS_Msk (1UL << PMU_OVSCLR_CNT12_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT13_STATUS_Pos 13U /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Position */ -#define PMU_OVSCLR_CNT13_STATUS_Msk (1UL << PMU_OVSCLR_CNT13_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT14_STATUS_Pos 14U /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Position */ -#define PMU_OVSCLR_CNT14_STATUS_Msk (1UL << PMU_OVSCLR_CNT14_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT15_STATUS_Pos 15U /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Position */ -#define PMU_OVSCLR_CNT15_STATUS_Msk (1UL << PMU_OVSCLR_CNT15_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT16_STATUS_Pos 16U /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Position */ -#define PMU_OVSCLR_CNT16_STATUS_Msk (1UL << PMU_OVSCLR_CNT16_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT17_STATUS_Pos 17U /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Position */ -#define PMU_OVSCLR_CNT17_STATUS_Msk (1UL << PMU_OVSCLR_CNT17_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT18_STATUS_Pos 18U /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Position */ -#define PMU_OVSCLR_CNT18_STATUS_Msk (1UL << PMU_OVSCLR_CNT18_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT19_STATUS_Pos 19U /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Position */ -#define PMU_OVSCLR_CNT19_STATUS_Msk (1UL << PMU_OVSCLR_CNT19_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT20_STATUS_Pos 20U /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Position */ -#define PMU_OVSCLR_CNT20_STATUS_Msk (1UL << PMU_OVSCLR_CNT20_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT21_STATUS_Pos 21U /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Position */ -#define PMU_OVSCLR_CNT21_STATUS_Msk (1UL << PMU_OVSCLR_CNT21_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT22_STATUS_Pos 22U /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Position */ -#define PMU_OVSCLR_CNT22_STATUS_Msk (1UL << PMU_OVSCLR_CNT22_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT23_STATUS_Pos 23U /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Position */ -#define PMU_OVSCLR_CNT23_STATUS_Msk (1UL << PMU_OVSCLR_CNT23_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT24_STATUS_Pos 24U /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Position */ -#define PMU_OVSCLR_CNT24_STATUS_Msk (1UL << PMU_OVSCLR_CNT24_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT25_STATUS_Pos 25U /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Position */ -#define PMU_OVSCLR_CNT25_STATUS_Msk (1UL << PMU_OVSCLR_CNT25_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT26_STATUS_Pos 26U /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Position */ -#define PMU_OVSCLR_CNT26_STATUS_Msk (1UL << PMU_OVSCLR_CNT26_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT27_STATUS_Pos 27U /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Position */ -#define PMU_OVSCLR_CNT27_STATUS_Msk (1UL << PMU_OVSCLR_CNT27_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT28_STATUS_Pos 28U /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Position */ -#define PMU_OVSCLR_CNT28_STATUS_Msk (1UL << PMU_OVSCLR_CNT28_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT29_STATUS_Pos 29U /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Position */ -#define PMU_OVSCLR_CNT29_STATUS_Msk (1UL << PMU_OVSCLR_CNT29_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT30_STATUS_Pos 30U /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Position */ -#define PMU_OVSCLR_CNT30_STATUS_Msk (1UL << PMU_OVSCLR_CNT30_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Mask */ - -#define PMU_OVSCLR_CYCCNT_STATUS_Pos 31U /*!< PMU OVSCLR: Cycle Counter Overflow Clear Position */ -#define PMU_OVSCLR_CYCCNT_STATUS_Msk (1UL << PMU_OVSCLR_CYCCNT_STATUS_Pos) /*!< PMU OVSCLR: Cycle Counter Overflow Clear Mask */ - -/** \brief PMU Software Increment Counter */ - -#define PMU_SWINC_CNT0_Pos 0U /*!< PMU SWINC: Event Counter 0 Software Increment Position */ -#define PMU_SWINC_CNT0_Msk (1UL /*<< PMU_SWINC_CNT0_Pos */) /*!< PMU SWINC: Event Counter 0 Software Increment Mask */ - -#define PMU_SWINC_CNT1_Pos 1U /*!< PMU SWINC: Event Counter 1 Software Increment Position */ -#define PMU_SWINC_CNT1_Msk (1UL << PMU_SWINC_CNT1_Pos) /*!< PMU SWINC: Event Counter 1 Software Increment Mask */ - -#define PMU_SWINC_CNT2_Pos 2U /*!< PMU SWINC: Event Counter 2 Software Increment Position */ -#define PMU_SWINC_CNT2_Msk (1UL << PMU_SWINC_CNT2_Pos) /*!< PMU SWINC: Event Counter 2 Software Increment Mask */ - -#define PMU_SWINC_CNT3_Pos 3U /*!< PMU SWINC: Event Counter 3 Software Increment Position */ -#define PMU_SWINC_CNT3_Msk (1UL << PMU_SWINC_CNT3_Pos) /*!< PMU SWINC: Event Counter 3 Software Increment Mask */ - -#define PMU_SWINC_CNT4_Pos 4U /*!< PMU SWINC: Event Counter 4 Software Increment Position */ -#define PMU_SWINC_CNT4_Msk (1UL << PMU_SWINC_CNT4_Pos) /*!< PMU SWINC: Event Counter 4 Software Increment Mask */ - -#define PMU_SWINC_CNT5_Pos 5U /*!< PMU SWINC: Event Counter 5 Software Increment Position */ -#define PMU_SWINC_CNT5_Msk (1UL << PMU_SWINC_CNT5_Pos) /*!< PMU SWINC: Event Counter 5 Software Increment Mask */ - -#define PMU_SWINC_CNT6_Pos 6U /*!< PMU SWINC: Event Counter 6 Software Increment Position */ -#define PMU_SWINC_CNT6_Msk (1UL << PMU_SWINC_CNT6_Pos) /*!< PMU SWINC: Event Counter 6 Software Increment Mask */ - -#define PMU_SWINC_CNT7_Pos 7U /*!< PMU SWINC: Event Counter 7 Software Increment Position */ -#define PMU_SWINC_CNT7_Msk (1UL << PMU_SWINC_CNT7_Pos) /*!< PMU SWINC: Event Counter 7 Software Increment Mask */ - -#define PMU_SWINC_CNT8_Pos 8U /*!< PMU SWINC: Event Counter 8 Software Increment Position */ -#define PMU_SWINC_CNT8_Msk (1UL << PMU_SWINC_CNT8_Pos) /*!< PMU SWINC: Event Counter 8 Software Increment Mask */ - -#define PMU_SWINC_CNT9_Pos 9U /*!< PMU SWINC: Event Counter 9 Software Increment Position */ -#define PMU_SWINC_CNT9_Msk (1UL << PMU_SWINC_CNT9_Pos) /*!< PMU SWINC: Event Counter 9 Software Increment Mask */ - -#define PMU_SWINC_CNT10_Pos 10U /*!< PMU SWINC: Event Counter 10 Software Increment Position */ -#define PMU_SWINC_CNT10_Msk (1UL << PMU_SWINC_CNT10_Pos) /*!< PMU SWINC: Event Counter 10 Software Increment Mask */ - -#define PMU_SWINC_CNT11_Pos 11U /*!< PMU SWINC: Event Counter 11 Software Increment Position */ -#define PMU_SWINC_CNT11_Msk (1UL << PMU_SWINC_CNT11_Pos) /*!< PMU SWINC: Event Counter 11 Software Increment Mask */ - -#define PMU_SWINC_CNT12_Pos 12U /*!< PMU SWINC: Event Counter 12 Software Increment Position */ -#define PMU_SWINC_CNT12_Msk (1UL << PMU_SWINC_CNT12_Pos) /*!< PMU SWINC: Event Counter 12 Software Increment Mask */ - -#define PMU_SWINC_CNT13_Pos 13U /*!< PMU SWINC: Event Counter 13 Software Increment Position */ -#define PMU_SWINC_CNT13_Msk (1UL << PMU_SWINC_CNT13_Pos) /*!< PMU SWINC: Event Counter 13 Software Increment Mask */ - -#define PMU_SWINC_CNT14_Pos 14U /*!< PMU SWINC: Event Counter 14 Software Increment Position */ -#define PMU_SWINC_CNT14_Msk (1UL << PMU_SWINC_CNT14_Pos) /*!< PMU SWINC: Event Counter 14 Software Increment Mask */ - -#define PMU_SWINC_CNT15_Pos 15U /*!< PMU SWINC: Event Counter 15 Software Increment Position */ -#define PMU_SWINC_CNT15_Msk (1UL << PMU_SWINC_CNT15_Pos) /*!< PMU SWINC: Event Counter 15 Software Increment Mask */ - -#define PMU_SWINC_CNT16_Pos 16U /*!< PMU SWINC: Event Counter 16 Software Increment Position */ -#define PMU_SWINC_CNT16_Msk (1UL << PMU_SWINC_CNT16_Pos) /*!< PMU SWINC: Event Counter 16 Software Increment Mask */ - -#define PMU_SWINC_CNT17_Pos 17U /*!< PMU SWINC: Event Counter 17 Software Increment Position */ -#define PMU_SWINC_CNT17_Msk (1UL << PMU_SWINC_CNT17_Pos) /*!< PMU SWINC: Event Counter 17 Software Increment Mask */ - -#define PMU_SWINC_CNT18_Pos 18U /*!< PMU SWINC: Event Counter 18 Software Increment Position */ -#define PMU_SWINC_CNT18_Msk (1UL << PMU_SWINC_CNT18_Pos) /*!< PMU SWINC: Event Counter 18 Software Increment Mask */ - -#define PMU_SWINC_CNT19_Pos 19U /*!< PMU SWINC: Event Counter 19 Software Increment Position */ -#define PMU_SWINC_CNT19_Msk (1UL << PMU_SWINC_CNT19_Pos) /*!< PMU SWINC: Event Counter 19 Software Increment Mask */ - -#define PMU_SWINC_CNT20_Pos 20U /*!< PMU SWINC: Event Counter 20 Software Increment Position */ -#define PMU_SWINC_CNT20_Msk (1UL << PMU_SWINC_CNT20_Pos) /*!< PMU SWINC: Event Counter 20 Software Increment Mask */ - -#define PMU_SWINC_CNT21_Pos 21U /*!< PMU SWINC: Event Counter 21 Software Increment Position */ -#define PMU_SWINC_CNT21_Msk (1UL << PMU_SWINC_CNT21_Pos) /*!< PMU SWINC: Event Counter 21 Software Increment Mask */ - -#define PMU_SWINC_CNT22_Pos 22U /*!< PMU SWINC: Event Counter 22 Software Increment Position */ -#define PMU_SWINC_CNT22_Msk (1UL << PMU_SWINC_CNT22_Pos) /*!< PMU SWINC: Event Counter 22 Software Increment Mask */ - -#define PMU_SWINC_CNT23_Pos 23U /*!< PMU SWINC: Event Counter 23 Software Increment Position */ -#define PMU_SWINC_CNT23_Msk (1UL << PMU_SWINC_CNT23_Pos) /*!< PMU SWINC: Event Counter 23 Software Increment Mask */ - -#define PMU_SWINC_CNT24_Pos 24U /*!< PMU SWINC: Event Counter 24 Software Increment Position */ -#define PMU_SWINC_CNT24_Msk (1UL << PMU_SWINC_CNT24_Pos) /*!< PMU SWINC: Event Counter 24 Software Increment Mask */ - -#define PMU_SWINC_CNT25_Pos 25U /*!< PMU SWINC: Event Counter 25 Software Increment Position */ -#define PMU_SWINC_CNT25_Msk (1UL << PMU_SWINC_CNT25_Pos) /*!< PMU SWINC: Event Counter 25 Software Increment Mask */ - -#define PMU_SWINC_CNT26_Pos 26U /*!< PMU SWINC: Event Counter 26 Software Increment Position */ -#define PMU_SWINC_CNT26_Msk (1UL << PMU_SWINC_CNT26_Pos) /*!< PMU SWINC: Event Counter 26 Software Increment Mask */ - -#define PMU_SWINC_CNT27_Pos 27U /*!< PMU SWINC: Event Counter 27 Software Increment Position */ -#define PMU_SWINC_CNT27_Msk (1UL << PMU_SWINC_CNT27_Pos) /*!< PMU SWINC: Event Counter 27 Software Increment Mask */ - -#define PMU_SWINC_CNT28_Pos 28U /*!< PMU SWINC: Event Counter 28 Software Increment Position */ -#define PMU_SWINC_CNT28_Msk (1UL << PMU_SWINC_CNT28_Pos) /*!< PMU SWINC: Event Counter 28 Software Increment Mask */ - -#define PMU_SWINC_CNT29_Pos 29U /*!< PMU SWINC: Event Counter 29 Software Increment Position */ -#define PMU_SWINC_CNT29_Msk (1UL << PMU_SWINC_CNT29_Pos) /*!< PMU SWINC: Event Counter 29 Software Increment Mask */ - -#define PMU_SWINC_CNT30_Pos 30U /*!< PMU SWINC: Event Counter 30 Software Increment Position */ -#define PMU_SWINC_CNT30_Msk (1UL << PMU_SWINC_CNT30_Pos) /*!< PMU SWINC: Event Counter 30 Software Increment Mask */ - -/** \brief PMU Control Register Definitions */ - -#define PMU_CTRL_ENABLE_Pos 0U /*!< PMU CTRL: ENABLE Position */ -#define PMU_CTRL_ENABLE_Msk (1UL /*<< PMU_CTRL_ENABLE_Pos*/) /*!< PMU CTRL: ENABLE Mask */ - -#define PMU_CTRL_EVENTCNT_RESET_Pos 1U /*!< PMU CTRL: Event Counter Reset Position */ -#define PMU_CTRL_EVENTCNT_RESET_Msk (1UL << PMU_CTRL_EVENTCNT_RESET_Pos) /*!< PMU CTRL: Event Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_RESET_Pos 2U /*!< PMU CTRL: Cycle Counter Reset Position */ -#define PMU_CTRL_CYCCNT_RESET_Msk (1UL << PMU_CTRL_CYCCNT_RESET_Pos) /*!< PMU CTRL: Cycle Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_DISABLE_Pos 5U /*!< PMU CTRL: Disable Cycle Counter Position */ -#define PMU_CTRL_CYCCNT_DISABLE_Msk (1UL << PMU_CTRL_CYCCNT_DISABLE_Pos) /*!< PMU CTRL: Disable Cycle Counter Mask */ - -#define PMU_CTRL_FRZ_ON_OV_Pos 9U /*!< PMU CTRL: Freeze-on-overflow Position */ -#define PMU_CTRL_FRZ_ON_OV_Msk (1UL << PMU_CTRL_FRZ_ON_OVERFLOW_Pos) /*!< PMU CTRL: Freeze-on-overflow Mask */ - -#define PMU_CTRL_TRACE_ON_OV_Pos 11U /*!< PMU CTRL: Trace-on-overflow Position */ -#define PMU_CTRL_TRACE_ON_OV_Msk (1UL << PMU_CTRL_TRACE_ON_OVERFLOW_Pos) /*!< PMU CTRL: Trace-on-overflow Mask */ - -/** \brief PMU Type Register Definitions */ - -#define PMU_TYPE_NUM_CNTS_Pos 0U /*!< PMU TYPE: Number of Counters Position */ -#define PMU_TYPE_NUM_CNTS_Msk (0xFFUL /*<< PMU_TYPE_NUM_CNTS_Pos*/) /*!< PMU TYPE: Number of Counters Mask */ - -#define PMU_TYPE_SIZE_CNTS_Pos 8U /*!< PMU TYPE: Size of Counters Position */ -#define PMU_TYPE_SIZE_CNTS_Msk (0x3FUL << PMU_TYPE_SIZE_CNTS_Pos) /*!< PMU TYPE: Size of Counters Mask */ - -#define PMU_TYPE_CYCCNT_PRESENT_Pos 14U /*!< PMU TYPE: Cycle Counter Present Position */ -#define PMU_TYPE_CYCCNT_PRESENT_Msk (1UL << PMU_TYPE_CYCCNT_PRESENT_Pos) /*!< PMU TYPE: Cycle Counter Present Mask */ - -#define PMU_TYPE_FRZ_OV_SUPPORT_Pos 21U /*!< PMU TYPE: Freeze-on-overflow Support Position */ -#define PMU_TYPE_FRZ_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Freeze-on-overflow Support Mask */ - -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Pos 23U /*!< PMU TYPE: Trace-on-overflow Support Position */ -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Trace-on-overflow Support Mask */ - -/** \brief PMU Authentication Status Register Definitions */ - -#define PMU_AUTHSTATUS_NSID_Pos 0U /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSID_Msk (0x3UL /*<< PMU_AUTHSTATUS_NSID_Pos*/) /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSNID_Pos 2U /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSNID_Msk (0x3UL << PMU_AUTHSTATUS_NSNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SID_Pos 4U /*!< PMU AUTHSTATUS: Secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_SID_Msk (0x3UL << PMU_AUTHSTATUS_SID_Pos) /*!< PMU AUTHSTATUS: Secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SNID_Pos 6U /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SNID_Msk (0x3UL << PMU_AUTHSTATUS_SNID_Pos) /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUID_Pos 16U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUID_Msk (0x3UL << PMU_AUTHSTATUS_NSUID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUNID_Pos 18U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUNID_Msk (0x3UL << PMU_AUTHSTATUS_NSUNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUID_Pos 20U /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_SUID_Msk (0x3UL << PMU_AUTHSTATUS_SUID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUNID_Pos 22U /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SUNID_Msk (0x3UL << PMU_AUTHSTATUS_SUNID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Mask */ - -/*@} end of group CMSIS_PMU */ -#endif - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_PXN_Pos 4U /*!< MPU RLAR: PXN Position */ -#define MPU_RLAR_PXN_Msk (1UL << MPU_RLAR_PXN_Pos) /*!< MPU RLAR: PXN Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -#define FPU_FPDSCR_FZ16_Pos 19U /*!< FPDSCR: FZ16 bit Position */ -#define FPU_FPDSCR_FZ16_Msk (1UL << FPU_FPDSCR_FZ16_Pos) /*!< FPDSCR: FZ16 bit Mask */ - -#define FPU_FPDSCR_LTPSIZE_Pos 16U /*!< FPDSCR: LTPSIZE bit Position */ -#define FPU_FPDSCR_LTPSIZE_Msk (7UL << FPU_FPDSCR_LTPSIZE_Pos) /*!< FPDSCR: LTPSIZE bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FPRound_Pos 28U /*!< MVFR0: FPRound bits Position */ -#define FPU_MVFR0_FPRound_Msk (0xFUL << FPU_MVFR0_FPRound_Pos) /*!< MVFR0: FPRound bits Mask */ - -#define FPU_MVFR0_FPSqrt_Pos 20U /*!< MVFR0: FPSqrt bits Position */ -#define FPU_MVFR0_FPSqrt_Msk (0xFUL << FPU_MVFR0_FPSqrt_Pos) /*!< MVFR0: FPSqrt bits Mask */ - -#define FPU_MVFR0_FPDivide_Pos 16U /*!< MVFR0: FPDivide bits Position */ -#define FPU_MVFR0_FPDivide_Msk (0xFUL << FPU_MVFR0_FPDivide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FPDP_Pos 8U /*!< MVFR0: FPDP bits Position */ -#define FPU_MVFR0_FPDP_Msk (0xFUL << FPU_MVFR0_FPDP_Pos) /*!< MVFR0: FPDP bits Mask */ - -#define FPU_MVFR0_FPSP_Pos 4U /*!< MVFR0: FPSP bits Position */ -#define FPU_MVFR0_FPSP_Msk (0xFUL << FPU_MVFR0_FPSP_Pos) /*!< MVFR0: FPSP bits Mask */ - -#define FPU_MVFR0_SIMDReg_Pos 0U /*!< MVFR0: SIMDReg bits Position */ -#define FPU_MVFR0_SIMDReg_Msk (0xFUL /*<< FPU_MVFR0_SIMDReg_Pos*/) /*!< MVFR0: SIMDReg bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FMAC_Pos 28U /*!< MVFR1: FMAC bits Position */ -#define FPU_MVFR1_FMAC_Msk (0xFUL << FPU_MVFR1_FMAC_Pos) /*!< MVFR1: FMAC bits Mask */ - -#define FPU_MVFR1_FPHP_Pos 24U /*!< MVFR1: FPHP bits Position */ -#define FPU_MVFR1_FPHP_Msk (0xFUL << FPU_MVFR1_FPHP_Pos) /*!< MVFR1: FPHP bits Mask */ - -#define FPU_MVFR1_FP16_Pos 20U /*!< MVFR1: FP16 bits Position */ -#define FPU_MVFR1_FP16_Msk (0xFUL << FPU_MVFR1_FP16_Pos) /*!< MVFR1: FP16 bits Mask */ - -#define FPU_MVFR1_MVE_Pos 8U /*!< MVFR1: MVE bits Position */ -#define FPU_MVFR1_MVE_Msk (0xFUL << FPU_MVFR1_MVE_Pos) /*!< MVFR1: MVE bits Mask */ - -#define FPU_MVFR1_FPDNaN_Pos 4U /*!< MVFR1: FPDNaN bits Position */ -#define FPU_MVFR1_FPDNaN_Msk (0xFUL << FPU_MVFR1_FPDNaN_Pos) /*!< MVFR1: FPDNaN bits Mask */ - -#define FPU_MVFR1_FPFtZ_Pos 0U /*!< MVFR1: FPFtZ bits Position */ -#define FPU_MVFR1_FPFtZ_Msk (0xFUL /*<< FPU_MVFR1_FPFtZ_Pos*/) /*!< MVFR1: FPFtZ bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_FPD_Pos 23U /*!< \deprecated CoreDebug DHCSR: S_FPD Position */ -#define CoreDebug_DHCSR_S_FPD_Msk (1UL << CoreDebug_DHCSR_S_FPD_Pos) /*!< \deprecated CoreDebug DHCSR: S_FPD Mask */ - -#define CoreDebug_DHCSR_S_SUIDE_Pos 22U /*!< \deprecated CoreDebug DHCSR: S_SUIDE Position */ -#define CoreDebug_DHCSR_S_SUIDE_Msk (1UL << CoreDebug_DHCSR_S_SUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SUIDE Mask */ - -#define CoreDebug_DHCSR_S_NSUIDE_Pos 21U /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Position */ -#define CoreDebug_DHCSR_S_NSUIDE_Msk (1UL << CoreDebug_DHCSR_S_NSUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Mask */ - -#define CoreDebug_DHCSR_S_SDE_Pos 20U /*!< \deprecated CoreDebug DHCSR: S_SDE Position */ -#define CoreDebug_DHCSR_S_SDE_Msk (1UL << CoreDebug_DHCSR_S_SDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SDE Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_PMOV_Pos 6U /*!< \deprecated CoreDebug DHCSR: C_PMOV Position */ -#define CoreDebug_DHCSR_C_PMOV_Msk (1UL << CoreDebug_DHCSR_C_PMOV_Pos) /*!< \deprecated CoreDebug DHCSR: C_PMOV Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Set Clear Exception and Monitor Control Register Definitions */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_REQ_Pos 3U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_SET_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_PEND_Pos 1U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_SET_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_UIDEN_Pos 10U /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_UIDAPEN_Pos 9U /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDAPEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDAPEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Mask */ - -#define CoreDebug_DAUTHCTRL_FSDMA_Pos 8U /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Position */ -#define CoreDebug_DAUTHCTRL_FSDMA_Msk (1UL << CoreDebug_DAUTHCTRL_FSDMA_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_FPD_Pos 23U /*!< DCB DHCSR: Floating-point registers Debuggable Position */ -#define DCB_DHCSR_S_FPD_Msk (0x1UL << DCB_DHCSR_S_FPD_Pos) /*!< DCB DHCSR: Floating-point registers Debuggable Mask */ - -#define DCB_DHCSR_S_SUIDE_Pos 22U /*!< DCB DHCSR: Secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_SUIDE_Msk (0x1UL << DCB_DHCSR_S_SUIDE_Pos) /*!< DCB DHCSR: Secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_NSUIDE_Pos 21U /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_NSUIDE_Msk (0x1UL << DCB_DHCSR_S_NSUIDE_Pos) /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_PMOV_Pos 6U /*!< DCB DHCSR: Halt on PMU overflow control Position */ -#define DCB_DHCSR_C_PMOV_Msk (0x1UL << DCB_DHCSR_C_PMOV_Pos) /*!< DCB DHCSR: Halt on PMU overflow control Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DSCEMCR, Debug Set Clear Exception and Monitor Control Register Definitions */ -#define DCB_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< DCB DSCEMCR: Clear monitor request Position */ -#define DCB_DSCEMCR_CLR_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_REQ_Pos) /*!< DCB DSCEMCR: Clear monitor request Mask */ - -#define DCB_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< DCB DSCEMCR: Clear monitor pend Position */ -#define DCB_DSCEMCR_CLR_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_PEND_Pos) /*!< DCB DSCEMCR: Clear monitor pend Mask */ - -#define DCB_DSCEMCR_SET_MON_REQ_Pos 3U /*!< DCB DSCEMCR: Set monitor request Position */ -#define DCB_DSCEMCR_SET_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_SET_MON_REQ_Pos) /*!< DCB DSCEMCR: Set monitor request Mask */ - -#define DCB_DSCEMCR_SET_MON_PEND_Pos 1U /*!< DCB DSCEMCR: Set monitor pend Position */ -#define DCB_DSCEMCR_SET_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_SET_MON_PEND_Pos) /*!< DCB DSCEMCR: Set monitor pend Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_UIDEN_Pos 10U /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Position */ -#define DCB_DAUTHCTRL_UIDEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Mask */ - -#define DCB_DAUTHCTRL_UIDAPEN_Pos 9U /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Position */ -#define DCB_DAUTHCTRL_UIDAPEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDAPEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Mask */ - -#define DCB_DAUTHCTRL_FSDMA_Pos 8U /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Position */ -#define DCB_DAUTHCTRL_FSDMA_Msk (0x1UL << DCB_DAUTHCTRL_FSDMA_Pos) /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Mask */ - -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SUNID_Pos 22U /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUNID_Msk (0x3UL << DIB_DAUTHSTATUS_SUNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SUID_Pos 20U /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUID_Msk (0x3UL << DIB_DAUTHSTATUS_SUID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_NSUNID_Pos 18U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Position */ -#define DIB_DAUTHSTATUS_NSUNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Mask */ - -#define DIB_DAUTHSTATUS_NSUID_Pos 16U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_NSUID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \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 ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB 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 */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - #define PMU_BASE (0xE0003000UL) /*!< PMU Base Address */ - #define PMU ((PMU_Type *) PMU_BASE ) /*!< PMU configuration struct */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ -#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug 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 - #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 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \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) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \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->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \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->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (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. - VTOR must been relocated to SRAM before. - \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 *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \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 *)SCB->VTOR; - 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 = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## PMU functions and events #################################### */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - -#include "pmu_armv8.h" - -#endif - -/* ########################## 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) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - -/* ########################## MVE functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_MveFunctions MVE Functions - \brief Function that provides MVE type. - @{ - */ - -/** - \brief get MVE type - \details returns the MVE type - \returns - - \b 0: No Vector Extension (MVE) - - \b 1: Integer Vector Extension (MVE-I) - - \b 2: Floating-point Vector Extension (MVE-F) - */ -__STATIC_INLINE uint32_t SCB_GetMVEType(void) -{ - const uint32_t mvfr1 = FPU->MVFR1; - if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x2U << FPU_MVFR1_MVE_Pos)) - { - return 2U; - } - else if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x1U << FPU_MVFR1_MVE_Pos)) - { - return 1U; - } - else - { - return 0U; - } -} - - -/*@} end of CMSIS_Core_MveFunctions */ - - -/* ########################## Cache functions #################################### */ - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) -#include "cachel1_armv7.h" -#endif - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## 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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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 */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, 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 __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV81MML_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_armv8mbl.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_armv8mbl.h deleted file mode 100644 index 932d3d1..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_armv8mbl.h +++ /dev/null @@ -1,2222 +0,0 @@ -/**************************************************************************//** - * @file core_armv8mbl.h - * @brief CMSIS Armv8-M Baseline Core Peripheral Access Layer Header File - * @version V5.1.0 - * @date 27. March 2020 - ******************************************************************************/ -/* - * Copyright (c) 2009-2020 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 */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_ARMV8MBL_H_GENERIC -#define __CORE_ARMV8MBL_H_GENERIC - -#include - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_ARMv8MBL - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS definitions */ -#define __ARMv8MBL_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __ARMv8MBL_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __ARMv8MBL_CMSIS_VERSION ((__ARMv8MBL_CMSIS_VERSION_MAIN << 16U) | \ - __ARMv8MBL_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (2U) /*!< 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_FP - #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_ARMV8MBL_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_ARMV8MBL_H_DEPENDANT -#define __CORE_ARMV8MBL_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __ARMv8MBL_REV - #define __ARMv8MBL_REV 0x0000U - #warning "__ARMv8MBL_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT 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 - - #ifndef __ETM_PRESENT - #define __ETM_PRESENT 0U - #warning "__ETM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MTB_PRESENT - #define __MTB_PRESENT 0U - #warning "__MTB_PRESENT not defined in device header file; using default!" - #endif - -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers 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 ARMv8MBL */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU 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 nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - 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 */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV 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[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint32_t IPR[124U]; /*!< 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 */ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __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 SHPR[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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE 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 */ - -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* 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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT 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_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - uint32_t RESERVED0[6U]; - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[809U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ - uint32_t RESERVED4[4U]; - __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ -#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI Periodic Synchronization Control Register Definitions */ -#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ -#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ - -/* TPI Software Lock Status Register Definitions */ -#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ -#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ - -#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ -#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ - -#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ -#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - uint32_t RESERVED0[7U]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 1U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#endif -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: DWTENA Position */ -#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< \deprecated CoreDebug DEMCR: DWTENA Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \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 DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB 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 */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug 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 - #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 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/* 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) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \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->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_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->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHPR[_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. - VTOR must been relocated to SRAM before. - If VTOR is not present 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) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \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) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - 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(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## 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 */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## 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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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 */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, 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 __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV8MBL_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_armv8mml.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_armv8mml.h deleted file mode 100644 index c119fbf..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_armv8mml.h +++ /dev/null @@ -1,3209 +0,0 @@ -/**************************************************************************//** - * @file core_armv8mml.h - * @brief CMSIS Armv8-M Mainline Core Peripheral Access Layer Header File - * @version V5.2.3 - * @date 13. October 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 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 */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_ARMV8MML_H_GENERIC -#define __CORE_ARMV8MML_H_GENERIC - -#include - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_ARMv8MML - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS Armv8MML definitions */ -#define __ARMv8MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __ARMv8MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __ARMv8MML_CMSIS_VERSION ((__ARMv8MML_CMSIS_VERSION_MAIN << 16U) | \ - __ARMv8MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (80U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV8MML_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_ARMV8MML_H_DEPENDANT -#define __CORE_ARMV8MML_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __ARMv8MML_REV - #define __ARMv8MML_REV 0x0000U - #warning "__ARMv8MML_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #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 - - IO Type Qualifiers 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 ARMv8MML */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU 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:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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 */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE 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 nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV 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[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} 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 */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __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 */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} 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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE 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 Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF 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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ -#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set 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[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM 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_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[4U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[809U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ - uint32_t RESERVED4[4U]; - __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ -#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI Periodic Synchronization Control Register Definitions */ -#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ -#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ - -/* TPI Software Lock Status Register Definitions */ -#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ -#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ - -#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ -#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ - -#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ -#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \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 ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB 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 */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ -#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug 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 - #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 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \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) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \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->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \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->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (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. - VTOR must been relocated to SRAM before. - \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 *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \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 *)SCB->VTOR; - 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 = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## 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) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - -/* ########################## Cache functions #################################### */ - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) -#include "cachel1_armv7.h" -#endif - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## 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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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 */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, 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 __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_ARMV8MML_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm0.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm0.h deleted file mode 100644 index 6441ff3..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm0.h +++ /dev/null @@ -1,952 +0,0 @@ -/**************************************************************************//** - * @file core_cm0.h - * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File - * @version V5.0.8 - * @date 21. August 2019 - ******************************************************************************/ -/* - * Copyright (c) 2009-2019 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 - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- 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_FP - #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 - - IO Type Qualifiers 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 RESERVED1[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) - { - __COMPILER_BARRIER(); - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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 *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ - *(vectors + (int32_t)IRQn) = vector; /* use pointer arithmetic to access vector */ - /* ARM Application Note 321 states that the M0 does not require the architectural barrier */ -} - - -/** - \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 *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ - return *(vectors + (int32_t)IRQn); /* use pointer arithmetic to access vector */ -} - - -/** - \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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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 */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm0plus.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm0plus.h deleted file mode 100644 index 4e7179a..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm0plus.h +++ /dev/null @@ -1,1087 +0,0 @@ -/**************************************************************************//** - * @file core_cm0plus.h - * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File - * @version V5.0.9 - * @date 21. August 2019 - ******************************************************************************/ -/* - * Copyright (c) 2009-2019 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_CM0PLUS_H_GENERIC -#define __CORE_CM0PLUS_H_GENERIC - -#include - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex-M0+ - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM0+ definitions */ -#define __CM0PLUS_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM0PLUS_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ - __CM0PLUS_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_FP - #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_CM0PLUS_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0PLUS_H_DEPENDANT -#define __CORE_CM0PLUS_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0PLUS_REV - #define __CM0PLUS_REV 0x0000U - #warning "__CM0PLUS_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT 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 - - IO Type Qualifiers 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 - - Core MPU 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 nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - 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 */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV 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 RESERVED1[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 */ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __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 */ - -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) -/* SCB Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 8U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* 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 */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ -} MPU_Type; - -#define MPU_TYPE_RALIASES 1U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \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 */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * 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) - { - __COMPILER_BARRIER(); - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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. - VTOR must been relocated to SRAM before. - If VTOR is not present 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) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; -#else - uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ - *(vectors + (int32_t)IRQn) = vector; /* use pointer arithmetic to access vector */ -#endif - /* ARM Application Note 321 states that the M0+ does not require the architectural barrier */ -} - - -/** - \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) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; - return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; -#else - uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ - return *(vectors + (int32_t)IRQn); /* use pointer arithmetic to access vector */ -#endif -} - - -/** - \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 */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - -/* ########################## 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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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_CM0PLUS_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm1.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm1.h deleted file mode 100644 index 76b4569..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm1.h +++ /dev/null @@ -1,979 +0,0 @@ -/**************************************************************************//** - * @file core_cm1.h - * @brief CMSIS Cortex-M1 Core Peripheral Access Layer Header File - * @version V1.0.1 - * @date 12. November 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 - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- 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_FP - #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 - - IO Type Qualifiers 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) - { - __COMPILER_BARRIER(); - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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; - /* ARM Application Note 321 states that the M1 does not require the architectural barrier */ -} - - -/** - \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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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 */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm23.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm23.h deleted file mode 100644 index 55fff99..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm23.h +++ /dev/null @@ -1,2297 +0,0 @@ -/**************************************************************************//** - * @file core_cm23.h - * @brief CMSIS Cortex-M23 Core Peripheral Access Layer Header File - * @version V5.1.0 - * @date 11. February 2020 - ******************************************************************************/ -/* - * Copyright (c) 2009-2020 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 */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_CM23_H_GENERIC -#define __CORE_CM23_H_GENERIC - -#include - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M23 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS definitions */ -#define __CM23_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM23_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM23_CMSIS_VERSION ((__CM23_CMSIS_VERSION_MAIN << 16U) | \ - __CM23_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (23U) /*!< 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_FP - #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_CM23_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM23_H_DEPENDANT -#define __CORE_CM23_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM23_REV - #define __CM23_REV 0x0000U - #warning "__CM23_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT 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 - - #ifndef __ETM_PRESENT - #define __ETM_PRESENT 0U - #warning "__ETM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MTB_PRESENT - #define __MTB_PRESENT 0U - #warning "__MTB_PRESENT not defined in device header file; using default!" - #endif - -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers 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_M23 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU 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 nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - 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 */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV 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[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint32_t IPR[124U]; /*!< 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 */ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __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 SHPR[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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE 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 */ - -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* 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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT 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_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - uint32_t RESERVED0[6U]; - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ - __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ - __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration Test FIFO Test Data 0 Register Definitions */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ -#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ -#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ -#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ - -/* TPI Integration Test ATB Control Register 2 Register Definitions */ -#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ -#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ - -#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ -#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ - -#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ -#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ - -#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ -#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ - -/* TPI Integration Test FIFO Test Data 1 Register Definitions */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ -#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ -#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ -#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ - -/* TPI Integration Test ATB Control Register 0 Definitions */ -#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ -#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ - -#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ -#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ - -#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ -#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ - -#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ -#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - uint32_t RESERVED0[7U]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 1U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#endif -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: DWTENA Position */ -#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< \deprecated CoreDebug DEMCR: DWTENA Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \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 DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB 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 */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug 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 not available for Cortex-M23 */ -/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M23 */ - #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 - #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 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/* 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) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \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->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_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->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB->SHPR[_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. - VTOR must been relocated to SRAM before. - If VTOR is not present 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) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \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) -{ -#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) - uint32_t *vectors = (uint32_t *)SCB->VTOR; -#else - uint32_t *vectors = (uint32_t *)0x0U; -#endif - 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(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## 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 */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## 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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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 */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, 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 __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM23_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm3.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm3.h deleted file mode 100644 index 74fb87e..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm3.h +++ /dev/null @@ -1,1943 +0,0 @@ -/**************************************************************************//** - * @file core_cm3.h - * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File - * @version V5.1.2 - * @date 04. June 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 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_CM3_H_GENERIC -#define __CORE_CM3_H_GENERIC - -#include - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M3 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM3 definitions */ -#define __CM3_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM3_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16U) | \ - __CM3_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (3U) /*!< 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_FP - #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_CM3_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM3_H_DEPENDANT -#define __CORE_CM3_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM3_REV - #define __CM3_REV 0x0200U - #warning "__CM3_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #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 - - IO Type Qualifiers 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_M3 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU 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:27; /*!< bit: 0..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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 */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q 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:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 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 nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - 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 */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV 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[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} 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 */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __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 */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control 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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE 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 Vector Table Offset Register Definitions */ -#if defined (__CM3_REV) && (__CM3_REV < 0x0201U) /* core r2p1 */ -#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ -#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ - -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#else -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* 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_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP 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 */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET 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_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED 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[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ -#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -#else - uint32_t RESERVED1[1U]; -#endif -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) -#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ -#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ - -#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ -#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ -#endif - -/*@} 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_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ -#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ - -#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ -#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ -#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ - -#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ -#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} 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 ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug 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 */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug 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 - #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 */ - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \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) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \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[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \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[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (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. - VTOR must been relocated to SRAM before. - \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 *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - /* ARM Application Note 321 states that the M3 does not require the architectural barrier */ -} - - -/** - \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 *)SCB->VTOR; - 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 = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - - -/* ########################## 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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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 */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM3_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm33.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm33.h deleted file mode 100644 index 18a2e6f..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm33.h +++ /dev/null @@ -1,3277 +0,0 @@ -/**************************************************************************//** - * @file core_cm33.h - * @brief CMSIS Cortex-M33 Core Peripheral Access Layer Header File - * @version V5.2.3 - * @date 13. October 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 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 */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_CM33_H_GENERIC -#define __CORE_CM33_H_GENERIC - -#include - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M33 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM33 definitions */ -#define __CM33_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM33_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM33_CMSIS_VERSION ((__CM33_CMSIS_VERSION_MAIN << 16U) | \ - __CM33_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (33U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined (__TARGET_FPU_VFP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined (__ARM_FP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined (__ARMVFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined (__TI_VFP_SUPPORT__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined (__FPU_VFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM33_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM33_H_DEPENDANT -#define __CORE_CM33_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM33_REV - #define __CM33_REV 0x0000U - #warning "__CM33_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #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 - - IO Type Qualifiers 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_M33 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU 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:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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 */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE 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 nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV 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[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} 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 */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __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 */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} 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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE 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 Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF 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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ -#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set 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[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM 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_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[4U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ - __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ - __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration Test FIFO Test Data 0 Register Definitions */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ -#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ -#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ -#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ - -/* TPI Integration Test ATB Control Register 2 Register Definitions */ -#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ -#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ - -#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ -#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ - -#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ -#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ - -#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ -#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ - -/* TPI Integration Test FIFO Test Data 1 Register Definitions */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ -#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ -#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ -#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ - -/* TPI Integration Test ATB Control Register 0 Definitions */ -#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ -#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ - -#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ -#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ - -#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ -#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ - -#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ -#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \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 ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB 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 */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ -#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug 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 - #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 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \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) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \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->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \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->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (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. - VTOR must been relocated to SRAM before. - \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 *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \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 *)SCB->VTOR; - 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 = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## 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) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## 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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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 */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, 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 __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM33_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm35p.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm35p.h deleted file mode 100644 index 3843d95..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm35p.h +++ /dev/null @@ -1,3277 +0,0 @@ -/**************************************************************************//** - * @file core_cm35p.h - * @brief CMSIS Cortex-M35P Core Peripheral Access Layer Header File - * @version V1.1.3 - * @date 13. October 2021 - ******************************************************************************/ -/* - * Copyright (c) 2018-2021 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 */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_CM35P_H_GENERIC -#define __CORE_CM35P_H_GENERIC - -#include - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M35P - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM35P definitions */ -#define __CM35P_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM35P_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM35P_CMSIS_VERSION ((__CM35P_CMSIS_VERSION_MAIN << 16U) | \ - __CM35P_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (35U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined (__TARGET_FPU_VFP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined (__ARM_FP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined (__ARMVFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined (__TI_VFP_SUPPORT__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined (__FPU_VFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM35P_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM35P_H_DEPENDANT -#define __CORE_CM35P_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM35P_REV - #define __CM35P_REV 0x0000U - #warning "__CM35P_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #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 - - IO Type Qualifiers 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_M35P */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU 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:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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 */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE 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 nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV 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[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} 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 */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __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 */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} 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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE 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 Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF 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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ -#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set 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[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM 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_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[4U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ - __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ - __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration Test FIFO Test Data 0 Register Definitions */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ -#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ -#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ -#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ - -/* TPI Integration Test ATB Control Register 2 Register Definitions */ -#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ -#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ - -#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ -#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ - -#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ -#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ - -#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ -#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ - -/* TPI Integration Test FIFO Test Data 1 Register Definitions */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ -#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ -#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ -#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ - -/* TPI Integration Test ATB Control Register 0 Definitions */ -#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ -#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ - -#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ -#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ - -#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ -#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ - -#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ -#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \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 ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB 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 */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ -#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug 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 - #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 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \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) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \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->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \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->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (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. - VTOR must been relocated to SRAM before. - \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 *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \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 *)SCB->VTOR; - 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 = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## 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) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## 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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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 */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, 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 __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM35P_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm4.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm4.h deleted file mode 100644 index e21cd14..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm4.h +++ /dev/null @@ -1,2129 +0,0 @@ -/**************************************************************************//** - * @file core_cm4.h - * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File - * @version V5.1.2 - * @date 04. June 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2020 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_CM4_H_GENERIC -#define __CORE_CM4_H_GENERIC - -#include - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M4 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM4 definitions */ -#define __CM4_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM4_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ - __CM4_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (4U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM4_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM4_H_DEPENDANT -#define __CORE_CM4_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM4_REV - #define __CM4_REV 0x0000U - #warning "__CM4_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #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 - - IO Type Qualifiers 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_M4 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core FPU 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:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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 */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 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 nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV 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[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} 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 */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __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 */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control 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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE 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 Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF 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_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP 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 */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET 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_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED 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[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ -#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ - -#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ -#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT 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_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ -#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ - -#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ -#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ -#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ - -#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ -#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and FP Feature Register 2 Definitions */ - -#define FPU_MVFR2_VFP_Misc_Pos 4U /*!< MVFR2: VFP Misc bits Position */ -#define FPU_MVFR2_VFP_Misc_Msk (0xFUL << FPU_MVFR2_VFP_Misc_Pos) /*!< MVFR2: VFP Misc bits Mask */ - -/*@} end of group CMSIS_FPU */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} 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 ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug 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 */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ -#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug 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 - #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 */ -#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ -#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ -#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \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) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \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[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \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[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (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. - VTOR must been relocated to SRAM before. - \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 *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - /* ARM Application Note 321 states that the M4 does not require the architectural barrier */ -} - - -/** - \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 *)SCB->VTOR; - 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 = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - - -/* ########################## 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) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - 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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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 */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM4_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm55.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm55.h deleted file mode 100644 index faa30ce..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm55.h +++ /dev/null @@ -1,4817 +0,0 @@ -/**************************************************************************//** - * @file core_cm55.h - * @brief CMSIS Cortex-M55 Core Peripheral Access Layer Header File - * @version V1.2.4 - * @date 21. April 2022 - ******************************************************************************/ -/* - * Copyright (c) 2018-2022 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 */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_CM55_H_GENERIC -#define __CORE_CM55_H_GENERIC - -#include - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M55 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM55 definitions */ -#define __CM55_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM55_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM55_CMSIS_VERSION ((__CM55_CMSIS_VERSION_MAIN << 16U) | \ - __CM55_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (55U) /*!< Cortex-M Core */ - -#if defined ( __CC_ARM ) - #error Legacy Arm Compiler does not support Armv8.1-M target architecture. -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM55_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM55_H_DEPENDANT -#define __CORE_CM55_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM55_REV - #define __CM55_REV 0x0000U - #warning "__CM55_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #if __FPU_PRESENT != 0U - #ifndef __FPU_DP - #define __FPU_DP 0U - #warning "__FPU_DP not defined in device header file; using default!" - #endif - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __PMU_PRESENT - #define __PMU_PRESENT 0U - #warning "__PMU_PRESENT not defined in device header file; using default!" - #endif - - #if __PMU_PRESENT != 0U - #ifndef __PMU_NUM_EVENTCNT - #define __PMU_NUM_EVENTCNT 8U - #warning "__PMU_NUM_EVENTCNT not defined in device header file; using default!" - #elif (__PMU_NUM_EVENTCNT > 8 || __PMU_NUM_EVENTCNT < 2) - #error "__PMU_NUM_EVENTCNT is out of range in device header file!" */ - #endif - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #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 - - IO Type Qualifiers 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_M55 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core EWIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core PMU Register - - Core MPU Register - - Core SAU Register - - Core FPU 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:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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 */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE 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 nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV 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[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} 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 */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __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 */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - __IOM uint32_t RFSR; /*!< Offset: 0x204 (R/W) RAS Fault Status Register */ - uint32_t RESERVED4[14U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} 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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE 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 Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF 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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_IESB_Pos 5U /*!< SCB AIRCR: Implicit ESB Enable Position */ -#define SCB_AIRCR_IESB_Msk (1UL << SCB_AIRCR_IESB_Pos) /*!< SCB AIRCR: Implicit ESB Enable Mask */ - -#define SCB_AIRCR_DIT_Pos 4U /*!< SCB AIRCR: Data Independent Timing Position */ -#define SCB_AIRCR_DIT_Msk (1UL << SCB_AIRCR_DIT_Pos) /*!< SCB AIRCR: Data Independent Timing Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_TRD_Pos 20U /*!< SCB CCR: TRD Position */ -#define SCB_CCR_TRD_Msk (1UL << SCB_CCR_TRD_Pos) /*!< SCB CCR: TRD Mask */ - -#define SCB_CCR_LOB_Pos 19U /*!< SCB CCR: LOB Position */ -#define SCB_CCR_LOB_Msk (1UL << SCB_CCR_LOB_Pos) /*!< SCB CCR: LOB Mask */ - -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_PMU_Pos 5U /*!< SCB DFSR: PMU Position */ -#define SCB_DFSR_PMU_Msk (1UL << SCB_DFSR_PMU_Pos) /*!< SCB DFSR: PMU Mask */ - -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CP7_Pos 7U /*!< SCB NSACR: CP7 Position */ -#define SCB_NSACR_CP7_Msk (1UL << SCB_NSACR_CP7_Pos) /*!< SCB NSACR: CP7 Mask */ - -#define SCB_NSACR_CP6_Pos 6U /*!< SCB NSACR: CP6 Position */ -#define SCB_NSACR_CP6_Msk (1UL << SCB_NSACR_CP6_Pos) /*!< SCB NSACR: CP6 Mask */ - -#define SCB_NSACR_CP5_Pos 5U /*!< SCB NSACR: CP5 Position */ -#define SCB_NSACR_CP5_Msk (1UL << SCB_NSACR_CP5_Pos) /*!< SCB NSACR: CP5 Mask */ - -#define SCB_NSACR_CP4_Pos 4U /*!< SCB NSACR: CP4 Position */ -#define SCB_NSACR_CP4_Msk (1UL << SCB_NSACR_CP4_Pos) /*!< SCB NSACR: CP4 Mask */ - -#define SCB_NSACR_CP3_Pos 3U /*!< SCB NSACR: CP3 Position */ -#define SCB_NSACR_CP3_Msk (1UL << SCB_NSACR_CP3_Pos) /*!< SCB NSACR: CP3 Mask */ - -#define SCB_NSACR_CP2_Pos 2U /*!< SCB NSACR: CP2 Position */ -#define SCB_NSACR_CP2_Msk (1UL << SCB_NSACR_CP2_Pos) /*!< SCB NSACR: CP2 Mask */ - -#define SCB_NSACR_CP1_Pos 1U /*!< SCB NSACR: CP1 Position */ -#define SCB_NSACR_CP1_Msk (1UL << SCB_NSACR_CP1_Pos) /*!< SCB NSACR: CP1 Mask */ - -#define SCB_NSACR_CP0_Pos 0U /*!< SCB NSACR: CP0 Position */ -#define SCB_NSACR_CP0_Msk (1UL /*<< SCB_NSACR_CP0_Pos*/) /*!< SCB NSACR: CP0 Mask */ - -/* SCB Debug Feature Register 0 Definitions */ -#define SCB_ID_DFR_UDE_Pos 28U /*!< SCB ID_DFR: UDE Position */ -#define SCB_ID_DFR_UDE_Msk (0xFUL << SCB_ID_DFR_UDE_Pos) /*!< SCB ID_DFR: UDE Mask */ - -#define SCB_ID_DFR_MProfDbg_Pos 20U /*!< SCB ID_DFR: MProfDbg Position */ -#define SCB_ID_DFR_MProfDbg_Msk (0xFUL << SCB_ID_DFR_MProfDbg_Pos) /*!< SCB ID_DFR: MProfDbg Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB RAS Fault Status Register Definitions */ -#define SCB_RFSR_V_Pos 31U /*!< SCB RFSR: V Position */ -#define SCB_RFSR_V_Msk (1UL << SCB_RFSR_V_Pos) /*!< SCB RFSR: V Mask */ - -#define SCB_RFSR_IS_Pos 16U /*!< SCB RFSR: IS Position */ -#define SCB_RFSR_IS_Msk (0x7FFFUL << SCB_RFSR_IS_Pos) /*!< SCB RFSR: IS Mask */ - -#define SCB_RFSR_UET_Pos 0U /*!< SCB RFSR: UET Position */ -#define SCB_RFSR_UET_Msk (3UL /*<< SCB_RFSR_UET_Pos*/) /*!< SCB RFSR: UET Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ICB Implementation Control Block register (ICB) - \brief Type definitions for the Implementation Control Block Register - @{ - */ - -/** - \brief Structure type to access the Implementation Control Block (ICB). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} ICB_Type; - -/* Auxiliary Control Register Definitions */ -#define ICB_ACTLR_DISCRITAXIRUW_Pos 27U /*!< ACTLR: DISCRITAXIRUW Position */ -#define ICB_ACTLR_DISCRITAXIRUW_Msk (1UL << ICB_ACTLR_DISCRITAXIRUW_Pos) /*!< ACTLR: DISCRITAXIRUW Mask */ - -#define ICB_ACTLR_DISDI_Pos 16U /*!< ACTLR: DISDI Position */ -#define ICB_ACTLR_DISDI_Msk (3UL << ICB_ACTLR_DISDI_Pos) /*!< ACTLR: DISDI Mask */ - -#define ICB_ACTLR_DISCRITAXIRUR_Pos 15U /*!< ACTLR: DISCRITAXIRUR Position */ -#define ICB_ACTLR_DISCRITAXIRUR_Msk (1UL << ICB_ACTLR_DISCRITAXIRUR_Pos) /*!< ACTLR: DISCRITAXIRUR Mask */ - -#define ICB_ACTLR_EVENTBUSEN_Pos 14U /*!< ACTLR: EVENTBUSEN Position */ -#define ICB_ACTLR_EVENTBUSEN_Msk (1UL << ICB_ACTLR_EVENTBUSEN_Pos) /*!< ACTLR: EVENTBUSEN Mask */ - -#define ICB_ACTLR_EVENTBUSEN_S_Pos 13U /*!< ACTLR: EVENTBUSEN_S Position */ -#define ICB_ACTLR_EVENTBUSEN_S_Msk (1UL << ICB_ACTLR_EVENTBUSEN_S_Pos) /*!< ACTLR: EVENTBUSEN_S Mask */ - -#define ICB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ -#define ICB_ACTLR_DISITMATBFLUSH_Msk (1UL << ICB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ - -#define ICB_ACTLR_DISNWAMODE_Pos 11U /*!< ACTLR: DISNWAMODE Position */ -#define ICB_ACTLR_DISNWAMODE_Msk (1UL << ICB_ACTLR_DISNWAMODE_Pos) /*!< ACTLR: DISNWAMODE Mask */ - -#define ICB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ -#define ICB_ACTLR_FPEXCODIS_Msk (1UL << ICB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ - -#define ICB_ACTLR_DISOLAP_Pos 7U /*!< ACTLR: DISOLAP Position */ -#define ICB_ACTLR_DISOLAP_Msk (1UL << ICB_ACTLR_DISOLAP_Pos) /*!< ACTLR: DISOLAP Mask */ - -#define ICB_ACTLR_DISOLAPS_Pos 6U /*!< ACTLR: DISOLAPS Position */ -#define ICB_ACTLR_DISOLAPS_Msk (1UL << ICB_ACTLR_DISOLAPS_Pos) /*!< ACTLR: DISOLAPS Mask */ - -#define ICB_ACTLR_DISLOBR_Pos 5U /*!< ACTLR: DISLOBR Position */ -#define ICB_ACTLR_DISLOBR_Msk (1UL << ICB_ACTLR_DISLOBR_Pos) /*!< ACTLR: DISLOBR Mask */ - -#define ICB_ACTLR_DISLO_Pos 4U /*!< ACTLR: DISLO Position */ -#define ICB_ACTLR_DISLO_Msk (1UL << ICB_ACTLR_DISLO_Pos) /*!< ACTLR: DISLO Mask */ - -#define ICB_ACTLR_DISLOLEP_Pos 3U /*!< ACTLR: DISLOLEP Position */ -#define ICB_ACTLR_DISLOLEP_Msk (1UL << ICB_ACTLR_DISLOLEP_Pos) /*!< ACTLR: DISLOLEP Mask */ - -#define ICB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define ICB_ACTLR_DISFOLD_Msk (1UL << ICB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -/* Interrupt Controller Type Register Definitions */ -#define ICB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define ICB_ICTR_INTLINESNUM_Msk (0xFUL /*<< ICB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_ICB */ - - -/** - \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_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[3U]; - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) ITM Device Type Register */ - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup MemSysCtl_Type Memory System Control Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Memory System Control Registers (MEMSYSCTL) - @{ - */ - -/** - \brief Structure type to access the Memory System Control Registers (MEMSYSCTL). - */ -typedef struct -{ - __IOM uint32_t MSCR; /*!< Offset: 0x000 (R/W) Memory System Control Register */ - __IOM uint32_t PFCR; /*!< Offset: 0x004 (R/W) Prefetcher Control Register */ - uint32_t RESERVED1[2U]; - __IOM uint32_t ITCMCR; /*!< Offset: 0x010 (R/W) ITCM Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x014 (R/W) DTCM Control Register */ - __IOM uint32_t PAHBCR; /*!< Offset: 0x018 (R/W) P-AHB Control Register */ - uint32_t RESERVED2[313U]; - __IOM uint32_t ITGU_CTRL; /*!< Offset: 0x500 (R/W) ITGU Control Register */ - __IOM uint32_t ITGU_CFG; /*!< Offset: 0x504 (R/W) ITGU Configuration Register */ - uint32_t RESERVED3[2U]; - __IOM uint32_t ITGU_LUT[16U]; /*!< Offset: 0x510 (R/W) ITGU Look Up Table Register */ - uint32_t RESERVED4[44U]; - __IOM uint32_t DTGU_CTRL; /*!< Offset: 0x600 (R/W) DTGU Control Registers */ - __IOM uint32_t DTGU_CFG; /*!< Offset: 0x604 (R/W) DTGU Configuration Register */ - uint32_t RESERVED5[2U]; - __IOM uint32_t DTGU_LUT[16U]; /*!< Offset: 0x610 (R/W) DTGU Look Up Table Register */ -} MemSysCtl_Type; - -/* MEMSYSCTL Memory System Control Register (MSCR) Register Definitions */ -#define MEMSYSCTL_MSCR_CPWRDN_Pos 17U /*!< MEMSYSCTL MSCR: CPWRDN Position */ -#define MEMSYSCTL_MSCR_CPWRDN_Msk (0x1UL << MEMSYSCTL_MSCR_CPWRDN_Pos) /*!< MEMSYSCTL MSCR: CPWRDN Mask */ - -#define MEMSYSCTL_MSCR_DCCLEAN_Pos 16U /*!< MEMSYSCTL MSCR: DCCLEAN Position */ -#define MEMSYSCTL_MSCR_DCCLEAN_Msk (0x1UL << MEMSYSCTL_MSCR_DCCLEAN_Pos) /*!< MEMSYSCTL MSCR: DCCLEAN Mask */ - -#define MEMSYSCTL_MSCR_ICACTIVE_Pos 13U /*!< MEMSYSCTL MSCR: ICACTIVE Position */ -#define MEMSYSCTL_MSCR_ICACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_ICACTIVE_Pos) /*!< MEMSYSCTL MSCR: ICACTIVE Mask */ - -#define MEMSYSCTL_MSCR_DCACTIVE_Pos 12U /*!< MEMSYSCTL MSCR: DCACTIVE Position */ -#define MEMSYSCTL_MSCR_DCACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_DCACTIVE_Pos) /*!< MEMSYSCTL MSCR: DCACTIVE Mask */ - -#define MEMSYSCTL_MSCR_TECCCHKDIS_Pos 4U /*!< MEMSYSCTL MSCR: TECCCHKDIS Position */ -#define MEMSYSCTL_MSCR_TECCCHKDIS_Msk (0x1UL << MEMSYSCTL_MSCR_TECCCHKDIS_Pos) /*!< MEMSYSCTL MSCR: TECCCHKDIS Mask */ - -#define MEMSYSCTL_MSCR_EVECCFAULT_Pos 3U /*!< MEMSYSCTL MSCR: EVECCFAULT Position */ -#define MEMSYSCTL_MSCR_EVECCFAULT_Msk (0x1UL << MEMSYSCTL_MSCR_EVECCFAULT_Pos) /*!< MEMSYSCTL MSCR: EVECCFAULT Mask */ - -#define MEMSYSCTL_MSCR_FORCEWT_Pos 2U /*!< MEMSYSCTL MSCR: FORCEWT Position */ -#define MEMSYSCTL_MSCR_FORCEWT_Msk (0x1UL << MEMSYSCTL_MSCR_FORCEWT_Pos) /*!< MEMSYSCTL MSCR: FORCEWT Mask */ - -#define MEMSYSCTL_MSCR_ECCEN_Pos 1U /*!< MEMSYSCTL MSCR: ECCEN Position */ -#define MEMSYSCTL_MSCR_ECCEN_Msk (0x1UL << MEMSYSCTL_MSCR_ECCEN_Pos) /*!< MEMSYSCTL MSCR: ECCEN Mask */ - -/* MEMSYSCTL Prefetcher Control Register (PFCR) Register Definitions */ -#define MEMSYSCTL_PFCR_MAX_OS_Pos 7U /*!< MEMSYSCTL PFCR: MAX_OS Position */ -#define MEMSYSCTL_PFCR_MAX_OS_Msk (0x7UL << MEMSYSCTL_PFCR_MAX_OS_Pos) /*!< MEMSYSCTL PFCR: MAX_OS Mask */ - -#define MEMSYSCTL_PFCR_MAX_LA_Pos 4U /*!< MEMSYSCTL PFCR: MAX_LA Position */ -#define MEMSYSCTL_PFCR_MAX_LA_Msk (0x7UL << MEMSYSCTL_PFCR_MAX_LA_Pos) /*!< MEMSYSCTL PFCR: MAX_LA Mask */ - -#define MEMSYSCTL_PFCR_MIN_LA_Pos 1U /*!< MEMSYSCTL PFCR: MIN_LA Position */ -#define MEMSYSCTL_PFCR_MIN_LA_Msk (0x7UL << MEMSYSCTL_PFCR_MIN_LA_Pos) /*!< MEMSYSCTL PFCR: MIN_LA Mask */ - -#define MEMSYSCTL_PFCR_ENABLE_Pos 0U /*!< MEMSYSCTL PFCR: ENABLE Position */ -#define MEMSYSCTL_PFCR_ENABLE_Msk (0x1UL /*<< MEMSYSCTL_PFCR_ENABLE_Pos*/) /*!< MEMSYSCTL PFCR: ENABLE Mask */ - -/* MEMSYSCTL ITCM Control Register (ITCMCR) Register Definitions */ -#define MEMSYSCTL_ITCMCR_SZ_Pos 3U /*!< MEMSYSCTL ITCMCR: SZ Position */ -#define MEMSYSCTL_ITCMCR_SZ_Msk (0xFUL << MEMSYSCTL_ITCMCR_SZ_Pos) /*!< MEMSYSCTL ITCMCR: SZ Mask */ - -#define MEMSYSCTL_ITCMCR_EN_Pos 0U /*!< MEMSYSCTL ITCMCR: EN Position */ -#define MEMSYSCTL_ITCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_ITCMCR_EN_Pos*/) /*!< MEMSYSCTL ITCMCR: EN Mask */ - -/* MEMSYSCTL DTCM Control Register (DTCMCR) Register Definitions */ -#define MEMSYSCTL_DTCMCR_SZ_Pos 3U /*!< MEMSYSCTL DTCMCR: SZ Position */ -#define MEMSYSCTL_DTCMCR_SZ_Msk (0xFUL << MEMSYSCTL_DTCMCR_SZ_Pos) /*!< MEMSYSCTL DTCMCR: SZ Mask */ - -#define MEMSYSCTL_DTCMCR_EN_Pos 0U /*!< MEMSYSCTL DTCMCR: EN Position */ -#define MEMSYSCTL_DTCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_DTCMCR_EN_Pos*/) /*!< MEMSYSCTL DTCMCR: EN Mask */ - -/* MEMSYSCTL P-AHB Control Register (PAHBCR) Register Definitions */ -#define MEMSYSCTL_PAHBCR_SZ_Pos 1U /*!< MEMSYSCTL PAHBCR: SZ Position */ -#define MEMSYSCTL_PAHBCR_SZ_Msk (0x7UL << MEMSYSCTL_PAHBCR_SZ_Pos) /*!< MEMSYSCTL PAHBCR: SZ Mask */ - -#define MEMSYSCTL_PAHBCR_EN_Pos 0U /*!< MEMSYSCTL PAHBCR: EN Position */ -#define MEMSYSCTL_PAHBCR_EN_Msk (0x1UL /*<< MEMSYSCTL_PAHBCR_EN_Pos*/) /*!< MEMSYSCTL PAHBCR: EN Mask */ - -/* MEMSYSCTL ITGU Control Register (ITGU_CTRL) Register Definitions */ -#define MEMSYSCTL_ITGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL ITGU_CTRL: DEREN Position */ -#define MEMSYSCTL_ITGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_ITGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL ITGU_CTRL: DEREN Mask */ - -#define MEMSYSCTL_ITGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL ITGU_CTRL: DBFEN Position */ -#define MEMSYSCTL_ITGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_ITGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL ITGU_CTRL: DBFEN Mask */ - -/* MEMSYSCTL ITGU Configuration Register (ITGU_CFG) Register Definitions */ -#define MEMSYSCTL_ITGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL ITGU_CFG: PRESENT Position */ -#define MEMSYSCTL_ITGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_ITGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL ITGU_CFG: PRESENT Mask */ - -#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Position */ -#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Mask */ - -#define MEMSYSCTL_ITGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL ITGU_CFG: BLKSZ Position */ -#define MEMSYSCTL_ITGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_ITGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL ITGU_CFG: BLKSZ Mask */ - -/* MEMSYSCTL DTGU Control Registers (DTGU_CTRL) Register Definitions */ -#define MEMSYSCTL_DTGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL DTGU_CTRL: DEREN Position */ -#define MEMSYSCTL_DTGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_DTGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL DTGU_CTRL: DEREN Mask */ - -#define MEMSYSCTL_DTGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL DTGU_CTRL: DBFEN Position */ -#define MEMSYSCTL_DTGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_DTGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL DTGU_CTRL: DBFEN Mask */ - -/* MEMSYSCTL DTGU Configuration Register (DTGU_CFG) Register Definitions */ -#define MEMSYSCTL_DTGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL DTGU_CFG: PRESENT Position */ -#define MEMSYSCTL_DTGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_DTGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL DTGU_CFG: PRESENT Mask */ - -#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Position */ -#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Mask */ - -#define MEMSYSCTL_DTGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL DTGU_CFG: BLKSZ Position */ -#define MEMSYSCTL_DTGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_DTGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL DTGU_CFG: BLKSZ Mask */ - - -/*@}*/ /* end of group MemSysCtl_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup PwrModCtl_Type Power Mode Control Registers - \brief Type definitions for the Power Mode Control Registers (PWRMODCTL) - @{ - */ - -/** - \brief Structure type to access the Power Mode Control Registers (PWRMODCTL). - */ -typedef struct -{ - __IOM uint32_t CPDLPSTATE; /*!< Offset: 0x000 (R/W) Core Power Domain Low Power State Register */ - __IOM uint32_t DPDLPSTATE; /*!< Offset: 0x004 (R/W) Debug Power Domain Low Power State Register */ -} PwrModCtl_Type; - -/* PWRMODCTL Core Power Domain Low Power State (CPDLPSTATE) Register Definitions */ -#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos 8U /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Mask */ - -#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos 4U /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Mask */ - -#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos 0U /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Msk (0x3UL /*<< PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos*/) /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Mask */ - -/* PWRMODCTL Debug Power Domain Low Power State (DPDLPSTATE) Register Definitions */ -#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos 0U /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Position */ -#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Msk (0x3UL /*<< PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos*/) /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Mask */ - -/*@}*/ /* end of group PwrModCtl_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup EWIC_Type External Wakeup Interrupt Controller Registers - \brief Type definitions for the External Wakeup Interrupt Controller Registers (EWIC) - @{ - */ - -/** - \brief Structure type to access the External Wakeup Interrupt Controller Registers (EWIC). - */ -typedef struct -{ - __OM uint32_t EVENTSPR; /*!< Offset: 0x000 ( /W) Event Set Pending Register */ - uint32_t RESERVED0[31U]; - __IM uint32_t EVENTMASKA; /*!< Offset: 0x080 (R/W) Event Mask A Register */ - __IM uint32_t EVENTMASK[15]; /*!< Offset: 0x084 (R/W) Event Mask Register */ -} EWIC_Type; - -/* EWIC External Wakeup Interrupt Controller (EVENTSPR) Register Definitions */ -#define EWIC_EVENTSPR_EDBGREQ_Pos 2U /*!< EWIC EVENTSPR: EDBGREQ Position */ -#define EWIC_EVENTSPR_EDBGREQ_Msk (0x1UL << EWIC_EVENTSPR_EDBGREQ_Pos) /*!< EWIC EVENTSPR: EDBGREQ Mask */ - -#define EWIC_EVENTSPR_NMI_Pos 1U /*!< EWIC EVENTSPR: NMI Position */ -#define EWIC_EVENTSPR_NMI_Msk (0x1UL << EWIC_EVENTSPR_NMI_Pos) /*!< EWIC EVENTSPR: NMI Mask */ - -#define EWIC_EVENTSPR_EVENT_Pos 0U /*!< EWIC EVENTSPR: EVENT Position */ -#define EWIC_EVENTSPR_EVENT_Msk (0x1UL /*<< EWIC_EVENTSPR_EVENT_Pos*/) /*!< EWIC EVENTSPR: EVENT Mask */ - -/* EWIC External Wakeup Interrupt Controller (EVENTMASKA) Register Definitions */ -#define EWIC_EVENTMASKA_EDBGREQ_Pos 2U /*!< EWIC EVENTMASKA: EDBGREQ Position */ -#define EWIC_EVENTMASKA_EDBGREQ_Msk (0x1UL << EWIC_EVENTMASKA_EDBGREQ_Pos) /*!< EWIC EVENTMASKA: EDBGREQ Mask */ - -#define EWIC_EVENTMASKA_NMI_Pos 1U /*!< EWIC EVENTMASKA: NMI Position */ -#define EWIC_EVENTMASKA_NMI_Msk (0x1UL << EWIC_EVENTMASKA_NMI_Pos) /*!< EWIC EVENTMASKA: NMI Mask */ - -#define EWIC_EVENTMASKA_EVENT_Pos 0U /*!< EWIC EVENTMASKA: EVENT Position */ -#define EWIC_EVENTMASKA_EVENT_Msk (0x1UL /*<< EWIC_EVENTMASKA_EVENT_Pos*/) /*!< EWIC EVENTMASKA: EVENT Mask */ - -/* EWIC External Wakeup Interrupt Controller (EVENTMASK) Register Definitions */ -#define EWIC_EVENTMASK_IRQ_Pos 0U /*!< EWIC EVENTMASKA: IRQ Position */ -#define EWIC_EVENTMASK_IRQ_Msk (0xFFFFFFFFUL /*<< EWIC_EVENTMASKA_IRQ_Pos*/) /*!< EWIC EVENTMASKA: IRQ Mask */ - -/*@}*/ /* end of group EWIC_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup ErrBnk_Type Error Banking Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Error Banking Registers (ERRBNK) - @{ - */ - -/** - \brief Structure type to access the Error Banking Registers (ERRBNK). - */ -typedef struct -{ - __IOM uint32_t IEBR0; /*!< Offset: 0x000 (R/W) Instruction Cache Error Bank Register 0 */ - __IOM uint32_t IEBR1; /*!< Offset: 0x004 (R/W) Instruction Cache Error Bank Register 1 */ - uint32_t RESERVED0[2U]; - __IOM uint32_t DEBR0; /*!< Offset: 0x010 (R/W) Data Cache Error Bank Register 0 */ - __IOM uint32_t DEBR1; /*!< Offset: 0x014 (R/W) Data Cache Error Bank Register 1 */ - uint32_t RESERVED1[2U]; - __IOM uint32_t TEBR0; /*!< Offset: 0x020 (R/W) TCM Error Bank Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t TEBR1; /*!< Offset: 0x028 (R/W) TCM Error Bank Register 1 */ -} ErrBnk_Type; - -/* ERRBNK Instruction Cache Error Bank Register 0 (IEBR0) Register Definitions */ -#define ERRBNK_IEBR0_SWDEF_Pos 30U /*!< ERRBNK IEBR0: SWDEF Position */ -#define ERRBNK_IEBR0_SWDEF_Msk (0x3UL << ERRBNK_IEBR0_SWDEF_Pos) /*!< ERRBNK IEBR0: SWDEF Mask */ - -#define ERRBNK_IEBR0_BANK_Pos 16U /*!< ERRBNK IEBR0: BANK Position */ -#define ERRBNK_IEBR0_BANK_Msk (0x1UL << ERRBNK_IEBR0_BANK_Pos) /*!< ERRBNK IEBR0: BANK Mask */ - -#define ERRBNK_IEBR0_LOCATION_Pos 2U /*!< ERRBNK IEBR0: LOCATION Position */ -#define ERRBNK_IEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR0_LOCATION_Pos) /*!< ERRBNK IEBR0: LOCATION Mask */ - -#define ERRBNK_IEBR0_LOCKED_Pos 1U /*!< ERRBNK IEBR0: LOCKED Position */ -#define ERRBNK_IEBR0_LOCKED_Msk (0x1UL << ERRBNK_IEBR0_LOCKED_Pos) /*!< ERRBNK IEBR0: LOCKED Mask */ - -#define ERRBNK_IEBR0_VALID_Pos 0U /*!< ERRBNK IEBR0: VALID Position */ -#define ERRBNK_IEBR0_VALID_Msk (0x1UL << /*ERRBNK_IEBR0_VALID_Pos*/) /*!< ERRBNK IEBR0: VALID Mask */ - -/* ERRBNK Instruction Cache Error Bank Register 1 (IEBR1) Register Definitions */ -#define ERRBNK_IEBR1_SWDEF_Pos 30U /*!< ERRBNK IEBR1: SWDEF Position */ -#define ERRBNK_IEBR1_SWDEF_Msk (0x3UL << ERRBNK_IEBR1_SWDEF_Pos) /*!< ERRBNK IEBR1: SWDEF Mask */ - -#define ERRBNK_IEBR1_BANK_Pos 16U /*!< ERRBNK IEBR1: BANK Position */ -#define ERRBNK_IEBR1_BANK_Msk (0x1UL << ERRBNK_IEBR1_BANK_Pos) /*!< ERRBNK IEBR1: BANK Mask */ - -#define ERRBNK_IEBR1_LOCATION_Pos 2U /*!< ERRBNK IEBR1: LOCATION Position */ -#define ERRBNK_IEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR1_LOCATION_Pos) /*!< ERRBNK IEBR1: LOCATION Mask */ - -#define ERRBNK_IEBR1_LOCKED_Pos 1U /*!< ERRBNK IEBR1: LOCKED Position */ -#define ERRBNK_IEBR1_LOCKED_Msk (0x1UL << ERRBNK_IEBR1_LOCKED_Pos) /*!< ERRBNK IEBR1: LOCKED Mask */ - -#define ERRBNK_IEBR1_VALID_Pos 0U /*!< ERRBNK IEBR1: VALID Position */ -#define ERRBNK_IEBR1_VALID_Msk (0x1UL << /*ERRBNK_IEBR1_VALID_Pos*/) /*!< ERRBNK IEBR1: VALID Mask */ - -/* ERRBNK Data Cache Error Bank Register 0 (DEBR0) Register Definitions */ -#define ERRBNK_DEBR0_SWDEF_Pos 30U /*!< ERRBNK DEBR0: SWDEF Position */ -#define ERRBNK_DEBR0_SWDEF_Msk (0x3UL << ERRBNK_DEBR0_SWDEF_Pos) /*!< ERRBNK DEBR0: SWDEF Mask */ - -#define ERRBNK_DEBR0_TYPE_Pos 17U /*!< ERRBNK DEBR0: TYPE Position */ -#define ERRBNK_DEBR0_TYPE_Msk (0x1UL << ERRBNK_DEBR0_TYPE_Pos) /*!< ERRBNK DEBR0: TYPE Mask */ - -#define ERRBNK_DEBR0_BANK_Pos 16U /*!< ERRBNK DEBR0: BANK Position */ -#define ERRBNK_DEBR0_BANK_Msk (0x1UL << ERRBNK_DEBR0_BANK_Pos) /*!< ERRBNK DEBR0: BANK Mask */ - -#define ERRBNK_DEBR0_LOCATION_Pos 2U /*!< ERRBNK DEBR0: LOCATION Position */ -#define ERRBNK_DEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR0_LOCATION_Pos) /*!< ERRBNK DEBR0: LOCATION Mask */ - -#define ERRBNK_DEBR0_LOCKED_Pos 1U /*!< ERRBNK DEBR0: LOCKED Position */ -#define ERRBNK_DEBR0_LOCKED_Msk (0x1UL << ERRBNK_DEBR0_LOCKED_Pos) /*!< ERRBNK DEBR0: LOCKED Mask */ - -#define ERRBNK_DEBR0_VALID_Pos 0U /*!< ERRBNK DEBR0: VALID Position */ -#define ERRBNK_DEBR0_VALID_Msk (0x1UL << /*ERRBNK_DEBR0_VALID_Pos*/) /*!< ERRBNK DEBR0: VALID Mask */ - -/* ERRBNK Data Cache Error Bank Register 1 (DEBR1) Register Definitions */ -#define ERRBNK_DEBR1_SWDEF_Pos 30U /*!< ERRBNK DEBR1: SWDEF Position */ -#define ERRBNK_DEBR1_SWDEF_Msk (0x3UL << ERRBNK_DEBR1_SWDEF_Pos) /*!< ERRBNK DEBR1: SWDEF Mask */ - -#define ERRBNK_DEBR1_TYPE_Pos 17U /*!< ERRBNK DEBR1: TYPE Position */ -#define ERRBNK_DEBR1_TYPE_Msk (0x1UL << ERRBNK_DEBR1_TYPE_Pos) /*!< ERRBNK DEBR1: TYPE Mask */ - -#define ERRBNK_DEBR1_BANK_Pos 16U /*!< ERRBNK DEBR1: BANK Position */ -#define ERRBNK_DEBR1_BANK_Msk (0x1UL << ERRBNK_DEBR1_BANK_Pos) /*!< ERRBNK DEBR1: BANK Mask */ - -#define ERRBNK_DEBR1_LOCATION_Pos 2U /*!< ERRBNK DEBR1: LOCATION Position */ -#define ERRBNK_DEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR1_LOCATION_Pos) /*!< ERRBNK DEBR1: LOCATION Mask */ - -#define ERRBNK_DEBR1_LOCKED_Pos 1U /*!< ERRBNK DEBR1: LOCKED Position */ -#define ERRBNK_DEBR1_LOCKED_Msk (0x1UL << ERRBNK_DEBR1_LOCKED_Pos) /*!< ERRBNK DEBR1: LOCKED Mask */ - -#define ERRBNK_DEBR1_VALID_Pos 0U /*!< ERRBNK DEBR1: VALID Position */ -#define ERRBNK_DEBR1_VALID_Msk (0x1UL << /*ERRBNK_DEBR1_VALID_Pos*/) /*!< ERRBNK DEBR1: VALID Mask */ - -/* ERRBNK TCM Error Bank Register 0 (TEBR0) Register Definitions */ -#define ERRBNK_TEBR0_SWDEF_Pos 30U /*!< ERRBNK TEBR0: SWDEF Position */ -#define ERRBNK_TEBR0_SWDEF_Msk (0x3UL << ERRBNK_TEBR0_SWDEF_Pos) /*!< ERRBNK TEBR0: SWDEF Mask */ - -#define ERRBNK_TEBR0_POISON_Pos 28U /*!< ERRBNK TEBR0: POISON Position */ -#define ERRBNK_TEBR0_POISON_Msk (0x1UL << ERRBNK_TEBR0_POISON_Pos) /*!< ERRBNK TEBR0: POISON Mask */ - -#define ERRBNK_TEBR0_TYPE_Pos 27U /*!< ERRBNK TEBR0: TYPE Position */ -#define ERRBNK_TEBR0_TYPE_Msk (0x1UL << ERRBNK_TEBR0_TYPE_Pos) /*!< ERRBNK TEBR0: TYPE Mask */ - -#define ERRBNK_TEBR0_BANK_Pos 24U /*!< ERRBNK TEBR0: BANK Position */ -#define ERRBNK_TEBR0_BANK_Msk (0x3UL << ERRBNK_TEBR0_BANK_Pos) /*!< ERRBNK TEBR0: BANK Mask */ - -#define ERRBNK_TEBR0_LOCATION_Pos 2U /*!< ERRBNK TEBR0: LOCATION Position */ -#define ERRBNK_TEBR0_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR0_LOCATION_Pos) /*!< ERRBNK TEBR0: LOCATION Mask */ - -#define ERRBNK_TEBR0_LOCKED_Pos 1U /*!< ERRBNK TEBR0: LOCKED Position */ -#define ERRBNK_TEBR0_LOCKED_Msk (0x1UL << ERRBNK_TEBR0_LOCKED_Pos) /*!< ERRBNK TEBR0: LOCKED Mask */ - -#define ERRBNK_TEBR0_VALID_Pos 0U /*!< ERRBNK TEBR0: VALID Position */ -#define ERRBNK_TEBR0_VALID_Msk (0x1UL << /*ERRBNK_TEBR0_VALID_Pos*/) /*!< ERRBNK TEBR0: VALID Mask */ - -/* ERRBNK TCM Error Bank Register 1 (TEBR1) Register Definitions */ -#define ERRBNK_TEBR1_SWDEF_Pos 30U /*!< ERRBNK TEBR1: SWDEF Position */ -#define ERRBNK_TEBR1_SWDEF_Msk (0x3UL << ERRBNK_TEBR1_SWDEF_Pos) /*!< ERRBNK TEBR1: SWDEF Mask */ - -#define ERRBNK_TEBR1_POISON_Pos 28U /*!< ERRBNK TEBR1: POISON Position */ -#define ERRBNK_TEBR1_POISON_Msk (0x1UL << ERRBNK_TEBR1_POISON_Pos) /*!< ERRBNK TEBR1: POISON Mask */ - -#define ERRBNK_TEBR1_TYPE_Pos 27U /*!< ERRBNK TEBR1: TYPE Position */ -#define ERRBNK_TEBR1_TYPE_Msk (0x1UL << ERRBNK_TEBR1_TYPE_Pos) /*!< ERRBNK TEBR1: TYPE Mask */ - -#define ERRBNK_TEBR1_BANK_Pos 24U /*!< ERRBNK TEBR1: BANK Position */ -#define ERRBNK_TEBR1_BANK_Msk (0x3UL << ERRBNK_TEBR1_BANK_Pos) /*!< ERRBNK TEBR1: BANK Mask */ - -#define ERRBNK_TEBR1_LOCATION_Pos 2U /*!< ERRBNK TEBR1: LOCATION Position */ -#define ERRBNK_TEBR1_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR1_LOCATION_Pos) /*!< ERRBNK TEBR1: LOCATION Mask */ - -#define ERRBNK_TEBR1_LOCKED_Pos 1U /*!< ERRBNK TEBR1: LOCKED Position */ -#define ERRBNK_TEBR1_LOCKED_Msk (0x1UL << ERRBNK_TEBR1_LOCKED_Pos) /*!< ERRBNK TEBR1: LOCKED Mask */ - -#define ERRBNK_TEBR1_VALID_Pos 0U /*!< ERRBNK TEBR1: VALID Position */ -#define ERRBNK_TEBR1_VALID_Msk (0x1UL << /*ERRBNK_TEBR1_VALID_Pos*/) /*!< ERRBNK TEBR1: VALID Mask */ - -/*@}*/ /* end of group ErrBnk_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup PrcCfgInf_Type Processor Configuration Information Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Processor Configuration Information Registerss (PRCCFGINF) - @{ - */ - -/** - \brief Structure type to access the Processor Configuration Information Registerss (PRCCFGINF). - */ -typedef struct -{ - __OM uint32_t CFGINFOSEL; /*!< Offset: 0x000 ( /W) Processor Configuration Information Selection Register */ - __IM uint32_t CFGINFORD; /*!< Offset: 0x004 (R/ ) Processor Configuration Information Read Data Register */ -} PrcCfgInf_Type; - -/* PRCCFGINF Processor Configuration Information Selection Register (CFGINFOSEL) Definitions */ - -/* PRCCFGINF Processor Configuration Information Read Data Register (CFGINFORD) Definitions */ - -/*@}*/ /* end of group PrcCfgInf_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup STL_Type Software Test Library Observation Registers - \brief Type definitions for the Software Test Library Observation Registerss (STL) - @{ - */ - -/** - \brief Structure type to access the Software Test Library Observation Registerss (STL). - */ -typedef struct -{ - __IM uint32_t STLNVICPENDOR; /*!< Offset: 0x000 (R/ ) NVIC Pending Priority Tree Register */ - __IM uint32_t STLNVICACTVOR; /*!< Offset: 0x004 (R/ ) NVIC Active Priority Tree Register */ - uint32_t RESERVED0[2U]; - __OM uint32_t STLIDMPUSR; /*!< Offset: 0x010 ( /W) MPU Sanple Register */ - __IM uint32_t STLIMPUOR; /*!< Offset: 0x014 (R/ ) MPU Region Hit Register */ - __IM uint32_t STLD0MPUOR; /*!< Offset: 0x018 (R/ ) MPU Memory Attributes Register 0 */ - __IM uint32_t STLD1MPUOR; /*!< Offset: 0x01C (R/ ) MPU Memory Attributes Register 1 */ - -} STL_Type; - -/* STL Software Test Library Observation Register (STLNVICPENDOR) Definitions */ -#define STL_STLNVICPENDOR_VALID_Pos 18U /*!< STL STLNVICPENDOR: VALID Position */ -#define STL_STLNVICPENDOR_VALID_Msk (0x1UL << STL_STLNVICPENDOR_VALID_Pos) /*!< STL STLNVICPENDOR: VALID Mask */ - -#define STL_STLNVICPENDOR_TARGET_Pos 17U /*!< STL STLNVICPENDOR: TARGET Position */ -#define STL_STLNVICPENDOR_TARGET_Msk (0x1UL << STL_STLNVICPENDOR_TARGET_Pos) /*!< STL STLNVICPENDOR: TARGET Mask */ - -#define STL_STLNVICPENDOR_PRIORITY_Pos 9U /*!< STL STLNVICPENDOR: PRIORITY Position */ -#define STL_STLNVICPENDOR_PRIORITY_Msk (0xFFUL << STL_STLNVICPENDOR_PRIORITY_Pos) /*!< STL STLNVICPENDOR: PRIORITY Mask */ - -#define STL_STLNVICPENDOR_INTNUM_Pos 0U /*!< STL STLNVICPENDOR: INTNUM Position */ -#define STL_STLNVICPENDOR_INTNUM_Msk (0x1FFUL /*<< STL_STLNVICPENDOR_INTNUM_Pos*/) /*!< STL STLNVICPENDOR: INTNUM Mask */ - -/* STL Software Test Library Observation Register (STLNVICACTVOR) Definitions */ -#define STL_STLNVICACTVOR_VALID_Pos 18U /*!< STL STLNVICACTVOR: VALID Position */ -#define STL_STLNVICACTVOR_VALID_Msk (0x1UL << STL_STLNVICACTVOR_VALID_Pos) /*!< STL STLNVICACTVOR: VALID Mask */ - -#define STL_STLNVICACTVOR_TARGET_Pos 17U /*!< STL STLNVICACTVOR: TARGET Position */ -#define STL_STLNVICACTVOR_TARGET_Msk (0x1UL << STL_STLNVICACTVOR_TARGET_Pos) /*!< STL STLNVICACTVOR: TARGET Mask */ - -#define STL_STLNVICACTVOR_PRIORITY_Pos 9U /*!< STL STLNVICACTVOR: PRIORITY Position */ -#define STL_STLNVICACTVOR_PRIORITY_Msk (0xFFUL << STL_STLNVICACTVOR_PRIORITY_Pos) /*!< STL STLNVICACTVOR: PRIORITY Mask */ - -#define STL_STLNVICACTVOR_INTNUM_Pos 0U /*!< STL STLNVICACTVOR: INTNUM Position */ -#define STL_STLNVICACTVOR_INTNUM_Msk (0x1FFUL /*<< STL_STLNVICACTVOR_INTNUM_Pos*/) /*!< STL STLNVICACTVOR: INTNUM Mask */ - -/* STL Software Test Library Observation Register (STLIDMPUSR) Definitions */ -#define STL_STLIDMPUSR_ADDR_Pos 5U /*!< STL STLIDMPUSR: ADDR Position */ -#define STL_STLIDMPUSR_ADDR_Msk (0x7FFFFFFUL << STL_STLIDMPUSR_ADDR_Pos) /*!< STL STLIDMPUSR: ADDR Mask */ - -#define STL_STLIDMPUSR_INSTR_Pos 2U /*!< STL STLIDMPUSR: INSTR Position */ -#define STL_STLIDMPUSR_INSTR_Msk (0x1UL << STL_STLIDMPUSR_INSTR_Pos) /*!< STL STLIDMPUSR: INSTR Mask */ - -#define STL_STLIDMPUSR_DATA_Pos 1U /*!< STL STLIDMPUSR: DATA Position */ -#define STL_STLIDMPUSR_DATA_Msk (0x1UL << STL_STLIDMPUSR_DATA_Pos) /*!< STL STLIDMPUSR: DATA Mask */ - -/* STL Software Test Library Observation Register (STLIMPUOR) Definitions */ -#define STL_STLIMPUOR_HITREGION_Pos 9U /*!< STL STLIMPUOR: HITREGION Position */ -#define STL_STLIMPUOR_HITREGION_Msk (0xFFUL << STL_STLIMPUOR_HITREGION_Pos) /*!< STL STLIMPUOR: HITREGION Mask */ - -#define STL_STLIMPUOR_ATTR_Pos 0U /*!< STL STLIMPUOR: ATTR Position */ -#define STL_STLIMPUOR_ATTR_Msk (0x1FFUL /*<< STL_STLIMPUOR_ATTR_Pos*/) /*!< STL STLIMPUOR: ATTR Mask */ - -/* STL Software Test Library Observation Register (STLD0MPUOR) Definitions */ -#define STL_STLD0MPUOR_HITREGION_Pos 9U /*!< STL STLD0MPUOR: HITREGION Position */ -#define STL_STLD0MPUOR_HITREGION_Msk (0xFFUL << STL_STLD0MPUOR_HITREGION_Pos) /*!< STL STLD0MPUOR: HITREGION Mask */ - -#define STL_STLD0MPUOR_ATTR_Pos 0U /*!< STL STLD0MPUOR: ATTR Position */ -#define STL_STLD0MPUOR_ATTR_Msk (0x1FFUL /*<< STL_STLD0MPUOR_ATTR_Pos*/) /*!< STL STLD0MPUOR: ATTR Mask */ - -/* STL Software Test Library Observation Register (STLD1MPUOR) Definitions */ -#define STL_STLD1MPUOR_HITREGION_Pos 9U /*!< STL STLD1MPUOR: HITREGION Position */ -#define STL_STLD1MPUOR_HITREGION_Msk (0xFFUL << STL_STLD1MPUOR_HITREGION_Pos) /*!< STL STLD1MPUOR: HITREGION Mask */ - -#define STL_STLD1MPUOR_ATTR_Pos 0U /*!< STL STLD1MPUOR: ATTR Position */ -#define STL_STLD1MPUOR_ATTR_Msk (0x1FFUL /*<< STL_STLD1MPUOR_ATTR_Pos*/) /*!< STL STLD1MPUOR: ATTR Mask */ - -/*@}*/ /* end of group STL_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[809U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ - uint32_t RESERVED4[4U]; - __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ -#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFmt_Pos 0U /*!< TPI FFCR: EnFmt Position */ -#define TPI_FFCR_EnFmt_Msk (0x3UL << /*TPI_FFCR_EnFmt_Pos*/) /*!< TPI FFCR: EnFmt Mask */ - -/* TPI Periodic Synchronization Control Register Definitions */ -#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ -#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ - -/* TPI Software Lock Status Register Definitions */ -#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ -#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ - -#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ -#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ - -#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ -#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_PMU Performance Monitoring Unit (PMU) - \brief Type definitions for the Performance Monitoring Unit (PMU) - @{ - */ - -/** - \brief Structure type to access the Performance Monitoring Unit (PMU). - */ -typedef struct -{ - __IOM uint32_t EVCNTR[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x0 (R/W) PMU Event Counter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED0[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCNTR; /*!< Offset: 0x7C (R/W) PMU Cycle Counter Register */ - uint32_t RESERVED1[224]; - __IOM uint32_t EVTYPER[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x400 (R/W) PMU Event Type and Filter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED2[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCFILTR; /*!< Offset: 0x47C (R/W) PMU Cycle Counter Filter Register */ - uint32_t RESERVED3[480]; - __IOM uint32_t CNTENSET; /*!< Offset: 0xC00 (R/W) PMU Count Enable Set Register */ - uint32_t RESERVED4[7]; - __IOM uint32_t CNTENCLR; /*!< Offset: 0xC20 (R/W) PMU Count Enable Clear Register */ - uint32_t RESERVED5[7]; - __IOM uint32_t INTENSET; /*!< Offset: 0xC40 (R/W) PMU Interrupt Enable Set Register */ - uint32_t RESERVED6[7]; - __IOM uint32_t INTENCLR; /*!< Offset: 0xC60 (R/W) PMU Interrupt Enable Clear Register */ - uint32_t RESERVED7[7]; - __IOM uint32_t OVSCLR; /*!< Offset: 0xC80 (R/W) PMU Overflow Flag Status Clear Register */ - uint32_t RESERVED8[7]; - __IOM uint32_t SWINC; /*!< Offset: 0xCA0 (R/W) PMU Software Increment Register */ - uint32_t RESERVED9[7]; - __IOM uint32_t OVSSET; /*!< Offset: 0xCC0 (R/W) PMU Overflow Flag Status Set Register */ - uint32_t RESERVED10[79]; - __IOM uint32_t TYPE; /*!< Offset: 0xE00 (R/W) PMU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0xE04 (R/W) PMU Control Register */ - uint32_t RESERVED11[108]; - __IOM uint32_t AUTHSTATUS; /*!< Offset: 0xFB8 (R/W) PMU Authentication Status Register */ - __IOM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/W) PMU Device Architecture Register */ - uint32_t RESERVED12[3]; - __IOM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/W) PMU Device Type Register */ - __IOM uint32_t PIDR4; /*!< Offset: 0xFD0 (R/W) PMU Peripheral Identification Register 4 */ - uint32_t RESERVED13[3]; - __IOM uint32_t PIDR0; /*!< Offset: 0xFE0 (R/W) PMU Peripheral Identification Register 0 */ - __IOM uint32_t PIDR1; /*!< Offset: 0xFE4 (R/W) PMU Peripheral Identification Register 1 */ - __IOM uint32_t PIDR2; /*!< Offset: 0xFE8 (R/W) PMU Peripheral Identification Register 2 */ - __IOM uint32_t PIDR3; /*!< Offset: 0xFEC (R/W) PMU Peripheral Identification Register 3 */ - __IOM uint32_t CIDR0; /*!< Offset: 0xFF0 (R/W) PMU Component Identification Register 0 */ - __IOM uint32_t CIDR1; /*!< Offset: 0xFF4 (R/W) PMU Component Identification Register 1 */ - __IOM uint32_t CIDR2; /*!< Offset: 0xFF8 (R/W) PMU Component Identification Register 2 */ - __IOM uint32_t CIDR3; /*!< Offset: 0xFFC (R/W) PMU Component Identification Register 3 */ -} PMU_Type; - -/** \brief PMU Event Counter Registers (0-30) Definitions */ - -#define PMU_EVCNTR_CNT_Pos 0U /*!< PMU EVCNTR: Counter Position */ -#define PMU_EVCNTR_CNT_Msk (0xFFFFUL /*<< PMU_EVCNTRx_CNT_Pos*/) /*!< PMU EVCNTR: Counter Mask */ - -/** \brief PMU Event Type and Filter Registers (0-30) Definitions */ - -#define PMU_EVTYPER_EVENTTOCNT_Pos 0U /*!< PMU EVTYPER: Event to Count Position */ -#define PMU_EVTYPER_EVENTTOCNT_Msk (0xFFFFUL /*<< EVTYPERx_EVENTTOCNT_Pos*/) /*!< PMU EVTYPER: Event to Count Mask */ - -/** \brief PMU Count Enable Set Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENSET: Event Counter 0 Enable Set Position */ -#define PMU_CNTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENSET_CNT0_ENABLE_Pos*/) /*!< PMU CNTENSET: Event Counter 0 Enable Set Mask */ - -#define PMU_CNTENSET_CNT1_ENABLE_Pos 1U /*!< PMU CNTENSET: Event Counter 1 Enable Set Position */ -#define PMU_CNTENSET_CNT1_ENABLE_Msk (1UL << PMU_CNTENSET_CNT1_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 1 Enable Set Mask */ - -#define PMU_CNTENSET_CNT2_ENABLE_Pos 2U /*!< PMU CNTENSET: Event Counter 2 Enable Set Position */ -#define PMU_CNTENSET_CNT2_ENABLE_Msk (1UL << PMU_CNTENSET_CNT2_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 2 Enable Set Mask */ - -#define PMU_CNTENSET_CNT3_ENABLE_Pos 3U /*!< PMU CNTENSET: Event Counter 3 Enable Set Position */ -#define PMU_CNTENSET_CNT3_ENABLE_Msk (1UL << PMU_CNTENSET_CNT3_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 3 Enable Set Mask */ - -#define PMU_CNTENSET_CNT4_ENABLE_Pos 4U /*!< PMU CNTENSET: Event Counter 4 Enable Set Position */ -#define PMU_CNTENSET_CNT4_ENABLE_Msk (1UL << PMU_CNTENSET_CNT4_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 4 Enable Set Mask */ - -#define PMU_CNTENSET_CNT5_ENABLE_Pos 5U /*!< PMU CNTENSET: Event Counter 5 Enable Set Position */ -#define PMU_CNTENSET_CNT5_ENABLE_Msk (1UL << PMU_CNTENSET_CNT5_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 5 Enable Set Mask */ - -#define PMU_CNTENSET_CNT6_ENABLE_Pos 6U /*!< PMU CNTENSET: Event Counter 6 Enable Set Position */ -#define PMU_CNTENSET_CNT6_ENABLE_Msk (1UL << PMU_CNTENSET_CNT6_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 6 Enable Set Mask */ - -#define PMU_CNTENSET_CNT7_ENABLE_Pos 7U /*!< PMU CNTENSET: Event Counter 7 Enable Set Position */ -#define PMU_CNTENSET_CNT7_ENABLE_Msk (1UL << PMU_CNTENSET_CNT7_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 7 Enable Set Mask */ - -#define PMU_CNTENSET_CNT8_ENABLE_Pos 8U /*!< PMU CNTENSET: Event Counter 8 Enable Set Position */ -#define PMU_CNTENSET_CNT8_ENABLE_Msk (1UL << PMU_CNTENSET_CNT8_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 8 Enable Set Mask */ - -#define PMU_CNTENSET_CNT9_ENABLE_Pos 9U /*!< PMU CNTENSET: Event Counter 9 Enable Set Position */ -#define PMU_CNTENSET_CNT9_ENABLE_Msk (1UL << PMU_CNTENSET_CNT9_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 9 Enable Set Mask */ - -#define PMU_CNTENSET_CNT10_ENABLE_Pos 10U /*!< PMU CNTENSET: Event Counter 10 Enable Set Position */ -#define PMU_CNTENSET_CNT10_ENABLE_Msk (1UL << PMU_CNTENSET_CNT10_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 10 Enable Set Mask */ - -#define PMU_CNTENSET_CNT11_ENABLE_Pos 11U /*!< PMU CNTENSET: Event Counter 11 Enable Set Position */ -#define PMU_CNTENSET_CNT11_ENABLE_Msk (1UL << PMU_CNTENSET_CNT11_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 11 Enable Set Mask */ - -#define PMU_CNTENSET_CNT12_ENABLE_Pos 12U /*!< PMU CNTENSET: Event Counter 12 Enable Set Position */ -#define PMU_CNTENSET_CNT12_ENABLE_Msk (1UL << PMU_CNTENSET_CNT12_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 12 Enable Set Mask */ - -#define PMU_CNTENSET_CNT13_ENABLE_Pos 13U /*!< PMU CNTENSET: Event Counter 13 Enable Set Position */ -#define PMU_CNTENSET_CNT13_ENABLE_Msk (1UL << PMU_CNTENSET_CNT13_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 13 Enable Set Mask */ - -#define PMU_CNTENSET_CNT14_ENABLE_Pos 14U /*!< PMU CNTENSET: Event Counter 14 Enable Set Position */ -#define PMU_CNTENSET_CNT14_ENABLE_Msk (1UL << PMU_CNTENSET_CNT14_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 14 Enable Set Mask */ - -#define PMU_CNTENSET_CNT15_ENABLE_Pos 15U /*!< PMU CNTENSET: Event Counter 15 Enable Set Position */ -#define PMU_CNTENSET_CNT15_ENABLE_Msk (1UL << PMU_CNTENSET_CNT15_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 15 Enable Set Mask */ - -#define PMU_CNTENSET_CNT16_ENABLE_Pos 16U /*!< PMU CNTENSET: Event Counter 16 Enable Set Position */ -#define PMU_CNTENSET_CNT16_ENABLE_Msk (1UL << PMU_CNTENSET_CNT16_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 16 Enable Set Mask */ - -#define PMU_CNTENSET_CNT17_ENABLE_Pos 17U /*!< PMU CNTENSET: Event Counter 17 Enable Set Position */ -#define PMU_CNTENSET_CNT17_ENABLE_Msk (1UL << PMU_CNTENSET_CNT17_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 17 Enable Set Mask */ - -#define PMU_CNTENSET_CNT18_ENABLE_Pos 18U /*!< PMU CNTENSET: Event Counter 18 Enable Set Position */ -#define PMU_CNTENSET_CNT18_ENABLE_Msk (1UL << PMU_CNTENSET_CNT18_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 18 Enable Set Mask */ - -#define PMU_CNTENSET_CNT19_ENABLE_Pos 19U /*!< PMU CNTENSET: Event Counter 19 Enable Set Position */ -#define PMU_CNTENSET_CNT19_ENABLE_Msk (1UL << PMU_CNTENSET_CNT19_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 19 Enable Set Mask */ - -#define PMU_CNTENSET_CNT20_ENABLE_Pos 20U /*!< PMU CNTENSET: Event Counter 20 Enable Set Position */ -#define PMU_CNTENSET_CNT20_ENABLE_Msk (1UL << PMU_CNTENSET_CNT20_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 20 Enable Set Mask */ - -#define PMU_CNTENSET_CNT21_ENABLE_Pos 21U /*!< PMU CNTENSET: Event Counter 21 Enable Set Position */ -#define PMU_CNTENSET_CNT21_ENABLE_Msk (1UL << PMU_CNTENSET_CNT21_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 21 Enable Set Mask */ - -#define PMU_CNTENSET_CNT22_ENABLE_Pos 22U /*!< PMU CNTENSET: Event Counter 22 Enable Set Position */ -#define PMU_CNTENSET_CNT22_ENABLE_Msk (1UL << PMU_CNTENSET_CNT22_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 22 Enable Set Mask */ - -#define PMU_CNTENSET_CNT23_ENABLE_Pos 23U /*!< PMU CNTENSET: Event Counter 23 Enable Set Position */ -#define PMU_CNTENSET_CNT23_ENABLE_Msk (1UL << PMU_CNTENSET_CNT23_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 23 Enable Set Mask */ - -#define PMU_CNTENSET_CNT24_ENABLE_Pos 24U /*!< PMU CNTENSET: Event Counter 24 Enable Set Position */ -#define PMU_CNTENSET_CNT24_ENABLE_Msk (1UL << PMU_CNTENSET_CNT24_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 24 Enable Set Mask */ - -#define PMU_CNTENSET_CNT25_ENABLE_Pos 25U /*!< PMU CNTENSET: Event Counter 25 Enable Set Position */ -#define PMU_CNTENSET_CNT25_ENABLE_Msk (1UL << PMU_CNTENSET_CNT25_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 25 Enable Set Mask */ - -#define PMU_CNTENSET_CNT26_ENABLE_Pos 26U /*!< PMU CNTENSET: Event Counter 26 Enable Set Position */ -#define PMU_CNTENSET_CNT26_ENABLE_Msk (1UL << PMU_CNTENSET_CNT26_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 26 Enable Set Mask */ - -#define PMU_CNTENSET_CNT27_ENABLE_Pos 27U /*!< PMU CNTENSET: Event Counter 27 Enable Set Position */ -#define PMU_CNTENSET_CNT27_ENABLE_Msk (1UL << PMU_CNTENSET_CNT27_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 27 Enable Set Mask */ - -#define PMU_CNTENSET_CNT28_ENABLE_Pos 28U /*!< PMU CNTENSET: Event Counter 28 Enable Set Position */ -#define PMU_CNTENSET_CNT28_ENABLE_Msk (1UL << PMU_CNTENSET_CNT28_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 28 Enable Set Mask */ - -#define PMU_CNTENSET_CNT29_ENABLE_Pos 29U /*!< PMU CNTENSET: Event Counter 29 Enable Set Position */ -#define PMU_CNTENSET_CNT29_ENABLE_Msk (1UL << PMU_CNTENSET_CNT29_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 29 Enable Set Mask */ - -#define PMU_CNTENSET_CNT30_ENABLE_Pos 30U /*!< PMU CNTENSET: Event Counter 30 Enable Set Position */ -#define PMU_CNTENSET_CNT30_ENABLE_Msk (1UL << PMU_CNTENSET_CNT30_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 30 Enable Set Mask */ - -#define PMU_CNTENSET_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENSET: Cycle Counter Enable Set Position */ -#define PMU_CNTENSET_CCNTR_ENABLE_Msk (1UL << PMU_CNTENSET_CCNTR_ENABLE_Pos) /*!< PMU CNTENSET: Cycle Counter Enable Set Mask */ - -/** \brief PMU Count Enable Clear Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Position */ -#define PMU_CNTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU CNTENCLR: Event Counter 1 Enable Clear Position */ -#define PMU_CNTENCLR_CNT1_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT1_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 1 Enable Clear */ - -#define PMU_CNTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Position */ -#define PMU_CNTENCLR_CNT2_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT2_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Position */ -#define PMU_CNTENCLR_CNT3_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT3_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Position */ -#define PMU_CNTENCLR_CNT4_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT4_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Position */ -#define PMU_CNTENCLR_CNT5_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT5_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Position */ -#define PMU_CNTENCLR_CNT6_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT6_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Position */ -#define PMU_CNTENCLR_CNT7_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT7_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Position */ -#define PMU_CNTENCLR_CNT8_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT8_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Position */ -#define PMU_CNTENCLR_CNT9_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT9_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Position */ -#define PMU_CNTENCLR_CNT10_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT10_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Position */ -#define PMU_CNTENCLR_CNT11_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT11_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Position */ -#define PMU_CNTENCLR_CNT12_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT12_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Position */ -#define PMU_CNTENCLR_CNT13_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT13_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Position */ -#define PMU_CNTENCLR_CNT14_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT14_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Position */ -#define PMU_CNTENCLR_CNT15_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT15_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Position */ -#define PMU_CNTENCLR_CNT16_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT16_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Position */ -#define PMU_CNTENCLR_CNT17_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT17_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Position */ -#define PMU_CNTENCLR_CNT18_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT18_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Position */ -#define PMU_CNTENCLR_CNT19_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT19_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Position */ -#define PMU_CNTENCLR_CNT20_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT20_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Position */ -#define PMU_CNTENCLR_CNT21_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT21_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Position */ -#define PMU_CNTENCLR_CNT22_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT22_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Position */ -#define PMU_CNTENCLR_CNT23_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT23_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Position */ -#define PMU_CNTENCLR_CNT24_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT24_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Position */ -#define PMU_CNTENCLR_CNT25_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT25_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Position */ -#define PMU_CNTENCLR_CNT26_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT26_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Position */ -#define PMU_CNTENCLR_CNT27_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT27_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Position */ -#define PMU_CNTENCLR_CNT28_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT28_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Position */ -#define PMU_CNTENCLR_CNT29_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT29_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Position */ -#define PMU_CNTENCLR_CNT30_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT30_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Mask */ - -#define PMU_CNTENCLR_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENCLR: Cycle Counter Enable Clear Position */ -#define PMU_CNTENCLR_CCNTR_ENABLE_Msk (1UL << PMU_CNTENCLR_CCNTR_ENABLE_Pos) /*!< PMU CNTENCLR: Cycle Counter Enable Clear Mask */ - -/** \brief PMU Interrupt Enable Set Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENSET_CNT0_ENABLE_Pos*/) /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT1_ENABLE_Pos 1U /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT1_ENABLE_Msk (1UL << PMU_INTENSET_CNT1_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT2_ENABLE_Pos 2U /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT2_ENABLE_Msk (1UL << PMU_INTENSET_CNT2_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT3_ENABLE_Pos 3U /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT3_ENABLE_Msk (1UL << PMU_INTENSET_CNT3_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT4_ENABLE_Pos 4U /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT4_ENABLE_Msk (1UL << PMU_INTENSET_CNT4_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT5_ENABLE_Pos 5U /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT5_ENABLE_Msk (1UL << PMU_INTENSET_CNT5_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT6_ENABLE_Pos 6U /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT6_ENABLE_Msk (1UL << PMU_INTENSET_CNT6_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT7_ENABLE_Pos 7U /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT7_ENABLE_Msk (1UL << PMU_INTENSET_CNT7_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT8_ENABLE_Pos 8U /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT8_ENABLE_Msk (1UL << PMU_INTENSET_CNT8_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT9_ENABLE_Pos 9U /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT9_ENABLE_Msk (1UL << PMU_INTENSET_CNT9_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT10_ENABLE_Pos 10U /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT10_ENABLE_Msk (1UL << PMU_INTENSET_CNT10_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT11_ENABLE_Pos 11U /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT11_ENABLE_Msk (1UL << PMU_INTENSET_CNT11_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT12_ENABLE_Pos 12U /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT12_ENABLE_Msk (1UL << PMU_INTENSET_CNT12_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT13_ENABLE_Pos 13U /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT13_ENABLE_Msk (1UL << PMU_INTENSET_CNT13_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT14_ENABLE_Pos 14U /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT14_ENABLE_Msk (1UL << PMU_INTENSET_CNT14_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT15_ENABLE_Pos 15U /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT15_ENABLE_Msk (1UL << PMU_INTENSET_CNT15_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT16_ENABLE_Pos 16U /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT16_ENABLE_Msk (1UL << PMU_INTENSET_CNT16_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT17_ENABLE_Pos 17U /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT17_ENABLE_Msk (1UL << PMU_INTENSET_CNT17_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT18_ENABLE_Pos 18U /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT18_ENABLE_Msk (1UL << PMU_INTENSET_CNT18_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT19_ENABLE_Pos 19U /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT19_ENABLE_Msk (1UL << PMU_INTENSET_CNT19_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT20_ENABLE_Pos 20U /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT20_ENABLE_Msk (1UL << PMU_INTENSET_CNT20_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT21_ENABLE_Pos 21U /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT21_ENABLE_Msk (1UL << PMU_INTENSET_CNT21_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT22_ENABLE_Pos 22U /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT22_ENABLE_Msk (1UL << PMU_INTENSET_CNT22_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT23_ENABLE_Pos 23U /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT23_ENABLE_Msk (1UL << PMU_INTENSET_CNT23_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT24_ENABLE_Pos 24U /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT24_ENABLE_Msk (1UL << PMU_INTENSET_CNT24_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT25_ENABLE_Pos 25U /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT25_ENABLE_Msk (1UL << PMU_INTENSET_CNT25_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT26_ENABLE_Pos 26U /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT26_ENABLE_Msk (1UL << PMU_INTENSET_CNT26_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT27_ENABLE_Pos 27U /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT27_ENABLE_Msk (1UL << PMU_INTENSET_CNT27_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT28_ENABLE_Pos 28U /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT28_ENABLE_Msk (1UL << PMU_INTENSET_CNT28_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT29_ENABLE_Pos 29U /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT29_ENABLE_Msk (1UL << PMU_INTENSET_CNT29_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT30_ENABLE_Pos 30U /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT30_ENABLE_Msk (1UL << PMU_INTENSET_CNT30_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Position */ -#define PMU_INTENSET_CCYCNT_ENABLE_Msk (1UL << PMU_INTENSET_CYCCNT_ENABLE_Pos) /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Mask */ - -/** \brief PMU Interrupt Enable Clear Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT1_ENABLE_Msk (1UL << PMU_INTENCLR_CNT1_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear */ - -#define PMU_INTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT2_ENABLE_Msk (1UL << PMU_INTENCLR_CNT2_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT3_ENABLE_Msk (1UL << PMU_INTENCLR_CNT3_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT4_ENABLE_Msk (1UL << PMU_INTENCLR_CNT4_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT5_ENABLE_Msk (1UL << PMU_INTENCLR_CNT5_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT6_ENABLE_Msk (1UL << PMU_INTENCLR_CNT6_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT7_ENABLE_Msk (1UL << PMU_INTENCLR_CNT7_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT8_ENABLE_Msk (1UL << PMU_INTENCLR_CNT8_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT9_ENABLE_Msk (1UL << PMU_INTENCLR_CNT9_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT10_ENABLE_Msk (1UL << PMU_INTENCLR_CNT10_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT11_ENABLE_Msk (1UL << PMU_INTENCLR_CNT11_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT12_ENABLE_Msk (1UL << PMU_INTENCLR_CNT12_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT13_ENABLE_Msk (1UL << PMU_INTENCLR_CNT13_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT14_ENABLE_Msk (1UL << PMU_INTENCLR_CNT14_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT15_ENABLE_Msk (1UL << PMU_INTENCLR_CNT15_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT16_ENABLE_Msk (1UL << PMU_INTENCLR_CNT16_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT17_ENABLE_Msk (1UL << PMU_INTENCLR_CNT17_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT18_ENABLE_Msk (1UL << PMU_INTENCLR_CNT18_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT19_ENABLE_Msk (1UL << PMU_INTENCLR_CNT19_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT20_ENABLE_Msk (1UL << PMU_INTENCLR_CNT20_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT21_ENABLE_Msk (1UL << PMU_INTENCLR_CNT21_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT22_ENABLE_Msk (1UL << PMU_INTENCLR_CNT22_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT23_ENABLE_Msk (1UL << PMU_INTENCLR_CNT23_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT24_ENABLE_Msk (1UL << PMU_INTENCLR_CNT24_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT25_ENABLE_Msk (1UL << PMU_INTENCLR_CNT25_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT26_ENABLE_Msk (1UL << PMU_INTENCLR_CNT26_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT27_ENABLE_Msk (1UL << PMU_INTENCLR_CNT27_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT28_ENABLE_Msk (1UL << PMU_INTENCLR_CNT28_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT29_ENABLE_Msk (1UL << PMU_INTENCLR_CNT29_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT30_ENABLE_Msk (1UL << PMU_INTENCLR_CNT30_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CYCCNT_ENABLE_Msk (1UL << PMU_INTENCLR_CYCCNT_ENABLE_Pos) /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Mask */ - -/** \brief PMU Overflow Flag Status Set Register Definitions */ - -#define PMU_OVSSET_CNT0_STATUS_Pos 0U /*!< PMU OVSSET: Event Counter 0 Overflow Set Position */ -#define PMU_OVSSET_CNT0_STATUS_Msk (1UL /*<< PMU_OVSSET_CNT0_STATUS_Pos*/) /*!< PMU OVSSET: Event Counter 0 Overflow Set Mask */ - -#define PMU_OVSSET_CNT1_STATUS_Pos 1U /*!< PMU OVSSET: Event Counter 1 Overflow Set Position */ -#define PMU_OVSSET_CNT1_STATUS_Msk (1UL << PMU_OVSSET_CNT1_STATUS_Pos) /*!< PMU OVSSET: Event Counter 1 Overflow Set Mask */ - -#define PMU_OVSSET_CNT2_STATUS_Pos 2U /*!< PMU OVSSET: Event Counter 2 Overflow Set Position */ -#define PMU_OVSSET_CNT2_STATUS_Msk (1UL << PMU_OVSSET_CNT2_STATUS_Pos) /*!< PMU OVSSET: Event Counter 2 Overflow Set Mask */ - -#define PMU_OVSSET_CNT3_STATUS_Pos 3U /*!< PMU OVSSET: Event Counter 3 Overflow Set Position */ -#define PMU_OVSSET_CNT3_STATUS_Msk (1UL << PMU_OVSSET_CNT3_STATUS_Pos) /*!< PMU OVSSET: Event Counter 3 Overflow Set Mask */ - -#define PMU_OVSSET_CNT4_STATUS_Pos 4U /*!< PMU OVSSET: Event Counter 4 Overflow Set Position */ -#define PMU_OVSSET_CNT4_STATUS_Msk (1UL << PMU_OVSSET_CNT4_STATUS_Pos) /*!< PMU OVSSET: Event Counter 4 Overflow Set Mask */ - -#define PMU_OVSSET_CNT5_STATUS_Pos 5U /*!< PMU OVSSET: Event Counter 5 Overflow Set Position */ -#define PMU_OVSSET_CNT5_STATUS_Msk (1UL << PMU_OVSSET_CNT5_STATUS_Pos) /*!< PMU OVSSET: Event Counter 5 Overflow Set Mask */ - -#define PMU_OVSSET_CNT6_STATUS_Pos 6U /*!< PMU OVSSET: Event Counter 6 Overflow Set Position */ -#define PMU_OVSSET_CNT6_STATUS_Msk (1UL << PMU_OVSSET_CNT6_STATUS_Pos) /*!< PMU OVSSET: Event Counter 6 Overflow Set Mask */ - -#define PMU_OVSSET_CNT7_STATUS_Pos 7U /*!< PMU OVSSET: Event Counter 7 Overflow Set Position */ -#define PMU_OVSSET_CNT7_STATUS_Msk (1UL << PMU_OVSSET_CNT7_STATUS_Pos) /*!< PMU OVSSET: Event Counter 7 Overflow Set Mask */ - -#define PMU_OVSSET_CNT8_STATUS_Pos 8U /*!< PMU OVSSET: Event Counter 8 Overflow Set Position */ -#define PMU_OVSSET_CNT8_STATUS_Msk (1UL << PMU_OVSSET_CNT8_STATUS_Pos) /*!< PMU OVSSET: Event Counter 8 Overflow Set Mask */ - -#define PMU_OVSSET_CNT9_STATUS_Pos 9U /*!< PMU OVSSET: Event Counter 9 Overflow Set Position */ -#define PMU_OVSSET_CNT9_STATUS_Msk (1UL << PMU_OVSSET_CNT9_STATUS_Pos) /*!< PMU OVSSET: Event Counter 9 Overflow Set Mask */ - -#define PMU_OVSSET_CNT10_STATUS_Pos 10U /*!< PMU OVSSET: Event Counter 10 Overflow Set Position */ -#define PMU_OVSSET_CNT10_STATUS_Msk (1UL << PMU_OVSSET_CNT10_STATUS_Pos) /*!< PMU OVSSET: Event Counter 10 Overflow Set Mask */ - -#define PMU_OVSSET_CNT11_STATUS_Pos 11U /*!< PMU OVSSET: Event Counter 11 Overflow Set Position */ -#define PMU_OVSSET_CNT11_STATUS_Msk (1UL << PMU_OVSSET_CNT11_STATUS_Pos) /*!< PMU OVSSET: Event Counter 11 Overflow Set Mask */ - -#define PMU_OVSSET_CNT12_STATUS_Pos 12U /*!< PMU OVSSET: Event Counter 12 Overflow Set Position */ -#define PMU_OVSSET_CNT12_STATUS_Msk (1UL << PMU_OVSSET_CNT12_STATUS_Pos) /*!< PMU OVSSET: Event Counter 12 Overflow Set Mask */ - -#define PMU_OVSSET_CNT13_STATUS_Pos 13U /*!< PMU OVSSET: Event Counter 13 Overflow Set Position */ -#define PMU_OVSSET_CNT13_STATUS_Msk (1UL << PMU_OVSSET_CNT13_STATUS_Pos) /*!< PMU OVSSET: Event Counter 13 Overflow Set Mask */ - -#define PMU_OVSSET_CNT14_STATUS_Pos 14U /*!< PMU OVSSET: Event Counter 14 Overflow Set Position */ -#define PMU_OVSSET_CNT14_STATUS_Msk (1UL << PMU_OVSSET_CNT14_STATUS_Pos) /*!< PMU OVSSET: Event Counter 14 Overflow Set Mask */ - -#define PMU_OVSSET_CNT15_STATUS_Pos 15U /*!< PMU OVSSET: Event Counter 15 Overflow Set Position */ -#define PMU_OVSSET_CNT15_STATUS_Msk (1UL << PMU_OVSSET_CNT15_STATUS_Pos) /*!< PMU OVSSET: Event Counter 15 Overflow Set Mask */ - -#define PMU_OVSSET_CNT16_STATUS_Pos 16U /*!< PMU OVSSET: Event Counter 16 Overflow Set Position */ -#define PMU_OVSSET_CNT16_STATUS_Msk (1UL << PMU_OVSSET_CNT16_STATUS_Pos) /*!< PMU OVSSET: Event Counter 16 Overflow Set Mask */ - -#define PMU_OVSSET_CNT17_STATUS_Pos 17U /*!< PMU OVSSET: Event Counter 17 Overflow Set Position */ -#define PMU_OVSSET_CNT17_STATUS_Msk (1UL << PMU_OVSSET_CNT17_STATUS_Pos) /*!< PMU OVSSET: Event Counter 17 Overflow Set Mask */ - -#define PMU_OVSSET_CNT18_STATUS_Pos 18U /*!< PMU OVSSET: Event Counter 18 Overflow Set Position */ -#define PMU_OVSSET_CNT18_STATUS_Msk (1UL << PMU_OVSSET_CNT18_STATUS_Pos) /*!< PMU OVSSET: Event Counter 18 Overflow Set Mask */ - -#define PMU_OVSSET_CNT19_STATUS_Pos 19U /*!< PMU OVSSET: Event Counter 19 Overflow Set Position */ -#define PMU_OVSSET_CNT19_STATUS_Msk (1UL << PMU_OVSSET_CNT19_STATUS_Pos) /*!< PMU OVSSET: Event Counter 19 Overflow Set Mask */ - -#define PMU_OVSSET_CNT20_STATUS_Pos 20U /*!< PMU OVSSET: Event Counter 20 Overflow Set Position */ -#define PMU_OVSSET_CNT20_STATUS_Msk (1UL << PMU_OVSSET_CNT20_STATUS_Pos) /*!< PMU OVSSET: Event Counter 20 Overflow Set Mask */ - -#define PMU_OVSSET_CNT21_STATUS_Pos 21U /*!< PMU OVSSET: Event Counter 21 Overflow Set Position */ -#define PMU_OVSSET_CNT21_STATUS_Msk (1UL << PMU_OVSSET_CNT21_STATUS_Pos) /*!< PMU OVSSET: Event Counter 21 Overflow Set Mask */ - -#define PMU_OVSSET_CNT22_STATUS_Pos 22U /*!< PMU OVSSET: Event Counter 22 Overflow Set Position */ -#define PMU_OVSSET_CNT22_STATUS_Msk (1UL << PMU_OVSSET_CNT22_STATUS_Pos) /*!< PMU OVSSET: Event Counter 22 Overflow Set Mask */ - -#define PMU_OVSSET_CNT23_STATUS_Pos 23U /*!< PMU OVSSET: Event Counter 23 Overflow Set Position */ -#define PMU_OVSSET_CNT23_STATUS_Msk (1UL << PMU_OVSSET_CNT23_STATUS_Pos) /*!< PMU OVSSET: Event Counter 23 Overflow Set Mask */ - -#define PMU_OVSSET_CNT24_STATUS_Pos 24U /*!< PMU OVSSET: Event Counter 24 Overflow Set Position */ -#define PMU_OVSSET_CNT24_STATUS_Msk (1UL << PMU_OVSSET_CNT24_STATUS_Pos) /*!< PMU OVSSET: Event Counter 24 Overflow Set Mask */ - -#define PMU_OVSSET_CNT25_STATUS_Pos 25U /*!< PMU OVSSET: Event Counter 25 Overflow Set Position */ -#define PMU_OVSSET_CNT25_STATUS_Msk (1UL << PMU_OVSSET_CNT25_STATUS_Pos) /*!< PMU OVSSET: Event Counter 25 Overflow Set Mask */ - -#define PMU_OVSSET_CNT26_STATUS_Pos 26U /*!< PMU OVSSET: Event Counter 26 Overflow Set Position */ -#define PMU_OVSSET_CNT26_STATUS_Msk (1UL << PMU_OVSSET_CNT26_STATUS_Pos) /*!< PMU OVSSET: Event Counter 26 Overflow Set Mask */ - -#define PMU_OVSSET_CNT27_STATUS_Pos 27U /*!< PMU OVSSET: Event Counter 27 Overflow Set Position */ -#define PMU_OVSSET_CNT27_STATUS_Msk (1UL << PMU_OVSSET_CNT27_STATUS_Pos) /*!< PMU OVSSET: Event Counter 27 Overflow Set Mask */ - -#define PMU_OVSSET_CNT28_STATUS_Pos 28U /*!< PMU OVSSET: Event Counter 28 Overflow Set Position */ -#define PMU_OVSSET_CNT28_STATUS_Msk (1UL << PMU_OVSSET_CNT28_STATUS_Pos) /*!< PMU OVSSET: Event Counter 28 Overflow Set Mask */ - -#define PMU_OVSSET_CNT29_STATUS_Pos 29U /*!< PMU OVSSET: Event Counter 29 Overflow Set Position */ -#define PMU_OVSSET_CNT29_STATUS_Msk (1UL << PMU_OVSSET_CNT29_STATUS_Pos) /*!< PMU OVSSET: Event Counter 29 Overflow Set Mask */ - -#define PMU_OVSSET_CNT30_STATUS_Pos 30U /*!< PMU OVSSET: Event Counter 30 Overflow Set Position */ -#define PMU_OVSSET_CNT30_STATUS_Msk (1UL << PMU_OVSSET_CNT30_STATUS_Pos) /*!< PMU OVSSET: Event Counter 30 Overflow Set Mask */ - -#define PMU_OVSSET_CYCCNT_STATUS_Pos 31U /*!< PMU OVSSET: Cycle Counter Overflow Set Position */ -#define PMU_OVSSET_CYCCNT_STATUS_Msk (1UL << PMU_OVSSET_CYCCNT_STATUS_Pos) /*!< PMU OVSSET: Cycle Counter Overflow Set Mask */ - -/** \brief PMU Overflow Flag Status Clear Register Definitions */ - -#define PMU_OVSCLR_CNT0_STATUS_Pos 0U /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Position */ -#define PMU_OVSCLR_CNT0_STATUS_Msk (1UL /*<< PMU_OVSCLR_CNT0_STATUS_Pos*/) /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT1_STATUS_Pos 1U /*!< PMU OVSCLR: Event Counter 1 Overflow Clear Position */ -#define PMU_OVSCLR_CNT1_STATUS_Msk (1UL << PMU_OVSCLR_CNT1_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 1 Overflow Clear */ - -#define PMU_OVSCLR_CNT2_STATUS_Pos 2U /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Position */ -#define PMU_OVSCLR_CNT2_STATUS_Msk (1UL << PMU_OVSCLR_CNT2_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT3_STATUS_Pos 3U /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Position */ -#define PMU_OVSCLR_CNT3_STATUS_Msk (1UL << PMU_OVSCLR_CNT3_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT4_STATUS_Pos 4U /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Position */ -#define PMU_OVSCLR_CNT4_STATUS_Msk (1UL << PMU_OVSCLR_CNT4_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT5_STATUS_Pos 5U /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Position */ -#define PMU_OVSCLR_CNT5_STATUS_Msk (1UL << PMU_OVSCLR_CNT5_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT6_STATUS_Pos 6U /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Position */ -#define PMU_OVSCLR_CNT6_STATUS_Msk (1UL << PMU_OVSCLR_CNT6_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT7_STATUS_Pos 7U /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Position */ -#define PMU_OVSCLR_CNT7_STATUS_Msk (1UL << PMU_OVSCLR_CNT7_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT8_STATUS_Pos 8U /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Position */ -#define PMU_OVSCLR_CNT8_STATUS_Msk (1UL << PMU_OVSCLR_CNT8_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT9_STATUS_Pos 9U /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Position */ -#define PMU_OVSCLR_CNT9_STATUS_Msk (1UL << PMU_OVSCLR_CNT9_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT10_STATUS_Pos 10U /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Position */ -#define PMU_OVSCLR_CNT10_STATUS_Msk (1UL << PMU_OVSCLR_CNT10_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT11_STATUS_Pos 11U /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Position */ -#define PMU_OVSCLR_CNT11_STATUS_Msk (1UL << PMU_OVSCLR_CNT11_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT12_STATUS_Pos 12U /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Position */ -#define PMU_OVSCLR_CNT12_STATUS_Msk (1UL << PMU_OVSCLR_CNT12_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT13_STATUS_Pos 13U /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Position */ -#define PMU_OVSCLR_CNT13_STATUS_Msk (1UL << PMU_OVSCLR_CNT13_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT14_STATUS_Pos 14U /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Position */ -#define PMU_OVSCLR_CNT14_STATUS_Msk (1UL << PMU_OVSCLR_CNT14_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT15_STATUS_Pos 15U /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Position */ -#define PMU_OVSCLR_CNT15_STATUS_Msk (1UL << PMU_OVSCLR_CNT15_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT16_STATUS_Pos 16U /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Position */ -#define PMU_OVSCLR_CNT16_STATUS_Msk (1UL << PMU_OVSCLR_CNT16_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT17_STATUS_Pos 17U /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Position */ -#define PMU_OVSCLR_CNT17_STATUS_Msk (1UL << PMU_OVSCLR_CNT17_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT18_STATUS_Pos 18U /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Position */ -#define PMU_OVSCLR_CNT18_STATUS_Msk (1UL << PMU_OVSCLR_CNT18_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT19_STATUS_Pos 19U /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Position */ -#define PMU_OVSCLR_CNT19_STATUS_Msk (1UL << PMU_OVSCLR_CNT19_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT20_STATUS_Pos 20U /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Position */ -#define PMU_OVSCLR_CNT20_STATUS_Msk (1UL << PMU_OVSCLR_CNT20_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT21_STATUS_Pos 21U /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Position */ -#define PMU_OVSCLR_CNT21_STATUS_Msk (1UL << PMU_OVSCLR_CNT21_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT22_STATUS_Pos 22U /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Position */ -#define PMU_OVSCLR_CNT22_STATUS_Msk (1UL << PMU_OVSCLR_CNT22_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT23_STATUS_Pos 23U /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Position */ -#define PMU_OVSCLR_CNT23_STATUS_Msk (1UL << PMU_OVSCLR_CNT23_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT24_STATUS_Pos 24U /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Position */ -#define PMU_OVSCLR_CNT24_STATUS_Msk (1UL << PMU_OVSCLR_CNT24_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT25_STATUS_Pos 25U /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Position */ -#define PMU_OVSCLR_CNT25_STATUS_Msk (1UL << PMU_OVSCLR_CNT25_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT26_STATUS_Pos 26U /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Position */ -#define PMU_OVSCLR_CNT26_STATUS_Msk (1UL << PMU_OVSCLR_CNT26_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT27_STATUS_Pos 27U /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Position */ -#define PMU_OVSCLR_CNT27_STATUS_Msk (1UL << PMU_OVSCLR_CNT27_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT28_STATUS_Pos 28U /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Position */ -#define PMU_OVSCLR_CNT28_STATUS_Msk (1UL << PMU_OVSCLR_CNT28_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT29_STATUS_Pos 29U /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Position */ -#define PMU_OVSCLR_CNT29_STATUS_Msk (1UL << PMU_OVSCLR_CNT29_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT30_STATUS_Pos 30U /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Position */ -#define PMU_OVSCLR_CNT30_STATUS_Msk (1UL << PMU_OVSCLR_CNT30_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Mask */ - -#define PMU_OVSCLR_CYCCNT_STATUS_Pos 31U /*!< PMU OVSCLR: Cycle Counter Overflow Clear Position */ -#define PMU_OVSCLR_CYCCNT_STATUS_Msk (1UL << PMU_OVSCLR_CYCCNT_STATUS_Pos) /*!< PMU OVSCLR: Cycle Counter Overflow Clear Mask */ - -/** \brief PMU Software Increment Counter */ - -#define PMU_SWINC_CNT0_Pos 0U /*!< PMU SWINC: Event Counter 0 Software Increment Position */ -#define PMU_SWINC_CNT0_Msk (1UL /*<< PMU_SWINC_CNT0_Pos */) /*!< PMU SWINC: Event Counter 0 Software Increment Mask */ - -#define PMU_SWINC_CNT1_Pos 1U /*!< PMU SWINC: Event Counter 1 Software Increment Position */ -#define PMU_SWINC_CNT1_Msk (1UL << PMU_SWINC_CNT1_Pos) /*!< PMU SWINC: Event Counter 1 Software Increment Mask */ - -#define PMU_SWINC_CNT2_Pos 2U /*!< PMU SWINC: Event Counter 2 Software Increment Position */ -#define PMU_SWINC_CNT2_Msk (1UL << PMU_SWINC_CNT2_Pos) /*!< PMU SWINC: Event Counter 2 Software Increment Mask */ - -#define PMU_SWINC_CNT3_Pos 3U /*!< PMU SWINC: Event Counter 3 Software Increment Position */ -#define PMU_SWINC_CNT3_Msk (1UL << PMU_SWINC_CNT3_Pos) /*!< PMU SWINC: Event Counter 3 Software Increment Mask */ - -#define PMU_SWINC_CNT4_Pos 4U /*!< PMU SWINC: Event Counter 4 Software Increment Position */ -#define PMU_SWINC_CNT4_Msk (1UL << PMU_SWINC_CNT4_Pos) /*!< PMU SWINC: Event Counter 4 Software Increment Mask */ - -#define PMU_SWINC_CNT5_Pos 5U /*!< PMU SWINC: Event Counter 5 Software Increment Position */ -#define PMU_SWINC_CNT5_Msk (1UL << PMU_SWINC_CNT5_Pos) /*!< PMU SWINC: Event Counter 5 Software Increment Mask */ - -#define PMU_SWINC_CNT6_Pos 6U /*!< PMU SWINC: Event Counter 6 Software Increment Position */ -#define PMU_SWINC_CNT6_Msk (1UL << PMU_SWINC_CNT6_Pos) /*!< PMU SWINC: Event Counter 6 Software Increment Mask */ - -#define PMU_SWINC_CNT7_Pos 7U /*!< PMU SWINC: Event Counter 7 Software Increment Position */ -#define PMU_SWINC_CNT7_Msk (1UL << PMU_SWINC_CNT7_Pos) /*!< PMU SWINC: Event Counter 7 Software Increment Mask */ - -#define PMU_SWINC_CNT8_Pos 8U /*!< PMU SWINC: Event Counter 8 Software Increment Position */ -#define PMU_SWINC_CNT8_Msk (1UL << PMU_SWINC_CNT8_Pos) /*!< PMU SWINC: Event Counter 8 Software Increment Mask */ - -#define PMU_SWINC_CNT9_Pos 9U /*!< PMU SWINC: Event Counter 9 Software Increment Position */ -#define PMU_SWINC_CNT9_Msk (1UL << PMU_SWINC_CNT9_Pos) /*!< PMU SWINC: Event Counter 9 Software Increment Mask */ - -#define PMU_SWINC_CNT10_Pos 10U /*!< PMU SWINC: Event Counter 10 Software Increment Position */ -#define PMU_SWINC_CNT10_Msk (1UL << PMU_SWINC_CNT10_Pos) /*!< PMU SWINC: Event Counter 10 Software Increment Mask */ - -#define PMU_SWINC_CNT11_Pos 11U /*!< PMU SWINC: Event Counter 11 Software Increment Position */ -#define PMU_SWINC_CNT11_Msk (1UL << PMU_SWINC_CNT11_Pos) /*!< PMU SWINC: Event Counter 11 Software Increment Mask */ - -#define PMU_SWINC_CNT12_Pos 12U /*!< PMU SWINC: Event Counter 12 Software Increment Position */ -#define PMU_SWINC_CNT12_Msk (1UL << PMU_SWINC_CNT12_Pos) /*!< PMU SWINC: Event Counter 12 Software Increment Mask */ - -#define PMU_SWINC_CNT13_Pos 13U /*!< PMU SWINC: Event Counter 13 Software Increment Position */ -#define PMU_SWINC_CNT13_Msk (1UL << PMU_SWINC_CNT13_Pos) /*!< PMU SWINC: Event Counter 13 Software Increment Mask */ - -#define PMU_SWINC_CNT14_Pos 14U /*!< PMU SWINC: Event Counter 14 Software Increment Position */ -#define PMU_SWINC_CNT14_Msk (1UL << PMU_SWINC_CNT14_Pos) /*!< PMU SWINC: Event Counter 14 Software Increment Mask */ - -#define PMU_SWINC_CNT15_Pos 15U /*!< PMU SWINC: Event Counter 15 Software Increment Position */ -#define PMU_SWINC_CNT15_Msk (1UL << PMU_SWINC_CNT15_Pos) /*!< PMU SWINC: Event Counter 15 Software Increment Mask */ - -#define PMU_SWINC_CNT16_Pos 16U /*!< PMU SWINC: Event Counter 16 Software Increment Position */ -#define PMU_SWINC_CNT16_Msk (1UL << PMU_SWINC_CNT16_Pos) /*!< PMU SWINC: Event Counter 16 Software Increment Mask */ - -#define PMU_SWINC_CNT17_Pos 17U /*!< PMU SWINC: Event Counter 17 Software Increment Position */ -#define PMU_SWINC_CNT17_Msk (1UL << PMU_SWINC_CNT17_Pos) /*!< PMU SWINC: Event Counter 17 Software Increment Mask */ - -#define PMU_SWINC_CNT18_Pos 18U /*!< PMU SWINC: Event Counter 18 Software Increment Position */ -#define PMU_SWINC_CNT18_Msk (1UL << PMU_SWINC_CNT18_Pos) /*!< PMU SWINC: Event Counter 18 Software Increment Mask */ - -#define PMU_SWINC_CNT19_Pos 19U /*!< PMU SWINC: Event Counter 19 Software Increment Position */ -#define PMU_SWINC_CNT19_Msk (1UL << PMU_SWINC_CNT19_Pos) /*!< PMU SWINC: Event Counter 19 Software Increment Mask */ - -#define PMU_SWINC_CNT20_Pos 20U /*!< PMU SWINC: Event Counter 20 Software Increment Position */ -#define PMU_SWINC_CNT20_Msk (1UL << PMU_SWINC_CNT20_Pos) /*!< PMU SWINC: Event Counter 20 Software Increment Mask */ - -#define PMU_SWINC_CNT21_Pos 21U /*!< PMU SWINC: Event Counter 21 Software Increment Position */ -#define PMU_SWINC_CNT21_Msk (1UL << PMU_SWINC_CNT21_Pos) /*!< PMU SWINC: Event Counter 21 Software Increment Mask */ - -#define PMU_SWINC_CNT22_Pos 22U /*!< PMU SWINC: Event Counter 22 Software Increment Position */ -#define PMU_SWINC_CNT22_Msk (1UL << PMU_SWINC_CNT22_Pos) /*!< PMU SWINC: Event Counter 22 Software Increment Mask */ - -#define PMU_SWINC_CNT23_Pos 23U /*!< PMU SWINC: Event Counter 23 Software Increment Position */ -#define PMU_SWINC_CNT23_Msk (1UL << PMU_SWINC_CNT23_Pos) /*!< PMU SWINC: Event Counter 23 Software Increment Mask */ - -#define PMU_SWINC_CNT24_Pos 24U /*!< PMU SWINC: Event Counter 24 Software Increment Position */ -#define PMU_SWINC_CNT24_Msk (1UL << PMU_SWINC_CNT24_Pos) /*!< PMU SWINC: Event Counter 24 Software Increment Mask */ - -#define PMU_SWINC_CNT25_Pos 25U /*!< PMU SWINC: Event Counter 25 Software Increment Position */ -#define PMU_SWINC_CNT25_Msk (1UL << PMU_SWINC_CNT25_Pos) /*!< PMU SWINC: Event Counter 25 Software Increment Mask */ - -#define PMU_SWINC_CNT26_Pos 26U /*!< PMU SWINC: Event Counter 26 Software Increment Position */ -#define PMU_SWINC_CNT26_Msk (1UL << PMU_SWINC_CNT26_Pos) /*!< PMU SWINC: Event Counter 26 Software Increment Mask */ - -#define PMU_SWINC_CNT27_Pos 27U /*!< PMU SWINC: Event Counter 27 Software Increment Position */ -#define PMU_SWINC_CNT27_Msk (1UL << PMU_SWINC_CNT27_Pos) /*!< PMU SWINC: Event Counter 27 Software Increment Mask */ - -#define PMU_SWINC_CNT28_Pos 28U /*!< PMU SWINC: Event Counter 28 Software Increment Position */ -#define PMU_SWINC_CNT28_Msk (1UL << PMU_SWINC_CNT28_Pos) /*!< PMU SWINC: Event Counter 28 Software Increment Mask */ - -#define PMU_SWINC_CNT29_Pos 29U /*!< PMU SWINC: Event Counter 29 Software Increment Position */ -#define PMU_SWINC_CNT29_Msk (1UL << PMU_SWINC_CNT29_Pos) /*!< PMU SWINC: Event Counter 29 Software Increment Mask */ - -#define PMU_SWINC_CNT30_Pos 30U /*!< PMU SWINC: Event Counter 30 Software Increment Position */ -#define PMU_SWINC_CNT30_Msk (1UL << PMU_SWINC_CNT30_Pos) /*!< PMU SWINC: Event Counter 30 Software Increment Mask */ - -/** \brief PMU Control Register Definitions */ - -#define PMU_CTRL_ENABLE_Pos 0U /*!< PMU CTRL: ENABLE Position */ -#define PMU_CTRL_ENABLE_Msk (1UL /*<< PMU_CTRL_ENABLE_Pos*/) /*!< PMU CTRL: ENABLE Mask */ - -#define PMU_CTRL_EVENTCNT_RESET_Pos 1U /*!< PMU CTRL: Event Counter Reset Position */ -#define PMU_CTRL_EVENTCNT_RESET_Msk (1UL << PMU_CTRL_EVENTCNT_RESET_Pos) /*!< PMU CTRL: Event Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_RESET_Pos 2U /*!< PMU CTRL: Cycle Counter Reset Position */ -#define PMU_CTRL_CYCCNT_RESET_Msk (1UL << PMU_CTRL_CYCCNT_RESET_Pos) /*!< PMU CTRL: Cycle Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_DISABLE_Pos 5U /*!< PMU CTRL: Disable Cycle Counter Position */ -#define PMU_CTRL_CYCCNT_DISABLE_Msk (1UL << PMU_CTRL_CYCCNT_DISABLE_Pos) /*!< PMU CTRL: Disable Cycle Counter Mask */ - -#define PMU_CTRL_FRZ_ON_OV_Pos 9U /*!< PMU CTRL: Freeze-on-overflow Position */ -#define PMU_CTRL_FRZ_ON_OV_Msk (1UL << PMU_CTRL_FRZ_ON_OVERFLOW_Pos) /*!< PMU CTRL: Freeze-on-overflow Mask */ - -#define PMU_CTRL_TRACE_ON_OV_Pos 11U /*!< PMU CTRL: Trace-on-overflow Position */ -#define PMU_CTRL_TRACE_ON_OV_Msk (1UL << PMU_CTRL_TRACE_ON_OVERFLOW_Pos) /*!< PMU CTRL: Trace-on-overflow Mask */ - -/** \brief PMU Type Register Definitions */ - -#define PMU_TYPE_NUM_CNTS_Pos 0U /*!< PMU TYPE: Number of Counters Position */ -#define PMU_TYPE_NUM_CNTS_Msk (0xFFUL /*<< PMU_TYPE_NUM_CNTS_Pos*/) /*!< PMU TYPE: Number of Counters Mask */ - -#define PMU_TYPE_SIZE_CNTS_Pos 8U /*!< PMU TYPE: Size of Counters Position */ -#define PMU_TYPE_SIZE_CNTS_Msk (0x3FUL << PMU_TYPE_SIZE_CNTS_Pos) /*!< PMU TYPE: Size of Counters Mask */ - -#define PMU_TYPE_CYCCNT_PRESENT_Pos 14U /*!< PMU TYPE: Cycle Counter Present Position */ -#define PMU_TYPE_CYCCNT_PRESENT_Msk (1UL << PMU_TYPE_CYCCNT_PRESENT_Pos) /*!< PMU TYPE: Cycle Counter Present Mask */ - -#define PMU_TYPE_FRZ_OV_SUPPORT_Pos 21U /*!< PMU TYPE: Freeze-on-overflow Support Position */ -#define PMU_TYPE_FRZ_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Freeze-on-overflow Support Mask */ - -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Pos 23U /*!< PMU TYPE: Trace-on-overflow Support Position */ -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Trace-on-overflow Support Mask */ - -/** \brief PMU Authentication Status Register Definitions */ - -#define PMU_AUTHSTATUS_NSID_Pos 0U /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSID_Msk (0x3UL /*<< PMU_AUTHSTATUS_NSID_Pos*/) /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSNID_Pos 2U /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSNID_Msk (0x3UL << PMU_AUTHSTATUS_NSNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SID_Pos 4U /*!< PMU AUTHSTATUS: Secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_SID_Msk (0x3UL << PMU_AUTHSTATUS_SID_Pos) /*!< PMU AUTHSTATUS: Secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SNID_Pos 6U /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SNID_Msk (0x3UL << PMU_AUTHSTATUS_SNID_Pos) /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUID_Pos 16U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUID_Msk (0x3UL << PMU_AUTHSTATUS_NSUID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUNID_Pos 18U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUNID_Msk (0x3UL << PMU_AUTHSTATUS_NSUNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUID_Pos 20U /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_SUID_Msk (0x3UL << PMU_AUTHSTATUS_SUID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUNID_Pos 22U /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SUNID_Msk (0x3UL << PMU_AUTHSTATUS_SUNID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Mask */ - - -/*@} end of group CMSIS_PMU */ -#endif - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_PXN_Pos 4U /*!< MPU RLAR: PXN Position */ -#define MPU_RLAR_PXN_Msk (1UL << MPU_RLAR_PXN_Pos) /*!< MPU RLAR: PXN Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -#define FPU_FPDSCR_FZ16_Pos 19U /*!< FPDSCR: FZ16 bit Position */ -#define FPU_FPDSCR_FZ16_Msk (1UL << FPU_FPDSCR_FZ16_Pos) /*!< FPDSCR: FZ16 bit Mask */ - -#define FPU_FPDSCR_LTPSIZE_Pos 16U /*!< FPDSCR: LTPSIZE bit Position */ -#define FPU_FPDSCR_LTPSIZE_Msk (7UL << FPU_FPDSCR_LTPSIZE_Pos) /*!< FPDSCR: LTPSIZE bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FPRound_Pos 28U /*!< MVFR0: FPRound bits Position */ -#define FPU_MVFR0_FPRound_Msk (0xFUL << FPU_MVFR0_FPRound_Pos) /*!< MVFR0: FPRound bits Mask */ - -#define FPU_MVFR0_FPSqrt_Pos 20U /*!< MVFR0: FPSqrt bits Position */ -#define FPU_MVFR0_FPSqrt_Msk (0xFUL << FPU_MVFR0_FPSqrt_Pos) /*!< MVFR0: FPSqrt bits Mask */ - -#define FPU_MVFR0_FPDivide_Pos 16U /*!< MVFR0: FPDivide bits Position */ -#define FPU_MVFR0_FPDivide_Msk (0xFUL << FPU_MVFR0_FPDivide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FPDP_Pos 8U /*!< MVFR0: FPDP bits Position */ -#define FPU_MVFR0_FPDP_Msk (0xFUL << FPU_MVFR0_FPDP_Pos) /*!< MVFR0: FPDP bits Mask */ - -#define FPU_MVFR0_FPSP_Pos 4U /*!< MVFR0: FPSP bits Position */ -#define FPU_MVFR0_FPSP_Msk (0xFUL << FPU_MVFR0_FPSP_Pos) /*!< MVFR0: FPSP bits Mask */ - -#define FPU_MVFR0_SIMDReg_Pos 0U /*!< MVFR0: SIMDReg bits Position */ -#define FPU_MVFR0_SIMDReg_Msk (0xFUL /*<< FPU_MVFR0_SIMDReg_Pos*/) /*!< MVFR0: SIMDReg bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FMAC_Pos 28U /*!< MVFR1: FMAC bits Position */ -#define FPU_MVFR1_FMAC_Msk (0xFUL << FPU_MVFR1_FMAC_Pos) /*!< MVFR1: FMAC bits Mask */ - -#define FPU_MVFR1_FPHP_Pos 24U /*!< MVFR1: FPHP bits Position */ -#define FPU_MVFR1_FPHP_Msk (0xFUL << FPU_MVFR1_FPHP_Pos) /*!< MVFR1: FPHP bits Mask */ - -#define FPU_MVFR1_FP16_Pos 20U /*!< MVFR1: FP16 bits Position */ -#define FPU_MVFR1_FP16_Msk (0xFUL << FPU_MVFR1_FP16_Pos) /*!< MVFR1: FP16 bits Mask */ - -#define FPU_MVFR1_MVE_Pos 8U /*!< MVFR1: MVE bits Position */ -#define FPU_MVFR1_MVE_Msk (0xFUL << FPU_MVFR1_MVE_Pos) /*!< MVFR1: MVE bits Mask */ - -#define FPU_MVFR1_FPDNaN_Pos 4U /*!< MVFR1: FPDNaN bits Position */ -#define FPU_MVFR1_FPDNaN_Msk (0xFUL << FPU_MVFR1_FPDNaN_Pos) /*!< MVFR1: FPDNaN bits Mask */ - -#define FPU_MVFR1_FPFtZ_Pos 0U /*!< MVFR1: FPFtZ bits Position */ -#define FPU_MVFR1_FPFtZ_Msk (0xFUL /*<< FPU_MVFR1_FPFtZ_Pos*/) /*!< MVFR1: FPFtZ bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_FPD_Pos 23U /*!< \deprecated CoreDebug DHCSR: S_FPD Position */ -#define CoreDebug_DHCSR_S_FPD_Msk (1UL << CoreDebug_DHCSR_S_FPD_Pos) /*!< \deprecated CoreDebug DHCSR: S_FPD Mask */ - -#define CoreDebug_DHCSR_S_SUIDE_Pos 22U /*!< \deprecated CoreDebug DHCSR: S_SUIDE Position */ -#define CoreDebug_DHCSR_S_SUIDE_Msk (1UL << CoreDebug_DHCSR_S_SUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SUIDE Mask */ - -#define CoreDebug_DHCSR_S_NSUIDE_Pos 21U /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Position */ -#define CoreDebug_DHCSR_S_NSUIDE_Msk (1UL << CoreDebug_DHCSR_S_NSUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Mask */ - -#define CoreDebug_DHCSR_S_SDE_Pos 20U /*!< \deprecated CoreDebug DHCSR: S_SDE Position */ -#define CoreDebug_DHCSR_S_SDE_Msk (1UL << CoreDebug_DHCSR_S_SDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SDE Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_PMOV_Pos 6U /*!< \deprecated CoreDebug DHCSR: C_PMOV Position */ -#define CoreDebug_DHCSR_C_PMOV_Msk (1UL << CoreDebug_DHCSR_C_PMOV_Pos) /*!< \deprecated CoreDebug DHCSR: C_PMOV Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Set Clear Exception and Monitor Control Register Definitions */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_REQ_Pos 3U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_SET_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_PEND_Pos 1U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_SET_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_UIDEN_Pos 10U /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_UIDAPEN_Pos 9U /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDAPEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDAPEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Mask */ - -#define CoreDebug_DAUTHCTRL_FSDMA_Pos 8U /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Position */ -#define CoreDebug_DAUTHCTRL_FSDMA_Msk (1UL << CoreDebug_DAUTHCTRL_FSDMA_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_FPD_Pos 23U /*!< DCB DHCSR: Floating-point registers Debuggable Position */ -#define DCB_DHCSR_S_FPD_Msk (0x1UL << DCB_DHCSR_S_FPD_Pos) /*!< DCB DHCSR: Floating-point registers Debuggable Mask */ - -#define DCB_DHCSR_S_SUIDE_Pos 22U /*!< DCB DHCSR: Secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_SUIDE_Msk (0x1UL << DCB_DHCSR_S_SUIDE_Pos) /*!< DCB DHCSR: Secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_NSUIDE_Pos 21U /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_NSUIDE_Msk (0x1UL << DCB_DHCSR_S_NSUIDE_Pos) /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_PMOV_Pos 6U /*!< DCB DHCSR: Halt on PMU overflow control Position */ -#define DCB_DHCSR_C_PMOV_Msk (0x1UL << DCB_DHCSR_C_PMOV_Pos) /*!< DCB DHCSR: Halt on PMU overflow control Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DSCEMCR, Debug Set Clear Exception and Monitor Control Register Definitions */ -#define DCB_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< DCB DSCEMCR: Clear monitor request Position */ -#define DCB_DSCEMCR_CLR_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_REQ_Pos) /*!< DCB DSCEMCR: Clear monitor request Mask */ - -#define DCB_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< DCB DSCEMCR: Clear monitor pend Position */ -#define DCB_DSCEMCR_CLR_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_PEND_Pos) /*!< DCB DSCEMCR: Clear monitor pend Mask */ - -#define DCB_DSCEMCR_SET_MON_REQ_Pos 3U /*!< DCB DSCEMCR: Set monitor request Position */ -#define DCB_DSCEMCR_SET_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_SET_MON_REQ_Pos) /*!< DCB DSCEMCR: Set monitor request Mask */ - -#define DCB_DSCEMCR_SET_MON_PEND_Pos 1U /*!< DCB DSCEMCR: Set monitor pend Position */ -#define DCB_DSCEMCR_SET_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_SET_MON_PEND_Pos) /*!< DCB DSCEMCR: Set monitor pend Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_UIDEN_Pos 10U /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Position */ -#define DCB_DAUTHCTRL_UIDEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Mask */ - -#define DCB_DAUTHCTRL_UIDAPEN_Pos 9U /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Position */ -#define DCB_DAUTHCTRL_UIDAPEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDAPEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Mask */ - -#define DCB_DAUTHCTRL_FSDMA_Pos 8U /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Position */ -#define DCB_DAUTHCTRL_FSDMA_Msk (0x1UL << DCB_DAUTHCTRL_FSDMA_Pos) /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Mask */ - -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SUNID_Pos 22U /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUNID_Msk (0x3UL << DIB_DAUTHSTATUS_SUNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SUID_Pos 20U /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUID_Msk (0x3UL << DIB_DAUTHSTATUS_SUID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_NSUNID_Pos 18U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Position */ -#define DIB_DAUTHSTATUS_NSUNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Mask */ - -#define DIB_DAUTHSTATUS_NSUID_Pos 16U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_NSUID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \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 ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define MEMSYSCTL_BASE (0xE001E000UL) /*!< Memory System Control Base Address */ - #define ERRBNK_BASE (0xE001E100UL) /*!< Error Banking Base Address */ - #define PWRMODCTL_BASE (0xE001E300UL) /*!< Power Mode Control Base Address */ - #define EWIC_BASE (0xE001E400UL) /*!< External Wakeup Interrupt Controller Base Address */ - #define PRCCFGINF_BASE (0xE001E700UL) /*!< Processor Configuration Information Base Address */ - #define STL_BASE (0xE001E800UL) /*!< Software Test Library Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB 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 ICB ((ICB_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 */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define MEMSYSCTL ((MemSysCtl_Type *) MEMSYSCTL_BASE ) /*!< Memory System Control configuration struct */ - #define ERRBNK ((ErrBnk_Type *) ERRBNK_BASE ) /*!< Error Banking configuration struct */ - #define PWRMODCTL ((PwrModCtl_Type *) PWRMODCTL_BASE ) /*!< Power Mode Control configuration struct */ - #define EWIC ((EWIC_Type *) EWIC_BASE ) /*!< EWIC configuration struct */ - #define PRCCFGINF ((PrcCfgInf_Type *) PRCCFGINF_BASE ) /*!< Processor Configuration Information configuration struct */ - #define STL ((STL_Type *) STL_BASE ) /*!< Software Test Library configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - #define PMU_BASE (0xE0003000UL) /*!< PMU Base Address */ - #define PMU ((PMU_Type *) PMU_BASE ) /*!< PMU configuration struct */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define ICB_NS ((ICB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ -#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ - -/* 'SCnSCB' is deprecated and replaced by 'ICB' */ -typedef ICB_Type SCnSCB_Type; - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISCRITAXIRUW_Pos (ICB_ACTLR_DISCRITAXIRUW_Pos) -#define SCnSCB_ACTLR_DISCRITAXIRUW_Msk (ICB_ACTLR_DISCRITAXIRUW_Msk) - -#define SCnSCB_ACTLR_DISDI_Pos (ICB_ACTLR_DISDI_Pos) -#define SCnSCB_ACTLR_DISDI_Msk (ICB_ACTLR_DISDI_Msk) - -#define SCnSCB_ACTLR_DISCRITAXIRUR_Pos (ICB_ACTLR_DISCRITAXIRUR_Pos) -#define SCnSCB_ACTLR_DISCRITAXIRUR_Msk (ICB_ACTLR_DISCRITAXIRUR_Msk) - -#define SCnSCB_ACTLR_EVENTBUSEN_Pos (ICB_ACTLR_EVENTBUSEN_Pos) -#define SCnSCB_ACTLR_EVENTBUSEN_Msk (ICB_ACTLR_EVENTBUSEN_Msk) - -#define SCnSCB_ACTLR_EVENTBUSEN_S_Pos (ICB_ACTLR_EVENTBUSEN_S_Pos) -#define SCnSCB_ACTLR_EVENTBUSEN_S_Msk (ICB_ACTLR_EVENTBUSEN_S_Msk) - -#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos (ICB_ACTLR_DISITMATBFLUSH_Pos) -#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (ICB_ACTLR_DISITMATBFLUSH_Msk) - -#define SCnSCB_ACTLR_DISNWAMODE_Pos (ICB_ACTLR_DISNWAMODE_Pos) -#define SCnSCB_ACTLR_DISNWAMODE_Msk (ICB_ACTLR_DISNWAMODE_Msk) - -#define SCnSCB_ACTLR_FPEXCODIS_Pos (ICB_ACTLR_FPEXCODIS_Pos) -#define SCnSCB_ACTLR_FPEXCODIS_Msk (ICB_ACTLR_FPEXCODIS_Msk) - -#define SCnSCB_ACTLR_DISOLAP_Pos (ICB_ACTLR_DISOLAP_Pos) -#define SCnSCB_ACTLR_DISOLAP_Msk (ICB_ACTLR_DISOLAP_Msk) - -#define SCnSCB_ACTLR_DISOLAPS_Pos (ICB_ACTLR_DISOLAPS_Pos) -#define SCnSCB_ACTLR_DISOLAPS_Msk (ICB_ACTLR_DISOLAPS_Msk) - -#define SCnSCB_ACTLR_DISLOBR_Pos (ICB_ACTLR_DISLOBR_Pos) -#define SCnSCB_ACTLR_DISLOBR_Msk (ICB_ACTLR_DISLOBR_Msk) - -#define SCnSCB_ACTLR_DISLO_Pos (ICB_ACTLR_DISLO_Pos) -#define SCnSCB_ACTLR_DISLO_Msk (ICB_ACTLR_DISLO_Msk) - -#define SCnSCB_ACTLR_DISLOLEP_Pos (ICB_ACTLR_DISLOLEP_Pos) -#define SCnSCB_ACTLR_DISLOLEP_Msk (ICB_ACTLR_DISLOLEP_Msk) - -#define SCnSCB_ACTLR_DISFOLD_Pos (ICB_ACTLR_DISFOLD_Pos) -#define SCnSCB_ACTLR_DISFOLD_Msk (ICB_ACTLR_DISFOLD_Msk) - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos (ICB_ICTR_INTLINESNUM_Pos) -#define SCnSCB_ICTR_INTLINESNUM_Msk (ICB_ICTR_INTLINESNUM_Msk) - -#define SCnSCB (ICB) -#define SCnSCB_NS (ICB_NS) - -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug 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 - #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 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \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) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \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->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \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->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (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. - VTOR must been relocated to SRAM before. - \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 *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \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 *)SCB->VTOR; - 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 = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## PMU functions and events #################################### */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - -#include "pmu_armv8.h" - -/** - \brief Cortex-M55 PMU events - \note Architectural PMU events can be found in pmu_armv8.h -*/ - -#define ARMCM55_PMU_ECC_ERR 0xC000 /*!< Any ECC error */ -#define ARMCM55_PMU_ECC_ERR_FATAL 0xC001 /*!< Any fatal ECC error */ -#define ARMCM55_PMU_ECC_ERR_DCACHE 0xC010 /*!< Any ECC error in the data cache */ -#define ARMCM55_PMU_ECC_ERR_ICACHE 0xC011 /*!< Any ECC error in the instruction cache */ -#define ARMCM55_PMU_ECC_ERR_FATAL_DCACHE 0xC012 /*!< Any fatal ECC error in the data cache */ -#define ARMCM55_PMU_ECC_ERR_FATAL_ICACHE 0xC013 /*!< Any fatal ECC error in the instruction cache*/ -#define ARMCM55_PMU_ECC_ERR_DTCM 0xC020 /*!< Any ECC error in the DTCM */ -#define ARMCM55_PMU_ECC_ERR_ITCM 0xC021 /*!< Any ECC error in the ITCM */ -#define ARMCM55_PMU_ECC_ERR_FATAL_DTCM 0xC022 /*!< Any fatal ECC error in the DTCM */ -#define ARMCM55_PMU_ECC_ERR_FATAL_ITCM 0xC023 /*!< Any fatal ECC error in the ITCM */ -#define ARMCM55_PMU_PF_LINEFILL 0xC100 /*!< A prefetcher starts a line-fill */ -#define ARMCM55_PMU_PF_CANCEL 0xC101 /*!< A prefetcher stops prefetching */ -#define ARMCM55_PMU_PF_DROP_LINEFILL 0xC102 /*!< A linefill triggered by a prefetcher has been dropped because of lack of buffering */ -#define ARMCM55_PMU_NWAMODE_ENTER 0xC200 /*!< No write-allocate mode entry */ -#define ARMCM55_PMU_NWAMODE 0xC201 /*!< Write-allocate store is not allocated into the data cache due to no-write-allocate mode */ -#define ARMCM55_PMU_SAHB_ACCESS 0xC300 /*!< Read or write access on the S-AHB interface to the TCM */ -#define ARMCM55_PMU_PAHB_ACCESS 0xC301 /*!< Read or write access to the P-AHB write interface */ -#define ARMCM55_PMU_AXI_WRITE_ACCESS 0xC302 /*!< Any beat access to M-AXI write interface */ -#define ARMCM55_PMU_AXI_READ_ACCESS 0xC303 /*!< Any beat access to M-AXI read interface */ -#define ARMCM55_PMU_DOSTIMEOUT_DOUBLE 0xC400 /*!< Denial of Service timeout has fired twice and caused buffers to drain to allow forward progress */ -#define ARMCM55_PMU_DOSTIMEOUT_TRIPLE 0xC401 /*!< Denial of Service timeout has fired three times and blocked the LSU to force forward progress */ - -#endif - -/* ########################## 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) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - -/* ########################## MVE functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_MveFunctions MVE Functions - \brief Function that provides MVE type. - @{ - */ - -/** - \brief get MVE type - \details returns the MVE type - \returns - - \b 0: No Vector Extension (MVE) - - \b 1: Integer Vector Extension (MVE-I) - - \b 2: Floating-point Vector Extension (MVE-F) - */ -__STATIC_INLINE uint32_t SCB_GetMVEType(void) -{ - const uint32_t mvfr1 = FPU->MVFR1; - if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x2U << FPU_MVFR1_MVE_Pos)) - { - return 2U; - } - else if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x1U << FPU_MVFR1_MVE_Pos)) - { - return 1U; - } - else - { - return 0U; - } -} - - -/*@} end of CMSIS_Core_MveFunctions */ - - -/* ########################## Cache functions #################################### */ - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) -#include "cachel1_armv7.h" -#endif - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## 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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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 */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, 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 __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM55_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm7.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm7.h deleted file mode 100644 index 010506e..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm7.h +++ /dev/null @@ -1,2366 +0,0 @@ -/**************************************************************************//** - * @file core_cm7.h - * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File - * @version V5.1.6 - * @date 04. June 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 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_CM7_H_GENERIC -#define __CORE_CM7_H_GENERIC - -#include - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M7 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM7 definitions */ -#define __CM7_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __CM7_CMSIS_VERSION_SUB ( __CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16U) | \ - __CM7_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_M (7U) /*!< Cortex-M Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM7_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM7_H_DEPENDANT -#define __CORE_CM7_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM7_REV - #define __CM7_REV 0x0000U - #warning "__CM7_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DTCM_PRESENT - #define __DTCM_PRESENT 0U - #warning "__DTCM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #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 - - IO Type Qualifiers 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_M7 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core FPU 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:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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 */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 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 nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV 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[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} 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 */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __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 */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[1U]; - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - uint32_t RESERVED3[93U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ - uint32_t RESERVED7[5U]; - __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ - __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ - __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ - __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ - uint32_t RESERVED8[1U]; - __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status 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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE 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 Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF 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_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP 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 */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET 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_BP_Pos 18U /*!< SCB CCR: Branch prediction enable bit Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: Branch prediction enable bit Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: Instruction cache enable bit Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: Instruction cache enable bit Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: Cache enable bit Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: Cache enable bit Mask */ - -#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_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/* Instruction Tightly-Coupled Memory Control Register Definitions */ -#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ -#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ - -#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ -#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ - -#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ -#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ - -#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ -#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ - -/* Data Tightly-Coupled Memory Control Register Definitions */ -#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ -#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ - -#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ -#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ - -#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ -#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ - -#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ -#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ - -/* AHBP Control Register Definitions */ -#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ -#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ - -#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ -#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ - -/* L1 Cache Control Register Definitions */ -#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ -#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ - -#define SCB_CACR_ECCEN_Pos 1U /*!< \deprecated SCB CACR: ECCEN Position */ -#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< \deprecated SCB CACR: ECCEN Mask */ - -#define SCB_CACR_ECCDIS_Pos 1U /*!< SCB CACR: ECCDIS Position */ -#define SCB_CACR_ECCDIS_Msk (1UL << SCB_CACR_ECCDIS_Pos) /*!< SCB CACR: ECCDIS Mask */ - -#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ -#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ - -/* AHBS Control Register Definitions */ -#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ -#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBSCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ - -#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ -#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBSCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ - -#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ -#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBSCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ - -/* Auxiliary Bus Fault Status Register Definitions */ -#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ -#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ - -#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ -#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ - -#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ -#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ - -#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ -#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ - -#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ -#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ - -#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ -#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM 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[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISDYNADD_Pos 26U /*!< ACTLR: DISDYNADD Position */ -#define SCnSCB_ACTLR_DISDYNADD_Msk (1UL << SCnSCB_ACTLR_DISDYNADD_Pos) /*!< ACTLR: DISDYNADD Mask */ - -#define SCnSCB_ACTLR_DISISSCH1_Pos 21U /*!< ACTLR: DISISSCH1 Position */ -#define SCnSCB_ACTLR_DISISSCH1_Msk (0x1FUL << SCnSCB_ACTLR_DISISSCH1_Pos) /*!< ACTLR: DISISSCH1 Mask */ - -#define SCnSCB_ACTLR_DISDI_Pos 16U /*!< ACTLR: DISDI Position */ -#define SCnSCB_ACTLR_DISDI_Msk (0x1FUL << SCnSCB_ACTLR_DISDI_Pos) /*!< ACTLR: DISDI Mask */ - -#define SCnSCB_ACTLR_DISCRITAXIRUR_Pos 15U /*!< ACTLR: DISCRITAXIRUR Position */ -#define SCnSCB_ACTLR_DISCRITAXIRUR_Msk (1UL << SCnSCB_ACTLR_DISCRITAXIRUR_Pos) /*!< ACTLR: DISCRITAXIRUR Mask */ - -#define SCnSCB_ACTLR_DISBTACALLOC_Pos 14U /*!< ACTLR: DISBTACALLOC Position */ -#define SCnSCB_ACTLR_DISBTACALLOC_Msk (1UL << SCnSCB_ACTLR_DISBTACALLOC_Pos) /*!< ACTLR: DISBTACALLOC Mask */ - -#define SCnSCB_ACTLR_DISBTACREAD_Pos 13U /*!< ACTLR: DISBTACREAD Position */ -#define SCnSCB_ACTLR_DISBTACREAD_Msk (1UL << SCnSCB_ACTLR_DISBTACREAD_Pos) /*!< ACTLR: DISBTACREAD Mask */ - -#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ -#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (1UL << SCnSCB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ - -#define SCnSCB_ACTLR_DISRAMODE_Pos 11U /*!< ACTLR: DISRAMODE Position */ -#define SCnSCB_ACTLR_DISRAMODE_Msk (1UL << SCnSCB_ACTLR_DISRAMODE_Pos) /*!< ACTLR: DISRAMODE Mask */ - -#define SCnSCB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ -#define SCnSCB_ACTLR_FPEXCODIS_Msk (1UL << SCnSCB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT 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_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED3[981U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( W) Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ -#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ - -#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ -#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ -#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ - -#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ -#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and FP Feature Register 2 Definitions */ - -#define FPU_MVFR2_VFP_Misc_Pos 4U /*!< MVFR2: VFP Misc bits Position */ -#define FPU_MVFR2_VFP_Misc_Msk (0xFUL << FPU_MVFR2_VFP_Misc_Pos) /*!< MVFR2: VFP Misc bits Mask */ - -/*@} end of group CMSIS_FPU */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} 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 ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug 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 */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ -#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug 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 - #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 */ -#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ -#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ -#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \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) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \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[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \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[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (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. - VTOR must been relocated to SRAM before. - \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 *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \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 *)SCB->VTOR; - 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 = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv7.h" - -#endif - - -/* ########################## 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) -{ - uint32_t mvfr0; - - mvfr0 = SCB->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - -/*@} end of CMSIS_Core_FpuFunctions */ - - -/* ########################## Cache functions #################################### */ - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) -#include "cachel1_armv7.h" -#endif - - -/* ################################## 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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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 */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM7_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm85.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm85.h deleted file mode 100644 index 6046311..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_cm85.h +++ /dev/null @@ -1,4672 +0,0 @@ -/**************************************************************************//** - * @file core_cm85.h - * @brief CMSIS Cortex-M85 Core Peripheral Access Layer Header File - * @version V1.0.4 - * @date 21. April 2022 - ******************************************************************************/ -/* - * Copyright (c) 2022 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 */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_CM85_H_GENERIC -#define __CORE_CM85_H_GENERIC - -#include - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M85 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS CM85 definitions */ - -#define __CORTEX_M (85U) /*!< Cortex-M Core */ - -#if defined ( __CC_ARM ) - #error Legacy Arm Compiler does not support Armv8.1-M target architecture. -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined(__ARM_FEATURE_DSP) - #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM85_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM85_H_DEPENDANT -#define __CORE_CM85_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM85_REV - #define __CM85_REV 0x0001U - #warning "__CM85_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #if __FPU_PRESENT != 0U - #ifndef __FPU_DP - #define __FPU_DP 0U - #warning "__FPU_DP not defined in device header file; using default!" - #endif - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __PMU_PRESENT - #define __PMU_PRESENT 0U - #warning "__PMU_PRESENT not defined in device header file; using default!" - #endif - - #if __PMU_PRESENT != 0U - #ifndef __PMU_NUM_EVENTCNT - #define __PMU_NUM_EVENTCNT 8U - #warning "__PMU_NUM_EVENTCNT not defined in device header file; using default!" - #elif (__PMU_NUM_EVENTCNT > 8 || __PMU_NUM_EVENTCNT < 2) - #error "__PMU_NUM_EVENTCNT is out of range in device header file!" */ - #endif - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #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 - - IO Type Qualifiers 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_M85 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core EWIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core PMU Register - - Core MPU Register - - Core SAU Register - - Core FPU 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:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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 */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:1; /*!< bit: 20 Reserved */ - uint32_t B:1; /*!< bit: 21 BTI active (read 0) */ - uint32_t _reserved2:2; /*!< bit: 22..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_B_Pos 21U /*!< xPSR: B Position */ -#define xPSR_B_Msk (1UL << xPSR_B_Pos) /*!< xPSR: B Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE 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 nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t BTI_EN:1; /*!< bit: 4 Privileged branch target identification enable */ - uint32_t UBTI_EN:1; /*!< bit: 5 Unprivileged branch target identification enable */ - uint32_t PAC_EN:1; /*!< bit: 6 Privileged pointer authentication enable */ - uint32_t UPAC_EN:1; /*!< bit: 7 Unprivileged pointer authentication enable */ - uint32_t _reserved1:24; /*!< bit: 8..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_UPAC_EN_Pos 7U /*!< CONTROL: UPAC_EN Position */ -#define CONTROL_UPAC_EN_Msk (1UL << CONTROL_UPAC_EN_Pos) /*!< CONTROL: UPAC_EN Mask */ - -#define CONTROL_PAC_EN_Pos 6U /*!< CONTROL: PAC_EN Position */ -#define CONTROL_PAC_EN_Msk (1UL << CONTROL_PAC_EN_Pos) /*!< CONTROL: PAC_EN Mask */ - -#define CONTROL_UBTI_EN_Pos 5U /*!< CONTROL: UBTI_EN Position */ -#define CONTROL_UBTI_EN_Msk (1UL << CONTROL_UBTI_EN_Pos) /*!< CONTROL: UBTI_EN Mask */ - -#define CONTROL_BTI_EN_Pos 4U /*!< CONTROL: BTI_EN Position */ -#define CONTROL_BTI_EN_Msk (1UL << CONTROL_BTI_EN_Pos) /*!< CONTROL: BTI_EN Mask */ - -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV 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[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} 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 */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __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 */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED7[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - __IOM uint32_t RFSR; /*!< Offset: 0x204 (R/W) RAS Fault Status Register */ - uint32_t RESERVED4[14U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ -} 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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE 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 Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF 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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_IESB_Pos 5U /*!< SCB AIRCR: Implicit ESB Enable Position */ -#define SCB_AIRCR_IESB_Msk (1UL << SCB_AIRCR_IESB_Pos) /*!< SCB AIRCR: Implicit ESB Enable Mask */ - -#define SCB_AIRCR_DIT_Pos 4U /*!< SCB AIRCR: Data Independent Timing Position */ -#define SCB_AIRCR_DIT_Msk (1UL << SCB_AIRCR_DIT_Pos) /*!< SCB AIRCR: Data Independent Timing Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_TRD_Pos 20U /*!< SCB CCR: TRD Position */ -#define SCB_CCR_TRD_Msk (1UL << SCB_CCR_TRD_Pos) /*!< SCB CCR: TRD Mask */ - -#define SCB_CCR_LOB_Pos 19U /*!< SCB CCR: LOB Position */ -#define SCB_CCR_LOB_Msk (1UL << SCB_CCR_LOB_Pos) /*!< SCB CCR: LOB Mask */ - -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_PMU_Pos 5U /*!< SCB DFSR: PMU Position */ -#define SCB_DFSR_PMU_Msk (1UL << SCB_DFSR_PMU_Pos) /*!< SCB DFSR: PMU Mask */ - -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CP7_Pos 7U /*!< SCB NSACR: CP7 Position */ -#define SCB_NSACR_CP7_Msk (1UL << SCB_NSACR_CP7_Pos) /*!< SCB NSACR: CP7 Mask */ - -#define SCB_NSACR_CP6_Pos 6U /*!< SCB NSACR: CP6 Position */ -#define SCB_NSACR_CP6_Msk (1UL << SCB_NSACR_CP6_Pos) /*!< SCB NSACR: CP6 Mask */ - -#define SCB_NSACR_CP5_Pos 5U /*!< SCB NSACR: CP5 Position */ -#define SCB_NSACR_CP5_Msk (1UL << SCB_NSACR_CP5_Pos) /*!< SCB NSACR: CP5 Mask */ - -#define SCB_NSACR_CP4_Pos 4U /*!< SCB NSACR: CP4 Position */ -#define SCB_NSACR_CP4_Msk (1UL << SCB_NSACR_CP4_Pos) /*!< SCB NSACR: CP4 Mask */ - -#define SCB_NSACR_CP3_Pos 3U /*!< SCB NSACR: CP3 Position */ -#define SCB_NSACR_CP3_Msk (1UL << SCB_NSACR_CP3_Pos) /*!< SCB NSACR: CP3 Mask */ - -#define SCB_NSACR_CP2_Pos 2U /*!< SCB NSACR: CP2 Position */ -#define SCB_NSACR_CP2_Msk (1UL << SCB_NSACR_CP2_Pos) /*!< SCB NSACR: CP2 Mask */ - -#define SCB_NSACR_CP1_Pos 1U /*!< SCB NSACR: CP1 Position */ -#define SCB_NSACR_CP1_Msk (1UL << SCB_NSACR_CP1_Pos) /*!< SCB NSACR: CP1 Mask */ - -#define SCB_NSACR_CP0_Pos 0U /*!< SCB NSACR: CP0 Position */ -#define SCB_NSACR_CP0_Msk (1UL /*<< SCB_NSACR_CP0_Pos*/) /*!< SCB NSACR: CP0 Mask */ - -/* SCB Debug Feature Register 0 Definitions */ -#define SCB_ID_DFR_UDE_Pos 28U /*!< SCB ID_DFR: UDE Position */ -#define SCB_ID_DFR_UDE_Msk (0xFUL << SCB_ID_DFR_UDE_Pos) /*!< SCB ID_DFR: UDE Mask */ - -#define SCB_ID_DFR_MProfDbg_Pos 20U /*!< SCB ID_DFR: MProfDbg Position */ -#define SCB_ID_DFR_MProfDbg_Msk (0xFUL << SCB_ID_DFR_MProfDbg_Pos) /*!< SCB ID_DFR: MProfDbg Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB RAS Fault Status Register Definitions */ -#define SCB_RFSR_V_Pos 31U /*!< SCB RFSR: V Position */ -#define SCB_RFSR_V_Msk (1UL << SCB_RFSR_V_Pos) /*!< SCB RFSR: V Mask */ - -#define SCB_RFSR_IS_Pos 16U /*!< SCB RFSR: IS Position */ -#define SCB_RFSR_IS_Msk (0x7FFFUL << SCB_RFSR_IS_Pos) /*!< SCB RFSR: IS Mask */ - -#define SCB_RFSR_UET_Pos 0U /*!< SCB RFSR: UET Position */ -#define SCB_RFSR_UET_Msk (3UL /*<< SCB_RFSR_UET_Pos*/) /*!< SCB RFSR: UET Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ICB Implementation Control Block register (ICB) - \brief Type definitions for the Implementation Control Block Register - @{ - */ - -/** - \brief Structure type to access the Implementation Control Block (ICB). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} ICB_Type; - -/* Auxiliary Control Register Definitions */ -#define ICB_ACTLR_DISCRITAXIRUW_Pos 27U /*!< ACTLR: DISCRITAXIRUW Position */ -#define ICB_ACTLR_DISCRITAXIRUW_Msk (1UL << ICB_ACTLR_DISCRITAXIRUW_Pos) /*!< ACTLR: DISCRITAXIRUW Mask */ - -#define ICB_ACTLR_DISCRITAXIRUR_Pos 15U /*!< ACTLR: DISCRITAXIRUR Position */ -#define ICB_ACTLR_DISCRITAXIRUR_Msk (1UL << ICB_ACTLR_DISCRITAXIRUR_Pos) /*!< ACTLR: DISCRITAXIRUR Mask */ - -#define ICB_ACTLR_EVENTBUSEN_Pos 14U /*!< ACTLR: EVENTBUSEN Position */ -#define ICB_ACTLR_EVENTBUSEN_Msk (1UL << ICB_ACTLR_EVENTBUSEN_Pos) /*!< ACTLR: EVENTBUSEN Mask */ - -#define ICB_ACTLR_EVENTBUSEN_S_Pos 13U /*!< ACTLR: EVENTBUSEN_S Position */ -#define ICB_ACTLR_EVENTBUSEN_S_Msk (1UL << ICB_ACTLR_EVENTBUSEN_S_Pos) /*!< ACTLR: EVENTBUSEN_S Mask */ - -#define ICB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ -#define ICB_ACTLR_DISITMATBFLUSH_Msk (1UL << ICB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ - -#define ICB_ACTLR_DISNWAMODE_Pos 11U /*!< ACTLR: DISNWAMODE Position */ -#define ICB_ACTLR_DISNWAMODE_Msk (1UL << ICB_ACTLR_DISNWAMODE_Pos) /*!< ACTLR: DISNWAMODE Mask */ - -#define ICB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ -#define ICB_ACTLR_FPEXCODIS_Msk (1UL << ICB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ - -/* Interrupt Controller Type Register Definitions */ -#define ICB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define ICB_ICTR_INTLINESNUM_Msk (0xFUL /*<< ICB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_ICB */ - - -/** - \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_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[3U]; - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) ITM Device Type Register */ - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup MemSysCtl_Type Memory System Control Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Memory System Control Registers (MEMSYSCTL) - @{ - */ - -/** - \brief Structure type to access the Memory System Control Registers (MEMSYSCTL). - */ -typedef struct -{ - __IOM uint32_t MSCR; /*!< Offset: 0x000 (R/W) Memory System Control Register */ - __IOM uint32_t PFCR; /*!< Offset: 0x004 (R/W) Prefetcher Control Register */ - uint32_t RESERVED1[2U]; - __IOM uint32_t ITCMCR; /*!< Offset: 0x010 (R/W) ITCM Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x014 (R/W) DTCM Control Register */ - __IOM uint32_t PAHBCR; /*!< Offset: 0x018 (R/W) P-AHB Control Register */ - uint32_t RESERVED2[313U]; - __IOM uint32_t ITGU_CTRL; /*!< Offset: 0x500 (R/W) ITGU Control Register */ - __IOM uint32_t ITGU_CFG; /*!< Offset: 0x504 (R/W) ITGU Configuration Register */ - uint32_t RESERVED3[2U]; - __IOM uint32_t ITGU_LUT[16U]; /*!< Offset: 0x510 (R/W) ITGU Look Up Table Register */ - uint32_t RESERVED4[44U]; - __IOM uint32_t DTGU_CTRL; /*!< Offset: 0x600 (R/W) DTGU Control Registers */ - __IOM uint32_t DTGU_CFG; /*!< Offset: 0x604 (R/W) DTGU Configuration Register */ - uint32_t RESERVED5[2U]; - __IOM uint32_t DTGU_LUT[16U]; /*!< Offset: 0x610 (R/W) DTGU Look Up Table Register */ -} MemSysCtl_Type; - -/* MEMSYSCTL Memory System Control Register (MSCR) Register Definitions */ -#define MEMSYSCTL_MSCR_CPWRDN_Pos 17U /*!< MEMSYSCTL MSCR: CPWRDN Position */ -#define MEMSYSCTL_MSCR_CPWRDN_Msk (0x1UL << MEMSYSCTL_MSCR_CPWRDN_Pos) /*!< MEMSYSCTL MSCR: CPWRDN Mask */ - -#define MEMSYSCTL_MSCR_DCCLEAN_Pos 16U /*!< MEMSYSCTL MSCR: DCCLEAN Position */ -#define MEMSYSCTL_MSCR_DCCLEAN_Msk (0x1UL << MEMSYSCTL_MSCR_DCCLEAN_Pos) /*!< MEMSYSCTL MSCR: DCCLEAN Mask */ - -#define MEMSYSCTL_MSCR_ICACTIVE_Pos 13U /*!< MEMSYSCTL MSCR: ICACTIVE Position */ -#define MEMSYSCTL_MSCR_ICACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_ICACTIVE_Pos) /*!< MEMSYSCTL MSCR: ICACTIVE Mask */ - -#define MEMSYSCTL_MSCR_DCACTIVE_Pos 12U /*!< MEMSYSCTL MSCR: DCACTIVE Position */ -#define MEMSYSCTL_MSCR_DCACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_DCACTIVE_Pos) /*!< MEMSYSCTL MSCR: DCACTIVE Mask */ - -#define MEMSYSCTL_MSCR_EVECCFAULT_Pos 3U /*!< MEMSYSCTL MSCR: EVECCFAULT Position */ -#define MEMSYSCTL_MSCR_EVECCFAULT_Msk (0x1UL << MEMSYSCTL_MSCR_EVECCFAULT_Pos) /*!< MEMSYSCTL MSCR: EVECCFAULT Mask */ - -#define MEMSYSCTL_MSCR_FORCEWT_Pos 2U /*!< MEMSYSCTL MSCR: FORCEWT Position */ -#define MEMSYSCTL_MSCR_FORCEWT_Msk (0x1UL << MEMSYSCTL_MSCR_FORCEWT_Pos) /*!< MEMSYSCTL MSCR: FORCEWT Mask */ - -#define MEMSYSCTL_MSCR_ECCEN_Pos 1U /*!< MEMSYSCTL MSCR: ECCEN Position */ -#define MEMSYSCTL_MSCR_ECCEN_Msk (0x1UL << MEMSYSCTL_MSCR_ECCEN_Pos) /*!< MEMSYSCTL MSCR: ECCEN Mask */ - -/* MEMSYSCTL Prefetcher Control Register (PFCR) Register Definitions */ -#define MEMSYSCTL_PFCR_DIS_NLP_Pos 7U /*!< MEMSYSCTL PFCR: DIS_NLP Position */ -#define MEMSYSCTL_PFCR_DIS_NLP_Msk (0x1UL << MEMSYSCTL_PFCR_DIS_NLP_Pos) /*!< MEMSYSCTL PFCR: DIS_NLP Mask */ - -#define MEMSYSCTL_PFCR_ENABLE_Pos 0U /*!< MEMSYSCTL PFCR: ENABLE Position */ -#define MEMSYSCTL_PFCR_ENABLE_Msk (0x1UL /*<< MEMSYSCTL_PFCR_ENABLE_Pos*/) /*!< MEMSYSCTL PFCR: ENABLE Mask */ - -/* MEMSYSCTL ITCM Control Register (ITCMCR) Register Definitions */ -#define MEMSYSCTL_ITCMCR_SZ_Pos 3U /*!< MEMSYSCTL ITCMCR: SZ Position */ -#define MEMSYSCTL_ITCMCR_SZ_Msk (0xFUL << MEMSYSCTL_ITCMCR_SZ_Pos) /*!< MEMSYSCTL ITCMCR: SZ Mask */ - -#define MEMSYSCTL_ITCMCR_EN_Pos 0U /*!< MEMSYSCTL ITCMCR: EN Position */ -#define MEMSYSCTL_ITCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_ITCMCR_EN_Pos*/) /*!< MEMSYSCTL ITCMCR: EN Mask */ - -/* MEMSYSCTL DTCM Control Register (DTCMCR) Register Definitions */ -#define MEMSYSCTL_DTCMCR_SZ_Pos 3U /*!< MEMSYSCTL DTCMCR: SZ Position */ -#define MEMSYSCTL_DTCMCR_SZ_Msk (0xFUL << MEMSYSCTL_DTCMCR_SZ_Pos) /*!< MEMSYSCTL DTCMCR: SZ Mask */ - -#define MEMSYSCTL_DTCMCR_EN_Pos 0U /*!< MEMSYSCTL DTCMCR: EN Position */ -#define MEMSYSCTL_DTCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_DTCMCR_EN_Pos*/) /*!< MEMSYSCTL DTCMCR: EN Mask */ - -/* MEMSYSCTL P-AHB Control Register (PAHBCR) Register Definitions */ -#define MEMSYSCTL_PAHBCR_SZ_Pos 1U /*!< MEMSYSCTL PAHBCR: SZ Position */ -#define MEMSYSCTL_PAHBCR_SZ_Msk (0x7UL << MEMSYSCTL_PAHBCR_SZ_Pos) /*!< MEMSYSCTL PAHBCR: SZ Mask */ - -#define MEMSYSCTL_PAHBCR_EN_Pos 0U /*!< MEMSYSCTL PAHBCR: EN Position */ -#define MEMSYSCTL_PAHBCR_EN_Msk (0x1UL /*<< MEMSYSCTL_PAHBCR_EN_Pos*/) /*!< MEMSYSCTL PAHBCR: EN Mask */ - -/* MEMSYSCTL ITGU Control Register (ITGU_CTRL) Register Definitions */ -#define MEMSYSCTL_ITGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL ITGU_CTRL: DEREN Position */ -#define MEMSYSCTL_ITGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_ITGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL ITGU_CTRL: DEREN Mask */ - -#define MEMSYSCTL_ITGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL ITGU_CTRL: DBFEN Position */ -#define MEMSYSCTL_ITGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_ITGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL ITGU_CTRL: DBFEN Mask */ - -/* MEMSYSCTL ITGU Configuration Register (ITGU_CFG) Register Definitions */ -#define MEMSYSCTL_ITGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL ITGU_CFG: PRESENT Position */ -#define MEMSYSCTL_ITGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_ITGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL ITGU_CFG: PRESENT Mask */ - -#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Position */ -#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Mask */ - -#define MEMSYSCTL_ITGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL ITGU_CFG: BLKSZ Position */ -#define MEMSYSCTL_ITGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_ITGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL ITGU_CFG: BLKSZ Mask */ - -/* MEMSYSCTL DTGU Control Registers (DTGU_CTRL) Register Definitions */ -#define MEMSYSCTL_DTGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL DTGU_CTRL: DEREN Position */ -#define MEMSYSCTL_DTGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_DTGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL DTGU_CTRL: DEREN Mask */ - -#define MEMSYSCTL_DTGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL DTGU_CTRL: DBFEN Position */ -#define MEMSYSCTL_DTGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_DTGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL DTGU_CTRL: DBFEN Mask */ - -/* MEMSYSCTL DTGU Configuration Register (DTGU_CFG) Register Definitions */ -#define MEMSYSCTL_DTGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL DTGU_CFG: PRESENT Position */ -#define MEMSYSCTL_DTGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_DTGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL DTGU_CFG: PRESENT Mask */ - -#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Position */ -#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Mask */ - -#define MEMSYSCTL_DTGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL DTGU_CFG: BLKSZ Position */ -#define MEMSYSCTL_DTGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_DTGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL DTGU_CFG: BLKSZ Mask */ - - -/*@}*/ /* end of group MemSysCtl_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup PwrModCtl_Type Power Mode Control Registers - \brief Type definitions for the Power Mode Control Registers (PWRMODCTL) - @{ - */ - -/** - \brief Structure type to access the Power Mode Control Registers (PWRMODCTL). - */ -typedef struct -{ - __IOM uint32_t CPDLPSTATE; /*!< Offset: 0x000 (R/W) Core Power Domain Low Power State Register */ - __IOM uint32_t DPDLPSTATE; /*!< Offset: 0x004 (R/W) Debug Power Domain Low Power State Register */ -} PwrModCtl_Type; - -/* PWRMODCTL Core Power Domain Low Power State (CPDLPSTATE) Register Definitions */ -#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos 8U /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Mask */ - -#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos 4U /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Mask */ - -#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos 0U /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Position */ -#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Msk (0x3UL /*<< PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos*/) /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Mask */ - -/* PWRMODCTL Debug Power Domain Low Power State (DPDLPSTATE) Register Definitions */ -#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos 0U /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Position */ -#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Msk (0x3UL /*<< PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos*/) /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Mask */ - -/*@}*/ /* end of group PwrModCtl_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup EWIC_Type External Wakeup Interrupt Controller Registers - \brief Type definitions for the External Wakeup Interrupt Controller Registers (EWIC) - @{ - */ - -/** - \brief Structure type to access the External Wakeup Interrupt Controller Registers (EWIC). - */ -typedef struct -{ - __OM uint32_t EVENTSPR; /*!< Offset: 0x000 ( /W) Event Set Pending Register */ - uint32_t RESERVED0[31U]; - __IM uint32_t EVENTMASKA; /*!< Offset: 0x080 (R/W) Event Mask A Register */ - __IM uint32_t EVENTMASK[15]; /*!< Offset: 0x084 (R/W) Event Mask Register */ -} EWIC_Type; - -/* EWIC External Wakeup Interrupt Controller (EVENTSPR) Register Definitions */ -#define EWIC_EVENTSPR_EDBGREQ_Pos 2U /*!< EWIC EVENTSPR: EDBGREQ Position */ -#define EWIC_EVENTSPR_EDBGREQ_Msk (0x1UL << EWIC_EVENTSPR_EDBGREQ_Pos) /*!< EWIC EVENTSPR: EDBGREQ Mask */ - -#define EWIC_EVENTSPR_NMI_Pos 1U /*!< EWIC EVENTSPR: NMI Position */ -#define EWIC_EVENTSPR_NMI_Msk (0x1UL << EWIC_EVENTSPR_NMI_Pos) /*!< EWIC EVENTSPR: NMI Mask */ - -#define EWIC_EVENTSPR_EVENT_Pos 0U /*!< EWIC EVENTSPR: EVENT Position */ -#define EWIC_EVENTSPR_EVENT_Msk (0x1UL /*<< EWIC_EVENTSPR_EVENT_Pos*/) /*!< EWIC EVENTSPR: EVENT Mask */ - -/* EWIC External Wakeup Interrupt Controller (EVENTMASKA) Register Definitions */ -#define EWIC_EVENTMASKA_EDBGREQ_Pos 2U /*!< EWIC EVENTMASKA: EDBGREQ Position */ -#define EWIC_EVENTMASKA_EDBGREQ_Msk (0x1UL << EWIC_EVENTMASKA_EDBGREQ_Pos) /*!< EWIC EVENTMASKA: EDBGREQ Mask */ - -#define EWIC_EVENTMASKA_NMI_Pos 1U /*!< EWIC EVENTMASKA: NMI Position */ -#define EWIC_EVENTMASKA_NMI_Msk (0x1UL << EWIC_EVENTMASKA_NMI_Pos) /*!< EWIC EVENTMASKA: NMI Mask */ - -#define EWIC_EVENTMASKA_EVENT_Pos 0U /*!< EWIC EVENTMASKA: EVENT Position */ -#define EWIC_EVENTMASKA_EVENT_Msk (0x1UL /*<< EWIC_EVENTMASKA_EVENT_Pos*/) /*!< EWIC EVENTMASKA: EVENT Mask */ - -/* EWIC External Wakeup Interrupt Controller (EVENTMASK) Register Definitions */ -#define EWIC_EVENTMASK_IRQ_Pos 0U /*!< EWIC EVENTMASKA: IRQ Position */ -#define EWIC_EVENTMASK_IRQ_Msk (0xFFFFFFFFUL /*<< EWIC_EVENTMASKA_IRQ_Pos*/) /*!< EWIC EVENTMASKA: IRQ Mask */ - -/*@}*/ /* end of group EWIC_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup ErrBnk_Type Error Banking Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Error Banking Registers (ERRBNK) - @{ - */ - -/** - \brief Structure type to access the Error Banking Registers (ERRBNK). - */ -typedef struct -{ - __IOM uint32_t IEBR0; /*!< Offset: 0x000 (R/W) Instruction Cache Error Bank Register 0 */ - __IOM uint32_t IEBR1; /*!< Offset: 0x004 (R/W) Instruction Cache Error Bank Register 1 */ - uint32_t RESERVED0[2U]; - __IOM uint32_t DEBR0; /*!< Offset: 0x010 (R/W) Data Cache Error Bank Register 0 */ - __IOM uint32_t DEBR1; /*!< Offset: 0x014 (R/W) Data Cache Error Bank Register 1 */ - uint32_t RESERVED1[2U]; - __IOM uint32_t TEBR0; /*!< Offset: 0x020 (R/W) TCM Error Bank Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t TEBR1; /*!< Offset: 0x028 (R/W) TCM Error Bank Register 1 */ -} ErrBnk_Type; - -/* ERRBNK Instruction Cache Error Bank Register 0 (IEBR0) Register Definitions */ -#define ERRBNK_IEBR0_SWDEF_Pos 30U /*!< ERRBNK IEBR0: SWDEF Position */ -#define ERRBNK_IEBR0_SWDEF_Msk (0x3UL << ERRBNK_IEBR0_SWDEF_Pos) /*!< ERRBNK IEBR0: SWDEF Mask */ - -#define ERRBNK_IEBR0_BANK_Pos 16U /*!< ERRBNK IEBR0: BANK Position */ -#define ERRBNK_IEBR0_BANK_Msk (0x1UL << ERRBNK_IEBR0_BANK_Pos) /*!< ERRBNK IEBR0: BANK Mask */ - -#define ERRBNK_IEBR0_LOCATION_Pos 2U /*!< ERRBNK IEBR0: LOCATION Position */ -#define ERRBNK_IEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR0_LOCATION_Pos) /*!< ERRBNK IEBR0: LOCATION Mask */ - -#define ERRBNK_IEBR0_LOCKED_Pos 1U /*!< ERRBNK IEBR0: LOCKED Position */ -#define ERRBNK_IEBR0_LOCKED_Msk (0x1UL << ERRBNK_IEBR0_LOCKED_Pos) /*!< ERRBNK IEBR0: LOCKED Mask */ - -#define ERRBNK_IEBR0_VALID_Pos 0U /*!< ERRBNK IEBR0: VALID Position */ -#define ERRBNK_IEBR0_VALID_Msk (0x1UL << /*ERRBNK_IEBR0_VALID_Pos*/) /*!< ERRBNK IEBR0: VALID Mask */ - -/* ERRBNK Instruction Cache Error Bank Register 1 (IEBR1) Register Definitions */ -#define ERRBNK_IEBR1_SWDEF_Pos 30U /*!< ERRBNK IEBR1: SWDEF Position */ -#define ERRBNK_IEBR1_SWDEF_Msk (0x3UL << ERRBNK_IEBR1_SWDEF_Pos) /*!< ERRBNK IEBR1: SWDEF Mask */ - -#define ERRBNK_IEBR1_BANK_Pos 16U /*!< ERRBNK IEBR1: BANK Position */ -#define ERRBNK_IEBR1_BANK_Msk (0x1UL << ERRBNK_IEBR1_BANK_Pos) /*!< ERRBNK IEBR1: BANK Mask */ - -#define ERRBNK_IEBR1_LOCATION_Pos 2U /*!< ERRBNK IEBR1: LOCATION Position */ -#define ERRBNK_IEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR1_LOCATION_Pos) /*!< ERRBNK IEBR1: LOCATION Mask */ - -#define ERRBNK_IEBR1_LOCKED_Pos 1U /*!< ERRBNK IEBR1: LOCKED Position */ -#define ERRBNK_IEBR1_LOCKED_Msk (0x1UL << ERRBNK_IEBR1_LOCKED_Pos) /*!< ERRBNK IEBR1: LOCKED Mask */ - -#define ERRBNK_IEBR1_VALID_Pos 0U /*!< ERRBNK IEBR1: VALID Position */ -#define ERRBNK_IEBR1_VALID_Msk (0x1UL << /*ERRBNK_IEBR1_VALID_Pos*/) /*!< ERRBNK IEBR1: VALID Mask */ - -/* ERRBNK Data Cache Error Bank Register 0 (DEBR0) Register Definitions */ -#define ERRBNK_DEBR0_SWDEF_Pos 30U /*!< ERRBNK DEBR0: SWDEF Position */ -#define ERRBNK_DEBR0_SWDEF_Msk (0x3UL << ERRBNK_DEBR0_SWDEF_Pos) /*!< ERRBNK DEBR0: SWDEF Mask */ - -#define ERRBNK_DEBR0_TYPE_Pos 17U /*!< ERRBNK DEBR0: TYPE Position */ -#define ERRBNK_DEBR0_TYPE_Msk (0x1UL << ERRBNK_DEBR0_TYPE_Pos) /*!< ERRBNK DEBR0: TYPE Mask */ - -#define ERRBNK_DEBR0_BANK_Pos 16U /*!< ERRBNK DEBR0: BANK Position */ -#define ERRBNK_DEBR0_BANK_Msk (0x1UL << ERRBNK_DEBR0_BANK_Pos) /*!< ERRBNK DEBR0: BANK Mask */ - -#define ERRBNK_DEBR0_LOCATION_Pos 2U /*!< ERRBNK DEBR0: LOCATION Position */ -#define ERRBNK_DEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR0_LOCATION_Pos) /*!< ERRBNK DEBR0: LOCATION Mask */ - -#define ERRBNK_DEBR0_LOCKED_Pos 1U /*!< ERRBNK DEBR0: LOCKED Position */ -#define ERRBNK_DEBR0_LOCKED_Msk (0x1UL << ERRBNK_DEBR0_LOCKED_Pos) /*!< ERRBNK DEBR0: LOCKED Mask */ - -#define ERRBNK_DEBR0_VALID_Pos 0U /*!< ERRBNK DEBR0: VALID Position */ -#define ERRBNK_DEBR0_VALID_Msk (0x1UL << /*ERRBNK_DEBR0_VALID_Pos*/) /*!< ERRBNK DEBR0: VALID Mask */ - -/* ERRBNK Data Cache Error Bank Register 1 (DEBR1) Register Definitions */ -#define ERRBNK_DEBR1_SWDEF_Pos 30U /*!< ERRBNK DEBR1: SWDEF Position */ -#define ERRBNK_DEBR1_SWDEF_Msk (0x3UL << ERRBNK_DEBR1_SWDEF_Pos) /*!< ERRBNK DEBR1: SWDEF Mask */ - -#define ERRBNK_DEBR1_TYPE_Pos 17U /*!< ERRBNK DEBR1: TYPE Position */ -#define ERRBNK_DEBR1_TYPE_Msk (0x1UL << ERRBNK_DEBR1_TYPE_Pos) /*!< ERRBNK DEBR1: TYPE Mask */ - -#define ERRBNK_DEBR1_BANK_Pos 16U /*!< ERRBNK DEBR1: BANK Position */ -#define ERRBNK_DEBR1_BANK_Msk (0x1UL << ERRBNK_DEBR1_BANK_Pos) /*!< ERRBNK DEBR1: BANK Mask */ - -#define ERRBNK_DEBR1_LOCATION_Pos 2U /*!< ERRBNK DEBR1: LOCATION Position */ -#define ERRBNK_DEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR1_LOCATION_Pos) /*!< ERRBNK DEBR1: LOCATION Mask */ - -#define ERRBNK_DEBR1_LOCKED_Pos 1U /*!< ERRBNK DEBR1: LOCKED Position */ -#define ERRBNK_DEBR1_LOCKED_Msk (0x1UL << ERRBNK_DEBR1_LOCKED_Pos) /*!< ERRBNK DEBR1: LOCKED Mask */ - -#define ERRBNK_DEBR1_VALID_Pos 0U /*!< ERRBNK DEBR1: VALID Position */ -#define ERRBNK_DEBR1_VALID_Msk (0x1UL << /*ERRBNK_DEBR1_VALID_Pos*/) /*!< ERRBNK DEBR1: VALID Mask */ - -/* ERRBNK TCM Error Bank Register 0 (TEBR0) Register Definitions */ -#define ERRBNK_TEBR0_SWDEF_Pos 30U /*!< ERRBNK TEBR0: SWDEF Position */ -#define ERRBNK_TEBR0_SWDEF_Msk (0x3UL << ERRBNK_TEBR0_SWDEF_Pos) /*!< ERRBNK TEBR0: SWDEF Mask */ - -#define ERRBNK_TEBR0_POISON_Pos 28U /*!< ERRBNK TEBR0: POISON Position */ -#define ERRBNK_TEBR0_POISON_Msk (0x1UL << ERRBNK_TEBR0_POISON_Pos) /*!< ERRBNK TEBR0: POISON Mask */ - -#define ERRBNK_TEBR0_TYPE_Pos 27U /*!< ERRBNK TEBR0: TYPE Position */ -#define ERRBNK_TEBR0_TYPE_Msk (0x1UL << ERRBNK_TEBR0_TYPE_Pos) /*!< ERRBNK TEBR0: TYPE Mask */ - -#define ERRBNK_TEBR0_BANK_Pos 24U /*!< ERRBNK TEBR0: BANK Position */ -#define ERRBNK_TEBR0_BANK_Msk (0x3UL << ERRBNK_TEBR0_BANK_Pos) /*!< ERRBNK TEBR0: BANK Mask */ - -#define ERRBNK_TEBR0_LOCATION_Pos 2U /*!< ERRBNK TEBR0: LOCATION Position */ -#define ERRBNK_TEBR0_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR0_LOCATION_Pos) /*!< ERRBNK TEBR0: LOCATION Mask */ - -#define ERRBNK_TEBR0_LOCKED_Pos 1U /*!< ERRBNK TEBR0: LOCKED Position */ -#define ERRBNK_TEBR0_LOCKED_Msk (0x1UL << ERRBNK_TEBR0_LOCKED_Pos) /*!< ERRBNK TEBR0: LOCKED Mask */ - -#define ERRBNK_TEBR0_VALID_Pos 0U /*!< ERRBNK TEBR0: VALID Position */ -#define ERRBNK_TEBR0_VALID_Msk (0x1UL << /*ERRBNK_TEBR0_VALID_Pos*/) /*!< ERRBNK TEBR0: VALID Mask */ - -/* ERRBNK TCM Error Bank Register 1 (TEBR1) Register Definitions */ -#define ERRBNK_TEBR1_SWDEF_Pos 30U /*!< ERRBNK TEBR1: SWDEF Position */ -#define ERRBNK_TEBR1_SWDEF_Msk (0x3UL << ERRBNK_TEBR1_SWDEF_Pos) /*!< ERRBNK TEBR1: SWDEF Mask */ - -#define ERRBNK_TEBR1_POISON_Pos 28U /*!< ERRBNK TEBR1: POISON Position */ -#define ERRBNK_TEBR1_POISON_Msk (0x1UL << ERRBNK_TEBR1_POISON_Pos) /*!< ERRBNK TEBR1: POISON Mask */ - -#define ERRBNK_TEBR1_TYPE_Pos 27U /*!< ERRBNK TEBR1: TYPE Position */ -#define ERRBNK_TEBR1_TYPE_Msk (0x1UL << ERRBNK_TEBR1_TYPE_Pos) /*!< ERRBNK TEBR1: TYPE Mask */ - -#define ERRBNK_TEBR1_BANK_Pos 24U /*!< ERRBNK TEBR1: BANK Position */ -#define ERRBNK_TEBR1_BANK_Msk (0x3UL << ERRBNK_TEBR1_BANK_Pos) /*!< ERRBNK TEBR1: BANK Mask */ - -#define ERRBNK_TEBR1_LOCATION_Pos 2U /*!< ERRBNK TEBR1: LOCATION Position */ -#define ERRBNK_TEBR1_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR1_LOCATION_Pos) /*!< ERRBNK TEBR1: LOCATION Mask */ - -#define ERRBNK_TEBR1_LOCKED_Pos 1U /*!< ERRBNK TEBR1: LOCKED Position */ -#define ERRBNK_TEBR1_LOCKED_Msk (0x1UL << ERRBNK_TEBR1_LOCKED_Pos) /*!< ERRBNK TEBR1: LOCKED Mask */ - -#define ERRBNK_TEBR1_VALID_Pos 0U /*!< ERRBNK TEBR1: VALID Position */ -#define ERRBNK_TEBR1_VALID_Msk (0x1UL << /*ERRBNK_TEBR1_VALID_Pos*/) /*!< ERRBNK TEBR1: VALID Mask */ - -/*@}*/ /* end of group ErrBnk_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup PrcCfgInf_Type Processor Configuration Information Registers (IMPLEMENTATION DEFINED) - \brief Type definitions for the Processor Configuration Information Registerss (PRCCFGINF) - @{ - */ - -/** - \brief Structure type to access the Processor Configuration Information Registerss (PRCCFGINF). - */ -typedef struct -{ - __OM uint32_t CFGINFOSEL; /*!< Offset: 0x000 ( /W) Processor Configuration Information Selection Register */ - __IM uint32_t CFGINFORD; /*!< Offset: 0x004 (R/ ) Processor Configuration Information Read Data Register */ -} PrcCfgInf_Type; - -/* PRCCFGINF Processor Configuration Information Selection Register (CFGINFOSEL) Definitions */ - -/* PRCCFGINF Processor Configuration Information Read Data Register (CFGINFORD) Definitions */ - -/*@}*/ /* end of group PrcCfgInf_Type */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[809U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ - uint32_t RESERVED4[4U]; - __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ -#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFmt_Pos 0U /*!< TPI FFCR: EnFmt Position */ -#define TPI_FFCR_EnFmt_Msk (0x3UL << /*TPI_FFCR_EnFmt_Pos*/) /*!< TPI FFCR: EnFmt Mask */ - -/* TPI Periodic Synchronization Control Register Definitions */ -#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ -#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ - -/* TPI Software Lock Status Register Definitions */ -#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ -#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ - -#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ -#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ - -#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ -#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_PMU Performance Monitoring Unit (PMU) - \brief Type definitions for the Performance Monitoring Unit (PMU) - @{ - */ - -/** - \brief Structure type to access the Performance Monitoring Unit (PMU). - */ -typedef struct -{ - __IOM uint32_t EVCNTR[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x0 (R/W) PMU Event Counter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED0[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCNTR; /*!< Offset: 0x7C (R/W) PMU Cycle Counter Register */ - uint32_t RESERVED1[224]; - __IOM uint32_t EVTYPER[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x400 (R/W) PMU Event Type and Filter Registers */ -#if __PMU_NUM_EVENTCNT<31 - uint32_t RESERVED2[31U-__PMU_NUM_EVENTCNT]; -#endif - __IOM uint32_t CCFILTR; /*!< Offset: 0x47C (R/W) PMU Cycle Counter Filter Register */ - uint32_t RESERVED3[480]; - __IOM uint32_t CNTENSET; /*!< Offset: 0xC00 (R/W) PMU Count Enable Set Register */ - uint32_t RESERVED4[7]; - __IOM uint32_t CNTENCLR; /*!< Offset: 0xC20 (R/W) PMU Count Enable Clear Register */ - uint32_t RESERVED5[7]; - __IOM uint32_t INTENSET; /*!< Offset: 0xC40 (R/W) PMU Interrupt Enable Set Register */ - uint32_t RESERVED6[7]; - __IOM uint32_t INTENCLR; /*!< Offset: 0xC60 (R/W) PMU Interrupt Enable Clear Register */ - uint32_t RESERVED7[7]; - __IOM uint32_t OVSCLR; /*!< Offset: 0xC80 (R/W) PMU Overflow Flag Status Clear Register */ - uint32_t RESERVED8[7]; - __IOM uint32_t SWINC; /*!< Offset: 0xCA0 (R/W) PMU Software Increment Register */ - uint32_t RESERVED9[7]; - __IOM uint32_t OVSSET; /*!< Offset: 0xCC0 (R/W) PMU Overflow Flag Status Set Register */ - uint32_t RESERVED10[79]; - __IOM uint32_t TYPE; /*!< Offset: 0xE00 (R/W) PMU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0xE04 (R/W) PMU Control Register */ - uint32_t RESERVED11[108]; - __IOM uint32_t AUTHSTATUS; /*!< Offset: 0xFB8 (R/W) PMU Authentication Status Register */ - __IOM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/W) PMU Device Architecture Register */ - uint32_t RESERVED12[3]; - __IOM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/W) PMU Device Type Register */ - __IOM uint32_t PIDR4; /*!< Offset: 0xFD0 (R/W) PMU Peripheral Identification Register 4 */ - uint32_t RESERVED13[3]; - __IOM uint32_t PIDR0; /*!< Offset: 0xFE0 (R/W) PMU Peripheral Identification Register 0 */ - __IOM uint32_t PIDR1; /*!< Offset: 0xFE4 (R/W) PMU Peripheral Identification Register 1 */ - __IOM uint32_t PIDR2; /*!< Offset: 0xFE8 (R/W) PMU Peripheral Identification Register 2 */ - __IOM uint32_t PIDR3; /*!< Offset: 0xFEC (R/W) PMU Peripheral Identification Register 3 */ - __IOM uint32_t CIDR0; /*!< Offset: 0xFF0 (R/W) PMU Component Identification Register 0 */ - __IOM uint32_t CIDR1; /*!< Offset: 0xFF4 (R/W) PMU Component Identification Register 1 */ - __IOM uint32_t CIDR2; /*!< Offset: 0xFF8 (R/W) PMU Component Identification Register 2 */ - __IOM uint32_t CIDR3; /*!< Offset: 0xFFC (R/W) PMU Component Identification Register 3 */ -} PMU_Type; - -/** \brief PMU Event Counter Registers (0-30) Definitions */ - -#define PMU_EVCNTR_CNT_Pos 0U /*!< PMU EVCNTR: Counter Position */ -#define PMU_EVCNTR_CNT_Msk (0xFFFFUL /*<< PMU_EVCNTRx_CNT_Pos*/) /*!< PMU EVCNTR: Counter Mask */ - -/** \brief PMU Event Type and Filter Registers (0-30) Definitions */ - -#define PMU_EVTYPER_EVENTTOCNT_Pos 0U /*!< PMU EVTYPER: Event to Count Position */ -#define PMU_EVTYPER_EVENTTOCNT_Msk (0xFFFFUL /*<< EVTYPERx_EVENTTOCNT_Pos*/) /*!< PMU EVTYPER: Event to Count Mask */ - -/** \brief PMU Count Enable Set Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENSET: Event Counter 0 Enable Set Position */ -#define PMU_CNTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENSET_CNT0_ENABLE_Pos*/) /*!< PMU CNTENSET: Event Counter 0 Enable Set Mask */ - -#define PMU_CNTENSET_CNT1_ENABLE_Pos 1U /*!< PMU CNTENSET: Event Counter 1 Enable Set Position */ -#define PMU_CNTENSET_CNT1_ENABLE_Msk (1UL << PMU_CNTENSET_CNT1_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 1 Enable Set Mask */ - -#define PMU_CNTENSET_CNT2_ENABLE_Pos 2U /*!< PMU CNTENSET: Event Counter 2 Enable Set Position */ -#define PMU_CNTENSET_CNT2_ENABLE_Msk (1UL << PMU_CNTENSET_CNT2_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 2 Enable Set Mask */ - -#define PMU_CNTENSET_CNT3_ENABLE_Pos 3U /*!< PMU CNTENSET: Event Counter 3 Enable Set Position */ -#define PMU_CNTENSET_CNT3_ENABLE_Msk (1UL << PMU_CNTENSET_CNT3_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 3 Enable Set Mask */ - -#define PMU_CNTENSET_CNT4_ENABLE_Pos 4U /*!< PMU CNTENSET: Event Counter 4 Enable Set Position */ -#define PMU_CNTENSET_CNT4_ENABLE_Msk (1UL << PMU_CNTENSET_CNT4_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 4 Enable Set Mask */ - -#define PMU_CNTENSET_CNT5_ENABLE_Pos 5U /*!< PMU CNTENSET: Event Counter 5 Enable Set Position */ -#define PMU_CNTENSET_CNT5_ENABLE_Msk (1UL << PMU_CNTENSET_CNT5_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 5 Enable Set Mask */ - -#define PMU_CNTENSET_CNT6_ENABLE_Pos 6U /*!< PMU CNTENSET: Event Counter 6 Enable Set Position */ -#define PMU_CNTENSET_CNT6_ENABLE_Msk (1UL << PMU_CNTENSET_CNT6_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 6 Enable Set Mask */ - -#define PMU_CNTENSET_CNT7_ENABLE_Pos 7U /*!< PMU CNTENSET: Event Counter 7 Enable Set Position */ -#define PMU_CNTENSET_CNT7_ENABLE_Msk (1UL << PMU_CNTENSET_CNT7_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 7 Enable Set Mask */ - -#define PMU_CNTENSET_CNT8_ENABLE_Pos 8U /*!< PMU CNTENSET: Event Counter 8 Enable Set Position */ -#define PMU_CNTENSET_CNT8_ENABLE_Msk (1UL << PMU_CNTENSET_CNT8_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 8 Enable Set Mask */ - -#define PMU_CNTENSET_CNT9_ENABLE_Pos 9U /*!< PMU CNTENSET: Event Counter 9 Enable Set Position */ -#define PMU_CNTENSET_CNT9_ENABLE_Msk (1UL << PMU_CNTENSET_CNT9_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 9 Enable Set Mask */ - -#define PMU_CNTENSET_CNT10_ENABLE_Pos 10U /*!< PMU CNTENSET: Event Counter 10 Enable Set Position */ -#define PMU_CNTENSET_CNT10_ENABLE_Msk (1UL << PMU_CNTENSET_CNT10_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 10 Enable Set Mask */ - -#define PMU_CNTENSET_CNT11_ENABLE_Pos 11U /*!< PMU CNTENSET: Event Counter 11 Enable Set Position */ -#define PMU_CNTENSET_CNT11_ENABLE_Msk (1UL << PMU_CNTENSET_CNT11_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 11 Enable Set Mask */ - -#define PMU_CNTENSET_CNT12_ENABLE_Pos 12U /*!< PMU CNTENSET: Event Counter 12 Enable Set Position */ -#define PMU_CNTENSET_CNT12_ENABLE_Msk (1UL << PMU_CNTENSET_CNT12_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 12 Enable Set Mask */ - -#define PMU_CNTENSET_CNT13_ENABLE_Pos 13U /*!< PMU CNTENSET: Event Counter 13 Enable Set Position */ -#define PMU_CNTENSET_CNT13_ENABLE_Msk (1UL << PMU_CNTENSET_CNT13_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 13 Enable Set Mask */ - -#define PMU_CNTENSET_CNT14_ENABLE_Pos 14U /*!< PMU CNTENSET: Event Counter 14 Enable Set Position */ -#define PMU_CNTENSET_CNT14_ENABLE_Msk (1UL << PMU_CNTENSET_CNT14_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 14 Enable Set Mask */ - -#define PMU_CNTENSET_CNT15_ENABLE_Pos 15U /*!< PMU CNTENSET: Event Counter 15 Enable Set Position */ -#define PMU_CNTENSET_CNT15_ENABLE_Msk (1UL << PMU_CNTENSET_CNT15_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 15 Enable Set Mask */ - -#define PMU_CNTENSET_CNT16_ENABLE_Pos 16U /*!< PMU CNTENSET: Event Counter 16 Enable Set Position */ -#define PMU_CNTENSET_CNT16_ENABLE_Msk (1UL << PMU_CNTENSET_CNT16_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 16 Enable Set Mask */ - -#define PMU_CNTENSET_CNT17_ENABLE_Pos 17U /*!< PMU CNTENSET: Event Counter 17 Enable Set Position */ -#define PMU_CNTENSET_CNT17_ENABLE_Msk (1UL << PMU_CNTENSET_CNT17_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 17 Enable Set Mask */ - -#define PMU_CNTENSET_CNT18_ENABLE_Pos 18U /*!< PMU CNTENSET: Event Counter 18 Enable Set Position */ -#define PMU_CNTENSET_CNT18_ENABLE_Msk (1UL << PMU_CNTENSET_CNT18_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 18 Enable Set Mask */ - -#define PMU_CNTENSET_CNT19_ENABLE_Pos 19U /*!< PMU CNTENSET: Event Counter 19 Enable Set Position */ -#define PMU_CNTENSET_CNT19_ENABLE_Msk (1UL << PMU_CNTENSET_CNT19_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 19 Enable Set Mask */ - -#define PMU_CNTENSET_CNT20_ENABLE_Pos 20U /*!< PMU CNTENSET: Event Counter 20 Enable Set Position */ -#define PMU_CNTENSET_CNT20_ENABLE_Msk (1UL << PMU_CNTENSET_CNT20_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 20 Enable Set Mask */ - -#define PMU_CNTENSET_CNT21_ENABLE_Pos 21U /*!< PMU CNTENSET: Event Counter 21 Enable Set Position */ -#define PMU_CNTENSET_CNT21_ENABLE_Msk (1UL << PMU_CNTENSET_CNT21_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 21 Enable Set Mask */ - -#define PMU_CNTENSET_CNT22_ENABLE_Pos 22U /*!< PMU CNTENSET: Event Counter 22 Enable Set Position */ -#define PMU_CNTENSET_CNT22_ENABLE_Msk (1UL << PMU_CNTENSET_CNT22_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 22 Enable Set Mask */ - -#define PMU_CNTENSET_CNT23_ENABLE_Pos 23U /*!< PMU CNTENSET: Event Counter 23 Enable Set Position */ -#define PMU_CNTENSET_CNT23_ENABLE_Msk (1UL << PMU_CNTENSET_CNT23_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 23 Enable Set Mask */ - -#define PMU_CNTENSET_CNT24_ENABLE_Pos 24U /*!< PMU CNTENSET: Event Counter 24 Enable Set Position */ -#define PMU_CNTENSET_CNT24_ENABLE_Msk (1UL << PMU_CNTENSET_CNT24_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 24 Enable Set Mask */ - -#define PMU_CNTENSET_CNT25_ENABLE_Pos 25U /*!< PMU CNTENSET: Event Counter 25 Enable Set Position */ -#define PMU_CNTENSET_CNT25_ENABLE_Msk (1UL << PMU_CNTENSET_CNT25_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 25 Enable Set Mask */ - -#define PMU_CNTENSET_CNT26_ENABLE_Pos 26U /*!< PMU CNTENSET: Event Counter 26 Enable Set Position */ -#define PMU_CNTENSET_CNT26_ENABLE_Msk (1UL << PMU_CNTENSET_CNT26_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 26 Enable Set Mask */ - -#define PMU_CNTENSET_CNT27_ENABLE_Pos 27U /*!< PMU CNTENSET: Event Counter 27 Enable Set Position */ -#define PMU_CNTENSET_CNT27_ENABLE_Msk (1UL << PMU_CNTENSET_CNT27_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 27 Enable Set Mask */ - -#define PMU_CNTENSET_CNT28_ENABLE_Pos 28U /*!< PMU CNTENSET: Event Counter 28 Enable Set Position */ -#define PMU_CNTENSET_CNT28_ENABLE_Msk (1UL << PMU_CNTENSET_CNT28_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 28 Enable Set Mask */ - -#define PMU_CNTENSET_CNT29_ENABLE_Pos 29U /*!< PMU CNTENSET: Event Counter 29 Enable Set Position */ -#define PMU_CNTENSET_CNT29_ENABLE_Msk (1UL << PMU_CNTENSET_CNT29_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 29 Enable Set Mask */ - -#define PMU_CNTENSET_CNT30_ENABLE_Pos 30U /*!< PMU CNTENSET: Event Counter 30 Enable Set Position */ -#define PMU_CNTENSET_CNT30_ENABLE_Msk (1UL << PMU_CNTENSET_CNT30_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 30 Enable Set Mask */ - -#define PMU_CNTENSET_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENSET: Cycle Counter Enable Set Position */ -#define PMU_CNTENSET_CCNTR_ENABLE_Msk (1UL << PMU_CNTENSET_CCNTR_ENABLE_Pos) /*!< PMU CNTENSET: Cycle Counter Enable Set Mask */ - -/** \brief PMU Count Enable Clear Register Definitions */ - -#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Position */ -#define PMU_CNTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU CNTENCLR: Event Counter 1 Enable Clear Position */ -#define PMU_CNTENCLR_CNT1_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT1_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 1 Enable Clear */ - -#define PMU_CNTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Position */ -#define PMU_CNTENCLR_CNT2_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT2_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Position */ -#define PMU_CNTENCLR_CNT3_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT3_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Position */ -#define PMU_CNTENCLR_CNT4_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT4_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Position */ -#define PMU_CNTENCLR_CNT5_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT5_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Position */ -#define PMU_CNTENCLR_CNT6_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT6_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Position */ -#define PMU_CNTENCLR_CNT7_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT7_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Position */ -#define PMU_CNTENCLR_CNT8_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT8_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Position */ -#define PMU_CNTENCLR_CNT9_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT9_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Position */ -#define PMU_CNTENCLR_CNT10_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT10_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Position */ -#define PMU_CNTENCLR_CNT11_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT11_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Position */ -#define PMU_CNTENCLR_CNT12_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT12_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Position */ -#define PMU_CNTENCLR_CNT13_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT13_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Position */ -#define PMU_CNTENCLR_CNT14_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT14_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Position */ -#define PMU_CNTENCLR_CNT15_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT15_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Position */ -#define PMU_CNTENCLR_CNT16_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT16_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Position */ -#define PMU_CNTENCLR_CNT17_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT17_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Position */ -#define PMU_CNTENCLR_CNT18_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT18_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Position */ -#define PMU_CNTENCLR_CNT19_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT19_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Position */ -#define PMU_CNTENCLR_CNT20_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT20_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Position */ -#define PMU_CNTENCLR_CNT21_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT21_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Position */ -#define PMU_CNTENCLR_CNT22_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT22_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Position */ -#define PMU_CNTENCLR_CNT23_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT23_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Position */ -#define PMU_CNTENCLR_CNT24_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT24_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Position */ -#define PMU_CNTENCLR_CNT25_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT25_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Position */ -#define PMU_CNTENCLR_CNT26_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT26_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Position */ -#define PMU_CNTENCLR_CNT27_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT27_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Position */ -#define PMU_CNTENCLR_CNT28_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT28_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Position */ -#define PMU_CNTENCLR_CNT29_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT29_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Mask */ - -#define PMU_CNTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Position */ -#define PMU_CNTENCLR_CNT30_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT30_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Mask */ - -#define PMU_CNTENCLR_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENCLR: Cycle Counter Enable Clear Position */ -#define PMU_CNTENCLR_CCNTR_ENABLE_Msk (1UL << PMU_CNTENCLR_CCNTR_ENABLE_Pos) /*!< PMU CNTENCLR: Cycle Counter Enable Clear Mask */ - -/** \brief PMU Interrupt Enable Set Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENSET_CNT0_ENABLE_Pos*/) /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT1_ENABLE_Pos 1U /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT1_ENABLE_Msk (1UL << PMU_INTENSET_CNT1_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT2_ENABLE_Pos 2U /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT2_ENABLE_Msk (1UL << PMU_INTENSET_CNT2_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT3_ENABLE_Pos 3U /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT3_ENABLE_Msk (1UL << PMU_INTENSET_CNT3_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT4_ENABLE_Pos 4U /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT4_ENABLE_Msk (1UL << PMU_INTENSET_CNT4_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT5_ENABLE_Pos 5U /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT5_ENABLE_Msk (1UL << PMU_INTENSET_CNT5_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT6_ENABLE_Pos 6U /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT6_ENABLE_Msk (1UL << PMU_INTENSET_CNT6_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT7_ENABLE_Pos 7U /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT7_ENABLE_Msk (1UL << PMU_INTENSET_CNT7_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT8_ENABLE_Pos 8U /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT8_ENABLE_Msk (1UL << PMU_INTENSET_CNT8_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT9_ENABLE_Pos 9U /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT9_ENABLE_Msk (1UL << PMU_INTENSET_CNT9_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT10_ENABLE_Pos 10U /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT10_ENABLE_Msk (1UL << PMU_INTENSET_CNT10_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT11_ENABLE_Pos 11U /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT11_ENABLE_Msk (1UL << PMU_INTENSET_CNT11_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT12_ENABLE_Pos 12U /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT12_ENABLE_Msk (1UL << PMU_INTENSET_CNT12_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT13_ENABLE_Pos 13U /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT13_ENABLE_Msk (1UL << PMU_INTENSET_CNT13_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT14_ENABLE_Pos 14U /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT14_ENABLE_Msk (1UL << PMU_INTENSET_CNT14_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT15_ENABLE_Pos 15U /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT15_ENABLE_Msk (1UL << PMU_INTENSET_CNT15_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT16_ENABLE_Pos 16U /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT16_ENABLE_Msk (1UL << PMU_INTENSET_CNT16_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT17_ENABLE_Pos 17U /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT17_ENABLE_Msk (1UL << PMU_INTENSET_CNT17_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT18_ENABLE_Pos 18U /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT18_ENABLE_Msk (1UL << PMU_INTENSET_CNT18_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT19_ENABLE_Pos 19U /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT19_ENABLE_Msk (1UL << PMU_INTENSET_CNT19_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT20_ENABLE_Pos 20U /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT20_ENABLE_Msk (1UL << PMU_INTENSET_CNT20_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT21_ENABLE_Pos 21U /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT21_ENABLE_Msk (1UL << PMU_INTENSET_CNT21_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT22_ENABLE_Pos 22U /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT22_ENABLE_Msk (1UL << PMU_INTENSET_CNT22_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT23_ENABLE_Pos 23U /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT23_ENABLE_Msk (1UL << PMU_INTENSET_CNT23_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT24_ENABLE_Pos 24U /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT24_ENABLE_Msk (1UL << PMU_INTENSET_CNT24_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT25_ENABLE_Pos 25U /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT25_ENABLE_Msk (1UL << PMU_INTENSET_CNT25_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT26_ENABLE_Pos 26U /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT26_ENABLE_Msk (1UL << PMU_INTENSET_CNT26_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT27_ENABLE_Pos 27U /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT27_ENABLE_Msk (1UL << PMU_INTENSET_CNT27_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT28_ENABLE_Pos 28U /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT28_ENABLE_Msk (1UL << PMU_INTENSET_CNT28_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT29_ENABLE_Pos 29U /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT29_ENABLE_Msk (1UL << PMU_INTENSET_CNT29_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CNT30_ENABLE_Pos 30U /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Position */ -#define PMU_INTENSET_CNT30_ENABLE_Msk (1UL << PMU_INTENSET_CNT30_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Mask */ - -#define PMU_INTENSET_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Position */ -#define PMU_INTENSET_CCYCNT_ENABLE_Msk (1UL << PMU_INTENSET_CYCCNT_ENABLE_Pos) /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Mask */ - -/** \brief PMU Interrupt Enable Clear Register Definitions */ - -#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT1_ENABLE_Msk (1UL << PMU_INTENCLR_CNT1_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear */ - -#define PMU_INTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT2_ENABLE_Msk (1UL << PMU_INTENCLR_CNT2_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT3_ENABLE_Msk (1UL << PMU_INTENCLR_CNT3_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT4_ENABLE_Msk (1UL << PMU_INTENCLR_CNT4_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT5_ENABLE_Msk (1UL << PMU_INTENCLR_CNT5_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT6_ENABLE_Msk (1UL << PMU_INTENCLR_CNT6_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT7_ENABLE_Msk (1UL << PMU_INTENCLR_CNT7_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT8_ENABLE_Msk (1UL << PMU_INTENCLR_CNT8_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT9_ENABLE_Msk (1UL << PMU_INTENCLR_CNT9_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT10_ENABLE_Msk (1UL << PMU_INTENCLR_CNT10_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT11_ENABLE_Msk (1UL << PMU_INTENCLR_CNT11_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT12_ENABLE_Msk (1UL << PMU_INTENCLR_CNT12_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT13_ENABLE_Msk (1UL << PMU_INTENCLR_CNT13_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT14_ENABLE_Msk (1UL << PMU_INTENCLR_CNT14_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT15_ENABLE_Msk (1UL << PMU_INTENCLR_CNT15_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT16_ENABLE_Msk (1UL << PMU_INTENCLR_CNT16_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT17_ENABLE_Msk (1UL << PMU_INTENCLR_CNT17_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT18_ENABLE_Msk (1UL << PMU_INTENCLR_CNT18_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT19_ENABLE_Msk (1UL << PMU_INTENCLR_CNT19_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT20_ENABLE_Msk (1UL << PMU_INTENCLR_CNT20_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT21_ENABLE_Msk (1UL << PMU_INTENCLR_CNT21_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT22_ENABLE_Msk (1UL << PMU_INTENCLR_CNT22_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT23_ENABLE_Msk (1UL << PMU_INTENCLR_CNT23_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT24_ENABLE_Msk (1UL << PMU_INTENCLR_CNT24_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT25_ENABLE_Msk (1UL << PMU_INTENCLR_CNT25_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT26_ENABLE_Msk (1UL << PMU_INTENCLR_CNT26_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT27_ENABLE_Msk (1UL << PMU_INTENCLR_CNT27_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT28_ENABLE_Msk (1UL << PMU_INTENCLR_CNT28_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT29_ENABLE_Msk (1UL << PMU_INTENCLR_CNT29_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CNT30_ENABLE_Msk (1UL << PMU_INTENCLR_CNT30_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Mask */ - -#define PMU_INTENCLR_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Position */ -#define PMU_INTENCLR_CYCCNT_ENABLE_Msk (1UL << PMU_INTENCLR_CYCCNT_ENABLE_Pos) /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Mask */ - -/** \brief PMU Overflow Flag Status Set Register Definitions */ - -#define PMU_OVSSET_CNT0_STATUS_Pos 0U /*!< PMU OVSSET: Event Counter 0 Overflow Set Position */ -#define PMU_OVSSET_CNT0_STATUS_Msk (1UL /*<< PMU_OVSSET_CNT0_STATUS_Pos*/) /*!< PMU OVSSET: Event Counter 0 Overflow Set Mask */ - -#define PMU_OVSSET_CNT1_STATUS_Pos 1U /*!< PMU OVSSET: Event Counter 1 Overflow Set Position */ -#define PMU_OVSSET_CNT1_STATUS_Msk (1UL << PMU_OVSSET_CNT1_STATUS_Pos) /*!< PMU OVSSET: Event Counter 1 Overflow Set Mask */ - -#define PMU_OVSSET_CNT2_STATUS_Pos 2U /*!< PMU OVSSET: Event Counter 2 Overflow Set Position */ -#define PMU_OVSSET_CNT2_STATUS_Msk (1UL << PMU_OVSSET_CNT2_STATUS_Pos) /*!< PMU OVSSET: Event Counter 2 Overflow Set Mask */ - -#define PMU_OVSSET_CNT3_STATUS_Pos 3U /*!< PMU OVSSET: Event Counter 3 Overflow Set Position */ -#define PMU_OVSSET_CNT3_STATUS_Msk (1UL << PMU_OVSSET_CNT3_STATUS_Pos) /*!< PMU OVSSET: Event Counter 3 Overflow Set Mask */ - -#define PMU_OVSSET_CNT4_STATUS_Pos 4U /*!< PMU OVSSET: Event Counter 4 Overflow Set Position */ -#define PMU_OVSSET_CNT4_STATUS_Msk (1UL << PMU_OVSSET_CNT4_STATUS_Pos) /*!< PMU OVSSET: Event Counter 4 Overflow Set Mask */ - -#define PMU_OVSSET_CNT5_STATUS_Pos 5U /*!< PMU OVSSET: Event Counter 5 Overflow Set Position */ -#define PMU_OVSSET_CNT5_STATUS_Msk (1UL << PMU_OVSSET_CNT5_STATUS_Pos) /*!< PMU OVSSET: Event Counter 5 Overflow Set Mask */ - -#define PMU_OVSSET_CNT6_STATUS_Pos 6U /*!< PMU OVSSET: Event Counter 6 Overflow Set Position */ -#define PMU_OVSSET_CNT6_STATUS_Msk (1UL << PMU_OVSSET_CNT6_STATUS_Pos) /*!< PMU OVSSET: Event Counter 6 Overflow Set Mask */ - -#define PMU_OVSSET_CNT7_STATUS_Pos 7U /*!< PMU OVSSET: Event Counter 7 Overflow Set Position */ -#define PMU_OVSSET_CNT7_STATUS_Msk (1UL << PMU_OVSSET_CNT7_STATUS_Pos) /*!< PMU OVSSET: Event Counter 7 Overflow Set Mask */ - -#define PMU_OVSSET_CNT8_STATUS_Pos 8U /*!< PMU OVSSET: Event Counter 8 Overflow Set Position */ -#define PMU_OVSSET_CNT8_STATUS_Msk (1UL << PMU_OVSSET_CNT8_STATUS_Pos) /*!< PMU OVSSET: Event Counter 8 Overflow Set Mask */ - -#define PMU_OVSSET_CNT9_STATUS_Pos 9U /*!< PMU OVSSET: Event Counter 9 Overflow Set Position */ -#define PMU_OVSSET_CNT9_STATUS_Msk (1UL << PMU_OVSSET_CNT9_STATUS_Pos) /*!< PMU OVSSET: Event Counter 9 Overflow Set Mask */ - -#define PMU_OVSSET_CNT10_STATUS_Pos 10U /*!< PMU OVSSET: Event Counter 10 Overflow Set Position */ -#define PMU_OVSSET_CNT10_STATUS_Msk (1UL << PMU_OVSSET_CNT10_STATUS_Pos) /*!< PMU OVSSET: Event Counter 10 Overflow Set Mask */ - -#define PMU_OVSSET_CNT11_STATUS_Pos 11U /*!< PMU OVSSET: Event Counter 11 Overflow Set Position */ -#define PMU_OVSSET_CNT11_STATUS_Msk (1UL << PMU_OVSSET_CNT11_STATUS_Pos) /*!< PMU OVSSET: Event Counter 11 Overflow Set Mask */ - -#define PMU_OVSSET_CNT12_STATUS_Pos 12U /*!< PMU OVSSET: Event Counter 12 Overflow Set Position */ -#define PMU_OVSSET_CNT12_STATUS_Msk (1UL << PMU_OVSSET_CNT12_STATUS_Pos) /*!< PMU OVSSET: Event Counter 12 Overflow Set Mask */ - -#define PMU_OVSSET_CNT13_STATUS_Pos 13U /*!< PMU OVSSET: Event Counter 13 Overflow Set Position */ -#define PMU_OVSSET_CNT13_STATUS_Msk (1UL << PMU_OVSSET_CNT13_STATUS_Pos) /*!< PMU OVSSET: Event Counter 13 Overflow Set Mask */ - -#define PMU_OVSSET_CNT14_STATUS_Pos 14U /*!< PMU OVSSET: Event Counter 14 Overflow Set Position */ -#define PMU_OVSSET_CNT14_STATUS_Msk (1UL << PMU_OVSSET_CNT14_STATUS_Pos) /*!< PMU OVSSET: Event Counter 14 Overflow Set Mask */ - -#define PMU_OVSSET_CNT15_STATUS_Pos 15U /*!< PMU OVSSET: Event Counter 15 Overflow Set Position */ -#define PMU_OVSSET_CNT15_STATUS_Msk (1UL << PMU_OVSSET_CNT15_STATUS_Pos) /*!< PMU OVSSET: Event Counter 15 Overflow Set Mask */ - -#define PMU_OVSSET_CNT16_STATUS_Pos 16U /*!< PMU OVSSET: Event Counter 16 Overflow Set Position */ -#define PMU_OVSSET_CNT16_STATUS_Msk (1UL << PMU_OVSSET_CNT16_STATUS_Pos) /*!< PMU OVSSET: Event Counter 16 Overflow Set Mask */ - -#define PMU_OVSSET_CNT17_STATUS_Pos 17U /*!< PMU OVSSET: Event Counter 17 Overflow Set Position */ -#define PMU_OVSSET_CNT17_STATUS_Msk (1UL << PMU_OVSSET_CNT17_STATUS_Pos) /*!< PMU OVSSET: Event Counter 17 Overflow Set Mask */ - -#define PMU_OVSSET_CNT18_STATUS_Pos 18U /*!< PMU OVSSET: Event Counter 18 Overflow Set Position */ -#define PMU_OVSSET_CNT18_STATUS_Msk (1UL << PMU_OVSSET_CNT18_STATUS_Pos) /*!< PMU OVSSET: Event Counter 18 Overflow Set Mask */ - -#define PMU_OVSSET_CNT19_STATUS_Pos 19U /*!< PMU OVSSET: Event Counter 19 Overflow Set Position */ -#define PMU_OVSSET_CNT19_STATUS_Msk (1UL << PMU_OVSSET_CNT19_STATUS_Pos) /*!< PMU OVSSET: Event Counter 19 Overflow Set Mask */ - -#define PMU_OVSSET_CNT20_STATUS_Pos 20U /*!< PMU OVSSET: Event Counter 20 Overflow Set Position */ -#define PMU_OVSSET_CNT20_STATUS_Msk (1UL << PMU_OVSSET_CNT20_STATUS_Pos) /*!< PMU OVSSET: Event Counter 20 Overflow Set Mask */ - -#define PMU_OVSSET_CNT21_STATUS_Pos 21U /*!< PMU OVSSET: Event Counter 21 Overflow Set Position */ -#define PMU_OVSSET_CNT21_STATUS_Msk (1UL << PMU_OVSSET_CNT21_STATUS_Pos) /*!< PMU OVSSET: Event Counter 21 Overflow Set Mask */ - -#define PMU_OVSSET_CNT22_STATUS_Pos 22U /*!< PMU OVSSET: Event Counter 22 Overflow Set Position */ -#define PMU_OVSSET_CNT22_STATUS_Msk (1UL << PMU_OVSSET_CNT22_STATUS_Pos) /*!< PMU OVSSET: Event Counter 22 Overflow Set Mask */ - -#define PMU_OVSSET_CNT23_STATUS_Pos 23U /*!< PMU OVSSET: Event Counter 23 Overflow Set Position */ -#define PMU_OVSSET_CNT23_STATUS_Msk (1UL << PMU_OVSSET_CNT23_STATUS_Pos) /*!< PMU OVSSET: Event Counter 23 Overflow Set Mask */ - -#define PMU_OVSSET_CNT24_STATUS_Pos 24U /*!< PMU OVSSET: Event Counter 24 Overflow Set Position */ -#define PMU_OVSSET_CNT24_STATUS_Msk (1UL << PMU_OVSSET_CNT24_STATUS_Pos) /*!< PMU OVSSET: Event Counter 24 Overflow Set Mask */ - -#define PMU_OVSSET_CNT25_STATUS_Pos 25U /*!< PMU OVSSET: Event Counter 25 Overflow Set Position */ -#define PMU_OVSSET_CNT25_STATUS_Msk (1UL << PMU_OVSSET_CNT25_STATUS_Pos) /*!< PMU OVSSET: Event Counter 25 Overflow Set Mask */ - -#define PMU_OVSSET_CNT26_STATUS_Pos 26U /*!< PMU OVSSET: Event Counter 26 Overflow Set Position */ -#define PMU_OVSSET_CNT26_STATUS_Msk (1UL << PMU_OVSSET_CNT26_STATUS_Pos) /*!< PMU OVSSET: Event Counter 26 Overflow Set Mask */ - -#define PMU_OVSSET_CNT27_STATUS_Pos 27U /*!< PMU OVSSET: Event Counter 27 Overflow Set Position */ -#define PMU_OVSSET_CNT27_STATUS_Msk (1UL << PMU_OVSSET_CNT27_STATUS_Pos) /*!< PMU OVSSET: Event Counter 27 Overflow Set Mask */ - -#define PMU_OVSSET_CNT28_STATUS_Pos 28U /*!< PMU OVSSET: Event Counter 28 Overflow Set Position */ -#define PMU_OVSSET_CNT28_STATUS_Msk (1UL << PMU_OVSSET_CNT28_STATUS_Pos) /*!< PMU OVSSET: Event Counter 28 Overflow Set Mask */ - -#define PMU_OVSSET_CNT29_STATUS_Pos 29U /*!< PMU OVSSET: Event Counter 29 Overflow Set Position */ -#define PMU_OVSSET_CNT29_STATUS_Msk (1UL << PMU_OVSSET_CNT29_STATUS_Pos) /*!< PMU OVSSET: Event Counter 29 Overflow Set Mask */ - -#define PMU_OVSSET_CNT30_STATUS_Pos 30U /*!< PMU OVSSET: Event Counter 30 Overflow Set Position */ -#define PMU_OVSSET_CNT30_STATUS_Msk (1UL << PMU_OVSSET_CNT30_STATUS_Pos) /*!< PMU OVSSET: Event Counter 30 Overflow Set Mask */ - -#define PMU_OVSSET_CYCCNT_STATUS_Pos 31U /*!< PMU OVSSET: Cycle Counter Overflow Set Position */ -#define PMU_OVSSET_CYCCNT_STATUS_Msk (1UL << PMU_OVSSET_CYCCNT_STATUS_Pos) /*!< PMU OVSSET: Cycle Counter Overflow Set Mask */ - -/** \brief PMU Overflow Flag Status Clear Register Definitions */ - -#define PMU_OVSCLR_CNT0_STATUS_Pos 0U /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Position */ -#define PMU_OVSCLR_CNT0_STATUS_Msk (1UL /*<< PMU_OVSCLR_CNT0_STATUS_Pos*/) /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT1_STATUS_Pos 1U /*!< PMU OVSCLR: Event Counter 1 Overflow Clear Position */ -#define PMU_OVSCLR_CNT1_STATUS_Msk (1UL << PMU_OVSCLR_CNT1_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 1 Overflow Clear */ - -#define PMU_OVSCLR_CNT2_STATUS_Pos 2U /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Position */ -#define PMU_OVSCLR_CNT2_STATUS_Msk (1UL << PMU_OVSCLR_CNT2_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT3_STATUS_Pos 3U /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Position */ -#define PMU_OVSCLR_CNT3_STATUS_Msk (1UL << PMU_OVSCLR_CNT3_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT4_STATUS_Pos 4U /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Position */ -#define PMU_OVSCLR_CNT4_STATUS_Msk (1UL << PMU_OVSCLR_CNT4_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT5_STATUS_Pos 5U /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Position */ -#define PMU_OVSCLR_CNT5_STATUS_Msk (1UL << PMU_OVSCLR_CNT5_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT6_STATUS_Pos 6U /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Position */ -#define PMU_OVSCLR_CNT6_STATUS_Msk (1UL << PMU_OVSCLR_CNT6_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT7_STATUS_Pos 7U /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Position */ -#define PMU_OVSCLR_CNT7_STATUS_Msk (1UL << PMU_OVSCLR_CNT7_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT8_STATUS_Pos 8U /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Position */ -#define PMU_OVSCLR_CNT8_STATUS_Msk (1UL << PMU_OVSCLR_CNT8_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT9_STATUS_Pos 9U /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Position */ -#define PMU_OVSCLR_CNT9_STATUS_Msk (1UL << PMU_OVSCLR_CNT9_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT10_STATUS_Pos 10U /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Position */ -#define PMU_OVSCLR_CNT10_STATUS_Msk (1UL << PMU_OVSCLR_CNT10_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT11_STATUS_Pos 11U /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Position */ -#define PMU_OVSCLR_CNT11_STATUS_Msk (1UL << PMU_OVSCLR_CNT11_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT12_STATUS_Pos 12U /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Position */ -#define PMU_OVSCLR_CNT12_STATUS_Msk (1UL << PMU_OVSCLR_CNT12_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT13_STATUS_Pos 13U /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Position */ -#define PMU_OVSCLR_CNT13_STATUS_Msk (1UL << PMU_OVSCLR_CNT13_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT14_STATUS_Pos 14U /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Position */ -#define PMU_OVSCLR_CNT14_STATUS_Msk (1UL << PMU_OVSCLR_CNT14_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT15_STATUS_Pos 15U /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Position */ -#define PMU_OVSCLR_CNT15_STATUS_Msk (1UL << PMU_OVSCLR_CNT15_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT16_STATUS_Pos 16U /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Position */ -#define PMU_OVSCLR_CNT16_STATUS_Msk (1UL << PMU_OVSCLR_CNT16_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT17_STATUS_Pos 17U /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Position */ -#define PMU_OVSCLR_CNT17_STATUS_Msk (1UL << PMU_OVSCLR_CNT17_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT18_STATUS_Pos 18U /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Position */ -#define PMU_OVSCLR_CNT18_STATUS_Msk (1UL << PMU_OVSCLR_CNT18_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT19_STATUS_Pos 19U /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Position */ -#define PMU_OVSCLR_CNT19_STATUS_Msk (1UL << PMU_OVSCLR_CNT19_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT20_STATUS_Pos 20U /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Position */ -#define PMU_OVSCLR_CNT20_STATUS_Msk (1UL << PMU_OVSCLR_CNT20_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT21_STATUS_Pos 21U /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Position */ -#define PMU_OVSCLR_CNT21_STATUS_Msk (1UL << PMU_OVSCLR_CNT21_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT22_STATUS_Pos 22U /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Position */ -#define PMU_OVSCLR_CNT22_STATUS_Msk (1UL << PMU_OVSCLR_CNT22_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT23_STATUS_Pos 23U /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Position */ -#define PMU_OVSCLR_CNT23_STATUS_Msk (1UL << PMU_OVSCLR_CNT23_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT24_STATUS_Pos 24U /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Position */ -#define PMU_OVSCLR_CNT24_STATUS_Msk (1UL << PMU_OVSCLR_CNT24_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT25_STATUS_Pos 25U /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Position */ -#define PMU_OVSCLR_CNT25_STATUS_Msk (1UL << PMU_OVSCLR_CNT25_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT26_STATUS_Pos 26U /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Position */ -#define PMU_OVSCLR_CNT26_STATUS_Msk (1UL << PMU_OVSCLR_CNT26_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT27_STATUS_Pos 27U /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Position */ -#define PMU_OVSCLR_CNT27_STATUS_Msk (1UL << PMU_OVSCLR_CNT27_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT28_STATUS_Pos 28U /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Position */ -#define PMU_OVSCLR_CNT28_STATUS_Msk (1UL << PMU_OVSCLR_CNT28_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT29_STATUS_Pos 29U /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Position */ -#define PMU_OVSCLR_CNT29_STATUS_Msk (1UL << PMU_OVSCLR_CNT29_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Mask */ - -#define PMU_OVSCLR_CNT30_STATUS_Pos 30U /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Position */ -#define PMU_OVSCLR_CNT30_STATUS_Msk (1UL << PMU_OVSCLR_CNT30_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Mask */ - -#define PMU_OVSCLR_CYCCNT_STATUS_Pos 31U /*!< PMU OVSCLR: Cycle Counter Overflow Clear Position */ -#define PMU_OVSCLR_CYCCNT_STATUS_Msk (1UL << PMU_OVSCLR_CYCCNT_STATUS_Pos) /*!< PMU OVSCLR: Cycle Counter Overflow Clear Mask */ - -/** \brief PMU Software Increment Counter */ - -#define PMU_SWINC_CNT0_Pos 0U /*!< PMU SWINC: Event Counter 0 Software Increment Position */ -#define PMU_SWINC_CNT0_Msk (1UL /*<< PMU_SWINC_CNT0_Pos */) /*!< PMU SWINC: Event Counter 0 Software Increment Mask */ - -#define PMU_SWINC_CNT1_Pos 1U /*!< PMU SWINC: Event Counter 1 Software Increment Position */ -#define PMU_SWINC_CNT1_Msk (1UL << PMU_SWINC_CNT1_Pos) /*!< PMU SWINC: Event Counter 1 Software Increment Mask */ - -#define PMU_SWINC_CNT2_Pos 2U /*!< PMU SWINC: Event Counter 2 Software Increment Position */ -#define PMU_SWINC_CNT2_Msk (1UL << PMU_SWINC_CNT2_Pos) /*!< PMU SWINC: Event Counter 2 Software Increment Mask */ - -#define PMU_SWINC_CNT3_Pos 3U /*!< PMU SWINC: Event Counter 3 Software Increment Position */ -#define PMU_SWINC_CNT3_Msk (1UL << PMU_SWINC_CNT3_Pos) /*!< PMU SWINC: Event Counter 3 Software Increment Mask */ - -#define PMU_SWINC_CNT4_Pos 4U /*!< PMU SWINC: Event Counter 4 Software Increment Position */ -#define PMU_SWINC_CNT4_Msk (1UL << PMU_SWINC_CNT4_Pos) /*!< PMU SWINC: Event Counter 4 Software Increment Mask */ - -#define PMU_SWINC_CNT5_Pos 5U /*!< PMU SWINC: Event Counter 5 Software Increment Position */ -#define PMU_SWINC_CNT5_Msk (1UL << PMU_SWINC_CNT5_Pos) /*!< PMU SWINC: Event Counter 5 Software Increment Mask */ - -#define PMU_SWINC_CNT6_Pos 6U /*!< PMU SWINC: Event Counter 6 Software Increment Position */ -#define PMU_SWINC_CNT6_Msk (1UL << PMU_SWINC_CNT6_Pos) /*!< PMU SWINC: Event Counter 6 Software Increment Mask */ - -#define PMU_SWINC_CNT7_Pos 7U /*!< PMU SWINC: Event Counter 7 Software Increment Position */ -#define PMU_SWINC_CNT7_Msk (1UL << PMU_SWINC_CNT7_Pos) /*!< PMU SWINC: Event Counter 7 Software Increment Mask */ - -#define PMU_SWINC_CNT8_Pos 8U /*!< PMU SWINC: Event Counter 8 Software Increment Position */ -#define PMU_SWINC_CNT8_Msk (1UL << PMU_SWINC_CNT8_Pos) /*!< PMU SWINC: Event Counter 8 Software Increment Mask */ - -#define PMU_SWINC_CNT9_Pos 9U /*!< PMU SWINC: Event Counter 9 Software Increment Position */ -#define PMU_SWINC_CNT9_Msk (1UL << PMU_SWINC_CNT9_Pos) /*!< PMU SWINC: Event Counter 9 Software Increment Mask */ - -#define PMU_SWINC_CNT10_Pos 10U /*!< PMU SWINC: Event Counter 10 Software Increment Position */ -#define PMU_SWINC_CNT10_Msk (1UL << PMU_SWINC_CNT10_Pos) /*!< PMU SWINC: Event Counter 10 Software Increment Mask */ - -#define PMU_SWINC_CNT11_Pos 11U /*!< PMU SWINC: Event Counter 11 Software Increment Position */ -#define PMU_SWINC_CNT11_Msk (1UL << PMU_SWINC_CNT11_Pos) /*!< PMU SWINC: Event Counter 11 Software Increment Mask */ - -#define PMU_SWINC_CNT12_Pos 12U /*!< PMU SWINC: Event Counter 12 Software Increment Position */ -#define PMU_SWINC_CNT12_Msk (1UL << PMU_SWINC_CNT12_Pos) /*!< PMU SWINC: Event Counter 12 Software Increment Mask */ - -#define PMU_SWINC_CNT13_Pos 13U /*!< PMU SWINC: Event Counter 13 Software Increment Position */ -#define PMU_SWINC_CNT13_Msk (1UL << PMU_SWINC_CNT13_Pos) /*!< PMU SWINC: Event Counter 13 Software Increment Mask */ - -#define PMU_SWINC_CNT14_Pos 14U /*!< PMU SWINC: Event Counter 14 Software Increment Position */ -#define PMU_SWINC_CNT14_Msk (1UL << PMU_SWINC_CNT14_Pos) /*!< PMU SWINC: Event Counter 14 Software Increment Mask */ - -#define PMU_SWINC_CNT15_Pos 15U /*!< PMU SWINC: Event Counter 15 Software Increment Position */ -#define PMU_SWINC_CNT15_Msk (1UL << PMU_SWINC_CNT15_Pos) /*!< PMU SWINC: Event Counter 15 Software Increment Mask */ - -#define PMU_SWINC_CNT16_Pos 16U /*!< PMU SWINC: Event Counter 16 Software Increment Position */ -#define PMU_SWINC_CNT16_Msk (1UL << PMU_SWINC_CNT16_Pos) /*!< PMU SWINC: Event Counter 16 Software Increment Mask */ - -#define PMU_SWINC_CNT17_Pos 17U /*!< PMU SWINC: Event Counter 17 Software Increment Position */ -#define PMU_SWINC_CNT17_Msk (1UL << PMU_SWINC_CNT17_Pos) /*!< PMU SWINC: Event Counter 17 Software Increment Mask */ - -#define PMU_SWINC_CNT18_Pos 18U /*!< PMU SWINC: Event Counter 18 Software Increment Position */ -#define PMU_SWINC_CNT18_Msk (1UL << PMU_SWINC_CNT18_Pos) /*!< PMU SWINC: Event Counter 18 Software Increment Mask */ - -#define PMU_SWINC_CNT19_Pos 19U /*!< PMU SWINC: Event Counter 19 Software Increment Position */ -#define PMU_SWINC_CNT19_Msk (1UL << PMU_SWINC_CNT19_Pos) /*!< PMU SWINC: Event Counter 19 Software Increment Mask */ - -#define PMU_SWINC_CNT20_Pos 20U /*!< PMU SWINC: Event Counter 20 Software Increment Position */ -#define PMU_SWINC_CNT20_Msk (1UL << PMU_SWINC_CNT20_Pos) /*!< PMU SWINC: Event Counter 20 Software Increment Mask */ - -#define PMU_SWINC_CNT21_Pos 21U /*!< PMU SWINC: Event Counter 21 Software Increment Position */ -#define PMU_SWINC_CNT21_Msk (1UL << PMU_SWINC_CNT21_Pos) /*!< PMU SWINC: Event Counter 21 Software Increment Mask */ - -#define PMU_SWINC_CNT22_Pos 22U /*!< PMU SWINC: Event Counter 22 Software Increment Position */ -#define PMU_SWINC_CNT22_Msk (1UL << PMU_SWINC_CNT22_Pos) /*!< PMU SWINC: Event Counter 22 Software Increment Mask */ - -#define PMU_SWINC_CNT23_Pos 23U /*!< PMU SWINC: Event Counter 23 Software Increment Position */ -#define PMU_SWINC_CNT23_Msk (1UL << PMU_SWINC_CNT23_Pos) /*!< PMU SWINC: Event Counter 23 Software Increment Mask */ - -#define PMU_SWINC_CNT24_Pos 24U /*!< PMU SWINC: Event Counter 24 Software Increment Position */ -#define PMU_SWINC_CNT24_Msk (1UL << PMU_SWINC_CNT24_Pos) /*!< PMU SWINC: Event Counter 24 Software Increment Mask */ - -#define PMU_SWINC_CNT25_Pos 25U /*!< PMU SWINC: Event Counter 25 Software Increment Position */ -#define PMU_SWINC_CNT25_Msk (1UL << PMU_SWINC_CNT25_Pos) /*!< PMU SWINC: Event Counter 25 Software Increment Mask */ - -#define PMU_SWINC_CNT26_Pos 26U /*!< PMU SWINC: Event Counter 26 Software Increment Position */ -#define PMU_SWINC_CNT26_Msk (1UL << PMU_SWINC_CNT26_Pos) /*!< PMU SWINC: Event Counter 26 Software Increment Mask */ - -#define PMU_SWINC_CNT27_Pos 27U /*!< PMU SWINC: Event Counter 27 Software Increment Position */ -#define PMU_SWINC_CNT27_Msk (1UL << PMU_SWINC_CNT27_Pos) /*!< PMU SWINC: Event Counter 27 Software Increment Mask */ - -#define PMU_SWINC_CNT28_Pos 28U /*!< PMU SWINC: Event Counter 28 Software Increment Position */ -#define PMU_SWINC_CNT28_Msk (1UL << PMU_SWINC_CNT28_Pos) /*!< PMU SWINC: Event Counter 28 Software Increment Mask */ - -#define PMU_SWINC_CNT29_Pos 29U /*!< PMU SWINC: Event Counter 29 Software Increment Position */ -#define PMU_SWINC_CNT29_Msk (1UL << PMU_SWINC_CNT29_Pos) /*!< PMU SWINC: Event Counter 29 Software Increment Mask */ - -#define PMU_SWINC_CNT30_Pos 30U /*!< PMU SWINC: Event Counter 30 Software Increment Position */ -#define PMU_SWINC_CNT30_Msk (1UL << PMU_SWINC_CNT30_Pos) /*!< PMU SWINC: Event Counter 30 Software Increment Mask */ - -/** \brief PMU Control Register Definitions */ - -#define PMU_CTRL_ENABLE_Pos 0U /*!< PMU CTRL: ENABLE Position */ -#define PMU_CTRL_ENABLE_Msk (1UL /*<< PMU_CTRL_ENABLE_Pos*/) /*!< PMU CTRL: ENABLE Mask */ - -#define PMU_CTRL_EVENTCNT_RESET_Pos 1U /*!< PMU CTRL: Event Counter Reset Position */ -#define PMU_CTRL_EVENTCNT_RESET_Msk (1UL << PMU_CTRL_EVENTCNT_RESET_Pos) /*!< PMU CTRL: Event Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_RESET_Pos 2U /*!< PMU CTRL: Cycle Counter Reset Position */ -#define PMU_CTRL_CYCCNT_RESET_Msk (1UL << PMU_CTRL_CYCCNT_RESET_Pos) /*!< PMU CTRL: Cycle Counter Reset Mask */ - -#define PMU_CTRL_CYCCNT_DISABLE_Pos 5U /*!< PMU CTRL: Disable Cycle Counter Position */ -#define PMU_CTRL_CYCCNT_DISABLE_Msk (1UL << PMU_CTRL_CYCCNT_DISABLE_Pos) /*!< PMU CTRL: Disable Cycle Counter Mask */ - -#define PMU_CTRL_FRZ_ON_OV_Pos 9U /*!< PMU CTRL: Freeze-on-overflow Position */ -#define PMU_CTRL_FRZ_ON_OV_Msk (1UL << PMU_CTRL_FRZ_ON_OVERFLOW_Pos) /*!< PMU CTRL: Freeze-on-overflow Mask */ - -#define PMU_CTRL_TRACE_ON_OV_Pos 11U /*!< PMU CTRL: Trace-on-overflow Position */ -#define PMU_CTRL_TRACE_ON_OV_Msk (1UL << PMU_CTRL_TRACE_ON_OVERFLOW_Pos) /*!< PMU CTRL: Trace-on-overflow Mask */ - -/** \brief PMU Type Register Definitions */ - -#define PMU_TYPE_NUM_CNTS_Pos 0U /*!< PMU TYPE: Number of Counters Position */ -#define PMU_TYPE_NUM_CNTS_Msk (0xFFUL /*<< PMU_TYPE_NUM_CNTS_Pos*/) /*!< PMU TYPE: Number of Counters Mask */ - -#define PMU_TYPE_SIZE_CNTS_Pos 8U /*!< PMU TYPE: Size of Counters Position */ -#define PMU_TYPE_SIZE_CNTS_Msk (0x3FUL << PMU_TYPE_SIZE_CNTS_Pos) /*!< PMU TYPE: Size of Counters Mask */ - -#define PMU_TYPE_CYCCNT_PRESENT_Pos 14U /*!< PMU TYPE: Cycle Counter Present Position */ -#define PMU_TYPE_CYCCNT_PRESENT_Msk (1UL << PMU_TYPE_CYCCNT_PRESENT_Pos) /*!< PMU TYPE: Cycle Counter Present Mask */ - -#define PMU_TYPE_FRZ_OV_SUPPORT_Pos 21U /*!< PMU TYPE: Freeze-on-overflow Support Position */ -#define PMU_TYPE_FRZ_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Freeze-on-overflow Support Mask */ - -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Pos 23U /*!< PMU TYPE: Trace-on-overflow Support Position */ -#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Trace-on-overflow Support Mask */ - -/** \brief PMU Authentication Status Register Definitions */ - -#define PMU_AUTHSTATUS_NSID_Pos 0U /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSID_Msk (0x3UL /*<< PMU_AUTHSTATUS_NSID_Pos*/) /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSNID_Pos 2U /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSNID_Msk (0x3UL << PMU_AUTHSTATUS_NSNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SID_Pos 4U /*!< PMU AUTHSTATUS: Secure Invasive Debug Position */ -#define PMU_AUTHSTATUS_SID_Msk (0x3UL << PMU_AUTHSTATUS_SID_Pos) /*!< PMU AUTHSTATUS: Secure Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SNID_Pos 6U /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SNID_Msk (0x3UL << PMU_AUTHSTATUS_SNID_Pos) /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUID_Pos 16U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUID_Msk (0x3UL << PMU_AUTHSTATUS_NSUID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_NSUNID_Pos 18U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_NSUNID_Msk (0x3UL << PMU_AUTHSTATUS_NSUNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUID_Pos 20U /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Position */ -#define PMU_AUTHSTATUS_SUID_Msk (0x3UL << PMU_AUTHSTATUS_SUID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Mask */ - -#define PMU_AUTHSTATUS_SUNID_Pos 22U /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Position */ -#define PMU_AUTHSTATUS_SUNID_Msk (0x3UL << PMU_AUTHSTATUS_SUNID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Mask */ - - -/*@} end of group CMSIS_PMU */ -#endif - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_PXN_Pos 4U /*!< MPU RLAR: PXN Position */ -#define MPU_RLAR_PXN_Msk (1UL << MPU_RLAR_PXN_Pos) /*!< MPU RLAR: PXN Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -#define FPU_FPDSCR_FZ16_Pos 19U /*!< FPDSCR: FZ16 bit Position */ -#define FPU_FPDSCR_FZ16_Msk (1UL << FPU_FPDSCR_FZ16_Pos) /*!< FPDSCR: FZ16 bit Mask */ - -#define FPU_FPDSCR_LTPSIZE_Pos 16U /*!< FPDSCR: LTPSIZE bit Position */ -#define FPU_FPDSCR_LTPSIZE_Msk (7UL << FPU_FPDSCR_LTPSIZE_Pos) /*!< FPDSCR: LTPSIZE bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FPRound_Pos 28U /*!< MVFR0: FPRound bits Position */ -#define FPU_MVFR0_FPRound_Msk (0xFUL << FPU_MVFR0_FPRound_Pos) /*!< MVFR0: FPRound bits Mask */ - -#define FPU_MVFR0_FPSqrt_Pos 20U /*!< MVFR0: FPSqrt bits Position */ -#define FPU_MVFR0_FPSqrt_Msk (0xFUL << FPU_MVFR0_FPSqrt_Pos) /*!< MVFR0: FPSqrt bits Mask */ - -#define FPU_MVFR0_FPDivide_Pos 16U /*!< MVFR0: FPDivide bits Position */ -#define FPU_MVFR0_FPDivide_Msk (0xFUL << FPU_MVFR0_FPDivide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FPDP_Pos 8U /*!< MVFR0: FPDP bits Position */ -#define FPU_MVFR0_FPDP_Msk (0xFUL << FPU_MVFR0_FPDP_Pos) /*!< MVFR0: FPDP bits Mask */ - -#define FPU_MVFR0_FPSP_Pos 4U /*!< MVFR0: FPSP bits Position */ -#define FPU_MVFR0_FPSP_Msk (0xFUL << FPU_MVFR0_FPSP_Pos) /*!< MVFR0: FPSP bits Mask */ - -#define FPU_MVFR0_SIMDReg_Pos 0U /*!< MVFR0: SIMDReg bits Position */ -#define FPU_MVFR0_SIMDReg_Msk (0xFUL /*<< FPU_MVFR0_SIMDReg_Pos*/) /*!< MVFR0: SIMDReg bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FMAC_Pos 28U /*!< MVFR1: FMAC bits Position */ -#define FPU_MVFR1_FMAC_Msk (0xFUL << FPU_MVFR1_FMAC_Pos) /*!< MVFR1: FMAC bits Mask */ - -#define FPU_MVFR1_FPHP_Pos 24U /*!< MVFR1: FPHP bits Position */ -#define FPU_MVFR1_FPHP_Msk (0xFUL << FPU_MVFR1_FPHP_Pos) /*!< MVFR1: FPHP bits Mask */ - -#define FPU_MVFR1_FP16_Pos 20U /*!< MVFR1: FP16 bits Position */ -#define FPU_MVFR1_FP16_Msk (0xFUL << FPU_MVFR1_FP16_Pos) /*!< MVFR1: FP16 bits Mask */ - -#define FPU_MVFR1_MVE_Pos 8U /*!< MVFR1: MVE bits Position */ -#define FPU_MVFR1_MVE_Msk (0xFUL << FPU_MVFR1_MVE_Pos) /*!< MVFR1: MVE bits Mask */ - -#define FPU_MVFR1_FPDNaN_Pos 4U /*!< MVFR1: FPDNaN bits Position */ -#define FPU_MVFR1_FPDNaN_Msk (0xFUL << FPU_MVFR1_FPDNaN_Pos) /*!< MVFR1: FPDNaN bits Mask */ - -#define FPU_MVFR1_FPFtZ_Pos 0U /*!< MVFR1: FPFtZ bits Position */ -#define FPU_MVFR1_FPFtZ_Msk (0xFUL /*<< FPU_MVFR1_FPFtZ_Pos*/) /*!< MVFR1: FPFtZ bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - -/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ -#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_FPD_Pos 23U /*!< \deprecated CoreDebug DHCSR: S_FPD Position */ -#define CoreDebug_DHCSR_S_FPD_Msk (1UL << CoreDebug_DHCSR_S_FPD_Pos) /*!< \deprecated CoreDebug DHCSR: S_FPD Mask */ - -#define CoreDebug_DHCSR_S_SUIDE_Pos 22U /*!< \deprecated CoreDebug DHCSR: S_SUIDE Position */ -#define CoreDebug_DHCSR_S_SUIDE_Msk (1UL << CoreDebug_DHCSR_S_SUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SUIDE Mask */ - -#define CoreDebug_DHCSR_S_NSUIDE_Pos 21U /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Position */ -#define CoreDebug_DHCSR_S_NSUIDE_Msk (1UL << CoreDebug_DHCSR_S_NSUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Mask */ - -#define CoreDebug_DHCSR_S_SDE_Pos 20U /*!< \deprecated CoreDebug DHCSR: S_SDE Position */ -#define CoreDebug_DHCSR_S_SDE_Msk (1UL << CoreDebug_DHCSR_S_SDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SDE Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_PMOV_Pos 6U /*!< \deprecated CoreDebug DHCSR: C_PMOV Position */ -#define CoreDebug_DHCSR_C_PMOV_Msk (1UL << CoreDebug_DHCSR_C_PMOV_Pos) /*!< \deprecated CoreDebug DHCSR: C_PMOV Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ - -/* Debug Set Clear Exception and Monitor Control Register Definitions */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_CLR_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_REQ_Pos 3U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Position */ -#define CoreDebug_DSCEMCR_SET_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Mask */ - -#define CoreDebug_DSCEMCR_SET_MON_PEND_Pos 1U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Position */ -#define CoreDebug_DSCEMCR_SET_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Mask */ - -/* Debug Authentication Control Register Definitions */ -#define CoreDebug_DAUTHCTRL_UIDEN_Pos 10U /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_UIDAPEN_Pos 9U /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Position */ -#define CoreDebug_DAUTHCTRL_UIDAPEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDAPEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Mask */ - -#define CoreDebug_DAUTHCTRL_FSDMA_Pos 8U /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Position */ -#define CoreDebug_DAUTHCTRL_FSDMA_Msk (1UL << CoreDebug_DAUTHCTRL_FSDMA_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ -#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ - -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ - -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ -#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ - -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ -#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ - -/* Debug Security Control and Status Register Definitions */ -#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ -#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ - -#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ -#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ - -#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ -#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_FPD_Pos 23U /*!< DCB DHCSR: Floating-point registers Debuggable Position */ -#define DCB_DHCSR_S_FPD_Msk (0x1UL << DCB_DHCSR_S_FPD_Pos) /*!< DCB DHCSR: Floating-point registers Debuggable Mask */ - -#define DCB_DHCSR_S_SUIDE_Pos 22U /*!< DCB DHCSR: Secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_SUIDE_Msk (0x1UL << DCB_DHCSR_S_SUIDE_Pos) /*!< DCB DHCSR: Secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_NSUIDE_Pos 21U /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Position */ -#define DCB_DHCSR_S_NSUIDE_Msk (0x1UL << DCB_DHCSR_S_NSUIDE_Pos) /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_PMOV_Pos 6U /*!< DCB DHCSR: Halt on PMU overflow control Position */ -#define DCB_DHCSR_C_PMOV_Msk (0x1UL << DCB_DHCSR_C_PMOV_Pos) /*!< DCB DHCSR: Halt on PMU overflow control Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DSCEMCR, Debug Set Clear Exception and Monitor Control Register Definitions */ -#define DCB_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< DCB DSCEMCR: Clear monitor request Position */ -#define DCB_DSCEMCR_CLR_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_REQ_Pos) /*!< DCB DSCEMCR: Clear monitor request Mask */ - -#define DCB_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< DCB DSCEMCR: Clear monitor pend Position */ -#define DCB_DSCEMCR_CLR_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_PEND_Pos) /*!< DCB DSCEMCR: Clear monitor pend Mask */ - -#define DCB_DSCEMCR_SET_MON_REQ_Pos 3U /*!< DCB DSCEMCR: Set monitor request Position */ -#define DCB_DSCEMCR_SET_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_SET_MON_REQ_Pos) /*!< DCB DSCEMCR: Set monitor request Mask */ - -#define DCB_DSCEMCR_SET_MON_PEND_Pos 1U /*!< DCB DSCEMCR: Set monitor pend Position */ -#define DCB_DSCEMCR_SET_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_SET_MON_PEND_Pos) /*!< DCB DSCEMCR: Set monitor pend Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_UIDEN_Pos 10U /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Position */ -#define DCB_DAUTHCTRL_UIDEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Mask */ - -#define DCB_DAUTHCTRL_UIDAPEN_Pos 9U /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Position */ -#define DCB_DAUTHCTRL_UIDAPEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDAPEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Mask */ - -#define DCB_DAUTHCTRL_FSDMA_Pos 8U /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Position */ -#define DCB_DAUTHCTRL_FSDMA_Msk (0x1UL << DCB_DAUTHCTRL_FSDMA_Pos) /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Mask */ - -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SUNID_Pos 22U /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUNID_Msk (0x3UL << DIB_DAUTHSTATUS_SUNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SUID_Pos 20U /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_SUID_Msk (0x3UL << DIB_DAUTHSTATUS_SUID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_NSUNID_Pos 18U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Position */ -#define DIB_DAUTHSTATUS_NSUNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Mask */ - -#define DIB_DAUTHSTATUS_NSUID_Pos 16U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Position */ -#define DIB_DAUTHSTATUS_NSUID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Mask */ - -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \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 ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define MEMSYSCTL_BASE (0xE001E000UL) /*!< Memory System Control Base Address */ - #define ERRBNK_BASE (0xE001E100UL) /*!< Error Banking Base Address */ - #define PWRMODCTL_BASE (0xE001E300UL) /*!< Power Mode Control Base Address */ - #define EWIC_BASE (0xE001E400UL) /*!< External Wakeup Interrupt Controller Base Address */ - #define PRCCFGINF_BASE (0xE001E700UL) /*!< Processor Configuration Information Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB 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 ICB ((ICB_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 */ - #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ - #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ - #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ - #define MEMSYSCTL ((MemSysCtl_Type *) MEMSYSCTL_BASE ) /*!< Memory System Control configuration struct */ - #define ERRBNK ((ErrBnk_Type *) ERRBNK_BASE ) /*!< Error Banking configuration struct */ - #define PWRMODCTL ((PwrModCtl_Type *) PWRMODCTL_BASE ) /*!< Power Mode Control configuration struct */ - #define EWIC ((EWIC_Type *) EWIC_BASE ) /*!< EWIC configuration struct */ - #define PRCCFGINF ((PrcCfgInf_Type *) PRCCFGINF_BASE ) /*!< Processor Configuration Information configuration struct */ - #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ - #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ - #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ - #endif - - #if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - #define PMU_BASE (0xE0003000UL) /*!< PMU Base Address */ - #define PMU ((PMU_Type *) PMU_BASE ) /*!< PMU configuration struct */ - #endif - - #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ - #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ - #endif - - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ - #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ - #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ - #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ - #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ - #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ - #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ - - #define ICB_NS ((ICB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ - #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ - #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ - #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ - #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ - #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ - #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ - - #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ - #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ - #endif - - #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ - #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ -/*@} */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_register_aliases Backwards Compatibility Aliases - \brief Register alias definitions for backwards compatibility. - @{ - */ - -/*@} */ - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug 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 - #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 - - -/* Special LR values for Secure/Non-Secure call handling and exception handling */ - -/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ -#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ - -/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ -#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ -#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ -#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ -#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ -#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ -#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ -#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ - -/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ -#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ -#else -#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ -#endif - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \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) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \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->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \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->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (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. - VTOR must been relocated to SRAM before. - \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 *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \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 *)SCB->VTOR; - 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 = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## PMU functions and events #################################### */ - -#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) - -#include "pmu_armv8.h" - -/** - \brief Cortex-M85 PMU events - \note Architectural PMU events can be found in pmu_armv8.h -*/ - -#define ARMCM85_PMU_ECC_ERR 0xC000 /*!< One or more Error Correcting Code (ECC) errors detected */ -#define ARMCM85_PMU_ECC_ERR_MBIT 0xC001 /*!< One or more multi-bit ECC errors detected */ -#define ARMCM85_PMU_ECC_ERR_DCACHE 0xC010 /*!< One or more ECC errors in the data cache */ -#define ARMCM85_PMU_ECC_ERR_ICACHE 0xC011 /*!< One or more ECC errors in the instruction cache */ -#define ARMCM85_PMU_ECC_ERR_MBIT_DCACHE 0xC012 /*!< One or more multi-bit ECC errors in the data cache */ -#define ARMCM85_PMU_ECC_ERR_MBIT_ICACHE 0xC013 /*!< One or more multi-bit ECC errors in the instruction cache */ -#define ARMCM85_PMU_ECC_ERR_DTCM 0xC020 /*!< One or more ECC errors in the Data Tightly Coupled Memory (DTCM) */ -#define ARMCM85_PMU_ECC_ERR_ITCM 0xC021 /*!< One or more ECC errors in the Instruction Tightly Coupled Memory (ITCM) */ -#define ARMCM85_PMU_ECC_ERR_MBIT_DTCM 0xC022 /*!< One or more multi-bit ECC errors in the DTCM */ -#define ARMCM85_PMU_ECC_ERR_MBIT_ITCM 0xC023 /*!< One or more multi-bit ECC errors in the ITCM */ -#define ARMCM85_PMU_PF_LINEFILL 0xC100 /*!< The prefetcher starts a line-fill */ -#define ARMCM85_PMU_PF_CANCEL 0xC101 /*!< The prefetcher stops prefetching */ -#define ARMCM85_PMU_PF_DROP_LINEFILL 0xC102 /*!< A linefill triggered by a prefetcher has been dropped because of lack of buffering */ -#define ARMCM85_PMU_NWAMODE_ENTER 0xC200 /*!< No write-allocate mode entry */ -#define ARMCM85_PMU_NWAMODE 0xC201 /*!< Write-allocate store is not allocated into the data cache due to no-write-allocate mode */ -#define ARMCM85_PMU_SAHB_ACCESS 0xC300 /*!< Read or write access on the S-AHB interface to the TCM */ -#define ARMCM85_PMU_PAHB_ACCESS 0xC301 /*!< Read or write access on the P-AHB write interface */ -#define ARMCM85_PMU_AXI_WRITE_ACCESS 0xC302 /*!< Any beat access to M-AXI write interface */ -#define ARMCM85_PMU_AXI_READ_ACCESS 0xC303 /*!< Any beat access to M-AXI read interface */ -#define ARMCM85_PMU_DOSTIMEOUT_DOUBLE 0xC400 /*!< Denial of Service timeout has fired twice and caused buffers to drain to allow forward progress */ -#define ARMCM85_PMU_DOSTIMEOUT_TRIPLE 0xC401 /*!< Denial of Service timeout has fired three times and blocked the LSU to force forward progress */ - -#endif - -/* ########################## 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) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - -/* ########################## MVE functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_MveFunctions MVE Functions - \brief Function that provides MVE type. - @{ - */ - -/** - \brief get MVE type - \details returns the MVE type - \returns - - \b 0: No Vector Extension (MVE) - - \b 1: Integer Vector Extension (MVE-I) - - \b 2: Floating-point Vector Extension (MVE-F) - */ -__STATIC_INLINE uint32_t SCB_GetMVEType(void) -{ - const uint32_t mvfr1 = FPU->MVFR1; - if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x2U << FPU_MVFR1_MVE_Pos)) - { - return 2U; - } - else if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x1U << FPU_MVFR1_MVE_Pos)) - { - return 1U; - } - else - { - return 0U; - } -} - - -/*@} end of CMSIS_Core_MveFunctions */ - - -/* ########################## Cache functions #################################### */ - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) -#include "cachel1_armv7.h" -#endif - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - -/* ################### PAC Key functions ########################### */ - -#if (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1)) -#include "pac_armv81.h" -#endif - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## 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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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 */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, 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 __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM85_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_sc000.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_sc000.h deleted file mode 100644 index dbc755f..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_sc000.h +++ /dev/null @@ -1,1030 +0,0 @@ -/**************************************************************************//** - * @file core_sc000.h - * @brief CMSIS SC000 Core Peripheral Access Layer Header File - * @version V5.0.7 - * @date 27. March 2020 - ******************************************************************************/ -/* - * Copyright (c) 2009-2020 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_SC000_H_GENERIC -#define __CORE_SC000_H_GENERIC - -#include - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup SC000 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS SC000 definitions */ -#define __SC000_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __SC000_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ - __SC000_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_SC (000U) /*!< Cortex secure 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_FP - #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_SC000_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_SC000_H_DEPENDANT -#define __CORE_SC000_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __SC000_REV - #define __SC000_REV 0x0000U - #warning "__SC000_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT 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 - - IO Type Qualifiers 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 SC000 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core MPU 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 */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __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 RESERVED0[1U]; - __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 */ - uint32_t RESERVED1[154U]; - __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control 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 Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF 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_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT 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 */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. - Therefore they are not covered by the SC000 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 */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * 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 not available for SC000 */ -/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for SC000 */ - #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 SC000 */ - #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) ) - - -/** - \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) - { - __COMPILER_BARRIER(); - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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 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. - VTOR must been relocated to SRAM before. - \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 *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - /* ARM Application Note 321 states that the M0 and M0+ do not require the architectural barrier - assume SC000 is the same */ -} - - -/** - \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 *)SCB->VTOR; - 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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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_SC000_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_sc300.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_sc300.h deleted file mode 100644 index d666210..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_sc300.h +++ /dev/null @@ -1,1917 +0,0 @@ -/**************************************************************************//** - * @file core_sc300.h - * @brief CMSIS SC300 Core Peripheral Access Layer Header File - * @version V5.0.10 - * @date 04. June 2021 - ******************************************************************************/ -/* - * Copyright (c) 2009-2021 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_SC300_H_GENERIC -#define __CORE_SC300_H_GENERIC - -#include - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup SC3000 - @{ - */ - -#include "cmsis_version.h" - -/* CMSIS SC300 definitions */ -#define __SC300_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ -#define __SC300_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ -#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16U) | \ - __SC300_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ - -#define __CORTEX_SC (300U) /*!< Cortex secure 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_FP - #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_SC300_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_SC300_H_DEPENDANT -#define __CORE_SC300_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __SC300_REV - #define __SC300_REV 0x0000U - #warning "__SC300_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 1U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #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 - - IO Type Qualifiers 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 SC300 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU 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:27; /*!< bit: 0..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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 */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q 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:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ -#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ -#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 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 nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - 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 */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV 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[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} 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 */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __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 */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - uint32_t RESERVED1[129U]; - __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control 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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE 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 Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ -#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ - -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF 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_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP 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 */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET 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_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED 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[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT 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_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ -#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ - -#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ -#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ -#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ - -#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ -#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} 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 ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug 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 */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug 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 - #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 */ - - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \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) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \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[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \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[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (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. - VTOR must been relocated to SRAM before. - \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 *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - /* ARM Application Note 321 states that the M3 does not require the architectural barrier */ -} - - -/** - \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 *)SCB->VTOR; - 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 = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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 */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC300_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_starmc1.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_starmc1.h deleted file mode 100644 index d86c8d3..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/core_starmc1.h +++ /dev/null @@ -1,3592 +0,0 @@ -/**************************************************************************//** - * @file core_starmc1.h - * @brief CMSIS ArmChina STAR-MC1 Core Peripheral Access Layer Header File - * @version V1.0.2 - * @date 07. April 2022 - ******************************************************************************/ -/* - * Copyright (c) 2009-2018 Arm Limited. - * Copyright (c) 2018-2022 Arm China. - * 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 */ -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ -#endif - -#ifndef __CORE_STAR_H_GENERIC -#define __CORE_STAR_H_GENERIC - -#include - -#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.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup STAR-MC1 - @{ - */ - -#include "cmsis_version.h" - -/* Macro Define for STAR-MC1 */ -#define __STAR_MC (1U) /*!< STAR-MC Core */ - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined (__TARGET_FPU_VFP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined (__ARM_FP) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined (__ARMVFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - - #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) - #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) - #define __DSP_USED 1U - #else - #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" - #define __DSP_USED 0U - #endif - #else - #define __DSP_USED 0U - #endif - -#elif defined ( __TI_ARM__ ) - #if defined (__TI_VFP_SUPPORT__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined (__FPU_VFP__) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_STAR_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_STAR_H_DEPENDANT -#define __CORE_STAR_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __STAR_REV - #define __STAR_REV 0x0000U - #warning "__STAR_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __SAUREGION_PRESENT - #define __SAUREGION_PRESENT 0U - #warning "__SAUREGION_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DSP_PRESENT - #define __DSP_PRESENT 0U - #warning "__DSP_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DTCM_PRESENT - #define __DTCM_PRESENT 0U - #warning "__DTCM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #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 - - IO Type Qualifiers 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 STAR-MC1 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core SAU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for STAR-MC1 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:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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 */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - 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_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE 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 nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ - uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ - uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ - uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ -#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ - -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV 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[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[16U]; - __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[16U]; - __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[16U]; - __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[16U]; - __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[16U]; - __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ - uint32_t RESERVED5[16U]; - __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED6[580U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} 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 */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __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 */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[1U]; - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ - uint32_t RESERVED_ADD1[21U]; - __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ - uint32_t RESERVED3[69U]; - __OM uint32_t STIR; /*!< Offset: F00-D00=0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ -} SCB_Type; - -typedef struct -{ - __IOM uint32_t CACR; /*!< Offset: 0x0 (R/W) L1 Cache Control Register */ - __IOM uint32_t ITCMCR; /*!< Offset: 0x10 (R/W) Instruction Tightly-Coupled Memory Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x14 (R/W) Data Tightly-Coupled Memory Control Registers */ -}EMSS_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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ -#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ - -#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ -#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ - -#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ -#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ -#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ - -#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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE 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 Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF 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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ -#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ - -#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ -#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ -#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ -#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_BP_Pos 18U /*!< SCB CCR: BP Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ - -#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ -#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ -#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ -#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ - -#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ -#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ - -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ -#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ - -#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ -#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ -#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ -#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ - -#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ -#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ - -#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ -#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ - -#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ -#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ - -#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ -#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ - -#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ -#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ - -/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ -#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ - -#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ -#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ - -#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ -#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ - -#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ -#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ - -#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ -#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ - -#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ -#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ - -#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ -#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ - -/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ -#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ -#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ - -#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ -#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ - -#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ -#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ - -#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ -#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ - -#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ -#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ - -#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ -#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ - -#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ -#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Non-Secure Access Control Register Definitions */ -#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ -#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ - -#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ -#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ - -#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ -#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -#define SCB_CLIDR_IC_Pos 0U /*!< SCB CLIDR: IC Position */ -#define SCB_CLIDR_IC_Msk (1UL << SCB_CLIDR_IC_Pos) /*!< SCB CLIDR: IC Mask */ - -#define SCB_CLIDR_DC_Pos 1U /*!< SCB CLIDR: DC Position */ -#define SCB_CLIDR_DC_Msk (1UL << SCB_CLIDR_DC_Pos) /*!< SCB CLIDR: DC Mask */ - - - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache line Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_LEVEL_Pos 1U /*!< SCB DCISW: Level Position */ -#define SCB_DCISW_LEVEL_Msk (7UL << SCB_DCISW_LEVEL_Pos) /*!< SCB DCISW: Level Mask */ - -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0xFFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean line by Set-way Register Definitions */ -#define SCB_DCCSW_LEVEL_Pos 1U /*!< SCB DCCSW: Level Position */ -#define SCB_DCCSW_LEVEL_Msk (7UL << SCB_DCCSW_LEVEL_Pos) /*!< SCB DCCSW: Level Mask */ - -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0xFFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_LEVEL_Pos 1U /*!< SCB DCCISW: Level Position */ -#define SCB_DCCISW_LEVEL_Msk (7UL << SCB_DCCISW_LEVEL_Pos) /*!< SCB DCCISW: Level Mask */ - -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0xFFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/* ArmChina: Implementation Defined */ -/* Instruction Tightly-Coupled Memory Control Register Definitions */ -#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ -#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ - -#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ -#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ - -/* Data Tightly-Coupled Memory Control Register Definitions */ -#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ -#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ - -#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ -#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ - -/* L1 Cache Control Register Definitions */ -#define SCB_CACR_DCCLEAN_Pos 16U /*!< SCB CACR: DCCLEAN Position */ -#define SCB_CACR_DCCLEAN_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: DCCLEAN Mask */ - -#define SCB_CACR_ICACTIVE_Pos 13U /*!< SCB CACR: ICACTIVE Position */ -#define SCB_CACR_ICACTIVE_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: ICACTIVE Mask */ - -#define SCB_CACR_DCACTIVE_Pos 12U /*!< SCB CACR: DCACTIVE Position */ -#define SCB_CACR_DCACTIVE_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: DCACTIVE Mask */ - -#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ -#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT 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[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ - __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM 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_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ - uint32_t RESERVED6[4U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Stimulus Port Register Definitions */ -#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ -#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ - -#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ -#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ -#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ - -#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ -#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - uint32_t RESERVED3[1U]; - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED4[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - uint32_t RESERVED5[1U]; - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED6[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - uint32_t RESERVED7[1U]; - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED8[1U]; - __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ - uint32_t RESERVED9[1U]; - __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ - uint32_t RESERVED10[1U]; - __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ - uint32_t RESERVED11[1U]; - __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ - uint32_t RESERVED12[1U]; - __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ - uint32_t RESERVED13[1U]; - __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ - uint32_t RESERVED14[1U]; - __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ - uint32_t RESERVED15[1U]; - __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ - uint32_t RESERVED16[1U]; - __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ - uint32_t RESERVED17[1U]; - __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ - uint32_t RESERVED18[1U]; - __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ - uint32_t RESERVED19[1U]; - __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ - uint32_t RESERVED20[1U]; - __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ - uint32_t RESERVED21[1U]; - __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ - uint32_t RESERVED22[1U]; - __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ - uint32_t RESERVED23[1U]; - __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ - uint32_t RESERVED24[1U]; - __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ - uint32_t RESERVED25[1U]; - __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ - uint32_t RESERVED26[1U]; - __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ - uint32_t RESERVED27[1U]; - __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ - uint32_t RESERVED28[1U]; - __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ - uint32_t RESERVED29[1U]; - __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ - uint32_t RESERVED30[1U]; - __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ - uint32_t RESERVED31[1U]; - __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ - uint32_t RESERVED32[934U]; - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ - uint32_t RESERVED33[1U]; - __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ -#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ -#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ - -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ -#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ - -#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ -#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ - __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ - __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ -#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration Test FIFO Test Data 0 Register Definitions */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ -#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ -#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ -#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ - -#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ -#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ - -/* TPI Integration Test ATB Control Register 2 Register Definitions */ -#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ -#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ - -#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ -#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ - -#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ -#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ - -#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ -#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ - -/* TPI Integration Test FIFO Test Data 1 Register Definitions */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ -#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ - -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ -#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ - -#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ -#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ -#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ -#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ - -#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ -#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ - -/* TPI Integration Test ATB Control Register 0 Definitions */ -#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ -#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ - -#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ -#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ - -#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ -#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ - -#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ -#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ -#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ - __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ - __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ - __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ - uint32_t RESERVED0[1]; - union { - __IOM uint32_t MAIR[2]; - struct { - __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ - __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ - }; - }; -} MPU_Type; - -#define MPU_TYPE_RALIASES 4U - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ -#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ - -#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ -#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ - -#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ -#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ - -#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ -#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ - -/* MPU Region Limit Address Register Definitions */ -#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ -#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ - -#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ -#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ - -#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ -#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ - -/* MPU Memory Attribute Indirection Register 0 Definitions */ -#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ -#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ - -#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ -#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ - -#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ -#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ - -#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ -#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ - -/* MPU Memory Attribute Indirection Register 1 Definitions */ -#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ -#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ - -#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ -#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ - -#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ -#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ - -#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ -#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SAU Security Attribution Unit (SAU) - \brief Type definitions for the Security Attribution Unit (SAU) - @{ - */ - -/** - \brief Structure type to access the Security Attribution Unit (SAU). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ - __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ - __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ -#else - uint32_t RESERVED0[3]; -#endif - __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ - __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ -} SAU_Type; - -/* SAU Control Register Definitions */ -#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ -#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ - -#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ -#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ - -/* SAU Type Register Definitions */ -#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ -#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ - -#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) -/* SAU Region Number Register Definitions */ -#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ -#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ - -/* SAU Region Base Address Register Definitions */ -#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ -#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ - -/* SAU Region Limit Address Register Definitions */ -#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ -#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ - -#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ -#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ - -#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ -#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ - -#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ - -/* Secure Fault Status Register Definitions */ -#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ -#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ - -#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ -#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ - -#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ -#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ - -#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ -#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ - -#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ -#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ - -#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ -#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ - -#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ -#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ - -#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ -#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ - -/*@} end of group CMSIS_SAU */ -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ -#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ - -#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ -#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ - -#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ -#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ - -#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ -#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ - -#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ -#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ - -#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ -#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ -#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ -#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and VFP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and VFP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and VFP Feature Register 2 Definitions */ -#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ -#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ - -/*@} end of group CMSIS_FPU */ - - - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DCB Debug Control Block - \brief Type definitions for the Debug Control Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Control Block Registers (DCB). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ - __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ -} DCB_Type; - -/* DHCSR, Debug Halting Control and Status Register Definitions */ -#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ -#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ - -#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ -#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ - -#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ -#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ - -#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ -#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ - -#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ -#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ - -#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ -#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ - -#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ -#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ - -#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ -#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ - -#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ -#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ - -#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ -#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ - -#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ -#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ - -#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ -#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ - -#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ -#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ - -#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ -#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ - -/* DCRSR, Debug Core Register Select Register Definitions */ -#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ -#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ - -#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ -#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ - -/* DCRDR, Debug Core Register Data Register Definitions */ -#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ -#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ - -/* DEMCR, Debug Exception and Monitor Control Register Definitions */ -#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ -#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ - -#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ -#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ - -#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ -#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ - -#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ -#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ - -#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ -#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ - -#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ -#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ - -#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ -#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ - -#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ -#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ - -#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ -#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ - -#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ -#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ - -#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ -#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ - -#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ -#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ - -#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ -#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ - -#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ -#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ - -#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ -#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ - -#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ -#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ - -#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ -#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ - -/* DAUTHCTRL, Debug Authentication Control Register Definitions */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ - -#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ -#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ - -#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ -#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ - -/* DSCSR, Debug Security Control and Status Register Definitions */ -#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ -#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ - -#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ -#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ - -#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ -#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ - -#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ -#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ - -/*@} end of group CMSIS_DCB */ - - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DIB Debug Identification Block - \brief Type definitions for the Debug Identification Block Registers - @{ - */ - -/** - \brief Structure type to access the Debug Identification Block Registers (DIB). - */ -typedef struct -{ - __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ - __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ - __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ - __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ - __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ -} DIB_Type; - -/* DLAR, SCS Software Lock Access Register Definitions */ -#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ -#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ - -/* DLSR, SCS Software Lock Status Register Definitions */ -#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ -#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ - -#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ -#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ - -#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ -#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ - -/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ -#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ - -#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ -#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ - -/* DDEVARCH, SCS Device Architecture Register Definitions */ -#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ -#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ - -#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ -#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ - -#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ -#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ - -#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ -#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ - -#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ -#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ - -/* DDEVTYPE, SCS Device Type Register Definitions */ -#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ -#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ - -#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ -#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ - - -/*@} end of group CMSIS_DIB */ - - -/** - \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 ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ - #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ - #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ - #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ - #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ - #define EMSS_BASE (0xE001E000UL) /*!AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \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) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } -} - - -/** - \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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Interrupt Target State - \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - \return 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Target State - \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Clear Interrupt Target State - \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 if interrupt is assigned to Secure - 1 if interrupt is assigned to Non Secure - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); - return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - - -/** - \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->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \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->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (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. - VTOR must been relocated to SRAM before. - \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 *)SCB->VTOR; - vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; - __DSB(); -} - - -/** - \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 *)SCB->VTOR; - 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 including - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/** - \brief Software Reset - \details Initiates a system reset request to reset the CPU. - */ -__NO_RETURN __STATIC_INLINE void __SW_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses including - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_BFHFNMINS_Msk) | /* Keep BFHFNMINS unchanged. Use this Reset function in case your case need to keep it */ - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | /* Keep priority group unchanged */ - SCB_AIRCR_SYSRESETREQ_Msk ); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Grouping (non-secure) - \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - 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 Priority grouping field. - */ -__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB_NS->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB_NS->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping (non-secure) - \details Reads the priority grouping field from the non-secure NVIC when in secure state. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) -{ - return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable Interrupt (non-secure) - \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Interrupt Enable status (non-secure) - \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. - \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Disable Interrupt (non-secure) - \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Pending Interrupt (non-secure) - \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Pending Interrupt (non-secure) - \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Clear Pending Interrupt (non-secure) - \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. - \param [in] IRQn Device specific interrupt number. - \note IRQn must not be negative. - */ -__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } -} - - -/** - \brief Get Active Interrupt (non-secure) - \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. - \param [in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) -{ - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } -} - - -/** - \brief Set Interrupt Priority (non-secure) - \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 non-secure processor exception. - */ -__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) >= 0) - { - NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority (non-secure) - \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. - 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } -} -#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_NVICFunctions */ - -/* ########################## MPU functions #################################### */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - -#include "mpu_armv8.h" - -#endif - -/* ########################## 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) -{ - uint32_t mvfr0; - - mvfr0 = FPU->MVFR0; - if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) - { - return 2U; /* Double + Single precision FPU */ - } - else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) - { - return 1U; /* Single precision FPU */ - } - else - { - return 0U; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## SAU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SAUFunctions SAU Functions - \brief Functions that configure the SAU. - @{ - */ - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) - -/** - \brief Enable SAU - \details Enables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Enable(void) -{ - SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); -} - - - -/** - \brief Disable SAU - \details Disables the Security Attribution Unit (SAU). - */ -__STATIC_INLINE void TZ_SAU_Disable(void) -{ - SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); -} - -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_SAUFunctions */ - - - -/* ################################## Debug Control function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DCBFunctions Debug Control Functions - \brief Functions that access the Debug Control Block. - @{ - */ - - -/** - \brief Set Debug Authentication Control Register - \details writes to Debug Authentication Control register. - \param [in] value value to be writen. - */ -__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) -{ - __DSB(); - __ISB(); - DCB->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register - \details Reads Debug Authentication Control register. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) -{ - return (DCB->DAUTHCTRL); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Debug Authentication Control Register (non-secure) - \details writes to non-secure Debug Authentication Control register when in secure state. - \param [in] value value to be writen - */ -__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) -{ - __DSB(); - __ISB(); - DCB_NS->DAUTHCTRL = value; - __DSB(); - __ISB(); -} - - -/** - \brief Get Debug Authentication Control Register (non-secure) - \details Reads non-secure Debug Authentication Control register when in secure state. - \return Debug Authentication Control Register. - */ -__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) -{ - return (DCB_NS->DAUTHCTRL); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - - - -/* ################################## Debug Identification function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions - \brief Functions that access the Debug Identification Block. - @{ - */ - - -/** - \brief Get Debug Authentication Status Register - \details Reads Debug Authentication Status register. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) -{ - return (DIB->DAUTHSTATUS); -} - - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Debug Authentication Status Register (non-secure) - \details Reads non-secure Debug Authentication Status register when in secure state. - \return Debug Authentication Status Register. - */ -__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) -{ - return (DIB_NS->DAUTHSTATUS); -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -/*@} end of CMSIS_Core_DCBFunctions */ - - -#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ - (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) - -/* ########################## Cache functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_CacheFunctions Cache Functions - \brief Functions that configure Instruction and Data cache. - @{ - */ - -/* Cache Size ID Register Macros */ -#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) -#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) - -#define __SCB_DCACHE_LINE_SIZE 32U /*!< STAR-MC1 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ -#define __SCB_ICACHE_LINE_SIZE 32U /*!< STAR-MC1 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ - -/** - \brief Enable I-Cache - \details Turns on I-Cache - */ -__STATIC_FORCEINLINE void SCB_EnableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - if (SCB->CCR & SCB_CCR_IC_Msk) return; /* return if ICache is already enabled */ - - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable I-Cache - \details Turns off I-Cache - */ -__STATIC_FORCEINLINE void SCB_DisableICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate I-Cache - \details Invalidates I-Cache - */ -__STATIC_FORCEINLINE void SCB_InvalidateICache (void) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; - __DSB(); - __ISB(); - #endif -} - - -/** - \brief I-Cache Invalidate by address - \details Invalidates I-Cache for the given address. - I-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. - I-Cache memory blocks which are part of given address + given size are invalidated. - \param[in] addr address - \param[in] isize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_InvalidateICache_by_Addr (void *addr, int32_t isize) -{ - #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) - if ( isize > 0 ) { - int32_t op_size = isize + (((uint32_t)addr) & (__SCB_ICACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_ICACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->ICIMVAU = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_ICACHE_LINE_SIZE; - op_size -= __SCB_ICACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief Enable D-Cache - \details Turns on D-Cache - */ -__STATIC_FORCEINLINE void SCB_EnableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */ - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - __DSB(); - - SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable D-Cache - \details Turns off D-Cache - */ -__STATIC_FORCEINLINE void SCB_DisableDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate D-Cache - \details Invalidates D-Cache - */ -__STATIC_FORCEINLINE void SCB_InvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean D-Cache - \details Cleans D-Cache - */ -__STATIC_FORCEINLINE void SCB_CleanDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | - ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean & Invalidate D-Cache - \details Cleans and Invalidates D-Cache - */ -__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache (void) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = 0U; /* select Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways-- != 0U); - } while(sets-- != 0U); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief D-Cache Invalidate by address - \details Invalidates D-Cache for the given address. - D-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are invalidated. - \param[in] addr address - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_InvalidateDCache_by_Addr (void *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief D-Cache Clean by address - \details Cleans D-Cache for the given address - D-Cache is cleaned starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are cleaned. - \param[in] addr address - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCCMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - - -/** - \brief D-Cache Clean and Invalidate by address - \details Cleans and invalidates D_Cache for the given address - D-Cache is cleaned and invalidated starting from a 32 byte aligned address in 32 byte granularity. - D-Cache memory blocks which are part of given address + given size are cleaned and invalidated. - \param[in] addr address (aligned to 32-byte boundary) - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) -{ - #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) - if ( dsize > 0 ) { - int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); - uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; - - __DSB(); - - do { - SCB->DCCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ - op_addr += __SCB_DCACHE_LINE_SIZE; - op_size -= __SCB_DCACHE_LINE_SIZE; - } while ( op_size > 0 ); - - __DSB(); - __ISB(); - } - #endif -} - -/*@} end of CMSIS_Core_CacheFunctions */ -#endif - - -/* ################################## 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 __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - 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 */ -} - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -/** - \brief System Tick Configuration (non-secure) - \details Initializes the non-secure System Timer and its interrupt when in secure state, 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 __Vendor_SysTickConfig is set to 1, then the - function TZ_SysTick_Config_NS is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} -#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_STAR_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/mpu_armv7.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/mpu_armv7.h deleted file mode 100644 index d9eedf8..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/mpu_armv7.h +++ /dev/null @@ -1,275 +0,0 @@ -/****************************************************************************** - * @file mpu_armv7.h - * @brief CMSIS MPU API for Armv7-M MPU - * @version V5.1.2 - * @date 25. May 2020 - ******************************************************************************/ -/* - * Copyright (c) 2017-2020 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))) | \ - (((SubRegionDisable) << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk) | \ - (((Size) << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk) | \ - (((MPU_RASR_ENABLE_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 shareable) or 010b (if non-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) >> 1U), ((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) -{ - __DMB(); - MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; -#endif - __DSB(); - __ISB(); -} - -/** Disable the MPU. -*/ -__STATIC_INLINE void ARM_MPU_Disable(void) -{ - __DMB(); -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; -#endif - MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; - __DSB(); - __ISB(); -} - -/** 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 rasr Value for RASR 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 rasr Value for RASR 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; -} - -/** Memcpy with strictly ordered memory access, e.g. used by code in ARM_MPU_Load(). -* \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 ARM_MPU_OrderedMemcpy(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) { - ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); - table += MPU_TYPE_RALIASES; - cnt -= MPU_TYPE_RALIASES; - } - ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); -} - -#endif diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/mpu_armv8.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/mpu_armv8.h deleted file mode 100644 index 3de16ef..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/mpu_armv8.h +++ /dev/null @@ -1,352 +0,0 @@ -/****************************************************************************** - * @file mpu_armv8.h - * @brief CMSIS MPU API for Armv8-M and Armv8.1-M MPU - * @version V5.1.3 - * @date 03. February 2021 - ******************************************************************************/ -/* - * Copyright (c) 2017-2021 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)) - -#if defined(MPU_RLAR_PXN_Pos) - -/** \brief Region Limit Address Register with PXN value -* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. -* \param PXN Privileged execute never. Defines whether code can be executed from this privileged region. -* \param IDX The attribute index to be associated with this memory region. -*/ -#define ARM_MPU_RLAR_PXN(LIMIT, PXN, IDX) \ - (((LIMIT) & MPU_RLAR_LIMIT_Msk) | \ - (((PXN) << MPU_RLAR_PXN_Pos) & MPU_RLAR_PXN_Msk) | \ - (((IDX) << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ - (MPU_RLAR_EN_Msk)) - -#endif - -/** -* 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) -{ - __DMB(); - MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; -#endif - __DSB(); - __ISB(); -} - -/** Disable the MPU. -*/ -__STATIC_INLINE void ARM_MPU_Disable(void) -{ - __DMB(); -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; -#endif - MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; - __DSB(); - __ISB(); -} - -#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) -{ - __DMB(); - MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; -#endif - __DSB(); - __ISB(); -} - -/** Disable the Non-secure MPU. -*/ -__STATIC_INLINE void ARM_MPU_Disable_NS(void) -{ - __DMB(); -#ifdef SCB_SHCSR_MEMFAULTENA_Msk - SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; -#endif - MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk; - __DSB(); - __ISB(); -} -#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 - -/** Memcpy with strictly ordered memory access, e.g. used by code in ARM_MPU_LoadEx() -* \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 ARM_MPU_OrderedMemcpy(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; - ARM_MPU_OrderedMemcpy(&(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; - ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize); - table += c; - cnt -= c; - rnrOffset = 0U; - rnrBase += MPU_TYPE_RALIASES; - mpu->RNR = rnrBase; - } - - ARM_MPU_OrderedMemcpy(&(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 - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/pac_armv81.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/pac_armv81.h deleted file mode 100644 index 854b60a..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/pac_armv81.h +++ /dev/null @@ -1,206 +0,0 @@ -/****************************************************************************** - * @file pac_armv81.h - * @brief CMSIS PAC key functions for Armv8.1-M PAC extension - * @version V1.0.0 - * @date 23. March 2022 - ******************************************************************************/ -/* - * Copyright (c) 2022 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 PAC_ARMV81_H -#define PAC_ARMV81_H - - -/* ################### PAC Key functions ########################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_PacKeyFunctions PAC Key functions - \brief Functions that access the PAC keys. - @{ - */ - -#if (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1)) - -/** - \brief read the PAC key used for privileged mode - \details Reads the PAC key stored in the PAC_KEY_P registers. - \param [out] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __get_PAC_KEY_P (uint32_t* pPacKey) { - __ASM volatile ( - "mrs r1, pac_key_p_0\n" - "str r1,[%0,#0]\n" - "mrs r1, pac_key_p_1\n" - "str r1,[%0,#4]\n" - "mrs r1, pac_key_p_2\n" - "str r1,[%0,#8]\n" - "mrs r1, pac_key_p_3\n" - "str r1,[%0,#12]\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief write the PAC key used for privileged mode - \details writes the given PAC key to the PAC_KEY_P registers. - \param [in] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __set_PAC_KEY_P (uint32_t* pPacKey) { - __ASM volatile ( - "ldr r1,[%0,#0]\n" - "msr pac_key_p_0, r1\n" - "ldr r1,[%0,#4]\n" - "msr pac_key_p_1, r1\n" - "ldr r1,[%0,#8]\n" - "msr pac_key_p_2, r1\n" - "ldr r1,[%0,#12]\n" - "msr pac_key_p_3, r1\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief read the PAC key used for unprivileged mode - \details Reads the PAC key stored in the PAC_KEY_U registers. - \param [out] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __get_PAC_KEY_U (uint32_t* pPacKey) { - __ASM volatile ( - "mrs r1, pac_key_u_0\n" - "str r1,[%0,#0]\n" - "mrs r1, pac_key_u_1\n" - "str r1,[%0,#4]\n" - "mrs r1, pac_key_u_2\n" - "str r1,[%0,#8]\n" - "mrs r1, pac_key_u_3\n" - "str r1,[%0,#12]\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief write the PAC key used for unprivileged mode - \details writes the given PAC key to the PAC_KEY_U registers. - \param [in] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __set_PAC_KEY_U (uint32_t* pPacKey) { - __ASM volatile ( - "ldr r1,[%0,#0]\n" - "msr pac_key_u_0, r1\n" - "ldr r1,[%0,#4]\n" - "msr pac_key_u_1, r1\n" - "ldr r1,[%0,#8]\n" - "msr pac_key_u_2, r1\n" - "ldr r1,[%0,#12]\n" - "msr pac_key_u_3, r1\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) - -/** - \brief read the PAC key used for privileged mode (non-secure) - \details Reads the PAC key stored in the non-secure PAC_KEY_P registers when in secure mode. - \param [out] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __TZ_get_PAC_KEY_P_NS (uint32_t* pPacKey) { - __ASM volatile ( - "mrs r1, pac_key_p_0_ns\n" - "str r1,[%0,#0]\n" - "mrs r1, pac_key_p_1_ns\n" - "str r1,[%0,#4]\n" - "mrs r1, pac_key_p_2_ns\n" - "str r1,[%0,#8]\n" - "mrs r1, pac_key_p_3_ns\n" - "str r1,[%0,#12]\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief write the PAC key used for privileged mode (non-secure) - \details writes the given PAC key to the non-secure PAC_KEY_P registers when in secure mode. - \param [in] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __TZ_set_PAC_KEY_P_NS (uint32_t* pPacKey) { - __ASM volatile ( - "ldr r1,[%0,#0]\n" - "msr pac_key_p_0_ns, r1\n" - "ldr r1,[%0,#4]\n" - "msr pac_key_p_1_ns, r1\n" - "ldr r1,[%0,#8]\n" - "msr pac_key_p_2_ns, r1\n" - "ldr r1,[%0,#12]\n" - "msr pac_key_p_3_ns, r1\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief read the PAC key used for unprivileged mode (non-secure) - \details Reads the PAC key stored in the non-secure PAC_KEY_U registers when in secure mode. - \param [out] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __TZ_get_PAC_KEY_U_NS (uint32_t* pPacKey) { - __ASM volatile ( - "mrs r1, pac_key_u_0_ns\n" - "str r1,[%0,#0]\n" - "mrs r1, pac_key_u_1_ns\n" - "str r1,[%0,#4]\n" - "mrs r1, pac_key_u_2_ns\n" - "str r1,[%0,#8]\n" - "mrs r1, pac_key_u_3_ns\n" - "str r1,[%0,#12]\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -/** - \brief write the PAC key used for unprivileged mode (non-secure) - \details writes the given PAC key to the non-secure PAC_KEY_U registers when in secure mode. - \param [in] pPacKey 128bit PAC key - */ -__STATIC_FORCEINLINE void __TZ_set_PAC_KEY_U_NS (uint32_t* pPacKey) { - __ASM volatile ( - "ldr r1,[%0,#0]\n" - "msr pac_key_u_0_ns, r1\n" - "ldr r1,[%0,#4]\n" - "msr pac_key_u_1_ns, r1\n" - "ldr r1,[%0,#8]\n" - "msr pac_key_u_2_ns, r1\n" - "ldr r1,[%0,#12]\n" - "msr pac_key_u_3_ns, r1\n" - : : "r" (pPacKey) : "memory", "r1" - ); -} - -#endif /* (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) */ - -#endif /* (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1)) */ - -/*@} end of CMSIS_Core_PacKeyFunctions */ - - -#endif /* PAC_ARMV81_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/pmu_armv8.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/pmu_armv8.h deleted file mode 100644 index f8f3d89..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/pmu_armv8.h +++ /dev/null @@ -1,337 +0,0 @@ -/****************************************************************************** - * @file pmu_armv8.h - * @brief CMSIS PMU API for Armv8.1-M PMU - * @version V1.0.1 - * @date 15. April 2020 - ******************************************************************************/ -/* - * Copyright (c) 2020 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_PMU_ARMV8_H -#define ARM_PMU_ARMV8_H - -/** - * \brief PMU Events - * \note See the Armv8.1-M Architecture Reference Manual for full details on these PMU events. - * */ - -#define ARM_PMU_SW_INCR 0x0000 /*!< Software update to the PMU_SWINC register, architecturally executed and condition code check pass */ -#define ARM_PMU_L1I_CACHE_REFILL 0x0001 /*!< L1 I-Cache refill */ -#define ARM_PMU_L1D_CACHE_REFILL 0x0003 /*!< L1 D-Cache refill */ -#define ARM_PMU_L1D_CACHE 0x0004 /*!< L1 D-Cache access */ -#define ARM_PMU_LD_RETIRED 0x0006 /*!< Memory-reading instruction architecturally executed and condition code check pass */ -#define ARM_PMU_ST_RETIRED 0x0007 /*!< Memory-writing instruction architecturally executed and condition code check pass */ -#define ARM_PMU_INST_RETIRED 0x0008 /*!< Instruction architecturally executed */ -#define ARM_PMU_EXC_TAKEN 0x0009 /*!< Exception entry */ -#define ARM_PMU_EXC_RETURN 0x000A /*!< Exception return instruction architecturally executed and the condition code check pass */ -#define ARM_PMU_PC_WRITE_RETIRED 0x000C /*!< Software change to the Program Counter (PC). Instruction is architecturally executed and condition code check pass */ -#define ARM_PMU_BR_IMMED_RETIRED 0x000D /*!< Immediate branch architecturally executed */ -#define ARM_PMU_BR_RETURN_RETIRED 0x000E /*!< Function return instruction architecturally executed and the condition code check pass */ -#define ARM_PMU_UNALIGNED_LDST_RETIRED 0x000F /*!< Unaligned memory memory-reading or memory-writing instruction architecturally executed and condition code check pass */ -#define ARM_PMU_BR_MIS_PRED 0x0010 /*!< Mispredicted or not predicted branch speculatively executed */ -#define ARM_PMU_CPU_CYCLES 0x0011 /*!< Cycle */ -#define ARM_PMU_BR_PRED 0x0012 /*!< Predictable branch speculatively executed */ -#define ARM_PMU_MEM_ACCESS 0x0013 /*!< Data memory access */ -#define ARM_PMU_L1I_CACHE 0x0014 /*!< Level 1 instruction cache access */ -#define ARM_PMU_L1D_CACHE_WB 0x0015 /*!< Level 1 data cache write-back */ -#define ARM_PMU_L2D_CACHE 0x0016 /*!< Level 2 data cache access */ -#define ARM_PMU_L2D_CACHE_REFILL 0x0017 /*!< Level 2 data cache refill */ -#define ARM_PMU_L2D_CACHE_WB 0x0018 /*!< Level 2 data cache write-back */ -#define ARM_PMU_BUS_ACCESS 0x0019 /*!< Bus access */ -#define ARM_PMU_MEMORY_ERROR 0x001A /*!< Local memory error */ -#define ARM_PMU_INST_SPEC 0x001B /*!< Instruction speculatively executed */ -#define ARM_PMU_BUS_CYCLES 0x001D /*!< Bus cycles */ -#define ARM_PMU_CHAIN 0x001E /*!< For an odd numbered counter, increment when an overflow occurs on the preceding even-numbered counter on the same PE */ -#define ARM_PMU_L1D_CACHE_ALLOCATE 0x001F /*!< Level 1 data cache allocation without refill */ -#define ARM_PMU_L2D_CACHE_ALLOCATE 0x0020 /*!< Level 2 data cache allocation without refill */ -#define ARM_PMU_BR_RETIRED 0x0021 /*!< Branch instruction architecturally executed */ -#define ARM_PMU_BR_MIS_PRED_RETIRED 0x0022 /*!< Mispredicted branch instruction architecturally executed */ -#define ARM_PMU_STALL_FRONTEND 0x0023 /*!< No operation issued because of the frontend */ -#define ARM_PMU_STALL_BACKEND 0x0024 /*!< No operation issued because of the backend */ -#define ARM_PMU_L2I_CACHE 0x0027 /*!< Level 2 instruction cache access */ -#define ARM_PMU_L2I_CACHE_REFILL 0x0028 /*!< Level 2 instruction cache refill */ -#define ARM_PMU_L3D_CACHE_ALLOCATE 0x0029 /*!< Level 3 data cache allocation without refill */ -#define ARM_PMU_L3D_CACHE_REFILL 0x002A /*!< Level 3 data cache refill */ -#define ARM_PMU_L3D_CACHE 0x002B /*!< Level 3 data cache access */ -#define ARM_PMU_L3D_CACHE_WB 0x002C /*!< Level 3 data cache write-back */ -#define ARM_PMU_LL_CACHE_RD 0x0036 /*!< Last level data cache read */ -#define ARM_PMU_LL_CACHE_MISS_RD 0x0037 /*!< Last level data cache read miss */ -#define ARM_PMU_L1D_CACHE_MISS_RD 0x0039 /*!< Level 1 data cache read miss */ -#define ARM_PMU_OP_COMPLETE 0x003A /*!< Operation retired */ -#define ARM_PMU_OP_SPEC 0x003B /*!< Operation speculatively executed */ -#define ARM_PMU_STALL 0x003C /*!< Stall cycle for instruction or operation not sent for execution */ -#define ARM_PMU_STALL_OP_BACKEND 0x003D /*!< Stall cycle for instruction or operation not sent for execution due to pipeline backend */ -#define ARM_PMU_STALL_OP_FRONTEND 0x003E /*!< Stall cycle for instruction or operation not sent for execution due to pipeline frontend */ -#define ARM_PMU_STALL_OP 0x003F /*!< Instruction or operation slots not occupied each cycle */ -#define ARM_PMU_L1D_CACHE_RD 0x0040 /*!< Level 1 data cache read */ -#define ARM_PMU_LE_RETIRED 0x0100 /*!< Loop end instruction executed */ -#define ARM_PMU_LE_SPEC 0x0101 /*!< Loop end instruction speculatively executed */ -#define ARM_PMU_BF_RETIRED 0x0104 /*!< Branch future instruction architecturally executed and condition code check pass */ -#define ARM_PMU_BF_SPEC 0x0105 /*!< Branch future instruction speculatively executed and condition code check pass */ -#define ARM_PMU_LE_CANCEL 0x0108 /*!< Loop end instruction not taken */ -#define ARM_PMU_BF_CANCEL 0x0109 /*!< Branch future instruction not taken */ -#define ARM_PMU_SE_CALL_S 0x0114 /*!< Call to secure function, resulting in Security state change */ -#define ARM_PMU_SE_CALL_NS 0x0115 /*!< Call to non-secure function, resulting in Security state change */ -#define ARM_PMU_DWT_CMPMATCH0 0x0118 /*!< DWT comparator 0 match */ -#define ARM_PMU_DWT_CMPMATCH1 0x0119 /*!< DWT comparator 1 match */ -#define ARM_PMU_DWT_CMPMATCH2 0x011A /*!< DWT comparator 2 match */ -#define ARM_PMU_DWT_CMPMATCH3 0x011B /*!< DWT comparator 3 match */ -#define ARM_PMU_MVE_INST_RETIRED 0x0200 /*!< MVE instruction architecturally executed */ -#define ARM_PMU_MVE_INST_SPEC 0x0201 /*!< MVE instruction speculatively executed */ -#define ARM_PMU_MVE_FP_RETIRED 0x0204 /*!< MVE floating-point instruction architecturally executed */ -#define ARM_PMU_MVE_FP_SPEC 0x0205 /*!< MVE floating-point instruction speculatively executed */ -#define ARM_PMU_MVE_FP_HP_RETIRED 0x0208 /*!< MVE half-precision floating-point instruction architecturally executed */ -#define ARM_PMU_MVE_FP_HP_SPEC 0x0209 /*!< MVE half-precision floating-point instruction speculatively executed */ -#define ARM_PMU_MVE_FP_SP_RETIRED 0x020C /*!< MVE single-precision floating-point instruction architecturally executed */ -#define ARM_PMU_MVE_FP_SP_SPEC 0x020D /*!< MVE single-precision floating-point instruction speculatively executed */ -#define ARM_PMU_MVE_FP_MAC_RETIRED 0x0214 /*!< MVE floating-point multiply or multiply-accumulate instruction architecturally executed */ -#define ARM_PMU_MVE_FP_MAC_SPEC 0x0215 /*!< MVE floating-point multiply or multiply-accumulate instruction speculatively executed */ -#define ARM_PMU_MVE_INT_RETIRED 0x0224 /*!< MVE integer instruction architecturally executed */ -#define ARM_PMU_MVE_INT_SPEC 0x0225 /*!< MVE integer instruction speculatively executed */ -#define ARM_PMU_MVE_INT_MAC_RETIRED 0x0228 /*!< MVE multiply or multiply-accumulate instruction architecturally executed */ -#define ARM_PMU_MVE_INT_MAC_SPEC 0x0229 /*!< MVE multiply or multiply-accumulate instruction speculatively executed */ -#define ARM_PMU_MVE_LDST_RETIRED 0x0238 /*!< MVE load or store instruction architecturally executed */ -#define ARM_PMU_MVE_LDST_SPEC 0x0239 /*!< MVE load or store instruction speculatively executed */ -#define ARM_PMU_MVE_LD_RETIRED 0x023C /*!< MVE load instruction architecturally executed */ -#define ARM_PMU_MVE_LD_SPEC 0x023D /*!< MVE load instruction speculatively executed */ -#define ARM_PMU_MVE_ST_RETIRED 0x0240 /*!< MVE store instruction architecturally executed */ -#define ARM_PMU_MVE_ST_SPEC 0x0241 /*!< MVE store instruction speculatively executed */ -#define ARM_PMU_MVE_LDST_CONTIG_RETIRED 0x0244 /*!< MVE contiguous load or store instruction architecturally executed */ -#define ARM_PMU_MVE_LDST_CONTIG_SPEC 0x0245 /*!< MVE contiguous load or store instruction speculatively executed */ -#define ARM_PMU_MVE_LD_CONTIG_RETIRED 0x0248 /*!< MVE contiguous load instruction architecturally executed */ -#define ARM_PMU_MVE_LD_CONTIG_SPEC 0x0249 /*!< MVE contiguous load instruction speculatively executed */ -#define ARM_PMU_MVE_ST_CONTIG_RETIRED 0x024C /*!< MVE contiguous store instruction architecturally executed */ -#define ARM_PMU_MVE_ST_CONTIG_SPEC 0x024D /*!< MVE contiguous store instruction speculatively executed */ -#define ARM_PMU_MVE_LDST_NONCONTIG_RETIRED 0x0250 /*!< MVE non-contiguous load or store instruction architecturally executed */ -#define ARM_PMU_MVE_LDST_NONCONTIG_SPEC 0x0251 /*!< MVE non-contiguous load or store instruction speculatively executed */ -#define ARM_PMU_MVE_LD_NONCONTIG_RETIRED 0x0254 /*!< MVE non-contiguous load instruction architecturally executed */ -#define ARM_PMU_MVE_LD_NONCONTIG_SPEC 0x0255 /*!< MVE non-contiguous load instruction speculatively executed */ -#define ARM_PMU_MVE_ST_NONCONTIG_RETIRED 0x0258 /*!< MVE non-contiguous store instruction architecturally executed */ -#define ARM_PMU_MVE_ST_NONCONTIG_SPEC 0x0259 /*!< MVE non-contiguous store instruction speculatively executed */ -#define ARM_PMU_MVE_LDST_MULTI_RETIRED 0x025C /*!< MVE memory instruction targeting multiple registers architecturally executed */ -#define ARM_PMU_MVE_LDST_MULTI_SPEC 0x025D /*!< MVE memory instruction targeting multiple registers speculatively executed */ -#define ARM_PMU_MVE_LD_MULTI_RETIRED 0x0260 /*!< MVE memory load instruction targeting multiple registers architecturally executed */ -#define ARM_PMU_MVE_LD_MULTI_SPEC 0x0261 /*!< MVE memory load instruction targeting multiple registers speculatively executed */ -#define ARM_PMU_MVE_ST_MULTI_RETIRED 0x0261 /*!< MVE memory store instruction targeting multiple registers architecturally executed */ -#define ARM_PMU_MVE_ST_MULTI_SPEC 0x0265 /*!< MVE memory store instruction targeting multiple registers speculatively executed */ -#define ARM_PMU_MVE_LDST_UNALIGNED_RETIRED 0x028C /*!< MVE unaligned memory load or store instruction architecturally executed */ -#define ARM_PMU_MVE_LDST_UNALIGNED_SPEC 0x028D /*!< MVE unaligned memory load or store instruction speculatively executed */ -#define ARM_PMU_MVE_LD_UNALIGNED_RETIRED 0x0290 /*!< MVE unaligned load instruction architecturally executed */ -#define ARM_PMU_MVE_LD_UNALIGNED_SPEC 0x0291 /*!< MVE unaligned load instruction speculatively executed */ -#define ARM_PMU_MVE_ST_UNALIGNED_RETIRED 0x0294 /*!< MVE unaligned store instruction architecturally executed */ -#define ARM_PMU_MVE_ST_UNALIGNED_SPEC 0x0295 /*!< MVE unaligned store instruction speculatively executed */ -#define ARM_PMU_MVE_LDST_UNALIGNED_NONCONTIG_RETIRED 0x0298 /*!< MVE unaligned noncontiguous load or store instruction architecturally executed */ -#define ARM_PMU_MVE_LDST_UNALIGNED_NONCONTIG_SPEC 0x0299 /*!< MVE unaligned noncontiguous load or store instruction speculatively executed */ -#define ARM_PMU_MVE_VREDUCE_RETIRED 0x02A0 /*!< MVE vector reduction instruction architecturally executed */ -#define ARM_PMU_MVE_VREDUCE_SPEC 0x02A1 /*!< MVE vector reduction instruction speculatively executed */ -#define ARM_PMU_MVE_VREDUCE_FP_RETIRED 0x02A4 /*!< MVE floating-point vector reduction instruction architecturally executed */ -#define ARM_PMU_MVE_VREDUCE_FP_SPEC 0x02A5 /*!< MVE floating-point vector reduction instruction speculatively executed */ -#define ARM_PMU_MVE_VREDUCE_INT_RETIRED 0x02A8 /*!< MVE integer vector reduction instruction architecturally executed */ -#define ARM_PMU_MVE_VREDUCE_INT_SPEC 0x02A9 /*!< MVE integer vector reduction instruction speculatively executed */ -#define ARM_PMU_MVE_PRED 0x02B8 /*!< Cycles where one or more predicated beats architecturally executed */ -#define ARM_PMU_MVE_STALL 0x02CC /*!< Stall cycles caused by an MVE instruction */ -#define ARM_PMU_MVE_STALL_RESOURCE 0x02CD /*!< Stall cycles caused by an MVE instruction because of resource conflicts */ -#define ARM_PMU_MVE_STALL_RESOURCE_MEM 0x02CE /*!< Stall cycles caused by an MVE instruction because of memory resource conflicts */ -#define ARM_PMU_MVE_STALL_RESOURCE_FP 0x02CF /*!< Stall cycles caused by an MVE instruction because of floating-point resource conflicts */ -#define ARM_PMU_MVE_STALL_RESOURCE_INT 0x02D0 /*!< Stall cycles caused by an MVE instruction because of integer resource conflicts */ -#define ARM_PMU_MVE_STALL_BREAK 0x02D3 /*!< Stall cycles caused by an MVE chain break */ -#define ARM_PMU_MVE_STALL_DEPENDENCY 0x02D4 /*!< Stall cycles caused by MVE register dependency */ -#define ARM_PMU_ITCM_ACCESS 0x4007 /*!< Instruction TCM access */ -#define ARM_PMU_DTCM_ACCESS 0x4008 /*!< Data TCM access */ -#define ARM_PMU_TRCEXTOUT0 0x4010 /*!< ETM external output 0 */ -#define ARM_PMU_TRCEXTOUT1 0x4011 /*!< ETM external output 1 */ -#define ARM_PMU_TRCEXTOUT2 0x4012 /*!< ETM external output 2 */ -#define ARM_PMU_TRCEXTOUT3 0x4013 /*!< ETM external output 3 */ -#define ARM_PMU_CTI_TRIGOUT4 0x4018 /*!< Cross-trigger Interface output trigger 4 */ -#define ARM_PMU_CTI_TRIGOUT5 0x4019 /*!< Cross-trigger Interface output trigger 5 */ -#define ARM_PMU_CTI_TRIGOUT6 0x401A /*!< Cross-trigger Interface output trigger 6 */ -#define ARM_PMU_CTI_TRIGOUT7 0x401B /*!< Cross-trigger Interface output trigger 7 */ - -/** \brief PMU Functions */ - -__STATIC_INLINE void ARM_PMU_Enable(void); -__STATIC_INLINE void ARM_PMU_Disable(void); - -__STATIC_INLINE void ARM_PMU_Set_EVTYPER(uint32_t num, uint32_t type); - -__STATIC_INLINE void ARM_PMU_CYCCNT_Reset(void); -__STATIC_INLINE void ARM_PMU_EVCNTR_ALL_Reset(void); - -__STATIC_INLINE void ARM_PMU_CNTR_Enable(uint32_t mask); -__STATIC_INLINE void ARM_PMU_CNTR_Disable(uint32_t mask); - -__STATIC_INLINE uint32_t ARM_PMU_Get_CCNTR(void); -__STATIC_INLINE uint32_t ARM_PMU_Get_EVCNTR(uint32_t num); - -__STATIC_INLINE uint32_t ARM_PMU_Get_CNTR_OVS(void); -__STATIC_INLINE void ARM_PMU_Set_CNTR_OVS(uint32_t mask); - -__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Enable(uint32_t mask); -__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Disable(uint32_t mask); - -__STATIC_INLINE void ARM_PMU_CNTR_Increment(uint32_t mask); - -/** - \brief Enable the PMU -*/ -__STATIC_INLINE void ARM_PMU_Enable(void) -{ - PMU->CTRL |= PMU_CTRL_ENABLE_Msk; -} - -/** - \brief Disable the PMU -*/ -__STATIC_INLINE void ARM_PMU_Disable(void) -{ - PMU->CTRL &= ~PMU_CTRL_ENABLE_Msk; -} - -/** - \brief Set event to count for PMU eventer counter - \param [in] num Event counter (0-30) to configure - \param [in] type Event to count -*/ -__STATIC_INLINE void ARM_PMU_Set_EVTYPER(uint32_t num, uint32_t type) -{ - PMU->EVTYPER[num] = type; -} - -/** - \brief Reset cycle counter -*/ -__STATIC_INLINE void ARM_PMU_CYCCNT_Reset(void) -{ - PMU->CTRL |= PMU_CTRL_CYCCNT_RESET_Msk; -} - -/** - \brief Reset all event counters -*/ -__STATIC_INLINE void ARM_PMU_EVCNTR_ALL_Reset(void) -{ - PMU->CTRL |= PMU_CTRL_EVENTCNT_RESET_Msk; -} - -/** - \brief Enable counters - \param [in] mask Counters to enable - \note Enables one or more of the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE void ARM_PMU_CNTR_Enable(uint32_t mask) -{ - PMU->CNTENSET = mask; -} - -/** - \brief Disable counters - \param [in] mask Counters to enable - \note Disables one or more of the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE void ARM_PMU_CNTR_Disable(uint32_t mask) -{ - PMU->CNTENCLR = mask; -} - -/** - \brief Read cycle counter - \return Cycle count -*/ -__STATIC_INLINE uint32_t ARM_PMU_Get_CCNTR(void) -{ - return PMU->CCNTR; -} - -/** - \brief Read event counter - \param [in] num Event counter (0-30) to read - \return Event count -*/ -__STATIC_INLINE uint32_t ARM_PMU_Get_EVCNTR(uint32_t num) -{ - return PMU_EVCNTR_CNT_Msk & PMU->EVCNTR[num]; -} - -/** - \brief Read counter overflow status - \return Counter overflow status bits for the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE uint32_t ARM_PMU_Get_CNTR_OVS(void) -{ - return PMU->OVSSET; -} - -/** - \brief Clear counter overflow status - \param [in] mask Counter overflow status bits to clear - \note Clears overflow status bits for one or more of the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE void ARM_PMU_Set_CNTR_OVS(uint32_t mask) -{ - PMU->OVSCLR = mask; -} - -/** - \brief Enable counter overflow interrupt request - \param [in] mask Counter overflow interrupt request bits to set - \note Sets overflow interrupt request bits for one or more of the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Enable(uint32_t mask) -{ - PMU->INTENSET = mask; -} - -/** - \brief Disable counter overflow interrupt request - \param [in] mask Counter overflow interrupt request bits to clear - \note Clears overflow interrupt request bits for one or more of the following: - - event counters (0-30) - - cycle counter -*/ -__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Disable(uint32_t mask) -{ - PMU->INTENCLR = mask; -} - -/** - \brief Software increment event counter - \param [in] mask Counters to increment - \note Software increment bits for one or more event counters (0-30) -*/ -__STATIC_INLINE void ARM_PMU_CNTR_Increment(uint32_t mask) -{ - PMU->SWINC = mask; -} - -#endif diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/tz_context.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/tz_context.h deleted file mode 100644 index 0d09749..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/Include/tz_context.h +++ /dev/null @@ -1,70 +0,0 @@ -/****************************************************************************** - * @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 - -#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 diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/LICENSE.txt b/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/LICENSE.txt deleted file mode 100644 index 8dada3e..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/CMSIS/LICENSE.txt +++ /dev/null @@ -1,201 +0,0 @@ - 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. diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h deleted file mode 100644 index c3b8473..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h +++ /dev/null @@ -1,4422 +0,0 @@ -/** - ****************************************************************************** - * @file stm32_hal_legacy.h - * @author MCD Application Team - * @brief This file contains aliases definition for the STM32Cube HAL constants - * macros and functions maintained for legacy purpose. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32_HAL_LEGACY -#define STM32_HAL_LEGACY - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup HAL_AES_Aliased_Defines HAL CRYP Aliased Defines maintained for legacy purpose - * @{ - */ -#define AES_FLAG_RDERR CRYP_FLAG_RDERR -#define AES_FLAG_WRERR CRYP_FLAG_WRERR -#define AES_CLEARFLAG_CCF CRYP_CLEARFLAG_CCF -#define AES_CLEARFLAG_RDERR CRYP_CLEARFLAG_RDERR -#define AES_CLEARFLAG_WRERR CRYP_CLEARFLAG_WRERR -#if defined(STM32H7) || defined(STM32MP1) -#define CRYP_DATATYPE_32B CRYP_NO_SWAP -#define CRYP_DATATYPE_16B CRYP_HALFWORD_SWAP -#define CRYP_DATATYPE_8B CRYP_BYTE_SWAP -#define CRYP_DATATYPE_1B CRYP_BIT_SWAP -#endif /* STM32H7 || STM32MP1 */ -/** - * @} - */ - -/** @defgroup HAL_ADC_Aliased_Defines HAL ADC Aliased Defines maintained for legacy purpose - * @{ - */ -#define ADC_RESOLUTION12b ADC_RESOLUTION_12B -#define ADC_RESOLUTION10b ADC_RESOLUTION_10B -#define ADC_RESOLUTION8b ADC_RESOLUTION_8B -#define ADC_RESOLUTION6b ADC_RESOLUTION_6B -#define OVR_DATA_OVERWRITTEN ADC_OVR_DATA_OVERWRITTEN -#define OVR_DATA_PRESERVED ADC_OVR_DATA_PRESERVED -#define EOC_SINGLE_CONV ADC_EOC_SINGLE_CONV -#define EOC_SEQ_CONV ADC_EOC_SEQ_CONV -#define EOC_SINGLE_SEQ_CONV ADC_EOC_SINGLE_SEQ_CONV -#define REGULAR_GROUP ADC_REGULAR_GROUP -#define INJECTED_GROUP ADC_INJECTED_GROUP -#define REGULAR_INJECTED_GROUP ADC_REGULAR_INJECTED_GROUP -#define AWD_EVENT ADC_AWD_EVENT -#define AWD1_EVENT ADC_AWD1_EVENT -#define AWD2_EVENT ADC_AWD2_EVENT -#define AWD3_EVENT ADC_AWD3_EVENT -#define OVR_EVENT ADC_OVR_EVENT -#define JQOVF_EVENT ADC_JQOVF_EVENT -#define ALL_CHANNELS ADC_ALL_CHANNELS -#define REGULAR_CHANNELS ADC_REGULAR_CHANNELS -#define INJECTED_CHANNELS ADC_INJECTED_CHANNELS -#define SYSCFG_FLAG_SENSOR_ADC ADC_FLAG_SENSOR -#define SYSCFG_FLAG_VREF_ADC ADC_FLAG_VREFINT -#define ADC_CLOCKPRESCALER_PCLK_DIV1 ADC_CLOCK_SYNC_PCLK_DIV1 -#define ADC_CLOCKPRESCALER_PCLK_DIV2 ADC_CLOCK_SYNC_PCLK_DIV2 -#define ADC_CLOCKPRESCALER_PCLK_DIV4 ADC_CLOCK_SYNC_PCLK_DIV4 -#define ADC_CLOCKPRESCALER_PCLK_DIV6 ADC_CLOCK_SYNC_PCLK_DIV6 -#define ADC_CLOCKPRESCALER_PCLK_DIV8 ADC_CLOCK_SYNC_PCLK_DIV8 -#define ADC_EXTERNALTRIG0_T6_TRGO ADC_EXTERNALTRIGCONV_T6_TRGO -#define ADC_EXTERNALTRIG1_T21_CC2 ADC_EXTERNALTRIGCONV_T21_CC2 -#define ADC_EXTERNALTRIG2_T2_TRGO ADC_EXTERNALTRIGCONV_T2_TRGO -#define ADC_EXTERNALTRIG3_T2_CC4 ADC_EXTERNALTRIGCONV_T2_CC4 -#define ADC_EXTERNALTRIG4_T22_TRGO ADC_EXTERNALTRIGCONV_T22_TRGO -#define ADC_EXTERNALTRIG7_EXT_IT11 ADC_EXTERNALTRIGCONV_EXT_IT11 -#define ADC_CLOCK_ASYNC ADC_CLOCK_ASYNC_DIV1 -#define ADC_EXTERNALTRIG_EDGE_NONE ADC_EXTERNALTRIGCONVEDGE_NONE -#define ADC_EXTERNALTRIG_EDGE_RISING ADC_EXTERNALTRIGCONVEDGE_RISING -#define ADC_EXTERNALTRIG_EDGE_FALLING ADC_EXTERNALTRIGCONVEDGE_FALLING -#define ADC_EXTERNALTRIG_EDGE_RISINGFALLING ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING -#define ADC_SAMPLETIME_2CYCLE_5 ADC_SAMPLETIME_2CYCLES_5 - -#define HAL_ADC_STATE_BUSY_REG HAL_ADC_STATE_REG_BUSY -#define HAL_ADC_STATE_BUSY_INJ HAL_ADC_STATE_INJ_BUSY -#define HAL_ADC_STATE_EOC_REG HAL_ADC_STATE_REG_EOC -#define HAL_ADC_STATE_EOC_INJ HAL_ADC_STATE_INJ_EOC -#define HAL_ADC_STATE_ERROR HAL_ADC_STATE_ERROR_INTERNAL -#define HAL_ADC_STATE_BUSY HAL_ADC_STATE_BUSY_INTERNAL -#define HAL_ADC_STATE_AWD HAL_ADC_STATE_AWD1 - -#if defined(STM32H7) -#define ADC_CHANNEL_VBAT_DIV4 ADC_CHANNEL_VBAT -#endif /* STM32H7 */ - -#if defined(STM32U5) -#define ADC_SAMPLETIME_5CYCLE ADC_SAMPLETIME_5CYCLES -#define ADC_SAMPLETIME_391CYCLES_5 ADC_SAMPLETIME_391CYCLES -#define ADC4_SAMPLETIME_160CYCLES_5 ADC4_SAMPLETIME_814CYCLES_5 -#endif /* STM32U5 */ - -#if defined(STM32H5) -#define ADC_CHANNEL_VCORE ADC_CHANNEL_VDDCORE -#endif /* STM32H5 */ -/** - * @} - */ - -/** @defgroup HAL_CEC_Aliased_Defines HAL CEC Aliased Defines maintained for legacy purpose - * @{ - */ - -#define __HAL_CEC_GET_IT __HAL_CEC_GET_FLAG - -/** - * @} - */ - -/** @defgroup HAL_COMP_Aliased_Defines HAL COMP Aliased Defines maintained for legacy purpose - * @{ - */ -#define COMP_WINDOWMODE_DISABLED COMP_WINDOWMODE_DISABLE -#define COMP_WINDOWMODE_ENABLED COMP_WINDOWMODE_ENABLE -#define COMP_EXTI_LINE_COMP1_EVENT COMP_EXTI_LINE_COMP1 -#define COMP_EXTI_LINE_COMP2_EVENT COMP_EXTI_LINE_COMP2 -#define COMP_EXTI_LINE_COMP3_EVENT COMP_EXTI_LINE_COMP3 -#define COMP_EXTI_LINE_COMP4_EVENT COMP_EXTI_LINE_COMP4 -#define COMP_EXTI_LINE_COMP5_EVENT COMP_EXTI_LINE_COMP5 -#define COMP_EXTI_LINE_COMP6_EVENT COMP_EXTI_LINE_COMP6 -#define COMP_EXTI_LINE_COMP7_EVENT COMP_EXTI_LINE_COMP7 -#if defined(STM32L0) -#define COMP_LPTIMCONNECTION_ENABLED ((uint32_t)0x00000003U) /*!< COMPX output generic naming: connected to LPTIM - input 1 for COMP1, LPTIM input 2 for COMP2 */ -#endif -#define COMP_OUTPUT_COMP6TIM2OCREFCLR COMP_OUTPUT_COMP6_TIM2OCREFCLR -#if defined(STM32F373xC) || defined(STM32F378xx) -#define COMP_OUTPUT_TIM3IC1 COMP_OUTPUT_COMP1_TIM3IC1 -#define COMP_OUTPUT_TIM3OCREFCLR COMP_OUTPUT_COMP1_TIM3OCREFCLR -#endif /* STM32F373xC || STM32F378xx */ - -#if defined(STM32L0) || defined(STM32L4) -#define COMP_WINDOWMODE_ENABLE COMP_WINDOWMODE_COMP1_INPUT_PLUS_COMMON - -#define COMP_NONINVERTINGINPUT_IO1 COMP_INPUT_PLUS_IO1 -#define COMP_NONINVERTINGINPUT_IO2 COMP_INPUT_PLUS_IO2 -#define COMP_NONINVERTINGINPUT_IO3 COMP_INPUT_PLUS_IO3 -#define COMP_NONINVERTINGINPUT_IO4 COMP_INPUT_PLUS_IO4 -#define COMP_NONINVERTINGINPUT_IO5 COMP_INPUT_PLUS_IO5 -#define COMP_NONINVERTINGINPUT_IO6 COMP_INPUT_PLUS_IO6 - -#define COMP_INVERTINGINPUT_1_4VREFINT COMP_INPUT_MINUS_1_4VREFINT -#define COMP_INVERTINGINPUT_1_2VREFINT COMP_INPUT_MINUS_1_2VREFINT -#define COMP_INVERTINGINPUT_3_4VREFINT COMP_INPUT_MINUS_3_4VREFINT -#define COMP_INVERTINGINPUT_VREFINT COMP_INPUT_MINUS_VREFINT -#define COMP_INVERTINGINPUT_DAC1_CH1 COMP_INPUT_MINUS_DAC1_CH1 -#define COMP_INVERTINGINPUT_DAC1_CH2 COMP_INPUT_MINUS_DAC1_CH2 -#define COMP_INVERTINGINPUT_DAC1 COMP_INPUT_MINUS_DAC1_CH1 -#define COMP_INVERTINGINPUT_DAC2 COMP_INPUT_MINUS_DAC1_CH2 -#define COMP_INVERTINGINPUT_IO1 COMP_INPUT_MINUS_IO1 -#if defined(STM32L0) -/* Issue fixed on STM32L0 COMP driver: only 2 dedicated IO (IO1 and IO2), */ -/* IO2 was wrongly assigned to IO shared with DAC and IO3 was corresponding */ -/* to the second dedicated IO (only for COMP2). */ -#define COMP_INVERTINGINPUT_IO2 COMP_INPUT_MINUS_DAC1_CH2 -#define COMP_INVERTINGINPUT_IO3 COMP_INPUT_MINUS_IO2 -#else -#define COMP_INVERTINGINPUT_IO2 COMP_INPUT_MINUS_IO2 -#define COMP_INVERTINGINPUT_IO3 COMP_INPUT_MINUS_IO3 -#endif -#define COMP_INVERTINGINPUT_IO4 COMP_INPUT_MINUS_IO4 -#define COMP_INVERTINGINPUT_IO5 COMP_INPUT_MINUS_IO5 - -#define COMP_OUTPUTLEVEL_LOW COMP_OUTPUT_LEVEL_LOW -#define COMP_OUTPUTLEVEL_HIGH COMP_OUTPUT_LEVEL_HIGH - -/* Note: Literal "COMP_FLAG_LOCK" kept for legacy purpose. */ -/* To check COMP lock state, use macro "__HAL_COMP_IS_LOCKED()". */ -#if defined(COMP_CSR_LOCK) -#define COMP_FLAG_LOCK COMP_CSR_LOCK -#elif defined(COMP_CSR_COMP1LOCK) -#define COMP_FLAG_LOCK COMP_CSR_COMP1LOCK -#elif defined(COMP_CSR_COMPxLOCK) -#define COMP_FLAG_LOCK COMP_CSR_COMPxLOCK -#endif - -#if defined(STM32L4) -#define COMP_BLANKINGSRCE_TIM1OC5 COMP_BLANKINGSRC_TIM1_OC5_COMP1 -#define COMP_BLANKINGSRCE_TIM2OC3 COMP_BLANKINGSRC_TIM2_OC3_COMP1 -#define COMP_BLANKINGSRCE_TIM3OC3 COMP_BLANKINGSRC_TIM3_OC3_COMP1 -#define COMP_BLANKINGSRCE_TIM3OC4 COMP_BLANKINGSRC_TIM3_OC4_COMP2 -#define COMP_BLANKINGSRCE_TIM8OC5 COMP_BLANKINGSRC_TIM8_OC5_COMP2 -#define COMP_BLANKINGSRCE_TIM15OC1 COMP_BLANKINGSRC_TIM15_OC1_COMP2 -#define COMP_BLANKINGSRCE_NONE COMP_BLANKINGSRC_NONE -#endif - -#if defined(STM32L0) -#define COMP_MODE_HIGHSPEED COMP_POWERMODE_MEDIUMSPEED -#define COMP_MODE_LOWSPEED COMP_POWERMODE_ULTRALOWPOWER -#else -#define COMP_MODE_HIGHSPEED COMP_POWERMODE_HIGHSPEED -#define COMP_MODE_MEDIUMSPEED COMP_POWERMODE_MEDIUMSPEED -#define COMP_MODE_LOWPOWER COMP_POWERMODE_LOWPOWER -#define COMP_MODE_ULTRALOWPOWER COMP_POWERMODE_ULTRALOWPOWER -#endif - -#endif - -#if defined(STM32U5) -#define __HAL_COMP_COMP1_EXTI_CLEAR_RASING_FLAG __HAL_COMP_COMP1_EXTI_CLEAR_RISING_FLAG -#endif - -/** - * @} - */ - -/** @defgroup HAL_CORTEX_Aliased_Defines HAL CORTEX Aliased Defines maintained for legacy purpose - * @{ - */ -#define __HAL_CORTEX_SYSTICKCLK_CONFIG HAL_SYSTICK_CLKSourceConfig -#if defined(STM32U5) -#define MPU_DEVICE_nGnRnE MPU_DEVICE_NGNRNE -#define MPU_DEVICE_nGnRE MPU_DEVICE_NGNRE -#define MPU_DEVICE_nGRE MPU_DEVICE_NGRE -#endif /* STM32U5 */ -/** - * @} - */ - -/** @defgroup CRC_Aliases CRC API aliases - * @{ - */ -#if defined(STM32H5) || defined(STM32C0) -#else -#define HAL_CRC_Input_Data_Reverse HAL_CRCEx_Input_Data_Reverse /*!< Aliased to HAL_CRCEx_Input_Data_Reverse for - inter STM32 series compatibility */ -#define HAL_CRC_Output_Data_Reverse HAL_CRCEx_Output_Data_Reverse /*!< Aliased to HAL_CRCEx_Output_Data_Reverse for - inter STM32 series compatibility */ -#endif -/** - * @} - */ - -/** @defgroup HAL_CRC_Aliased_Defines HAL CRC Aliased Defines maintained for legacy purpose - * @{ - */ - -#define CRC_OUTPUTDATA_INVERSION_DISABLED CRC_OUTPUTDATA_INVERSION_DISABLE -#define CRC_OUTPUTDATA_INVERSION_ENABLED CRC_OUTPUTDATA_INVERSION_ENABLE - -/** - * @} - */ - -/** @defgroup HAL_DAC_Aliased_Defines HAL DAC Aliased Defines maintained for legacy purpose - * @{ - */ - -#define DAC1_CHANNEL_1 DAC_CHANNEL_1 -#define DAC1_CHANNEL_2 DAC_CHANNEL_2 -#define DAC2_CHANNEL_1 DAC_CHANNEL_1 -#define DAC_WAVE_NONE 0x00000000U -#define DAC_WAVE_NOISE DAC_CR_WAVE1_0 -#define DAC_WAVE_TRIANGLE DAC_CR_WAVE1_1 -#define DAC_WAVEGENERATION_NONE DAC_WAVE_NONE -#define DAC_WAVEGENERATION_NOISE DAC_WAVE_NOISE -#define DAC_WAVEGENERATION_TRIANGLE DAC_WAVE_TRIANGLE - -#if defined(STM32G4) || defined(STM32H7) || defined (STM32U5) -#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL -#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL -#endif - -#if defined(STM32U5) -#define DAC_TRIGGER_STOP_LPTIM1_OUT DAC_TRIGGER_STOP_LPTIM1_CH1 -#define DAC_TRIGGER_STOP_LPTIM3_OUT DAC_TRIGGER_STOP_LPTIM3_CH1 -#define DAC_TRIGGER_LPTIM1_OUT DAC_TRIGGER_LPTIM1_CH1 -#define DAC_TRIGGER_LPTIM3_OUT DAC_TRIGGER_LPTIM3_CH1 -#endif - -#if defined(STM32H5) -#define DAC_TRIGGER_LPTIM1_OUT DAC_TRIGGER_LPTIM1_CH1 -#define DAC_TRIGGER_LPTIM2_OUT DAC_TRIGGER_LPTIM2_CH1 -#endif - -#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || \ - defined(STM32F4) || defined(STM32G4) -#define HAL_DAC_MSP_INIT_CB_ID HAL_DAC_MSPINIT_CB_ID -#define HAL_DAC_MSP_DEINIT_CB_ID HAL_DAC_MSPDEINIT_CB_ID -#endif - -/** - * @} - */ - -/** @defgroup HAL_DMA_Aliased_Defines HAL DMA Aliased Defines maintained for legacy purpose - * @{ - */ -#define HAL_REMAPDMA_ADC_DMA_CH2 DMA_REMAP_ADC_DMA_CH2 -#define HAL_REMAPDMA_USART1_TX_DMA_CH4 DMA_REMAP_USART1_TX_DMA_CH4 -#define HAL_REMAPDMA_USART1_RX_DMA_CH5 DMA_REMAP_USART1_RX_DMA_CH5 -#define HAL_REMAPDMA_TIM16_DMA_CH4 DMA_REMAP_TIM16_DMA_CH4 -#define HAL_REMAPDMA_TIM17_DMA_CH2 DMA_REMAP_TIM17_DMA_CH2 -#define HAL_REMAPDMA_USART3_DMA_CH32 DMA_REMAP_USART3_DMA_CH32 -#define HAL_REMAPDMA_TIM16_DMA_CH6 DMA_REMAP_TIM16_DMA_CH6 -#define HAL_REMAPDMA_TIM17_DMA_CH7 DMA_REMAP_TIM17_DMA_CH7 -#define HAL_REMAPDMA_SPI2_DMA_CH67 DMA_REMAP_SPI2_DMA_CH67 -#define HAL_REMAPDMA_USART2_DMA_CH67 DMA_REMAP_USART2_DMA_CH67 -#define HAL_REMAPDMA_I2C1_DMA_CH76 DMA_REMAP_I2C1_DMA_CH76 -#define HAL_REMAPDMA_TIM1_DMA_CH6 DMA_REMAP_TIM1_DMA_CH6 -#define HAL_REMAPDMA_TIM2_DMA_CH7 DMA_REMAP_TIM2_DMA_CH7 -#define HAL_REMAPDMA_TIM3_DMA_CH6 DMA_REMAP_TIM3_DMA_CH6 - -#define IS_HAL_REMAPDMA IS_DMA_REMAP -#define __HAL_REMAPDMA_CHANNEL_ENABLE __HAL_DMA_REMAP_CHANNEL_ENABLE -#define __HAL_REMAPDMA_CHANNEL_DISABLE __HAL_DMA_REMAP_CHANNEL_DISABLE - -#if defined(STM32L4) - -#define HAL_DMAMUX1_REQUEST_GEN_EXTI0 HAL_DMAMUX1_REQ_GEN_EXTI0 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI1 HAL_DMAMUX1_REQ_GEN_EXTI1 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI2 HAL_DMAMUX1_REQ_GEN_EXTI2 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI3 HAL_DMAMUX1_REQ_GEN_EXTI3 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI4 HAL_DMAMUX1_REQ_GEN_EXTI4 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI5 HAL_DMAMUX1_REQ_GEN_EXTI5 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI6 HAL_DMAMUX1_REQ_GEN_EXTI6 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI7 HAL_DMAMUX1_REQ_GEN_EXTI7 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI8 HAL_DMAMUX1_REQ_GEN_EXTI8 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI9 HAL_DMAMUX1_REQ_GEN_EXTI9 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI10 HAL_DMAMUX1_REQ_GEN_EXTI10 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI11 HAL_DMAMUX1_REQ_GEN_EXTI11 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI12 HAL_DMAMUX1_REQ_GEN_EXTI12 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI13 HAL_DMAMUX1_REQ_GEN_EXTI13 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI14 HAL_DMAMUX1_REQ_GEN_EXTI14 -#define HAL_DMAMUX1_REQUEST_GEN_EXTI15 HAL_DMAMUX1_REQ_GEN_EXTI15 -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH0_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH0_EVT -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH1_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH1_EVT -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH2_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH2_EVT -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH3_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH3_EVT -#define HAL_DMAMUX1_REQUEST_GEN_LPTIM1_OUT HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT -#define HAL_DMAMUX1_REQUEST_GEN_LPTIM2_OUT HAL_DMAMUX1_REQ_GEN_LPTIM2_OUT -#define HAL_DMAMUX1_REQUEST_GEN_DSI_TE HAL_DMAMUX1_REQ_GEN_DSI_TE -#define HAL_DMAMUX1_REQUEST_GEN_DSI_EOT HAL_DMAMUX1_REQ_GEN_DSI_EOT -#define HAL_DMAMUX1_REQUEST_GEN_DMA2D_EOT HAL_DMAMUX1_REQ_GEN_DMA2D_EOT -#define HAL_DMAMUX1_REQUEST_GEN_LTDC_IT HAL_DMAMUX1_REQ_GEN_LTDC_IT - -#define HAL_DMAMUX_REQUEST_GEN_NO_EVENT HAL_DMAMUX_REQ_GEN_NO_EVENT -#define HAL_DMAMUX_REQUEST_GEN_RISING HAL_DMAMUX_REQ_GEN_RISING -#define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING -#define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING - -#if defined(STM32L4R5xx) || defined(STM32L4R9xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || \ - defined(STM32L4S7xx) || defined(STM32L4S9xx) -#define DMA_REQUEST_DCMI_PSSI DMA_REQUEST_DCMI -#endif - -#endif /* STM32L4 */ - -#if defined(STM32G0) -#define DMA_REQUEST_DAC1_CHANNEL1 DMA_REQUEST_DAC1_CH1 -#define DMA_REQUEST_DAC1_CHANNEL2 DMA_REQUEST_DAC1_CH2 -#define DMA_REQUEST_TIM16_TRIG_COM DMA_REQUEST_TIM16_COM -#define DMA_REQUEST_TIM17_TRIG_COM DMA_REQUEST_TIM17_COM - -#define LL_DMAMUX_REQ_TIM16_TRIG_COM LL_DMAMUX_REQ_TIM16_COM -#define LL_DMAMUX_REQ_TIM17_TRIG_COM LL_DMAMUX_REQ_TIM17_COM -#endif - -#if defined(STM32H7) - -#define DMA_REQUEST_DAC1 DMA_REQUEST_DAC1_CH1 -#define DMA_REQUEST_DAC2 DMA_REQUEST_DAC1_CH2 - -#define BDMA_REQUEST_LP_UART1_RX BDMA_REQUEST_LPUART1_RX -#define BDMA_REQUEST_LP_UART1_TX BDMA_REQUEST_LPUART1_TX - -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH0_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH0_EVT -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH1_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH1_EVT -#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH2_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH2_EVT -#define HAL_DMAMUX1_REQUEST_GEN_LPTIM1_OUT HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT -#define HAL_DMAMUX1_REQUEST_GEN_LPTIM2_OUT HAL_DMAMUX1_REQ_GEN_LPTIM2_OUT -#define HAL_DMAMUX1_REQUEST_GEN_LPTIM3_OUT HAL_DMAMUX1_REQ_GEN_LPTIM3_OUT -#define HAL_DMAMUX1_REQUEST_GEN_EXTI0 HAL_DMAMUX1_REQ_GEN_EXTI0 -#define HAL_DMAMUX1_REQUEST_GEN_TIM12_TRGO HAL_DMAMUX1_REQ_GEN_TIM12_TRGO - -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH0_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH0_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH1_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH1_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH2_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH2_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH3_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH3_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH4_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH4_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH5_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH5_EVT -#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH6_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH6_EVT -#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_RX_WKUP HAL_DMAMUX2_REQ_GEN_LPUART1_RX_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_TX_WKUP HAL_DMAMUX2_REQ_GEN_LPUART1_TX_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM2_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM2_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM2_OUT HAL_DMAMUX2_REQ_GEN_LPTIM2_OUT -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM3_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM3_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM3_OUT HAL_DMAMUX2_REQ_GEN_LPTIM3_OUT -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM4_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM4_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_LPTIM5_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM5_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_I2C4_WKUP HAL_DMAMUX2_REQ_GEN_I2C4_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_SPI6_WKUP HAL_DMAMUX2_REQ_GEN_SPI6_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_COMP1_OUT HAL_DMAMUX2_REQ_GEN_COMP1_OUT -#define HAL_DMAMUX2_REQUEST_GEN_COMP2_OUT HAL_DMAMUX2_REQ_GEN_COMP2_OUT -#define HAL_DMAMUX2_REQUEST_GEN_RTC_WKUP HAL_DMAMUX2_REQ_GEN_RTC_WKUP -#define HAL_DMAMUX2_REQUEST_GEN_EXTI0 HAL_DMAMUX2_REQ_GEN_EXTI0 -#define HAL_DMAMUX2_REQUEST_GEN_EXTI2 HAL_DMAMUX2_REQ_GEN_EXTI2 -#define HAL_DMAMUX2_REQUEST_GEN_I2C4_IT_EVT HAL_DMAMUX2_REQ_GEN_I2C4_IT_EVT -#define HAL_DMAMUX2_REQUEST_GEN_SPI6_IT HAL_DMAMUX2_REQ_GEN_SPI6_IT -#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_TX_IT HAL_DMAMUX2_REQ_GEN_LPUART1_TX_IT -#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_RX_IT HAL_DMAMUX2_REQ_GEN_LPUART1_RX_IT -#define HAL_DMAMUX2_REQUEST_GEN_ADC3_IT HAL_DMAMUX2_REQ_GEN_ADC3_IT -#define HAL_DMAMUX2_REQUEST_GEN_ADC3_AWD1_OUT HAL_DMAMUX2_REQ_GEN_ADC3_AWD1_OUT -#define HAL_DMAMUX2_REQUEST_GEN_BDMA_CH0_IT HAL_DMAMUX2_REQ_GEN_BDMA_CH0_IT -#define HAL_DMAMUX2_REQUEST_GEN_BDMA_CH1_IT HAL_DMAMUX2_REQ_GEN_BDMA_CH1_IT - -#define HAL_DMAMUX_REQUEST_GEN_NO_EVENT HAL_DMAMUX_REQ_GEN_NO_EVENT -#define HAL_DMAMUX_REQUEST_GEN_RISING HAL_DMAMUX_REQ_GEN_RISING -#define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING -#define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING - -#define DFSDM_FILTER_EXT_TRIG_LPTIM1 DFSDM_FILTER_EXT_TRIG_LPTIM1_OUT -#define DFSDM_FILTER_EXT_TRIG_LPTIM2 DFSDM_FILTER_EXT_TRIG_LPTIM2_OUT -#define DFSDM_FILTER_EXT_TRIG_LPTIM3 DFSDM_FILTER_EXT_TRIG_LPTIM3_OUT - -#define DAC_TRIGGER_LP1_OUT DAC_TRIGGER_LPTIM1_OUT -#define DAC_TRIGGER_LP2_OUT DAC_TRIGGER_LPTIM2_OUT - -#endif /* STM32H7 */ - -#if defined(STM32U5) -#define GPDMA1_REQUEST_DCMI GPDMA1_REQUEST_DCMI_PSSI -#endif /* STM32U5 */ -/** - * @} - */ - -/** @defgroup HAL_FLASH_Aliased_Defines HAL FLASH Aliased Defines maintained for legacy purpose - * @{ - */ - -#define TYPEPROGRAM_BYTE FLASH_TYPEPROGRAM_BYTE -#define TYPEPROGRAM_HALFWORD FLASH_TYPEPROGRAM_HALFWORD -#define TYPEPROGRAM_WORD FLASH_TYPEPROGRAM_WORD -#define TYPEPROGRAM_DOUBLEWORD FLASH_TYPEPROGRAM_DOUBLEWORD -#define TYPEERASE_SECTORS FLASH_TYPEERASE_SECTORS -#define TYPEERASE_PAGES FLASH_TYPEERASE_PAGES -#define TYPEERASE_PAGEERASE FLASH_TYPEERASE_PAGES -#define TYPEERASE_MASSERASE FLASH_TYPEERASE_MASSERASE -#define WRPSTATE_DISABLE OB_WRPSTATE_DISABLE -#define WRPSTATE_ENABLE OB_WRPSTATE_ENABLE -#define HAL_FLASH_TIMEOUT_VALUE FLASH_TIMEOUT_VALUE -#define OBEX_PCROP OPTIONBYTE_PCROP -#define OBEX_BOOTCONFIG OPTIONBYTE_BOOTCONFIG -#define PCROPSTATE_DISABLE OB_PCROP_STATE_DISABLE -#define PCROPSTATE_ENABLE OB_PCROP_STATE_ENABLE -#define TYPEERASEDATA_BYTE FLASH_TYPEERASEDATA_BYTE -#define TYPEERASEDATA_HALFWORD FLASH_TYPEERASEDATA_HALFWORD -#define TYPEERASEDATA_WORD FLASH_TYPEERASEDATA_WORD -#define TYPEPROGRAMDATA_BYTE FLASH_TYPEPROGRAMDATA_BYTE -#define TYPEPROGRAMDATA_HALFWORD FLASH_TYPEPROGRAMDATA_HALFWORD -#define TYPEPROGRAMDATA_WORD FLASH_TYPEPROGRAMDATA_WORD -#define TYPEPROGRAMDATA_FASTBYTE FLASH_TYPEPROGRAMDATA_FASTBYTE -#define TYPEPROGRAMDATA_FASTHALFWORD FLASH_TYPEPROGRAMDATA_FASTHALFWORD -#define TYPEPROGRAMDATA_FASTWORD FLASH_TYPEPROGRAMDATA_FASTWORD -#if !defined(STM32F2) && !defined(STM32F4) && !defined(STM32F7) && !defined(STM32H7) && !defined(STM32H5) -#define PAGESIZE FLASH_PAGE_SIZE -#endif /* STM32F2 && STM32F4 && STM32F7 && STM32H7 && STM32H5 */ -#define TYPEPROGRAM_FASTBYTE FLASH_TYPEPROGRAM_BYTE -#define TYPEPROGRAM_FASTHALFWORD FLASH_TYPEPROGRAM_HALFWORD -#define TYPEPROGRAM_FASTWORD FLASH_TYPEPROGRAM_WORD -#define VOLTAGE_RANGE_1 FLASH_VOLTAGE_RANGE_1 -#define VOLTAGE_RANGE_2 FLASH_VOLTAGE_RANGE_2 -#define VOLTAGE_RANGE_3 FLASH_VOLTAGE_RANGE_3 -#define VOLTAGE_RANGE_4 FLASH_VOLTAGE_RANGE_4 -#define TYPEPROGRAM_FAST FLASH_TYPEPROGRAM_FAST -#define TYPEPROGRAM_FAST_AND_LAST FLASH_TYPEPROGRAM_FAST_AND_LAST -#define WRPAREA_BANK1_AREAA OB_WRPAREA_BANK1_AREAA -#define WRPAREA_BANK1_AREAB OB_WRPAREA_BANK1_AREAB -#define WRPAREA_BANK2_AREAA OB_WRPAREA_BANK2_AREAA -#define WRPAREA_BANK2_AREAB OB_WRPAREA_BANK2_AREAB -#define IWDG_STDBY_FREEZE OB_IWDG_STDBY_FREEZE -#define IWDG_STDBY_ACTIVE OB_IWDG_STDBY_RUN -#define IWDG_STOP_FREEZE OB_IWDG_STOP_FREEZE -#define IWDG_STOP_ACTIVE OB_IWDG_STOP_RUN -#define FLASH_ERROR_NONE HAL_FLASH_ERROR_NONE -#define FLASH_ERROR_RD HAL_FLASH_ERROR_RD -#define FLASH_ERROR_PG HAL_FLASH_ERROR_PROG -#define FLASH_ERROR_PGP HAL_FLASH_ERROR_PGS -#define FLASH_ERROR_WRP HAL_FLASH_ERROR_WRP -#define FLASH_ERROR_OPTV HAL_FLASH_ERROR_OPTV -#define FLASH_ERROR_OPTVUSR HAL_FLASH_ERROR_OPTVUSR -#define FLASH_ERROR_PROG HAL_FLASH_ERROR_PROG -#define FLASH_ERROR_OP HAL_FLASH_ERROR_OPERATION -#define FLASH_ERROR_PGA HAL_FLASH_ERROR_PGA -#define FLASH_ERROR_SIZE HAL_FLASH_ERROR_SIZE -#define FLASH_ERROR_SIZ HAL_FLASH_ERROR_SIZE -#define FLASH_ERROR_PGS HAL_FLASH_ERROR_PGS -#define FLASH_ERROR_MIS HAL_FLASH_ERROR_MIS -#define FLASH_ERROR_FAST HAL_FLASH_ERROR_FAST -#define FLASH_ERROR_FWWERR HAL_FLASH_ERROR_FWWERR -#define FLASH_ERROR_NOTZERO HAL_FLASH_ERROR_NOTZERO -#define FLASH_ERROR_OPERATION HAL_FLASH_ERROR_OPERATION -#define FLASH_ERROR_ERS HAL_FLASH_ERROR_ERS -#define OB_WDG_SW OB_IWDG_SW -#define OB_WDG_HW OB_IWDG_HW -#define OB_SDADC12_VDD_MONITOR_SET OB_SDACD_VDD_MONITOR_SET -#define OB_SDADC12_VDD_MONITOR_RESET OB_SDACD_VDD_MONITOR_RESET -#define OB_RAM_PARITY_CHECK_SET OB_SRAM_PARITY_SET -#define OB_RAM_PARITY_CHECK_RESET OB_SRAM_PARITY_RESET -#define IS_OB_SDADC12_VDD_MONITOR IS_OB_SDACD_VDD_MONITOR -#define OB_RDP_LEVEL0 OB_RDP_LEVEL_0 -#define OB_RDP_LEVEL1 OB_RDP_LEVEL_1 -#define OB_RDP_LEVEL2 OB_RDP_LEVEL_2 -#if defined(STM32G0) || defined(STM32C0) -#define OB_BOOT_LOCK_DISABLE OB_BOOT_ENTRY_FORCED_NONE -#define OB_BOOT_LOCK_ENABLE OB_BOOT_ENTRY_FORCED_FLASH -#else -#define OB_BOOT_ENTRY_FORCED_NONE OB_BOOT_LOCK_DISABLE -#define OB_BOOT_ENTRY_FORCED_FLASH OB_BOOT_LOCK_ENABLE -#endif -#if defined(STM32H7) -#define FLASH_FLAG_SNECCE_BANK1RR FLASH_FLAG_SNECCERR_BANK1 -#define FLASH_FLAG_DBECCE_BANK1RR FLASH_FLAG_DBECCERR_BANK1 -#define FLASH_FLAG_STRBER_BANK1R FLASH_FLAG_STRBERR_BANK1 -#define FLASH_FLAG_SNECCE_BANK2RR FLASH_FLAG_SNECCERR_BANK2 -#define FLASH_FLAG_DBECCE_BANK2RR FLASH_FLAG_DBECCERR_BANK2 -#define FLASH_FLAG_STRBER_BANK2R FLASH_FLAG_STRBERR_BANK2 -#define FLASH_FLAG_WDW FLASH_FLAG_WBNE -#define OB_WRP_SECTOR_All OB_WRP_SECTOR_ALL -#endif /* STM32H7 */ -#if defined(STM32H7RS) -#define FLASH_OPTKEY1 FLASH_OPT_KEY1 -#define FLASH_OPTKEY2 FLASH_OPT_KEY2 -#endif /* STM32H7RS */ -#if defined(STM32U5) -#define OB_USER_nRST_STOP OB_USER_NRST_STOP -#define OB_USER_nRST_STDBY OB_USER_NRST_STDBY -#define OB_USER_nRST_SHDW OB_USER_NRST_SHDW -#define OB_USER_nSWBOOT0 OB_USER_NSWBOOT0 -#define OB_USER_nBOOT0 OB_USER_NBOOT0 -#define OB_nBOOT0_RESET OB_NBOOT0_RESET -#define OB_nBOOT0_SET OB_NBOOT0_SET -#define OB_USER_SRAM134_RST OB_USER_SRAM_RST -#define OB_SRAM134_RST_ERASE OB_SRAM_RST_ERASE -#define OB_SRAM134_RST_NOT_ERASE OB_SRAM_RST_NOT_ERASE -#endif /* STM32U5 */ -#if defined(STM32U0) -#define OB_USER_nRST_STOP OB_USER_NRST_STOP -#define OB_USER_nRST_STDBY OB_USER_NRST_STDBY -#define OB_USER_nRST_SHDW OB_USER_NRST_SHDW -#define OB_USER_nBOOT_SEL OB_USER_NBOOT_SEL -#define OB_USER_nBOOT0 OB_USER_NBOOT0 -#define OB_USER_nBOOT1 OB_USER_NBOOT1 -#define OB_nBOOT0_RESET OB_NBOOT0_RESET -#define OB_nBOOT0_SET OB_NBOOT0_SET -#endif /* STM32U0 */ - -/** - * @} - */ - -/** @defgroup HAL_JPEG_Aliased_Macros HAL JPEG Aliased Macros maintained for legacy purpose - * @{ - */ - -#if defined(STM32H7) -#define __HAL_RCC_JPEG_CLK_ENABLE __HAL_RCC_JPGDECEN_CLK_ENABLE -#define __HAL_RCC_JPEG_CLK_DISABLE __HAL_RCC_JPGDECEN_CLK_DISABLE -#define __HAL_RCC_JPEG_FORCE_RESET __HAL_RCC_JPGDECRST_FORCE_RESET -#define __HAL_RCC_JPEG_RELEASE_RESET __HAL_RCC_JPGDECRST_RELEASE_RESET -#define __HAL_RCC_JPEG_CLK_SLEEP_ENABLE __HAL_RCC_JPGDEC_CLK_SLEEP_ENABLE -#define __HAL_RCC_JPEG_CLK_SLEEP_DISABLE __HAL_RCC_JPGDEC_CLK_SLEEP_DISABLE -#endif /* STM32H7 */ - -/** - * @} - */ - -/** @defgroup HAL_SYSCFG_Aliased_Defines HAL SYSCFG Aliased Defines maintained for legacy purpose - * @{ - */ - -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PA9 I2C_FASTMODEPLUS_PA9 -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PA10 I2C_FASTMODEPLUS_PA10 -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB6 I2C_FASTMODEPLUS_PB6 -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB7 I2C_FASTMODEPLUS_PB7 -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB8 I2C_FASTMODEPLUS_PB8 -#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB9 I2C_FASTMODEPLUS_PB9 -#define HAL_SYSCFG_FASTMODEPLUS_I2C1 I2C_FASTMODEPLUS_I2C1 -#define HAL_SYSCFG_FASTMODEPLUS_I2C2 I2C_FASTMODEPLUS_I2C2 -#define HAL_SYSCFG_FASTMODEPLUS_I2C3 I2C_FASTMODEPLUS_I2C3 -#if defined(STM32G4) - -#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SYSCFG_EnableIOSwitchBooster -#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SYSCFG_DisableIOSwitchBooster -#define HAL_SYSCFG_EnableIOAnalogSwitchVDD HAL_SYSCFG_EnableIOSwitchVDD -#define HAL_SYSCFG_DisableIOAnalogSwitchVDD HAL_SYSCFG_DisableIOSwitchVDD -#endif /* STM32G4 */ - -#if defined(STM32U5) - -#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SYSCFG_EnableIOAnalogBooster -#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SYSCFG_DisableIOAnalogBooster -#define HAL_SYSCFG_EnableIOAnalogSwitchVoltageSelection HAL_SYSCFG_EnableIOAnalogVoltageSelection -#define HAL_SYSCFG_DisableIOAnalogSwitchVoltageSelection HAL_SYSCFG_DisableIOAnalogVoltageSelection - -#endif /* STM32U5 */ - -#if defined(STM32H5) -#define SYSCFG_IT_FPU_IOC SBS_IT_FPU_IOC -#define SYSCFG_IT_FPU_DZC SBS_IT_FPU_DZC -#define SYSCFG_IT_FPU_UFC SBS_IT_FPU_UFC -#define SYSCFG_IT_FPU_OFC SBS_IT_FPU_OFC -#define SYSCFG_IT_FPU_IDC SBS_IT_FPU_IDC -#define SYSCFG_IT_FPU_IXC SBS_IT_FPU_IXC - -#define SYSCFG_BREAK_FLASH_ECC SBS_BREAK_FLASH_ECC -#define SYSCFG_BREAK_PVD SBS_BREAK_PVD -#define SYSCFG_BREAK_SRAM_ECC SBS_BREAK_SRAM_ECC -#define SYSCFG_BREAK_LOCKUP SBS_BREAK_LOCKUP - -#define SYSCFG_VREFBUF_VOLTAGE_SCALE0 VREFBUF_VOLTAGE_SCALE0 -#define SYSCFG_VREFBUF_VOLTAGE_SCALE1 VREFBUF_VOLTAGE_SCALE1 -#define SYSCFG_VREFBUF_VOLTAGE_SCALE2 VREFBUF_VOLTAGE_SCALE2 -#define SYSCFG_VREFBUF_VOLTAGE_SCALE3 VREFBUF_VOLTAGE_SCALE3 - -#define SYSCFG_VREFBUF_HIGH_IMPEDANCE_DISABLE VREFBUF_HIGH_IMPEDANCE_DISABLE -#define SYSCFG_VREFBUF_HIGH_IMPEDANCE_ENABLE VREFBUF_HIGH_IMPEDANCE_ENABLE - -#define SYSCFG_FASTMODEPLUS_PB6 SBS_FASTMODEPLUS_PB6 -#define SYSCFG_FASTMODEPLUS_PB7 SBS_FASTMODEPLUS_PB7 -#define SYSCFG_FASTMODEPLUS_PB8 SBS_FASTMODEPLUS_PB8 -#define SYSCFG_FASTMODEPLUS_PB9 SBS_FASTMODEPLUS_PB9 - -#define SYSCFG_ETH_MII SBS_ETH_MII -#define SYSCFG_ETH_RMII SBS_ETH_RMII -#define IS_SYSCFG_ETHERNET_CONFIG IS_SBS_ETHERNET_CONFIG - -#define SYSCFG_MEMORIES_ERASE_FLAG_IPMEE SBS_MEMORIES_ERASE_FLAG_IPMEE -#define SYSCFG_MEMORIES_ERASE_FLAG_MCLR SBS_MEMORIES_ERASE_FLAG_MCLR -#define IS_SYSCFG_MEMORIES_ERASE_FLAG IS_SBS_MEMORIES_ERASE_FLAG - -#define IS_SYSCFG_CODE_CONFIG IS_SBS_CODE_CONFIG - -#define SYSCFG_MPU_NSEC SBS_MPU_NSEC -#define SYSCFG_VTOR_NSEC SBS_VTOR_NSEC -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#define SYSCFG_SAU SBS_SAU -#define SYSCFG_MPU_SEC SBS_MPU_SEC -#define SYSCFG_VTOR_AIRCR_SEC SBS_VTOR_AIRCR_SEC -#define SYSCFG_LOCK_ALL SBS_LOCK_ALL -#else -#define SYSCFG_LOCK_ALL SBS_LOCK_ALL -#endif /* __ARM_FEATURE_CMSE */ - -#define SYSCFG_CLK SBS_CLK -#define SYSCFG_CLASSB SBS_CLASSB -#define SYSCFG_FPU SBS_FPU -#define SYSCFG_ALL SBS_ALL - -#define SYSCFG_SEC SBS_SEC -#define SYSCFG_NSEC SBS_NSEC - -#define __HAL_SYSCFG_FPU_INTERRUPT_ENABLE __HAL_SBS_FPU_INTERRUPT_ENABLE -#define __HAL_SYSCFG_FPU_INTERRUPT_DISABLE __HAL_SBS_FPU_INTERRUPT_DISABLE - -#define __HAL_SYSCFG_BREAK_ECC_LOCK __HAL_SBS_BREAK_ECC_LOCK -#define __HAL_SYSCFG_BREAK_LOCKUP_LOCK __HAL_SBS_BREAK_LOCKUP_LOCK -#define __HAL_SYSCFG_BREAK_PVD_LOCK __HAL_SBS_BREAK_PVD_LOCK -#define __HAL_SYSCFG_BREAK_SRAM_ECC_LOCK __HAL_SBS_BREAK_SRAM_ECC_LOCK - -#define __HAL_SYSCFG_FASTMODEPLUS_ENABLE __HAL_SBS_FASTMODEPLUS_ENABLE -#define __HAL_SYSCFG_FASTMODEPLUS_DISABLE __HAL_SBS_FASTMODEPLUS_DISABLE - -#define __HAL_SYSCFG_GET_MEMORIES_ERASE_STATUS __HAL_SBS_GET_MEMORIES_ERASE_STATUS -#define __HAL_SYSCFG_CLEAR_MEMORIES_ERASE_STATUS __HAL_SBS_CLEAR_MEMORIES_ERASE_STATUS - -#define IS_SYSCFG_FPU_INTERRUPT IS_SBS_FPU_INTERRUPT -#define IS_SYSCFG_BREAK_CONFIG IS_SBS_BREAK_CONFIG -#define IS_SYSCFG_VREFBUF_VOLTAGE_SCALE IS_VREFBUF_VOLTAGE_SCALE -#define IS_SYSCFG_VREFBUF_HIGH_IMPEDANCE IS_VREFBUF_HIGH_IMPEDANCE -#define IS_SYSCFG_VREFBUF_TRIMMING IS_VREFBUF_TRIMMING -#define IS_SYSCFG_FASTMODEPLUS IS_SBS_FASTMODEPLUS -#define IS_SYSCFG_ITEMS_ATTRIBUTES IS_SBS_ITEMS_ATTRIBUTES -#define IS_SYSCFG_ATTRIBUTES IS_SBS_ATTRIBUTES -#define IS_SYSCFG_LOCK_ITEMS IS_SBS_LOCK_ITEMS - -#define HAL_SYSCFG_VREFBUF_VoltageScalingConfig HAL_VREFBUF_VoltageScalingConfig -#define HAL_SYSCFG_VREFBUF_HighImpedanceConfig HAL_VREFBUF_HighImpedanceConfig -#define HAL_SYSCFG_VREFBUF_TrimmingConfig HAL_VREFBUF_TrimmingConfig -#define HAL_SYSCFG_EnableVREFBUF HAL_EnableVREFBUF -#define HAL_SYSCFG_DisableVREFBUF HAL_DisableVREFBUF - -#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SBS_EnableIOAnalogSwitchBooster -#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SBS_DisableIOAnalogSwitchBooster -#define HAL_SYSCFG_ETHInterfaceSelect HAL_SBS_ETHInterfaceSelect - -#define HAL_SYSCFG_Lock HAL_SBS_Lock -#define HAL_SYSCFG_GetLock HAL_SBS_GetLock - -#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) -#define HAL_SYSCFG_ConfigAttributes HAL_SBS_ConfigAttributes -#define HAL_SYSCFG_GetConfigAttributes HAL_SBS_GetConfigAttributes -#endif /* __ARM_FEATURE_CMSE */ - -#endif /* STM32H5 */ - - -/** - * @} - */ - - -/** @defgroup LL_FMC_Aliased_Defines LL FMC Aliased Defines maintained for compatibility purpose - * @{ - */ -#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) || defined(STM32G4) -#define FMC_NAND_PCC_WAIT_FEATURE_DISABLE FMC_NAND_WAIT_FEATURE_DISABLE -#define FMC_NAND_PCC_WAIT_FEATURE_ENABLE FMC_NAND_WAIT_FEATURE_ENABLE -#define FMC_NAND_PCC_MEM_BUS_WIDTH_8 FMC_NAND_MEM_BUS_WIDTH_8 -#define FMC_NAND_PCC_MEM_BUS_WIDTH_16 FMC_NAND_MEM_BUS_WIDTH_16 -#elif defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) -#define FMC_NAND_WAIT_FEATURE_DISABLE FMC_NAND_PCC_WAIT_FEATURE_DISABLE -#define FMC_NAND_WAIT_FEATURE_ENABLE FMC_NAND_PCC_WAIT_FEATURE_ENABLE -#define FMC_NAND_MEM_BUS_WIDTH_8 FMC_NAND_PCC_MEM_BUS_WIDTH_8 -#define FMC_NAND_MEM_BUS_WIDTH_16 FMC_NAND_PCC_MEM_BUS_WIDTH_16 -#endif -/** - * @} - */ - -/** @defgroup LL_FSMC_Aliased_Defines LL FSMC Aliased Defines maintained for legacy purpose - * @{ - */ - -#define FSMC_NORSRAM_TYPEDEF FSMC_NORSRAM_TypeDef -#define FSMC_NORSRAM_EXTENDED_TYPEDEF FSMC_NORSRAM_EXTENDED_TypeDef -/** - * @} - */ - -/** @defgroup HAL_GPIO_Aliased_Macros HAL GPIO Aliased Macros maintained for legacy purpose - * @{ - */ -#define GET_GPIO_SOURCE GPIO_GET_INDEX -#define GET_GPIO_INDEX GPIO_GET_INDEX - -#if defined(STM32F4) -#define GPIO_AF12_SDMMC GPIO_AF12_SDIO -#define GPIO_AF12_SDMMC1 GPIO_AF12_SDIO -#endif - -#if defined(STM32F7) -#define GPIO_AF12_SDIO GPIO_AF12_SDMMC1 -#define GPIO_AF12_SDMMC GPIO_AF12_SDMMC1 -#endif - -#if defined(STM32L4) -#define GPIO_AF12_SDIO GPIO_AF12_SDMMC1 -#define GPIO_AF12_SDMMC GPIO_AF12_SDMMC1 -#endif - -#if defined(STM32H7) -#define GPIO_AF7_SDIO1 GPIO_AF7_SDMMC1 -#define GPIO_AF8_SDIO1 GPIO_AF8_SDMMC1 -#define GPIO_AF12_SDIO1 GPIO_AF12_SDMMC1 -#define GPIO_AF9_SDIO2 GPIO_AF9_SDMMC2 -#define GPIO_AF10_SDIO2 GPIO_AF10_SDMMC2 -#define GPIO_AF11_SDIO2 GPIO_AF11_SDMMC2 - -#if defined (STM32H743xx) || defined (STM32H753xx) || defined (STM32H750xx) || defined (STM32H742xx) || \ - defined (STM32H745xx) || defined (STM32H755xx) || defined (STM32H747xx) || defined (STM32H757xx) -#define GPIO_AF10_OTG2_HS GPIO_AF10_OTG2_FS -#define GPIO_AF10_OTG1_FS GPIO_AF10_OTG1_HS -#define GPIO_AF12_OTG2_FS GPIO_AF12_OTG1_FS -#endif /*STM32H743xx || STM32H753xx || STM32H750xx || STM32H742xx || STM32H745xx || STM32H755xx || STM32H747xx || \ - STM32H757xx */ -#endif /* STM32H7 */ - -#define GPIO_AF0_LPTIM GPIO_AF0_LPTIM1 -#define GPIO_AF1_LPTIM GPIO_AF1_LPTIM1 -#define GPIO_AF2_LPTIM GPIO_AF2_LPTIM1 - -#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || \ - defined(STM32G4) || defined(STM32H7) || defined(STM32WB) || defined(STM32U5) -#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW -#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM -#define GPIO_SPEED_FAST GPIO_SPEED_FREQ_HIGH -#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH -#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32G4 || STM32H7 || STM32WB || STM32U5*/ - -#if defined(STM32L1) -#define GPIO_SPEED_VERY_LOW GPIO_SPEED_FREQ_LOW -#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_MEDIUM -#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_HIGH -#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH -#endif /* STM32L1 */ - -#if defined(STM32F0) || defined(STM32F3) || defined(STM32F1) -#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW -#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM -#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_HIGH -#endif /* STM32F0 || STM32F3 || STM32F1 */ - -#define GPIO_AF6_DFSDM GPIO_AF6_DFSDM1 - -#if defined(STM32U5) || defined(STM32H5) -#define GPIO_AF0_RTC_50Hz GPIO_AF0_RTC_50HZ -#endif /* STM32U5 || STM32H5 */ -#if defined(STM32U5) -#define GPIO_AF0_S2DSTOP GPIO_AF0_SRDSTOP -#define GPIO_AF11_LPGPIO GPIO_AF11_LPGPIO1 -#endif /* STM32U5 */ - -#if defined(STM32WBA) -#define GPIO_AF11_RF_ANTSW0 GPIO_AF11_RF -#define GPIO_AF11_RF_ANTSW1 GPIO_AF11_RF -#define GPIO_AF11_RF_ANTSW2 GPIO_AF11_RF -#define GPIO_AF11_RF_IO1 GPIO_AF11_RF -#define GPIO_AF11_RF_IO2 GPIO_AF11_RF -#define GPIO_AF11_RF_IO3 GPIO_AF11_RF -#define GPIO_AF11_RF_IO4 GPIO_AF11_RF -#define GPIO_AF11_RF_IO5 GPIO_AF11_RF -#define GPIO_AF11_RF_IO6 GPIO_AF11_RF -#define GPIO_AF11_RF_IO7 GPIO_AF11_RF -#define GPIO_AF11_RF_IO8 GPIO_AF11_RF -#define GPIO_AF11_RF_IO9 GPIO_AF11_RF -#endif /* STM32WBA */ -/** - * @} - */ - -/** @defgroup HAL_GTZC_Aliased_Defines HAL GTZC Aliased Defines maintained for legacy purpose - * @{ - */ -#if defined(STM32U5) -#define GTZC_PERIPH_DCMI GTZC_PERIPH_DCMI_PSSI -#define GTZC_PERIPH_LTDC GTZC_PERIPH_LTDCUSB -#endif /* STM32U5 */ -#if defined(STM32H5) -#define GTZC_PERIPH_DAC12 GTZC_PERIPH_DAC1 -#define GTZC_PERIPH_ADC12 GTZC_PERIPH_ADC -#define GTZC_PERIPH_USBFS GTZC_PERIPH_USB -#endif /* STM32H5 */ -#if defined(STM32H5) || defined(STM32U5) -#define GTZC_MCPBB_NB_VCTR_REG_MAX GTZC_MPCBB_NB_VCTR_REG_MAX -#define GTZC_MCPBB_NB_LCK_VCTR_REG_MAX GTZC_MPCBB_NB_LCK_VCTR_REG_MAX -#define GTZC_MCPBB_SUPERBLOCK_UNLOCKED GTZC_MPCBB_SUPERBLOCK_UNLOCKED -#define GTZC_MCPBB_SUPERBLOCK_LOCKED GTZC_MPCBB_SUPERBLOCK_LOCKED -#define GTZC_MCPBB_BLOCK_NSEC GTZC_MPCBB_BLOCK_NSEC -#define GTZC_MCPBB_BLOCK_SEC GTZC_MPCBB_BLOCK_SEC -#define GTZC_MCPBB_BLOCK_NPRIV GTZC_MPCBB_BLOCK_NPRIV -#define GTZC_MCPBB_BLOCK_PRIV GTZC_MPCBB_BLOCK_PRIV -#define GTZC_MCPBB_LOCK_OFF GTZC_MPCBB_LOCK_OFF -#define GTZC_MCPBB_LOCK_ON GTZC_MPCBB_LOCK_ON -#endif /* STM32H5 || STM32U5 */ -/** - * @} - */ - -/** @defgroup HAL_HRTIM_Aliased_Macros HAL HRTIM Aliased Macros maintained for legacy purpose - * @{ - */ -#define HRTIM_TIMDELAYEDPROTECTION_DISABLED HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT1_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT1_EEV6 -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT2_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT2_EEV6 -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDBOTH_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDBOTH_EEV6 -#define HRTIM_TIMDELAYEDPROTECTION_BALANCED_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_BALANCED_EEV6 -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT1_DEEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT1_DEEV7 -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT2_DEEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT2_DEEV7 -#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDBOTH_EEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDBOTH_EEV7 -#define HRTIM_TIMDELAYEDPROTECTION_BALANCED_EEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_BALANCED_EEV7 - -#define __HAL_HRTIM_SetCounter __HAL_HRTIM_SETCOUNTER -#define __HAL_HRTIM_GetCounter __HAL_HRTIM_GETCOUNTER -#define __HAL_HRTIM_SetPeriod __HAL_HRTIM_SETPERIOD -#define __HAL_HRTIM_GetPeriod __HAL_HRTIM_GETPERIOD -#define __HAL_HRTIM_SetClockPrescaler __HAL_HRTIM_SETCLOCKPRESCALER -#define __HAL_HRTIM_GetClockPrescaler __HAL_HRTIM_GETCLOCKPRESCALER -#define __HAL_HRTIM_SetCompare __HAL_HRTIM_SETCOMPARE -#define __HAL_HRTIM_GetCompare __HAL_HRTIM_GETCOMPARE - -#if defined(STM32F3) || defined(STM32G4) || defined(STM32H7) -#define HRTIMInterruptResquests HRTIMInterruptRequests -#endif /* STM32F3 || STM32G4 || STM32H7 */ - -#if defined(STM32G4) -#define HAL_HRTIM_ExternalEventCounterConfig HAL_HRTIM_ExtEventCounterConfig -#define HAL_HRTIM_ExternalEventCounterEnable HAL_HRTIM_ExtEventCounterEnable -#define HAL_HRTIM_ExternalEventCounterDisable HAL_HRTIM_ExtEventCounterDisable -#define HAL_HRTIM_ExternalEventCounterReset HAL_HRTIM_ExtEventCounterReset -#define HRTIM_TIMEEVENT_A HRTIM_EVENTCOUNTER_A -#define HRTIM_TIMEEVENT_B HRTIM_EVENTCOUNTER_B -#define HRTIM_TIMEEVENTRESETMODE_UNCONDITIONAL HRTIM_EVENTCOUNTER_RSTMODE_UNCONDITIONAL -#define HRTIM_TIMEEVENTRESETMODE_CONDITIONAL HRTIM_EVENTCOUNTER_RSTMODE_CONDITIONAL -#endif /* STM32G4 */ - -#if defined(STM32H7) -#define HRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTSET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 - -#define HRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTRESET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 -#define HRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 -#define HRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 -#define HRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 -#define HRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 -#define HRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 -#define HRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 -#define HRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 -#define HRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 -#define HRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 -#endif /* STM32H7 */ - -#if defined(STM32F3) -/** @brief Constants defining available sources associated to external events. - */ -#define HRTIM_EVENTSRC_1 (0x00000000U) -#define HRTIM_EVENTSRC_2 (HRTIM_EECR1_EE1SRC_0) -#define HRTIM_EVENTSRC_3 (HRTIM_EECR1_EE1SRC_1) -#define HRTIM_EVENTSRC_4 (HRTIM_EECR1_EE1SRC_1 | HRTIM_EECR1_EE1SRC_0) - -/** @brief Constants defining the DLL calibration periods (in micro seconds) - */ -#define HRTIM_CALIBRATIONRATE_7300 0x00000000U -#define HRTIM_CALIBRATIONRATE_910 (HRTIM_DLLCR_CALRTE_0) -#define HRTIM_CALIBRATIONRATE_114 (HRTIM_DLLCR_CALRTE_1) -#define HRTIM_CALIBRATIONRATE_14 (HRTIM_DLLCR_CALRTE_1 | HRTIM_DLLCR_CALRTE_0) -#endif /* STM32F3 */ - -/** - * @} - */ - -/** @defgroup HAL_I2C_Aliased_Defines HAL I2C Aliased Defines maintained for legacy purpose - * @{ - */ -#define I2C_DUALADDRESS_DISABLED I2C_DUALADDRESS_DISABLE -#define I2C_DUALADDRESS_ENABLED I2C_DUALADDRESS_ENABLE -#define I2C_GENERALCALL_DISABLED I2C_GENERALCALL_DISABLE -#define I2C_GENERALCALL_ENABLED I2C_GENERALCALL_ENABLE -#define I2C_NOSTRETCH_DISABLED I2C_NOSTRETCH_DISABLE -#define I2C_NOSTRETCH_ENABLED I2C_NOSTRETCH_ENABLE -#define I2C_ANALOGFILTER_ENABLED I2C_ANALOGFILTER_ENABLE -#define I2C_ANALOGFILTER_DISABLED I2C_ANALOGFILTER_DISABLE -#if defined(STM32F0) || defined(STM32F1) || defined(STM32F3) || defined(STM32G0) || defined(STM32L4) || \ - defined(STM32L1) || defined(STM32F7) -#define HAL_I2C_STATE_MEM_BUSY_TX HAL_I2C_STATE_BUSY_TX -#define HAL_I2C_STATE_MEM_BUSY_RX HAL_I2C_STATE_BUSY_RX -#define HAL_I2C_STATE_MASTER_BUSY_TX HAL_I2C_STATE_BUSY_TX -#define HAL_I2C_STATE_MASTER_BUSY_RX HAL_I2C_STATE_BUSY_RX -#define HAL_I2C_STATE_SLAVE_BUSY_TX HAL_I2C_STATE_BUSY_TX -#define HAL_I2C_STATE_SLAVE_BUSY_RX HAL_I2C_STATE_BUSY_RX -#endif -/** - * @} - */ - -/** @defgroup HAL_IRDA_Aliased_Defines HAL IRDA Aliased Defines maintained for legacy purpose - * @{ - */ -#define IRDA_ONE_BIT_SAMPLE_DISABLED IRDA_ONE_BIT_SAMPLE_DISABLE -#define IRDA_ONE_BIT_SAMPLE_ENABLED IRDA_ONE_BIT_SAMPLE_ENABLE - -/** - * @} - */ - -/** @defgroup HAL_IWDG_Aliased_Defines HAL IWDG Aliased Defines maintained for legacy purpose - * @{ - */ -#define KR_KEY_RELOAD IWDG_KEY_RELOAD -#define KR_KEY_ENABLE IWDG_KEY_ENABLE -#define KR_KEY_EWA IWDG_KEY_WRITE_ACCESS_ENABLE -#define KR_KEY_DWA IWDG_KEY_WRITE_ACCESS_DISABLE -/** - * @} - */ - -/** @defgroup HAL_LPTIM_Aliased_Defines HAL LPTIM Aliased Defines maintained for legacy purpose - * @{ - */ - -#define LPTIM_CLOCKSAMPLETIME_DIRECTTRANSISTION LPTIM_CLOCKSAMPLETIME_DIRECTTRANSITION -#define LPTIM_CLOCKSAMPLETIME_2TRANSISTIONS LPTIM_CLOCKSAMPLETIME_2TRANSITIONS -#define LPTIM_CLOCKSAMPLETIME_4TRANSISTIONS LPTIM_CLOCKSAMPLETIME_4TRANSITIONS -#define LPTIM_CLOCKSAMPLETIME_8TRANSISTIONS LPTIM_CLOCKSAMPLETIME_8TRANSITIONS - -#define LPTIM_CLOCKPOLARITY_RISINGEDGE LPTIM_CLOCKPOLARITY_RISING -#define LPTIM_CLOCKPOLARITY_FALLINGEDGE LPTIM_CLOCKPOLARITY_FALLING -#define LPTIM_CLOCKPOLARITY_BOTHEDGES LPTIM_CLOCKPOLARITY_RISING_FALLING - -#define LPTIM_TRIGSAMPLETIME_DIRECTTRANSISTION LPTIM_TRIGSAMPLETIME_DIRECTTRANSITION -#define LPTIM_TRIGSAMPLETIME_2TRANSISTIONS LPTIM_TRIGSAMPLETIME_2TRANSITIONS -#define LPTIM_TRIGSAMPLETIME_4TRANSISTIONS LPTIM_TRIGSAMPLETIME_4TRANSITIONS -#define LPTIM_TRIGSAMPLETIME_8TRANSISTIONS LPTIM_TRIGSAMPLETIME_8TRANSITIONS - -/* The following 3 definition have also been present in a temporary version of lptim.h */ -/* They need to be renamed also to the right name, just in case */ -#define LPTIM_TRIGSAMPLETIME_2TRANSITION LPTIM_TRIGSAMPLETIME_2TRANSITIONS -#define LPTIM_TRIGSAMPLETIME_4TRANSITION LPTIM_TRIGSAMPLETIME_4TRANSITIONS -#define LPTIM_TRIGSAMPLETIME_8TRANSITION LPTIM_TRIGSAMPLETIME_8TRANSITIONS - - -/** @defgroup HAL_LPTIM_Aliased_Defines HAL LPTIM Aliased Defines maintained for legacy purpose - * @{ - */ -#define HAL_LPTIM_ReadCompare HAL_LPTIM_ReadCapturedValue -/** - * @} - */ - -#if defined(STM32U5) -#define LPTIM_ISR_CC1 LPTIM_ISR_CC1IF -#define LPTIM_ISR_CC2 LPTIM_ISR_CC2IF -#define LPTIM_CHANNEL_ALL 0x00000000U -#endif /* STM32U5 */ -/** - * @} - */ - -/** @defgroup HAL_NAND_Aliased_Defines HAL NAND Aliased Defines maintained for legacy purpose - * @{ - */ -#define HAL_NAND_Read_Page HAL_NAND_Read_Page_8b -#define HAL_NAND_Write_Page HAL_NAND_Write_Page_8b -#define HAL_NAND_Read_SpareArea HAL_NAND_Read_SpareArea_8b -#define HAL_NAND_Write_SpareArea HAL_NAND_Write_SpareArea_8b - -#define NAND_AddressTypedef NAND_AddressTypeDef - -#define __ARRAY_ADDRESS ARRAY_ADDRESS -#define __ADDR_1st_CYCLE ADDR_1ST_CYCLE -#define __ADDR_2nd_CYCLE ADDR_2ND_CYCLE -#define __ADDR_3rd_CYCLE ADDR_3RD_CYCLE -#define __ADDR_4th_CYCLE ADDR_4TH_CYCLE -/** - * @} - */ - -/** @defgroup HAL_NOR_Aliased_Defines HAL NOR Aliased Defines maintained for legacy purpose - * @{ - */ -#define NOR_StatusTypedef HAL_NOR_StatusTypeDef -#define NOR_SUCCESS HAL_NOR_STATUS_SUCCESS -#define NOR_ONGOING HAL_NOR_STATUS_ONGOING -#define NOR_ERROR HAL_NOR_STATUS_ERROR -#define NOR_TIMEOUT HAL_NOR_STATUS_TIMEOUT - -#define __NOR_WRITE NOR_WRITE -#define __NOR_ADDR_SHIFT NOR_ADDR_SHIFT -/** - * @} - */ - -/** @defgroup HAL_OPAMP_Aliased_Defines HAL OPAMP Aliased Defines maintained for legacy purpose - * @{ - */ - -#define OPAMP_NONINVERTINGINPUT_VP0 OPAMP_NONINVERTINGINPUT_IO0 -#define OPAMP_NONINVERTINGINPUT_VP1 OPAMP_NONINVERTINGINPUT_IO1 -#define OPAMP_NONINVERTINGINPUT_VP2 OPAMP_NONINVERTINGINPUT_IO2 -#define OPAMP_NONINVERTINGINPUT_VP3 OPAMP_NONINVERTINGINPUT_IO3 - -#define OPAMP_SEC_NONINVERTINGINPUT_VP0 OPAMP_SEC_NONINVERTINGINPUT_IO0 -#define OPAMP_SEC_NONINVERTINGINPUT_VP1 OPAMP_SEC_NONINVERTINGINPUT_IO1 -#define OPAMP_SEC_NONINVERTINGINPUT_VP2 OPAMP_SEC_NONINVERTINGINPUT_IO2 -#define OPAMP_SEC_NONINVERTINGINPUT_VP3 OPAMP_SEC_NONINVERTINGINPUT_IO3 - -#define OPAMP_INVERTINGINPUT_VM0 OPAMP_INVERTINGINPUT_IO0 -#define OPAMP_INVERTINGINPUT_VM1 OPAMP_INVERTINGINPUT_IO1 - -#define IOPAMP_INVERTINGINPUT_VM0 OPAMP_INVERTINGINPUT_IO0 -#define IOPAMP_INVERTINGINPUT_VM1 OPAMP_INVERTINGINPUT_IO1 - -#define OPAMP_SEC_INVERTINGINPUT_VM0 OPAMP_SEC_INVERTINGINPUT_IO0 -#define OPAMP_SEC_INVERTINGINPUT_VM1 OPAMP_SEC_INVERTINGINPUT_IO1 - -#define OPAMP_INVERTINGINPUT_VINM OPAMP_SEC_INVERTINGINPUT_IO1 - -#define OPAMP_PGACONNECT_NO OPAMP_PGA_CONNECT_INVERTINGINPUT_NO -#define OPAMP_PGACONNECT_VM0 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0 -#define OPAMP_PGACONNECT_VM1 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO1 - -#if defined(STM32L1) || defined(STM32L4) || defined(STM32L5) || defined(STM32H7) || defined(STM32G4) || defined(STM32U5) -#define HAL_OPAMP_MSP_INIT_CB_ID HAL_OPAMP_MSPINIT_CB_ID -#define HAL_OPAMP_MSP_DEINIT_CB_ID HAL_OPAMP_MSPDEINIT_CB_ID -#endif - -#if defined(STM32L4) || defined(STM32L5) -#define OPAMP_POWERMODE_NORMAL OPAMP_POWERMODE_NORMALPOWER -#elif defined(STM32G4) -#define OPAMP_POWERMODE_NORMAL OPAMP_POWERMODE_NORMALSPEED -#endif - -/** - * @} - */ - -/** @defgroup HAL_I2S_Aliased_Defines HAL I2S Aliased Defines maintained for legacy purpose - * @{ - */ -#define I2S_STANDARD_PHILLIPS I2S_STANDARD_PHILIPS - -#if defined(STM32H7) -#define I2S_IT_TXE I2S_IT_TXP -#define I2S_IT_RXNE I2S_IT_RXP - -#define I2S_FLAG_TXE I2S_FLAG_TXP -#define I2S_FLAG_RXNE I2S_FLAG_RXP -#endif - -#if defined(STM32F7) -#define I2S_CLOCK_SYSCLK I2S_CLOCK_PLL -#endif -/** - * @} - */ - -/** @defgroup HAL_PCCARD_Aliased_Defines HAL PCCARD Aliased Defines maintained for legacy purpose - * @{ - */ - -/* Compact Flash-ATA registers description */ -#define CF_DATA ATA_DATA -#define CF_SECTOR_COUNT ATA_SECTOR_COUNT -#define CF_SECTOR_NUMBER ATA_SECTOR_NUMBER -#define CF_CYLINDER_LOW ATA_CYLINDER_LOW -#define CF_CYLINDER_HIGH ATA_CYLINDER_HIGH -#define CF_CARD_HEAD ATA_CARD_HEAD -#define CF_STATUS_CMD ATA_STATUS_CMD -#define CF_STATUS_CMD_ALTERNATE ATA_STATUS_CMD_ALTERNATE -#define CF_COMMON_DATA_AREA ATA_COMMON_DATA_AREA - -/* Compact Flash-ATA commands */ -#define CF_READ_SECTOR_CMD ATA_READ_SECTOR_CMD -#define CF_WRITE_SECTOR_CMD ATA_WRITE_SECTOR_CMD -#define CF_ERASE_SECTOR_CMD ATA_ERASE_SECTOR_CMD -#define CF_IDENTIFY_CMD ATA_IDENTIFY_CMD - -#define PCCARD_StatusTypedef HAL_PCCARD_StatusTypeDef -#define PCCARD_SUCCESS HAL_PCCARD_STATUS_SUCCESS -#define PCCARD_ONGOING HAL_PCCARD_STATUS_ONGOING -#define PCCARD_ERROR HAL_PCCARD_STATUS_ERROR -#define PCCARD_TIMEOUT HAL_PCCARD_STATUS_TIMEOUT -/** - * @} - */ - -/** @defgroup HAL_RTC_Aliased_Defines HAL RTC Aliased Defines maintained for legacy purpose - * @{ - */ - -#define FORMAT_BIN RTC_FORMAT_BIN -#define FORMAT_BCD RTC_FORMAT_BCD - -#define RTC_ALARMSUBSECONDMASK_None RTC_ALARMSUBSECONDMASK_NONE -#define RTC_TAMPERERASEBACKUP_DISABLED RTC_TAMPER_ERASE_BACKUP_DISABLE -#define RTC_TAMPERMASK_FLAG_DISABLED RTC_TAMPERMASK_FLAG_DISABLE -#define RTC_TAMPERMASK_FLAG_ENABLED RTC_TAMPERMASK_FLAG_ENABLE - -#define RTC_MASKTAMPERFLAG_DISABLED RTC_TAMPERMASK_FLAG_DISABLE -#define RTC_MASKTAMPERFLAG_ENABLED RTC_TAMPERMASK_FLAG_ENABLE -#define RTC_TAMPERERASEBACKUP_ENABLED RTC_TAMPER_ERASE_BACKUP_ENABLE -#define RTC_TAMPER1_2_INTERRUPT RTC_ALL_TAMPER_INTERRUPT -#define RTC_TAMPER1_2_3_INTERRUPT RTC_ALL_TAMPER_INTERRUPT - -#define RTC_TIMESTAMPPIN_PC13 RTC_TIMESTAMPPIN_DEFAULT -#define RTC_TIMESTAMPPIN_PA0 RTC_TIMESTAMPPIN_POS1 -#define RTC_TIMESTAMPPIN_PI8 RTC_TIMESTAMPPIN_POS1 -#define RTC_TIMESTAMPPIN_PC1 RTC_TIMESTAMPPIN_POS2 - -#define RTC_OUTPUT_REMAP_PC13 RTC_OUTPUT_REMAP_NONE -#define RTC_OUTPUT_REMAP_PB14 RTC_OUTPUT_REMAP_POS1 -#define RTC_OUTPUT_REMAP_PB2 RTC_OUTPUT_REMAP_POS1 - -#define RTC_TAMPERPIN_PC13 RTC_TAMPERPIN_DEFAULT -#define RTC_TAMPERPIN_PA0 RTC_TAMPERPIN_POS1 -#define RTC_TAMPERPIN_PI8 RTC_TAMPERPIN_POS1 - -#if defined(STM32H5) || defined(STM32H7RS) || defined(STM32N6) -#define TAMP_SECRETDEVICE_ERASE_NONE TAMP_DEVICESECRETS_ERASE_NONE -#define TAMP_SECRETDEVICE_ERASE_BKP_SRAM TAMP_DEVICESECRETS_ERASE_BKPSRAM -#endif /* STM32H5 || STM32H7RS || STM32N6 */ - -#if defined(STM32WBA) -#define TAMP_SECRETDEVICE_ERASE_NONE TAMP_DEVICESECRETS_ERASE_NONE -#define TAMP_SECRETDEVICE_ERASE_SRAM2 TAMP_DEVICESECRETS_ERASE_SRAM2 -#define TAMP_SECRETDEVICE_ERASE_RHUK TAMP_DEVICESECRETS_ERASE_RHUK -#define TAMP_SECRETDEVICE_ERASE_ICACHE TAMP_DEVICESECRETS_ERASE_ICACHE -#define TAMP_SECRETDEVICE_ERASE_SAES_AES_HASH TAMP_DEVICESECRETS_ERASE_SAES_AES_HASH -#define TAMP_SECRETDEVICE_ERASE_PKA_SRAM TAMP_DEVICESECRETS_ERASE_PKA_SRAM -#define TAMP_SECRETDEVICE_ERASE_ALL TAMP_DEVICESECRETS_ERASE_ALL -#endif /* STM32WBA */ - -#if defined(STM32H5) || defined(STM32WBA) || defined(STM32H7RS) || defined(STM32N6) -#define TAMP_SECRETDEVICE_ERASE_DISABLE TAMP_DEVICESECRETS_ERASE_NONE -#define TAMP_SECRETDEVICE_ERASE_ENABLE TAMP_SECRETDEVICE_ERASE_ALL -#endif /* STM32H5 || STM32WBA || STM32H7RS || STM32N6 */ - -#if defined(STM32F7) || defined(STM32WB) -#define RTC_TAMPCR_TAMPXE RTC_TAMPER_ENABLE_BITS_MASK -#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_IT_ENABLE_BITS_MASK -#endif /* STM32F7 || STM32WB */ - -#if defined(STM32H7) -#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X -#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT -#endif /* STM32H7 */ - -#if defined(STM32F7) || defined(STM32H7) || defined(STM32L0) || defined(STM32WB) -#define RTC_TAMPER1_INTERRUPT RTC_IT_TAMP1 -#define RTC_TAMPER2_INTERRUPT RTC_IT_TAMP2 -#define RTC_TAMPER3_INTERRUPT RTC_IT_TAMP3 -#define RTC_ALL_TAMPER_INTERRUPT RTC_IT_TAMP -#endif /* STM32F7 || STM32H7 || STM32L0 || STM32WB */ - -/** - * @} - */ - - -/** @defgroup HAL_SMARTCARD_Aliased_Defines HAL SMARTCARD Aliased Defines maintained for legacy purpose - * @{ - */ -#define SMARTCARD_NACK_ENABLED SMARTCARD_NACK_ENABLE -#define SMARTCARD_NACK_DISABLED SMARTCARD_NACK_DISABLE - -#define SMARTCARD_ONEBIT_SAMPLING_DISABLED SMARTCARD_ONE_BIT_SAMPLE_DISABLE -#define SMARTCARD_ONEBIT_SAMPLING_ENABLED SMARTCARD_ONE_BIT_SAMPLE_ENABLE -#define SMARTCARD_ONEBIT_SAMPLING_DISABLE SMARTCARD_ONE_BIT_SAMPLE_DISABLE -#define SMARTCARD_ONEBIT_SAMPLING_ENABLE SMARTCARD_ONE_BIT_SAMPLE_ENABLE - -#define SMARTCARD_TIMEOUT_DISABLED SMARTCARD_TIMEOUT_DISABLE -#define SMARTCARD_TIMEOUT_ENABLED SMARTCARD_TIMEOUT_ENABLE - -#define SMARTCARD_LASTBIT_DISABLED SMARTCARD_LASTBIT_DISABLE -#define SMARTCARD_LASTBIT_ENABLED SMARTCARD_LASTBIT_ENABLE -/** - * @} - */ - - -/** @defgroup HAL_SMBUS_Aliased_Defines HAL SMBUS Aliased Defines maintained for legacy purpose - * @{ - */ -#define SMBUS_DUALADDRESS_DISABLED SMBUS_DUALADDRESS_DISABLE -#define SMBUS_DUALADDRESS_ENABLED SMBUS_DUALADDRESS_ENABLE -#define SMBUS_GENERALCALL_DISABLED SMBUS_GENERALCALL_DISABLE -#define SMBUS_GENERALCALL_ENABLED SMBUS_GENERALCALL_ENABLE -#define SMBUS_NOSTRETCH_DISABLED SMBUS_NOSTRETCH_DISABLE -#define SMBUS_NOSTRETCH_ENABLED SMBUS_NOSTRETCH_ENABLE -#define SMBUS_ANALOGFILTER_ENABLED SMBUS_ANALOGFILTER_ENABLE -#define SMBUS_ANALOGFILTER_DISABLED SMBUS_ANALOGFILTER_DISABLE -#define SMBUS_PEC_DISABLED SMBUS_PEC_DISABLE -#define SMBUS_PEC_ENABLED SMBUS_PEC_ENABLE -#define HAL_SMBUS_STATE_SLAVE_LISTEN HAL_SMBUS_STATE_LISTEN -/** - * @} - */ - -/** @defgroup HAL_SPI_Aliased_Defines HAL SPI Aliased Defines maintained for legacy purpose - * @{ - */ -#define SPI_TIMODE_DISABLED SPI_TIMODE_DISABLE -#define SPI_TIMODE_ENABLED SPI_TIMODE_ENABLE - -#define SPI_CRCCALCULATION_DISABLED SPI_CRCCALCULATION_DISABLE -#define SPI_CRCCALCULATION_ENABLED SPI_CRCCALCULATION_ENABLE - -#define SPI_NSS_PULSE_DISABLED SPI_NSS_PULSE_DISABLE -#define SPI_NSS_PULSE_ENABLED SPI_NSS_PULSE_ENABLE - -#if defined(STM32H7) - -#define SPI_FLAG_TXE SPI_FLAG_TXP -#define SPI_FLAG_RXNE SPI_FLAG_RXP - -#define SPI_IT_TXE SPI_IT_TXP -#define SPI_IT_RXNE SPI_IT_RXP - -#define SPI_FRLVL_EMPTY SPI_RX_FIFO_0PACKET -#define SPI_FRLVL_QUARTER_FULL SPI_RX_FIFO_1PACKET -#define SPI_FRLVL_HALF_FULL SPI_RX_FIFO_2PACKET -#define SPI_FRLVL_FULL SPI_RX_FIFO_3PACKET - -#endif /* STM32H7 */ - -/** - * @} - */ - -/** @defgroup HAL_TIM_Aliased_Defines HAL TIM Aliased Defines maintained for legacy purpose - * @{ - */ -#define CCER_CCxE_MASK TIM_CCER_CCxE_MASK -#define CCER_CCxNE_MASK TIM_CCER_CCxNE_MASK - -#define TIM_DMABase_CR1 TIM_DMABASE_CR1 -#define TIM_DMABase_CR2 TIM_DMABASE_CR2 -#define TIM_DMABase_SMCR TIM_DMABASE_SMCR -#define TIM_DMABase_DIER TIM_DMABASE_DIER -#define TIM_DMABase_SR TIM_DMABASE_SR -#define TIM_DMABase_EGR TIM_DMABASE_EGR -#define TIM_DMABase_CCMR1 TIM_DMABASE_CCMR1 -#define TIM_DMABase_CCMR2 TIM_DMABASE_CCMR2 -#define TIM_DMABase_CCER TIM_DMABASE_CCER -#define TIM_DMABase_CNT TIM_DMABASE_CNT -#define TIM_DMABase_PSC TIM_DMABASE_PSC -#define TIM_DMABase_ARR TIM_DMABASE_ARR -#define TIM_DMABase_RCR TIM_DMABASE_RCR -#define TIM_DMABase_CCR1 TIM_DMABASE_CCR1 -#define TIM_DMABase_CCR2 TIM_DMABASE_CCR2 -#define TIM_DMABase_CCR3 TIM_DMABASE_CCR3 -#define TIM_DMABase_CCR4 TIM_DMABASE_CCR4 -#define TIM_DMABase_BDTR TIM_DMABASE_BDTR -#define TIM_DMABase_DCR TIM_DMABASE_DCR -#define TIM_DMABase_DMAR TIM_DMABASE_DMAR -#define TIM_DMABase_OR1 TIM_DMABASE_OR1 -#define TIM_DMABase_CCMR3 TIM_DMABASE_CCMR3 -#define TIM_DMABase_CCR5 TIM_DMABASE_CCR5 -#define TIM_DMABase_CCR6 TIM_DMABASE_CCR6 -#define TIM_DMABase_OR2 TIM_DMABASE_OR2 -#define TIM_DMABase_OR3 TIM_DMABASE_OR3 -#define TIM_DMABase_OR TIM_DMABASE_OR - -#define TIM_EventSource_Update TIM_EVENTSOURCE_UPDATE -#define TIM_EventSource_CC1 TIM_EVENTSOURCE_CC1 -#define TIM_EventSource_CC2 TIM_EVENTSOURCE_CC2 -#define TIM_EventSource_CC3 TIM_EVENTSOURCE_CC3 -#define TIM_EventSource_CC4 TIM_EVENTSOURCE_CC4 -#define TIM_EventSource_COM TIM_EVENTSOURCE_COM -#define TIM_EventSource_Trigger TIM_EVENTSOURCE_TRIGGER -#define TIM_EventSource_Break TIM_EVENTSOURCE_BREAK -#define TIM_EventSource_Break2 TIM_EVENTSOURCE_BREAK2 - -#define TIM_DMABurstLength_1Transfer TIM_DMABURSTLENGTH_1TRANSFER -#define TIM_DMABurstLength_2Transfers TIM_DMABURSTLENGTH_2TRANSFERS -#define TIM_DMABurstLength_3Transfers TIM_DMABURSTLENGTH_3TRANSFERS -#define TIM_DMABurstLength_4Transfers TIM_DMABURSTLENGTH_4TRANSFERS -#define TIM_DMABurstLength_5Transfers TIM_DMABURSTLENGTH_5TRANSFERS -#define TIM_DMABurstLength_6Transfers TIM_DMABURSTLENGTH_6TRANSFERS -#define TIM_DMABurstLength_7Transfers TIM_DMABURSTLENGTH_7TRANSFERS -#define TIM_DMABurstLength_8Transfers TIM_DMABURSTLENGTH_8TRANSFERS -#define TIM_DMABurstLength_9Transfers TIM_DMABURSTLENGTH_9TRANSFERS -#define TIM_DMABurstLength_10Transfers TIM_DMABURSTLENGTH_10TRANSFERS -#define TIM_DMABurstLength_11Transfers TIM_DMABURSTLENGTH_11TRANSFERS -#define TIM_DMABurstLength_12Transfers TIM_DMABURSTLENGTH_12TRANSFERS -#define TIM_DMABurstLength_13Transfers TIM_DMABURSTLENGTH_13TRANSFERS -#define TIM_DMABurstLength_14Transfers TIM_DMABURSTLENGTH_14TRANSFERS -#define TIM_DMABurstLength_15Transfers TIM_DMABURSTLENGTH_15TRANSFERS -#define TIM_DMABurstLength_16Transfers TIM_DMABURSTLENGTH_16TRANSFERS -#define TIM_DMABurstLength_17Transfers TIM_DMABURSTLENGTH_17TRANSFERS -#define TIM_DMABurstLength_18Transfers TIM_DMABURSTLENGTH_18TRANSFERS - -#if defined(STM32L0) -#define TIM22_TI1_GPIO1 TIM22_TI1_GPIO -#define TIM22_TI1_GPIO2 TIM22_TI1_GPIO -#endif - -#if defined(STM32F3) -#define IS_TIM_HALL_INTERFACE_INSTANCE IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE -#endif - -#if defined(STM32H7) -#define TIM_TIM1_ETR_COMP1_OUT TIM_TIM1_ETR_COMP1 -#define TIM_TIM1_ETR_COMP2_OUT TIM_TIM1_ETR_COMP2 -#define TIM_TIM8_ETR_COMP1_OUT TIM_TIM8_ETR_COMP1 -#define TIM_TIM8_ETR_COMP2_OUT TIM_TIM8_ETR_COMP2 -#define TIM_TIM2_ETR_COMP1_OUT TIM_TIM2_ETR_COMP1 -#define TIM_TIM2_ETR_COMP2_OUT TIM_TIM2_ETR_COMP2 -#define TIM_TIM3_ETR_COMP1_OUT TIM_TIM3_ETR_COMP1 -#define TIM_TIM1_TI1_COMP1_OUT TIM_TIM1_TI1_COMP1 -#define TIM_TIM8_TI1_COMP2_OUT TIM_TIM8_TI1_COMP2 -#define TIM_TIM2_TI4_COMP1_OUT TIM_TIM2_TI4_COMP1 -#define TIM_TIM2_TI4_COMP2_OUT TIM_TIM2_TI4_COMP2 -#define TIM_TIM2_TI4_COMP1COMP2_OUT TIM_TIM2_TI4_COMP1_COMP2 -#define TIM_TIM3_TI1_COMP1_OUT TIM_TIM3_TI1_COMP1 -#define TIM_TIM3_TI1_COMP2_OUT TIM_TIM3_TI1_COMP2 -#define TIM_TIM3_TI1_COMP1COMP2_OUT TIM_TIM3_TI1_COMP1_COMP2 -#endif - -#if defined(STM32U5) || defined(STM32MP2) -#define OCREF_CLEAR_SELECT_Pos OCREF_CLEAR_SELECT_POS -#define OCREF_CLEAR_SELECT_Msk OCREF_CLEAR_SELECT_MSK -#endif -/** - * @} - */ - -/** @defgroup HAL_TSC_Aliased_Defines HAL TSC Aliased Defines maintained for legacy purpose - * @{ - */ -#define TSC_SYNC_POL_FALL TSC_SYNC_POLARITY_FALLING -#define TSC_SYNC_POL_RISE_HIGH TSC_SYNC_POLARITY_RISING -/** - * @} - */ - -/** @defgroup HAL_UART_Aliased_Defines HAL UART Aliased Defines maintained for legacy purpose - * @{ - */ -#define UART_ONEBIT_SAMPLING_DISABLED UART_ONE_BIT_SAMPLE_DISABLE -#define UART_ONEBIT_SAMPLING_ENABLED UART_ONE_BIT_SAMPLE_ENABLE -#define UART_ONE_BIT_SAMPLE_DISABLED UART_ONE_BIT_SAMPLE_DISABLE -#define UART_ONE_BIT_SAMPLE_ENABLED UART_ONE_BIT_SAMPLE_ENABLE - -#define __HAL_UART_ONEBIT_ENABLE __HAL_UART_ONE_BIT_SAMPLE_ENABLE -#define __HAL_UART_ONEBIT_DISABLE __HAL_UART_ONE_BIT_SAMPLE_DISABLE - -#define __DIV_SAMPLING16 UART_DIV_SAMPLING16 -#define __DIVMANT_SAMPLING16 UART_DIVMANT_SAMPLING16 -#define __DIVFRAQ_SAMPLING16 UART_DIVFRAQ_SAMPLING16 -#define __UART_BRR_SAMPLING16 UART_BRR_SAMPLING16 - -#define __DIV_SAMPLING8 UART_DIV_SAMPLING8 -#define __DIVMANT_SAMPLING8 UART_DIVMANT_SAMPLING8 -#define __DIVFRAQ_SAMPLING8 UART_DIVFRAQ_SAMPLING8 -#define __UART_BRR_SAMPLING8 UART_BRR_SAMPLING8 - -#define __DIV_LPUART UART_DIV_LPUART - -#define UART_WAKEUPMETHODE_IDLELINE UART_WAKEUPMETHOD_IDLELINE -#define UART_WAKEUPMETHODE_ADDRESSMARK UART_WAKEUPMETHOD_ADDRESSMARK - -/** - * @} - */ - - -/** @defgroup HAL_USART_Aliased_Defines HAL USART Aliased Defines maintained for legacy purpose - * @{ - */ - -#define USART_CLOCK_DISABLED USART_CLOCK_DISABLE -#define USART_CLOCK_ENABLED USART_CLOCK_ENABLE - -#define USARTNACK_ENABLED USART_NACK_ENABLE -#define USARTNACK_DISABLED USART_NACK_DISABLE -/** - * @} - */ - -/** @defgroup HAL_WWDG_Aliased_Defines HAL WWDG Aliased Defines maintained for legacy purpose - * @{ - */ -#define CFR_BASE WWDG_CFR_BASE - -/** - * @} - */ - -/** @defgroup HAL_CAN_Aliased_Defines HAL CAN Aliased Defines maintained for legacy purpose - * @{ - */ -#define CAN_FilterFIFO0 CAN_FILTER_FIFO0 -#define CAN_FilterFIFO1 CAN_FILTER_FIFO1 -#define CAN_IT_RQCP0 CAN_IT_TME -#define CAN_IT_RQCP1 CAN_IT_TME -#define CAN_IT_RQCP2 CAN_IT_TME -#define INAK_TIMEOUT CAN_TIMEOUT_VALUE -#define SLAK_TIMEOUT CAN_TIMEOUT_VALUE -#define CAN_TXSTATUS_FAILED ((uint8_t)0x00U) -#define CAN_TXSTATUS_OK ((uint8_t)0x01U) -#define CAN_TXSTATUS_PENDING ((uint8_t)0x02U) - -/** - * @} - */ - -/** @defgroup HAL_ETH_Aliased_Defines HAL ETH Aliased Defines maintained for legacy purpose - * @{ - */ - -#define VLAN_TAG ETH_VLAN_TAG -#define MIN_ETH_PAYLOAD ETH_MIN_ETH_PAYLOAD -#define MAX_ETH_PAYLOAD ETH_MAX_ETH_PAYLOAD -#define JUMBO_FRAME_PAYLOAD ETH_JUMBO_FRAME_PAYLOAD -#define MACMIIAR_CR_MASK ETH_MACMIIAR_CR_MASK -#define MACCR_CLEAR_MASK ETH_MACCR_CLEAR_MASK -#define MACFCR_CLEAR_MASK ETH_MACFCR_CLEAR_MASK -#define DMAOMR_CLEAR_MASK ETH_DMAOMR_CLEAR_MASK - -#define ETH_MMCCR 0x00000100U -#define ETH_MMCRIR 0x00000104U -#define ETH_MMCTIR 0x00000108U -#define ETH_MMCRIMR 0x0000010CU -#define ETH_MMCTIMR 0x00000110U -#define ETH_MMCTGFSCCR 0x0000014CU -#define ETH_MMCTGFMSCCR 0x00000150U -#define ETH_MMCTGFCR 0x00000168U -#define ETH_MMCRFCECR 0x00000194U -#define ETH_MMCRFAECR 0x00000198U -#define ETH_MMCRGUFCR 0x000001C4U - -#define ETH_MAC_TXFIFO_FULL 0x02000000U /* Tx FIFO full */ -#define ETH_MAC_TXFIFONOT_EMPTY 0x01000000U /* Tx FIFO not empty */ -#define ETH_MAC_TXFIFO_WRITE_ACTIVE 0x00400000U /* Tx FIFO write active */ -#define ETH_MAC_TXFIFO_IDLE 0x00000000U /* Tx FIFO read status: Idle */ -#define ETH_MAC_TXFIFO_READ 0x00100000U /* Tx FIFO read status: Read (transferring data to - the MAC transmitter) */ -#define ETH_MAC_TXFIFO_WAITING 0x00200000U /* Tx FIFO read status: Waiting for TxStatus from - MAC transmitter */ -#define ETH_MAC_TXFIFO_WRITING 0x00300000U /* Tx FIFO read status: Writing the received TxStatus - or flushing the TxFIFO */ -#define ETH_MAC_TRANSMISSION_PAUSE 0x00080000U /* MAC transmitter in pause */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_IDLE 0x00000000U /* MAC transmit frame controller: Idle */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_WAITING 0x00020000U /* MAC transmit frame controller: Waiting for Status - of previous frame or IFG/backoff period to be over */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_GENRATING_PCF 0x00040000U /* MAC transmit frame controller: Generating and - transmitting a Pause control frame (in full duplex mode) */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_TRANSFERRING 0x00060000U /* MAC transmit frame controller: Transferring input - frame for transmission */ -#define ETH_MAC_MII_TRANSMIT_ACTIVE 0x00010000U /* MAC MII transmit engine active */ -#define ETH_MAC_RXFIFO_EMPTY 0x00000000U /* Rx FIFO fill level: empty */ -#define ETH_MAC_RXFIFO_BELOW_THRESHOLD 0x00000100U /* Rx FIFO fill level: fill-level below flow-control - de-activate threshold */ -#define ETH_MAC_RXFIFO_ABOVE_THRESHOLD 0x00000200U /* Rx FIFO fill level: fill-level above flow-control - activate threshold */ -#define ETH_MAC_RXFIFO_FULL 0x00000300U /* Rx FIFO fill level: full */ -#if defined(STM32F1) -#else -#define ETH_MAC_READCONTROLLER_IDLE 0x00000000U /* Rx FIFO read controller IDLE state */ -#define ETH_MAC_READCONTROLLER_READING_DATA 0x00000020U /* Rx FIFO read controller Reading frame data */ -#define ETH_MAC_READCONTROLLER_READING_STATUS 0x00000040U /* Rx FIFO read controller Reading frame status - (or time-stamp) */ -#endif -#define ETH_MAC_READCONTROLLER_FLUSHING 0x00000060U /* Rx FIFO read controller Flushing the frame data and - status */ -#define ETH_MAC_RXFIFO_WRITE_ACTIVE 0x00000010U /* Rx FIFO write controller active */ -#define ETH_MAC_SMALL_FIFO_NOTACTIVE 0x00000000U /* MAC small FIFO read / write controllers not active */ -#define ETH_MAC_SMALL_FIFO_READ_ACTIVE 0x00000002U /* MAC small FIFO read controller active */ -#define ETH_MAC_SMALL_FIFO_WRITE_ACTIVE 0x00000004U /* MAC small FIFO write controller active */ -#define ETH_MAC_SMALL_FIFO_RW_ACTIVE 0x00000006U /* MAC small FIFO read / write controllers active */ -#define ETH_MAC_MII_RECEIVE_PROTOCOL_ACTIVE 0x00000001U /* MAC MII receive protocol engine active */ - -#define ETH_TxPacketConfig ETH_TxPacketConfigTypeDef /* Transmit Packet Configuration structure definition */ - -/** - * @} - */ - -/** @defgroup HAL_DCMI_Aliased_Defines HAL DCMI Aliased Defines maintained for legacy purpose - * @{ - */ -#define HAL_DCMI_ERROR_OVF HAL_DCMI_ERROR_OVR -#define DCMI_IT_OVF DCMI_IT_OVR -#define DCMI_FLAG_OVFRI DCMI_FLAG_OVRRI -#define DCMI_FLAG_OVFMI DCMI_FLAG_OVRMI - -#define HAL_DCMI_ConfigCROP HAL_DCMI_ConfigCrop -#define HAL_DCMI_EnableCROP HAL_DCMI_EnableCrop -#define HAL_DCMI_DisableCROP HAL_DCMI_DisableCrop - -/** - * @} - */ - -#if defined(STM32L4) || defined(STM32F7) || defined(STM32F427xx) || defined(STM32F437xx) \ - || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) \ - || defined(STM32H7) -/** @defgroup HAL_DMA2D_Aliased_Defines HAL DMA2D Aliased Defines maintained for legacy purpose - * @{ - */ -#define DMA2D_ARGB8888 DMA2D_OUTPUT_ARGB8888 -#define DMA2D_RGB888 DMA2D_OUTPUT_RGB888 -#define DMA2D_RGB565 DMA2D_OUTPUT_RGB565 -#define DMA2D_ARGB1555 DMA2D_OUTPUT_ARGB1555 -#define DMA2D_ARGB4444 DMA2D_OUTPUT_ARGB4444 - -#define CM_ARGB8888 DMA2D_INPUT_ARGB8888 -#define CM_RGB888 DMA2D_INPUT_RGB888 -#define CM_RGB565 DMA2D_INPUT_RGB565 -#define CM_ARGB1555 DMA2D_INPUT_ARGB1555 -#define CM_ARGB4444 DMA2D_INPUT_ARGB4444 -#define CM_L8 DMA2D_INPUT_L8 -#define CM_AL44 DMA2D_INPUT_AL44 -#define CM_AL88 DMA2D_INPUT_AL88 -#define CM_L4 DMA2D_INPUT_L4 -#define CM_A8 DMA2D_INPUT_A8 -#define CM_A4 DMA2D_INPUT_A4 -/** - * @} - */ -#endif /* STM32L4 || STM32F7 || STM32F4 || STM32H7 */ - -#if defined(STM32L4) || defined(STM32F7) || defined(STM32F427xx) || defined(STM32F437xx) \ - || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) \ - || defined(STM32H7) || defined(STM32U5) -/** @defgroup DMA2D_Aliases DMA2D API Aliases - * @{ - */ -#define HAL_DMA2D_DisableCLUT HAL_DMA2D_CLUTLoading_Abort /*!< Aliased to HAL_DMA2D_CLUTLoading_Abort - for compatibility with legacy code */ -/** - * @} - */ - -#endif /* STM32L4 || STM32F7 || STM32F4 || STM32H7 || STM32U5 */ - -/** @defgroup HAL_PPP_Aliased_Defines HAL PPP Aliased Defines maintained for legacy purpose - * @{ - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup HAL_CRYP_Aliased_Functions HAL CRYP Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_CRYP_ComputationCpltCallback HAL_CRYPEx_ComputationCpltCallback -/** - * @} - */ - -/** @defgroup HAL_DCACHE_Aliased_Functions HAL DCACHE Aliased Functions maintained for legacy purpose - * @{ - */ - -#if defined(STM32U5) -#define HAL_DCACHE_CleanInvalidateByAddr HAL_DCACHE_CleanInvalidByAddr -#define HAL_DCACHE_CleanInvalidateByAddr_IT HAL_DCACHE_CleanInvalidByAddr_IT -#endif /* STM32U5 */ - -/** - * @} - */ - -#if !defined(STM32F2) -/** @defgroup HASH_alias HASH API alias - * @{ - */ -#define HAL_HASHEx_IRQHandler HAL_HASH_IRQHandler /*!< Redirection for compatibility with legacy code */ -/** - * - * @} - */ -#endif /* STM32F2 */ -/** @defgroup HAL_HASH_Aliased_Functions HAL HASH Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_HASH_STATETypeDef HAL_HASH_StateTypeDef -#define HAL_HASHPhaseTypeDef HAL_HASH_PhaseTypeDef -#define HAL_HMAC_MD5_Finish HAL_HASH_MD5_Finish -#define HAL_HMAC_SHA1_Finish HAL_HASH_SHA1_Finish -#define HAL_HMAC_SHA224_Finish HAL_HASH_SHA224_Finish -#define HAL_HMAC_SHA256_Finish HAL_HASH_SHA256_Finish - -/*HASH Algorithm Selection*/ - -#define HASH_AlgoSelection_SHA1 HASH_ALGOSELECTION_SHA1 -#define HASH_AlgoSelection_SHA224 HASH_ALGOSELECTION_SHA224 -#define HASH_AlgoSelection_SHA256 HASH_ALGOSELECTION_SHA256 -#define HASH_AlgoSelection_MD5 HASH_ALGOSELECTION_MD5 - -#define HASH_AlgoMode_HASH HASH_ALGOMODE_HASH -#define HASH_AlgoMode_HMAC HASH_ALGOMODE_HMAC - -#define HASH_HMACKeyType_ShortKey HASH_HMAC_KEYTYPE_SHORTKEY -#define HASH_HMACKeyType_LongKey HASH_HMAC_KEYTYPE_LONGKEY - -#if defined(STM32L4) || defined(STM32L5) || defined(STM32F2) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) - -#define HAL_HASH_MD5_Accumulate HAL_HASH_MD5_Accmlt -#define HAL_HASH_MD5_Accumulate_End HAL_HASH_MD5_Accmlt_End -#define HAL_HASH_MD5_Accumulate_IT HAL_HASH_MD5_Accmlt_IT -#define HAL_HASH_MD5_Accumulate_End_IT HAL_HASH_MD5_Accmlt_End_IT - -#define HAL_HASH_SHA1_Accumulate HAL_HASH_SHA1_Accmlt -#define HAL_HASH_SHA1_Accumulate_End HAL_HASH_SHA1_Accmlt_End -#define HAL_HASH_SHA1_Accumulate_IT HAL_HASH_SHA1_Accmlt_IT -#define HAL_HASH_SHA1_Accumulate_End_IT HAL_HASH_SHA1_Accmlt_End_IT - -#define HAL_HASHEx_SHA224_Accumulate HAL_HASHEx_SHA224_Accmlt -#define HAL_HASHEx_SHA224_Accumulate_End HAL_HASHEx_SHA224_Accmlt_End -#define HAL_HASHEx_SHA224_Accumulate_IT HAL_HASHEx_SHA224_Accmlt_IT -#define HAL_HASHEx_SHA224_Accumulate_End_IT HAL_HASHEx_SHA224_Accmlt_End_IT - -#define HAL_HASHEx_SHA256_Accumulate HAL_HASHEx_SHA256_Accmlt -#define HAL_HASHEx_SHA256_Accumulate_End HAL_HASHEx_SHA256_Accmlt_End -#define HAL_HASHEx_SHA256_Accumulate_IT HAL_HASHEx_SHA256_Accmlt_IT -#define HAL_HASHEx_SHA256_Accumulate_End_IT HAL_HASHEx_SHA256_Accmlt_End_IT - -#endif /* STM32L4 || STM32L5 || STM32F2 || STM32F4 || STM32F7 || STM32H7 */ -/** - * @} - */ - -/** @defgroup HAL_Aliased_Functions HAL Generic Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_EnableDBGSleepMode HAL_DBGMCU_EnableDBGSleepMode -#define HAL_DisableDBGSleepMode HAL_DBGMCU_DisableDBGSleepMode -#define HAL_EnableDBGStopMode HAL_DBGMCU_EnableDBGStopMode -#define HAL_DisableDBGStopMode HAL_DBGMCU_DisableDBGStopMode -#define HAL_EnableDBGStandbyMode HAL_DBGMCU_EnableDBGStandbyMode -#define HAL_DisableDBGStandbyMode HAL_DBGMCU_DisableDBGStandbyMode -#define HAL_DBG_LowPowerConfig(Periph, cmd) (((cmd\ - )==ENABLE)? HAL_DBGMCU_DBG_EnableLowPowerConfig(Periph) : \ - HAL_DBGMCU_DBG_DisableLowPowerConfig(Periph)) -#define HAL_VREFINT_OutputSelect HAL_SYSCFG_VREFINT_OutputSelect -#define HAL_Lock_Cmd(cmd) (((cmd)==ENABLE) ? HAL_SYSCFG_Enable_Lock_VREFINT() : HAL_SYSCFG_Disable_Lock_VREFINT()) -#if defined(STM32L0) -#else -#define HAL_VREFINT_Cmd(cmd) (((cmd)==ENABLE)? HAL_SYSCFG_EnableVREFINT() : HAL_SYSCFG_DisableVREFINT()) -#endif -#define HAL_ADC_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINT() : HAL_ADCEx_DisableVREFINT()) -#define HAL_ADC_EnableBufferSensor_Cmd(cmd) (((cmd\ - )==ENABLE) ? HAL_ADCEx_EnableVREFINTTempSensor() : \ - HAL_ADCEx_DisableVREFINTTempSensor()) -#if defined(STM32H7A3xx) || defined(STM32H7B3xx) || defined(STM32H7B0xx) || defined(STM32H7A3xxQ) || \ - defined(STM32H7B3xxQ) || defined(STM32H7B0xxQ) -#define HAL_EnableSRDomainDBGStopMode HAL_EnableDomain3DBGStopMode -#define HAL_DisableSRDomainDBGStopMode HAL_DisableDomain3DBGStopMode -#define HAL_EnableSRDomainDBGStandbyMode HAL_EnableDomain3DBGStandbyMode -#define HAL_DisableSRDomainDBGStandbyMode HAL_DisableDomain3DBGStandbyMode -#endif /* STM32H7A3xx || STM32H7B3xx || STM32H7B0xx || STM32H7A3xxQ || STM32H7B3xxQ || STM32H7B0xxQ */ - -/** - * @} - */ - -/** @defgroup HAL_FLASH_Aliased_Functions HAL FLASH Aliased Functions maintained for legacy purpose - * @{ - */ -#define FLASH_HalfPageProgram HAL_FLASHEx_HalfPageProgram -#define FLASH_EnableRunPowerDown HAL_FLASHEx_EnableRunPowerDown -#define FLASH_DisableRunPowerDown HAL_FLASHEx_DisableRunPowerDown -#define HAL_DATA_EEPROMEx_Unlock HAL_FLASHEx_DATAEEPROM_Unlock -#define HAL_DATA_EEPROMEx_Lock HAL_FLASHEx_DATAEEPROM_Lock -#define HAL_DATA_EEPROMEx_Erase HAL_FLASHEx_DATAEEPROM_Erase -#define HAL_DATA_EEPROMEx_Program HAL_FLASHEx_DATAEEPROM_Program - -/** - * @} - */ - -/** @defgroup HAL_I2C_Aliased_Functions HAL I2C Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_I2CEx_AnalogFilter_Config HAL_I2CEx_ConfigAnalogFilter -#define HAL_I2CEx_DigitalFilter_Config HAL_I2CEx_ConfigDigitalFilter -#define HAL_FMPI2CEx_AnalogFilter_Config HAL_FMPI2CEx_ConfigAnalogFilter -#define HAL_FMPI2CEx_DigitalFilter_Config HAL_FMPI2CEx_ConfigDigitalFilter - -#define HAL_I2CFastModePlusConfig(SYSCFG_I2CFastModePlus, cmd) (((cmd) == ENABLE)? \ - HAL_I2CEx_EnableFastModePlus(SYSCFG_I2CFastModePlus): \ - HAL_I2CEx_DisableFastModePlus(SYSCFG_I2CFastModePlus)) - -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || \ - defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || \ - defined(STM32L4) || defined(STM32L5) || defined(STM32G4) || defined(STM32L1) -#define HAL_I2C_Master_Sequential_Transmit_IT HAL_I2C_Master_Seq_Transmit_IT -#define HAL_I2C_Master_Sequential_Receive_IT HAL_I2C_Master_Seq_Receive_IT -#define HAL_I2C_Slave_Sequential_Transmit_IT HAL_I2C_Slave_Seq_Transmit_IT -#define HAL_I2C_Slave_Sequential_Receive_IT HAL_I2C_Slave_Seq_Receive_IT -#endif /* STM32H7 || STM32WB || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 || - STM32L4 || STM32L5 || STM32G4 || STM32L1 */ -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || \ - defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4)|| defined(STM32L1) -#define HAL_I2C_Master_Sequential_Transmit_DMA HAL_I2C_Master_Seq_Transmit_DMA -#define HAL_I2C_Master_Sequential_Receive_DMA HAL_I2C_Master_Seq_Receive_DMA -#define HAL_I2C_Slave_Sequential_Transmit_DMA HAL_I2C_Slave_Seq_Transmit_DMA -#define HAL_I2C_Slave_Sequential_Receive_DMA HAL_I2C_Slave_Seq_Receive_DMA -#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 || STM32L1 */ - -#if defined(STM32F4) -#define HAL_FMPI2C_Master_Sequential_Transmit_IT HAL_FMPI2C_Master_Seq_Transmit_IT -#define HAL_FMPI2C_Master_Sequential_Receive_IT HAL_FMPI2C_Master_Seq_Receive_IT -#define HAL_FMPI2C_Slave_Sequential_Transmit_IT HAL_FMPI2C_Slave_Seq_Transmit_IT -#define HAL_FMPI2C_Slave_Sequential_Receive_IT HAL_FMPI2C_Slave_Seq_Receive_IT -#define HAL_FMPI2C_Master_Sequential_Transmit_DMA HAL_FMPI2C_Master_Seq_Transmit_DMA -#define HAL_FMPI2C_Master_Sequential_Receive_DMA HAL_FMPI2C_Master_Seq_Receive_DMA -#define HAL_FMPI2C_Slave_Sequential_Transmit_DMA HAL_FMPI2C_Slave_Seq_Transmit_DMA -#define HAL_FMPI2C_Slave_Sequential_Receive_DMA HAL_FMPI2C_Slave_Seq_Receive_DMA -#endif /* STM32F4 */ -/** - * @} - */ - -/** @defgroup HAL_PWR_Aliased HAL PWR Aliased maintained for legacy purpose - * @{ - */ - -#if defined(STM32G0) -#define HAL_PWR_ConfigPVD HAL_PWREx_ConfigPVD -#define HAL_PWR_EnablePVD HAL_PWREx_EnablePVD -#define HAL_PWR_DisablePVD HAL_PWREx_DisablePVD -#define HAL_PWR_PVD_IRQHandler HAL_PWREx_PVD_IRQHandler -#endif -#define HAL_PWR_PVDConfig HAL_PWR_ConfigPVD -#define HAL_PWR_DisableBkUpReg HAL_PWREx_DisableBkUpReg -#define HAL_PWR_DisableFlashPowerDown HAL_PWREx_DisableFlashPowerDown -#define HAL_PWR_DisableVddio2Monitor HAL_PWREx_DisableVddio2Monitor -#define HAL_PWR_EnableBkUpReg HAL_PWREx_EnableBkUpReg -#define HAL_PWR_EnableFlashPowerDown HAL_PWREx_EnableFlashPowerDown -#define HAL_PWR_EnableVddio2Monitor HAL_PWREx_EnableVddio2Monitor -#define HAL_PWR_PVD_PVM_IRQHandler HAL_PWREx_PVD_PVM_IRQHandler -#define HAL_PWR_PVDLevelConfig HAL_PWR_ConfigPVD -#define HAL_PWR_Vddio2Monitor_IRQHandler HAL_PWREx_Vddio2Monitor_IRQHandler -#define HAL_PWR_Vddio2MonitorCallback HAL_PWREx_Vddio2MonitorCallback -#define HAL_PWREx_ActivateOverDrive HAL_PWREx_EnableOverDrive -#define HAL_PWREx_DeactivateOverDrive HAL_PWREx_DisableOverDrive -#define HAL_PWREx_DisableSDADCAnalog HAL_PWREx_DisableSDADC -#define HAL_PWREx_EnableSDADCAnalog HAL_PWREx_EnableSDADC -#define HAL_PWREx_PVMConfig HAL_PWREx_ConfigPVM - -#define PWR_MODE_NORMAL PWR_PVD_MODE_NORMAL -#define PWR_MODE_IT_RISING PWR_PVD_MODE_IT_RISING -#define PWR_MODE_IT_FALLING PWR_PVD_MODE_IT_FALLING -#define PWR_MODE_IT_RISING_FALLING PWR_PVD_MODE_IT_RISING_FALLING -#define PWR_MODE_EVENT_RISING PWR_PVD_MODE_EVENT_RISING -#define PWR_MODE_EVENT_FALLING PWR_PVD_MODE_EVENT_FALLING -#define PWR_MODE_EVENT_RISING_FALLING PWR_PVD_MODE_EVENT_RISING_FALLING - -#define CR_OFFSET_BB PWR_CR_OFFSET_BB -#define CSR_OFFSET_BB PWR_CSR_OFFSET_BB -#define PMODE_BIT_NUMBER VOS_BIT_NUMBER -#define CR_PMODE_BB CR_VOS_BB - -#define DBP_BitNumber DBP_BIT_NUMBER -#define PVDE_BitNumber PVDE_BIT_NUMBER -#define PMODE_BitNumber PMODE_BIT_NUMBER -#define EWUP_BitNumber EWUP_BIT_NUMBER -#define FPDS_BitNumber FPDS_BIT_NUMBER -#define ODEN_BitNumber ODEN_BIT_NUMBER -#define ODSWEN_BitNumber ODSWEN_BIT_NUMBER -#define MRLVDS_BitNumber MRLVDS_BIT_NUMBER -#define LPLVDS_BitNumber LPLVDS_BIT_NUMBER -#define BRE_BitNumber BRE_BIT_NUMBER - -#define PWR_MODE_EVT PWR_PVD_MODE_NORMAL - -#if defined (STM32U5) -#define PWR_SRAM1_PAGE1_STOP_RETENTION PWR_SRAM1_PAGE1_STOP -#define PWR_SRAM1_PAGE2_STOP_RETENTION PWR_SRAM1_PAGE2_STOP -#define PWR_SRAM1_PAGE3_STOP_RETENTION PWR_SRAM1_PAGE3_STOP -#define PWR_SRAM1_PAGE4_STOP_RETENTION PWR_SRAM1_PAGE4_STOP -#define PWR_SRAM1_PAGE5_STOP_RETENTION PWR_SRAM1_PAGE5_STOP -#define PWR_SRAM1_PAGE6_STOP_RETENTION PWR_SRAM1_PAGE6_STOP -#define PWR_SRAM1_PAGE7_STOP_RETENTION PWR_SRAM1_PAGE7_STOP -#define PWR_SRAM1_PAGE8_STOP_RETENTION PWR_SRAM1_PAGE8_STOP -#define PWR_SRAM1_PAGE9_STOP_RETENTION PWR_SRAM1_PAGE9_STOP -#define PWR_SRAM1_PAGE10_STOP_RETENTION PWR_SRAM1_PAGE10_STOP -#define PWR_SRAM1_PAGE11_STOP_RETENTION PWR_SRAM1_PAGE11_STOP -#define PWR_SRAM1_PAGE12_STOP_RETENTION PWR_SRAM1_PAGE12_STOP -#define PWR_SRAM1_FULL_STOP_RETENTION PWR_SRAM1_FULL_STOP - -#define PWR_SRAM2_PAGE1_STOP_RETENTION PWR_SRAM2_PAGE1_STOP -#define PWR_SRAM2_PAGE2_STOP_RETENTION PWR_SRAM2_PAGE2_STOP -#define PWR_SRAM2_FULL_STOP_RETENTION PWR_SRAM2_FULL_STOP - -#define PWR_SRAM3_PAGE1_STOP_RETENTION PWR_SRAM3_PAGE1_STOP -#define PWR_SRAM3_PAGE2_STOP_RETENTION PWR_SRAM3_PAGE2_STOP -#define PWR_SRAM3_PAGE3_STOP_RETENTION PWR_SRAM3_PAGE3_STOP -#define PWR_SRAM3_PAGE4_STOP_RETENTION PWR_SRAM3_PAGE4_STOP -#define PWR_SRAM3_PAGE5_STOP_RETENTION PWR_SRAM3_PAGE5_STOP -#define PWR_SRAM3_PAGE6_STOP_RETENTION PWR_SRAM3_PAGE6_STOP -#define PWR_SRAM3_PAGE7_STOP_RETENTION PWR_SRAM3_PAGE7_STOP -#define PWR_SRAM3_PAGE8_STOP_RETENTION PWR_SRAM3_PAGE8_STOP -#define PWR_SRAM3_PAGE9_STOP_RETENTION PWR_SRAM3_PAGE9_STOP -#define PWR_SRAM3_PAGE10_STOP_RETENTION PWR_SRAM3_PAGE10_STOP -#define PWR_SRAM3_PAGE11_STOP_RETENTION PWR_SRAM3_PAGE11_STOP -#define PWR_SRAM3_PAGE12_STOP_RETENTION PWR_SRAM3_PAGE12_STOP -#define PWR_SRAM3_PAGE13_STOP_RETENTION PWR_SRAM3_PAGE13_STOP -#define PWR_SRAM3_FULL_STOP_RETENTION PWR_SRAM3_FULL_STOP - -#define PWR_SRAM4_FULL_STOP_RETENTION PWR_SRAM4_FULL_STOP - -#define PWR_SRAM5_PAGE1_STOP_RETENTION PWR_SRAM5_PAGE1_STOP -#define PWR_SRAM5_PAGE2_STOP_RETENTION PWR_SRAM5_PAGE2_STOP -#define PWR_SRAM5_PAGE3_STOP_RETENTION PWR_SRAM5_PAGE3_STOP -#define PWR_SRAM5_PAGE4_STOP_RETENTION PWR_SRAM5_PAGE4_STOP -#define PWR_SRAM5_PAGE5_STOP_RETENTION PWR_SRAM5_PAGE5_STOP -#define PWR_SRAM5_PAGE6_STOP_RETENTION PWR_SRAM5_PAGE6_STOP -#define PWR_SRAM5_PAGE7_STOP_RETENTION PWR_SRAM5_PAGE7_STOP -#define PWR_SRAM5_PAGE8_STOP_RETENTION PWR_SRAM5_PAGE8_STOP -#define PWR_SRAM5_PAGE9_STOP_RETENTION PWR_SRAM5_PAGE9_STOP -#define PWR_SRAM5_PAGE10_STOP_RETENTION PWR_SRAM5_PAGE10_STOP -#define PWR_SRAM5_PAGE11_STOP_RETENTION PWR_SRAM5_PAGE11_STOP -#define PWR_SRAM5_PAGE12_STOP_RETENTION PWR_SRAM5_PAGE12_STOP -#define PWR_SRAM5_PAGE13_STOP_RETENTION PWR_SRAM5_PAGE13_STOP -#define PWR_SRAM5_FULL_STOP_RETENTION PWR_SRAM5_FULL_STOP - -#define PWR_SRAM6_PAGE1_STOP_RETENTION PWR_SRAM6_PAGE1_STOP -#define PWR_SRAM6_PAGE2_STOP_RETENTION PWR_SRAM6_PAGE2_STOP -#define PWR_SRAM6_PAGE3_STOP_RETENTION PWR_SRAM6_PAGE3_STOP -#define PWR_SRAM6_PAGE4_STOP_RETENTION PWR_SRAM6_PAGE4_STOP -#define PWR_SRAM6_PAGE5_STOP_RETENTION PWR_SRAM6_PAGE5_STOP -#define PWR_SRAM6_PAGE6_STOP_RETENTION PWR_SRAM6_PAGE6_STOP -#define PWR_SRAM6_PAGE7_STOP_RETENTION PWR_SRAM6_PAGE7_STOP -#define PWR_SRAM6_PAGE8_STOP_RETENTION PWR_SRAM6_PAGE8_STOP -#define PWR_SRAM6_FULL_STOP_RETENTION PWR_SRAM6_FULL_STOP - - -#define PWR_ICACHE_FULL_STOP_RETENTION PWR_ICACHE_FULL_STOP -#define PWR_DCACHE1_FULL_STOP_RETENTION PWR_DCACHE1_FULL_STOP -#define PWR_DCACHE2_FULL_STOP_RETENTION PWR_DCACHE2_FULL_STOP -#define PWR_DMA2DRAM_FULL_STOP_RETENTION PWR_DMA2DRAM_FULL_STOP -#define PWR_PERIPHRAM_FULL_STOP_RETENTION PWR_PERIPHRAM_FULL_STOP -#define PWR_PKA32RAM_FULL_STOP_RETENTION PWR_PKA32RAM_FULL_STOP -#define PWR_GRAPHICPRAM_FULL_STOP_RETENTION PWR_GRAPHICPRAM_FULL_STOP -#define PWR_DSIRAM_FULL_STOP_RETENTION PWR_DSIRAM_FULL_STOP -#define PWR_JPEGRAM_FULL_STOP_RETENTION PWR_JPEGRAM_FULL_STOP - - -#define PWR_SRAM2_PAGE1_STANDBY_RETENTION PWR_SRAM2_PAGE1_STANDBY -#define PWR_SRAM2_PAGE2_STANDBY_RETENTION PWR_SRAM2_PAGE2_STANDBY -#define PWR_SRAM2_FULL_STANDBY_RETENTION PWR_SRAM2_FULL_STANDBY - -#define PWR_SRAM1_FULL_RUN_RETENTION PWR_SRAM1_FULL_RUN -#define PWR_SRAM2_FULL_RUN_RETENTION PWR_SRAM2_FULL_RUN -#define PWR_SRAM3_FULL_RUN_RETENTION PWR_SRAM3_FULL_RUN -#define PWR_SRAM4_FULL_RUN_RETENTION PWR_SRAM4_FULL_RUN -#define PWR_SRAM5_FULL_RUN_RETENTION PWR_SRAM5_FULL_RUN -#define PWR_SRAM6_FULL_RUN_RETENTION PWR_SRAM6_FULL_RUN - -#define PWR_ALL_RAM_RUN_RETENTION_MASK PWR_ALL_RAM_RUN_MASK -#endif - -/** - * @} - */ - -/** @defgroup HAL_RTC_Aliased_Functions HAL RTC Aliased Functions maintained for legacy purpose - * @{ - */ -#if defined(STM32H5) || defined(STM32WBA) || defined(STM32H7RS) || defined(STM32N6) -#define HAL_RTCEx_SetBoothardwareKey HAL_RTCEx_LockBootHardwareKey -#define HAL_RTCEx_BKUPBlock_Enable HAL_RTCEx_BKUPBlock -#define HAL_RTCEx_BKUPBlock_Disable HAL_RTCEx_BKUPUnblock -#define HAL_RTCEx_Erase_SecretDev_Conf HAL_RTCEx_ConfigEraseDeviceSecrets -#endif /* STM32H5 || STM32WBA || STM32H7RS || STM32N6 */ - -/** - * @} - */ - -/** @defgroup HAL_SMBUS_Aliased_Functions HAL SMBUS Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_SMBUS_Slave_Listen_IT HAL_SMBUS_EnableListen_IT -#define HAL_SMBUS_SlaveAddrCallback HAL_SMBUS_AddrCallback -#define HAL_SMBUS_SlaveListenCpltCallback HAL_SMBUS_ListenCpltCallback -/** - * @} - */ - -/** @defgroup HAL_SPI_Aliased_Functions HAL SPI Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_SPI_FlushRxFifo HAL_SPIEx_FlushRxFifo -/** - * @} - */ - -/** @defgroup HAL_TIM_Aliased_Functions HAL TIM Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_TIM_DMADelayPulseCplt TIM_DMADelayPulseCplt -#define HAL_TIM_DMAError TIM_DMAError -#define HAL_TIM_DMACaptureCplt TIM_DMACaptureCplt -#define HAL_TIMEx_DMACommutationCplt TIMEx_DMACommutationCplt -#if defined(STM32H7) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || \ - defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) -#define HAL_TIM_SlaveConfigSynchronization HAL_TIM_SlaveConfigSynchro -#define HAL_TIM_SlaveConfigSynchronization_IT HAL_TIM_SlaveConfigSynchro_IT -#define HAL_TIMEx_CommutationCallback HAL_TIMEx_CommutCallback -#define HAL_TIMEx_ConfigCommutationEvent HAL_TIMEx_ConfigCommutEvent -#define HAL_TIMEx_ConfigCommutationEvent_IT HAL_TIMEx_ConfigCommutEvent_IT -#define HAL_TIMEx_ConfigCommutationEvent_DMA HAL_TIMEx_ConfigCommutEvent_DMA -#endif /* STM32H7 || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 */ -/** - * @} - */ - -/** @defgroup HAL_UART_Aliased_Functions HAL UART Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_UART_WakeupCallback HAL_UARTEx_WakeupCallback -/** - * @} - */ - -/** @defgroup HAL_LTDC_Aliased_Functions HAL LTDC Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_LTDC_LineEvenCallback HAL_LTDC_LineEventCallback -#define HAL_LTDC_Relaod HAL_LTDC_Reload -#define HAL_LTDC_StructInitFromVideoConfig HAL_LTDCEx_StructInitFromVideoConfig -#define HAL_LTDC_StructInitFromAdaptedCommandConfig HAL_LTDCEx_StructInitFromAdaptedCommandConfig -/** - * @} - */ - - -/** @defgroup HAL_PPP_Aliased_Functions HAL PPP Aliased Functions maintained for legacy purpose - * @{ - */ - -/** - * @} - */ - -/* Exported macros ------------------------------------------------------------*/ - -/** @defgroup HAL_AES_Aliased_Macros HAL CRYP Aliased Macros maintained for legacy purpose - * @{ - */ -#define AES_IT_CC CRYP_IT_CC -#define AES_IT_ERR CRYP_IT_ERR -#define AES_FLAG_CCF CRYP_FLAG_CCF -/** - * @} - */ - -/** @defgroup HAL_Aliased_Macros HAL Generic Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_GET_BOOT_MODE __HAL_SYSCFG_GET_BOOT_MODE -#define __HAL_REMAPMEMORY_FLASH __HAL_SYSCFG_REMAPMEMORY_FLASH -#define __HAL_REMAPMEMORY_SYSTEMFLASH __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH -#define __HAL_REMAPMEMORY_SRAM __HAL_SYSCFG_REMAPMEMORY_SRAM -#define __HAL_REMAPMEMORY_FMC __HAL_SYSCFG_REMAPMEMORY_FMC -#define __HAL_REMAPMEMORY_FMC_SDRAM __HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM -#define __HAL_REMAPMEMORY_FSMC __HAL_SYSCFG_REMAPMEMORY_FSMC -#define __HAL_REMAPMEMORY_QUADSPI __HAL_SYSCFG_REMAPMEMORY_QUADSPI -#define __HAL_FMC_BANK __HAL_SYSCFG_FMC_BANK -#define __HAL_GET_FLAG __HAL_SYSCFG_GET_FLAG -#define __HAL_CLEAR_FLAG __HAL_SYSCFG_CLEAR_FLAG -#define __HAL_VREFINT_OUT_ENABLE __HAL_SYSCFG_VREFINT_OUT_ENABLE -#define __HAL_VREFINT_OUT_DISABLE __HAL_SYSCFG_VREFINT_OUT_DISABLE -#define __HAL_SYSCFG_SRAM2_WRP_ENABLE __HAL_SYSCFG_SRAM2_WRP_0_31_ENABLE - -#define SYSCFG_FLAG_VREF_READY SYSCFG_FLAG_VREFINT_READY -#define SYSCFG_FLAG_RC48 RCC_FLAG_HSI48 -#define IS_SYSCFG_FASTMODEPLUS_CONFIG IS_I2C_FASTMODEPLUS -#define UFB_MODE_BitNumber UFB_MODE_BIT_NUMBER -#define CMP_PD_BitNumber CMP_PD_BIT_NUMBER - -/** - * @} - */ - - -/** @defgroup HAL_ADC_Aliased_Macros HAL ADC Aliased Macros maintained for legacy purpose - * @{ - */ -#define __ADC_ENABLE __HAL_ADC_ENABLE -#define __ADC_DISABLE __HAL_ADC_DISABLE -#define __HAL_ADC_ENABLING_CONDITIONS ADC_ENABLING_CONDITIONS -#define __HAL_ADC_DISABLING_CONDITIONS ADC_DISABLING_CONDITIONS -#define __HAL_ADC_IS_ENABLED ADC_IS_ENABLE -#define __ADC_IS_ENABLED ADC_IS_ENABLE -#define __HAL_ADC_IS_SOFTWARE_START_REGULAR ADC_IS_SOFTWARE_START_REGULAR -#define __HAL_ADC_IS_SOFTWARE_START_INJECTED ADC_IS_SOFTWARE_START_INJECTED -#define __HAL_ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED -#define __HAL_ADC_IS_CONVERSION_ONGOING_REGULAR ADC_IS_CONVERSION_ONGOING_REGULAR -#define __HAL_ADC_IS_CONVERSION_ONGOING_INJECTED ADC_IS_CONVERSION_ONGOING_INJECTED -#define __HAL_ADC_IS_CONVERSION_ONGOING ADC_IS_CONVERSION_ONGOING -#define __HAL_ADC_CLEAR_ERRORCODE ADC_CLEAR_ERRORCODE - -#define __HAL_ADC_GET_RESOLUTION ADC_GET_RESOLUTION -#define __HAL_ADC_JSQR_RK ADC_JSQR_RK -#define __HAL_ADC_CFGR_AWD1CH ADC_CFGR_AWD1CH_SHIFT -#define __HAL_ADC_CFGR_AWD23CR ADC_CFGR_AWD23CR -#define __HAL_ADC_CFGR_INJECT_AUTO_CONVERSION ADC_CFGR_INJECT_AUTO_CONVERSION -#define __HAL_ADC_CFGR_INJECT_CONTEXT_QUEUE ADC_CFGR_INJECT_CONTEXT_QUEUE -#define __HAL_ADC_CFGR_INJECT_DISCCONTINUOUS ADC_CFGR_INJECT_DISCCONTINUOUS -#define __HAL_ADC_CFGR_REG_DISCCONTINUOUS ADC_CFGR_REG_DISCCONTINUOUS -#define __HAL_ADC_CFGR_DISCONTINUOUS_NUM ADC_CFGR_DISCONTINUOUS_NUM -#define __HAL_ADC_CFGR_AUTOWAIT ADC_CFGR_AUTOWAIT -#define __HAL_ADC_CFGR_CONTINUOUS ADC_CFGR_CONTINUOUS -#define __HAL_ADC_CFGR_OVERRUN ADC_CFGR_OVERRUN -#define __HAL_ADC_CFGR_DMACONTREQ ADC_CFGR_DMACONTREQ -#define __HAL_ADC_CFGR_EXTSEL ADC_CFGR_EXTSEL_SET -#define __HAL_ADC_JSQR_JEXTSEL ADC_JSQR_JEXTSEL_SET -#define __HAL_ADC_OFR_CHANNEL ADC_OFR_CHANNEL -#define __HAL_ADC_DIFSEL_CHANNEL ADC_DIFSEL_CHANNEL -#define __HAL_ADC_CALFACT_DIFF_SET ADC_CALFACT_DIFF_SET -#define __HAL_ADC_CALFACT_DIFF_GET ADC_CALFACT_DIFF_GET -#define __HAL_ADC_TRX_HIGHTHRESHOLD ADC_TRX_HIGHTHRESHOLD - -#define __HAL_ADC_OFFSET_SHIFT_RESOLUTION ADC_OFFSET_SHIFT_RESOLUTION -#define __HAL_ADC_AWD1THRESHOLD_SHIFT_RESOLUTION ADC_AWD1THRESHOLD_SHIFT_RESOLUTION -#define __HAL_ADC_AWD23THRESHOLD_SHIFT_RESOLUTION ADC_AWD23THRESHOLD_SHIFT_RESOLUTION -#define __HAL_ADC_COMMON_REGISTER ADC_COMMON_REGISTER -#define __HAL_ADC_COMMON_CCR_MULTI ADC_COMMON_CCR_MULTI -#define __HAL_ADC_MULTIMODE_IS_ENABLED ADC_MULTIMODE_IS_ENABLE -#define __ADC_MULTIMODE_IS_ENABLED ADC_MULTIMODE_IS_ENABLE -#define __HAL_ADC_NONMULTIMODE_OR_MULTIMODEMASTER ADC_NONMULTIMODE_OR_MULTIMODEMASTER -#define __HAL_ADC_COMMON_ADC_OTHER ADC_COMMON_ADC_OTHER -#define __HAL_ADC_MULTI_SLAVE ADC_MULTI_SLAVE - -#define __HAL_ADC_SQR1_L ADC_SQR1_L_SHIFT -#define __HAL_ADC_JSQR_JL ADC_JSQR_JL_SHIFT -#define __HAL_ADC_JSQR_RK_JL ADC_JSQR_RK_JL -#define __HAL_ADC_CR1_DISCONTINUOUS_NUM ADC_CR1_DISCONTINUOUS_NUM -#define __HAL_ADC_CR1_SCAN ADC_CR1_SCAN_SET -#define __HAL_ADC_CONVCYCLES_MAX_RANGE ADC_CONVCYCLES_MAX_RANGE -#define __HAL_ADC_CLOCK_PRESCALER_RANGE ADC_CLOCK_PRESCALER_RANGE -#define __HAL_ADC_GET_CLOCK_PRESCALER ADC_GET_CLOCK_PRESCALER - -#define __HAL_ADC_SQR1 ADC_SQR1 -#define __HAL_ADC_SMPR1 ADC_SMPR1 -#define __HAL_ADC_SMPR2 ADC_SMPR2 -#define __HAL_ADC_SQR3_RK ADC_SQR3_RK -#define __HAL_ADC_SQR2_RK ADC_SQR2_RK -#define __HAL_ADC_SQR1_RK ADC_SQR1_RK -#define __HAL_ADC_CR2_CONTINUOUS ADC_CR2_CONTINUOUS -#define __HAL_ADC_CR1_DISCONTINUOUS ADC_CR1_DISCONTINUOUS -#define __HAL_ADC_CR1_SCANCONV ADC_CR1_SCANCONV -#define __HAL_ADC_CR2_EOCSelection ADC_CR2_EOCSelection -#define __HAL_ADC_CR2_DMAContReq ADC_CR2_DMAContReq -#define __HAL_ADC_JSQR ADC_JSQR - -#define __HAL_ADC_CHSELR_CHANNEL ADC_CHSELR_CHANNEL -#define __HAL_ADC_CFGR1_REG_DISCCONTINUOUS ADC_CFGR1_REG_DISCCONTINUOUS -#define __HAL_ADC_CFGR1_AUTOOFF ADC_CFGR1_AUTOOFF -#define __HAL_ADC_CFGR1_AUTOWAIT ADC_CFGR1_AUTOWAIT -#define __HAL_ADC_CFGR1_CONTINUOUS ADC_CFGR1_CONTINUOUS -#define __HAL_ADC_CFGR1_OVERRUN ADC_CFGR1_OVERRUN -#define __HAL_ADC_CFGR1_SCANDIR ADC_CFGR1_SCANDIR -#define __HAL_ADC_CFGR1_DMACONTREQ ADC_CFGR1_DMACONTREQ - -/** - * @} - */ - -/** @defgroup HAL_DAC_Aliased_Macros HAL DAC Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_DHR12R1_ALIGNEMENT DAC_DHR12R1_ALIGNMENT -#define __HAL_DHR12R2_ALIGNEMENT DAC_DHR12R2_ALIGNMENT -#define __HAL_DHR12RD_ALIGNEMENT DAC_DHR12RD_ALIGNMENT -#define IS_DAC_GENERATE_WAVE IS_DAC_WAVE - -/** - * @} - */ - -/** @defgroup HAL_DBGMCU_Aliased_Macros HAL DBGMCU Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_FREEZE_TIM1_DBGMCU __HAL_DBGMCU_FREEZE_TIM1 -#define __HAL_UNFREEZE_TIM1_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM1 -#define __HAL_FREEZE_TIM2_DBGMCU __HAL_DBGMCU_FREEZE_TIM2 -#define __HAL_UNFREEZE_TIM2_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM2 -#define __HAL_FREEZE_TIM3_DBGMCU __HAL_DBGMCU_FREEZE_TIM3 -#define __HAL_UNFREEZE_TIM3_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM3 -#define __HAL_FREEZE_TIM4_DBGMCU __HAL_DBGMCU_FREEZE_TIM4 -#define __HAL_UNFREEZE_TIM4_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM4 -#define __HAL_FREEZE_TIM5_DBGMCU __HAL_DBGMCU_FREEZE_TIM5 -#define __HAL_UNFREEZE_TIM5_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM5 -#define __HAL_FREEZE_TIM6_DBGMCU __HAL_DBGMCU_FREEZE_TIM6 -#define __HAL_UNFREEZE_TIM6_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM6 -#define __HAL_FREEZE_TIM7_DBGMCU __HAL_DBGMCU_FREEZE_TIM7 -#define __HAL_UNFREEZE_TIM7_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM7 -#define __HAL_FREEZE_TIM8_DBGMCU __HAL_DBGMCU_FREEZE_TIM8 -#define __HAL_UNFREEZE_TIM8_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM8 - -#define __HAL_FREEZE_TIM9_DBGMCU __HAL_DBGMCU_FREEZE_TIM9 -#define __HAL_UNFREEZE_TIM9_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM9 -#define __HAL_FREEZE_TIM10_DBGMCU __HAL_DBGMCU_FREEZE_TIM10 -#define __HAL_UNFREEZE_TIM10_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM10 -#define __HAL_FREEZE_TIM11_DBGMCU __HAL_DBGMCU_FREEZE_TIM11 -#define __HAL_UNFREEZE_TIM11_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM11 -#define __HAL_FREEZE_TIM12_DBGMCU __HAL_DBGMCU_FREEZE_TIM12 -#define __HAL_UNFREEZE_TIM12_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM12 -#define __HAL_FREEZE_TIM13_DBGMCU __HAL_DBGMCU_FREEZE_TIM13 -#define __HAL_UNFREEZE_TIM13_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM13 -#define __HAL_FREEZE_TIM14_DBGMCU __HAL_DBGMCU_FREEZE_TIM14 -#define __HAL_UNFREEZE_TIM14_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM14 -#define __HAL_FREEZE_CAN2_DBGMCU __HAL_DBGMCU_FREEZE_CAN2 -#define __HAL_UNFREEZE_CAN2_DBGMCU __HAL_DBGMCU_UNFREEZE_CAN2 - - -#define __HAL_FREEZE_TIM15_DBGMCU __HAL_DBGMCU_FREEZE_TIM15 -#define __HAL_UNFREEZE_TIM15_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM15 -#define __HAL_FREEZE_TIM16_DBGMCU __HAL_DBGMCU_FREEZE_TIM16 -#define __HAL_UNFREEZE_TIM16_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM16 -#define __HAL_FREEZE_TIM17_DBGMCU __HAL_DBGMCU_FREEZE_TIM17 -#define __HAL_UNFREEZE_TIM17_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM17 -#define __HAL_FREEZE_RTC_DBGMCU __HAL_DBGMCU_FREEZE_RTC -#define __HAL_UNFREEZE_RTC_DBGMCU __HAL_DBGMCU_UNFREEZE_RTC -#if defined(STM32H7) -#define __HAL_FREEZE_WWDG_DBGMCU __HAL_DBGMCU_FREEZE_WWDG1 -#define __HAL_UNFREEZE_WWDG_DBGMCU __HAL_DBGMCU_UnFreeze_WWDG1 -#define __HAL_FREEZE_IWDG_DBGMCU __HAL_DBGMCU_FREEZE_IWDG1 -#define __HAL_UNFREEZE_IWDG_DBGMCU __HAL_DBGMCU_UnFreeze_IWDG1 -#else -#define __HAL_FREEZE_WWDG_DBGMCU __HAL_DBGMCU_FREEZE_WWDG -#define __HAL_UNFREEZE_WWDG_DBGMCU __HAL_DBGMCU_UNFREEZE_WWDG -#define __HAL_FREEZE_IWDG_DBGMCU __HAL_DBGMCU_FREEZE_IWDG -#define __HAL_UNFREEZE_IWDG_DBGMCU __HAL_DBGMCU_UNFREEZE_IWDG -#endif /* STM32H7 */ -#define __HAL_FREEZE_I2C1_TIMEOUT_DBGMCU __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT -#define __HAL_UNFREEZE_I2C1_TIMEOUT_DBGMCU __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT -#define __HAL_FREEZE_I2C2_TIMEOUT_DBGMCU __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT -#define __HAL_UNFREEZE_I2C2_TIMEOUT_DBGMCU __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT -#define __HAL_FREEZE_I2C3_TIMEOUT_DBGMCU __HAL_DBGMCU_FREEZE_I2C3_TIMEOUT -#define __HAL_UNFREEZE_I2C3_TIMEOUT_DBGMCU __HAL_DBGMCU_UNFREEZE_I2C3_TIMEOUT -#define __HAL_FREEZE_CAN1_DBGMCU __HAL_DBGMCU_FREEZE_CAN1 -#define __HAL_UNFREEZE_CAN1_DBGMCU __HAL_DBGMCU_UNFREEZE_CAN1 -#define __HAL_FREEZE_LPTIM1_DBGMCU __HAL_DBGMCU_FREEZE_LPTIM1 -#define __HAL_UNFREEZE_LPTIM1_DBGMCU __HAL_DBGMCU_UNFREEZE_LPTIM1 -#define __HAL_FREEZE_LPTIM2_DBGMCU __HAL_DBGMCU_FREEZE_LPTIM2 -#define __HAL_UNFREEZE_LPTIM2_DBGMCU __HAL_DBGMCU_UNFREEZE_LPTIM2 - -/** - * @} - */ - -/** @defgroup HAL_COMP_Aliased_Macros HAL COMP Aliased Macros maintained for legacy purpose - * @{ - */ -#if defined(STM32F3) -#define COMP_START __HAL_COMP_ENABLE -#define COMP_STOP __HAL_COMP_DISABLE -#define COMP_LOCK __HAL_COMP_LOCK - -#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) || defined(STM32F303x8) || \ - defined(STM32F334x8) || defined(STM32F328xx) -#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_RISING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_RISING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_IT() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_IT()) -#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_IT() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_IT()) -#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_GET_FLAG() : \ - __HAL_COMP_COMP6_EXTI_GET_FLAG()) -#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_CLEAR_FLAG() : \ - __HAL_COMP_COMP6_EXTI_CLEAR_FLAG()) -#endif -#if defined(STM32F302xE) || defined(STM32F302xC) -#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_RISING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_RISING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_IT() : \ - __HAL_COMP_COMP6_EXTI_ENABLE_IT()) -#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_IT() : \ - __HAL_COMP_COMP6_EXTI_DISABLE_IT()) -#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_GET_FLAG() : \ - __HAL_COMP_COMP6_EXTI_GET_FLAG()) -#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_CLEAR_FLAG() : \ - __HAL_COMP_COMP6_EXTI_CLEAR_FLAG()) -#endif -#if defined(STM32F303xE) || defined(STM32F398xx) || defined(STM32F303xC) || defined(STM32F358xx) -#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_ENABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_ENABLE_RISING_EDGE() : \ - __HAL_COMP_COMP7_EXTI_ENABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_DISABLE_RISING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_DISABLE_RISING_EDGE() : \ - __HAL_COMP_COMP7_EXTI_DISABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_ENABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_ENABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP7_EXTI_ENABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_DISABLE_FALLING_EDGE() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_DISABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP7_EXTI_DISABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_ENABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_ENABLE_IT() : \ - __HAL_COMP_COMP7_EXTI_ENABLE_IT()) -#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_DISABLE_IT() : \ - ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_DISABLE_IT() : \ - __HAL_COMP_COMP7_EXTI_DISABLE_IT()) -#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_GET_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_GET_FLAG() : \ - __HAL_COMP_COMP7_EXTI_GET_FLAG()) -#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_CLEAR_FLAG() : \ - ((__FLAG__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_CLEAR_FLAG() : \ - __HAL_COMP_COMP7_EXTI_CLEAR_FLAG()) -#endif -#if defined(STM32F373xC) ||defined(STM32F378xx) -#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_IT()) -#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_IT()) -#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ - __HAL_COMP_COMP2_EXTI_GET_FLAG()) -#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ - __HAL_COMP_COMP2_EXTI_CLEAR_FLAG()) -#endif -#else -#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE()) -#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ - __HAL_COMP_COMP2_EXTI_ENABLE_IT()) -#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ - __HAL_COMP_COMP2_EXTI_DISABLE_IT()) -#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ - __HAL_COMP_COMP2_EXTI_GET_FLAG()) -#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ - __HAL_COMP_COMP2_EXTI_CLEAR_FLAG()) -#endif - -#define __HAL_COMP_GET_EXTI_LINE COMP_GET_EXTI_LINE - -#if defined(STM32L0) || defined(STM32L4) -/* Note: On these STM32 families, the only argument of this macro */ -/* is COMP_FLAG_LOCK. */ -/* This macro is replaced by __HAL_COMP_IS_LOCKED with only HAL handle */ -/* argument. */ -#define __HAL_COMP_GET_FLAG(__HANDLE__, __FLAG__) (__HAL_COMP_IS_LOCKED(__HANDLE__)) -#endif -/** - * @} - */ - -#if defined(STM32L0) || defined(STM32L4) -/** @defgroup HAL_COMP_Aliased_Functions HAL COMP Aliased Functions maintained for legacy purpose - * @{ - */ -#define HAL_COMP_Start_IT HAL_COMP_Start /* Function considered as legacy as EXTI event or IT configuration is - done into HAL_COMP_Init() */ -#define HAL_COMP_Stop_IT HAL_COMP_Stop /* Function considered as legacy as EXTI event or IT configuration is - done into HAL_COMP_Init() */ -/** - * @} - */ -#endif - -/** @defgroup HAL_DAC_Aliased_Macros HAL DAC Aliased Macros maintained for legacy purpose - * @{ - */ - -#define IS_DAC_WAVE(WAVE) (((WAVE) == DAC_WAVE_NONE) || \ - ((WAVE) == DAC_WAVE_NOISE)|| \ - ((WAVE) == DAC_WAVE_TRIANGLE)) - -/** - * @} - */ - -/** @defgroup HAL_FLASH_Aliased_Macros HAL FLASH Aliased Macros maintained for legacy purpose - * @{ - */ - -#define IS_WRPAREA IS_OB_WRPAREA -#define IS_TYPEPROGRAM IS_FLASH_TYPEPROGRAM -#define IS_TYPEPROGRAMFLASH IS_FLASH_TYPEPROGRAM -#define IS_TYPEERASE IS_FLASH_TYPEERASE -#define IS_NBSECTORS IS_FLASH_NBSECTORS -#define IS_OB_WDG_SOURCE IS_OB_IWDG_SOURCE - -/** - * @} - */ - -/** @defgroup HAL_I2C_Aliased_Macros HAL I2C Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __HAL_I2C_RESET_CR2 I2C_RESET_CR2 -#define __HAL_I2C_GENERATE_START I2C_GENERATE_START -#if defined(STM32F1) -#define __HAL_I2C_FREQ_RANGE I2C_FREQRANGE -#else -#define __HAL_I2C_FREQ_RANGE I2C_FREQ_RANGE -#endif /* STM32F1 */ -#define __HAL_I2C_RISE_TIME I2C_RISE_TIME -#define __HAL_I2C_SPEED_STANDARD I2C_SPEED_STANDARD -#define __HAL_I2C_SPEED_FAST I2C_SPEED_FAST -#define __HAL_I2C_SPEED I2C_SPEED -#define __HAL_I2C_7BIT_ADD_WRITE I2C_7BIT_ADD_WRITE -#define __HAL_I2C_7BIT_ADD_READ I2C_7BIT_ADD_READ -#define __HAL_I2C_10BIT_ADDRESS I2C_10BIT_ADDRESS -#define __HAL_I2C_10BIT_HEADER_WRITE I2C_10BIT_HEADER_WRITE -#define __HAL_I2C_10BIT_HEADER_READ I2C_10BIT_HEADER_READ -#define __HAL_I2C_MEM_ADD_MSB I2C_MEM_ADD_MSB -#define __HAL_I2C_MEM_ADD_LSB I2C_MEM_ADD_LSB -#define __HAL_I2C_FREQRANGE I2C_FREQRANGE -/** - * @} - */ - -/** @defgroup HAL_I2S_Aliased_Macros HAL I2S Aliased Macros maintained for legacy purpose - * @{ - */ - -#define IS_I2S_INSTANCE IS_I2S_ALL_INSTANCE -#define IS_I2S_INSTANCE_EXT IS_I2S_ALL_INSTANCE_EXT - -#if defined(STM32H7) -#define __HAL_I2S_CLEAR_FREFLAG __HAL_I2S_CLEAR_TIFREFLAG -#endif - -/** - * @} - */ - -/** @defgroup HAL_IRDA_Aliased_Macros HAL IRDA Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __IRDA_DISABLE __HAL_IRDA_DISABLE -#define __IRDA_ENABLE __HAL_IRDA_ENABLE - -#define __HAL_IRDA_GETCLOCKSOURCE IRDA_GETCLOCKSOURCE -#define __HAL_IRDA_MASK_COMPUTATION IRDA_MASK_COMPUTATION -#define __IRDA_GETCLOCKSOURCE IRDA_GETCLOCKSOURCE -#define __IRDA_MASK_COMPUTATION IRDA_MASK_COMPUTATION - -#define IS_IRDA_ONEBIT_SAMPLE IS_IRDA_ONE_BIT_SAMPLE - - -/** - * @} - */ - - -/** @defgroup HAL_IWDG_Aliased_Macros HAL IWDG Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_IWDG_ENABLE_WRITE_ACCESS IWDG_ENABLE_WRITE_ACCESS -#define __HAL_IWDG_DISABLE_WRITE_ACCESS IWDG_DISABLE_WRITE_ACCESS -/** - * @} - */ - - -/** @defgroup HAL_LPTIM_Aliased_Macros HAL LPTIM Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __HAL_LPTIM_ENABLE_INTERRUPT __HAL_LPTIM_ENABLE_IT -#define __HAL_LPTIM_DISABLE_INTERRUPT __HAL_LPTIM_DISABLE_IT -#define __HAL_LPTIM_GET_ITSTATUS __HAL_LPTIM_GET_IT_SOURCE - -/** - * @} - */ - - -/** @defgroup HAL_OPAMP_Aliased_Macros HAL OPAMP Aliased Macros maintained for legacy purpose - * @{ - */ -#define __OPAMP_CSR_OPAXPD OPAMP_CSR_OPAXPD -#define __OPAMP_CSR_S3SELX OPAMP_CSR_S3SELX -#define __OPAMP_CSR_S4SELX OPAMP_CSR_S4SELX -#define __OPAMP_CSR_S5SELX OPAMP_CSR_S5SELX -#define __OPAMP_CSR_S6SELX OPAMP_CSR_S6SELX -#define __OPAMP_CSR_OPAXCAL_L OPAMP_CSR_OPAXCAL_L -#define __OPAMP_CSR_OPAXCAL_H OPAMP_CSR_OPAXCAL_H -#define __OPAMP_CSR_OPAXLPM OPAMP_CSR_OPAXLPM -#define __OPAMP_CSR_ALL_SWITCHES OPAMP_CSR_ALL_SWITCHES -#define __OPAMP_CSR_ANAWSELX OPAMP_CSR_ANAWSELX -#define __OPAMP_CSR_OPAXCALOUT OPAMP_CSR_OPAXCALOUT -#define __OPAMP_OFFSET_TRIM_BITSPOSITION OPAMP_OFFSET_TRIM_BITSPOSITION -#define __OPAMP_OFFSET_TRIM_SET OPAMP_OFFSET_TRIM_SET - -/** - * @} - */ - - -/** @defgroup HAL_PWR_Aliased_Macros HAL PWR Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_PVD_EVENT_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_EVENT -#define __HAL_PVD_EVENT_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_EVENT -#define __HAL_PVD_EXTI_FALLINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE -#define __HAL_PVD_EXTI_FALLINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE -#define __HAL_PVD_EXTI_RISINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE -#define __HAL_PVD_EXTI_RISINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE -#define __HAL_PVM_EVENT_DISABLE __HAL_PWR_PVM_EVENT_DISABLE -#define __HAL_PVM_EVENT_ENABLE __HAL_PWR_PVM_EVENT_ENABLE -#define __HAL_PVM_EXTI_FALLINGTRIGGER_DISABLE __HAL_PWR_PVM_EXTI_FALLINGTRIGGER_DISABLE -#define __HAL_PVM_EXTI_FALLINGTRIGGER_ENABLE __HAL_PWR_PVM_EXTI_FALLINGTRIGGER_ENABLE -#define __HAL_PVM_EXTI_RISINGTRIGGER_DISABLE __HAL_PWR_PVM_EXTI_RISINGTRIGGER_DISABLE -#define __HAL_PVM_EXTI_RISINGTRIGGER_ENABLE __HAL_PWR_PVM_EXTI_RISINGTRIGGER_ENABLE -#define __HAL_PWR_INTERNALWAKEUP_DISABLE HAL_PWREx_DisableInternalWakeUpLine -#define __HAL_PWR_INTERNALWAKEUP_ENABLE HAL_PWREx_EnableInternalWakeUpLine -#define __HAL_PWR_PULL_UP_DOWN_CONFIG_DISABLE HAL_PWREx_DisablePullUpPullDownConfig -#define __HAL_PWR_PULL_UP_DOWN_CONFIG_ENABLE HAL_PWREx_EnablePullUpPullDownConfig -#define __HAL_PWR_PVD_EXTI_CLEAR_EGDE_TRIGGER() do { __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE(); \ - __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); \ - } while(0) -#define __HAL_PWR_PVD_EXTI_EVENT_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_EVENT -#define __HAL_PWR_PVD_EXTI_EVENT_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_EVENT -#define __HAL_PWR_PVD_EXTI_FALLINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE -#define __HAL_PWR_PVD_EXTI_FALLINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE -#define __HAL_PWR_PVD_EXTI_RISINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE -#define __HAL_PWR_PVD_EXTI_RISINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE -#define __HAL_PWR_PVD_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE -#define __HAL_PWR_PVD_EXTI_SET_RISING_EDGE_TRIGGER __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE -#define __HAL_PWR_PVM_DISABLE() do { HAL_PWREx_DisablePVM1();HAL_PWREx_DisablePVM2(); \ - HAL_PWREx_DisablePVM3();HAL_PWREx_DisablePVM4(); \ - } while(0) -#define __HAL_PWR_PVM_ENABLE() do { HAL_PWREx_EnablePVM1();HAL_PWREx_EnablePVM2(); \ - HAL_PWREx_EnablePVM3();HAL_PWREx_EnablePVM4(); \ - } while(0) -#define __HAL_PWR_SRAM2CONTENT_PRESERVE_DISABLE HAL_PWREx_DisableSRAM2ContentRetention -#define __HAL_PWR_SRAM2CONTENT_PRESERVE_ENABLE HAL_PWREx_EnableSRAM2ContentRetention -#define __HAL_PWR_VDDIO2_DISABLE HAL_PWREx_DisableVddIO2 -#define __HAL_PWR_VDDIO2_ENABLE HAL_PWREx_EnableVddIO2 -#define __HAL_PWR_VDDIO2_EXTI_CLEAR_EGDE_TRIGGER __HAL_PWR_VDDIO2_EXTI_DISABLE_FALLING_EDGE -#define __HAL_PWR_VDDIO2_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_PWR_VDDIO2_EXTI_ENABLE_FALLING_EDGE -#define __HAL_PWR_VDDUSB_DISABLE HAL_PWREx_DisableVddUSB -#define __HAL_PWR_VDDUSB_ENABLE HAL_PWREx_EnableVddUSB - -#if defined (STM32F4) -#define __HAL_PVD_EXTI_ENABLE_IT(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_ENABLE_IT() -#define __HAL_PVD_EXTI_DISABLE_IT(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_DISABLE_IT() -#define __HAL_PVD_EXTI_GET_FLAG(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_GET_FLAG() -#define __HAL_PVD_EXTI_CLEAR_FLAG(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_CLEAR_FLAG() -#define __HAL_PVD_EXTI_GENERATE_SWIT(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_GENERATE_SWIT() -#else -#define __HAL_PVD_EXTI_CLEAR_FLAG __HAL_PWR_PVD_EXTI_CLEAR_FLAG -#define __HAL_PVD_EXTI_DISABLE_IT __HAL_PWR_PVD_EXTI_DISABLE_IT -#define __HAL_PVD_EXTI_ENABLE_IT __HAL_PWR_PVD_EXTI_ENABLE_IT -#define __HAL_PVD_EXTI_GENERATE_SWIT __HAL_PWR_PVD_EXTI_GENERATE_SWIT -#define __HAL_PVD_EXTI_GET_FLAG __HAL_PWR_PVD_EXTI_GET_FLAG -#endif /* STM32F4 */ -/** - * @} - */ - - -/** @defgroup HAL_RCC_Aliased HAL RCC Aliased maintained for legacy purpose - * @{ - */ - -#define RCC_StopWakeUpClock_MSI RCC_STOP_WAKEUPCLOCK_MSI -#define RCC_StopWakeUpClock_HSI RCC_STOP_WAKEUPCLOCK_HSI - -#define HAL_RCC_CCSCallback HAL_RCC_CSSCallback -#define HAL_RC48_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? \ - HAL_RCCEx_EnableHSI48_VREFINT() : HAL_RCCEx_DisableHSI48_VREFINT()) - -#define __ADC_CLK_DISABLE __HAL_RCC_ADC_CLK_DISABLE -#define __ADC_CLK_ENABLE __HAL_RCC_ADC_CLK_ENABLE -#define __ADC_CLK_SLEEP_DISABLE __HAL_RCC_ADC_CLK_SLEEP_DISABLE -#define __ADC_CLK_SLEEP_ENABLE __HAL_RCC_ADC_CLK_SLEEP_ENABLE -#define __ADC_FORCE_RESET __HAL_RCC_ADC_FORCE_RESET -#define __ADC_RELEASE_RESET __HAL_RCC_ADC_RELEASE_RESET -#define __ADC1_CLK_DISABLE __HAL_RCC_ADC1_CLK_DISABLE -#define __ADC1_CLK_ENABLE __HAL_RCC_ADC1_CLK_ENABLE -#define __ADC1_FORCE_RESET __HAL_RCC_ADC1_FORCE_RESET -#define __ADC1_RELEASE_RESET __HAL_RCC_ADC1_RELEASE_RESET -#define __ADC1_CLK_SLEEP_ENABLE __HAL_RCC_ADC1_CLK_SLEEP_ENABLE -#define __ADC1_CLK_SLEEP_DISABLE __HAL_RCC_ADC1_CLK_SLEEP_DISABLE -#define __ADC2_CLK_DISABLE __HAL_RCC_ADC2_CLK_DISABLE -#define __ADC2_CLK_ENABLE __HAL_RCC_ADC2_CLK_ENABLE -#define __ADC2_FORCE_RESET __HAL_RCC_ADC2_FORCE_RESET -#define __ADC2_RELEASE_RESET __HAL_RCC_ADC2_RELEASE_RESET -#define __ADC3_CLK_DISABLE __HAL_RCC_ADC3_CLK_DISABLE -#define __ADC3_CLK_ENABLE __HAL_RCC_ADC3_CLK_ENABLE -#define __ADC3_FORCE_RESET __HAL_RCC_ADC3_FORCE_RESET -#define __ADC3_RELEASE_RESET __HAL_RCC_ADC3_RELEASE_RESET -#define __AES_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE -#define __AES_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE -#define __AES_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE -#define __AES_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE -#define __AES_FORCE_RESET __HAL_RCC_AES_FORCE_RESET -#define __AES_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET -#define __CRYP_CLK_SLEEP_ENABLE __HAL_RCC_CRYP_CLK_SLEEP_ENABLE -#define __CRYP_CLK_SLEEP_DISABLE __HAL_RCC_CRYP_CLK_SLEEP_DISABLE -#define __CRYP_CLK_ENABLE __HAL_RCC_CRYP_CLK_ENABLE -#define __CRYP_CLK_DISABLE __HAL_RCC_CRYP_CLK_DISABLE -#define __CRYP_FORCE_RESET __HAL_RCC_CRYP_FORCE_RESET -#define __CRYP_RELEASE_RESET __HAL_RCC_CRYP_RELEASE_RESET -#define __AFIO_CLK_DISABLE __HAL_RCC_AFIO_CLK_DISABLE -#define __AFIO_CLK_ENABLE __HAL_RCC_AFIO_CLK_ENABLE -#define __AFIO_FORCE_RESET __HAL_RCC_AFIO_FORCE_RESET -#define __AFIO_RELEASE_RESET __HAL_RCC_AFIO_RELEASE_RESET -#define __AHB_FORCE_RESET __HAL_RCC_AHB_FORCE_RESET -#define __AHB_RELEASE_RESET __HAL_RCC_AHB_RELEASE_RESET -#define __AHB1_FORCE_RESET __HAL_RCC_AHB1_FORCE_RESET -#define __AHB1_RELEASE_RESET __HAL_RCC_AHB1_RELEASE_RESET -#define __AHB2_FORCE_RESET __HAL_RCC_AHB2_FORCE_RESET -#define __AHB2_RELEASE_RESET __HAL_RCC_AHB2_RELEASE_RESET -#define __AHB3_FORCE_RESET __HAL_RCC_AHB3_FORCE_RESET -#define __AHB3_RELEASE_RESET __HAL_RCC_AHB3_RELEASE_RESET -#define __APB1_FORCE_RESET __HAL_RCC_APB1_FORCE_RESET -#define __APB1_RELEASE_RESET __HAL_RCC_APB1_RELEASE_RESET -#define __APB2_FORCE_RESET __HAL_RCC_APB2_FORCE_RESET -#define __APB2_RELEASE_RESET __HAL_RCC_APB2_RELEASE_RESET -#if defined(STM32C0) -#define __HAL_RCC_APB1_FORCE_RESET __HAL_RCC_APB1_GRP1_FORCE_RESET -#define __HAL_RCC_APB1_RELEASE_RESET __HAL_RCC_APB1_GRP1_RELEASE_RESET -#define __HAL_RCC_APB2_FORCE_RESET __HAL_RCC_APB1_GRP2_FORCE_RESET -#define __HAL_RCC_APB2_RELEASE_RESET __HAL_RCC_APB1_GRP2_RELEASE_RESET -#endif /* STM32C0 */ -#define __BKP_CLK_DISABLE __HAL_RCC_BKP_CLK_DISABLE -#define __BKP_CLK_ENABLE __HAL_RCC_BKP_CLK_ENABLE -#define __BKP_FORCE_RESET __HAL_RCC_BKP_FORCE_RESET -#define __BKP_RELEASE_RESET __HAL_RCC_BKP_RELEASE_RESET -#define __CAN1_CLK_DISABLE __HAL_RCC_CAN1_CLK_DISABLE -#define __CAN1_CLK_ENABLE __HAL_RCC_CAN1_CLK_ENABLE -#define __CAN1_CLK_SLEEP_DISABLE __HAL_RCC_CAN1_CLK_SLEEP_DISABLE -#define __CAN1_CLK_SLEEP_ENABLE __HAL_RCC_CAN1_CLK_SLEEP_ENABLE -#define __CAN1_FORCE_RESET __HAL_RCC_CAN1_FORCE_RESET -#define __CAN1_RELEASE_RESET __HAL_RCC_CAN1_RELEASE_RESET -#define __CAN_CLK_DISABLE __HAL_RCC_CAN1_CLK_DISABLE -#define __CAN_CLK_ENABLE __HAL_RCC_CAN1_CLK_ENABLE -#define __CAN_FORCE_RESET __HAL_RCC_CAN1_FORCE_RESET -#define __CAN_RELEASE_RESET __HAL_RCC_CAN1_RELEASE_RESET -#define __CAN2_CLK_DISABLE __HAL_RCC_CAN2_CLK_DISABLE -#define __CAN2_CLK_ENABLE __HAL_RCC_CAN2_CLK_ENABLE -#define __CAN2_FORCE_RESET __HAL_RCC_CAN2_FORCE_RESET -#define __CAN2_RELEASE_RESET __HAL_RCC_CAN2_RELEASE_RESET -#define __CEC_CLK_DISABLE __HAL_RCC_CEC_CLK_DISABLE -#define __CEC_CLK_ENABLE __HAL_RCC_CEC_CLK_ENABLE -#define __COMP_CLK_DISABLE __HAL_RCC_COMP_CLK_DISABLE -#define __COMP_CLK_ENABLE __HAL_RCC_COMP_CLK_ENABLE -#define __COMP_FORCE_RESET __HAL_RCC_COMP_FORCE_RESET -#define __COMP_RELEASE_RESET __HAL_RCC_COMP_RELEASE_RESET -#define __COMP_CLK_SLEEP_ENABLE __HAL_RCC_COMP_CLK_SLEEP_ENABLE -#define __COMP_CLK_SLEEP_DISABLE __HAL_RCC_COMP_CLK_SLEEP_DISABLE -#define __CEC_FORCE_RESET __HAL_RCC_CEC_FORCE_RESET -#define __CEC_RELEASE_RESET __HAL_RCC_CEC_RELEASE_RESET -#define __CRC_CLK_DISABLE __HAL_RCC_CRC_CLK_DISABLE -#define __CRC_CLK_ENABLE __HAL_RCC_CRC_CLK_ENABLE -#define __CRC_CLK_SLEEP_DISABLE __HAL_RCC_CRC_CLK_SLEEP_DISABLE -#define __CRC_CLK_SLEEP_ENABLE __HAL_RCC_CRC_CLK_SLEEP_ENABLE -#define __CRC_FORCE_RESET __HAL_RCC_CRC_FORCE_RESET -#define __CRC_RELEASE_RESET __HAL_RCC_CRC_RELEASE_RESET -#define __DAC_CLK_DISABLE __HAL_RCC_DAC_CLK_DISABLE -#define __DAC_CLK_ENABLE __HAL_RCC_DAC_CLK_ENABLE -#define __DAC_FORCE_RESET __HAL_RCC_DAC_FORCE_RESET -#define __DAC_RELEASE_RESET __HAL_RCC_DAC_RELEASE_RESET -#define __DAC1_CLK_DISABLE __HAL_RCC_DAC1_CLK_DISABLE -#define __DAC1_CLK_ENABLE __HAL_RCC_DAC1_CLK_ENABLE -#define __DAC1_CLK_SLEEP_DISABLE __HAL_RCC_DAC1_CLK_SLEEP_DISABLE -#define __DAC1_CLK_SLEEP_ENABLE __HAL_RCC_DAC1_CLK_SLEEP_ENABLE -#define __DAC1_FORCE_RESET __HAL_RCC_DAC1_FORCE_RESET -#define __DAC1_RELEASE_RESET __HAL_RCC_DAC1_RELEASE_RESET -#define __DBGMCU_CLK_ENABLE __HAL_RCC_DBGMCU_CLK_ENABLE -#define __DBGMCU_CLK_DISABLE __HAL_RCC_DBGMCU_CLK_DISABLE -#define __DBGMCU_FORCE_RESET __HAL_RCC_DBGMCU_FORCE_RESET -#define __DBGMCU_RELEASE_RESET __HAL_RCC_DBGMCU_RELEASE_RESET -#define __DFSDM_CLK_DISABLE __HAL_RCC_DFSDM_CLK_DISABLE -#define __DFSDM_CLK_ENABLE __HAL_RCC_DFSDM_CLK_ENABLE -#define __DFSDM_CLK_SLEEP_DISABLE __HAL_RCC_DFSDM_CLK_SLEEP_DISABLE -#define __DFSDM_CLK_SLEEP_ENABLE __HAL_RCC_DFSDM_CLK_SLEEP_ENABLE -#define __DFSDM_FORCE_RESET __HAL_RCC_DFSDM_FORCE_RESET -#define __DFSDM_RELEASE_RESET __HAL_RCC_DFSDM_RELEASE_RESET -#define __DMA1_CLK_DISABLE __HAL_RCC_DMA1_CLK_DISABLE -#define __DMA1_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE -#define __DMA1_CLK_SLEEP_DISABLE __HAL_RCC_DMA1_CLK_SLEEP_DISABLE -#define __DMA1_CLK_SLEEP_ENABLE __HAL_RCC_DMA1_CLK_SLEEP_ENABLE -#define __DMA1_FORCE_RESET __HAL_RCC_DMA1_FORCE_RESET -#define __DMA1_RELEASE_RESET __HAL_RCC_DMA1_RELEASE_RESET -#define __DMA2_CLK_DISABLE __HAL_RCC_DMA2_CLK_DISABLE -#define __DMA2_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE -#define __DMA2_CLK_SLEEP_DISABLE __HAL_RCC_DMA2_CLK_SLEEP_DISABLE -#define __DMA2_CLK_SLEEP_ENABLE __HAL_RCC_DMA2_CLK_SLEEP_ENABLE -#define __DMA2_FORCE_RESET __HAL_RCC_DMA2_FORCE_RESET -#define __DMA2_RELEASE_RESET __HAL_RCC_DMA2_RELEASE_RESET -#define __ETHMAC_CLK_DISABLE __HAL_RCC_ETHMAC_CLK_DISABLE -#define __ETHMAC_CLK_ENABLE __HAL_RCC_ETHMAC_CLK_ENABLE -#define __ETHMAC_FORCE_RESET __HAL_RCC_ETHMAC_FORCE_RESET -#define __ETHMAC_RELEASE_RESET __HAL_RCC_ETHMAC_RELEASE_RESET -#define __ETHMACRX_CLK_DISABLE __HAL_RCC_ETHMACRX_CLK_DISABLE -#define __ETHMACRX_CLK_ENABLE __HAL_RCC_ETHMACRX_CLK_ENABLE -#define __ETHMACTX_CLK_DISABLE __HAL_RCC_ETHMACTX_CLK_DISABLE -#define __ETHMACTX_CLK_ENABLE __HAL_RCC_ETHMACTX_CLK_ENABLE -#define __FIREWALL_CLK_DISABLE __HAL_RCC_FIREWALL_CLK_DISABLE -#define __FIREWALL_CLK_ENABLE __HAL_RCC_FIREWALL_CLK_ENABLE -#define __FLASH_CLK_DISABLE __HAL_RCC_FLASH_CLK_DISABLE -#define __FLASH_CLK_ENABLE __HAL_RCC_FLASH_CLK_ENABLE -#define __FLASH_CLK_SLEEP_DISABLE __HAL_RCC_FLASH_CLK_SLEEP_DISABLE -#define __FLASH_CLK_SLEEP_ENABLE __HAL_RCC_FLASH_CLK_SLEEP_ENABLE -#define __FLASH_FORCE_RESET __HAL_RCC_FLASH_FORCE_RESET -#define __FLASH_RELEASE_RESET __HAL_RCC_FLASH_RELEASE_RESET -#define __FLITF_CLK_DISABLE __HAL_RCC_FLITF_CLK_DISABLE -#define __FLITF_CLK_ENABLE __HAL_RCC_FLITF_CLK_ENABLE -#define __FLITF_FORCE_RESET __HAL_RCC_FLITF_FORCE_RESET -#define __FLITF_RELEASE_RESET __HAL_RCC_FLITF_RELEASE_RESET -#define __FLITF_CLK_SLEEP_ENABLE __HAL_RCC_FLITF_CLK_SLEEP_ENABLE -#define __FLITF_CLK_SLEEP_DISABLE __HAL_RCC_FLITF_CLK_SLEEP_DISABLE -#define __FMC_CLK_DISABLE __HAL_RCC_FMC_CLK_DISABLE -#define __FMC_CLK_ENABLE __HAL_RCC_FMC_CLK_ENABLE -#define __FMC_CLK_SLEEP_DISABLE __HAL_RCC_FMC_CLK_SLEEP_DISABLE -#define __FMC_CLK_SLEEP_ENABLE __HAL_RCC_FMC_CLK_SLEEP_ENABLE -#define __FMC_FORCE_RESET __HAL_RCC_FMC_FORCE_RESET -#define __FMC_RELEASE_RESET __HAL_RCC_FMC_RELEASE_RESET -#define __FSMC_CLK_DISABLE __HAL_RCC_FSMC_CLK_DISABLE -#define __FSMC_CLK_ENABLE __HAL_RCC_FSMC_CLK_ENABLE -#define __GPIOA_CLK_DISABLE __HAL_RCC_GPIOA_CLK_DISABLE -#define __GPIOA_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE -#define __GPIOA_CLK_SLEEP_DISABLE __HAL_RCC_GPIOA_CLK_SLEEP_DISABLE -#define __GPIOA_CLK_SLEEP_ENABLE __HAL_RCC_GPIOA_CLK_SLEEP_ENABLE -#define __GPIOA_FORCE_RESET __HAL_RCC_GPIOA_FORCE_RESET -#define __GPIOA_RELEASE_RESET __HAL_RCC_GPIOA_RELEASE_RESET -#define __GPIOB_CLK_DISABLE __HAL_RCC_GPIOB_CLK_DISABLE -#define __GPIOB_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE -#define __GPIOB_CLK_SLEEP_DISABLE __HAL_RCC_GPIOB_CLK_SLEEP_DISABLE -#define __GPIOB_CLK_SLEEP_ENABLE __HAL_RCC_GPIOB_CLK_SLEEP_ENABLE -#define __GPIOB_FORCE_RESET __HAL_RCC_GPIOB_FORCE_RESET -#define __GPIOB_RELEASE_RESET __HAL_RCC_GPIOB_RELEASE_RESET -#define __GPIOC_CLK_DISABLE __HAL_RCC_GPIOC_CLK_DISABLE -#define __GPIOC_CLK_ENABLE __HAL_RCC_GPIOC_CLK_ENABLE -#define __GPIOC_CLK_SLEEP_DISABLE __HAL_RCC_GPIOC_CLK_SLEEP_DISABLE -#define __GPIOC_CLK_SLEEP_ENABLE __HAL_RCC_GPIOC_CLK_SLEEP_ENABLE -#define __GPIOC_FORCE_RESET __HAL_RCC_GPIOC_FORCE_RESET -#define __GPIOC_RELEASE_RESET __HAL_RCC_GPIOC_RELEASE_RESET -#define __GPIOD_CLK_DISABLE __HAL_RCC_GPIOD_CLK_DISABLE -#define __GPIOD_CLK_ENABLE __HAL_RCC_GPIOD_CLK_ENABLE -#define __GPIOD_CLK_SLEEP_DISABLE __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE -#define __GPIOD_CLK_SLEEP_ENABLE __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE -#define __GPIOD_FORCE_RESET __HAL_RCC_GPIOD_FORCE_RESET -#define __GPIOD_RELEASE_RESET __HAL_RCC_GPIOD_RELEASE_RESET -#define __GPIOE_CLK_DISABLE __HAL_RCC_GPIOE_CLK_DISABLE -#define __GPIOE_CLK_ENABLE __HAL_RCC_GPIOE_CLK_ENABLE -#define __GPIOE_CLK_SLEEP_DISABLE __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE -#define __GPIOE_CLK_SLEEP_ENABLE __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE -#define __GPIOE_FORCE_RESET __HAL_RCC_GPIOE_FORCE_RESET -#define __GPIOE_RELEASE_RESET __HAL_RCC_GPIOE_RELEASE_RESET -#define __GPIOF_CLK_DISABLE __HAL_RCC_GPIOF_CLK_DISABLE -#define __GPIOF_CLK_ENABLE __HAL_RCC_GPIOF_CLK_ENABLE -#define __GPIOF_CLK_SLEEP_DISABLE __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE -#define __GPIOF_CLK_SLEEP_ENABLE __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE -#define __GPIOF_FORCE_RESET __HAL_RCC_GPIOF_FORCE_RESET -#define __GPIOF_RELEASE_RESET __HAL_RCC_GPIOF_RELEASE_RESET -#define __GPIOG_CLK_DISABLE __HAL_RCC_GPIOG_CLK_DISABLE -#define __GPIOG_CLK_ENABLE __HAL_RCC_GPIOG_CLK_ENABLE -#define __GPIOG_CLK_SLEEP_DISABLE __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE -#define __GPIOG_CLK_SLEEP_ENABLE __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE -#define __GPIOG_FORCE_RESET __HAL_RCC_GPIOG_FORCE_RESET -#define __GPIOG_RELEASE_RESET __HAL_RCC_GPIOG_RELEASE_RESET -#define __GPIOH_CLK_DISABLE __HAL_RCC_GPIOH_CLK_DISABLE -#define __GPIOH_CLK_ENABLE __HAL_RCC_GPIOH_CLK_ENABLE -#define __GPIOH_CLK_SLEEP_DISABLE __HAL_RCC_GPIOH_CLK_SLEEP_DISABLE -#define __GPIOH_CLK_SLEEP_ENABLE __HAL_RCC_GPIOH_CLK_SLEEP_ENABLE -#define __GPIOH_FORCE_RESET __HAL_RCC_GPIOH_FORCE_RESET -#define __GPIOH_RELEASE_RESET __HAL_RCC_GPIOH_RELEASE_RESET -#define __I2C1_CLK_DISABLE __HAL_RCC_I2C1_CLK_DISABLE -#define __I2C1_CLK_ENABLE __HAL_RCC_I2C1_CLK_ENABLE -#define __I2C1_CLK_SLEEP_DISABLE __HAL_RCC_I2C1_CLK_SLEEP_DISABLE -#define __I2C1_CLK_SLEEP_ENABLE __HAL_RCC_I2C1_CLK_SLEEP_ENABLE -#define __I2C1_FORCE_RESET __HAL_RCC_I2C1_FORCE_RESET -#define __I2C1_RELEASE_RESET __HAL_RCC_I2C1_RELEASE_RESET -#define __I2C2_CLK_DISABLE __HAL_RCC_I2C2_CLK_DISABLE -#define __I2C2_CLK_ENABLE __HAL_RCC_I2C2_CLK_ENABLE -#define __I2C2_CLK_SLEEP_DISABLE __HAL_RCC_I2C2_CLK_SLEEP_DISABLE -#define __I2C2_CLK_SLEEP_ENABLE __HAL_RCC_I2C2_CLK_SLEEP_ENABLE -#define __I2C2_FORCE_RESET __HAL_RCC_I2C2_FORCE_RESET -#define __I2C2_RELEASE_RESET __HAL_RCC_I2C2_RELEASE_RESET -#define __I2C3_CLK_DISABLE __HAL_RCC_I2C3_CLK_DISABLE -#define __I2C3_CLK_ENABLE __HAL_RCC_I2C3_CLK_ENABLE -#define __I2C3_CLK_SLEEP_DISABLE __HAL_RCC_I2C3_CLK_SLEEP_DISABLE -#define __I2C3_CLK_SLEEP_ENABLE __HAL_RCC_I2C3_CLK_SLEEP_ENABLE -#define __I2C3_FORCE_RESET __HAL_RCC_I2C3_FORCE_RESET -#define __I2C3_RELEASE_RESET __HAL_RCC_I2C3_RELEASE_RESET -#define __LCD_CLK_DISABLE __HAL_RCC_LCD_CLK_DISABLE -#define __LCD_CLK_ENABLE __HAL_RCC_LCD_CLK_ENABLE -#define __LCD_CLK_SLEEP_DISABLE __HAL_RCC_LCD_CLK_SLEEP_DISABLE -#define __LCD_CLK_SLEEP_ENABLE __HAL_RCC_LCD_CLK_SLEEP_ENABLE -#define __LCD_FORCE_RESET __HAL_RCC_LCD_FORCE_RESET -#define __LCD_RELEASE_RESET __HAL_RCC_LCD_RELEASE_RESET -#define __LPTIM1_CLK_DISABLE __HAL_RCC_LPTIM1_CLK_DISABLE -#define __LPTIM1_CLK_ENABLE __HAL_RCC_LPTIM1_CLK_ENABLE -#define __LPTIM1_CLK_SLEEP_DISABLE __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE -#define __LPTIM1_CLK_SLEEP_ENABLE __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE -#define __LPTIM1_FORCE_RESET __HAL_RCC_LPTIM1_FORCE_RESET -#define __LPTIM1_RELEASE_RESET __HAL_RCC_LPTIM1_RELEASE_RESET -#define __LPTIM2_CLK_DISABLE __HAL_RCC_LPTIM2_CLK_DISABLE -#define __LPTIM2_CLK_ENABLE __HAL_RCC_LPTIM2_CLK_ENABLE -#define __LPTIM2_CLK_SLEEP_DISABLE __HAL_RCC_LPTIM2_CLK_SLEEP_DISABLE -#define __LPTIM2_CLK_SLEEP_ENABLE __HAL_RCC_LPTIM2_CLK_SLEEP_ENABLE -#define __LPTIM2_FORCE_RESET __HAL_RCC_LPTIM2_FORCE_RESET -#define __LPTIM2_RELEASE_RESET __HAL_RCC_LPTIM2_RELEASE_RESET -#define __LPUART1_CLK_DISABLE __HAL_RCC_LPUART1_CLK_DISABLE -#define __LPUART1_CLK_ENABLE __HAL_RCC_LPUART1_CLK_ENABLE -#define __LPUART1_CLK_SLEEP_DISABLE __HAL_RCC_LPUART1_CLK_SLEEP_DISABLE -#define __LPUART1_CLK_SLEEP_ENABLE __HAL_RCC_LPUART1_CLK_SLEEP_ENABLE -#define __LPUART1_FORCE_RESET __HAL_RCC_LPUART1_FORCE_RESET -#define __LPUART1_RELEASE_RESET __HAL_RCC_LPUART1_RELEASE_RESET -#define __OPAMP_CLK_DISABLE __HAL_RCC_OPAMP_CLK_DISABLE -#define __OPAMP_CLK_ENABLE __HAL_RCC_OPAMP_CLK_ENABLE -#define __OPAMP_CLK_SLEEP_DISABLE __HAL_RCC_OPAMP_CLK_SLEEP_DISABLE -#define __OPAMP_CLK_SLEEP_ENABLE __HAL_RCC_OPAMP_CLK_SLEEP_ENABLE -#define __OPAMP_FORCE_RESET __HAL_RCC_OPAMP_FORCE_RESET -#define __OPAMP_RELEASE_RESET __HAL_RCC_OPAMP_RELEASE_RESET -#define __OTGFS_CLK_DISABLE __HAL_RCC_OTGFS_CLK_DISABLE -#define __OTGFS_CLK_ENABLE __HAL_RCC_OTGFS_CLK_ENABLE -#define __OTGFS_CLK_SLEEP_DISABLE __HAL_RCC_OTGFS_CLK_SLEEP_DISABLE -#define __OTGFS_CLK_SLEEP_ENABLE __HAL_RCC_OTGFS_CLK_SLEEP_ENABLE -#define __OTGFS_FORCE_RESET __HAL_RCC_OTGFS_FORCE_RESET -#define __OTGFS_RELEASE_RESET __HAL_RCC_OTGFS_RELEASE_RESET -#define __PWR_CLK_DISABLE __HAL_RCC_PWR_CLK_DISABLE -#define __PWR_CLK_ENABLE __HAL_RCC_PWR_CLK_ENABLE -#define __PWR_CLK_SLEEP_DISABLE __HAL_RCC_PWR_CLK_SLEEP_DISABLE -#define __PWR_CLK_SLEEP_ENABLE __HAL_RCC_PWR_CLK_SLEEP_ENABLE -#define __PWR_FORCE_RESET __HAL_RCC_PWR_FORCE_RESET -#define __PWR_RELEASE_RESET __HAL_RCC_PWR_RELEASE_RESET -#define __QSPI_CLK_DISABLE __HAL_RCC_QSPI_CLK_DISABLE -#define __QSPI_CLK_ENABLE __HAL_RCC_QSPI_CLK_ENABLE -#define __QSPI_CLK_SLEEP_DISABLE __HAL_RCC_QSPI_CLK_SLEEP_DISABLE -#define __QSPI_CLK_SLEEP_ENABLE __HAL_RCC_QSPI_CLK_SLEEP_ENABLE -#define __QSPI_FORCE_RESET __HAL_RCC_QSPI_FORCE_RESET -#define __QSPI_RELEASE_RESET __HAL_RCC_QSPI_RELEASE_RESET - -#if defined(STM32WB) -#define __HAL_RCC_QSPI_CLK_DISABLE __HAL_RCC_QUADSPI_CLK_DISABLE -#define __HAL_RCC_QSPI_CLK_ENABLE __HAL_RCC_QUADSPI_CLK_ENABLE -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE __HAL_RCC_QUADSPI_CLK_SLEEP_DISABLE -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE __HAL_RCC_QUADSPI_CLK_SLEEP_ENABLE -#define __HAL_RCC_QSPI_FORCE_RESET __HAL_RCC_QUADSPI_FORCE_RESET -#define __HAL_RCC_QSPI_RELEASE_RESET __HAL_RCC_QUADSPI_RELEASE_RESET -#define __HAL_RCC_QSPI_IS_CLK_ENABLED __HAL_RCC_QUADSPI_IS_CLK_ENABLED -#define __HAL_RCC_QSPI_IS_CLK_DISABLED __HAL_RCC_QUADSPI_IS_CLK_DISABLED -#define __HAL_RCC_QSPI_IS_CLK_SLEEP_ENABLED __HAL_RCC_QUADSPI_IS_CLK_SLEEP_ENABLED -#define __HAL_RCC_QSPI_IS_CLK_SLEEP_DISABLED __HAL_RCC_QUADSPI_IS_CLK_SLEEP_DISABLED -#define QSPI_IRQHandler QUADSPI_IRQHandler -#endif /* __HAL_RCC_QUADSPI_CLK_ENABLE */ - -#define __RNG_CLK_DISABLE __HAL_RCC_RNG_CLK_DISABLE -#define __RNG_CLK_ENABLE __HAL_RCC_RNG_CLK_ENABLE -#define __RNG_CLK_SLEEP_DISABLE __HAL_RCC_RNG_CLK_SLEEP_DISABLE -#define __RNG_CLK_SLEEP_ENABLE __HAL_RCC_RNG_CLK_SLEEP_ENABLE -#define __RNG_FORCE_RESET __HAL_RCC_RNG_FORCE_RESET -#define __RNG_RELEASE_RESET __HAL_RCC_RNG_RELEASE_RESET -#define __SAI1_CLK_DISABLE __HAL_RCC_SAI1_CLK_DISABLE -#define __SAI1_CLK_ENABLE __HAL_RCC_SAI1_CLK_ENABLE -#define __SAI1_CLK_SLEEP_DISABLE __HAL_RCC_SAI1_CLK_SLEEP_DISABLE -#define __SAI1_CLK_SLEEP_ENABLE __HAL_RCC_SAI1_CLK_SLEEP_ENABLE -#define __SAI1_FORCE_RESET __HAL_RCC_SAI1_FORCE_RESET -#define __SAI1_RELEASE_RESET __HAL_RCC_SAI1_RELEASE_RESET -#define __SAI2_CLK_DISABLE __HAL_RCC_SAI2_CLK_DISABLE -#define __SAI2_CLK_ENABLE __HAL_RCC_SAI2_CLK_ENABLE -#define __SAI2_CLK_SLEEP_DISABLE __HAL_RCC_SAI2_CLK_SLEEP_DISABLE -#define __SAI2_CLK_SLEEP_ENABLE __HAL_RCC_SAI2_CLK_SLEEP_ENABLE -#define __SAI2_FORCE_RESET __HAL_RCC_SAI2_FORCE_RESET -#define __SAI2_RELEASE_RESET __HAL_RCC_SAI2_RELEASE_RESET -#define __SDIO_CLK_DISABLE __HAL_RCC_SDIO_CLK_DISABLE -#define __SDIO_CLK_ENABLE __HAL_RCC_SDIO_CLK_ENABLE -#define __SDMMC_CLK_DISABLE __HAL_RCC_SDMMC_CLK_DISABLE -#define __SDMMC_CLK_ENABLE __HAL_RCC_SDMMC_CLK_ENABLE -#define __SDMMC_CLK_SLEEP_DISABLE __HAL_RCC_SDMMC_CLK_SLEEP_DISABLE -#define __SDMMC_CLK_SLEEP_ENABLE __HAL_RCC_SDMMC_CLK_SLEEP_ENABLE -#define __SDMMC_FORCE_RESET __HAL_RCC_SDMMC_FORCE_RESET -#define __SDMMC_RELEASE_RESET __HAL_RCC_SDMMC_RELEASE_RESET -#define __SPI1_CLK_DISABLE __HAL_RCC_SPI1_CLK_DISABLE -#define __SPI1_CLK_ENABLE __HAL_RCC_SPI1_CLK_ENABLE -#define __SPI1_CLK_SLEEP_DISABLE __HAL_RCC_SPI1_CLK_SLEEP_DISABLE -#define __SPI1_CLK_SLEEP_ENABLE __HAL_RCC_SPI1_CLK_SLEEP_ENABLE -#define __SPI1_FORCE_RESET __HAL_RCC_SPI1_FORCE_RESET -#define __SPI1_RELEASE_RESET __HAL_RCC_SPI1_RELEASE_RESET -#define __SPI2_CLK_DISABLE __HAL_RCC_SPI2_CLK_DISABLE -#define __SPI2_CLK_ENABLE __HAL_RCC_SPI2_CLK_ENABLE -#define __SPI2_CLK_SLEEP_DISABLE __HAL_RCC_SPI2_CLK_SLEEP_DISABLE -#define __SPI2_CLK_SLEEP_ENABLE __HAL_RCC_SPI2_CLK_SLEEP_ENABLE -#define __SPI2_FORCE_RESET __HAL_RCC_SPI2_FORCE_RESET -#define __SPI2_RELEASE_RESET __HAL_RCC_SPI2_RELEASE_RESET -#define __SPI3_CLK_DISABLE __HAL_RCC_SPI3_CLK_DISABLE -#define __SPI3_CLK_ENABLE __HAL_RCC_SPI3_CLK_ENABLE -#define __SPI3_CLK_SLEEP_DISABLE __HAL_RCC_SPI3_CLK_SLEEP_DISABLE -#define __SPI3_CLK_SLEEP_ENABLE __HAL_RCC_SPI3_CLK_SLEEP_ENABLE -#define __SPI3_FORCE_RESET __HAL_RCC_SPI3_FORCE_RESET -#define __SPI3_RELEASE_RESET __HAL_RCC_SPI3_RELEASE_RESET -#define __SRAM_CLK_DISABLE __HAL_RCC_SRAM_CLK_DISABLE -#define __SRAM_CLK_ENABLE __HAL_RCC_SRAM_CLK_ENABLE -#define __SRAM1_CLK_SLEEP_DISABLE __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE -#define __SRAM1_CLK_SLEEP_ENABLE __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE -#define __SRAM2_CLK_SLEEP_DISABLE __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE -#define __SRAM2_CLK_SLEEP_ENABLE __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE -#define __SWPMI1_CLK_DISABLE __HAL_RCC_SWPMI1_CLK_DISABLE -#define __SWPMI1_CLK_ENABLE __HAL_RCC_SWPMI1_CLK_ENABLE -#define __SWPMI1_CLK_SLEEP_DISABLE __HAL_RCC_SWPMI1_CLK_SLEEP_DISABLE -#define __SWPMI1_CLK_SLEEP_ENABLE __HAL_RCC_SWPMI1_CLK_SLEEP_ENABLE -#define __SWPMI1_FORCE_RESET __HAL_RCC_SWPMI1_FORCE_RESET -#define __SWPMI1_RELEASE_RESET __HAL_RCC_SWPMI1_RELEASE_RESET -#define __SYSCFG_CLK_DISABLE __HAL_RCC_SYSCFG_CLK_DISABLE -#define __SYSCFG_CLK_ENABLE __HAL_RCC_SYSCFG_CLK_ENABLE -#define __SYSCFG_CLK_SLEEP_DISABLE __HAL_RCC_SYSCFG_CLK_SLEEP_DISABLE -#define __SYSCFG_CLK_SLEEP_ENABLE __HAL_RCC_SYSCFG_CLK_SLEEP_ENABLE -#define __SYSCFG_FORCE_RESET __HAL_RCC_SYSCFG_FORCE_RESET -#define __SYSCFG_RELEASE_RESET __HAL_RCC_SYSCFG_RELEASE_RESET -#define __TIM1_CLK_DISABLE __HAL_RCC_TIM1_CLK_DISABLE -#define __TIM1_CLK_ENABLE __HAL_RCC_TIM1_CLK_ENABLE -#define __TIM1_CLK_SLEEP_DISABLE __HAL_RCC_TIM1_CLK_SLEEP_DISABLE -#define __TIM1_CLK_SLEEP_ENABLE __HAL_RCC_TIM1_CLK_SLEEP_ENABLE -#define __TIM1_FORCE_RESET __HAL_RCC_TIM1_FORCE_RESET -#define __TIM1_RELEASE_RESET __HAL_RCC_TIM1_RELEASE_RESET -#define __TIM10_CLK_DISABLE __HAL_RCC_TIM10_CLK_DISABLE -#define __TIM10_CLK_ENABLE __HAL_RCC_TIM10_CLK_ENABLE -#define __TIM10_FORCE_RESET __HAL_RCC_TIM10_FORCE_RESET -#define __TIM10_RELEASE_RESET __HAL_RCC_TIM10_RELEASE_RESET -#define __TIM11_CLK_DISABLE __HAL_RCC_TIM11_CLK_DISABLE -#define __TIM11_CLK_ENABLE __HAL_RCC_TIM11_CLK_ENABLE -#define __TIM11_FORCE_RESET __HAL_RCC_TIM11_FORCE_RESET -#define __TIM11_RELEASE_RESET __HAL_RCC_TIM11_RELEASE_RESET -#define __TIM12_CLK_DISABLE __HAL_RCC_TIM12_CLK_DISABLE -#define __TIM12_CLK_ENABLE __HAL_RCC_TIM12_CLK_ENABLE -#define __TIM12_FORCE_RESET __HAL_RCC_TIM12_FORCE_RESET -#define __TIM12_RELEASE_RESET __HAL_RCC_TIM12_RELEASE_RESET -#define __TIM13_CLK_DISABLE __HAL_RCC_TIM13_CLK_DISABLE -#define __TIM13_CLK_ENABLE __HAL_RCC_TIM13_CLK_ENABLE -#define __TIM13_FORCE_RESET __HAL_RCC_TIM13_FORCE_RESET -#define __TIM13_RELEASE_RESET __HAL_RCC_TIM13_RELEASE_RESET -#define __TIM14_CLK_DISABLE __HAL_RCC_TIM14_CLK_DISABLE -#define __TIM14_CLK_ENABLE __HAL_RCC_TIM14_CLK_ENABLE -#define __TIM14_FORCE_RESET __HAL_RCC_TIM14_FORCE_RESET -#define __TIM14_RELEASE_RESET __HAL_RCC_TIM14_RELEASE_RESET -#define __TIM15_CLK_DISABLE __HAL_RCC_TIM15_CLK_DISABLE -#define __TIM15_CLK_ENABLE __HAL_RCC_TIM15_CLK_ENABLE -#define __TIM15_CLK_SLEEP_DISABLE __HAL_RCC_TIM15_CLK_SLEEP_DISABLE -#define __TIM15_CLK_SLEEP_ENABLE __HAL_RCC_TIM15_CLK_SLEEP_ENABLE -#define __TIM15_FORCE_RESET __HAL_RCC_TIM15_FORCE_RESET -#define __TIM15_RELEASE_RESET __HAL_RCC_TIM15_RELEASE_RESET -#define __TIM16_CLK_DISABLE __HAL_RCC_TIM16_CLK_DISABLE -#define __TIM16_CLK_ENABLE __HAL_RCC_TIM16_CLK_ENABLE -#define __TIM16_CLK_SLEEP_DISABLE __HAL_RCC_TIM16_CLK_SLEEP_DISABLE -#define __TIM16_CLK_SLEEP_ENABLE __HAL_RCC_TIM16_CLK_SLEEP_ENABLE -#define __TIM16_FORCE_RESET __HAL_RCC_TIM16_FORCE_RESET -#define __TIM16_RELEASE_RESET __HAL_RCC_TIM16_RELEASE_RESET -#define __TIM17_CLK_DISABLE __HAL_RCC_TIM17_CLK_DISABLE -#define __TIM17_CLK_ENABLE __HAL_RCC_TIM17_CLK_ENABLE -#define __TIM17_CLK_SLEEP_DISABLE __HAL_RCC_TIM17_CLK_SLEEP_DISABLE -#define __TIM17_CLK_SLEEP_ENABLE __HAL_RCC_TIM17_CLK_SLEEP_ENABLE -#define __TIM17_FORCE_RESET __HAL_RCC_TIM17_FORCE_RESET -#define __TIM17_RELEASE_RESET __HAL_RCC_TIM17_RELEASE_RESET -#define __TIM2_CLK_DISABLE __HAL_RCC_TIM2_CLK_DISABLE -#define __TIM2_CLK_ENABLE __HAL_RCC_TIM2_CLK_ENABLE -#define __TIM2_CLK_SLEEP_DISABLE __HAL_RCC_TIM2_CLK_SLEEP_DISABLE -#define __TIM2_CLK_SLEEP_ENABLE __HAL_RCC_TIM2_CLK_SLEEP_ENABLE -#define __TIM2_FORCE_RESET __HAL_RCC_TIM2_FORCE_RESET -#define __TIM2_RELEASE_RESET __HAL_RCC_TIM2_RELEASE_RESET -#define __TIM3_CLK_DISABLE __HAL_RCC_TIM3_CLK_DISABLE -#define __TIM3_CLK_ENABLE __HAL_RCC_TIM3_CLK_ENABLE -#define __TIM3_CLK_SLEEP_DISABLE __HAL_RCC_TIM3_CLK_SLEEP_DISABLE -#define __TIM3_CLK_SLEEP_ENABLE __HAL_RCC_TIM3_CLK_SLEEP_ENABLE -#define __TIM3_FORCE_RESET __HAL_RCC_TIM3_FORCE_RESET -#define __TIM3_RELEASE_RESET __HAL_RCC_TIM3_RELEASE_RESET -#define __TIM4_CLK_DISABLE __HAL_RCC_TIM4_CLK_DISABLE -#define __TIM4_CLK_ENABLE __HAL_RCC_TIM4_CLK_ENABLE -#define __TIM4_CLK_SLEEP_DISABLE __HAL_RCC_TIM4_CLK_SLEEP_DISABLE -#define __TIM4_CLK_SLEEP_ENABLE __HAL_RCC_TIM4_CLK_SLEEP_ENABLE -#define __TIM4_FORCE_RESET __HAL_RCC_TIM4_FORCE_RESET -#define __TIM4_RELEASE_RESET __HAL_RCC_TIM4_RELEASE_RESET -#define __TIM5_CLK_DISABLE __HAL_RCC_TIM5_CLK_DISABLE -#define __TIM5_CLK_ENABLE __HAL_RCC_TIM5_CLK_ENABLE -#define __TIM5_CLK_SLEEP_DISABLE __HAL_RCC_TIM5_CLK_SLEEP_DISABLE -#define __TIM5_CLK_SLEEP_ENABLE __HAL_RCC_TIM5_CLK_SLEEP_ENABLE -#define __TIM5_FORCE_RESET __HAL_RCC_TIM5_FORCE_RESET -#define __TIM5_RELEASE_RESET __HAL_RCC_TIM5_RELEASE_RESET -#define __TIM6_CLK_DISABLE __HAL_RCC_TIM6_CLK_DISABLE -#define __TIM6_CLK_ENABLE __HAL_RCC_TIM6_CLK_ENABLE -#define __TIM6_CLK_SLEEP_DISABLE __HAL_RCC_TIM6_CLK_SLEEP_DISABLE -#define __TIM6_CLK_SLEEP_ENABLE __HAL_RCC_TIM6_CLK_SLEEP_ENABLE -#define __TIM6_FORCE_RESET __HAL_RCC_TIM6_FORCE_RESET -#define __TIM6_RELEASE_RESET __HAL_RCC_TIM6_RELEASE_RESET -#define __TIM7_CLK_DISABLE __HAL_RCC_TIM7_CLK_DISABLE -#define __TIM7_CLK_ENABLE __HAL_RCC_TIM7_CLK_ENABLE -#define __TIM7_CLK_SLEEP_DISABLE __HAL_RCC_TIM7_CLK_SLEEP_DISABLE -#define __TIM7_CLK_SLEEP_ENABLE __HAL_RCC_TIM7_CLK_SLEEP_ENABLE -#define __TIM7_FORCE_RESET __HAL_RCC_TIM7_FORCE_RESET -#define __TIM7_RELEASE_RESET __HAL_RCC_TIM7_RELEASE_RESET -#define __TIM8_CLK_DISABLE __HAL_RCC_TIM8_CLK_DISABLE -#define __TIM8_CLK_ENABLE __HAL_RCC_TIM8_CLK_ENABLE -#define __TIM8_CLK_SLEEP_DISABLE __HAL_RCC_TIM8_CLK_SLEEP_DISABLE -#define __TIM8_CLK_SLEEP_ENABLE __HAL_RCC_TIM8_CLK_SLEEP_ENABLE -#define __TIM8_FORCE_RESET __HAL_RCC_TIM8_FORCE_RESET -#define __TIM8_RELEASE_RESET __HAL_RCC_TIM8_RELEASE_RESET -#define __TIM9_CLK_DISABLE __HAL_RCC_TIM9_CLK_DISABLE -#define __TIM9_CLK_ENABLE __HAL_RCC_TIM9_CLK_ENABLE -#define __TIM9_FORCE_RESET __HAL_RCC_TIM9_FORCE_RESET -#define __TIM9_RELEASE_RESET __HAL_RCC_TIM9_RELEASE_RESET -#define __TSC_CLK_DISABLE __HAL_RCC_TSC_CLK_DISABLE -#define __TSC_CLK_ENABLE __HAL_RCC_TSC_CLK_ENABLE -#define __TSC_CLK_SLEEP_DISABLE __HAL_RCC_TSC_CLK_SLEEP_DISABLE -#define __TSC_CLK_SLEEP_ENABLE __HAL_RCC_TSC_CLK_SLEEP_ENABLE -#define __TSC_FORCE_RESET __HAL_RCC_TSC_FORCE_RESET -#define __TSC_RELEASE_RESET __HAL_RCC_TSC_RELEASE_RESET -#define __UART4_CLK_DISABLE __HAL_RCC_UART4_CLK_DISABLE -#define __UART4_CLK_ENABLE __HAL_RCC_UART4_CLK_ENABLE -#define __UART4_CLK_SLEEP_DISABLE __HAL_RCC_UART4_CLK_SLEEP_DISABLE -#define __UART4_CLK_SLEEP_ENABLE __HAL_RCC_UART4_CLK_SLEEP_ENABLE -#define __UART4_FORCE_RESET __HAL_RCC_UART4_FORCE_RESET -#define __UART4_RELEASE_RESET __HAL_RCC_UART4_RELEASE_RESET -#define __UART5_CLK_DISABLE __HAL_RCC_UART5_CLK_DISABLE -#define __UART5_CLK_ENABLE __HAL_RCC_UART5_CLK_ENABLE -#define __UART5_CLK_SLEEP_DISABLE __HAL_RCC_UART5_CLK_SLEEP_DISABLE -#define __UART5_CLK_SLEEP_ENABLE __HAL_RCC_UART5_CLK_SLEEP_ENABLE -#define __UART5_FORCE_RESET __HAL_RCC_UART5_FORCE_RESET -#define __UART5_RELEASE_RESET __HAL_RCC_UART5_RELEASE_RESET -#define __USART1_CLK_DISABLE __HAL_RCC_USART1_CLK_DISABLE -#define __USART1_CLK_ENABLE __HAL_RCC_USART1_CLK_ENABLE -#define __USART1_CLK_SLEEP_DISABLE __HAL_RCC_USART1_CLK_SLEEP_DISABLE -#define __USART1_CLK_SLEEP_ENABLE __HAL_RCC_USART1_CLK_SLEEP_ENABLE -#define __USART1_FORCE_RESET __HAL_RCC_USART1_FORCE_RESET -#define __USART1_RELEASE_RESET __HAL_RCC_USART1_RELEASE_RESET -#define __USART2_CLK_DISABLE __HAL_RCC_USART2_CLK_DISABLE -#define __USART2_CLK_ENABLE __HAL_RCC_USART2_CLK_ENABLE -#define __USART2_CLK_SLEEP_DISABLE __HAL_RCC_USART2_CLK_SLEEP_DISABLE -#define __USART2_CLK_SLEEP_ENABLE __HAL_RCC_USART2_CLK_SLEEP_ENABLE -#define __USART2_FORCE_RESET __HAL_RCC_USART2_FORCE_RESET -#define __USART2_RELEASE_RESET __HAL_RCC_USART2_RELEASE_RESET -#define __USART3_CLK_DISABLE __HAL_RCC_USART3_CLK_DISABLE -#define __USART3_CLK_ENABLE __HAL_RCC_USART3_CLK_ENABLE -#define __USART3_CLK_SLEEP_DISABLE __HAL_RCC_USART3_CLK_SLEEP_DISABLE -#define __USART3_CLK_SLEEP_ENABLE __HAL_RCC_USART3_CLK_SLEEP_ENABLE -#define __USART3_FORCE_RESET __HAL_RCC_USART3_FORCE_RESET -#define __USART3_RELEASE_RESET __HAL_RCC_USART3_RELEASE_RESET -#define __USART4_CLK_DISABLE __HAL_RCC_UART4_CLK_DISABLE -#define __USART4_CLK_ENABLE __HAL_RCC_UART4_CLK_ENABLE -#define __USART4_CLK_SLEEP_ENABLE __HAL_RCC_UART4_CLK_SLEEP_ENABLE -#define __USART4_CLK_SLEEP_DISABLE __HAL_RCC_UART4_CLK_SLEEP_DISABLE -#define __USART4_FORCE_RESET __HAL_RCC_UART4_FORCE_RESET -#define __USART4_RELEASE_RESET __HAL_RCC_UART4_RELEASE_RESET -#define __USART5_CLK_DISABLE __HAL_RCC_UART5_CLK_DISABLE -#define __USART5_CLK_ENABLE __HAL_RCC_UART5_CLK_ENABLE -#define __USART5_CLK_SLEEP_ENABLE __HAL_RCC_UART5_CLK_SLEEP_ENABLE -#define __USART5_CLK_SLEEP_DISABLE __HAL_RCC_UART5_CLK_SLEEP_DISABLE -#define __USART5_FORCE_RESET __HAL_RCC_UART5_FORCE_RESET -#define __USART5_RELEASE_RESET __HAL_RCC_UART5_RELEASE_RESET -#define __USART7_CLK_DISABLE __HAL_RCC_UART7_CLK_DISABLE -#define __USART7_CLK_ENABLE __HAL_RCC_UART7_CLK_ENABLE -#define __USART7_FORCE_RESET __HAL_RCC_UART7_FORCE_RESET -#define __USART7_RELEASE_RESET __HAL_RCC_UART7_RELEASE_RESET -#define __USART8_CLK_DISABLE __HAL_RCC_UART8_CLK_DISABLE -#define __USART8_CLK_ENABLE __HAL_RCC_UART8_CLK_ENABLE -#define __USART8_FORCE_RESET __HAL_RCC_UART8_FORCE_RESET -#define __USART8_RELEASE_RESET __HAL_RCC_UART8_RELEASE_RESET -#define __USB_CLK_DISABLE __HAL_RCC_USB_CLK_DISABLE -#define __USB_CLK_ENABLE __HAL_RCC_USB_CLK_ENABLE -#define __USB_FORCE_RESET __HAL_RCC_USB_FORCE_RESET -#define __USB_CLK_SLEEP_ENABLE __HAL_RCC_USB_CLK_SLEEP_ENABLE -#define __USB_CLK_SLEEP_DISABLE __HAL_RCC_USB_CLK_SLEEP_DISABLE -#define __USB_OTG_FS_CLK_DISABLE __HAL_RCC_USB_OTG_FS_CLK_DISABLE -#define __USB_OTG_FS_CLK_ENABLE __HAL_RCC_USB_OTG_FS_CLK_ENABLE -#define __USB_RELEASE_RESET __HAL_RCC_USB_RELEASE_RESET - -#if defined(STM32H7) -#define __HAL_RCC_WWDG_CLK_DISABLE __HAL_RCC_WWDG1_CLK_DISABLE -#define __HAL_RCC_WWDG_CLK_ENABLE __HAL_RCC_WWDG1_CLK_ENABLE -#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG1_CLK_SLEEP_DISABLE -#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG1_CLK_SLEEP_ENABLE - -#define __HAL_RCC_WWDG_FORCE_RESET ((void)0U) /* Not available on the STM32H7*/ -#define __HAL_RCC_WWDG_RELEASE_RESET ((void)0U) /* Not available on the STM32H7*/ - - -#define __HAL_RCC_WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG1_IS_CLK_ENABLED -#define __HAL_RCC_WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG1_IS_CLK_DISABLED -#define RCC_SPI4CLKSOURCE_D2PCLK1 RCC_SPI4CLKSOURCE_D2PCLK2 -#define RCC_SPI5CLKSOURCE_D2PCLK1 RCC_SPI5CLKSOURCE_D2PCLK2 -#define RCC_SPI45CLKSOURCE_D2PCLK1 RCC_SPI45CLKSOURCE_D2PCLK2 -#define RCC_SPI45CLKSOURCE_CDPCLK1 RCC_SPI45CLKSOURCE_CDPCLK2 -#define RCC_SPI45CLKSOURCE_PCLK1 RCC_SPI45CLKSOURCE_PCLK2 -#endif - -#define __WWDG_CLK_DISABLE __HAL_RCC_WWDG_CLK_DISABLE -#define __WWDG_CLK_ENABLE __HAL_RCC_WWDG_CLK_ENABLE -#define __WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG_CLK_SLEEP_DISABLE -#define __WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG_CLK_SLEEP_ENABLE -#define __WWDG_FORCE_RESET __HAL_RCC_WWDG_FORCE_RESET -#define __WWDG_RELEASE_RESET __HAL_RCC_WWDG_RELEASE_RESET - -#define __TIM21_CLK_ENABLE __HAL_RCC_TIM21_CLK_ENABLE -#define __TIM21_CLK_DISABLE __HAL_RCC_TIM21_CLK_DISABLE -#define __TIM21_FORCE_RESET __HAL_RCC_TIM21_FORCE_RESET -#define __TIM21_RELEASE_RESET __HAL_RCC_TIM21_RELEASE_RESET -#define __TIM21_CLK_SLEEP_ENABLE __HAL_RCC_TIM21_CLK_SLEEP_ENABLE -#define __TIM21_CLK_SLEEP_DISABLE __HAL_RCC_TIM21_CLK_SLEEP_DISABLE -#define __TIM22_CLK_ENABLE __HAL_RCC_TIM22_CLK_ENABLE -#define __TIM22_CLK_DISABLE __HAL_RCC_TIM22_CLK_DISABLE -#define __TIM22_FORCE_RESET __HAL_RCC_TIM22_FORCE_RESET -#define __TIM22_RELEASE_RESET __HAL_RCC_TIM22_RELEASE_RESET -#define __TIM22_CLK_SLEEP_ENABLE __HAL_RCC_TIM22_CLK_SLEEP_ENABLE -#define __TIM22_CLK_SLEEP_DISABLE __HAL_RCC_TIM22_CLK_SLEEP_DISABLE -#define __CRS_CLK_DISABLE __HAL_RCC_CRS_CLK_DISABLE -#define __CRS_CLK_ENABLE __HAL_RCC_CRS_CLK_ENABLE -#define __CRS_CLK_SLEEP_DISABLE __HAL_RCC_CRS_CLK_SLEEP_DISABLE -#define __CRS_CLK_SLEEP_ENABLE __HAL_RCC_CRS_CLK_SLEEP_ENABLE -#define __CRS_FORCE_RESET __HAL_RCC_CRS_FORCE_RESET -#define __CRS_RELEASE_RESET __HAL_RCC_CRS_RELEASE_RESET -#define __RCC_BACKUPRESET_FORCE __HAL_RCC_BACKUPRESET_FORCE -#define __RCC_BACKUPRESET_RELEASE __HAL_RCC_BACKUPRESET_RELEASE - -#define __USB_OTG_FS_FORCE_RESET __HAL_RCC_USB_OTG_FS_FORCE_RESET -#define __USB_OTG_FS_RELEASE_RESET __HAL_RCC_USB_OTG_FS_RELEASE_RESET -#define __USB_OTG_FS_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE -#define __USB_OTG_FS_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE -#define __USB_OTG_HS_CLK_DISABLE __HAL_RCC_USB_OTG_HS_CLK_DISABLE -#define __USB_OTG_HS_CLK_ENABLE __HAL_RCC_USB_OTG_HS_CLK_ENABLE -#define __USB_OTG_HS_ULPI_CLK_ENABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE -#define __USB_OTG_HS_ULPI_CLK_DISABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE -#define __TIM9_CLK_SLEEP_ENABLE __HAL_RCC_TIM9_CLK_SLEEP_ENABLE -#define __TIM9_CLK_SLEEP_DISABLE __HAL_RCC_TIM9_CLK_SLEEP_DISABLE -#define __TIM10_CLK_SLEEP_ENABLE __HAL_RCC_TIM10_CLK_SLEEP_ENABLE -#define __TIM10_CLK_SLEEP_DISABLE __HAL_RCC_TIM10_CLK_SLEEP_DISABLE -#define __TIM11_CLK_SLEEP_ENABLE __HAL_RCC_TIM11_CLK_SLEEP_ENABLE -#define __TIM11_CLK_SLEEP_DISABLE __HAL_RCC_TIM11_CLK_SLEEP_DISABLE -#define __ETHMACPTP_CLK_SLEEP_ENABLE __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE -#define __ETHMACPTP_CLK_SLEEP_DISABLE __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE -#define __ETHMACPTP_CLK_ENABLE __HAL_RCC_ETHMACPTP_CLK_ENABLE -#define __ETHMACPTP_CLK_DISABLE __HAL_RCC_ETHMACPTP_CLK_DISABLE -#define __HASH_CLK_ENABLE __HAL_RCC_HASH_CLK_ENABLE -#define __HASH_FORCE_RESET __HAL_RCC_HASH_FORCE_RESET -#define __HASH_RELEASE_RESET __HAL_RCC_HASH_RELEASE_RESET -#define __HASH_CLK_SLEEP_ENABLE __HAL_RCC_HASH_CLK_SLEEP_ENABLE -#define __HASH_CLK_SLEEP_DISABLE __HAL_RCC_HASH_CLK_SLEEP_DISABLE -#define __HASH_CLK_DISABLE __HAL_RCC_HASH_CLK_DISABLE -#define __SPI5_CLK_ENABLE __HAL_RCC_SPI5_CLK_ENABLE -#define __SPI5_CLK_DISABLE __HAL_RCC_SPI5_CLK_DISABLE -#define __SPI5_FORCE_RESET __HAL_RCC_SPI5_FORCE_RESET -#define __SPI5_RELEASE_RESET __HAL_RCC_SPI5_RELEASE_RESET -#define __SPI5_CLK_SLEEP_ENABLE __HAL_RCC_SPI5_CLK_SLEEP_ENABLE -#define __SPI5_CLK_SLEEP_DISABLE __HAL_RCC_SPI5_CLK_SLEEP_DISABLE -#define __SPI6_CLK_ENABLE __HAL_RCC_SPI6_CLK_ENABLE -#define __SPI6_CLK_DISABLE __HAL_RCC_SPI6_CLK_DISABLE -#define __SPI6_FORCE_RESET __HAL_RCC_SPI6_FORCE_RESET -#define __SPI6_RELEASE_RESET __HAL_RCC_SPI6_RELEASE_RESET -#define __SPI6_CLK_SLEEP_ENABLE __HAL_RCC_SPI6_CLK_SLEEP_ENABLE -#define __SPI6_CLK_SLEEP_DISABLE __HAL_RCC_SPI6_CLK_SLEEP_DISABLE -#define __LTDC_CLK_ENABLE __HAL_RCC_LTDC_CLK_ENABLE -#define __LTDC_CLK_DISABLE __HAL_RCC_LTDC_CLK_DISABLE -#define __LTDC_FORCE_RESET __HAL_RCC_LTDC_FORCE_RESET -#define __LTDC_RELEASE_RESET __HAL_RCC_LTDC_RELEASE_RESET -#define __LTDC_CLK_SLEEP_ENABLE __HAL_RCC_LTDC_CLK_SLEEP_ENABLE -#define __ETHMAC_CLK_SLEEP_ENABLE __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE -#define __ETHMAC_CLK_SLEEP_DISABLE __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE -#define __ETHMACTX_CLK_SLEEP_ENABLE __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE -#define __ETHMACTX_CLK_SLEEP_DISABLE __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE -#define __ETHMACRX_CLK_SLEEP_ENABLE __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE -#define __ETHMACRX_CLK_SLEEP_DISABLE __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE -#define __TIM12_CLK_SLEEP_ENABLE __HAL_RCC_TIM12_CLK_SLEEP_ENABLE -#define __TIM12_CLK_SLEEP_DISABLE __HAL_RCC_TIM12_CLK_SLEEP_DISABLE -#define __TIM13_CLK_SLEEP_ENABLE __HAL_RCC_TIM13_CLK_SLEEP_ENABLE -#define __TIM13_CLK_SLEEP_DISABLE __HAL_RCC_TIM13_CLK_SLEEP_DISABLE -#define __TIM14_CLK_SLEEP_ENABLE __HAL_RCC_TIM14_CLK_SLEEP_ENABLE -#define __TIM14_CLK_SLEEP_DISABLE __HAL_RCC_TIM14_CLK_SLEEP_DISABLE -#define __BKPSRAM_CLK_ENABLE __HAL_RCC_BKPSRAM_CLK_ENABLE -#define __BKPSRAM_CLK_DISABLE __HAL_RCC_BKPSRAM_CLK_DISABLE -#define __BKPSRAM_CLK_SLEEP_ENABLE __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE -#define __BKPSRAM_CLK_SLEEP_DISABLE __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE -#define __CCMDATARAMEN_CLK_ENABLE __HAL_RCC_CCMDATARAMEN_CLK_ENABLE -#define __CCMDATARAMEN_CLK_DISABLE __HAL_RCC_CCMDATARAMEN_CLK_DISABLE -#define __USART6_CLK_ENABLE __HAL_RCC_USART6_CLK_ENABLE -#define __USART6_CLK_DISABLE __HAL_RCC_USART6_CLK_DISABLE -#define __USART6_FORCE_RESET __HAL_RCC_USART6_FORCE_RESET -#define __USART6_RELEASE_RESET __HAL_RCC_USART6_RELEASE_RESET -#define __USART6_CLK_SLEEP_ENABLE __HAL_RCC_USART6_CLK_SLEEP_ENABLE -#define __USART6_CLK_SLEEP_DISABLE __HAL_RCC_USART6_CLK_SLEEP_DISABLE -#define __SPI4_CLK_ENABLE __HAL_RCC_SPI4_CLK_ENABLE -#define __SPI4_CLK_DISABLE __HAL_RCC_SPI4_CLK_DISABLE -#define __SPI4_FORCE_RESET __HAL_RCC_SPI4_FORCE_RESET -#define __SPI4_RELEASE_RESET __HAL_RCC_SPI4_RELEASE_RESET -#define __SPI4_CLK_SLEEP_ENABLE __HAL_RCC_SPI4_CLK_SLEEP_ENABLE -#define __SPI4_CLK_SLEEP_DISABLE __HAL_RCC_SPI4_CLK_SLEEP_DISABLE -#define __GPIOI_CLK_ENABLE __HAL_RCC_GPIOI_CLK_ENABLE -#define __GPIOI_CLK_DISABLE __HAL_RCC_GPIOI_CLK_DISABLE -#define __GPIOI_FORCE_RESET __HAL_RCC_GPIOI_FORCE_RESET -#define __GPIOI_RELEASE_RESET __HAL_RCC_GPIOI_RELEASE_RESET -#define __GPIOI_CLK_SLEEP_ENABLE __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE -#define __GPIOI_CLK_SLEEP_DISABLE __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE -#define __GPIOJ_CLK_ENABLE __HAL_RCC_GPIOJ_CLK_ENABLE -#define __GPIOJ_CLK_DISABLE __HAL_RCC_GPIOJ_CLK_DISABLE -#define __GPIOJ_FORCE_RESET __HAL_RCC_GPIOJ_FORCE_RESET -#define __GPIOJ_RELEASE_RESET __HAL_RCC_GPIOJ_RELEASE_RESET -#define __GPIOJ_CLK_SLEEP_ENABLE __HAL_RCC_GPIOJ_CLK_SLEEP_ENABLE -#define __GPIOJ_CLK_SLEEP_DISABLE __HAL_RCC_GPIOJ_CLK_SLEEP_DISABLE -#define __GPIOK_CLK_ENABLE __HAL_RCC_GPIOK_CLK_ENABLE -#define __GPIOK_CLK_DISABLE __HAL_RCC_GPIOK_CLK_DISABLE -#define __GPIOK_RELEASE_RESET __HAL_RCC_GPIOK_RELEASE_RESET -#define __GPIOK_CLK_SLEEP_ENABLE __HAL_RCC_GPIOK_CLK_SLEEP_ENABLE -#define __GPIOK_CLK_SLEEP_DISABLE __HAL_RCC_GPIOK_CLK_SLEEP_DISABLE -#define __ETH_CLK_ENABLE __HAL_RCC_ETH_CLK_ENABLE -#define __ETH_CLK_DISABLE __HAL_RCC_ETH_CLK_DISABLE -#define __DCMI_CLK_ENABLE __HAL_RCC_DCMI_CLK_ENABLE -#define __DCMI_CLK_DISABLE __HAL_RCC_DCMI_CLK_DISABLE -#define __DCMI_FORCE_RESET __HAL_RCC_DCMI_FORCE_RESET -#define __DCMI_RELEASE_RESET __HAL_RCC_DCMI_RELEASE_RESET -#define __DCMI_CLK_SLEEP_ENABLE __HAL_RCC_DCMI_CLK_SLEEP_ENABLE -#define __DCMI_CLK_SLEEP_DISABLE __HAL_RCC_DCMI_CLK_SLEEP_DISABLE -#define __UART7_CLK_ENABLE __HAL_RCC_UART7_CLK_ENABLE -#define __UART7_CLK_DISABLE __HAL_RCC_UART7_CLK_DISABLE -#define __UART7_RELEASE_RESET __HAL_RCC_UART7_RELEASE_RESET -#define __UART7_FORCE_RESET __HAL_RCC_UART7_FORCE_RESET -#define __UART7_CLK_SLEEP_ENABLE __HAL_RCC_UART7_CLK_SLEEP_ENABLE -#define __UART7_CLK_SLEEP_DISABLE __HAL_RCC_UART7_CLK_SLEEP_DISABLE -#define __UART8_CLK_ENABLE __HAL_RCC_UART8_CLK_ENABLE -#define __UART8_CLK_DISABLE __HAL_RCC_UART8_CLK_DISABLE -#define __UART8_FORCE_RESET __HAL_RCC_UART8_FORCE_RESET -#define __UART8_RELEASE_RESET __HAL_RCC_UART8_RELEASE_RESET -#define __UART8_CLK_SLEEP_ENABLE __HAL_RCC_UART8_CLK_SLEEP_ENABLE -#define __UART8_CLK_SLEEP_DISABLE __HAL_RCC_UART8_CLK_SLEEP_DISABLE -#define __OTGHS_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE -#define __OTGHS_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE -#define __OTGHS_FORCE_RESET __HAL_RCC_USB_OTG_HS_FORCE_RESET -#define __OTGHS_RELEASE_RESET __HAL_RCC_USB_OTG_HS_RELEASE_RESET -#define __OTGHSULPI_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE -#define __OTGHSULPI_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE -#define __HAL_RCC_OTGHS_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE -#define __HAL_RCC_OTGHS_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE -#define __HAL_RCC_OTGHS_IS_CLK_SLEEP_ENABLED __HAL_RCC_USB_OTG_HS_IS_CLK_SLEEP_ENABLED -#define __HAL_RCC_OTGHS_IS_CLK_SLEEP_DISABLED __HAL_RCC_USB_OTG_HS_IS_CLK_SLEEP_DISABLED -#define __HAL_RCC_OTGHS_FORCE_RESET __HAL_RCC_USB_OTG_HS_FORCE_RESET -#define __HAL_RCC_OTGHS_RELEASE_RESET __HAL_RCC_USB_OTG_HS_RELEASE_RESET -#define __HAL_RCC_OTGHSULPI_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE -#define __HAL_RCC_OTGHSULPI_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE -#define __HAL_RCC_OTGHSULPI_IS_CLK_SLEEP_ENABLED __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_SLEEP_ENABLED -#define __HAL_RCC_OTGHSULPI_IS_CLK_SLEEP_DISABLED __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_SLEEP_DISABLED -#define __SRAM3_CLK_SLEEP_ENABLE __HAL_RCC_SRAM3_CLK_SLEEP_ENABLE -#define __CAN2_CLK_SLEEP_ENABLE __HAL_RCC_CAN2_CLK_SLEEP_ENABLE -#define __CAN2_CLK_SLEEP_DISABLE __HAL_RCC_CAN2_CLK_SLEEP_DISABLE -#define __DAC_CLK_SLEEP_ENABLE __HAL_RCC_DAC_CLK_SLEEP_ENABLE -#define __DAC_CLK_SLEEP_DISABLE __HAL_RCC_DAC_CLK_SLEEP_DISABLE -#define __ADC2_CLK_SLEEP_ENABLE __HAL_RCC_ADC2_CLK_SLEEP_ENABLE -#define __ADC2_CLK_SLEEP_DISABLE __HAL_RCC_ADC2_CLK_SLEEP_DISABLE -#define __ADC3_CLK_SLEEP_ENABLE __HAL_RCC_ADC3_CLK_SLEEP_ENABLE -#define __ADC3_CLK_SLEEP_DISABLE __HAL_RCC_ADC3_CLK_SLEEP_DISABLE -#define __FSMC_FORCE_RESET __HAL_RCC_FSMC_FORCE_RESET -#define __FSMC_RELEASE_RESET __HAL_RCC_FSMC_RELEASE_RESET -#define __FSMC_CLK_SLEEP_ENABLE __HAL_RCC_FSMC_CLK_SLEEP_ENABLE -#define __FSMC_CLK_SLEEP_DISABLE __HAL_RCC_FSMC_CLK_SLEEP_DISABLE -#define __SDIO_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET -#define __SDIO_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET -#define __SDIO_CLK_SLEEP_DISABLE __HAL_RCC_SDIO_CLK_SLEEP_DISABLE -#define __SDIO_CLK_SLEEP_ENABLE __HAL_RCC_SDIO_CLK_SLEEP_ENABLE -#define __DMA2D_CLK_ENABLE __HAL_RCC_DMA2D_CLK_ENABLE -#define __DMA2D_CLK_DISABLE __HAL_RCC_DMA2D_CLK_DISABLE -#define __DMA2D_FORCE_RESET __HAL_RCC_DMA2D_FORCE_RESET -#define __DMA2D_RELEASE_RESET __HAL_RCC_DMA2D_RELEASE_RESET -#define __DMA2D_CLK_SLEEP_ENABLE __HAL_RCC_DMA2D_CLK_SLEEP_ENABLE -#define __DMA2D_CLK_SLEEP_DISABLE __HAL_RCC_DMA2D_CLK_SLEEP_DISABLE - -/* alias define maintained for legacy */ -#define __HAL_RCC_OTGFS_FORCE_RESET __HAL_RCC_USB_OTG_FS_FORCE_RESET -#define __HAL_RCC_OTGFS_RELEASE_RESET __HAL_RCC_USB_OTG_FS_RELEASE_RESET - -#define __ADC12_CLK_ENABLE __HAL_RCC_ADC12_CLK_ENABLE -#define __ADC12_CLK_DISABLE __HAL_RCC_ADC12_CLK_DISABLE -#define __ADC34_CLK_ENABLE __HAL_RCC_ADC34_CLK_ENABLE -#define __ADC34_CLK_DISABLE __HAL_RCC_ADC34_CLK_DISABLE -#define __DAC2_CLK_ENABLE __HAL_RCC_DAC2_CLK_ENABLE -#define __DAC2_CLK_DISABLE __HAL_RCC_DAC2_CLK_DISABLE -#define __TIM18_CLK_ENABLE __HAL_RCC_TIM18_CLK_ENABLE -#define __TIM18_CLK_DISABLE __HAL_RCC_TIM18_CLK_DISABLE -#define __TIM19_CLK_ENABLE __HAL_RCC_TIM19_CLK_ENABLE -#define __TIM19_CLK_DISABLE __HAL_RCC_TIM19_CLK_DISABLE -#define __TIM20_CLK_ENABLE __HAL_RCC_TIM20_CLK_ENABLE -#define __TIM20_CLK_DISABLE __HAL_RCC_TIM20_CLK_DISABLE -#define __HRTIM1_CLK_ENABLE __HAL_RCC_HRTIM1_CLK_ENABLE -#define __HRTIM1_CLK_DISABLE __HAL_RCC_HRTIM1_CLK_DISABLE -#define __SDADC1_CLK_ENABLE __HAL_RCC_SDADC1_CLK_ENABLE -#define __SDADC2_CLK_ENABLE __HAL_RCC_SDADC2_CLK_ENABLE -#define __SDADC3_CLK_ENABLE __HAL_RCC_SDADC3_CLK_ENABLE -#define __SDADC1_CLK_DISABLE __HAL_RCC_SDADC1_CLK_DISABLE -#define __SDADC2_CLK_DISABLE __HAL_RCC_SDADC2_CLK_DISABLE -#define __SDADC3_CLK_DISABLE __HAL_RCC_SDADC3_CLK_DISABLE - -#define __ADC12_FORCE_RESET __HAL_RCC_ADC12_FORCE_RESET -#define __ADC12_RELEASE_RESET __HAL_RCC_ADC12_RELEASE_RESET -#define __ADC34_FORCE_RESET __HAL_RCC_ADC34_FORCE_RESET -#define __ADC34_RELEASE_RESET __HAL_RCC_ADC34_RELEASE_RESET -#define __DAC2_FORCE_RESET __HAL_RCC_DAC2_FORCE_RESET -#define __DAC2_RELEASE_RESET __HAL_RCC_DAC2_RELEASE_RESET -#define __TIM18_FORCE_RESET __HAL_RCC_TIM18_FORCE_RESET -#define __TIM18_RELEASE_RESET __HAL_RCC_TIM18_RELEASE_RESET -#define __TIM19_FORCE_RESET __HAL_RCC_TIM19_FORCE_RESET -#define __TIM19_RELEASE_RESET __HAL_RCC_TIM19_RELEASE_RESET -#define __TIM20_FORCE_RESET __HAL_RCC_TIM20_FORCE_RESET -#define __TIM20_RELEASE_RESET __HAL_RCC_TIM20_RELEASE_RESET -#define __HRTIM1_FORCE_RESET __HAL_RCC_HRTIM1_FORCE_RESET -#define __HRTIM1_RELEASE_RESET __HAL_RCC_HRTIM1_RELEASE_RESET -#define __SDADC1_FORCE_RESET __HAL_RCC_SDADC1_FORCE_RESET -#define __SDADC2_FORCE_RESET __HAL_RCC_SDADC2_FORCE_RESET -#define __SDADC3_FORCE_RESET __HAL_RCC_SDADC3_FORCE_RESET -#define __SDADC1_RELEASE_RESET __HAL_RCC_SDADC1_RELEASE_RESET -#define __SDADC2_RELEASE_RESET __HAL_RCC_SDADC2_RELEASE_RESET -#define __SDADC3_RELEASE_RESET __HAL_RCC_SDADC3_RELEASE_RESET - -#define __ADC1_IS_CLK_ENABLED __HAL_RCC_ADC1_IS_CLK_ENABLED -#define __ADC1_IS_CLK_DISABLED __HAL_RCC_ADC1_IS_CLK_DISABLED -#define __ADC12_IS_CLK_ENABLED __HAL_RCC_ADC12_IS_CLK_ENABLED -#define __ADC12_IS_CLK_DISABLED __HAL_RCC_ADC12_IS_CLK_DISABLED -#define __ADC34_IS_CLK_ENABLED __HAL_RCC_ADC34_IS_CLK_ENABLED -#define __ADC34_IS_CLK_DISABLED __HAL_RCC_ADC34_IS_CLK_DISABLED -#define __CEC_IS_CLK_ENABLED __HAL_RCC_CEC_IS_CLK_ENABLED -#define __CEC_IS_CLK_DISABLED __HAL_RCC_CEC_IS_CLK_DISABLED -#define __CRC_IS_CLK_ENABLED __HAL_RCC_CRC_IS_CLK_ENABLED -#define __CRC_IS_CLK_DISABLED __HAL_RCC_CRC_IS_CLK_DISABLED -#define __DAC1_IS_CLK_ENABLED __HAL_RCC_DAC1_IS_CLK_ENABLED -#define __DAC1_IS_CLK_DISABLED __HAL_RCC_DAC1_IS_CLK_DISABLED -#define __DAC2_IS_CLK_ENABLED __HAL_RCC_DAC2_IS_CLK_ENABLED -#define __DAC2_IS_CLK_DISABLED __HAL_RCC_DAC2_IS_CLK_DISABLED -#define __DMA1_IS_CLK_ENABLED __HAL_RCC_DMA1_IS_CLK_ENABLED -#define __DMA1_IS_CLK_DISABLED __HAL_RCC_DMA1_IS_CLK_DISABLED -#define __DMA2_IS_CLK_ENABLED __HAL_RCC_DMA2_IS_CLK_ENABLED -#define __DMA2_IS_CLK_DISABLED __HAL_RCC_DMA2_IS_CLK_DISABLED -#define __FLITF_IS_CLK_ENABLED __HAL_RCC_FLITF_IS_CLK_ENABLED -#define __FLITF_IS_CLK_DISABLED __HAL_RCC_FLITF_IS_CLK_DISABLED -#define __FMC_IS_CLK_ENABLED __HAL_RCC_FMC_IS_CLK_ENABLED -#define __FMC_IS_CLK_DISABLED __HAL_RCC_FMC_IS_CLK_DISABLED -#define __GPIOA_IS_CLK_ENABLED __HAL_RCC_GPIOA_IS_CLK_ENABLED -#define __GPIOA_IS_CLK_DISABLED __HAL_RCC_GPIOA_IS_CLK_DISABLED -#define __GPIOB_IS_CLK_ENABLED __HAL_RCC_GPIOB_IS_CLK_ENABLED -#define __GPIOB_IS_CLK_DISABLED __HAL_RCC_GPIOB_IS_CLK_DISABLED -#define __GPIOC_IS_CLK_ENABLED __HAL_RCC_GPIOC_IS_CLK_ENABLED -#define __GPIOC_IS_CLK_DISABLED __HAL_RCC_GPIOC_IS_CLK_DISABLED -#define __GPIOD_IS_CLK_ENABLED __HAL_RCC_GPIOD_IS_CLK_ENABLED -#define __GPIOD_IS_CLK_DISABLED __HAL_RCC_GPIOD_IS_CLK_DISABLED -#define __GPIOE_IS_CLK_ENABLED __HAL_RCC_GPIOE_IS_CLK_ENABLED -#define __GPIOE_IS_CLK_DISABLED __HAL_RCC_GPIOE_IS_CLK_DISABLED -#define __GPIOF_IS_CLK_ENABLED __HAL_RCC_GPIOF_IS_CLK_ENABLED -#define __GPIOF_IS_CLK_DISABLED __HAL_RCC_GPIOF_IS_CLK_DISABLED -#define __GPIOG_IS_CLK_ENABLED __HAL_RCC_GPIOG_IS_CLK_ENABLED -#define __GPIOG_IS_CLK_DISABLED __HAL_RCC_GPIOG_IS_CLK_DISABLED -#define __GPIOH_IS_CLK_ENABLED __HAL_RCC_GPIOH_IS_CLK_ENABLED -#define __GPIOH_IS_CLK_DISABLED __HAL_RCC_GPIOH_IS_CLK_DISABLED -#define __HRTIM1_IS_CLK_ENABLED __HAL_RCC_HRTIM1_IS_CLK_ENABLED -#define __HRTIM1_IS_CLK_DISABLED __HAL_RCC_HRTIM1_IS_CLK_DISABLED -#define __I2C1_IS_CLK_ENABLED __HAL_RCC_I2C1_IS_CLK_ENABLED -#define __I2C1_IS_CLK_DISABLED __HAL_RCC_I2C1_IS_CLK_DISABLED -#define __I2C2_IS_CLK_ENABLED __HAL_RCC_I2C2_IS_CLK_ENABLED -#define __I2C2_IS_CLK_DISABLED __HAL_RCC_I2C2_IS_CLK_DISABLED -#define __I2C3_IS_CLK_ENABLED __HAL_RCC_I2C3_IS_CLK_ENABLED -#define __I2C3_IS_CLK_DISABLED __HAL_RCC_I2C3_IS_CLK_DISABLED -#define __PWR_IS_CLK_ENABLED __HAL_RCC_PWR_IS_CLK_ENABLED -#define __PWR_IS_CLK_DISABLED __HAL_RCC_PWR_IS_CLK_DISABLED -#define __SYSCFG_IS_CLK_ENABLED __HAL_RCC_SYSCFG_IS_CLK_ENABLED -#define __SYSCFG_IS_CLK_DISABLED __HAL_RCC_SYSCFG_IS_CLK_DISABLED -#define __SPI1_IS_CLK_ENABLED __HAL_RCC_SPI1_IS_CLK_ENABLED -#define __SPI1_IS_CLK_DISABLED __HAL_RCC_SPI1_IS_CLK_DISABLED -#define __SPI2_IS_CLK_ENABLED __HAL_RCC_SPI2_IS_CLK_ENABLED -#define __SPI2_IS_CLK_DISABLED __HAL_RCC_SPI2_IS_CLK_DISABLED -#define __SPI3_IS_CLK_ENABLED __HAL_RCC_SPI3_IS_CLK_ENABLED -#define __SPI3_IS_CLK_DISABLED __HAL_RCC_SPI3_IS_CLK_DISABLED -#define __SPI4_IS_CLK_ENABLED __HAL_RCC_SPI4_IS_CLK_ENABLED -#define __SPI4_IS_CLK_DISABLED __HAL_RCC_SPI4_IS_CLK_DISABLED -#define __SDADC1_IS_CLK_ENABLED __HAL_RCC_SDADC1_IS_CLK_ENABLED -#define __SDADC1_IS_CLK_DISABLED __HAL_RCC_SDADC1_IS_CLK_DISABLED -#define __SDADC2_IS_CLK_ENABLED __HAL_RCC_SDADC2_IS_CLK_ENABLED -#define __SDADC2_IS_CLK_DISABLED __HAL_RCC_SDADC2_IS_CLK_DISABLED -#define __SDADC3_IS_CLK_ENABLED __HAL_RCC_SDADC3_IS_CLK_ENABLED -#define __SDADC3_IS_CLK_DISABLED __HAL_RCC_SDADC3_IS_CLK_DISABLED -#define __SRAM_IS_CLK_ENABLED __HAL_RCC_SRAM_IS_CLK_ENABLED -#define __SRAM_IS_CLK_DISABLED __HAL_RCC_SRAM_IS_CLK_DISABLED -#define __TIM1_IS_CLK_ENABLED __HAL_RCC_TIM1_IS_CLK_ENABLED -#define __TIM1_IS_CLK_DISABLED __HAL_RCC_TIM1_IS_CLK_DISABLED -#define __TIM2_IS_CLK_ENABLED __HAL_RCC_TIM2_IS_CLK_ENABLED -#define __TIM2_IS_CLK_DISABLED __HAL_RCC_TIM2_IS_CLK_DISABLED -#define __TIM3_IS_CLK_ENABLED __HAL_RCC_TIM3_IS_CLK_ENABLED -#define __TIM3_IS_CLK_DISABLED __HAL_RCC_TIM3_IS_CLK_DISABLED -#define __TIM4_IS_CLK_ENABLED __HAL_RCC_TIM4_IS_CLK_ENABLED -#define __TIM4_IS_CLK_DISABLED __HAL_RCC_TIM4_IS_CLK_DISABLED -#define __TIM5_IS_CLK_ENABLED __HAL_RCC_TIM5_IS_CLK_ENABLED -#define __TIM5_IS_CLK_DISABLED __HAL_RCC_TIM5_IS_CLK_DISABLED -#define __TIM6_IS_CLK_ENABLED __HAL_RCC_TIM6_IS_CLK_ENABLED -#define __TIM6_IS_CLK_DISABLED __HAL_RCC_TIM6_IS_CLK_DISABLED -#define __TIM7_IS_CLK_ENABLED __HAL_RCC_TIM7_IS_CLK_ENABLED -#define __TIM7_IS_CLK_DISABLED __HAL_RCC_TIM7_IS_CLK_DISABLED -#define __TIM8_IS_CLK_ENABLED __HAL_RCC_TIM8_IS_CLK_ENABLED -#define __TIM8_IS_CLK_DISABLED __HAL_RCC_TIM8_IS_CLK_DISABLED -#define __TIM12_IS_CLK_ENABLED __HAL_RCC_TIM12_IS_CLK_ENABLED -#define __TIM12_IS_CLK_DISABLED __HAL_RCC_TIM12_IS_CLK_DISABLED -#define __TIM13_IS_CLK_ENABLED __HAL_RCC_TIM13_IS_CLK_ENABLED -#define __TIM13_IS_CLK_DISABLED __HAL_RCC_TIM13_IS_CLK_DISABLED -#define __TIM14_IS_CLK_ENABLED __HAL_RCC_TIM14_IS_CLK_ENABLED -#define __TIM14_IS_CLK_DISABLED __HAL_RCC_TIM14_IS_CLK_DISABLED -#define __TIM15_IS_CLK_ENABLED __HAL_RCC_TIM15_IS_CLK_ENABLED -#define __TIM15_IS_CLK_DISABLED __HAL_RCC_TIM15_IS_CLK_DISABLED -#define __TIM16_IS_CLK_ENABLED __HAL_RCC_TIM16_IS_CLK_ENABLED -#define __TIM16_IS_CLK_DISABLED __HAL_RCC_TIM16_IS_CLK_DISABLED -#define __TIM17_IS_CLK_ENABLED __HAL_RCC_TIM17_IS_CLK_ENABLED -#define __TIM17_IS_CLK_DISABLED __HAL_RCC_TIM17_IS_CLK_DISABLED -#define __TIM18_IS_CLK_ENABLED __HAL_RCC_TIM18_IS_CLK_ENABLED -#define __TIM18_IS_CLK_DISABLED __HAL_RCC_TIM18_IS_CLK_DISABLED -#define __TIM19_IS_CLK_ENABLED __HAL_RCC_TIM19_IS_CLK_ENABLED -#define __TIM19_IS_CLK_DISABLED __HAL_RCC_TIM19_IS_CLK_DISABLED -#define __TIM20_IS_CLK_ENABLED __HAL_RCC_TIM20_IS_CLK_ENABLED -#define __TIM20_IS_CLK_DISABLED __HAL_RCC_TIM20_IS_CLK_DISABLED -#define __TSC_IS_CLK_ENABLED __HAL_RCC_TSC_IS_CLK_ENABLED -#define __TSC_IS_CLK_DISABLED __HAL_RCC_TSC_IS_CLK_DISABLED -#define __UART4_IS_CLK_ENABLED __HAL_RCC_UART4_IS_CLK_ENABLED -#define __UART4_IS_CLK_DISABLED __HAL_RCC_UART4_IS_CLK_DISABLED -#define __UART5_IS_CLK_ENABLED __HAL_RCC_UART5_IS_CLK_ENABLED -#define __UART5_IS_CLK_DISABLED __HAL_RCC_UART5_IS_CLK_DISABLED -#define __USART1_IS_CLK_ENABLED __HAL_RCC_USART1_IS_CLK_ENABLED -#define __USART1_IS_CLK_DISABLED __HAL_RCC_USART1_IS_CLK_DISABLED -#define __USART2_IS_CLK_ENABLED __HAL_RCC_USART2_IS_CLK_ENABLED -#define __USART2_IS_CLK_DISABLED __HAL_RCC_USART2_IS_CLK_DISABLED -#define __USART3_IS_CLK_ENABLED __HAL_RCC_USART3_IS_CLK_ENABLED -#define __USART3_IS_CLK_DISABLED __HAL_RCC_USART3_IS_CLK_DISABLED -#define __USB_IS_CLK_ENABLED __HAL_RCC_USB_IS_CLK_ENABLED -#define __USB_IS_CLK_DISABLED __HAL_RCC_USB_IS_CLK_DISABLED -#define __WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG_IS_CLK_ENABLED -#define __WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG_IS_CLK_DISABLED - -#if defined(STM32L1) -#define __HAL_RCC_CRYP_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE -#define __HAL_RCC_CRYP_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE -#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE -#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE -#define __HAL_RCC_CRYP_FORCE_RESET __HAL_RCC_AES_FORCE_RESET -#define __HAL_RCC_CRYP_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET -#endif /* STM32L1 */ - -#if defined(STM32F4) -#define __HAL_RCC_SDMMC1_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET -#define __HAL_RCC_SDMMC1_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET -#define __HAL_RCC_SDMMC1_CLK_SLEEP_ENABLE __HAL_RCC_SDIO_CLK_SLEEP_ENABLE -#define __HAL_RCC_SDMMC1_CLK_SLEEP_DISABLE __HAL_RCC_SDIO_CLK_SLEEP_DISABLE -#define __HAL_RCC_SDMMC1_CLK_ENABLE __HAL_RCC_SDIO_CLK_ENABLE -#define __HAL_RCC_SDMMC1_CLK_DISABLE __HAL_RCC_SDIO_CLK_DISABLE -#define __HAL_RCC_SDMMC1_IS_CLK_ENABLED __HAL_RCC_SDIO_IS_CLK_ENABLED -#define __HAL_RCC_SDMMC1_IS_CLK_DISABLED __HAL_RCC_SDIO_IS_CLK_DISABLED -#define Sdmmc1ClockSelection SdioClockSelection -#define RCC_PERIPHCLK_SDMMC1 RCC_PERIPHCLK_SDIO -#define RCC_SDMMC1CLKSOURCE_CLK48 RCC_SDIOCLKSOURCE_CK48 -#define RCC_SDMMC1CLKSOURCE_SYSCLK RCC_SDIOCLKSOURCE_SYSCLK -#define __HAL_RCC_SDMMC1_CONFIG __HAL_RCC_SDIO_CONFIG -#define __HAL_RCC_GET_SDMMC1_SOURCE __HAL_RCC_GET_SDIO_SOURCE -#endif - -#if defined(STM32F7) || defined(STM32L4) -#define __HAL_RCC_SDIO_FORCE_RESET __HAL_RCC_SDMMC1_FORCE_RESET -#define __HAL_RCC_SDIO_RELEASE_RESET __HAL_RCC_SDMMC1_RELEASE_RESET -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE __HAL_RCC_SDMMC1_CLK_SLEEP_ENABLE -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE __HAL_RCC_SDMMC1_CLK_SLEEP_DISABLE -#define __HAL_RCC_SDIO_CLK_ENABLE __HAL_RCC_SDMMC1_CLK_ENABLE -#define __HAL_RCC_SDIO_CLK_DISABLE __HAL_RCC_SDMMC1_CLK_DISABLE -#define __HAL_RCC_SDIO_IS_CLK_ENABLED __HAL_RCC_SDMMC1_IS_CLK_ENABLED -#define __HAL_RCC_SDIO_IS_CLK_DISABLED __HAL_RCC_SDMMC1_IS_CLK_DISABLED -#define SdioClockSelection Sdmmc1ClockSelection -#define RCC_PERIPHCLK_SDIO RCC_PERIPHCLK_SDMMC1 -#define __HAL_RCC_SDIO_CONFIG __HAL_RCC_SDMMC1_CONFIG -#define __HAL_RCC_GET_SDIO_SOURCE __HAL_RCC_GET_SDMMC1_SOURCE -#endif - -#if defined(STM32F7) -#define RCC_SDIOCLKSOURCE_CLK48 RCC_SDMMC1CLKSOURCE_CLK48 -#define RCC_SDIOCLKSOURCE_SYSCLK RCC_SDMMC1CLKSOURCE_SYSCLK -#endif - -#if defined(STM32H7) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() __HAL_RCC_USB1_OTG_HS_CLK_ENABLE() -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_ENABLE() -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() __HAL_RCC_USB1_OTG_HS_CLK_DISABLE() -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_DISABLE() -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() __HAL_RCC_USB1_OTG_HS_FORCE_RESET() -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() __HAL_RCC_USB1_OTG_HS_RELEASE_RESET() -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() __HAL_RCC_USB1_OTG_HS_CLK_SLEEP_ENABLE() -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_SLEEP_ENABLE() -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() __HAL_RCC_USB1_OTG_HS_CLK_SLEEP_DISABLE() -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_SLEEP_DISABLE() - -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() __HAL_RCC_USB2_OTG_FS_CLK_ENABLE() -#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_ENABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_ENABLE() -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() __HAL_RCC_USB2_OTG_FS_CLK_DISABLE() -#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_DISABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_DISABLE() -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() __HAL_RCC_USB2_OTG_FS_FORCE_RESET() -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() __HAL_RCC_USB2_OTG_FS_RELEASE_RESET() -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() __HAL_RCC_USB2_OTG_FS_CLK_SLEEP_ENABLE() -#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_SLEEP_ENABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_SLEEP_ENABLE() -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() __HAL_RCC_USB2_OTG_FS_CLK_SLEEP_DISABLE() -#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_SLEEP_DISABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_SLEEP_DISABLE() -#endif - -#define __HAL_RCC_I2SCLK __HAL_RCC_I2S_CONFIG -#define __HAL_RCC_I2SCLK_CONFIG __HAL_RCC_I2S_CONFIG - -#define __RCC_PLLSRC RCC_GET_PLL_OSCSOURCE - -#define IS_RCC_MSIRANGE IS_RCC_MSI_CLOCK_RANGE -#define IS_RCC_RTCCLK_SOURCE IS_RCC_RTCCLKSOURCE -#define IS_RCC_SYSCLK_DIV IS_RCC_HCLK -#define IS_RCC_HCLK_DIV IS_RCC_PCLK -#define IS_RCC_PERIPHCLK IS_RCC_PERIPHCLOCK - -#define RCC_IT_HSI14 RCC_IT_HSI14RDY - -#define RCC_IT_CSSLSE RCC_IT_LSECSS -#define RCC_IT_CSSHSE RCC_IT_CSS - -#define RCC_PLLMUL_3 RCC_PLL_MUL3 -#define RCC_PLLMUL_4 RCC_PLL_MUL4 -#define RCC_PLLMUL_6 RCC_PLL_MUL6 -#define RCC_PLLMUL_8 RCC_PLL_MUL8 -#define RCC_PLLMUL_12 RCC_PLL_MUL12 -#define RCC_PLLMUL_16 RCC_PLL_MUL16 -#define RCC_PLLMUL_24 RCC_PLL_MUL24 -#define RCC_PLLMUL_32 RCC_PLL_MUL32 -#define RCC_PLLMUL_48 RCC_PLL_MUL48 - -#define RCC_PLLDIV_2 RCC_PLL_DIV2 -#define RCC_PLLDIV_3 RCC_PLL_DIV3 -#define RCC_PLLDIV_4 RCC_PLL_DIV4 - -#define IS_RCC_MCOSOURCE IS_RCC_MCO1SOURCE -#define __HAL_RCC_MCO_CONFIG __HAL_RCC_MCO1_CONFIG -#define RCC_MCO_NODIV RCC_MCODIV_1 -#define RCC_MCO_DIV1 RCC_MCODIV_1 -#define RCC_MCO_DIV2 RCC_MCODIV_2 -#define RCC_MCO_DIV4 RCC_MCODIV_4 -#define RCC_MCO_DIV8 RCC_MCODIV_8 -#define RCC_MCO_DIV16 RCC_MCODIV_16 -#define RCC_MCO_DIV32 RCC_MCODIV_32 -#define RCC_MCO_DIV64 RCC_MCODIV_64 -#define RCC_MCO_DIV128 RCC_MCODIV_128 -#define RCC_MCOSOURCE_NONE RCC_MCO1SOURCE_NOCLOCK -#define RCC_MCOSOURCE_LSI RCC_MCO1SOURCE_LSI -#define RCC_MCOSOURCE_LSE RCC_MCO1SOURCE_LSE -#define RCC_MCOSOURCE_SYSCLK RCC_MCO1SOURCE_SYSCLK -#define RCC_MCOSOURCE_HSI RCC_MCO1SOURCE_HSI -#define RCC_MCOSOURCE_HSI14 RCC_MCO1SOURCE_HSI14 -#define RCC_MCOSOURCE_HSI48 RCC_MCO1SOURCE_HSI48 -#define RCC_MCOSOURCE_HSE RCC_MCO1SOURCE_HSE -#define RCC_MCOSOURCE_PLLCLK_DIV1 RCC_MCO1SOURCE_PLLCLK -#define RCC_MCOSOURCE_PLLCLK_NODIV RCC_MCO1SOURCE_PLLCLK -#define RCC_MCOSOURCE_PLLCLK_DIV2 RCC_MCO1SOURCE_PLLCLK_DIV2 - -#if defined(STM32U0) -#define RCC_SYSCLKSOURCE_STATUS_PLLR RCC_SYSCLKSOURCE_STATUS_PLLCLK -#endif - -#if defined(STM32L4) || defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) || \ - defined(STM32WL) || defined(STM32C0) || defined(STM32N6) || defined(STM32H7RS) || \ - defined(STM32U0) -#define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE -#else -#define RCC_RTCCLKSOURCE_NONE RCC_RTCCLKSOURCE_NO_CLK -#endif - -#define RCC_USBCLK_PLLSAI1 RCC_USBCLKSOURCE_PLLSAI1 -#define RCC_USBCLK_PLL RCC_USBCLKSOURCE_PLL -#define RCC_USBCLK_MSI RCC_USBCLKSOURCE_MSI -#define RCC_USBCLKSOURCE_PLLCLK RCC_USBCLKSOURCE_PLL -#define RCC_USBPLLCLK_DIV1 RCC_USBCLKSOURCE_PLL -#define RCC_USBPLLCLK_DIV1_5 RCC_USBCLKSOURCE_PLL_DIV1_5 -#define RCC_USBPLLCLK_DIV2 RCC_USBCLKSOURCE_PLL_DIV2 -#define RCC_USBPLLCLK_DIV3 RCC_USBCLKSOURCE_PLL_DIV3 - -#define HSION_BitNumber RCC_HSION_BIT_NUMBER -#define HSION_BITNUMBER RCC_HSION_BIT_NUMBER -#define HSEON_BitNumber RCC_HSEON_BIT_NUMBER -#define HSEON_BITNUMBER RCC_HSEON_BIT_NUMBER -#define MSION_BITNUMBER RCC_MSION_BIT_NUMBER -#define CSSON_BitNumber RCC_CSSON_BIT_NUMBER -#define CSSON_BITNUMBER RCC_CSSON_BIT_NUMBER -#define PLLON_BitNumber RCC_PLLON_BIT_NUMBER -#define PLLON_BITNUMBER RCC_PLLON_BIT_NUMBER -#define PLLI2SON_BitNumber RCC_PLLI2SON_BIT_NUMBER -#define I2SSRC_BitNumber RCC_I2SSRC_BIT_NUMBER -#define RTCEN_BitNumber RCC_RTCEN_BIT_NUMBER -#define RTCEN_BITNUMBER RCC_RTCEN_BIT_NUMBER -#define BDRST_BitNumber RCC_BDRST_BIT_NUMBER -#define BDRST_BITNUMBER RCC_BDRST_BIT_NUMBER -#define RTCRST_BITNUMBER RCC_RTCRST_BIT_NUMBER -#define LSION_BitNumber RCC_LSION_BIT_NUMBER -#define LSION_BITNUMBER RCC_LSION_BIT_NUMBER -#define LSEON_BitNumber RCC_LSEON_BIT_NUMBER -#define LSEON_BITNUMBER RCC_LSEON_BIT_NUMBER -#define LSEBYP_BITNUMBER RCC_LSEBYP_BIT_NUMBER -#define PLLSAION_BitNumber RCC_PLLSAION_BIT_NUMBER -#define TIMPRE_BitNumber RCC_TIMPRE_BIT_NUMBER -#define RMVF_BitNumber RCC_RMVF_BIT_NUMBER -#define RMVF_BITNUMBER RCC_RMVF_BIT_NUMBER -#define RCC_CR2_HSI14TRIM_BitNumber RCC_HSI14TRIM_BIT_NUMBER -#define CR_BYTE2_ADDRESS RCC_CR_BYTE2_ADDRESS -#define CIR_BYTE1_ADDRESS RCC_CIR_BYTE1_ADDRESS -#define CIR_BYTE2_ADDRESS RCC_CIR_BYTE2_ADDRESS -#define BDCR_BYTE0_ADDRESS RCC_BDCR_BYTE0_ADDRESS -#define DBP_TIMEOUT_VALUE RCC_DBP_TIMEOUT_VALUE -#define LSE_TIMEOUT_VALUE RCC_LSE_TIMEOUT_VALUE - -#define CR_HSION_BB RCC_CR_HSION_BB -#define CR_CSSON_BB RCC_CR_CSSON_BB -#define CR_PLLON_BB RCC_CR_PLLON_BB -#define CR_PLLI2SON_BB RCC_CR_PLLI2SON_BB -#define CR_MSION_BB RCC_CR_MSION_BB -#define CSR_LSION_BB RCC_CSR_LSION_BB -#define CSR_LSEON_BB RCC_CSR_LSEON_BB -#define CSR_LSEBYP_BB RCC_CSR_LSEBYP_BB -#define CSR_RTCEN_BB RCC_CSR_RTCEN_BB -#define CSR_RTCRST_BB RCC_CSR_RTCRST_BB -#define CFGR_I2SSRC_BB RCC_CFGR_I2SSRC_BB -#define BDCR_RTCEN_BB RCC_BDCR_RTCEN_BB -#define BDCR_BDRST_BB RCC_BDCR_BDRST_BB -#define CR_HSEON_BB RCC_CR_HSEON_BB -#define CSR_RMVF_BB RCC_CSR_RMVF_BB -#define CR_PLLSAION_BB RCC_CR_PLLSAION_BB -#define DCKCFGR_TIMPRE_BB RCC_DCKCFGR_TIMPRE_BB - -#define __HAL_RCC_CRS_ENABLE_FREQ_ERROR_COUNTER __HAL_RCC_CRS_FREQ_ERROR_COUNTER_ENABLE -#define __HAL_RCC_CRS_DISABLE_FREQ_ERROR_COUNTER __HAL_RCC_CRS_FREQ_ERROR_COUNTER_DISABLE -#define __HAL_RCC_CRS_ENABLE_AUTOMATIC_CALIB __HAL_RCC_CRS_AUTOMATIC_CALIB_ENABLE -#define __HAL_RCC_CRS_DISABLE_AUTOMATIC_CALIB __HAL_RCC_CRS_AUTOMATIC_CALIB_DISABLE -#define __HAL_RCC_CRS_CALCULATE_RELOADVALUE __HAL_RCC_CRS_RELOADVALUE_CALCULATE - -#define __HAL_RCC_GET_IT_SOURCE __HAL_RCC_GET_IT - -#define RCC_CRS_SYNCWARM RCC_CRS_SYNCWARN -#define RCC_CRS_TRIMOV RCC_CRS_TRIMOVF - -#define RCC_PERIPHCLK_CK48 RCC_PERIPHCLK_CLK48 -#define RCC_CK48CLKSOURCE_PLLQ RCC_CLK48CLKSOURCE_PLLQ -#define RCC_CK48CLKSOURCE_PLLSAIP RCC_CLK48CLKSOURCE_PLLSAIP -#define RCC_CK48CLKSOURCE_PLLI2SQ RCC_CLK48CLKSOURCE_PLLI2SQ -#define IS_RCC_CK48CLKSOURCE IS_RCC_CLK48CLKSOURCE -#define RCC_SDIOCLKSOURCE_CK48 RCC_SDIOCLKSOURCE_CLK48 - -#define __HAL_RCC_DFSDM_CLK_ENABLE __HAL_RCC_DFSDM1_CLK_ENABLE -#define __HAL_RCC_DFSDM_CLK_DISABLE __HAL_RCC_DFSDM1_CLK_DISABLE -#define __HAL_RCC_DFSDM_IS_CLK_ENABLED __HAL_RCC_DFSDM1_IS_CLK_ENABLED -#define __HAL_RCC_DFSDM_IS_CLK_DISABLED __HAL_RCC_DFSDM1_IS_CLK_DISABLED -#define __HAL_RCC_DFSDM_FORCE_RESET __HAL_RCC_DFSDM1_FORCE_RESET -#define __HAL_RCC_DFSDM_RELEASE_RESET __HAL_RCC_DFSDM1_RELEASE_RESET -#define __HAL_RCC_DFSDM_CLK_SLEEP_ENABLE __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE -#define __HAL_RCC_DFSDM_CLK_SLEEP_DISABLE __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE -#define __HAL_RCC_DFSDM_IS_CLK_SLEEP_ENABLED __HAL_RCC_DFSDM1_IS_CLK_SLEEP_ENABLED -#define __HAL_RCC_DFSDM_IS_CLK_SLEEP_DISABLED __HAL_RCC_DFSDM1_IS_CLK_SLEEP_DISABLED -#define DfsdmClockSelection Dfsdm1ClockSelection -#define RCC_PERIPHCLK_DFSDM RCC_PERIPHCLK_DFSDM1 -#define RCC_DFSDMCLKSOURCE_PCLK RCC_DFSDM1CLKSOURCE_PCLK2 -#define RCC_DFSDMCLKSOURCE_SYSCLK RCC_DFSDM1CLKSOURCE_SYSCLK -#define __HAL_RCC_DFSDM_CONFIG __HAL_RCC_DFSDM1_CONFIG -#define __HAL_RCC_GET_DFSDM_SOURCE __HAL_RCC_GET_DFSDM1_SOURCE -#define RCC_DFSDM1CLKSOURCE_PCLK RCC_DFSDM1CLKSOURCE_PCLK2 -#define RCC_SWPMI1CLKSOURCE_PCLK RCC_SWPMI1CLKSOURCE_PCLK1 -#if !defined(STM32U0) -#define RCC_LPTIM1CLKSOURCE_PCLK RCC_LPTIM1CLKSOURCE_PCLK1 -#define RCC_LPTIM2CLKSOURCE_PCLK RCC_LPTIM2CLKSOURCE_PCLK1 -#endif - -#define RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB1 RCC_DFSDM1AUDIOCLKSOURCE_I2S1 -#define RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB2 RCC_DFSDM1AUDIOCLKSOURCE_I2S2 -#define RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB1 RCC_DFSDM2AUDIOCLKSOURCE_I2S1 -#define RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB2 RCC_DFSDM2AUDIOCLKSOURCE_I2S2 -#define RCC_DFSDM1CLKSOURCE_APB2 RCC_DFSDM1CLKSOURCE_PCLK2 -#define RCC_DFSDM2CLKSOURCE_APB2 RCC_DFSDM2CLKSOURCE_PCLK2 -#define RCC_FMPI2C1CLKSOURCE_APB RCC_FMPI2C1CLKSOURCE_PCLK1 -#if defined(STM32U5) -#define MSIKPLLModeSEL RCC_MSIKPLL_MODE_SEL -#define MSISPLLModeSEL RCC_MSISPLL_MODE_SEL -#define __HAL_RCC_AHB21_CLK_DISABLE __HAL_RCC_AHB2_1_CLK_DISABLE -#define __HAL_RCC_AHB22_CLK_DISABLE __HAL_RCC_AHB2_2_CLK_DISABLE -#define __HAL_RCC_AHB1_CLK_Disable_Clear __HAL_RCC_AHB1_CLK_ENABLE -#define __HAL_RCC_AHB21_CLK_Disable_Clear __HAL_RCC_AHB2_1_CLK_ENABLE -#define __HAL_RCC_AHB22_CLK_Disable_Clear __HAL_RCC_AHB2_2_CLK_ENABLE -#define __HAL_RCC_AHB3_CLK_Disable_Clear __HAL_RCC_AHB3_CLK_ENABLE -#define __HAL_RCC_APB1_CLK_Disable_Clear __HAL_RCC_APB1_CLK_ENABLE -#define __HAL_RCC_APB2_CLK_Disable_Clear __HAL_RCC_APB2_CLK_ENABLE -#define __HAL_RCC_APB3_CLK_Disable_Clear __HAL_RCC_APB3_CLK_ENABLE -#define IS_RCC_MSIPLLModeSelection IS_RCC_MSIPLLMODE_SELECT -#define RCC_PERIPHCLK_CLK48 RCC_PERIPHCLK_ICLK -#define RCC_CLK48CLKSOURCE_HSI48 RCC_ICLK_CLKSOURCE_HSI48 -#define RCC_CLK48CLKSOURCE_PLL2 RCC_ICLK_CLKSOURCE_PLL2 -#define RCC_CLK48CLKSOURCE_PLL1 RCC_ICLK_CLKSOURCE_PLL1 -#define RCC_CLK48CLKSOURCE_MSIK RCC_ICLK_CLKSOURCE_MSIK -#define __HAL_RCC_ADC1_CLK_ENABLE __HAL_RCC_ADC12_CLK_ENABLE -#define __HAL_RCC_ADC1_CLK_DISABLE __HAL_RCC_ADC12_CLK_DISABLE -#define __HAL_RCC_ADC1_IS_CLK_ENABLED __HAL_RCC_ADC12_IS_CLK_ENABLED -#define __HAL_RCC_ADC1_IS_CLK_DISABLED __HAL_RCC_ADC12_IS_CLK_DISABLED -#define __HAL_RCC_ADC1_FORCE_RESET __HAL_RCC_ADC12_FORCE_RESET -#define __HAL_RCC_ADC1_RELEASE_RESET __HAL_RCC_ADC12_RELEASE_RESET -#define __HAL_RCC_ADC1_CLK_SLEEP_ENABLE __HAL_RCC_ADC12_CLK_SLEEP_ENABLE -#define __HAL_RCC_ADC1_CLK_SLEEP_DISABLE __HAL_RCC_ADC12_CLK_SLEEP_DISABLE -#define __HAL_RCC_GET_CLK48_SOURCE __HAL_RCC_GET_ICLK_SOURCE -#define __HAL_RCC_PLLFRACN_ENABLE __HAL_RCC_PLL_FRACN_ENABLE -#define __HAL_RCC_PLLFRACN_DISABLE __HAL_RCC_PLL_FRACN_DISABLE -#define __HAL_RCC_PLLFRACN_CONFIG __HAL_RCC_PLL_FRACN_CONFIG -#define IS_RCC_PLLFRACN_VALUE IS_RCC_PLL_FRACN_VALUE -#endif /* STM32U5 */ - -#if defined(STM32H5) -#define __HAL_RCC_PLLFRACN_ENABLE __HAL_RCC_PLL_FRACN_ENABLE -#define __HAL_RCC_PLLFRACN_DISABLE __HAL_RCC_PLL_FRACN_DISABLE -#define __HAL_RCC_PLLFRACN_CONFIG __HAL_RCC_PLL_FRACN_CONFIG -#define IS_RCC_PLLFRACN_VALUE IS_RCC_PLL_FRACN_VALUE - -#define RCC_PLLSOURCE_NONE RCC_PLL1_SOURCE_NONE -#define RCC_PLLSOURCE_HSI RCC_PLL1_SOURCE_HSI -#define RCC_PLLSOURCE_CSI RCC_PLL1_SOURCE_CSI -#define RCC_PLLSOURCE_HSE RCC_PLL1_SOURCE_HSE -#define RCC_PLLVCIRANGE_0 RCC_PLL1_VCIRANGE_0 -#define RCC_PLLVCIRANGE_1 RCC_PLL1_VCIRANGE_1 -#define RCC_PLLVCIRANGE_2 RCC_PLL1_VCIRANGE_2 -#define RCC_PLLVCIRANGE_3 RCC_PLL1_VCIRANGE_3 -#define RCC_PLL1VCOWIDE RCC_PLL1_VCORANGE_WIDE -#define RCC_PLL1VCOMEDIUM RCC_PLL1_VCORANGE_MEDIUM - -#define IS_RCC_PLLSOURCE IS_RCC_PLL1_SOURCE -#define IS_RCC_PLLRGE_VALUE IS_RCC_PLL1_VCIRGE_VALUE -#define IS_RCC_PLLVCORGE_VALUE IS_RCC_PLL1_VCORGE_VALUE -#define IS_RCC_PLLCLOCKOUT_VALUE IS_RCC_PLL1_CLOCKOUT_VALUE -#define IS_RCC_PLL_FRACN_VALUE IS_RCC_PLL1_FRACN_VALUE -#define IS_RCC_PLLM_VALUE IS_RCC_PLL1_DIVM_VALUE -#define IS_RCC_PLLN_VALUE IS_RCC_PLL1_MULN_VALUE -#define IS_RCC_PLLP_VALUE IS_RCC_PLL1_DIVP_VALUE -#define IS_RCC_PLLQ_VALUE IS_RCC_PLL1_DIVQ_VALUE -#define IS_RCC_PLLR_VALUE IS_RCC_PLL1_DIVR_VALUE - -#define __HAL_RCC_PLL_ENABLE __HAL_RCC_PLL1_ENABLE -#define __HAL_RCC_PLL_DISABLE __HAL_RCC_PLL1_DISABLE -#define __HAL_RCC_PLL_FRACN_ENABLE __HAL_RCC_PLL1_FRACN_ENABLE -#define __HAL_RCC_PLL_FRACN_DISABLE __HAL_RCC_PLL1_FRACN_DISABLE -#define __HAL_RCC_PLL_CONFIG __HAL_RCC_PLL1_CONFIG -#define __HAL_RCC_PLL_PLLSOURCE_CONFIG __HAL_RCC_PLL1_PLLSOURCE_CONFIG -#define __HAL_RCC_PLL_DIVM_CONFIG __HAL_RCC_PLL1_DIVM_CONFIG -#define __HAL_RCC_PLL_FRACN_CONFIG __HAL_RCC_PLL1_FRACN_CONFIG -#define __HAL_RCC_PLL_VCIRANGE __HAL_RCC_PLL1_VCIRANGE -#define __HAL_RCC_PLL_VCORANGE __HAL_RCC_PLL1_VCORANGE -#define __HAL_RCC_GET_PLL_OSCSOURCE __HAL_RCC_GET_PLL1_OSCSOURCE -#define __HAL_RCC_PLLCLKOUT_ENABLE __HAL_RCC_PLL1_CLKOUT_ENABLE -#define __HAL_RCC_PLLCLKOUT_DISABLE __HAL_RCC_PLL1_CLKOUT_DISABLE -#define __HAL_RCC_GET_PLLCLKOUT_CONFIG __HAL_RCC_GET_PLL1_CLKOUT_CONFIG - -#define __HAL_RCC_PLL2FRACN_ENABLE __HAL_RCC_PLL2_FRACN_ENABLE -#define __HAL_RCC_PLL2FRACN_DISABLE __HAL_RCC_PLL2_FRACN_DISABLE -#define __HAL_RCC_PLL2CLKOUT_ENABLE __HAL_RCC_PLL2_CLKOUT_ENABLE -#define __HAL_RCC_PLL2CLKOUT_DISABLE __HAL_RCC_PLL2_CLKOUT_DISABLE -#define __HAL_RCC_PLL2FRACN_CONFIG __HAL_RCC_PLL2_FRACN_CONFIG -#define __HAL_RCC_GET_PLL2CLKOUT_CONFIG __HAL_RCC_GET_PLL2_CLKOUT_CONFIG - -#define __HAL_RCC_PLL3FRACN_ENABLE __HAL_RCC_PLL3_FRACN_ENABLE -#define __HAL_RCC_PLL3FRACN_DISABLE __HAL_RCC_PLL3_FRACN_DISABLE -#define __HAL_RCC_PLL3CLKOUT_ENABLE __HAL_RCC_PLL3_CLKOUT_ENABLE -#define __HAL_RCC_PLL3CLKOUT_DISABLE __HAL_RCC_PLL3_CLKOUT_DISABLE -#define __HAL_RCC_PLL3FRACN_CONFIG __HAL_RCC_PLL3_FRACN_CONFIG -#define __HAL_RCC_GET_PLL3CLKOUT_CONFIG __HAL_RCC_GET_PLL3_CLKOUT_CONFIG - -#define RCC_PLL2VCIRANGE_0 RCC_PLL2_VCIRANGE_0 -#define RCC_PLL2VCIRANGE_1 RCC_PLL2_VCIRANGE_1 -#define RCC_PLL2VCIRANGE_2 RCC_PLL2_VCIRANGE_2 -#define RCC_PLL2VCIRANGE_3 RCC_PLL2_VCIRANGE_3 - -#define RCC_PLL2VCOWIDE RCC_PLL2_VCORANGE_WIDE -#define RCC_PLL2VCOMEDIUM RCC_PLL2_VCORANGE_MEDIUM - -#define RCC_PLL2SOURCE_NONE RCC_PLL2_SOURCE_NONE -#define RCC_PLL2SOURCE_HSI RCC_PLL2_SOURCE_HSI -#define RCC_PLL2SOURCE_CSI RCC_PLL2_SOURCE_CSI -#define RCC_PLL2SOURCE_HSE RCC_PLL2_SOURCE_HSE - -#define RCC_PLL3VCIRANGE_0 RCC_PLL3_VCIRANGE_0 -#define RCC_PLL3VCIRANGE_1 RCC_PLL3_VCIRANGE_1 -#define RCC_PLL3VCIRANGE_2 RCC_PLL3_VCIRANGE_2 -#define RCC_PLL3VCIRANGE_3 RCC_PLL3_VCIRANGE_3 - -#define RCC_PLL3VCOWIDE RCC_PLL3_VCORANGE_WIDE -#define RCC_PLL3VCOMEDIUM RCC_PLL3_VCORANGE_MEDIUM - -#define RCC_PLL3SOURCE_NONE RCC_PLL3_SOURCE_NONE -#define RCC_PLL3SOURCE_HSI RCC_PLL3_SOURCE_HSI -#define RCC_PLL3SOURCE_CSI RCC_PLL3_SOURCE_CSI -#define RCC_PLL3SOURCE_HSE RCC_PLL3_SOURCE_HSE - - -#endif /* STM32H5 */ - -/** - * @} - */ - -/** @defgroup HAL_RNG_Aliased_Macros HAL RNG Aliased Macros maintained for legacy purpose - * @{ - */ -#define HAL_RNG_ReadyCallback(__HANDLE__) HAL_RNG_ReadyDataCallback((__HANDLE__), uint32_t random32bit) - -/** - * @} - */ - -/** @defgroup HAL_RTC_Aliased_Macros HAL RTC Aliased Macros maintained for legacy purpose - * @{ - */ -#if defined (STM32G0) || defined (STM32L5) || defined (STM32L412xx) || defined (STM32L422xx) || \ - defined (STM32L4P5xx)|| defined (STM32L4Q5xx) || defined (STM32G4) || defined (STM32WL) || defined (STM32U5) || \ - defined (STM32WBA) || defined (STM32H5) || \ - defined (STM32C0) || defined (STM32N6) || defined (STM32H7RS) || defined (STM32U0) || defined (STM32U3) -#else -#define __HAL_RTC_CLEAR_FLAG __HAL_RTC_EXTI_CLEAR_FLAG -#endif -#define __HAL_RTC_DISABLE_IT __HAL_RTC_EXTI_DISABLE_IT -#define __HAL_RTC_ENABLE_IT __HAL_RTC_EXTI_ENABLE_IT - -#if defined (STM32F1) -#define __HAL_RTC_EXTI_CLEAR_FLAG(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_CLEAR_FLAG() - -#define __HAL_RTC_EXTI_ENABLE_IT(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_ENABLE_IT() - -#define __HAL_RTC_EXTI_DISABLE_IT(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_DISABLE_IT() - -#define __HAL_RTC_EXTI_GET_FLAG(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_GET_FLAG() - -#define __HAL_RTC_EXTI_GENERATE_SWIT(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_GENERATE_SWIT() -#else -#define __HAL_RTC_EXTI_CLEAR_FLAG(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_CLEAR_FLAG() : \ - (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG() : \ - __HAL_RTC_TAMPER_TIMESTAMP_EXTI_CLEAR_FLAG())) -#define __HAL_RTC_EXTI_ENABLE_IT(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_ENABLE_IT() : \ - (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_IT() : \ - __HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_IT())) -#define __HAL_RTC_EXTI_DISABLE_IT(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_DISABLE_IT() : \ - (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_DISABLE_IT() : \ - __HAL_RTC_TAMPER_TIMESTAMP_EXTI_DISABLE_IT())) -#define __HAL_RTC_EXTI_GET_FLAG(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_GET_FLAG() : \ - (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_GET_FLAG() : \ - __HAL_RTC_TAMPER_TIMESTAMP_EXTI_GET_FLAG())) -#define __HAL_RTC_EXTI_GENERATE_SWIT(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_GENERATE_SWIT() : \ - (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_GENERATE_SWIT() : \ - __HAL_RTC_TAMPER_TIMESTAMP_EXTI_GENERATE_SWIT())) -#endif /* STM32F1 */ - -#if defined (STM32F0) || defined (STM32F2) || defined (STM32F3) || defined (STM32F4) || defined (STM32F7) || \ - defined (STM32H7) || \ - defined (STM32L0) || defined (STM32L1) || \ - defined (STM32WB) -#define __HAL_RTC_TAMPER_GET_IT __HAL_RTC_TAMPER_GET_FLAG -#endif - -#define IS_ALARM IS_RTC_ALARM -#define IS_ALARM_MASK IS_RTC_ALARM_MASK -#define IS_TAMPER IS_RTC_TAMPER -#define IS_TAMPER_ERASE_MODE IS_RTC_TAMPER_ERASE_MODE -#define IS_TAMPER_FILTER IS_RTC_TAMPER_FILTER -#define IS_TAMPER_INTERRUPT IS_RTC_TAMPER_INTERRUPT -#define IS_TAMPER_MASKFLAG_STATE IS_RTC_TAMPER_MASKFLAG_STATE -#define IS_TAMPER_PRECHARGE_DURATION IS_RTC_TAMPER_PRECHARGE_DURATION -#define IS_TAMPER_PULLUP_STATE IS_RTC_TAMPER_PULLUP_STATE -#define IS_TAMPER_SAMPLING_FREQ IS_RTC_TAMPER_SAMPLING_FREQ -#define IS_TAMPER_TIMESTAMPONTAMPER_DETECTION IS_RTC_TAMPER_TIMESTAMPONTAMPER_DETECTION -#define IS_TAMPER_TRIGGER IS_RTC_TAMPER_TRIGGER -#define IS_WAKEUP_CLOCK IS_RTC_WAKEUP_CLOCK -#define IS_WAKEUP_COUNTER IS_RTC_WAKEUP_COUNTER - -#define __RTC_WRITEPROTECTION_ENABLE __HAL_RTC_WRITEPROTECTION_ENABLE -#define __RTC_WRITEPROTECTION_DISABLE __HAL_RTC_WRITEPROTECTION_DISABLE - -#if defined (STM32H5) -#define __HAL_RCC_RTCAPB_CLK_ENABLE __HAL_RCC_RTC_CLK_ENABLE -#define __HAL_RCC_RTCAPB_CLK_DISABLE __HAL_RCC_RTC_CLK_DISABLE -#endif /* STM32H5 */ - -/** - * @} - */ - -/** @defgroup HAL_SD_Aliased_Macros HAL SD/MMC Aliased Macros maintained for legacy purpose - * @{ - */ - -#define SD_OCR_CID_CSD_OVERWRIETE SD_OCR_CID_CSD_OVERWRITE -#define SD_CMD_SD_APP_STAUS SD_CMD_SD_APP_STATUS - -#if !defined(STM32F1) && !defined(STM32F2) && !defined(STM32F4) && !defined(STM32L1) -#define eMMC_HIGH_VOLTAGE_RANGE EMMC_HIGH_VOLTAGE_RANGE -#define eMMC_DUAL_VOLTAGE_RANGE EMMC_DUAL_VOLTAGE_RANGE -#define eMMC_LOW_VOLTAGE_RANGE EMMC_LOW_VOLTAGE_RANGE - -#define SDMMC_NSpeed_CLK_DIV SDMMC_NSPEED_CLK_DIV -#define SDMMC_HSpeed_CLK_DIV SDMMC_HSPEED_CLK_DIV -#endif - -#if defined(STM32F4) || defined(STM32F2) -#define SD_SDMMC_DISABLED SD_SDIO_DISABLED -#define SD_SDMMC_FUNCTION_BUSY SD_SDIO_FUNCTION_BUSY -#define SD_SDMMC_FUNCTION_FAILED SD_SDIO_FUNCTION_FAILED -#define SD_SDMMC_UNKNOWN_FUNCTION SD_SDIO_UNKNOWN_FUNCTION -#define SD_CMD_SDMMC_SEN_OP_COND SD_CMD_SDIO_SEN_OP_COND -#define SD_CMD_SDMMC_RW_DIRECT SD_CMD_SDIO_RW_DIRECT -#define SD_CMD_SDMMC_RW_EXTENDED SD_CMD_SDIO_RW_EXTENDED -#define __HAL_SD_SDMMC_ENABLE __HAL_SD_SDIO_ENABLE -#define __HAL_SD_SDMMC_DISABLE __HAL_SD_SDIO_DISABLE -#define __HAL_SD_SDMMC_DMA_ENABLE __HAL_SD_SDIO_DMA_ENABLE -#define __HAL_SD_SDMMC_DMA_DISABLE __HAL_SD_SDIO_DMA_DISABL -#define __HAL_SD_SDMMC_ENABLE_IT __HAL_SD_SDIO_ENABLE_IT -#define __HAL_SD_SDMMC_DISABLE_IT __HAL_SD_SDIO_DISABLE_IT -#define __HAL_SD_SDMMC_GET_FLAG __HAL_SD_SDIO_GET_FLAG -#define __HAL_SD_SDMMC_CLEAR_FLAG __HAL_SD_SDIO_CLEAR_FLAG -#define __HAL_SD_SDMMC_GET_IT __HAL_SD_SDIO_GET_IT -#define __HAL_SD_SDMMC_CLEAR_IT __HAL_SD_SDIO_CLEAR_IT -#define SDMMC_STATIC_FLAGS SDIO_STATIC_FLAGS -#define SDMMC_CMD0TIMEOUT SDIO_CMD0TIMEOUT -#define SD_SDMMC_SEND_IF_COND SD_SDIO_SEND_IF_COND -/* alias CMSIS */ -#define SDMMC1_IRQn SDIO_IRQn -#define SDMMC1_IRQHandler SDIO_IRQHandler -#endif - -#if defined(STM32F7) || defined(STM32L4) -#define SD_SDIO_DISABLED SD_SDMMC_DISABLED -#define SD_SDIO_FUNCTION_BUSY SD_SDMMC_FUNCTION_BUSY -#define SD_SDIO_FUNCTION_FAILED SD_SDMMC_FUNCTION_FAILED -#define SD_SDIO_UNKNOWN_FUNCTION SD_SDMMC_UNKNOWN_FUNCTION -#define SD_CMD_SDIO_SEN_OP_COND SD_CMD_SDMMC_SEN_OP_COND -#define SD_CMD_SDIO_RW_DIRECT SD_CMD_SDMMC_RW_DIRECT -#define SD_CMD_SDIO_RW_EXTENDED SD_CMD_SDMMC_RW_EXTENDED -#define __HAL_SD_SDIO_ENABLE __HAL_SD_SDMMC_ENABLE -#define __HAL_SD_SDIO_DISABLE __HAL_SD_SDMMC_DISABLE -#define __HAL_SD_SDIO_DMA_ENABLE __HAL_SD_SDMMC_DMA_ENABLE -#define __HAL_SD_SDIO_DMA_DISABL __HAL_SD_SDMMC_DMA_DISABLE -#define __HAL_SD_SDIO_ENABLE_IT __HAL_SD_SDMMC_ENABLE_IT -#define __HAL_SD_SDIO_DISABLE_IT __HAL_SD_SDMMC_DISABLE_IT -#define __HAL_SD_SDIO_GET_FLAG __HAL_SD_SDMMC_GET_FLAG -#define __HAL_SD_SDIO_CLEAR_FLAG __HAL_SD_SDMMC_CLEAR_FLAG -#define __HAL_SD_SDIO_GET_IT __HAL_SD_SDMMC_GET_IT -#define __HAL_SD_SDIO_CLEAR_IT __HAL_SD_SDMMC_CLEAR_IT -#define SDIO_STATIC_FLAGS SDMMC_STATIC_FLAGS -#define SDIO_CMD0TIMEOUT SDMMC_CMD0TIMEOUT -#define SD_SDIO_SEND_IF_COND SD_SDMMC_SEND_IF_COND -/* alias CMSIS for compatibilities */ -#define SDIO_IRQn SDMMC1_IRQn -#define SDIO_IRQHandler SDMMC1_IRQHandler -#endif - -#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) || defined(STM32L4) || defined(STM32H7) -#define HAL_SD_CardCIDTypedef HAL_SD_CardCIDTypeDef -#define HAL_SD_CardCSDTypedef HAL_SD_CardCSDTypeDef -#define HAL_SD_CardStatusTypedef HAL_SD_CardStatusTypeDef -#define HAL_SD_CardStateTypedef HAL_SD_CardStateTypeDef -#endif - -#if defined(STM32H7) || defined(STM32L5) -#define HAL_MMCEx_Read_DMADoubleBuffer0CpltCallback HAL_MMCEx_Read_DMADoubleBuf0CpltCallback -#define HAL_MMCEx_Read_DMADoubleBuffer1CpltCallback HAL_MMCEx_Read_DMADoubleBuf1CpltCallback -#define HAL_MMCEx_Write_DMADoubleBuffer0CpltCallback HAL_MMCEx_Write_DMADoubleBuf0CpltCallback -#define HAL_MMCEx_Write_DMADoubleBuffer1CpltCallback HAL_MMCEx_Write_DMADoubleBuf1CpltCallback -#define HAL_SDEx_Read_DMADoubleBuffer0CpltCallback HAL_SDEx_Read_DMADoubleBuf0CpltCallback -#define HAL_SDEx_Read_DMADoubleBuffer1CpltCallback HAL_SDEx_Read_DMADoubleBuf1CpltCallback -#define HAL_SDEx_Write_DMADoubleBuffer0CpltCallback HAL_SDEx_Write_DMADoubleBuf0CpltCallback -#define HAL_SDEx_Write_DMADoubleBuffer1CpltCallback HAL_SDEx_Write_DMADoubleBuf1CpltCallback -#define HAL_SD_DriveTransciver_1_8V_Callback HAL_SD_DriveTransceiver_1_8V_Callback -#endif -/** - * @} - */ - -/** @defgroup HAL_SMARTCARD_Aliased_Macros HAL SMARTCARD Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __SMARTCARD_ENABLE_IT __HAL_SMARTCARD_ENABLE_IT -#define __SMARTCARD_DISABLE_IT __HAL_SMARTCARD_DISABLE_IT -#define __SMARTCARD_ENABLE __HAL_SMARTCARD_ENABLE -#define __SMARTCARD_DISABLE __HAL_SMARTCARD_DISABLE -#define __SMARTCARD_DMA_REQUEST_ENABLE __HAL_SMARTCARD_DMA_REQUEST_ENABLE -#define __SMARTCARD_DMA_REQUEST_DISABLE __HAL_SMARTCARD_DMA_REQUEST_DISABLE - -#define __HAL_SMARTCARD_GETCLOCKSOURCE SMARTCARD_GETCLOCKSOURCE -#define __SMARTCARD_GETCLOCKSOURCE SMARTCARD_GETCLOCKSOURCE - -#define IS_SMARTCARD_ONEBIT_SAMPLING IS_SMARTCARD_ONE_BIT_SAMPLE - -/** - * @} - */ - -/** @defgroup HAL_SMBUS_Aliased_Macros HAL SMBUS Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_SMBUS_RESET_CR1 SMBUS_RESET_CR1 -#define __HAL_SMBUS_RESET_CR2 SMBUS_RESET_CR2 -#define __HAL_SMBUS_GENERATE_START SMBUS_GENERATE_START -#define __HAL_SMBUS_GET_ADDR_MATCH SMBUS_GET_ADDR_MATCH -#define __HAL_SMBUS_GET_DIR SMBUS_GET_DIR -#define __HAL_SMBUS_GET_STOP_MODE SMBUS_GET_STOP_MODE -#define __HAL_SMBUS_GET_PEC_MODE SMBUS_GET_PEC_MODE -#define __HAL_SMBUS_GET_ALERT_ENABLED SMBUS_GET_ALERT_ENABLED -/** - * @} - */ - -/** @defgroup HAL_SPI_Aliased_Macros HAL SPI Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __HAL_SPI_1LINE_TX SPI_1LINE_TX -#define __HAL_SPI_1LINE_RX SPI_1LINE_RX -#define __HAL_SPI_RESET_CRC SPI_RESET_CRC - -/** - * @} - */ - -/** @defgroup HAL_UART_Aliased_Macros HAL UART Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __HAL_UART_GETCLOCKSOURCE UART_GETCLOCKSOURCE -#define __HAL_UART_MASK_COMPUTATION UART_MASK_COMPUTATION -#define __UART_GETCLOCKSOURCE UART_GETCLOCKSOURCE -#define __UART_MASK_COMPUTATION UART_MASK_COMPUTATION - -#define IS_UART_WAKEUPMETHODE IS_UART_WAKEUPMETHOD - -#define IS_UART_ONEBIT_SAMPLE IS_UART_ONE_BIT_SAMPLE -#define IS_UART_ONEBIT_SAMPLING IS_UART_ONE_BIT_SAMPLE - -/** - * @} - */ - - -/** @defgroup HAL_USART_Aliased_Macros HAL USART Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __USART_ENABLE_IT __HAL_USART_ENABLE_IT -#define __USART_DISABLE_IT __HAL_USART_DISABLE_IT -#define __USART_ENABLE __HAL_USART_ENABLE -#define __USART_DISABLE __HAL_USART_DISABLE - -#define __HAL_USART_GETCLOCKSOURCE USART_GETCLOCKSOURCE -#define __USART_GETCLOCKSOURCE USART_GETCLOCKSOURCE - -#if defined(STM32F0) || defined(STM32F3) || defined(STM32F7) -#define USART_OVERSAMPLING_16 0x00000000U -#define USART_OVERSAMPLING_8 USART_CR1_OVER8 - -#define IS_USART_OVERSAMPLING(__SAMPLING__) (((__SAMPLING__) == USART_OVERSAMPLING_16) || \ - ((__SAMPLING__) == USART_OVERSAMPLING_8)) -#endif /* STM32F0 || STM32F3 || STM32F7 */ -/** - * @} - */ - -/** @defgroup HAL_USB_Aliased_Macros HAL USB Aliased Macros maintained for legacy purpose - * @{ - */ -#define USB_EXTI_LINE_WAKEUP USB_WAKEUP_EXTI_LINE - -#define USB_FS_EXTI_TRIGGER_RISING_EDGE USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE -#define USB_FS_EXTI_TRIGGER_FALLING_EDGE USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE -#define USB_FS_EXTI_TRIGGER_BOTH_EDGE USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE -#define USB_FS_EXTI_LINE_WAKEUP USB_OTG_FS_WAKEUP_EXTI_LINE - -#define USB_HS_EXTI_TRIGGER_RISING_EDGE USB_OTG_HS_WAKEUP_EXTI_RISING_EDGE -#define USB_HS_EXTI_TRIGGER_FALLING_EDGE USB_OTG_HS_WAKEUP_EXTI_FALLING_EDGE -#define USB_HS_EXTI_TRIGGER_BOTH_EDGE USB_OTG_HS_WAKEUP_EXTI_RISING_FALLING_EDGE -#define USB_HS_EXTI_LINE_WAKEUP USB_OTG_HS_WAKEUP_EXTI_LINE - -#define __HAL_USB_EXTI_ENABLE_IT __HAL_USB_WAKEUP_EXTI_ENABLE_IT -#define __HAL_USB_EXTI_DISABLE_IT __HAL_USB_WAKEUP_EXTI_DISABLE_IT -#define __HAL_USB_EXTI_GET_FLAG __HAL_USB_WAKEUP_EXTI_GET_FLAG -#define __HAL_USB_EXTI_CLEAR_FLAG __HAL_USB_WAKEUP_EXTI_CLEAR_FLAG -#define __HAL_USB_EXTI_SET_RISING_EDGE_TRIGGER __HAL_USB_WAKEUP_EXTI_ENABLE_RISING_EDGE -#define __HAL_USB_EXTI_SET_FALLING_EDGE_TRIGGER __HAL_USB_WAKEUP_EXTI_ENABLE_FALLING_EDGE -#define __HAL_USB_EXTI_SET_FALLINGRISING_TRIGGER __HAL_USB_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE - -#define __HAL_USB_FS_EXTI_ENABLE_IT __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT -#define __HAL_USB_FS_EXTI_DISABLE_IT __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT -#define __HAL_USB_FS_EXTI_GET_FLAG __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG -#define __HAL_USB_FS_EXTI_CLEAR_FLAG __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG -#define __HAL_USB_FS_EXTI_SET_RISING_EGDE_TRIGGER __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE -#define __HAL_USB_FS_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_FALLING_EDGE -#define __HAL_USB_FS_EXTI_SET_FALLINGRISING_TRIGGER __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE -#define __HAL_USB_FS_EXTI_GENERATE_SWIT __HAL_USB_OTG_FS_WAKEUP_EXTI_GENERATE_SWIT - -#define __HAL_USB_HS_EXTI_ENABLE_IT __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_IT -#define __HAL_USB_HS_EXTI_DISABLE_IT __HAL_USB_OTG_HS_WAKEUP_EXTI_DISABLE_IT -#define __HAL_USB_HS_EXTI_GET_FLAG __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG -#define __HAL_USB_HS_EXTI_CLEAR_FLAG __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG -#define __HAL_USB_HS_EXTI_SET_RISING_EGDE_TRIGGER __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE -#define __HAL_USB_HS_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_FALLING_EDGE -#define __HAL_USB_HS_EXTI_SET_FALLINGRISING_TRIGGER __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE -#define __HAL_USB_HS_EXTI_GENERATE_SWIT __HAL_USB_OTG_HS_WAKEUP_EXTI_GENERATE_SWIT - -#define HAL_PCD_ActiveRemoteWakeup HAL_PCD_ActivateRemoteWakeup -#define HAL_PCD_DeActiveRemoteWakeup HAL_PCD_DeActivateRemoteWakeup - -#define HAL_PCD_SetTxFiFo HAL_PCDEx_SetTxFiFo -#define HAL_PCD_SetRxFiFo HAL_PCDEx_SetRxFiFo -#if defined(STM32U5) -#define USB_OTG_GOTGCTL_BSESVLD USB_OTG_GOTGCTL_BSVLD -#define USB_OTG_GAHBCFG_GINT USB_OTG_GAHBCFG_GINTMSK -#define USB_OTG_GUSBCFG_PHYLPCS USB_OTG_GUSBCFG_PHYLPC -#define USB_OTG_GRSTCTL_HSRST USB_OTG_GRSTCTL_PSRST -#define USB_OTG_GINTSTS_BOUTNAKEFF USB_OTG_GINTSTS_GONAKEFF -#define USB_OTG_GINTSTS_WKUINT USB_OTG_GINTSTS_WKUPINT -#define USB_OTG_GINTMSK_PXFRM_IISOOXFRM USB_OTG_GINTMSK_IPXFRM_IISOOXFRM -#define USB_OTG_GRXSTSP_EPNUM USB_OTG_GRXSTSP_EPNUM_CHNUM -#define USB_OTG_GLPMCFG_L1ResumeOK USB_OTG_GLPMCFG_L1RSMOK -#define USB_OTG_HPTXFSIZ_PTXFD USB_OTG_HPTXFSIZ_PTXFSIZ -#define USB_OTG_HCCHAR_MC USB_OTG_HCCHAR_MCNT -#define USB_OTG_HCCHAR_MC_0 USB_OTG_HCCHAR_MCNT_0 -#define USB_OTG_HCCHAR_MC_1 USB_OTG_HCCHAR_MCNT_1 -#define USB_OTG_HCINTMSK_AHBERR USB_OTG_HCINTMSK_AHBERRM -#define USB_OTG_HCTSIZ_DOPING USB_OTG_HCTSIZ_DOPNG -#define USB_OTG_DOEPMSK_OPEM USB_OTG_DOEPMSK_OUTPKTERRM -#define USB_OTG_DIEPCTL_SODDFRM USB_OTG_DIEPCTL_SD1PID_SODDFRM -#define USB_OTG_DIEPTSIZ_MULCNT USB_OTG_DIEPTSIZ_MCNT -#define USB_OTG_DOEPCTL_SODDFRM USB_OTG_DOEPCTL_SD1PID_SODDFRM -#define USB_OTG_DOEPCTL_DPID USB_OTG_DOEPCTL_DPID_EONUM -#define USB_OTG_DOEPTSIZ_STUPCNT USB_OTG_DOEPTSIZ_RXDPID -#define USB_OTG_DOEPTSIZ_STUPCNT_0 USB_OTG_DOEPTSIZ_RXDPID_0 -#define USB_OTG_DOEPTSIZ_STUPCNT_1 USB_OTG_DOEPTSIZ_RXDPID_1 -#define USB_OTG_PCGCCTL_STOPCLK USB_OTG_PCGCCTL_STPPCLK -#define USB_OTG_PCGCCTL_GATECLK USB_OTG_PCGCCTL_GATEHCLK -#endif -/** - * @} - */ - -/** @defgroup HAL_TIM_Aliased_Macros HAL TIM Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_TIM_SetICPrescalerValue TIM_SET_ICPRESCALERVALUE -#define __HAL_TIM_ResetICPrescalerValue TIM_RESET_ICPRESCALERVALUE - -#define TIM_GET_ITSTATUS __HAL_TIM_GET_IT_SOURCE -#define TIM_GET_CLEAR_IT __HAL_TIM_CLEAR_IT - -#define __HAL_TIM_GET_ITSTATUS __HAL_TIM_GET_IT_SOURCE - -#define __HAL_TIM_DIRECTION_STATUS __HAL_TIM_IS_TIM_COUNTING_DOWN -#define __HAL_TIM_PRESCALER __HAL_TIM_SET_PRESCALER -#define __HAL_TIM_SetCounter __HAL_TIM_SET_COUNTER -#define __HAL_TIM_GetCounter __HAL_TIM_GET_COUNTER -#define __HAL_TIM_SetAutoreload __HAL_TIM_SET_AUTORELOAD -#define __HAL_TIM_GetAutoreload __HAL_TIM_GET_AUTORELOAD -#define __HAL_TIM_SetClockDivision __HAL_TIM_SET_CLOCKDIVISION -#define __HAL_TIM_GetClockDivision __HAL_TIM_GET_CLOCKDIVISION -#define __HAL_TIM_SetICPrescaler __HAL_TIM_SET_ICPRESCALER -#define __HAL_TIM_GetICPrescaler __HAL_TIM_GET_ICPRESCALER -#define __HAL_TIM_SetCompare __HAL_TIM_SET_COMPARE -#define __HAL_TIM_GetCompare __HAL_TIM_GET_COMPARE - -#define TIM_BREAKINPUTSOURCE_DFSDM TIM_BREAKINPUTSOURCE_DFSDM1 - -#define TIM_OCMODE_ASSYMETRIC_PWM1 TIM_OCMODE_ASYMMETRIC_PWM1 -#define TIM_OCMODE_ASSYMETRIC_PWM2 TIM_OCMODE_ASYMMETRIC_PWM2 -/** - * @} - */ - -/** @defgroup HAL_ETH_Aliased_Macros HAL ETH Aliased Macros maintained for legacy purpose - * @{ - */ - -#define __HAL_ETH_EXTI_ENABLE_IT __HAL_ETH_WAKEUP_EXTI_ENABLE_IT -#define __HAL_ETH_EXTI_DISABLE_IT __HAL_ETH_WAKEUP_EXTI_DISABLE_IT -#define __HAL_ETH_EXTI_GET_FLAG __HAL_ETH_WAKEUP_EXTI_GET_FLAG -#define __HAL_ETH_EXTI_CLEAR_FLAG __HAL_ETH_WAKEUP_EXTI_CLEAR_FLAG -#define __HAL_ETH_EXTI_SET_RISING_EGDE_TRIGGER __HAL_ETH_WAKEUP_EXTI_ENABLE_RISING_EDGE_TRIGGER -#define __HAL_ETH_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_ETH_WAKEUP_EXTI_ENABLE_FALLING_EDGE_TRIGGER -#define __HAL_ETH_EXTI_SET_FALLINGRISING_TRIGGER __HAL_ETH_WAKEUP_EXTI_ENABLE_FALLINGRISING_TRIGGER - -#define ETH_PROMISCIOUSMODE_ENABLE ETH_PROMISCUOUS_MODE_ENABLE -#define ETH_PROMISCIOUSMODE_DISABLE ETH_PROMISCUOUS_MODE_DISABLE -#define IS_ETH_PROMISCIOUS_MODE IS_ETH_PROMISCUOUS_MODE -/** - * @} - */ - -/** @defgroup HAL_LTDC_Aliased_Macros HAL LTDC Aliased Macros maintained for legacy purpose - * @{ - */ -#define __HAL_LTDC_LAYER LTDC_LAYER -#define __HAL_LTDC_RELOAD_CONFIG __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG -/** - * @} - */ - -/** @defgroup HAL_SAI_Aliased_Macros HAL SAI Aliased Macros maintained for legacy purpose - * @{ - */ -#define SAI_OUTPUTDRIVE_DISABLED SAI_OUTPUTDRIVE_DISABLE -#define SAI_OUTPUTDRIVE_ENABLED SAI_OUTPUTDRIVE_ENABLE -#define SAI_MASTERDIVIDER_ENABLED SAI_MASTERDIVIDER_ENABLE -#define SAI_MASTERDIVIDER_DISABLED SAI_MASTERDIVIDER_DISABLE -#define SAI_STREOMODE SAI_STEREOMODE -#define SAI_FIFOStatus_Empty SAI_FIFOSTATUS_EMPTY -#define SAI_FIFOStatus_Less1QuarterFull SAI_FIFOSTATUS_LESS1QUARTERFULL -#define SAI_FIFOStatus_1QuarterFull SAI_FIFOSTATUS_1QUARTERFULL -#define SAI_FIFOStatus_HalfFull SAI_FIFOSTATUS_HALFFULL -#define SAI_FIFOStatus_3QuartersFull SAI_FIFOSTATUS_3QUARTERFULL -#define SAI_FIFOStatus_Full SAI_FIFOSTATUS_FULL -#define IS_SAI_BLOCK_MONO_STREO_MODE IS_SAI_BLOCK_MONO_STEREO_MODE -#define SAI_SYNCHRONOUS_EXT SAI_SYNCHRONOUS_EXT_SAI1 -#define SAI_SYNCEXT_IN_ENABLE SAI_SYNCEXT_OUTBLOCKA_ENABLE -/** - * @} - */ - -/** @defgroup HAL_SPDIFRX_Aliased_Macros HAL SPDIFRX Aliased Macros maintained for legacy purpose - * @{ - */ -#if defined(STM32H7) -#define HAL_SPDIFRX_ReceiveControlFlow HAL_SPDIFRX_ReceiveCtrlFlow -#define HAL_SPDIFRX_ReceiveControlFlow_IT HAL_SPDIFRX_ReceiveCtrlFlow_IT -#define HAL_SPDIFRX_ReceiveControlFlow_DMA HAL_SPDIFRX_ReceiveCtrlFlow_DMA -#endif -/** - * @} - */ - -/** @defgroup HAL_HRTIM_Aliased_Functions HAL HRTIM Aliased Functions maintained for legacy purpose - * @{ - */ -#if defined (STM32H7) || defined (STM32G4) || defined (STM32F3) -#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT -#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA -#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart -#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT -#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA -#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop -#endif -/** - * @} - */ - -/** @defgroup HAL_QSPI_Aliased_Macros HAL QSPI Aliased Macros maintained for legacy purpose - * @{ - */ -#if defined (STM32L4) || defined (STM32F4) || defined (STM32F7) || defined(STM32H7) -#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE -#endif /* STM32L4 || STM32F4 || STM32F7 */ -/** - * @} - */ - -/** @defgroup HAL_Generic_Aliased_Macros HAL Generic Aliased Macros maintained for legacy purpose - * @{ - */ -#if defined (STM32F7) -#define ART_ACCLERATOR_ENABLE ART_ACCELERATOR_ENABLE -#endif /* STM32F7 */ -/** - * @} - */ - -/** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose - * @{ - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32_HAL_LEGACY */ - - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h deleted file mode 100644 index f7eb847..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h +++ /dev/null @@ -1,297 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal.h - * @author MCD Application Team - * @brief This file contains all the functions prototypes for the HAL - * module driver. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_H -#define __STM32F4xx_HAL_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_conf.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup HAL - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup HAL_Exported_Constants HAL Exported Constants - * @{ - */ - -/** @defgroup HAL_TICK_FREQ Tick Frequency - * @{ - */ -typedef enum -{ - HAL_TICK_FREQ_10HZ = 100U, - HAL_TICK_FREQ_100HZ = 10U, - HAL_TICK_FREQ_1KHZ = 1U, - HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ -} HAL_TickFreqTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup HAL_Exported_Macros HAL Exported Macros - * @{ - */ - -/** @brief Freeze/Unfreeze Peripherals in Debug mode - */ -#define __HAL_DBGMCU_FREEZE_TIM2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM2_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM3() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM3_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM4() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM4_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM5() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM5_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM6() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM6_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM7() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM7_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM12() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM12_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM13() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM13_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM14() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM14_STOP)) -#define __HAL_DBGMCU_FREEZE_RTC() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_RTC_STOP)) -#define __HAL_DBGMCU_FREEZE_WWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_WWDG_STOP)) -#define __HAL_DBGMCU_FREEZE_IWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_IWDG_STOP)) -#define __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_FREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_FREEZE_CAN1() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN1_STOP)) -#define __HAL_DBGMCU_FREEZE_CAN2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN2_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM1() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM1_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM8() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM8_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM9() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM9_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM10() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM10_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM11() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM11_STOP)) - -#define __HAL_DBGMCU_UNFREEZE_TIM2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM2_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM3() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM3_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM4() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM4_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM5() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM5_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM6() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM6_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM7() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM7_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM12() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM12_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM13() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM13_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM14() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM14_STOP)) -#define __HAL_DBGMCU_UNFREEZE_RTC() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_RTC_STOP)) -#define __HAL_DBGMCU_UNFREEZE_WWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_WWDG_STOP)) -#define __HAL_DBGMCU_UNFREEZE_IWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_IWDG_STOP)) -#define __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_UNFREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_UNFREEZE_CAN1() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN1_STOP)) -#define __HAL_DBGMCU_UNFREEZE_CAN2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN2_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM1() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM1_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM8() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM8_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM9() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM9_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM10() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM10_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM11() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM11_STOP)) - -/** @brief Main Flash memory mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FLASH() (SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE)) - -/** @brief System Flash memory mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= SYSCFG_MEMRMP_MEM_MODE_0;\ - }while(0); - -/** @brief Embedded SRAM mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_SRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_0 | SYSCFG_MEMRMP_MEM_MODE_1);\ - }while(0); - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -/** @brief FSMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FSMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ - }while(0); -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -/** @brief FMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ - }while(0); - -/** @brief FMC/SDRAM Bank 1 and 2 mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_2);\ - }while(0); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup Cortex_Lockup_Enable Cortex Lockup Enable - * @{ - */ -/** @brief SYSCFG Break Lockup lock - * Enables and locks the connection of Cortex-M4 LOCKUP (Hardfault) output to TIM1/8 input - * @note The selected configuration is locked and can be unlocked by system reset - */ -#define __HAL_SYSCFG_BREAK_PVD_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_PVD_LOCK); \ - SYSCFG->CFGR2 |= SYSCFG_CFGR2_PVD_LOCK; \ - }while(0) -/** - * @} - */ - -/** @defgroup PVD_Lock_Enable PVD Lock - * @{ - */ -/** @brief SYSCFG Break PVD lock - * Enables and locks the PVD connection with Timer1/8 Break Input, , as well as the PVDE and PLS[2:0] in the PWR_CR register - * @note The selected configuration is locked and can be unlocked by system reset - */ -#define __HAL_SYSCFG_BREAK_LOCKUP_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_LOCKUP_LOCK); \ - SYSCFG->CFGR2 |= SYSCFG_CFGR2_LOCKUP_LOCK; \ - }while(0) -/** - * @} - */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup HAL_Private_Macros HAL Private Macros - * @{ - */ -#define IS_TICKFREQ(FREQ) (((FREQ) == HAL_TICK_FREQ_10HZ) || \ - ((FREQ) == HAL_TICK_FREQ_100HZ) || \ - ((FREQ) == HAL_TICK_FREQ_1KHZ)) -/** - * @} - */ - -/* Exported variables --------------------------------------------------------*/ - -/** @addtogroup HAL_Exported_Variables - * @{ - */ -extern __IO uint32_t uwTick; -extern uint32_t uwTickPrio; -extern HAL_TickFreqTypeDef uwTickFreq; -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_Exported_Functions - * @{ - */ -/** @addtogroup HAL_Exported_Functions_Group1 - * @{ - */ -/* Initialization and Configuration functions ******************************/ -HAL_StatusTypeDef HAL_Init(void); -HAL_StatusTypeDef HAL_DeInit(void); -void HAL_MspInit(void); -void HAL_MspDeInit(void); -HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority); -/** - * @} - */ - -/** @addtogroup HAL_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions ************************************************/ -void HAL_IncTick(void); -void HAL_Delay(uint32_t Delay); -uint32_t HAL_GetTick(void); -uint32_t HAL_GetTickPrio(void); -HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq); -HAL_TickFreqTypeDef HAL_GetTickFreq(void); -void HAL_SuspendTick(void); -void HAL_ResumeTick(void); -uint32_t HAL_GetHalVersion(void); -uint32_t HAL_GetREVID(void); -uint32_t HAL_GetDEVID(void); -void HAL_DBGMCU_EnableDBGSleepMode(void); -void HAL_DBGMCU_DisableDBGSleepMode(void); -void HAL_DBGMCU_EnableDBGStopMode(void); -void HAL_DBGMCU_DisableDBGStopMode(void); -void HAL_DBGMCU_EnableDBGStandbyMode(void); -void HAL_DBGMCU_DisableDBGStandbyMode(void); -void HAL_EnableCompensationCell(void); -void HAL_DisableCompensationCell(void); -uint32_t HAL_GetUIDw0(void); -uint32_t HAL_GetUIDw1(void); -uint32_t HAL_GetUIDw2(void); -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -void HAL_EnableMemorySwappingBank(void); -void HAL_DisableMemorySwappingBank(void); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup HAL_Private_Variables HAL Private Variables - * @{ - */ -/** - * @} - */ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup HAL_Private_Constants HAL Private Constants - * @{ - */ -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_H */ - - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h deleted file mode 100644 index 7690930..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h +++ /dev/null @@ -1,410 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_cortex.h - * @author MCD Application Team - * @brief Header file of CORTEX HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_CORTEX_H -#define __STM32F4xx_HAL_CORTEX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup CORTEX - * @{ - */ -/* Exported types ------------------------------------------------------------*/ -/** @defgroup CORTEX_Exported_Types Cortex Exported Types - * @{ - */ - -#if (__MPU_PRESENT == 1U) -/** @defgroup CORTEX_MPU_Region_Initialization_Structure_definition MPU Region Initialization Structure Definition - * @brief MPU Region initialization structure - * @{ - */ -typedef struct -{ - uint8_t Enable; /*!< Specifies the status of the region. - This parameter can be a value of @ref CORTEX_MPU_Region_Enable */ - uint8_t Number; /*!< Specifies the number of the region to protect. - This parameter can be a value of @ref CORTEX_MPU_Region_Number */ - uint32_t BaseAddress; /*!< Specifies the base address of the region to protect. */ - uint8_t Size; /*!< Specifies the size of the region to protect. - This parameter can be a value of @ref CORTEX_MPU_Region_Size */ - uint8_t SubRegionDisable; /*!< Specifies the number of the subregion protection to disable. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF */ - uint8_t TypeExtField; /*!< Specifies the TEX field level. - This parameter can be a value of @ref CORTEX_MPU_TEX_Levels */ - uint8_t AccessPermission; /*!< Specifies the region access permission type. - This parameter can be a value of @ref CORTEX_MPU_Region_Permission_Attributes */ - uint8_t DisableExec; /*!< Specifies the instruction access status. - This parameter can be a value of @ref CORTEX_MPU_Instruction_Access */ - uint8_t IsShareable; /*!< Specifies the shareability status of the protected region. - This parameter can be a value of @ref CORTEX_MPU_Access_Shareable */ - uint8_t IsCacheable; /*!< Specifies the cacheable status of the region protected. - This parameter can be a value of @ref CORTEX_MPU_Access_Cacheable */ - uint8_t IsBufferable; /*!< Specifies the bufferable status of the protected region. - This parameter can be a value of @ref CORTEX_MPU_Access_Bufferable */ -}MPU_Region_InitTypeDef; -/** - * @} - */ -#endif /* __MPU_PRESENT */ - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup CORTEX_Exported_Constants CORTEX Exported Constants - * @{ - */ - -/** @defgroup CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group - * @{ - */ -#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority - 4 bits for subpriority */ -#define NVIC_PRIORITYGROUP_1 0x00000006U /*!< 1 bits for pre-emption priority - 3 bits for subpriority */ -#define NVIC_PRIORITYGROUP_2 0x00000005U /*!< 2 bits for pre-emption priority - 2 bits for subpriority */ -#define NVIC_PRIORITYGROUP_3 0x00000004U /*!< 3 bits for pre-emption priority - 1 bits for subpriority */ -#define NVIC_PRIORITYGROUP_4 0x00000003U /*!< 4 bits for pre-emption priority - 0 bits for subpriority */ -/** - * @} - */ - -/** @defgroup CORTEX_SysTick_clock_source CORTEX _SysTick clock source - * @{ - */ -#define SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U -#define SYSTICK_CLKSOURCE_HCLK 0x00000004U - -/** - * @} - */ - -#if (__MPU_PRESENT == 1) -/** @defgroup CORTEX_MPU_HFNMI_PRIVDEF_Control MPU HFNMI and PRIVILEGED Access control - * @{ - */ -#define MPU_HFNMI_PRIVDEF_NONE 0x00000000U -#define MPU_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk -#define MPU_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk -#define MPU_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) - -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Enable CORTEX MPU Region Enable - * @{ - */ -#define MPU_REGION_ENABLE ((uint8_t)0x01) -#define MPU_REGION_DISABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access - * @{ - */ -#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00) -#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable - * @{ - */ -#define MPU_ACCESS_SHAREABLE ((uint8_t)0x01) -#define MPU_ACCESS_NOT_SHAREABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Access_Cacheable CORTEX MPU Instruction Access Cacheable - * @{ - */ -#define MPU_ACCESS_CACHEABLE ((uint8_t)0x01) -#define MPU_ACCESS_NOT_CACHEABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Access_Bufferable CORTEX MPU Instruction Access Bufferable - * @{ - */ -#define MPU_ACCESS_BUFFERABLE ((uint8_t)0x01) -#define MPU_ACCESS_NOT_BUFFERABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_TEX_Levels MPU TEX Levels - * @{ - */ -#define MPU_TEX_LEVEL0 ((uint8_t)0x00) -#define MPU_TEX_LEVEL1 ((uint8_t)0x01) -#define MPU_TEX_LEVEL2 ((uint8_t)0x02) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Size CORTEX MPU Region Size - * @{ - */ -#define MPU_REGION_SIZE_32B ((uint8_t)0x04) -#define MPU_REGION_SIZE_64B ((uint8_t)0x05) -#define MPU_REGION_SIZE_128B ((uint8_t)0x06) -#define MPU_REGION_SIZE_256B ((uint8_t)0x07) -#define MPU_REGION_SIZE_512B ((uint8_t)0x08) -#define MPU_REGION_SIZE_1KB ((uint8_t)0x09) -#define MPU_REGION_SIZE_2KB ((uint8_t)0x0A) -#define MPU_REGION_SIZE_4KB ((uint8_t)0x0B) -#define MPU_REGION_SIZE_8KB ((uint8_t)0x0C) -#define MPU_REGION_SIZE_16KB ((uint8_t)0x0D) -#define MPU_REGION_SIZE_32KB ((uint8_t)0x0E) -#define MPU_REGION_SIZE_64KB ((uint8_t)0x0F) -#define MPU_REGION_SIZE_128KB ((uint8_t)0x10) -#define MPU_REGION_SIZE_256KB ((uint8_t)0x11) -#define MPU_REGION_SIZE_512KB ((uint8_t)0x12) -#define MPU_REGION_SIZE_1MB ((uint8_t)0x13) -#define MPU_REGION_SIZE_2MB ((uint8_t)0x14) -#define MPU_REGION_SIZE_4MB ((uint8_t)0x15) -#define MPU_REGION_SIZE_8MB ((uint8_t)0x16) -#define MPU_REGION_SIZE_16MB ((uint8_t)0x17) -#define MPU_REGION_SIZE_32MB ((uint8_t)0x18) -#define MPU_REGION_SIZE_64MB ((uint8_t)0x19) -#define MPU_REGION_SIZE_128MB ((uint8_t)0x1A) -#define MPU_REGION_SIZE_256MB ((uint8_t)0x1B) -#define MPU_REGION_SIZE_512MB ((uint8_t)0x1C) -#define MPU_REGION_SIZE_1GB ((uint8_t)0x1D) -#define MPU_REGION_SIZE_2GB ((uint8_t)0x1E) -#define MPU_REGION_SIZE_4GB ((uint8_t)0x1F) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes - * @{ - */ -#define MPU_REGION_NO_ACCESS ((uint8_t)0x00) -#define MPU_REGION_PRIV_RW ((uint8_t)0x01) -#define MPU_REGION_PRIV_RW_URO ((uint8_t)0x02) -#define MPU_REGION_FULL_ACCESS ((uint8_t)0x03) -#define MPU_REGION_PRIV_RO ((uint8_t)0x05) -#define MPU_REGION_PRIV_RO_URO ((uint8_t)0x06) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Number CORTEX MPU Region Number - * @{ - */ -#define MPU_REGION_NUMBER0 ((uint8_t)0x00) -#define MPU_REGION_NUMBER1 ((uint8_t)0x01) -#define MPU_REGION_NUMBER2 ((uint8_t)0x02) -#define MPU_REGION_NUMBER3 ((uint8_t)0x03) -#define MPU_REGION_NUMBER4 ((uint8_t)0x04) -#define MPU_REGION_NUMBER5 ((uint8_t)0x05) -#define MPU_REGION_NUMBER6 ((uint8_t)0x06) -#define MPU_REGION_NUMBER7 ((uint8_t)0x07) -/** - * @} - */ -#endif /* __MPU_PRESENT */ - -/** - * @} - */ - - -/* Exported Macros -----------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup CORTEX_Exported_Functions - * @{ - */ - -/** @addtogroup CORTEX_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup); -void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); -void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); -void HAL_NVIC_DisableIRQ(IRQn_Type IRQn); -void HAL_NVIC_SystemReset(void); -uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb); -/** - * @} - */ - -/** @addtogroup CORTEX_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions ***********************************************/ -uint32_t HAL_NVIC_GetPriorityGrouping(void); -void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority); -uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn); -void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn); -void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn); -uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn); -void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource); -void HAL_SYSTICK_IRQHandler(void); -void HAL_SYSTICK_Callback(void); - -#if (__MPU_PRESENT == 1U) -void HAL_MPU_Enable(uint32_t MPU_Control); -void HAL_MPU_Disable(void); -void HAL_MPU_EnableRegion(uint32_t RegionNumber); -void HAL_MPU_DisableRegion(uint32_t RegionNumber); -void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init); -#endif /* __MPU_PRESENT */ -void HAL_CORTEX_ClearEvent(void); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup CORTEX_Private_Macros CORTEX Private Macros - * @{ - */ -#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PRIORITYGROUP_0) || \ - ((GROUP) == NVIC_PRIORITYGROUP_1) || \ - ((GROUP) == NVIC_PRIORITYGROUP_2) || \ - ((GROUP) == NVIC_PRIORITYGROUP_3) || \ - ((GROUP) == NVIC_PRIORITYGROUP_4)) - -#define IS_NVIC_PREEMPTION_PRIORITY(PRIORITY) ((PRIORITY) < 0x10U) - -#define IS_NVIC_SUB_PRIORITY(PRIORITY) ((PRIORITY) < 0x10U) - -#define IS_NVIC_DEVICE_IRQ(IRQ) ((IRQ) >= (IRQn_Type)0x00U) - -#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SYSTICK_CLKSOURCE_HCLK) || \ - ((SOURCE) == SYSTICK_CLKSOURCE_HCLK_DIV8)) - -#if (__MPU_PRESENT == 1U) -#define IS_MPU_REGION_ENABLE(STATE) (((STATE) == MPU_REGION_ENABLE) || \ - ((STATE) == MPU_REGION_DISABLE)) - -#define IS_MPU_INSTRUCTION_ACCESS(STATE) (((STATE) == MPU_INSTRUCTION_ACCESS_ENABLE) || \ - ((STATE) == MPU_INSTRUCTION_ACCESS_DISABLE)) - -#define IS_MPU_ACCESS_SHAREABLE(STATE) (((STATE) == MPU_ACCESS_SHAREABLE) || \ - ((STATE) == MPU_ACCESS_NOT_SHAREABLE)) - -#define IS_MPU_ACCESS_CACHEABLE(STATE) (((STATE) == MPU_ACCESS_CACHEABLE) || \ - ((STATE) == MPU_ACCESS_NOT_CACHEABLE)) - -#define IS_MPU_ACCESS_BUFFERABLE(STATE) (((STATE) == MPU_ACCESS_BUFFERABLE) || \ - ((STATE) == MPU_ACCESS_NOT_BUFFERABLE)) - -#define IS_MPU_TEX_LEVEL(TYPE) (((TYPE) == MPU_TEX_LEVEL0) || \ - ((TYPE) == MPU_TEX_LEVEL1) || \ - ((TYPE) == MPU_TEX_LEVEL2)) - -#define IS_MPU_REGION_PERMISSION_ATTRIBUTE(TYPE) (((TYPE) == MPU_REGION_NO_ACCESS) || \ - ((TYPE) == MPU_REGION_PRIV_RW) || \ - ((TYPE) == MPU_REGION_PRIV_RW_URO) || \ - ((TYPE) == MPU_REGION_FULL_ACCESS) || \ - ((TYPE) == MPU_REGION_PRIV_RO) || \ - ((TYPE) == MPU_REGION_PRIV_RO_URO)) - -#define IS_MPU_REGION_NUMBER(NUMBER) (((NUMBER) == MPU_REGION_NUMBER0) || \ - ((NUMBER) == MPU_REGION_NUMBER1) || \ - ((NUMBER) == MPU_REGION_NUMBER2) || \ - ((NUMBER) == MPU_REGION_NUMBER3) || \ - ((NUMBER) == MPU_REGION_NUMBER4) || \ - ((NUMBER) == MPU_REGION_NUMBER5) || \ - ((NUMBER) == MPU_REGION_NUMBER6) || \ - ((NUMBER) == MPU_REGION_NUMBER7)) - -#define IS_MPU_REGION_SIZE(SIZE) (((SIZE) == MPU_REGION_SIZE_32B) || \ - ((SIZE) == MPU_REGION_SIZE_64B) || \ - ((SIZE) == MPU_REGION_SIZE_128B) || \ - ((SIZE) == MPU_REGION_SIZE_256B) || \ - ((SIZE) == MPU_REGION_SIZE_512B) || \ - ((SIZE) == MPU_REGION_SIZE_1KB) || \ - ((SIZE) == MPU_REGION_SIZE_2KB) || \ - ((SIZE) == MPU_REGION_SIZE_4KB) || \ - ((SIZE) == MPU_REGION_SIZE_8KB) || \ - ((SIZE) == MPU_REGION_SIZE_16KB) || \ - ((SIZE) == MPU_REGION_SIZE_32KB) || \ - ((SIZE) == MPU_REGION_SIZE_64KB) || \ - ((SIZE) == MPU_REGION_SIZE_128KB) || \ - ((SIZE) == MPU_REGION_SIZE_256KB) || \ - ((SIZE) == MPU_REGION_SIZE_512KB) || \ - ((SIZE) == MPU_REGION_SIZE_1MB) || \ - ((SIZE) == MPU_REGION_SIZE_2MB) || \ - ((SIZE) == MPU_REGION_SIZE_4MB) || \ - ((SIZE) == MPU_REGION_SIZE_8MB) || \ - ((SIZE) == MPU_REGION_SIZE_16MB) || \ - ((SIZE) == MPU_REGION_SIZE_32MB) || \ - ((SIZE) == MPU_REGION_SIZE_64MB) || \ - ((SIZE) == MPU_REGION_SIZE_128MB) || \ - ((SIZE) == MPU_REGION_SIZE_256MB) || \ - ((SIZE) == MPU_REGION_SIZE_512MB) || \ - ((SIZE) == MPU_REGION_SIZE_1GB) || \ - ((SIZE) == MPU_REGION_SIZE_2GB) || \ - ((SIZE) == MPU_REGION_SIZE_4GB)) - -#define IS_MPU_SUB_REGION_DISABLE(SUBREGION) ((SUBREGION) < (uint16_t)0x00FF) -#endif /* __MPU_PRESENT */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_CORTEX_H */ - - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h deleted file mode 100644 index 1df0d7d..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h +++ /dev/null @@ -1,212 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_def.h - * @author MCD Application Team - * @brief This file contains HAL common defines, enumeration, macros and - * structures definitions. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_DEF -#define __STM32F4xx_HAL_DEF - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" -#include "Legacy/stm32_hal_legacy.h" -#include - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief HAL Status structures definition - */ -typedef enum -{ - HAL_OK = 0x00U, - HAL_ERROR = 0x01U, - HAL_BUSY = 0x02U, - HAL_TIMEOUT = 0x03U -} HAL_StatusTypeDef; - -/** - * @brief HAL Lock structures definition - */ -typedef enum -{ - HAL_UNLOCKED = 0x00U, - HAL_LOCKED = 0x01U -} HAL_LockTypeDef; - -/* Exported macro ------------------------------------------------------------*/ - -#if !defined(UNUSED) -#define UNUSED(X) (void)X /* To avoid gcc/g++ warnings */ -#endif /* UNUSED */ - -#define HAL_MAX_DELAY 0xFFFFFFFFU - -#define HAL_IS_BIT_SET(REG, BIT) (((REG) & (BIT)) == (BIT)) -#define HAL_IS_BIT_CLR(REG, BIT) (((REG) & (BIT)) == 0U) - -#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \ - do{ \ - (__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__); \ - (__DMA_HANDLE__).Parent = (__HANDLE__); \ - } while(0U) - -/** @brief Reset the Handle's State field. - * @param __HANDLE__ specifies the Peripheral Handle. - * @note This macro can be used for the following purpose: - * - When the Handle is declared as local variable; before passing it as parameter - * to HAL_PPP_Init() for the first time, it is mandatory to use this macro - * to set to 0 the Handle's "State" field. - * Otherwise, "State" field may have any random value and the first time the function - * HAL_PPP_Init() is called, the low level hardware initialization will be missed - * (i.e. HAL_PPP_MspInit() will not be executed). - * - When there is a need to reconfigure the low level hardware: instead of calling - * HAL_PPP_DeInit() then HAL_PPP_Init(), user can make a call to this macro then HAL_PPP_Init(). - * In this later function, when the Handle's "State" field is set to 0, it will execute the function - * HAL_PPP_MspInit() which will reconfigure the low level hardware. - * @retval None - */ -#define __HAL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = 0U) - -#if (USE_RTOS == 1U) - /* Reserved for future use */ - #error "USE_RTOS should be 0 in the current HAL release" -#else - #define __HAL_LOCK(__HANDLE__) \ - do{ \ - if((__HANDLE__)->Lock == HAL_LOCKED) \ - { \ - return HAL_BUSY; \ - } \ - else \ - { \ - (__HANDLE__)->Lock = HAL_LOCKED; \ - } \ - }while (0U) - - #define __HAL_UNLOCK(__HANDLE__) \ - do{ \ - (__HANDLE__)->Lock = HAL_UNLOCKED; \ - }while (0U) -#endif /* USE_RTOS */ - -#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler V6 */ - #ifndef __weak - #define __weak __attribute__((weak)) - #endif - #ifndef __packed - #define __packed __attribute__((packed)) - #endif -#elif defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ - #ifndef __weak - #define __weak __attribute__((weak)) - #endif /* __weak */ - #ifndef __packed - #define __packed __attribute__((__packed__)) - #endif /* __packed */ -#endif /* __GNUC__ */ - - -/* Macro to get variable aligned on 4-bytes, for __ICCARM__ the directive "#pragma data_alignment=4" must be used instead */ -#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler V6 */ - #ifndef __ALIGN_BEGIN - #define __ALIGN_BEGIN - #endif - #ifndef __ALIGN_END - #define __ALIGN_END __attribute__ ((aligned (4))) - #endif -#elif defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ - #ifndef __ALIGN_END -#define __ALIGN_END __attribute__ ((aligned (4))) - #endif /* __ALIGN_END */ - #ifndef __ALIGN_BEGIN - #define __ALIGN_BEGIN - #endif /* __ALIGN_BEGIN */ -#else - #ifndef __ALIGN_END - #define __ALIGN_END - #endif /* __ALIGN_END */ - #ifndef __ALIGN_BEGIN - #if defined (__CC_ARM) /* ARM Compiler V5*/ -#define __ALIGN_BEGIN __align(4) - #elif defined (__ICCARM__) /* IAR Compiler */ - #define __ALIGN_BEGIN - #endif /* __CC_ARM */ - #endif /* __ALIGN_BEGIN */ -#endif /* __GNUC__ */ - - -/** - * @brief __RAM_FUNC definition - */ -#if defined ( __CC_ARM ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) -/* ARM Compiler V4/V5 and V6 - -------------------------- - RAM functions are defined using the toolchain options. - Functions that are executed in RAM should reside in a separate source module. - Using the 'Options for File' dialog you can simply change the 'Code / Const' - area of a module to a memory space in physical RAM. - Available memory areas are declared in the 'Target' tab of the 'Options for Target' - dialog. -*/ -#define __RAM_FUNC - -#elif defined ( __ICCARM__ ) -/* ICCARM Compiler - --------------- - RAM functions are defined using a specific toolchain keyword "__ramfunc". -*/ -#define __RAM_FUNC __ramfunc - -#elif defined ( __GNUC__ ) -/* GNU Compiler - ------------ - RAM functions are defined using a specific toolchain attribute - "__attribute__((section(".RamFunc")))". -*/ -#define __RAM_FUNC __attribute__((section(".RamFunc"))) - -#endif - -/** - * @brief __NOINLINE definition - */ -#if defined ( __CC_ARM ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) || defined ( __GNUC__ ) -/* ARM V4/V5 and V6 & GNU Compiler - ------------------------------- -*/ -#define __NOINLINE __attribute__ ( (noinline) ) - -#elif defined ( __ICCARM__ ) -/* ICCARM Compiler - --------------- -*/ -#define __NOINLINE _Pragma("optimize = no_inline") - -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* ___STM32F4xx_HAL_DEF */ - - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h deleted file mode 100644 index 7ff3836..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h +++ /dev/null @@ -1,802 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma.h - * @author MCD Application Team - * @brief Header file of DMA HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_DMA_H -#define __STM32F4xx_HAL_DMA_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup DMA - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Types DMA Exported Types - * @brief DMA Exported Types - * @{ - */ - -/** - * @brief DMA Configuration Structure definition - */ -typedef struct -{ - uint32_t Channel; /*!< Specifies the channel used for the specified stream. - This parameter can be a value of @ref DMA_Channel_selection */ - - uint32_t Direction; /*!< Specifies if the data will be transferred from memory to peripheral, - from memory to memory or from peripheral to memory. - This parameter can be a value of @ref DMA_Data_transfer_direction */ - - uint32_t PeriphInc; /*!< Specifies whether the Peripheral address register should be incremented or not. - This parameter can be a value of @ref DMA_Peripheral_incremented_mode */ - - uint32_t MemInc; /*!< Specifies whether the memory address register should be incremented or not. - This parameter can be a value of @ref DMA_Memory_incremented_mode */ - - uint32_t PeriphDataAlignment; /*!< Specifies the Peripheral data width. - This parameter can be a value of @ref DMA_Peripheral_data_size */ - - uint32_t MemDataAlignment; /*!< Specifies the Memory data width. - This parameter can be a value of @ref DMA_Memory_data_size */ - - uint32_t Mode; /*!< Specifies the operation mode of the DMAy Streamx. - This parameter can be a value of @ref DMA_mode - @note The circular buffer mode cannot be used if the memory-to-memory - data transfer is configured on the selected Stream */ - - uint32_t Priority; /*!< Specifies the software priority for the DMAy Streamx. - This parameter can be a value of @ref DMA_Priority_level */ - - uint32_t FIFOMode; /*!< Specifies if the FIFO mode or Direct mode will be used for the specified stream. - This parameter can be a value of @ref DMA_FIFO_direct_mode - @note The Direct mode (FIFO mode disabled) cannot be used if the - memory-to-memory data transfer is configured on the selected stream */ - - uint32_t FIFOThreshold; /*!< Specifies the FIFO threshold level. - This parameter can be a value of @ref DMA_FIFO_threshold_level */ - - uint32_t MemBurst; /*!< Specifies the Burst transfer configuration for the memory transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_Memory_burst - @note The burst mode is possible only if the address Increment mode is enabled. */ - - uint32_t PeriphBurst; /*!< Specifies the Burst transfer configuration for the peripheral transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_Peripheral_burst - @note The burst mode is possible only if the address Increment mode is enabled. */ -}DMA_InitTypeDef; - - -/** - * @brief HAL DMA State structures definition - */ -typedef enum -{ - HAL_DMA_STATE_RESET = 0x00U, /*!< DMA not yet initialized or disabled */ - HAL_DMA_STATE_READY = 0x01U, /*!< DMA initialized and ready for use */ - HAL_DMA_STATE_BUSY = 0x02U, /*!< DMA process is ongoing */ - HAL_DMA_STATE_TIMEOUT = 0x03U, /*!< DMA timeout state */ - HAL_DMA_STATE_ERROR = 0x04U, /*!< DMA error state */ - HAL_DMA_STATE_ABORT = 0x05U, /*!< DMA Abort state */ -}HAL_DMA_StateTypeDef; - -/** - * @brief HAL DMA Error Code structure definition - */ -typedef enum -{ - HAL_DMA_FULL_TRANSFER = 0x00U, /*!< Full transfer */ - HAL_DMA_HALF_TRANSFER = 0x01U /*!< Half Transfer */ -}HAL_DMA_LevelCompleteTypeDef; - -/** - * @brief HAL DMA Error Code structure definition - */ -typedef enum -{ - HAL_DMA_XFER_CPLT_CB_ID = 0x00U, /*!< Full transfer */ - HAL_DMA_XFER_HALFCPLT_CB_ID = 0x01U, /*!< Half Transfer */ - HAL_DMA_XFER_M1CPLT_CB_ID = 0x02U, /*!< M1 Full Transfer */ - HAL_DMA_XFER_M1HALFCPLT_CB_ID = 0x03U, /*!< M1 Half Transfer */ - HAL_DMA_XFER_ERROR_CB_ID = 0x04U, /*!< Error */ - HAL_DMA_XFER_ABORT_CB_ID = 0x05U, /*!< Abort */ - HAL_DMA_XFER_ALL_CB_ID = 0x06U /*!< All */ -}HAL_DMA_CallbackIDTypeDef; - -/** - * @brief DMA handle Structure definition - */ -typedef struct __DMA_HandleTypeDef -{ - DMA_Stream_TypeDef *Instance; /*!< Register base address */ - - DMA_InitTypeDef Init; /*!< DMA communication parameters */ - - HAL_LockTypeDef Lock; /*!< DMA locking object */ - - __IO HAL_DMA_StateTypeDef State; /*!< DMA transfer state */ - - void *Parent; /*!< Parent object state */ - - void (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete callback */ - - void (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA Half transfer complete callback */ - - void (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete Memory1 callback */ - - void (* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Half complete Memory1 callback */ - - void (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer error callback */ - - void (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Abort callback */ - - __IO uint32_t ErrorCode; /*!< DMA Error code */ - - uint32_t StreamBaseAddress; /*!< DMA Stream Base Address */ - - uint32_t StreamIndex; /*!< DMA Stream Index */ - -}DMA_HandleTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Constants DMA Exported Constants - * @brief DMA Exported constants - * @{ - */ - -/** @defgroup DMA_Error_Code DMA Error Code - * @brief DMA Error Code - * @{ - */ -#define HAL_DMA_ERROR_NONE 0x00000000U /*!< No error */ -#define HAL_DMA_ERROR_TE 0x00000001U /*!< Transfer error */ -#define HAL_DMA_ERROR_FE 0x00000002U /*!< FIFO error */ -#define HAL_DMA_ERROR_DME 0x00000004U /*!< Direct Mode error */ -#define HAL_DMA_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ -#define HAL_DMA_ERROR_PARAM 0x00000040U /*!< Parameter error */ -#define HAL_DMA_ERROR_NO_XFER 0x00000080U /*!< Abort requested with no Xfer ongoing */ -#define HAL_DMA_ERROR_NOT_SUPPORTED 0x00000100U /*!< Not supported mode */ -/** - * @} - */ - -/** @defgroup DMA_Channel_selection DMA Channel selection - * @brief DMA channel selection - * @{ - */ -#define DMA_CHANNEL_0 0x00000000U /*!< DMA Channel 0 */ -#define DMA_CHANNEL_1 0x02000000U /*!< DMA Channel 1 */ -#define DMA_CHANNEL_2 0x04000000U /*!< DMA Channel 2 */ -#define DMA_CHANNEL_3 0x06000000U /*!< DMA Channel 3 */ -#define DMA_CHANNEL_4 0x08000000U /*!< DMA Channel 4 */ -#define DMA_CHANNEL_5 0x0A000000U /*!< DMA Channel 5 */ -#define DMA_CHANNEL_6 0x0C000000U /*!< DMA Channel 6 */ -#define DMA_CHANNEL_7 0x0E000000U /*!< DMA Channel 7 */ -#if defined (DMA_SxCR_CHSEL_3) -#define DMA_CHANNEL_8 0x10000000U /*!< DMA Channel 8 */ -#define DMA_CHANNEL_9 0x12000000U /*!< DMA Channel 9 */ -#define DMA_CHANNEL_10 0x14000000U /*!< DMA Channel 10 */ -#define DMA_CHANNEL_11 0x16000000U /*!< DMA Channel 11 */ -#define DMA_CHANNEL_12 0x18000000U /*!< DMA Channel 12 */ -#define DMA_CHANNEL_13 0x1A000000U /*!< DMA Channel 13 */ -#define DMA_CHANNEL_14 0x1C000000U /*!< DMA Channel 14 */ -#define DMA_CHANNEL_15 0x1E000000U /*!< DMA Channel 15 */ -#endif /* DMA_SxCR_CHSEL_3 */ -/** - * @} - */ - -/** @defgroup DMA_Data_transfer_direction DMA Data transfer direction - * @brief DMA data transfer direction - * @{ - */ -#define DMA_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ -#define DMA_MEMORY_TO_PERIPH ((uint32_t)DMA_SxCR_DIR_0) /*!< Memory to peripheral direction */ -#define DMA_MEMORY_TO_MEMORY ((uint32_t)DMA_SxCR_DIR_1) /*!< Memory to memory direction */ -/** - * @} - */ - -/** @defgroup DMA_Peripheral_incremented_mode DMA Peripheral incremented mode - * @brief DMA peripheral incremented mode - * @{ - */ -#define DMA_PINC_ENABLE ((uint32_t)DMA_SxCR_PINC) /*!< Peripheral increment mode enable */ -#define DMA_PINC_DISABLE 0x00000000U /*!< Peripheral increment mode disable */ -/** - * @} - */ - -/** @defgroup DMA_Memory_incremented_mode DMA Memory incremented mode - * @brief DMA memory incremented mode - * @{ - */ -#define DMA_MINC_ENABLE ((uint32_t)DMA_SxCR_MINC) /*!< Memory increment mode enable */ -#define DMA_MINC_DISABLE 0x00000000U /*!< Memory increment mode disable */ -/** - * @} - */ - -/** @defgroup DMA_Peripheral_data_size DMA Peripheral data size - * @brief DMA peripheral data size - * @{ - */ -#define DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment: Byte */ -#define DMA_PDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_PSIZE_0) /*!< Peripheral data alignment: HalfWord */ -#define DMA_PDATAALIGN_WORD ((uint32_t)DMA_SxCR_PSIZE_1) /*!< Peripheral data alignment: Word */ -/** - * @} - */ - -/** @defgroup DMA_Memory_data_size DMA Memory data size - * @brief DMA memory data size - * @{ - */ -#define DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment: Byte */ -#define DMA_MDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_MSIZE_0) /*!< Memory data alignment: HalfWord */ -#define DMA_MDATAALIGN_WORD ((uint32_t)DMA_SxCR_MSIZE_1) /*!< Memory data alignment: Word */ -/** - * @} - */ - -/** @defgroup DMA_mode DMA mode - * @brief DMA mode - * @{ - */ -#define DMA_NORMAL 0x00000000U /*!< Normal mode */ -#define DMA_CIRCULAR ((uint32_t)DMA_SxCR_CIRC) /*!< Circular mode */ -#define DMA_PFCTRL ((uint32_t)DMA_SxCR_PFCTRL) /*!< Peripheral flow control mode */ -/** - * @} - */ - -/** @defgroup DMA_Priority_level DMA Priority level - * @brief DMA priority levels - * @{ - */ -#define DMA_PRIORITY_LOW 0x00000000U /*!< Priority level: Low */ -#define DMA_PRIORITY_MEDIUM ((uint32_t)DMA_SxCR_PL_0) /*!< Priority level: Medium */ -#define DMA_PRIORITY_HIGH ((uint32_t)DMA_SxCR_PL_1) /*!< Priority level: High */ -#define DMA_PRIORITY_VERY_HIGH ((uint32_t)DMA_SxCR_PL) /*!< Priority level: Very High */ -/** - * @} - */ - -/** @defgroup DMA_FIFO_direct_mode DMA FIFO direct mode - * @brief DMA FIFO direct mode - * @{ - */ -#define DMA_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */ -#define DMA_FIFOMODE_ENABLE ((uint32_t)DMA_SxFCR_DMDIS) /*!< FIFO mode enable */ -/** - * @} - */ - -/** @defgroup DMA_FIFO_threshold_level DMA FIFO threshold level - * @brief DMA FIFO level - * @{ - */ -#define DMA_FIFO_THRESHOLD_1QUARTERFULL 0x00000000U /*!< FIFO threshold 1 quart full configuration */ -#define DMA_FIFO_THRESHOLD_HALFFULL ((uint32_t)DMA_SxFCR_FTH_0) /*!< FIFO threshold half full configuration */ -#define DMA_FIFO_THRESHOLD_3QUARTERSFULL ((uint32_t)DMA_SxFCR_FTH_1) /*!< FIFO threshold 3 quarts full configuration */ -#define DMA_FIFO_THRESHOLD_FULL ((uint32_t)DMA_SxFCR_FTH) /*!< FIFO threshold full configuration */ -/** - * @} - */ - -/** @defgroup DMA_Memory_burst DMA Memory burst - * @brief DMA memory burst - * @{ - */ -#define DMA_MBURST_SINGLE 0x00000000U -#define DMA_MBURST_INC4 ((uint32_t)DMA_SxCR_MBURST_0) -#define DMA_MBURST_INC8 ((uint32_t)DMA_SxCR_MBURST_1) -#define DMA_MBURST_INC16 ((uint32_t)DMA_SxCR_MBURST) -/** - * @} - */ - -/** @defgroup DMA_Peripheral_burst DMA Peripheral burst - * @brief DMA peripheral burst - * @{ - */ -#define DMA_PBURST_SINGLE 0x00000000U -#define DMA_PBURST_INC4 ((uint32_t)DMA_SxCR_PBURST_0) -#define DMA_PBURST_INC8 ((uint32_t)DMA_SxCR_PBURST_1) -#define DMA_PBURST_INC16 ((uint32_t)DMA_SxCR_PBURST) -/** - * @} - */ - -/** @defgroup DMA_interrupt_enable_definitions DMA interrupt enable definitions - * @brief DMA interrupts definition - * @{ - */ -#define DMA_IT_TC ((uint32_t)DMA_SxCR_TCIE) -#define DMA_IT_HT ((uint32_t)DMA_SxCR_HTIE) -#define DMA_IT_TE ((uint32_t)DMA_SxCR_TEIE) -#define DMA_IT_DME ((uint32_t)DMA_SxCR_DMEIE) -#define DMA_IT_FE 0x00000080U -/** - * @} - */ - -/** @defgroup DMA_flag_definitions DMA flag definitions - * @brief DMA flag definitions - * @{ - */ -#define DMA_FLAG_FEIF0_4 0x00000001U -#define DMA_FLAG_DMEIF0_4 0x00000004U -#define DMA_FLAG_TEIF0_4 0x00000008U -#define DMA_FLAG_HTIF0_4 0x00000010U -#define DMA_FLAG_TCIF0_4 0x00000020U -#define DMA_FLAG_FEIF1_5 0x00000040U -#define DMA_FLAG_DMEIF1_5 0x00000100U -#define DMA_FLAG_TEIF1_5 0x00000200U -#define DMA_FLAG_HTIF1_5 0x00000400U -#define DMA_FLAG_TCIF1_5 0x00000800U -#define DMA_FLAG_FEIF2_6 0x00010000U -#define DMA_FLAG_DMEIF2_6 0x00040000U -#define DMA_FLAG_TEIF2_6 0x00080000U -#define DMA_FLAG_HTIF2_6 0x00100000U -#define DMA_FLAG_TCIF2_6 0x00200000U -#define DMA_FLAG_FEIF3_7 0x00400000U -#define DMA_FLAG_DMEIF3_7 0x01000000U -#define DMA_FLAG_TEIF3_7 0x02000000U -#define DMA_FLAG_HTIF3_7 0x04000000U -#define DMA_FLAG_TCIF3_7 0x08000000U -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ - -/** @brief Reset DMA handle state - * @param __HANDLE__ specifies the DMA handle. - * @retval None - */ -#define __HAL_DMA_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DMA_STATE_RESET) - -/** - * @brief Return the current DMA Stream FIFO filled level. - * @param __HANDLE__ DMA handle - * @retval The FIFO filling state. - * - DMA_FIFOStatus_Less1QuarterFull: when FIFO is less than 1 quarter-full - * and not empty. - * - DMA_FIFOStatus_1QuarterFull: if more than 1 quarter-full. - * - DMA_FIFOStatus_HalfFull: if more than 1 half-full. - * - DMA_FIFOStatus_3QuartersFull: if more than 3 quarters-full. - * - DMA_FIFOStatus_Empty: when FIFO is empty - * - DMA_FIFOStatus_Full: when FIFO is full - */ -#define __HAL_DMA_GET_FS(__HANDLE__) (((__HANDLE__)->Instance->FCR & (DMA_SxFCR_FS))) - -/** - * @brief Enable the specified DMA Stream. - * @param __HANDLE__ DMA handle - * @retval None - */ -#define __HAL_DMA_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= DMA_SxCR_EN) - -/** - * @brief Disable the specified DMA Stream. - * @param __HANDLE__ DMA handle - * @retval None - */ -#define __HAL_DMA_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~DMA_SxCR_EN) - -/* Interrupt & Flag management */ - -/** - * @brief Return the current DMA Stream transfer complete flag. - * @param __HANDLE__ DMA handle - * @retval The specified transfer complete flag index. - */ -#define __HAL_DMA_GET_TC_FLAG_INDEX(__HANDLE__) \ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TCIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TCIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TCIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TCIF2_6 :\ - DMA_FLAG_TCIF3_7) - -/** - * @brief Return the current DMA Stream half transfer complete flag. - * @param __HANDLE__ DMA handle - * @retval The specified half transfer complete flag index. - */ -#define __HAL_DMA_GET_HT_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_HTIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_HTIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_HTIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_HTIF2_6 :\ - DMA_FLAG_HTIF3_7) - -/** - * @brief Return the current DMA Stream transfer error flag. - * @param __HANDLE__ DMA handle - * @retval The specified transfer error flag index. - */ -#define __HAL_DMA_GET_TE_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TEIF2_6 :\ - DMA_FLAG_TEIF3_7) - -/** - * @brief Return the current DMA Stream FIFO error flag. - * @param __HANDLE__ DMA handle - * @retval The specified FIFO error flag index. - */ -#define __HAL_DMA_GET_FE_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_FEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_FEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_FEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_FEIF2_6 :\ - DMA_FLAG_FEIF3_7) - -/** - * @brief Return the current DMA Stream direct mode error flag. - * @param __HANDLE__ DMA handle - * @retval The specified direct mode error flag index. - */ -#define __HAL_DMA_GET_DME_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_DMEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_DMEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_DMEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_DMEIF2_6 :\ - DMA_FLAG_DMEIF3_7) - -/** - * @brief Get the DMA Stream pending flags. - * @param __HANDLE__ DMA handle - * @param __FLAG__ Get the specified flag. - * This parameter can be any combination of the following values: - * @arg DMA_FLAG_TCIFx: Transfer complete flag. - * @arg DMA_FLAG_HTIFx: Half transfer complete flag. - * @arg DMA_FLAG_TEIFx: Transfer error flag. - * @arg DMA_FLAG_DMEIFx: Direct mode error flag. - * @arg DMA_FLAG_FEIFx: FIFO error flag. - * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. - * @retval The state of FLAG (SET or RESET). - */ -#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)\ -(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HISR & (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LISR & (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HISR & (__FLAG__)) : (DMA1->LISR & (__FLAG__))) - -/** - * @brief Clear the DMA Stream pending flags. - * @param __HANDLE__ DMA handle - * @param __FLAG__ specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg DMA_FLAG_TCIFx: Transfer complete flag. - * @arg DMA_FLAG_HTIFx: Half transfer complete flag. - * @arg DMA_FLAG_TEIFx: Transfer error flag. - * @arg DMA_FLAG_DMEIFx: Direct mode error flag. - * @arg DMA_FLAG_FEIFx: FIFO error flag. - * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. - * @retval None - */ -#define __HAL_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__) \ -(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HIFCR = (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LIFCR = (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HIFCR = (__FLAG__)) : (DMA1->LIFCR = (__FLAG__))) - -/** - * @brief Enable the specified DMA Stream interrupts. - * @param __HANDLE__ DMA handle - * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask. - * @arg DMA_IT_HT: Half transfer complete interrupt mask. - * @arg DMA_IT_TE: Transfer error interrupt mask. - * @arg DMA_IT_FE: FIFO error interrupt mask. - * @arg DMA_IT_DME: Direct mode error interrupt. - * @retval None - */ -#define __HAL_DMA_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ -((__HANDLE__)->Instance->CR |= (__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR |= (__INTERRUPT__))) - -/** - * @brief Disable the specified DMA Stream interrupts. - * @param __HANDLE__ DMA handle - * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask. - * @arg DMA_IT_HT: Half transfer complete interrupt mask. - * @arg DMA_IT_TE: Transfer error interrupt mask. - * @arg DMA_IT_FE: FIFO error interrupt mask. - * @arg DMA_IT_DME: Direct mode error interrupt. - * @retval None - */ -#define __HAL_DMA_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ -((__HANDLE__)->Instance->CR &= ~(__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR &= ~(__INTERRUPT__))) - -/** - * @brief Check whether the specified DMA Stream interrupt is enabled or disabled. - * @param __HANDLE__ DMA handle - * @param __INTERRUPT__ specifies the DMA interrupt source to check. - * This parameter can be one of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask. - * @arg DMA_IT_HT: Half transfer complete interrupt mask. - * @arg DMA_IT_TE: Transfer error interrupt mask. - * @arg DMA_IT_FE: FIFO error interrupt mask. - * @arg DMA_IT_DME: Direct mode error interrupt. - * @retval The state of DMA_IT. - */ -#define __HAL_DMA_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ - ((__HANDLE__)->Instance->CR & (__INTERRUPT__)) : \ - ((__HANDLE__)->Instance->FCR & (__INTERRUPT__))) - -/** - * @brief Writes the number of data units to be transferred on the DMA Stream. - * @param __HANDLE__ DMA handle - * @param __COUNTER__ Number of data units to be transferred (from 0 to 65535) - * Number of data items depends only on the Peripheral data format. - * - * @note If Peripheral data format is Bytes: number of data units is equal - * to total number of bytes to be transferred. - * - * @note If Peripheral data format is Half-Word: number of data units is - * equal to total number of bytes to be transferred / 2. - * - * @note If Peripheral data format is Word: number of data units is equal - * to total number of bytes to be transferred / 4. - * - * @retval The number of remaining data units in the current DMAy Streamx transfer. - */ -#define __HAL_DMA_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->NDTR = (uint16_t)(__COUNTER__)) - -/** - * @brief Returns the number of remaining data units in the current DMAy Streamx transfer. - * @param __HANDLE__ DMA handle - * - * @retval The number of remaining data units in the current DMA Stream transfer. - */ -#define __HAL_DMA_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->NDTR) - - -/* Include DMA HAL Extension module */ -#include "stm32f4xx_hal_dma_ex.h" - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Functions DMA Exported Functions - * @brief DMA Exported functions - * @{ - */ - -/** @defgroup DMA_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * @{ - */ -HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma); -/** - * @} - */ - -/** @defgroup DMA_Exported_Functions_Group2 I/O operation functions - * @brief I/O operation functions - * @{ - */ -HAL_StatusTypeDef HAL_DMA_Start (DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout); -void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_CleanCallbacks(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)); -HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID); - -/** - * @} - */ - -/** @defgroup DMA_Exported_Functions_Group3 Peripheral State functions - * @brief Peripheral State functions - * @{ - */ -HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma); -uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma); -/** - * @} - */ -/** - * @} - */ -/* Private Constants -------------------------------------------------------------*/ -/** @defgroup DMA_Private_Constants DMA Private Constants - * @brief DMA private defines and constants - * @{ - */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup DMA_Private_Macros DMA Private Macros - * @brief DMA private macros - * @{ - */ -#if defined (DMA_SxCR_CHSEL_3) -#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ - ((CHANNEL) == DMA_CHANNEL_1) || \ - ((CHANNEL) == DMA_CHANNEL_2) || \ - ((CHANNEL) == DMA_CHANNEL_3) || \ - ((CHANNEL) == DMA_CHANNEL_4) || \ - ((CHANNEL) == DMA_CHANNEL_5) || \ - ((CHANNEL) == DMA_CHANNEL_6) || \ - ((CHANNEL) == DMA_CHANNEL_7) || \ - ((CHANNEL) == DMA_CHANNEL_8) || \ - ((CHANNEL) == DMA_CHANNEL_9) || \ - ((CHANNEL) == DMA_CHANNEL_10)|| \ - ((CHANNEL) == DMA_CHANNEL_11)|| \ - ((CHANNEL) == DMA_CHANNEL_12)|| \ - ((CHANNEL) == DMA_CHANNEL_13)|| \ - ((CHANNEL) == DMA_CHANNEL_14)|| \ - ((CHANNEL) == DMA_CHANNEL_15)) -#else -#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ - ((CHANNEL) == DMA_CHANNEL_1) || \ - ((CHANNEL) == DMA_CHANNEL_2) || \ - ((CHANNEL) == DMA_CHANNEL_3) || \ - ((CHANNEL) == DMA_CHANNEL_4) || \ - ((CHANNEL) == DMA_CHANNEL_5) || \ - ((CHANNEL) == DMA_CHANNEL_6) || \ - ((CHANNEL) == DMA_CHANNEL_7)) -#endif /* DMA_SxCR_CHSEL_3 */ - -#define IS_DMA_DIRECTION(DIRECTION) (((DIRECTION) == DMA_PERIPH_TO_MEMORY ) || \ - ((DIRECTION) == DMA_MEMORY_TO_PERIPH) || \ - ((DIRECTION) == DMA_MEMORY_TO_MEMORY)) - -#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x01U) && ((SIZE) < 0x10000U)) - -#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PINC_ENABLE) || \ - ((STATE) == DMA_PINC_DISABLE)) - -#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MINC_ENABLE) || \ - ((STATE) == DMA_MINC_DISABLE)) - -#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PDATAALIGN_BYTE) || \ - ((SIZE) == DMA_PDATAALIGN_HALFWORD) || \ - ((SIZE) == DMA_PDATAALIGN_WORD)) - -#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MDATAALIGN_BYTE) || \ - ((SIZE) == DMA_MDATAALIGN_HALFWORD) || \ - ((SIZE) == DMA_MDATAALIGN_WORD )) - -#define IS_DMA_MODE(MODE) (((MODE) == DMA_NORMAL ) || \ - ((MODE) == DMA_CIRCULAR) || \ - ((MODE) == DMA_PFCTRL)) - -#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_PRIORITY_LOW ) || \ - ((PRIORITY) == DMA_PRIORITY_MEDIUM) || \ - ((PRIORITY) == DMA_PRIORITY_HIGH) || \ - ((PRIORITY) == DMA_PRIORITY_VERY_HIGH)) - -#define IS_DMA_FIFO_MODE_STATE(STATE) (((STATE) == DMA_FIFOMODE_DISABLE ) || \ - ((STATE) == DMA_FIFOMODE_ENABLE)) - -#define IS_DMA_FIFO_THRESHOLD(THRESHOLD) (((THRESHOLD) == DMA_FIFO_THRESHOLD_1QUARTERFULL ) || \ - ((THRESHOLD) == DMA_FIFO_THRESHOLD_HALFFULL) || \ - ((THRESHOLD) == DMA_FIFO_THRESHOLD_3QUARTERSFULL) || \ - ((THRESHOLD) == DMA_FIFO_THRESHOLD_FULL)) - -#define IS_DMA_MEMORY_BURST(BURST) (((BURST) == DMA_MBURST_SINGLE) || \ - ((BURST) == DMA_MBURST_INC4) || \ - ((BURST) == DMA_MBURST_INC8) || \ - ((BURST) == DMA_MBURST_INC16)) - -#define IS_DMA_PERIPHERAL_BURST(BURST) (((BURST) == DMA_PBURST_SINGLE) || \ - ((BURST) == DMA_PBURST_INC4) || \ - ((BURST) == DMA_PBURST_INC8) || \ - ((BURST) == DMA_PBURST_INC16)) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup DMA_Private_Functions DMA Private Functions - * @brief DMA private functions - * @{ - */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_DMA_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma2d.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma2d.h deleted file mode 100644 index b09e831..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma2d.h +++ /dev/null @@ -1,638 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma2d.h - * @author MCD Application Team - * @brief Header file of DMA2D HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_DMA2D_H -#define STM32F4xx_HAL_DMA2D_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -#if defined (DMA2D) - -/** @addtogroup DMA2D DMA2D - * @brief DMA2D HAL module driver - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup DMA2D_Exported_Types DMA2D Exported Types - * @{ - */ -#define MAX_DMA2D_LAYER 2U /*!< DMA2D maximum number of layers */ - -/** - * @brief DMA2D CLUT Structure definition - */ -typedef struct -{ - uint32_t *pCLUT; /*!< Configures the DMA2D CLUT memory address.*/ - - uint32_t CLUTColorMode; /*!< Configures the DMA2D CLUT color mode. - This parameter can be one value of @ref DMA2D_CLUT_CM. */ - - uint32_t Size; /*!< Configures the DMA2D CLUT size. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF.*/ -} DMA2D_CLUTCfgTypeDef; - -/** - * @brief DMA2D Init structure definition - */ -typedef struct -{ - uint32_t Mode; /*!< Configures the DMA2D transfer mode. - This parameter can be one value of @ref DMA2D_Mode. */ - - uint32_t ColorMode; /*!< Configures the color format of the output image. - This parameter can be one value of @ref DMA2D_Output_Color_Mode. */ - - uint32_t OutputOffset; /*!< Specifies the Offset value. - This parameter must be a number between - Min_Data = 0x0000 and Max_Data = 0x3FFF. */ - - - - -} DMA2D_InitTypeDef; - - -/** - * @brief DMA2D Layer structure definition - */ -typedef struct -{ - uint32_t InputOffset; /*!< Configures the DMA2D foreground or background offset. - This parameter must be a number between - Min_Data = 0x0000 and Max_Data = 0x3FFF. */ - - uint32_t InputColorMode; /*!< Configures the DMA2D foreground or background color mode. - This parameter can be one value of @ref DMA2D_Input_Color_Mode. */ - - uint32_t AlphaMode; /*!< Configures the DMA2D foreground or background alpha mode. - This parameter can be one value of @ref DMA2D_Alpha_Mode. */ - - uint32_t InputAlpha; /*!< Specifies the DMA2D foreground or background alpha value and color value - in case of A8 or A4 color mode. - This parameter must be a number between Min_Data = 0x00 - and Max_Data = 0xFF except for the color modes detailed below. - @note In case of A8 or A4 color mode (ARGB), - this parameter must be a number between - Min_Data = 0x00000000 and Max_Data = 0xFFFFFFFF where - - InputAlpha[24:31] is the alpha value ALPHA[0:7] - - InputAlpha[16:23] is the red value RED[0:7] - - InputAlpha[8:15] is the green value GREEN[0:7] - - InputAlpha[0:7] is the blue value BLUE[0:7]. */ - - -} DMA2D_LayerCfgTypeDef; - -/** - * @brief HAL DMA2D State structures definition - */ -typedef enum -{ - HAL_DMA2D_STATE_RESET = 0x00U, /*!< DMA2D not yet initialized or disabled */ - HAL_DMA2D_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ - HAL_DMA2D_STATE_BUSY = 0x02U, /*!< An internal process is ongoing */ - HAL_DMA2D_STATE_TIMEOUT = 0x03U, /*!< Timeout state */ - HAL_DMA2D_STATE_ERROR = 0x04U, /*!< DMA2D state error */ - HAL_DMA2D_STATE_SUSPEND = 0x05U /*!< DMA2D process is suspended */ -} HAL_DMA2D_StateTypeDef; - -/** - * @brief DMA2D handle Structure definition - */ -typedef struct __DMA2D_HandleTypeDef -{ - DMA2D_TypeDef *Instance; /*!< DMA2D register base address. */ - - DMA2D_InitTypeDef Init; /*!< DMA2D communication parameters. */ - - void (* XferCpltCallback)(struct __DMA2D_HandleTypeDef *hdma2d); /*!< DMA2D transfer complete callback. */ - - void (* XferErrorCallback)(struct __DMA2D_HandleTypeDef *hdma2d); /*!< DMA2D transfer error callback. */ - -#if (USE_HAL_DMA2D_REGISTER_CALLBACKS == 1) - void (* LineEventCallback)(struct __DMA2D_HandleTypeDef *hdma2d); /*!< DMA2D line event callback. */ - - void (* CLUTLoadingCpltCallback)(struct __DMA2D_HandleTypeDef *hdma2d); /*!< DMA2D CLUT loading completion callback */ - - void (* MspInitCallback)(struct __DMA2D_HandleTypeDef *hdma2d); /*!< DMA2D Msp Init callback. */ - - void (* MspDeInitCallback)(struct __DMA2D_HandleTypeDef *hdma2d); /*!< DMA2D Msp DeInit callback. */ - -#endif /* (USE_HAL_DMA2D_REGISTER_CALLBACKS) */ - - DMA2D_LayerCfgTypeDef LayerCfg[MAX_DMA2D_LAYER]; /*!< DMA2D Layers parameters */ - - HAL_LockTypeDef Lock; /*!< DMA2D lock. */ - - __IO HAL_DMA2D_StateTypeDef State; /*!< DMA2D transfer state. */ - - __IO uint32_t ErrorCode; /*!< DMA2D error code. */ -} DMA2D_HandleTypeDef; - -#if (USE_HAL_DMA2D_REGISTER_CALLBACKS == 1) -/** - * @brief HAL DMA2D Callback pointer definition - */ -typedef void (*pDMA2D_CallbackTypeDef)(DMA2D_HandleTypeDef *hdma2d); /*!< Pointer to a DMA2D common callback function */ -#endif /* USE_HAL_DMA2D_REGISTER_CALLBACKS */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup DMA2D_Exported_Constants DMA2D Exported Constants - * @{ - */ - -/** @defgroup DMA2D_Error_Code DMA2D Error Code - * @{ - */ -#define HAL_DMA2D_ERROR_NONE 0x00000000U /*!< No error */ -#define HAL_DMA2D_ERROR_TE 0x00000001U /*!< Transfer error */ -#define HAL_DMA2D_ERROR_CE 0x00000002U /*!< Configuration error */ -#define HAL_DMA2D_ERROR_CAE 0x00000004U /*!< CLUT access error */ -#define HAL_DMA2D_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ -#if (USE_HAL_DMA2D_REGISTER_CALLBACKS == 1) -#define HAL_DMA2D_ERROR_INVALID_CALLBACK 0x00000040U /*!< Invalid callback error */ -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup DMA2D_Mode DMA2D Mode - * @{ - */ -#define DMA2D_M2M 0x00000000U /*!< DMA2D memory to memory transfer mode */ -#define DMA2D_M2M_PFC DMA2D_CR_MODE_0 /*!< DMA2D memory to memory with pixel format conversion transfer mode */ -#define DMA2D_M2M_BLEND DMA2D_CR_MODE_1 /*!< DMA2D memory to memory with blending transfer mode */ -#define DMA2D_R2M DMA2D_CR_MODE /*!< DMA2D register to memory transfer mode */ -/** - * @} - */ - -/** @defgroup DMA2D_Output_Color_Mode DMA2D Output Color Mode - * @{ - */ -#define DMA2D_OUTPUT_ARGB8888 0x00000000U /*!< ARGB8888 DMA2D color mode */ -#define DMA2D_OUTPUT_RGB888 DMA2D_OPFCCR_CM_0 /*!< RGB888 DMA2D color mode */ -#define DMA2D_OUTPUT_RGB565 DMA2D_OPFCCR_CM_1 /*!< RGB565 DMA2D color mode */ -#define DMA2D_OUTPUT_ARGB1555 (DMA2D_OPFCCR_CM_0|DMA2D_OPFCCR_CM_1) /*!< ARGB1555 DMA2D color mode */ -#define DMA2D_OUTPUT_ARGB4444 DMA2D_OPFCCR_CM_2 /*!< ARGB4444 DMA2D color mode */ -/** - * @} - */ - -/** @defgroup DMA2D_Input_Color_Mode DMA2D Input Color Mode - * @{ - */ -#define DMA2D_INPUT_ARGB8888 0x00000000U /*!< ARGB8888 color mode */ -#define DMA2D_INPUT_RGB888 0x00000001U /*!< RGB888 color mode */ -#define DMA2D_INPUT_RGB565 0x00000002U /*!< RGB565 color mode */ -#define DMA2D_INPUT_ARGB1555 0x00000003U /*!< ARGB1555 color mode */ -#define DMA2D_INPUT_ARGB4444 0x00000004U /*!< ARGB4444 color mode */ -#define DMA2D_INPUT_L8 0x00000005U /*!< L8 color mode */ -#define DMA2D_INPUT_AL44 0x00000006U /*!< AL44 color mode */ -#define DMA2D_INPUT_AL88 0x00000007U /*!< AL88 color mode */ -#define DMA2D_INPUT_L4 0x00000008U /*!< L4 color mode */ -#define DMA2D_INPUT_A8 0x00000009U /*!< A8 color mode */ -#define DMA2D_INPUT_A4 0x0000000AU /*!< A4 color mode */ -/** - * @} - */ - -/** @defgroup DMA2D_Alpha_Mode DMA2D Alpha Mode - * @{ - */ -#define DMA2D_NO_MODIF_ALPHA 0x00000000U /*!< No modification of the alpha channel value */ -#define DMA2D_REPLACE_ALPHA 0x00000001U /*!< Replace original alpha channel value by programmed alpha value */ -#define DMA2D_COMBINE_ALPHA 0x00000002U /*!< Replace original alpha channel value by programmed alpha value - with original alpha channel value */ -/** - * @} - */ - - - - - - -/** @defgroup DMA2D_CLUT_CM DMA2D CLUT Color Mode - * @{ - */ -#define DMA2D_CCM_ARGB8888 0x00000000U /*!< ARGB8888 DMA2D CLUT color mode */ -#define DMA2D_CCM_RGB888 0x00000001U /*!< RGB888 DMA2D CLUT color mode */ -/** - * @} - */ - -/** @defgroup DMA2D_Interrupts DMA2D Interrupts - * @{ - */ -#define DMA2D_IT_CE DMA2D_CR_CEIE /*!< Configuration Error Interrupt */ -#define DMA2D_IT_CTC DMA2D_CR_CTCIE /*!< CLUT Transfer Complete Interrupt */ -#define DMA2D_IT_CAE DMA2D_CR_CAEIE /*!< CLUT Access Error Interrupt */ -#define DMA2D_IT_TW DMA2D_CR_TWIE /*!< Transfer Watermark Interrupt */ -#define DMA2D_IT_TC DMA2D_CR_TCIE /*!< Transfer Complete Interrupt */ -#define DMA2D_IT_TE DMA2D_CR_TEIE /*!< Transfer Error Interrupt */ -/** - * @} - */ - -/** @defgroup DMA2D_Flags DMA2D Flags - * @{ - */ -#define DMA2D_FLAG_CE DMA2D_ISR_CEIF /*!< Configuration Error Interrupt Flag */ -#define DMA2D_FLAG_CTC DMA2D_ISR_CTCIF /*!< CLUT Transfer Complete Interrupt Flag */ -#define DMA2D_FLAG_CAE DMA2D_ISR_CAEIF /*!< CLUT Access Error Interrupt Flag */ -#define DMA2D_FLAG_TW DMA2D_ISR_TWIF /*!< Transfer Watermark Interrupt Flag */ -#define DMA2D_FLAG_TC DMA2D_ISR_TCIF /*!< Transfer Complete Interrupt Flag */ -#define DMA2D_FLAG_TE DMA2D_ISR_TEIF /*!< Transfer Error Interrupt Flag */ -/** - * @} - */ - -#if (USE_HAL_DMA2D_REGISTER_CALLBACKS == 1) -/** - * @brief HAL DMA2D common Callback ID enumeration definition - */ -typedef enum -{ - HAL_DMA2D_MSPINIT_CB_ID = 0x00U, /*!< DMA2D MspInit callback ID */ - HAL_DMA2D_MSPDEINIT_CB_ID = 0x01U, /*!< DMA2D MspDeInit callback ID */ - HAL_DMA2D_TRANSFERCOMPLETE_CB_ID = 0x02U, /*!< DMA2D transfer complete callback ID */ - HAL_DMA2D_TRANSFERERROR_CB_ID = 0x03U, /*!< DMA2D transfer error callback ID */ - HAL_DMA2D_LINEEVENT_CB_ID = 0x04U, /*!< DMA2D line event callback ID */ - HAL_DMA2D_CLUTLOADINGCPLT_CB_ID = 0x05U, /*!< DMA2D CLUT loading completion callback ID */ -} HAL_DMA2D_CallbackIDTypeDef; -#endif /* USE_HAL_DMA2D_REGISTER_CALLBACKS */ - - -/** - * @} - */ -/* Exported macros ------------------------------------------------------------*/ -/** @defgroup DMA2D_Exported_Macros DMA2D Exported Macros - * @{ - */ - -/** @brief Reset DMA2D handle state - * @param __HANDLE__ specifies the DMA2D handle. - * @retval None - */ -#if (USE_HAL_DMA2D_REGISTER_CALLBACKS == 1) -#define __HAL_DMA2D_RESET_HANDLE_STATE(__HANDLE__) do{ \ - (__HANDLE__)->State = HAL_DMA2D_STATE_RESET;\ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - }while(0) -#else -#define __HAL_DMA2D_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DMA2D_STATE_RESET) -#endif /* USE_HAL_DMA2D_REGISTER_CALLBACKS */ - - -/** - * @brief Enable the DMA2D. - * @param __HANDLE__ DMA2D handle - * @retval None. - */ -#define __HAL_DMA2D_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= DMA2D_CR_START) - - -/* Interrupt & Flag management */ -/** - * @brief Get the DMA2D pending flags. - * @param __HANDLE__ DMA2D handle - * @param __FLAG__ flag to check. - * This parameter can be any combination of the following values: - * @arg DMA2D_FLAG_CE: Configuration error flag - * @arg DMA2D_FLAG_CTC: CLUT transfer complete flag - * @arg DMA2D_FLAG_CAE: CLUT access error flag - * @arg DMA2D_FLAG_TW: Transfer Watermark flag - * @arg DMA2D_FLAG_TC: Transfer complete flag - * @arg DMA2D_FLAG_TE: Transfer error flag - * @retval The state of FLAG. - */ -#define __HAL_DMA2D_GET_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ISR & (__FLAG__)) - -/** - * @brief Clear the DMA2D pending flags. - * @param __HANDLE__ DMA2D handle - * @param __FLAG__ specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg DMA2D_FLAG_CE: Configuration error flag - * @arg DMA2D_FLAG_CTC: CLUT transfer complete flag - * @arg DMA2D_FLAG_CAE: CLUT access error flag - * @arg DMA2D_FLAG_TW: Transfer Watermark flag - * @arg DMA2D_FLAG_TC: Transfer complete flag - * @arg DMA2D_FLAG_TE: Transfer error flag - * @retval None - */ -#define __HAL_DMA2D_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->IFCR = (__FLAG__)) - -/** - * @brief Enable the specified DMA2D interrupts. - * @param __HANDLE__ DMA2D handle - * @param __INTERRUPT__ specifies the DMA2D interrupt sources to be enabled. - * This parameter can be any combination of the following values: - * @arg DMA2D_IT_CE: Configuration error interrupt mask - * @arg DMA2D_IT_CTC: CLUT transfer complete interrupt mask - * @arg DMA2D_IT_CAE: CLUT access error interrupt mask - * @arg DMA2D_IT_TW: Transfer Watermark interrupt mask - * @arg DMA2D_IT_TC: Transfer complete interrupt mask - * @arg DMA2D_IT_TE: Transfer error interrupt mask - * @retval None - */ -#define __HAL_DMA2D_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR |= (__INTERRUPT__)) - -/** - * @brief Disable the specified DMA2D interrupts. - * @param __HANDLE__ DMA2D handle - * @param __INTERRUPT__ specifies the DMA2D interrupt sources to be disabled. - * This parameter can be any combination of the following values: - * @arg DMA2D_IT_CE: Configuration error interrupt mask - * @arg DMA2D_IT_CTC: CLUT transfer complete interrupt mask - * @arg DMA2D_IT_CAE: CLUT access error interrupt mask - * @arg DMA2D_IT_TW: Transfer Watermark interrupt mask - * @arg DMA2D_IT_TC: Transfer complete interrupt mask - * @arg DMA2D_IT_TE: Transfer error interrupt mask - * @retval None - */ -#define __HAL_DMA2D_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR &= ~(__INTERRUPT__)) - -/** - * @brief Check whether the specified DMA2D interrupt source is enabled or not. - * @param __HANDLE__ DMA2D handle - * @param __INTERRUPT__ specifies the DMA2D interrupt source to check. - * This parameter can be one of the following values: - * @arg DMA2D_IT_CE: Configuration error interrupt mask - * @arg DMA2D_IT_CTC: CLUT transfer complete interrupt mask - * @arg DMA2D_IT_CAE: CLUT access error interrupt mask - * @arg DMA2D_IT_TW: Transfer Watermark interrupt mask - * @arg DMA2D_IT_TC: Transfer complete interrupt mask - * @arg DMA2D_IT_TE: Transfer error interrupt mask - * @retval The state of INTERRUPT source. - */ -#define __HAL_DMA2D_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR & (__INTERRUPT__)) - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup DMA2D_Exported_Functions DMA2D Exported Functions - * @{ - */ - -/** @addtogroup DMA2D_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ - -/* Initialization and de-initialization functions *******************************/ -HAL_StatusTypeDef HAL_DMA2D_Init(DMA2D_HandleTypeDef *hdma2d); -HAL_StatusTypeDef HAL_DMA2D_DeInit(DMA2D_HandleTypeDef *hdma2d); -void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d); -void HAL_DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d); -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_DMA2D_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_DMA2D_RegisterCallback(DMA2D_HandleTypeDef *hdma2d, HAL_DMA2D_CallbackIDTypeDef CallbackID, - pDMA2D_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_DMA2D_UnRegisterCallback(DMA2D_HandleTypeDef *hdma2d, HAL_DMA2D_CallbackIDTypeDef CallbackID); -#endif /* USE_HAL_DMA2D_REGISTER_CALLBACKS */ - -/** - * @} - */ - - -/** @addtogroup DMA2D_Exported_Functions_Group2 IO operation functions - * @{ - */ - -/* IO operation functions *******************************************************/ -HAL_StatusTypeDef HAL_DMA2D_Start(DMA2D_HandleTypeDef *hdma2d, uint32_t pdata, uint32_t DstAddress, uint32_t Width, - uint32_t Height); -HAL_StatusTypeDef HAL_DMA2D_BlendingStart(DMA2D_HandleTypeDef *hdma2d, uint32_t SrcAddress1, uint32_t SrcAddress2, - uint32_t DstAddress, uint32_t Width, uint32_t Height); -HAL_StatusTypeDef HAL_DMA2D_Start_IT(DMA2D_HandleTypeDef *hdma2d, uint32_t pdata, uint32_t DstAddress, uint32_t Width, - uint32_t Height); -HAL_StatusTypeDef HAL_DMA2D_BlendingStart_IT(DMA2D_HandleTypeDef *hdma2d, uint32_t SrcAddress1, uint32_t SrcAddress2, - uint32_t DstAddress, uint32_t Width, uint32_t Height); -HAL_StatusTypeDef HAL_DMA2D_Suspend(DMA2D_HandleTypeDef *hdma2d); -HAL_StatusTypeDef HAL_DMA2D_Resume(DMA2D_HandleTypeDef *hdma2d); -HAL_StatusTypeDef HAL_DMA2D_Abort(DMA2D_HandleTypeDef *hdma2d); -HAL_StatusTypeDef HAL_DMA2D_EnableCLUT(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_DMA2D_CLUTStartLoad(DMA2D_HandleTypeDef *hdma2d, const DMA2D_CLUTCfgTypeDef *CLUTCfg, - uint32_t LayerIdx); -HAL_StatusTypeDef HAL_DMA2D_CLUTStartLoad_IT(DMA2D_HandleTypeDef *hdma2d, const DMA2D_CLUTCfgTypeDef *CLUTCfg, - uint32_t LayerIdx); -HAL_StatusTypeDef HAL_DMA2D_CLUTLoad(DMA2D_HandleTypeDef *hdma2d, DMA2D_CLUTCfgTypeDef CLUTCfg, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_DMA2D_CLUTLoad_IT(DMA2D_HandleTypeDef *hdma2d, DMA2D_CLUTCfgTypeDef CLUTCfg, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_DMA2D_CLUTLoading_Abort(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_DMA2D_CLUTLoading_Suspend(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_DMA2D_CLUTLoading_Resume(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_DMA2D_PollForTransfer(DMA2D_HandleTypeDef *hdma2d, uint32_t Timeout); -void HAL_DMA2D_IRQHandler(DMA2D_HandleTypeDef *hdma2d); -void HAL_DMA2D_LineEventCallback(DMA2D_HandleTypeDef *hdma2d); -void HAL_DMA2D_CLUTLoadingCpltCallback(DMA2D_HandleTypeDef *hdma2d); - -/** - * @} - */ - -/** @addtogroup DMA2D_Exported_Functions_Group3 Peripheral Control functions - * @{ - */ - -/* Peripheral Control functions *************************************************/ -HAL_StatusTypeDef HAL_DMA2D_ConfigLayer(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_DMA2D_ConfigCLUT(DMA2D_HandleTypeDef *hdma2d, DMA2D_CLUTCfgTypeDef CLUTCfg, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_DMA2D_ProgramLineEvent(DMA2D_HandleTypeDef *hdma2d, uint32_t Line); -HAL_StatusTypeDef HAL_DMA2D_EnableDeadTime(DMA2D_HandleTypeDef *hdma2d); -HAL_StatusTypeDef HAL_DMA2D_DisableDeadTime(DMA2D_HandleTypeDef *hdma2d); -HAL_StatusTypeDef HAL_DMA2D_ConfigDeadTime(DMA2D_HandleTypeDef *hdma2d, uint8_t DeadTime); - -/** - * @} - */ - -/** @addtogroup DMA2D_Exported_Functions_Group4 Peripheral State and Error functions - * @{ - */ - -/* Peripheral State functions ***************************************************/ -HAL_DMA2D_StateTypeDef HAL_DMA2D_GetState(const DMA2D_HandleTypeDef *hdma2d); -uint32_t HAL_DMA2D_GetError(const DMA2D_HandleTypeDef *hdma2d); - -/** - * @} - */ - -/** - * @} - */ - -/* Private constants ---------------------------------------------------------*/ - -/** @addtogroup DMA2D_Private_Constants DMA2D Private Constants - * @{ - */ - -/** @defgroup DMA2D_Maximum_Line_WaterMark DMA2D Maximum Line Watermark - * @{ - */ -#define DMA2D_LINE_WATERMARK_MAX DMA2D_LWR_LW /*!< DMA2D maximum line watermark */ -/** - * @} - */ - -/** @defgroup DMA2D_Color_Value DMA2D Color Value - * @{ - */ -#define DMA2D_COLOR_VALUE 0x000000FFU /*!< Color value mask */ -/** - * @} - */ - -/** @defgroup DMA2D_Max_Layer DMA2D Maximum Number of Layers - * @{ - */ -#define DMA2D_MAX_LAYER 2U /*!< DMA2D maximum number of layers */ -/** - * @} - */ - -/** @defgroup DMA2D_Layers DMA2D Layers - * @{ - */ -#define DMA2D_BACKGROUND_LAYER 0x00000000U /*!< DMA2D Background Layer (layer 0) */ -#define DMA2D_FOREGROUND_LAYER 0x00000001U /*!< DMA2D Foreground Layer (layer 1) */ -/** - * @} - */ - -/** @defgroup DMA2D_Offset DMA2D Offset - * @{ - */ -#define DMA2D_OFFSET DMA2D_FGOR_LO /*!< maximum Line Offset */ -/** - * @} - */ - -/** @defgroup DMA2D_Size DMA2D Size - * @{ - */ -#define DMA2D_PIXEL (DMA2D_NLR_PL >> 16U) /*!< DMA2D maximum number of pixels per line */ -#define DMA2D_LINE DMA2D_NLR_NL /*!< DMA2D maximum number of lines */ -/** - * @} - */ - -/** @defgroup DMA2D_CLUT_Size DMA2D CLUT Size - * @{ - */ -#define DMA2D_CLUT_SIZE (DMA2D_FGPFCCR_CS >> 8U) /*!< DMA2D maximum CLUT size */ -/** - * @} - */ - -/** - * @} - */ - - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup DMA2D_Private_Macros DMA2D Private Macros - * @{ - */ -#define IS_DMA2D_LAYER(LAYER) (((LAYER) == DMA2D_BACKGROUND_LAYER)\ - || ((LAYER) == DMA2D_FOREGROUND_LAYER)) - -#define IS_DMA2D_MODE(MODE) (((MODE) == DMA2D_M2M) || ((MODE) == DMA2D_M2M_PFC) || \ - ((MODE) == DMA2D_M2M_BLEND) || ((MODE) == DMA2D_R2M)) - -#define IS_DMA2D_CMODE(MODE_ARGB) (((MODE_ARGB) == DMA2D_OUTPUT_ARGB8888) || \ - ((MODE_ARGB) == DMA2D_OUTPUT_RGB888) || \ - ((MODE_ARGB) == DMA2D_OUTPUT_RGB565) || \ - ((MODE_ARGB) == DMA2D_OUTPUT_ARGB1555) || \ - ((MODE_ARGB) == DMA2D_OUTPUT_ARGB4444)) - -#define IS_DMA2D_COLOR(COLOR) ((COLOR) <= DMA2D_COLOR_VALUE) -#define IS_DMA2D_LINE(LINE) ((LINE) <= DMA2D_LINE) -#define IS_DMA2D_PIXEL(PIXEL) ((PIXEL) <= DMA2D_PIXEL) -#define IS_DMA2D_OFFSET(OOFFSET) ((OOFFSET) <= DMA2D_OFFSET) - -#define IS_DMA2D_INPUT_COLOR_MODE(INPUT_CM) (((INPUT_CM) == DMA2D_INPUT_ARGB8888) || \ - ((INPUT_CM) == DMA2D_INPUT_RGB888) || \ - ((INPUT_CM) == DMA2D_INPUT_RGB565) || \ - ((INPUT_CM) == DMA2D_INPUT_ARGB1555) || \ - ((INPUT_CM) == DMA2D_INPUT_ARGB4444) || \ - ((INPUT_CM) == DMA2D_INPUT_L8) || \ - ((INPUT_CM) == DMA2D_INPUT_AL44) || \ - ((INPUT_CM) == DMA2D_INPUT_AL88) || \ - ((INPUT_CM) == DMA2D_INPUT_L4) || \ - ((INPUT_CM) == DMA2D_INPUT_A8) || \ - ((INPUT_CM) == DMA2D_INPUT_A4)) - -#define IS_DMA2D_ALPHA_MODE(AlphaMode) (((AlphaMode) == DMA2D_NO_MODIF_ALPHA) || \ - ((AlphaMode) == DMA2D_REPLACE_ALPHA) || \ - ((AlphaMode) == DMA2D_COMBINE_ALPHA)) - - - - - -#define IS_DMA2D_CLUT_CM(CLUT_CM) (((CLUT_CM) == DMA2D_CCM_ARGB8888) || ((CLUT_CM) == DMA2D_CCM_RGB888)) -#define IS_DMA2D_CLUT_SIZE(CLUT_SIZE) ((CLUT_SIZE) <= DMA2D_CLUT_SIZE) -#define IS_DMA2D_LINEWATERMARK(LineWatermark) ((LineWatermark) <= DMA2D_LINE_WATERMARK_MAX) -#define IS_DMA2D_IT(IT) (((IT) == DMA2D_IT_CTC) || ((IT) == DMA2D_IT_CAE) || \ - ((IT) == DMA2D_IT_TW) || ((IT) == DMA2D_IT_TC) || \ - ((IT) == DMA2D_IT_TE) || ((IT) == DMA2D_IT_CE)) -#define IS_DMA2D_GET_FLAG(FLAG) (((FLAG) == DMA2D_FLAG_CTC) || ((FLAG) == DMA2D_FLAG_CAE) || \ - ((FLAG) == DMA2D_FLAG_TW) || ((FLAG) == DMA2D_FLAG_TC) || \ - ((FLAG) == DMA2D_FLAG_TE) || ((FLAG) == DMA2D_FLAG_CE)) -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined (DMA2D) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_DMA2D_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h deleted file mode 100644 index 9858c74..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h +++ /dev/null @@ -1,102 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma_ex.h - * @author MCD Application Team - * @brief Header file of DMA HAL extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_DMA_EX_H -#define __STM32F4xx_HAL_DMA_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup DMAEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup DMAEx_Exported_Types DMAEx Exported Types - * @brief DMAEx Exported types - * @{ - */ - -/** - * @brief HAL DMA Memory definition - */ -typedef enum -{ - MEMORY0 = 0x00U, /*!< Memory 0 */ - MEMORY1 = 0x01U /*!< Memory 1 */ -}HAL_DMA_MemoryTypeDef; - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup DMAEx_Exported_Functions DMAEx Exported Functions - * @brief DMAEx Exported functions - * @{ - */ - -/** @defgroup DMAEx_Exported_Functions_Group1 Extended features functions - * @brief Extended features functions - * @{ - */ - -/* IO operation functions *******************************************************/ -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory); - -/** - * @} - */ -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup DMAEx_Private_Functions DMAEx Private Functions - * @brief DMAEx Private functions - * @{ - */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_HAL_DMA_EX_H*/ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dsi.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dsi.h deleted file mode 100644 index faf4cf4..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dsi.h +++ /dev/null @@ -1,1377 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dsi.h - * @author MCD Application Team - * @brief Header file of DSI HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_DSI_H -#define STM32F4xx_HAL_DSI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -#if defined(DSI) - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup DSI DSI - * @brief DSI HAL module driver - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup DSI_Exported_Types DSI Exported Types - * @{ - */ -/** - * @brief DSI Init Structure definition - */ -typedef struct -{ - uint32_t AutomaticClockLaneControl; /*!< Automatic clock lane control - This parameter can be any value of @ref DSI_Automatic_Clk_Lane_Control */ - - uint32_t TXEscapeCkdiv; /*!< TX Escape clock division - The values 0 and 1 stop the TX_ESC clock generation */ - - uint32_t NumberOfLanes; /*!< Number of lanes - This parameter can be any value of @ref DSI_Number_Of_Lanes */ - -} DSI_InitTypeDef; - -/** - * @brief DSI PLL Clock structure definition - */ -typedef struct -{ - uint32_t PLLNDIV; /*!< PLL Loop Division Factor - This parameter must be a value between 10 and 125 */ - - uint32_t PLLIDF; /*!< PLL Input Division Factor - This parameter can be any value of @ref DSI_PLL_IDF */ - - uint32_t PLLODF; /*!< PLL Output Division Factor - This parameter can be any value of @ref DSI_PLL_ODF */ - -} DSI_PLLInitTypeDef; - -/** - * @brief DSI Video mode configuration - */ -typedef struct -{ - uint32_t VirtualChannelID; /*!< Virtual channel ID */ - - uint32_t ColorCoding; /*!< Color coding for LTDC interface - This parameter can be any value of @ref DSI_Color_Coding */ - - uint32_t LooselyPacked; /*!< Enable or disable loosely packed stream (needed only when using - 18-bit configuration). - This parameter can be any value of @ref DSI_LooselyPacked */ - - uint32_t Mode; /*!< Video mode type - This parameter can be any value of @ref DSI_Video_Mode_Type */ - - uint32_t PacketSize; /*!< Video packet size */ - - uint32_t NumberOfChunks; /*!< Number of chunks */ - - uint32_t NullPacketSize; /*!< Null packet size */ - - uint32_t HSPolarity; /*!< HSYNC pin polarity - This parameter can be any value of @ref DSI_HSYNC_Polarity */ - - uint32_t VSPolarity; /*!< VSYNC pin polarity - This parameter can be any value of @ref DSI_VSYNC_Active_Polarity */ - - uint32_t DEPolarity; /*!< Data Enable pin polarity - This parameter can be any value of @ref DSI_DATA_ENABLE_Polarity */ - - uint32_t HorizontalSyncActive; /*!< Horizontal synchronism active duration (in lane byte clock cycles) */ - - uint32_t HorizontalBackPorch; /*!< Horizontal back-porch duration (in lane byte clock cycles) */ - - uint32_t HorizontalLine; /*!< Horizontal line duration (in lane byte clock cycles) */ - - uint32_t VerticalSyncActive; /*!< Vertical synchronism active duration */ - - uint32_t VerticalBackPorch; /*!< Vertical back-porch duration */ - - uint32_t VerticalFrontPorch; /*!< Vertical front-porch duration */ - - uint32_t VerticalActive; /*!< Vertical active duration */ - - uint32_t LPCommandEnable; /*!< Low-power command enable - This parameter can be any value of @ref DSI_LP_Command */ - - uint32_t LPLargestPacketSize; /*!< The size, in bytes, of the low power largest packet that - can fit in a line during VSA, VBP and VFP regions */ - - uint32_t LPVACTLargestPacketSize; /*!< The size, in bytes, of the low power largest packet that - can fit in a line during VACT region */ - - uint32_t LPHorizontalFrontPorchEnable; /*!< Low-power horizontal front-porch enable - This parameter can be any value of @ref DSI_LP_HFP */ - - uint32_t LPHorizontalBackPorchEnable; /*!< Low-power horizontal back-porch enable - This parameter can be any value of @ref DSI_LP_HBP */ - - uint32_t LPVerticalActiveEnable; /*!< Low-power vertical active enable - This parameter can be any value of @ref DSI_LP_VACT */ - - uint32_t LPVerticalFrontPorchEnable; /*!< Low-power vertical front-porch enable - This parameter can be any value of @ref DSI_LP_VFP */ - - uint32_t LPVerticalBackPorchEnable; /*!< Low-power vertical back-porch enable - This parameter can be any value of @ref DSI_LP_VBP */ - - uint32_t LPVerticalSyncActiveEnable; /*!< Low-power vertical sync active enable - This parameter can be any value of @ref DSI_LP_VSYNC */ - - uint32_t FrameBTAAcknowledgeEnable; /*!< Frame bus-turn-around acknowledge enable - This parameter can be any value of @ref DSI_FBTA_acknowledge */ - -} DSI_VidCfgTypeDef; - -/** - * @brief DSI Adapted command mode configuration - */ -typedef struct -{ - uint32_t VirtualChannelID; /*!< Virtual channel ID */ - - uint32_t ColorCoding; /*!< Color coding for LTDC interface - This parameter can be any value of @ref DSI_Color_Coding */ - - uint32_t CommandSize; /*!< Maximum allowed size for an LTDC write memory command, measured in - pixels. This parameter can be any value between 0x00 and 0xFFFFU */ - - uint32_t TearingEffectSource; /*!< Tearing effect source - This parameter can be any value of @ref DSI_TearingEffectSource */ - - uint32_t TearingEffectPolarity; /*!< Tearing effect pin polarity - This parameter can be any value of @ref DSI_TearingEffectPolarity */ - - uint32_t HSPolarity; /*!< HSYNC pin polarity - This parameter can be any value of @ref DSI_HSYNC_Polarity */ - - uint32_t VSPolarity; /*!< VSYNC pin polarity - This parameter can be any value of @ref DSI_VSYNC_Active_Polarity */ - - uint32_t DEPolarity; /*!< Data Enable pin polarity - This parameter can be any value of @ref DSI_DATA_ENABLE_Polarity */ - - uint32_t VSyncPol; /*!< VSync edge on which the LTDC is halted - This parameter can be any value of @ref DSI_Vsync_Polarity */ - - uint32_t AutomaticRefresh; /*!< Automatic refresh mode - This parameter can be any value of @ref DSI_AutomaticRefresh */ - - uint32_t TEAcknowledgeRequest; /*!< Tearing Effect Acknowledge Request Enable - This parameter can be any value of @ref DSI_TE_AcknowledgeRequest */ - -} DSI_CmdCfgTypeDef; - -/** - * @brief DSI command transmission mode configuration - */ -typedef struct -{ - uint32_t LPGenShortWriteNoP; /*!< Generic Short Write Zero parameters Transmission - This parameter can be any value of @ref DSI_LP_LPGenShortWriteNoP */ - - uint32_t LPGenShortWriteOneP; /*!< Generic Short Write One parameter Transmission - This parameter can be any value of @ref DSI_LP_LPGenShortWriteOneP */ - - uint32_t LPGenShortWriteTwoP; /*!< Generic Short Write Two parameters Transmission - This parameter can be any value of @ref DSI_LP_LPGenShortWriteTwoP */ - - uint32_t LPGenShortReadNoP; /*!< Generic Short Read Zero parameters Transmission - This parameter can be any value of @ref DSI_LP_LPGenShortReadNoP */ - - uint32_t LPGenShortReadOneP; /*!< Generic Short Read One parameter Transmission - This parameter can be any value of @ref DSI_LP_LPGenShortReadOneP */ - - uint32_t LPGenShortReadTwoP; /*!< Generic Short Read Two parameters Transmission - This parameter can be any value of @ref DSI_LP_LPGenShortReadTwoP */ - - uint32_t LPGenLongWrite; /*!< Generic Long Write Transmission - This parameter can be any value of @ref DSI_LP_LPGenLongWrite */ - - uint32_t LPDcsShortWriteNoP; /*!< DCS Short Write Zero parameters Transmission - This parameter can be any value of @ref DSI_LP_LPDcsShortWriteNoP */ - - uint32_t LPDcsShortWriteOneP; /*!< DCS Short Write One parameter Transmission - This parameter can be any value of @ref DSI_LP_LPDcsShortWriteOneP */ - - uint32_t LPDcsShortReadNoP; /*!< DCS Short Read Zero parameters Transmission - This parameter can be any value of @ref DSI_LP_LPDcsShortReadNoP */ - - uint32_t LPDcsLongWrite; /*!< DCS Long Write Transmission - This parameter can be any value of @ref DSI_LP_LPDcsLongWrite */ - - uint32_t LPMaxReadPacket; /*!< Maximum Read Packet Size Transmission - This parameter can be any value of @ref DSI_LP_LPMaxReadPacket */ - - uint32_t AcknowledgeRequest; /*!< Acknowledge Request Enable - This parameter can be any value of @ref DSI_AcknowledgeRequest */ - -} DSI_LPCmdTypeDef; - -/** - * @brief DSI PHY Timings definition - */ -typedef struct -{ - uint32_t ClockLaneHS2LPTime; /*!< The maximum time that the D-PHY clock lane takes to go from high-speed - to low-power transmission */ - - uint32_t ClockLaneLP2HSTime; /*!< The maximum time that the D-PHY clock lane takes to go from low-power - to high-speed transmission */ - - uint32_t DataLaneHS2LPTime; /*!< The maximum time that the D-PHY data lanes takes to go from high-speed - to low-power transmission */ - - uint32_t DataLaneLP2HSTime; /*!< The maximum time that the D-PHY data lanes takes to go from low-power - to high-speed transmission */ - - uint32_t DataLaneMaxReadTime; /*!< The maximum time required to perform a read command */ - - uint32_t StopWaitTime; /*!< The minimum wait period to request a High-Speed transmission after the - Stop state */ - -} DSI_PHY_TimerTypeDef; - -/** - * @brief DSI HOST Timeouts definition - */ -typedef struct -{ - uint32_t TimeoutCkdiv; /*!< Time-out clock division */ - - uint32_t HighSpeedTransmissionTimeout; /*!< High-speed transmission time-out */ - - uint32_t LowPowerReceptionTimeout; /*!< Low-power reception time-out */ - - uint32_t HighSpeedReadTimeout; /*!< High-speed read time-out */ - - uint32_t LowPowerReadTimeout; /*!< Low-power read time-out */ - - uint32_t HighSpeedWriteTimeout; /*!< High-speed write time-out */ - - uint32_t HighSpeedWritePrespMode; /*!< High-speed write presp mode - This parameter can be any value of @ref DSI_HS_PrespMode */ - - uint32_t LowPowerWriteTimeout; /*!< Low-speed write time-out */ - - uint32_t BTATimeout; /*!< BTA time-out */ - -} DSI_HOST_TimeoutTypeDef; - -/** - * @brief DSI States Structure definition - */ -typedef enum -{ - HAL_DSI_STATE_RESET = 0x00U, - HAL_DSI_STATE_READY = 0x01U, - HAL_DSI_STATE_ERROR = 0x02U, - HAL_DSI_STATE_BUSY = 0x03U, - HAL_DSI_STATE_TIMEOUT = 0x04U -} HAL_DSI_StateTypeDef; - -/** - * @brief DSI Handle Structure definition - */ -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) -typedef struct __DSI_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ -{ - DSI_TypeDef *Instance; /*!< Register base address */ - DSI_InitTypeDef Init; /*!< DSI required parameters */ - HAL_LockTypeDef Lock; /*!< DSI peripheral status */ - __IO HAL_DSI_StateTypeDef State; /*!< DSI communication state */ - __IO uint32_t ErrorCode; /*!< DSI Error code */ - uint32_t ErrorMsk; /*!< DSI Error monitoring mask */ - -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) - void (* TearingEffectCallback)(struct __DSI_HandleTypeDef *hdsi); /*!< DSI Tearing Effect Callback */ - void (* EndOfRefreshCallback)(struct __DSI_HandleTypeDef *hdsi); /*!< DSI End Of Refresh Callback */ - void (* ErrorCallback)(struct __DSI_HandleTypeDef *hdsi); /*!< DSI Error Callback */ - - void (* MspInitCallback)(struct __DSI_HandleTypeDef *hdsi); /*!< DSI Msp Init callback */ - void (* MspDeInitCallback)(struct __DSI_HandleTypeDef *hdsi); /*!< DSI Msp DeInit callback */ - -#endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ - -} DSI_HandleTypeDef; - -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) -/** - * @brief HAL DSI Callback ID enumeration definition - */ -typedef enum -{ - HAL_DSI_MSPINIT_CB_ID = 0x00U, /*!< DSI MspInit callback ID */ - HAL_DSI_MSPDEINIT_CB_ID = 0x01U, /*!< DSI MspDeInit callback ID */ - - HAL_DSI_TEARING_EFFECT_CB_ID = 0x02U, /*!< DSI Tearing Effect Callback ID */ - HAL_DSI_ENDOF_REFRESH_CB_ID = 0x03U, /*!< DSI End Of Refresh Callback ID */ - HAL_DSI_ERROR_CB_ID = 0x04U /*!< DSI Error Callback ID */ - -} HAL_DSI_CallbackIDTypeDef; - -/** - * @brief HAL DSI Callback pointer definition - */ -typedef void (*pDSI_CallbackTypeDef)(DSI_HandleTypeDef *hdsi); /*!< pointer to an DSI callback function */ - -#endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup DSI_Exported_Constants DSI Exported Constants - * @{ - */ -/** @defgroup DSI_DCS_Command DSI DCS Command - * @{ - */ -#define DSI_ENTER_IDLE_MODE 0x39U -#define DSI_ENTER_INVERT_MODE 0x21U -#define DSI_ENTER_NORMAL_MODE 0x13U -#define DSI_ENTER_PARTIAL_MODE 0x12U -#define DSI_ENTER_SLEEP_MODE 0x10U -#define DSI_EXIT_IDLE_MODE 0x38U -#define DSI_EXIT_INVERT_MODE 0x20U -#define DSI_EXIT_SLEEP_MODE 0x11U -#define DSI_GET_3D_CONTROL 0x3FU -#define DSI_GET_ADDRESS_MODE 0x0BU -#define DSI_GET_BLUE_CHANNEL 0x08U -#define DSI_GET_DIAGNOSTIC_RESULT 0x0FU -#define DSI_GET_DISPLAY_MODE 0x0DU -#define DSI_GET_GREEN_CHANNEL 0x07U -#define DSI_GET_PIXEL_FORMAT 0x0CU -#define DSI_GET_POWER_MODE 0x0AU -#define DSI_GET_RED_CHANNEL 0x06U -#define DSI_GET_SCANLINE 0x45U -#define DSI_GET_SIGNAL_MODE 0x0EU -#define DSI_NOP 0x00U -#define DSI_READ_DDB_CONTINUE 0xA8U -#define DSI_READ_DDB_START 0xA1U -#define DSI_READ_MEMORY_CONTINUE 0x3EU -#define DSI_READ_MEMORY_START 0x2EU -#define DSI_SET_3D_CONTROL 0x3DU -#define DSI_SET_ADDRESS_MODE 0x36U -#define DSI_SET_COLUMN_ADDRESS 0x2AU -#define DSI_SET_DISPLAY_OFF 0x28U -#define DSI_SET_DISPLAY_ON 0x29U -#define DSI_SET_GAMMA_CURVE 0x26U -#define DSI_SET_PAGE_ADDRESS 0x2BU -#define DSI_SET_PARTIAL_COLUMNS 0x31U -#define DSI_SET_PARTIAL_ROWS 0x30U -#define DSI_SET_PIXEL_FORMAT 0x3AU -#define DSI_SET_SCROLL_AREA 0x33U -#define DSI_SET_SCROLL_START 0x37U -#define DSI_SET_TEAR_OFF 0x34U -#define DSI_SET_TEAR_ON 0x35U -#define DSI_SET_TEAR_SCANLINE 0x44U -#define DSI_SET_VSYNC_TIMING 0x40U -#define DSI_SOFT_RESET 0x01U -#define DSI_WRITE_LUT 0x2DU -#define DSI_WRITE_MEMORY_CONTINUE 0x3CU -#define DSI_WRITE_MEMORY_START 0x2CU -/** - * @} - */ - -/** @defgroup DSI_Video_Mode_Type DSI Video Mode Type - * @{ - */ -#define DSI_VID_MODE_NB_PULSES 0U -#define DSI_VID_MODE_NB_EVENTS 1U -#define DSI_VID_MODE_BURST 2U -/** - * @} - */ - -/** @defgroup DSI_Color_Mode DSI Color Mode - * @{ - */ -#define DSI_COLOR_MODE_FULL 0x00000000U -#define DSI_COLOR_MODE_EIGHT DSI_WCR_COLM -/** - * @} - */ - -/** @defgroup DSI_ShutDown DSI ShutDown - * @{ - */ -#define DSI_DISPLAY_ON 0x00000000U -#define DSI_DISPLAY_OFF DSI_WCR_SHTDN -/** - * @} - */ - -/** @defgroup DSI_LP_Command DSI LP Command - * @{ - */ -#define DSI_LP_COMMAND_DISABLE 0x00000000U -#define DSI_LP_COMMAND_ENABLE DSI_VMCR_LPCE -/** - * @} - */ - -/** @defgroup DSI_LP_HFP DSI LP HFP - * @{ - */ -#define DSI_LP_HFP_DISABLE 0x00000000U -#define DSI_LP_HFP_ENABLE DSI_VMCR_LPHFPE -/** - * @} - */ - -/** @defgroup DSI_LP_HBP DSI LP HBP - * @{ - */ -#define DSI_LP_HBP_DISABLE 0x00000000U -#define DSI_LP_HBP_ENABLE DSI_VMCR_LPHBPE -/** - * @} - */ - -/** @defgroup DSI_LP_VACT DSI LP VACT - * @{ - */ -#define DSI_LP_VACT_DISABLE 0x00000000U -#define DSI_LP_VACT_ENABLE DSI_VMCR_LPVAE -/** - * @} - */ - -/** @defgroup DSI_LP_VFP DSI LP VFP - * @{ - */ -#define DSI_LP_VFP_DISABLE 0x00000000U -#define DSI_LP_VFP_ENABLE DSI_VMCR_LPVFPE -/** - * @} - */ - -/** @defgroup DSI_LP_VBP DSI LP VBP - * @{ - */ -#define DSI_LP_VBP_DISABLE 0x00000000U -#define DSI_LP_VBP_ENABLE DSI_VMCR_LPVBPE -/** - * @} - */ - -/** @defgroup DSI_LP_VSYNC DSI LP VSYNC - * @{ - */ -#define DSI_LP_VSYNC_DISABLE 0x00000000U -#define DSI_LP_VSYNC_ENABLE DSI_VMCR_LPVSAE -/** - * @} - */ - -/** @defgroup DSI_FBTA_acknowledge DSI FBTA Acknowledge - * @{ - */ -#define DSI_FBTAA_DISABLE 0x00000000U -#define DSI_FBTAA_ENABLE DSI_VMCR_FBTAAE -/** - * @} - */ - -/** @defgroup DSI_TearingEffectSource DSI Tearing Effect Source - * @{ - */ -#define DSI_TE_DSILINK 0x00000000U -#define DSI_TE_EXTERNAL DSI_WCFGR_TESRC -/** - * @} - */ - -/** @defgroup DSI_TearingEffectPolarity DSI Tearing Effect Polarity - * @{ - */ -#define DSI_TE_RISING_EDGE 0x00000000U -#define DSI_TE_FALLING_EDGE DSI_WCFGR_TEPOL -/** - * @} - */ - -/** @defgroup DSI_Vsync_Polarity DSI Vsync Polarity - * @{ - */ -#define DSI_VSYNC_FALLING 0x00000000U -#define DSI_VSYNC_RISING DSI_WCFGR_VSPOL -/** - * @} - */ - -/** @defgroup DSI_AutomaticRefresh DSI Automatic Refresh - * @{ - */ -#define DSI_AR_DISABLE 0x00000000U -#define DSI_AR_ENABLE DSI_WCFGR_AR -/** - * @} - */ - -/** @defgroup DSI_TE_AcknowledgeRequest DSI TE Acknowledge Request - * @{ - */ -#define DSI_TE_ACKNOWLEDGE_DISABLE 0x00000000U -#define DSI_TE_ACKNOWLEDGE_ENABLE DSI_CMCR_TEARE -/** - * @} - */ - -/** @defgroup DSI_AcknowledgeRequest DSI Acknowledge Request - * @{ - */ -#define DSI_ACKNOWLEDGE_DISABLE 0x00000000U -#define DSI_ACKNOWLEDGE_ENABLE DSI_CMCR_ARE -/** - * @} - */ - -/** @defgroup DSI_LP_LPGenShortWriteNoP DSI LP LPGen Short Write NoP - * @{ - */ -#define DSI_LP_GSW0P_DISABLE 0x00000000U -#define DSI_LP_GSW0P_ENABLE DSI_CMCR_GSW0TX -/** - * @} - */ - -/** @defgroup DSI_LP_LPGenShortWriteOneP DSI LP LPGen Short Write OneP - * @{ - */ -#define DSI_LP_GSW1P_DISABLE 0x00000000U -#define DSI_LP_GSW1P_ENABLE DSI_CMCR_GSW1TX -/** - * @} - */ - -/** @defgroup DSI_LP_LPGenShortWriteTwoP DSI LP LPGen Short Write TwoP - * @{ - */ -#define DSI_LP_GSW2P_DISABLE 0x00000000U -#define DSI_LP_GSW2P_ENABLE DSI_CMCR_GSW2TX -/** - * @} - */ - -/** @defgroup DSI_LP_LPGenShortReadNoP DSI LP LPGen Short Read NoP - * @{ - */ -#define DSI_LP_GSR0P_DISABLE 0x00000000U -#define DSI_LP_GSR0P_ENABLE DSI_CMCR_GSR0TX -/** - * @} - */ - -/** @defgroup DSI_LP_LPGenShortReadOneP DSI LP LPGen Short Read OneP - * @{ - */ -#define DSI_LP_GSR1P_DISABLE 0x00000000U -#define DSI_LP_GSR1P_ENABLE DSI_CMCR_GSR1TX -/** - * @} - */ - -/** @defgroup DSI_LP_LPGenShortReadTwoP DSI LP LPGen Short Read TwoP - * @{ - */ -#define DSI_LP_GSR2P_DISABLE 0x00000000U -#define DSI_LP_GSR2P_ENABLE DSI_CMCR_GSR2TX -/** - * @} - */ - -/** @defgroup DSI_LP_LPGenLongWrite DSI LP LPGen LongWrite - * @{ - */ -#define DSI_LP_GLW_DISABLE 0x00000000U -#define DSI_LP_GLW_ENABLE DSI_CMCR_GLWTX -/** - * @} - */ - -/** @defgroup DSI_LP_LPDcsShortWriteNoP DSI LP LPDcs Short Write NoP - * @{ - */ -#define DSI_LP_DSW0P_DISABLE 0x00000000U -#define DSI_LP_DSW0P_ENABLE DSI_CMCR_DSW0TX -/** - * @} - */ - -/** @defgroup DSI_LP_LPDcsShortWriteOneP DSI LP LPDcs Short Write OneP - * @{ - */ -#define DSI_LP_DSW1P_DISABLE 0x00000000U -#define DSI_LP_DSW1P_ENABLE DSI_CMCR_DSW1TX -/** - * @} - */ - -/** @defgroup DSI_LP_LPDcsShortReadNoP DSI LP LPDcs Short Read NoP - * @{ - */ -#define DSI_LP_DSR0P_DISABLE 0x00000000U -#define DSI_LP_DSR0P_ENABLE DSI_CMCR_DSR0TX -/** - * @} - */ - -/** @defgroup DSI_LP_LPDcsLongWrite DSI LP LPDcs Long Write - * @{ - */ -#define DSI_LP_DLW_DISABLE 0x00000000U -#define DSI_LP_DLW_ENABLE DSI_CMCR_DLWTX -/** - * @} - */ - -/** @defgroup DSI_LP_LPMaxReadPacket DSI LP LPMax Read Packet - * @{ - */ -#define DSI_LP_MRDP_DISABLE 0x00000000U -#define DSI_LP_MRDP_ENABLE DSI_CMCR_MRDPS -/** - * @} - */ - -/** @defgroup DSI_HS_PrespMode DSI HS Presp Mode - * @{ - */ -#define DSI_HS_PM_DISABLE 0x00000000U -#define DSI_HS_PM_ENABLE DSI_TCCR3_PM -/** - * @} - */ - - -/** @defgroup DSI_Automatic_Clk_Lane_Control DSI Automatic Clk Lane Control - * @{ - */ -#define DSI_AUTO_CLK_LANE_CTRL_DISABLE 0x00000000U -#define DSI_AUTO_CLK_LANE_CTRL_ENABLE DSI_CLCR_ACR -/** - * @} - */ - -/** @defgroup DSI_Number_Of_Lanes DSI Number Of Lanes - * @{ - */ -#define DSI_ONE_DATA_LANE 0U -#define DSI_TWO_DATA_LANES 1U -/** - * @} - */ - -/** @defgroup DSI_FlowControl DSI Flow Control - * @{ - */ -#define DSI_FLOW_CONTROL_CRC_RX DSI_PCR_CRCRXE -#define DSI_FLOW_CONTROL_ECC_RX DSI_PCR_ECCRXE -#define DSI_FLOW_CONTROL_BTA DSI_PCR_BTAE -#define DSI_FLOW_CONTROL_EOTP_RX DSI_PCR_ETRXE -#define DSI_FLOW_CONTROL_EOTP_TX DSI_PCR_ETTXE -#define DSI_FLOW_CONTROL_ALL (DSI_FLOW_CONTROL_CRC_RX | DSI_FLOW_CONTROL_ECC_RX | \ - DSI_FLOW_CONTROL_BTA | DSI_FLOW_CONTROL_EOTP_RX | \ - DSI_FLOW_CONTROL_EOTP_TX) -/** - * @} - */ - -/** @defgroup DSI_Color_Coding DSI Color Coding - * @{ - */ -#define DSI_RGB565 0x00000000U /*!< The values 0x00000001 and 0x00000002 can also be used for the RGB565 color mode configuration */ -#define DSI_RGB666 0x00000003U /*!< The value 0x00000004 can also be used for the RGB666 color mode configuration */ -#define DSI_RGB888 0x00000005U -/** - * @} - */ - -/** @defgroup DSI_LooselyPacked DSI Loosely Packed - * @{ - */ -#define DSI_LOOSELY_PACKED_ENABLE DSI_LCOLCR_LPE -#define DSI_LOOSELY_PACKED_DISABLE 0x00000000U -/** - * @} - */ - -/** @defgroup DSI_HSYNC_Polarity DSI HSYNC Polarity - * @{ - */ -#define DSI_HSYNC_ACTIVE_HIGH 0x00000000U -#define DSI_HSYNC_ACTIVE_LOW DSI_LPCR_HSP -/** - * @} - */ - -/** @defgroup DSI_VSYNC_Active_Polarity DSI VSYNC Active Polarity - * @{ - */ -#define DSI_VSYNC_ACTIVE_HIGH 0x00000000U -#define DSI_VSYNC_ACTIVE_LOW DSI_LPCR_VSP -/** - * @} - */ - -/** @defgroup DSI_DATA_ENABLE_Polarity DSI DATA ENABLE Polarity - * @{ - */ -#define DSI_DATA_ENABLE_ACTIVE_HIGH 0x00000000U -#define DSI_DATA_ENABLE_ACTIVE_LOW DSI_LPCR_DEP -/** - * @} - */ - -/** @defgroup DSI_PLL_IDF DSI PLL IDF - * @{ - */ -#define DSI_PLL_IN_DIV1 0x00000001U -#define DSI_PLL_IN_DIV2 0x00000002U -#define DSI_PLL_IN_DIV3 0x00000003U -#define DSI_PLL_IN_DIV4 0x00000004U -#define DSI_PLL_IN_DIV5 0x00000005U -#define DSI_PLL_IN_DIV6 0x00000006U -#define DSI_PLL_IN_DIV7 0x00000007U -/** - * @} - */ - -/** @defgroup DSI_PLL_ODF DSI PLL ODF - * @{ - */ -#define DSI_PLL_OUT_DIV1 0x00000000U -#define DSI_PLL_OUT_DIV2 0x00000001U -#define DSI_PLL_OUT_DIV4 0x00000002U -#define DSI_PLL_OUT_DIV8 0x00000003U -/** - * @} - */ - -/** @defgroup DSI_Flags DSI Flags - * @{ - */ -#define DSI_FLAG_TE DSI_WISR_TEIF -#define DSI_FLAG_ER DSI_WISR_ERIF -#define DSI_FLAG_BUSY DSI_WISR_BUSY -#define DSI_FLAG_PLLLS DSI_WISR_PLLLS -#define DSI_FLAG_PLLL DSI_WISR_PLLLIF -#define DSI_FLAG_PLLU DSI_WISR_PLLUIF -#define DSI_FLAG_RRS DSI_WISR_RRS -#define DSI_FLAG_RR DSI_WISR_RRIF -/** - * @} - */ - -/** @defgroup DSI_Interrupts DSI Interrupts - * @{ - */ -#define DSI_IT_TE DSI_WIER_TEIE -#define DSI_IT_ER DSI_WIER_ERIE -#define DSI_IT_PLLL DSI_WIER_PLLLIE -#define DSI_IT_PLLU DSI_WIER_PLLUIE -#define DSI_IT_RR DSI_WIER_RRIE -/** - * @} - */ - -/** @defgroup DSI_SHORT_WRITE_PKT_Data_Type DSI SHORT WRITE PKT Data Type - * @{ - */ -#define DSI_DCS_SHORT_PKT_WRITE_P0 0x00000005U /*!< DCS short write, no parameters */ -#define DSI_DCS_SHORT_PKT_WRITE_P1 0x00000015U /*!< DCS short write, one parameter */ -#define DSI_GEN_SHORT_PKT_WRITE_P0 0x00000003U /*!< Generic short write, no parameters */ -#define DSI_GEN_SHORT_PKT_WRITE_P1 0x00000013U /*!< Generic short write, one parameter */ -#define DSI_GEN_SHORT_PKT_WRITE_P2 0x00000023U /*!< Generic short write, two parameters */ -/** - * @} - */ - -/** @defgroup DSI_LONG_WRITE_PKT_Data_Type DSI LONG WRITE PKT Data Type - * @{ - */ -#define DSI_DCS_LONG_PKT_WRITE 0x00000039U /*!< DCS long write */ -#define DSI_GEN_LONG_PKT_WRITE 0x00000029U /*!< Generic long write */ -/** - * @} - */ - -/** @defgroup DSI_SHORT_READ_PKT_Data_Type DSI SHORT READ PKT Data Type - * @{ - */ -#define DSI_DCS_SHORT_PKT_READ 0x00000006U /*!< DCS short read */ -#define DSI_GEN_SHORT_PKT_READ_P0 0x00000004U /*!< Generic short read, no parameters */ -#define DSI_GEN_SHORT_PKT_READ_P1 0x00000014U /*!< Generic short read, one parameter */ -#define DSI_GEN_SHORT_PKT_READ_P2 0x00000024U /*!< Generic short read, two parameters */ -/** - * @} - */ - -/** @defgroup DSI_Error_Data_Type DSI Error Data Type - * @{ - */ -#define HAL_DSI_ERROR_NONE 0U -#define HAL_DSI_ERROR_ACK 0x00000001U /*!< Acknowledge errors */ -#define HAL_DSI_ERROR_PHY 0x00000002U /*!< PHY related errors */ -#define HAL_DSI_ERROR_TX 0x00000004U /*!< Transmission error */ -#define HAL_DSI_ERROR_RX 0x00000008U /*!< Reception error */ -#define HAL_DSI_ERROR_ECC 0x00000010U /*!< ECC errors */ -#define HAL_DSI_ERROR_CRC 0x00000020U /*!< CRC error */ -#define HAL_DSI_ERROR_PSE 0x00000040U /*!< Packet Size error */ -#define HAL_DSI_ERROR_EOT 0x00000080U /*!< End Of Transmission error */ -#define HAL_DSI_ERROR_OVF 0x00000100U /*!< FIFO overflow error */ -#define HAL_DSI_ERROR_GEN 0x00000200U /*!< Generic FIFO related errors */ -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) -#define HAL_DSI_ERROR_INVALID_CALLBACK 0x00000400U /*!< DSI Invalid Callback error */ -#endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @defgroup DSI_Lane_Group DSI Lane Group - * @{ - */ -#define DSI_CLOCK_LANE 0x00000000U -#define DSI_DATA_LANES 0x00000001U -/** - * @} - */ - -/** @defgroup DSI_Communication_Delay DSI Communication Delay - * @{ - */ -#define DSI_SLEW_RATE_HSTX 0x00000000U -#define DSI_SLEW_RATE_LPTX 0x00000001U -#define DSI_HS_DELAY 0x00000002U -/** - * @} - */ - -/** @defgroup DSI_CustomLane DSI CustomLane - * @{ - */ -#define DSI_SWAP_LANE_PINS 0x00000000U -#define DSI_INVERT_HS_SIGNAL 0x00000001U -/** - * @} - */ - -/** @defgroup DSI_Lane_Select DSI Lane Select - * @{ - */ -#define DSI_CLK_LANE 0x00000000U -#define DSI_DATA_LANE0 0x00000001U -#define DSI_DATA_LANE1 0x00000002U -/** - * @} - */ - -/** @defgroup DSI_PHY_Timing DSI PHY Timing - * @{ - */ -#define DSI_TCLK_POST 0x00000000U -#define DSI_TLPX_CLK 0x00000001U -#define DSI_THS_EXIT 0x00000002U -#define DSI_TLPX_DATA 0x00000003U -#define DSI_THS_ZERO 0x00000004U -#define DSI_THS_TRAIL 0x00000005U -#define DSI_THS_PREPARE 0x00000006U -#define DSI_TCLK_ZERO 0x00000007U -#define DSI_TCLK_PREPARE 0x00000008U -/** - * @} - */ - - -/** - * @} - */ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup DSI_Exported_Macros DSI Exported Macros - * @{ - */ - -/** - * @brief Reset DSI handle state. - * @param __HANDLE__ DSI handle - * @retval None - */ -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) -#define __HAL_DSI_RESET_HANDLE_STATE(__HANDLE__) do{ \ - (__HANDLE__)->State = HAL_DSI_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_DSI_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DSI_STATE_RESET) -#endif /*USE_HAL_DSI_REGISTER_CALLBACKS */ - -/** - * @brief Enables the DSI host. - * @param __HANDLE__ DSI handle - * @retval None. - */ -#define __HAL_DSI_ENABLE(__HANDLE__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT((__HANDLE__)->Instance->CR, DSI_CR_EN);\ - /* Delay after an DSI Host enabling */ \ - tmpreg = READ_BIT((__HANDLE__)->Instance->CR, DSI_CR_EN);\ - UNUSED(tmpreg); \ - } while(0U) - -/** - * @brief Disables the DSI host. - * @param __HANDLE__ DSI handle - * @retval None. - */ -#define __HAL_DSI_DISABLE(__HANDLE__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - CLEAR_BIT((__HANDLE__)->Instance->CR, DSI_CR_EN);\ - /* Delay after an DSI Host disabling */ \ - tmpreg = READ_BIT((__HANDLE__)->Instance->CR, DSI_CR_EN);\ - UNUSED(tmpreg); \ - } while(0U) - -/** - * @brief Enables the DSI wrapper. - * @param __HANDLE__ DSI handle - * @retval None. - */ -#define __HAL_DSI_WRAPPER_ENABLE(__HANDLE__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT((__HANDLE__)->Instance->WCR, DSI_WCR_DSIEN);\ - /* Delay after an DSI wrapper enabling */ \ - tmpreg = READ_BIT((__HANDLE__)->Instance->WCR, DSI_WCR_DSIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -/** - * @brief Disable the DSI wrapper. - * @param __HANDLE__ DSI handle - * @retval None. - */ -#define __HAL_DSI_WRAPPER_DISABLE(__HANDLE__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - CLEAR_BIT((__HANDLE__)->Instance->WCR, DSI_WCR_DSIEN);\ - /* Delay after an DSI wrapper disabling*/ \ - tmpreg = READ_BIT((__HANDLE__)->Instance->WCR, DSI_WCR_DSIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -/** - * @brief Enables the DSI PLL. - * @param __HANDLE__ DSI handle - * @retval None. - */ -#define __HAL_DSI_PLL_ENABLE(__HANDLE__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT((__HANDLE__)->Instance->WRPCR, DSI_WRPCR_PLLEN);\ - /* Delay after an DSI PLL enabling */ \ - tmpreg = READ_BIT((__HANDLE__)->Instance->WRPCR, DSI_WRPCR_PLLEN);\ - UNUSED(tmpreg); \ - } while(0U) - -/** - * @brief Disables the DSI PLL. - * @param __HANDLE__ DSI handle - * @retval None. - */ -#define __HAL_DSI_PLL_DISABLE(__HANDLE__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - CLEAR_BIT((__HANDLE__)->Instance->WRPCR, DSI_WRPCR_PLLEN);\ - /* Delay after an DSI PLL disabling */ \ - tmpreg = READ_BIT((__HANDLE__)->Instance->WRPCR, DSI_WRPCR_PLLEN);\ - UNUSED(tmpreg); \ - } while(0U) - -/** - * @brief Enables the DSI regulator. - * @param __HANDLE__ DSI handle - * @retval None. - */ -#define __HAL_DSI_REG_ENABLE(__HANDLE__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT((__HANDLE__)->Instance->WRPCR, DSI_WRPCR_REGEN);\ - /* Delay after an DSI regulator enabling */ \ - tmpreg = READ_BIT((__HANDLE__)->Instance->WRPCR, DSI_WRPCR_REGEN);\ - UNUSED(tmpreg); \ - } while(0U) - -/** - * @brief Disables the DSI regulator. - * @param __HANDLE__ DSI handle - * @retval None. - */ -#define __HAL_DSI_REG_DISABLE(__HANDLE__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - CLEAR_BIT((__HANDLE__)->Instance->WRPCR, DSI_WRPCR_REGEN);\ - /* Delay after an DSI regulator disabling */ \ - tmpreg = READ_BIT((__HANDLE__)->Instance->WRPCR, DSI_WRPCR_REGEN);\ - UNUSED(tmpreg); \ - } while(0U) - -/** - * @brief Get the DSI pending flags. - * @param __HANDLE__ DSI handle. - * @param __FLAG__ Get the specified flag. - * This parameter can be any combination of the following values: - * @arg DSI_FLAG_TE : Tearing Effect Interrupt Flag - * @arg DSI_FLAG_ER : End of Refresh Interrupt Flag - * @arg DSI_FLAG_BUSY : Busy Flag - * @arg DSI_FLAG_PLLLS: PLL Lock Status - * @arg DSI_FLAG_PLLL : PLL Lock Interrupt Flag - * @arg DSI_FLAG_PLLU : PLL Unlock Interrupt Flag - * @arg DSI_FLAG_RRS : Regulator Ready Flag - * @arg DSI_FLAG_RR : Regulator Ready Interrupt Flag - * @retval The state of FLAG (SET or RESET). - */ -#define __HAL_DSI_GET_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->WISR & (__FLAG__)) - -/** - * @brief Clears the DSI pending flags. - * @param __HANDLE__ DSI handle. - * @param __FLAG__ specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg DSI_FLAG_TE : Tearing Effect Interrupt Flag - * @arg DSI_FLAG_ER : End of Refresh Interrupt Flag - * @arg DSI_FLAG_PLLL : PLL Lock Interrupt Flag - * @arg DSI_FLAG_PLLU : PLL Unlock Interrupt Flag - * @arg DSI_FLAG_RR : Regulator Ready Interrupt Flag - * @retval None - */ -#define __HAL_DSI_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->WIFCR = (__FLAG__)) - -/** - * @brief Enables the specified DSI interrupts. - * @param __HANDLE__ DSI handle. - * @param __INTERRUPT__ specifies the DSI interrupt sources to be enabled. - * This parameter can be any combination of the following values: - * @arg DSI_IT_TE : Tearing Effect Interrupt - * @arg DSI_IT_ER : End of Refresh Interrupt - * @arg DSI_IT_PLLL: PLL Lock Interrupt - * @arg DSI_IT_PLLU: PLL Unlock Interrupt - * @arg DSI_IT_RR : Regulator Ready Interrupt - * @retval None - */ -#define __HAL_DSI_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->WIER |= (__INTERRUPT__)) - -/** - * @brief Disables the specified DSI interrupts. - * @param __HANDLE__ DSI handle - * @param __INTERRUPT__ specifies the DSI interrupt sources to be disabled. - * This parameter can be any combination of the following values: - * @arg DSI_IT_TE : Tearing Effect Interrupt - * @arg DSI_IT_ER : End of Refresh Interrupt - * @arg DSI_IT_PLLL: PLL Lock Interrupt - * @arg DSI_IT_PLLU: PLL Unlock Interrupt - * @arg DSI_IT_RR : Regulator Ready Interrupt - * @retval None - */ -#define __HAL_DSI_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->WIER &= ~(__INTERRUPT__)) - -/** - * @brief Checks whether the specified DSI interrupt source is enabled or not. - * @param __HANDLE__ DSI handle - * @param __INTERRUPT__ specifies the DSI interrupt source to check. - * This parameter can be one of the following values: - * @arg DSI_IT_TE : Tearing Effect Interrupt - * @arg DSI_IT_ER : End of Refresh Interrupt - * @arg DSI_IT_PLLL: PLL Lock Interrupt - * @arg DSI_IT_PLLU: PLL Unlock Interrupt - * @arg DSI_IT_RR : Regulator Ready Interrupt - * @retval The state of INTERRUPT (SET or RESET). - */ -#define __HAL_DSI_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->WIER & (__INTERRUPT__)) - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup DSI_Exported_Functions DSI Exported Functions - * @{ - */ -/** @defgroup DSI_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * @{ - */ -HAL_StatusTypeDef HAL_DSI_Init(DSI_HandleTypeDef *hdsi, DSI_PLLInitTypeDef *PLLInit); -HAL_StatusTypeDef HAL_DSI_DeInit(DSI_HandleTypeDef *hdsi); -void HAL_DSI_MspInit(DSI_HandleTypeDef *hdsi); -void HAL_DSI_MspDeInit(DSI_HandleTypeDef *hdsi); -HAL_StatusTypeDef HAL_DSI_ConfigErrorMonitor(DSI_HandleTypeDef *hdsi, uint32_t ActiveErrors); -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_DSI_RegisterCallback(DSI_HandleTypeDef *hdsi, HAL_DSI_CallbackIDTypeDef CallbackID, - pDSI_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_DSI_UnRegisterCallback(DSI_HandleTypeDef *hdsi, HAL_DSI_CallbackIDTypeDef CallbackID); -#endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @defgroup DSI_Group2 IO operation functions - * @brief IO operation functions - * @{ - */ -void HAL_DSI_IRQHandler(DSI_HandleTypeDef *hdsi); -void HAL_DSI_TearingEffectCallback(DSI_HandleTypeDef *hdsi); -void HAL_DSI_EndOfRefreshCallback(DSI_HandleTypeDef *hdsi); -void HAL_DSI_ErrorCallback(DSI_HandleTypeDef *hdsi); -/** - * @} - */ - -/** @defgroup DSI_Group3 Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ -HAL_StatusTypeDef HAL_DSI_SetGenericVCID(DSI_HandleTypeDef *hdsi, uint32_t VirtualChannelID); -HAL_StatusTypeDef HAL_DSI_ConfigVideoMode(DSI_HandleTypeDef *hdsi, DSI_VidCfgTypeDef *VidCfg); -HAL_StatusTypeDef HAL_DSI_ConfigAdaptedCommandMode(DSI_HandleTypeDef *hdsi, DSI_CmdCfgTypeDef *CmdCfg); -HAL_StatusTypeDef HAL_DSI_ConfigCommand(DSI_HandleTypeDef *hdsi, DSI_LPCmdTypeDef *LPCmd); -HAL_StatusTypeDef HAL_DSI_ConfigFlowControl(DSI_HandleTypeDef *hdsi, uint32_t FlowControl); -HAL_StatusTypeDef HAL_DSI_ConfigPhyTimer(DSI_HandleTypeDef *hdsi, DSI_PHY_TimerTypeDef *PhyTimers); -HAL_StatusTypeDef HAL_DSI_ConfigHostTimeouts(DSI_HandleTypeDef *hdsi, DSI_HOST_TimeoutTypeDef *HostTimeouts); -HAL_StatusTypeDef HAL_DSI_Start(DSI_HandleTypeDef *hdsi); -HAL_StatusTypeDef HAL_DSI_Stop(DSI_HandleTypeDef *hdsi); -HAL_StatusTypeDef HAL_DSI_Refresh(DSI_HandleTypeDef *hdsi); -HAL_StatusTypeDef HAL_DSI_ColorMode(DSI_HandleTypeDef *hdsi, uint32_t ColorMode); -HAL_StatusTypeDef HAL_DSI_Shutdown(DSI_HandleTypeDef *hdsi, uint32_t Shutdown); -HAL_StatusTypeDef HAL_DSI_ShortWrite(DSI_HandleTypeDef *hdsi, - uint32_t ChannelID, - uint32_t Mode, - uint32_t Param1, - uint32_t Param2); -HAL_StatusTypeDef HAL_DSI_LongWrite(DSI_HandleTypeDef *hdsi, - uint32_t ChannelID, - uint32_t Mode, - uint32_t NbParams, - uint32_t Param1, - const uint8_t *ParametersTable); -HAL_StatusTypeDef HAL_DSI_Read(DSI_HandleTypeDef *hdsi, - uint32_t ChannelNbr, - uint8_t *Array, - uint32_t Size, - uint32_t Mode, - uint32_t DCSCmd, - uint8_t *ParametersTable); -HAL_StatusTypeDef HAL_DSI_EnterULPMData(DSI_HandleTypeDef *hdsi); -HAL_StatusTypeDef HAL_DSI_ExitULPMData(DSI_HandleTypeDef *hdsi); -HAL_StatusTypeDef HAL_DSI_EnterULPM(DSI_HandleTypeDef *hdsi); -HAL_StatusTypeDef HAL_DSI_ExitULPM(DSI_HandleTypeDef *hdsi); - -HAL_StatusTypeDef HAL_DSI_PatternGeneratorStart(DSI_HandleTypeDef *hdsi, uint32_t Mode, uint32_t Orientation); -HAL_StatusTypeDef HAL_DSI_PatternGeneratorStop(DSI_HandleTypeDef *hdsi); - -HAL_StatusTypeDef HAL_DSI_SetSlewRateAndDelayTuning(DSI_HandleTypeDef *hdsi, uint32_t CommDelay, uint32_t Lane, - uint32_t Value); -HAL_StatusTypeDef HAL_DSI_SetLowPowerRXFilter(DSI_HandleTypeDef *hdsi, uint32_t Frequency); -HAL_StatusTypeDef HAL_DSI_SetSDD(DSI_HandleTypeDef *hdsi, FunctionalState State); -HAL_StatusTypeDef HAL_DSI_SetLanePinsConfiguration(DSI_HandleTypeDef *hdsi, uint32_t CustomLane, uint32_t Lane, - FunctionalState State); -HAL_StatusTypeDef HAL_DSI_SetPHYTimings(DSI_HandleTypeDef *hdsi, uint32_t Timing, FunctionalState State, - uint32_t Value); -HAL_StatusTypeDef HAL_DSI_ForceTXStopMode(DSI_HandleTypeDef *hdsi, uint32_t Lane, FunctionalState State); -HAL_StatusTypeDef HAL_DSI_ForceRXLowPower(DSI_HandleTypeDef *hdsi, FunctionalState State); -HAL_StatusTypeDef HAL_DSI_ForceDataLanesInRX(DSI_HandleTypeDef *hdsi, FunctionalState State); -HAL_StatusTypeDef HAL_DSI_SetPullDown(DSI_HandleTypeDef *hdsi, FunctionalState State); -HAL_StatusTypeDef HAL_DSI_SetContentionDetectionOff(DSI_HandleTypeDef *hdsi, FunctionalState State); - -/** - * @} - */ - -/** @defgroup DSI_Group4 Peripheral State and Errors functions - * @brief Peripheral State and Errors functions - * @{ - */ -uint32_t HAL_DSI_GetError(const DSI_HandleTypeDef *hdsi); -HAL_DSI_StateTypeDef HAL_DSI_GetState(const DSI_HandleTypeDef *hdsi); - -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private defines -----------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup DSI_Private_Constants DSI Private Constants - * @{ - */ -#define DSI_MAX_RETURN_PKT_SIZE (0x00000037U) /*!< Maximum return packet configuration */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup DSI_Private_Macros DSI Private Macros - * @{ - */ -#define IS_DSI_PLL_NDIV(NDIV) ((10U <= (NDIV)) && ((NDIV) <= 125U)) -#define IS_DSI_PLL_IDF(IDF) (((IDF) == DSI_PLL_IN_DIV1) || \ - ((IDF) == DSI_PLL_IN_DIV2) || \ - ((IDF) == DSI_PLL_IN_DIV3) || \ - ((IDF) == DSI_PLL_IN_DIV4) || \ - ((IDF) == DSI_PLL_IN_DIV5) || \ - ((IDF) == DSI_PLL_IN_DIV6) || \ - ((IDF) == DSI_PLL_IN_DIV7)) -#define IS_DSI_PLL_ODF(ODF) (((ODF) == DSI_PLL_OUT_DIV1) || \ - ((ODF) == DSI_PLL_OUT_DIV2) || \ - ((ODF) == DSI_PLL_OUT_DIV4) || \ - ((ODF) == DSI_PLL_OUT_DIV8)) -#define IS_DSI_AUTO_CLKLANE_CONTROL(AutoClkLane) (((AutoClkLane) == DSI_AUTO_CLK_LANE_CTRL_DISABLE)\ - || ((AutoClkLane) == DSI_AUTO_CLK_LANE_CTRL_ENABLE)) -#define IS_DSI_NUMBER_OF_LANES(NumberOfLanes) (((NumberOfLanes) == DSI_ONE_DATA_LANE)\ - || ((NumberOfLanes) == DSI_TWO_DATA_LANES)) -#define IS_DSI_FLOW_CONTROL(FlowControl) (((FlowControl) | DSI_FLOW_CONTROL_ALL) == DSI_FLOW_CONTROL_ALL) -#define IS_DSI_COLOR_CODING(ColorCoding) ((ColorCoding) <= 5U) -#define IS_DSI_LOOSELY_PACKED(LooselyPacked) (((LooselyPacked) == DSI_LOOSELY_PACKED_ENABLE)\ - || ((LooselyPacked) == DSI_LOOSELY_PACKED_DISABLE)) -#define IS_DSI_DE_POLARITY(DataEnable) (((DataEnable) == DSI_DATA_ENABLE_ACTIVE_HIGH)\ - || ((DataEnable) == DSI_DATA_ENABLE_ACTIVE_LOW)) -#define IS_DSI_VSYNC_POLARITY(Vsync) (((Vsync) == DSI_VSYNC_ACTIVE_HIGH)\ - || ((Vsync) == DSI_VSYNC_ACTIVE_LOW)) -#define IS_DSI_HSYNC_POLARITY(Hsync) (((Hsync) == DSI_HSYNC_ACTIVE_HIGH)\ - || ((Hsync) == DSI_HSYNC_ACTIVE_LOW)) -#define IS_DSI_VIDEO_MODE_TYPE(VideoModeType) (((VideoModeType) == DSI_VID_MODE_NB_PULSES) || \ - ((VideoModeType) == DSI_VID_MODE_NB_EVENTS) || \ - ((VideoModeType) == DSI_VID_MODE_BURST)) -#define IS_DSI_COLOR_MODE(ColorMode) (((ColorMode) == DSI_COLOR_MODE_FULL)\ - || ((ColorMode) == DSI_COLOR_MODE_EIGHT)) -#define IS_DSI_SHUT_DOWN(ShutDown) (((ShutDown) == DSI_DISPLAY_ON) || ((ShutDown) == DSI_DISPLAY_OFF)) -#define IS_DSI_LP_COMMAND(LPCommand) (((LPCommand) == DSI_LP_COMMAND_DISABLE)\ - || ((LPCommand) == DSI_LP_COMMAND_ENABLE)) -#define IS_DSI_LP_HFP(LPHFP) (((LPHFP) == DSI_LP_HFP_DISABLE) || ((LPHFP) == DSI_LP_HFP_ENABLE)) -#define IS_DSI_LP_HBP(LPHBP) (((LPHBP) == DSI_LP_HBP_DISABLE) || ((LPHBP) == DSI_LP_HBP_ENABLE)) -#define IS_DSI_LP_VACTIVE(LPVActive) (((LPVActive) == DSI_LP_VACT_DISABLE)\ - || ((LPVActive) == DSI_LP_VACT_ENABLE)) -#define IS_DSI_LP_VFP(LPVFP) (((LPVFP) == DSI_LP_VFP_DISABLE) || ((LPVFP) == DSI_LP_VFP_ENABLE)) -#define IS_DSI_LP_VBP(LPVBP) (((LPVBP) == DSI_LP_VBP_DISABLE) || ((LPVBP) == DSI_LP_VBP_ENABLE)) -#define IS_DSI_LP_VSYNC(LPVSYNC) (((LPVSYNC) == DSI_LP_VSYNC_DISABLE)\ - || ((LPVSYNC) == DSI_LP_VSYNC_ENABLE)) -#define IS_DSI_FBTAA(FrameBTAAcknowledge) (((FrameBTAAcknowledge) == DSI_FBTAA_DISABLE)\ - || ((FrameBTAAcknowledge) == DSI_FBTAA_ENABLE)) -#define IS_DSI_TE_SOURCE(TESource) (((TESource) == DSI_TE_DSILINK) || ((TESource) == DSI_TE_EXTERNAL)) -#define IS_DSI_TE_POLARITY(TEPolarity) (((TEPolarity) == DSI_TE_RISING_EDGE)\ - || ((TEPolarity) == DSI_TE_FALLING_EDGE)) -#define IS_DSI_AUTOMATIC_REFRESH(AutomaticRefresh) (((AutomaticRefresh) == DSI_AR_DISABLE)\ - || ((AutomaticRefresh) == DSI_AR_ENABLE)) -#define IS_DSI_VS_POLARITY(VSPolarity) (((VSPolarity) == DSI_VSYNC_FALLING)\ - || ((VSPolarity) == DSI_VSYNC_RISING)) -#define IS_DSI_TE_ACK_REQUEST(TEAcknowledgeRequest) (((TEAcknowledgeRequest) == DSI_TE_ACKNOWLEDGE_DISABLE)\ - || ((TEAcknowledgeRequest) == DSI_TE_ACKNOWLEDGE_ENABLE)) -#define IS_DSI_ACK_REQUEST(AcknowledgeRequest) (((AcknowledgeRequest) == DSI_ACKNOWLEDGE_DISABLE)\ - || ((AcknowledgeRequest) == DSI_ACKNOWLEDGE_ENABLE)) -#define IS_DSI_LP_GSW0P(LP_GSW0P) (((LP_GSW0P) == DSI_LP_GSW0P_DISABLE)\ - || ((LP_GSW0P) == DSI_LP_GSW0P_ENABLE)) -#define IS_DSI_LP_GSW1P(LP_GSW1P) (((LP_GSW1P) == DSI_LP_GSW1P_DISABLE)\ - || ((LP_GSW1P) == DSI_LP_GSW1P_ENABLE)) -#define IS_DSI_LP_GSW2P(LP_GSW2P) (((LP_GSW2P) == DSI_LP_GSW2P_DISABLE)\ - || ((LP_GSW2P) == DSI_LP_GSW2P_ENABLE)) -#define IS_DSI_LP_GSR0P(LP_GSR0P) (((LP_GSR0P) == DSI_LP_GSR0P_DISABLE)\ - || ((LP_GSR0P) == DSI_LP_GSR0P_ENABLE)) -#define IS_DSI_LP_GSR1P(LP_GSR1P) (((LP_GSR1P) == DSI_LP_GSR1P_DISABLE)\ - || ((LP_GSR1P) == DSI_LP_GSR1P_ENABLE)) -#define IS_DSI_LP_GSR2P(LP_GSR2P) (((LP_GSR2P) == DSI_LP_GSR2P_DISABLE)\ - || ((LP_GSR2P) == DSI_LP_GSR2P_ENABLE)) -#define IS_DSI_LP_GLW(LP_GLW) (((LP_GLW) == DSI_LP_GLW_DISABLE)\ - || ((LP_GLW) == DSI_LP_GLW_ENABLE)) -#define IS_DSI_LP_DSW0P(LP_DSW0P) (((LP_DSW0P) == DSI_LP_DSW0P_DISABLE)\ - || ((LP_DSW0P) == DSI_LP_DSW0P_ENABLE)) -#define IS_DSI_LP_DSW1P(LP_DSW1P) (((LP_DSW1P) == DSI_LP_DSW1P_DISABLE)\ - || ((LP_DSW1P) == DSI_LP_DSW1P_ENABLE)) -#define IS_DSI_LP_DSR0P(LP_DSR0P) (((LP_DSR0P) == DSI_LP_DSR0P_DISABLE)\ - || ((LP_DSR0P) == DSI_LP_DSR0P_ENABLE)) -#define IS_DSI_LP_DLW(LP_DLW) (((LP_DLW) == DSI_LP_DLW_DISABLE)\ - || ((LP_DLW) == DSI_LP_DLW_ENABLE)) -#define IS_DSI_LP_MRDP(LP_MRDP) (((LP_MRDP) == DSI_LP_MRDP_DISABLE)\ - || ((LP_MRDP) == DSI_LP_MRDP_ENABLE)) -#define IS_DSI_SHORT_WRITE_PACKET_TYPE(MODE) (((MODE) == DSI_DCS_SHORT_PKT_WRITE_P0) || \ - ((MODE) == DSI_DCS_SHORT_PKT_WRITE_P1) || \ - ((MODE) == DSI_GEN_SHORT_PKT_WRITE_P0) || \ - ((MODE) == DSI_GEN_SHORT_PKT_WRITE_P1) || \ - ((MODE) == DSI_GEN_SHORT_PKT_WRITE_P2)) -#define IS_DSI_LONG_WRITE_PACKET_TYPE(MODE) (((MODE) == DSI_DCS_LONG_PKT_WRITE) || \ - ((MODE) == DSI_GEN_LONG_PKT_WRITE)) -#define IS_DSI_READ_PACKET_TYPE(MODE) (((MODE) == DSI_DCS_SHORT_PKT_READ) || \ - ((MODE) == DSI_GEN_SHORT_PKT_READ_P0) || \ - ((MODE) == DSI_GEN_SHORT_PKT_READ_P1) || \ - ((MODE) == DSI_GEN_SHORT_PKT_READ_P2)) -#define IS_DSI_COMMUNICATION_DELAY(CommDelay) (((CommDelay) == DSI_SLEW_RATE_HSTX) || \ - ((CommDelay) == DSI_SLEW_RATE_LPTX) || \ - ((CommDelay) == DSI_HS_DELAY)) -#define IS_DSI_LANE_GROUP(Lane) (((Lane) == DSI_CLOCK_LANE) || ((Lane) == DSI_DATA_LANES)) -#define IS_DSI_CUSTOM_LANE(CustomLane) (((CustomLane) == DSI_SWAP_LANE_PINS)\ - || ((CustomLane) == DSI_INVERT_HS_SIGNAL)) -#define IS_DSI_LANE(Lane) (((Lane) == DSI_CLOCK_LANE) || \ - ((Lane) == DSI_DATA_LANE0) || ((Lane) == DSI_DATA_LANE1)) -#define IS_DSI_PHY_TIMING(Timing) (((Timing) == DSI_TCLK_POST ) || \ - ((Timing) == DSI_TLPX_CLK ) || \ - ((Timing) == DSI_THS_EXIT ) || \ - ((Timing) == DSI_TLPX_DATA ) || \ - ((Timing) == DSI_THS_ZERO ) || \ - ((Timing) == DSI_THS_TRAIL ) || \ - ((Timing) == DSI_THS_PREPARE ) || \ - ((Timing) == DSI_TCLK_ZERO ) || \ - ((Timing) == DSI_TCLK_PREPARE)) - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#endif /* DSI */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_DSI_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h deleted file mode 100644 index b18a228..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h +++ /dev/null @@ -1,366 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_exti.h - * @author MCD Application Team - * @brief Header file of EXTI HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2018 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS.Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32f4xx_HAL_EXTI_H -#define STM32f4xx_HAL_EXTI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup EXTI EXTI - * @brief EXTI HAL module driver - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup EXTI_Exported_Types EXTI Exported Types - * @{ - */ -typedef enum -{ - HAL_EXTI_COMMON_CB_ID = 0x00U -} EXTI_CallbackIDTypeDef; - -/** - * @brief EXTI Handle structure definition - */ -typedef struct -{ - uint32_t Line; /*!< Exti line number */ - void (* PendingCallback)(void); /*!< Exti pending callback */ -} EXTI_HandleTypeDef; - -/** - * @brief EXTI Configuration structure definition - */ -typedef struct -{ - uint32_t Line; /*!< The Exti line to be configured. This parameter - can be a value of @ref EXTI_Line */ - uint32_t Mode; /*!< The Exit Mode to be configured for a core. - This parameter can be a combination of @ref EXTI_Mode */ - uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter - can be a value of @ref EXTI_Trigger */ - uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. - This parameter is only possible for line 0 to 15. It - can be a value of @ref EXTI_GPIOSel */ -} EXTI_ConfigTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup EXTI_Exported_Constants EXTI Exported Constants - * @{ - */ - -/** @defgroup EXTI_Line EXTI Line - * @{ - */ -#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ -#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ -#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ -#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ -#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ -#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ -#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ -#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ -#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ -#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ -#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ -#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ -#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ -#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ -#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ -#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ -#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ -#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ -#if defined(EXTI_IMR_IM18) -#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ -#else -#define EXTI_LINE_18 (EXTI_RESERVED | 0x12u) /*!< No interrupt supported in this line */ -#endif /* EXTI_IMR_IM18 */ -#if defined(EXTI_IMR_IM19) -#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ -#else -#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ -#endif /* EXTI_IMR_IM19 */ -#if defined(EXTI_IMR_IM20) -#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ -#else -#define EXTI_LINE_20 (EXTI_RESERVED | 0x14u) /*!< No interrupt supported in this line */ -#endif /* EXTI_IMR_IM20 */ -#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ -#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM1 asynchronous event */ -#endif /* EXTI_IMR_IM23 */ - -/** - * @} - */ - -/** @defgroup EXTI_Mode EXTI Mode - * @{ - */ -#define EXTI_MODE_NONE 0x00000000u -#define EXTI_MODE_INTERRUPT 0x00000001u -#define EXTI_MODE_EVENT 0x00000002u -/** - * @} - */ - -/** @defgroup EXTI_Trigger EXTI Trigger - * @{ - */ - -#define EXTI_TRIGGER_NONE 0x00000000u -#define EXTI_TRIGGER_RISING 0x00000001u -#define EXTI_TRIGGER_FALLING 0x00000002u -#define EXTI_TRIGGER_RISING_FALLING (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) -/** - * @} - */ - -/** @defgroup EXTI_GPIOSel EXTI GPIOSel - * @brief - * @{ - */ -#define EXTI_GPIOA 0x00000000u -#define EXTI_GPIOB 0x00000001u -#define EXTI_GPIOC 0x00000002u -#if defined (GPIOD) -#define EXTI_GPIOD 0x00000003u -#endif /* GPIOD */ -#if defined (GPIOE) -#define EXTI_GPIOE 0x00000004u -#endif /* GPIOE */ -#if defined (GPIOF) -#define EXTI_GPIOF 0x00000005u -#endif /* GPIOF */ -#if defined (GPIOG) -#define EXTI_GPIOG 0x00000006u -#endif /* GPIOG */ -#if defined (GPIOH) -#define EXTI_GPIOH 0x00000007u -#endif /* GPIOH */ -#if defined (GPIOI) -#define EXTI_GPIOI 0x00000008u -#endif /* GPIOI */ -#if defined (GPIOJ) -#define EXTI_GPIOJ 0x00000009u -#endif /* GPIOJ */ -#if defined (GPIOK) -#define EXTI_GPIOK 0x0000000Au -#endif /* GPIOK */ - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup EXTI_Exported_Macros EXTI Exported Macros - * @{ - */ - -/** - * @} - */ - -/* Private constants --------------------------------------------------------*/ -/** @defgroup EXTI_Private_Constants EXTI Private Constants - * @{ - */ -/** - * @brief EXTI Line property definition - */ -#define EXTI_PROPERTY_SHIFT 24u -#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) -#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) -#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) -#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) - -/** - * @brief EXTI bit usage - */ -#define EXTI_PIN_MASK 0x0000001Fu - -/** - * @brief EXTI Mask for interrupt & event mode - */ -#define EXTI_MODE_MASK (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT) - -/** - * @brief EXTI Mask for trigger possibilities - */ -#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) - -/** - * @brief EXTI Line number - */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_NB 24UL -#else -#define EXTI_LINE_NB 23UL -#endif /* EXTI_IMR_IM23 */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup EXTI_Private_Macros EXTI Private Macros - * @{ - */ -#define IS_EXTI_LINE(__EXTI_LINE__) ((((__EXTI_LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ - ((((__EXTI_LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ - (((__EXTI_LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ - (((__EXTI_LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) - -#define IS_EXTI_MODE(__EXTI_LINE__) ((((__EXTI_LINE__) & EXTI_MODE_MASK) != 0x00u) && \ - (((__EXTI_LINE__) & ~EXTI_MODE_MASK) == 0x00u)) - -#define IS_EXTI_TRIGGER(__EXTI_LINE__) (((__EXTI_LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) - -#define IS_EXTI_PENDING_EDGE(__EXTI_LINE__) ((__EXTI_LINE__) == EXTI_TRIGGER_RISING_FALLING) - -#define IS_EXTI_CONFIG_LINE(__EXTI_LINE__) (((__EXTI_LINE__) & EXTI_CONFIG) != 0x00u) - -#if !defined (GPIOD) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOE) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOF) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOI) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOF) || \ - ((__PORT__) == EXTI_GPIOG) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOJ) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOF) || \ - ((__PORT__) == EXTI_GPIOG) || \ - ((__PORT__) == EXTI_GPIOH) || \ - ((__PORT__) == EXTI_GPIOI)) -#else -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOF) || \ - ((__PORT__) == EXTI_GPIOG) || \ - ((__PORT__) == EXTI_GPIOH) || \ - ((__PORT__) == EXTI_GPIOI) || \ - ((__PORT__) == EXTI_GPIOJ) || \ - ((__PORT__) == EXTI_GPIOK)) -#endif /* GPIOD */ - -#define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup EXTI_Exported_Functions EXTI Exported Functions - * @brief EXTI Exported Functions - * @{ - */ - -/** @defgroup EXTI_Exported_Functions_Group1 Configuration functions - * @brief Configuration functions - * @{ - */ -/* Configuration functions ****************************************************/ -HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); -HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); -HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti); -HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)); -HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine); -/** - * @} - */ - -/** @defgroup EXTI_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * @{ - */ -/* IO operation functions *****************************************************/ -void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti); -uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); -void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); -void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32f4xx_HAL_EXTI_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h deleted file mode 100644 index 41f77d2..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h +++ /dev/null @@ -1,425 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash.h - * @author MCD Application Team - * @brief Header file of FLASH HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_FLASH_H -#define __STM32F4xx_HAL_FLASH_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FLASH - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Types FLASH Exported Types - * @{ - */ - -/** - * @brief FLASH Procedure structure definition - */ -typedef enum -{ - FLASH_PROC_NONE = 0U, - FLASH_PROC_SECTERASE, - FLASH_PROC_MASSERASE, - FLASH_PROC_PROGRAM -} FLASH_ProcedureTypeDef; - -/** - * @brief FLASH handle Structure definition - */ -typedef struct -{ - __IO FLASH_ProcedureTypeDef ProcedureOnGoing; /*Internal variable to indicate which procedure is ongoing or not in IT context*/ - - __IO uint32_t NbSectorsToErase; /*Internal variable to save the remaining sectors to erase in IT context*/ - - __IO uint8_t VoltageForErase; /*Internal variable to provide voltage range selected by user in IT context*/ - - __IO uint32_t Sector; /*Internal variable to define the current sector which is erasing*/ - - __IO uint32_t Bank; /*Internal variable to save current bank selected during mass erase*/ - - __IO uint32_t Address; /*Internal variable to save address selected for program*/ - - HAL_LockTypeDef Lock; /* FLASH locking object */ - - __IO uint32_t ErrorCode; /* FLASH error code */ - -} FLASH_ProcessTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Constants FLASH Exported Constants - * @{ - */ -/** @defgroup FLASH_Error_Code FLASH Error Code - * @brief FLASH Error Code - * @{ - */ -#define HAL_FLASH_ERROR_NONE 0x00000000U /*!< No error */ -#define HAL_FLASH_ERROR_RD 0x00000001U /*!< Read Protection error */ -#define HAL_FLASH_ERROR_PGS 0x00000002U /*!< Programming Sequence error */ -#define HAL_FLASH_ERROR_PGP 0x00000004U /*!< Programming Parallelism error */ -#define HAL_FLASH_ERROR_PGA 0x00000008U /*!< Programming Alignment error */ -#define HAL_FLASH_ERROR_WRP 0x00000010U /*!< Write protection error */ -#define HAL_FLASH_ERROR_OPERATION 0x00000020U /*!< Operation Error */ -/** - * @} - */ - -/** @defgroup FLASH_Type_Program FLASH Type Program - * @{ - */ -#define FLASH_TYPEPROGRAM_BYTE 0x00000000U /*!< Program byte (8-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_HALFWORD 0x00000001U /*!< Program a half-word (16-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_WORD 0x00000002U /*!< Program a word (32-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_DOUBLEWORD 0x00000003U /*!< Program a double word (64-bit) at a specified address */ -/** - * @} - */ - -/** @defgroup FLASH_Flag_definition FLASH Flag definition - * @brief Flag definition - * @{ - */ -#define FLASH_FLAG_EOP FLASH_SR_EOP /*!< FLASH End of Operation flag */ -#define FLASH_FLAG_OPERR FLASH_SR_SOP /*!< FLASH operation Error flag */ -#define FLASH_FLAG_WRPERR FLASH_SR_WRPERR /*!< FLASH Write protected error flag */ -#define FLASH_FLAG_PGAERR FLASH_SR_PGAERR /*!< FLASH Programming Alignment error flag */ -#define FLASH_FLAG_PGPERR FLASH_SR_PGPERR /*!< FLASH Programming Parallelism error flag */ -#define FLASH_FLAG_PGSERR FLASH_SR_PGSERR /*!< FLASH Programming Sequence error flag */ -#if defined(FLASH_SR_RDERR) -#define FLASH_FLAG_RDERR FLASH_SR_RDERR /*!< Read Protection error flag (PCROP) */ -#endif /* FLASH_SR_RDERR */ -#define FLASH_FLAG_BSY FLASH_SR_BSY /*!< FLASH Busy flag */ -/** - * @} - */ - -/** @defgroup FLASH_Interrupt_definition FLASH Interrupt definition - * @brief FLASH Interrupt definition - * @{ - */ -#define FLASH_IT_EOP FLASH_CR_EOPIE /*!< End of FLASH Operation Interrupt source */ -#define FLASH_IT_ERR 0x02000000U /*!< Error Interrupt source */ -/** - * @} - */ - -/** @defgroup FLASH_Program_Parallelism FLASH Program Parallelism - * @{ - */ -#define FLASH_PSIZE_BYTE 0x00000000U -#define FLASH_PSIZE_HALF_WORD 0x00000100U -#define FLASH_PSIZE_WORD 0x00000200U -#define FLASH_PSIZE_DOUBLE_WORD 0x00000300U -#define CR_PSIZE_MASK 0xFFFFFCFFU -/** - * @} - */ - -/** @defgroup FLASH_Keys FLASH Keys - * @{ - */ -#define RDP_KEY ((uint16_t)0x00A5) -#define FLASH_KEY1 0x45670123U -#define FLASH_KEY2 0xCDEF89ABU -#define FLASH_OPT_KEY1 0x08192A3BU -#define FLASH_OPT_KEY2 0x4C5D6E7FU -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Macros FLASH Exported Macros - * @{ - */ -/** - * @brief Set the FLASH Latency. - * @param __LATENCY__ FLASH Latency - * The value of this parameter depend on device used within the same series - * @retval none - */ -#define __HAL_FLASH_SET_LATENCY(__LATENCY__) (*(__IO uint8_t *)ACR_BYTE0_ADDRESS = (uint8_t)(__LATENCY__)) - -/** - * @brief Get the FLASH Latency. - * @retval FLASH Latency - * The value of this parameter depend on device used within the same series - */ -#define __HAL_FLASH_GET_LATENCY() (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)) - -/** - * @brief Enable the FLASH prefetch buffer. - * @retval none - */ -#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE() (FLASH->ACR |= FLASH_ACR_PRFTEN) - -/** - * @brief Disable the FLASH prefetch buffer. - * @retval none - */ -#define __HAL_FLASH_PREFETCH_BUFFER_DISABLE() (FLASH->ACR &= (~FLASH_ACR_PRFTEN)) - -/** - * @brief Enable the FLASH instruction cache. - * @retval none - */ -#define __HAL_FLASH_INSTRUCTION_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_ICEN) - -/** - * @brief Disable the FLASH instruction cache. - * @retval none - */ -#define __HAL_FLASH_INSTRUCTION_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_ICEN)) - -/** - * @brief Enable the FLASH data cache. - * @retval none - */ -#define __HAL_FLASH_DATA_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_DCEN) - -/** - * @brief Disable the FLASH data cache. - * @retval none - */ -#define __HAL_FLASH_DATA_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_DCEN)) - -/** - * @brief Resets the FLASH instruction Cache. - * @note This function must be used only when the Instruction Cache is disabled. - * @retval None - */ -#define __HAL_FLASH_INSTRUCTION_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_ICRST; \ - FLASH->ACR &= ~FLASH_ACR_ICRST; \ - }while(0U) - -/** - * @brief Resets the FLASH data Cache. - * @note This function must be used only when the data Cache is disabled. - * @retval None - */ -#define __HAL_FLASH_DATA_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_DCRST; \ - FLASH->ACR &= ~FLASH_ACR_DCRST; \ - }while(0U) -/** - * @brief Enable the specified FLASH interrupt. - * @param __INTERRUPT__ FLASH interrupt - * This parameter can be any combination of the following values: - * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt - * @arg FLASH_IT_ERR: Error Interrupt - * @retval none - */ -#define __HAL_FLASH_ENABLE_IT(__INTERRUPT__) (FLASH->CR |= (__INTERRUPT__)) - -/** - * @brief Disable the specified FLASH interrupt. - * @param __INTERRUPT__ FLASH interrupt - * This parameter can be any combination of the following values: - * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt - * @arg FLASH_IT_ERR: Error Interrupt - * @retval none - */ -#define __HAL_FLASH_DISABLE_IT(__INTERRUPT__) (FLASH->CR &= ~(uint32_t)(__INTERRUPT__)) - -/** - * @brief Get the specified FLASH flag status. - * @param __FLAG__ specifies the FLASH flags to check. - * This parameter can be any combination of the following values: - * @arg FLASH_FLAG_EOP : FLASH End of Operation flag - * @arg FLASH_FLAG_OPERR : FLASH operation Error flag - * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag - * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag - * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag - * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag - * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) - * @arg FLASH_FLAG_BSY : FLASH Busy flag - * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices - * @retval The new state of __FLAG__ (SET or RESET). - */ -#define __HAL_FLASH_GET_FLAG(__FLAG__) ((FLASH->SR & (__FLAG__))) - -/** - * @brief Clear the specified FLASH flags. - * @param __FLAG__ specifies the FLASH flags to clear. - * This parameter can be any combination of the following values: - * @arg FLASH_FLAG_EOP : FLASH End of Operation flag - * @arg FLASH_FLAG_OPERR : FLASH operation Error flag - * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag - * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag - * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag - * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag - * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) - * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices - * @retval none - */ -#define __HAL_FLASH_CLEAR_FLAG(__FLAG__) (FLASH->SR = (__FLAG__)) -/** - * @} - */ - -/* Include FLASH HAL Extension module */ -#include "stm32f4xx_hal_flash_ex.h" -#include "stm32f4xx_hal_flash_ramfunc.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup FLASH_Exported_Functions - * @{ - */ -/** @addtogroup FLASH_Exported_Functions_Group1 - * @{ - */ -/* Program operation functions ***********************************************/ -HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data); -HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data); -/* FLASH IRQ handler method */ -void HAL_FLASH_IRQHandler(void); -/* Callbacks in non blocking modes */ -void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue); -void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue); -/** - * @} - */ - -/** @addtogroup FLASH_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions **********************************************/ -HAL_StatusTypeDef HAL_FLASH_Unlock(void); -HAL_StatusTypeDef HAL_FLASH_Lock(void); -HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void); -HAL_StatusTypeDef HAL_FLASH_OB_Lock(void); -/* Option bytes control */ -HAL_StatusTypeDef HAL_FLASH_OB_Launch(void); -/** - * @} - */ - -/** @addtogroup FLASH_Exported_Functions_Group3 - * @{ - */ -/* Peripheral State functions ************************************************/ -uint32_t HAL_FLASH_GetError(void); -HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup FLASH_Private_Variables FLASH Private Variables - * @{ - */ - -/** - * @} - */ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup FLASH_Private_Constants FLASH Private Constants - * @{ - */ - -/** - * @brief ACR register byte 0 (Bits[7:0]) base address - */ -#define ACR_BYTE0_ADDRESS 0x40023C00U -/** - * @brief OPTCR register byte 0 (Bits[7:0]) base address - */ -#define OPTCR_BYTE0_ADDRESS 0x40023C14U -/** - * @brief OPTCR register byte 1 (Bits[15:8]) base address - */ -#define OPTCR_BYTE1_ADDRESS 0x40023C15U -/** - * @brief OPTCR register byte 2 (Bits[23:16]) base address - */ -#define OPTCR_BYTE2_ADDRESS 0x40023C16U -/** - * @brief OPTCR register byte 3 (Bits[31:24]) base address - */ -#define OPTCR_BYTE3_ADDRESS 0x40023C17U - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup FLASH_Private_Macros FLASH Private Macros - * @{ - */ - -/** @defgroup FLASH_IS_FLASH_Definitions FLASH Private macros to check input parameters - * @{ - */ -#define IS_FLASH_TYPEPROGRAM(VALUE)(((VALUE) == FLASH_TYPEPROGRAM_BYTE) || \ - ((VALUE) == FLASH_TYPEPROGRAM_HALFWORD) || \ - ((VALUE) == FLASH_TYPEPROGRAM_WORD) || \ - ((VALUE) == FLASH_TYPEPROGRAM_DOUBLEWORD)) -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup FLASH_Private_Functions FLASH Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_FLASH_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h deleted file mode 100644 index 5fa89db..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h +++ /dev/null @@ -1,1063 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ex.h - * @author MCD Application Team - * @brief Header file of FLASH HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_FLASH_EX_H -#define __STM32F4xx_HAL_FLASH_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FLASHEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup FLASHEx_Exported_Types FLASH Exported Types - * @{ - */ - -/** - * @brief FLASH Erase structure definition - */ -typedef struct -{ - uint32_t TypeErase; /*!< Mass erase or sector Erase. - This parameter can be a value of @ref FLASHEx_Type_Erase */ - - uint32_t Banks; /*!< Select banks to erase when Mass erase is enabled. - This parameter must be a value of @ref FLASHEx_Banks */ - - uint32_t Sector; /*!< Initial FLASH sector to erase when Mass erase is disabled - This parameter must be a value of @ref FLASHEx_Sectors */ - - uint32_t NbSectors; /*!< Number of sectors to be erased. - This parameter must be a value between 1 and (max number of sectors - value of Initial sector)*/ - - uint32_t VoltageRange;/*!< The device voltage range which defines the erase parallelism - This parameter must be a value of @ref FLASHEx_Voltage_Range */ - -} FLASH_EraseInitTypeDef; - -/** - * @brief FLASH Option Bytes Program structure definition - */ -typedef struct -{ - uint32_t OptionType; /*!< Option byte to be configured. - This parameter can be a value of @ref FLASHEx_Option_Type */ - - uint32_t WRPState; /*!< Write protection activation or deactivation. - This parameter can be a value of @ref FLASHEx_WRP_State */ - - uint32_t WRPSector; /*!< Specifies the sector(s) to be write protected. - The value of this parameter depend on device used within the same series */ - - uint32_t Banks; /*!< Select banks for WRP activation/deactivation of all sectors. - This parameter must be a value of @ref FLASHEx_Banks */ - - uint32_t RDPLevel; /*!< Set the read protection level. - This parameter can be a value of @ref FLASHEx_Option_Bytes_Read_Protection */ - - uint32_t BORLevel; /*!< Set the BOR Level. - This parameter can be a value of @ref FLASHEx_BOR_Reset_Level */ - - uint8_t USERConfig; /*!< Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. */ - -} FLASH_OBProgramInitTypeDef; - -/** - * @brief FLASH Advanced Option Bytes Program structure definition - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -typedef struct -{ - uint32_t OptionType; /*!< Option byte to be configured for extension. - This parameter can be a value of @ref FLASHEx_Advanced_Option_Type */ - - uint32_t PCROPState; /*!< PCROP activation or deactivation. - This parameter can be a value of @ref FLASHEx_PCROP_State */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - uint16_t Sectors; /*!< specifies the sector(s) set for PCROP. - This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx ||\ - STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - uint32_t Banks; /*!< Select banks for PCROP activation/deactivation of all sectors. - This parameter must be a value of @ref FLASHEx_Banks */ - - uint16_t SectorsBank1; /*!< Specifies the sector(s) set for PCROP for Bank1. - This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ - - uint16_t SectorsBank2; /*!< Specifies the sector(s) set for PCROP for Bank2. - This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ - - uint8_t BootConfig; /*!< Specifies Option bytes for boot config. - This parameter can be a value of @ref FLASHEx_Dual_Boot */ - -#endif /*STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -} FLASH_AdvOBProgramInitTypeDef; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || - STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup FLASHEx_Exported_Constants FLASH Exported Constants - * @{ - */ - -/** @defgroup FLASHEx_Type_Erase FLASH Type Erase - * @{ - */ -#define FLASH_TYPEERASE_SECTORS 0x00000000U /*!< Sectors erase only */ -#define FLASH_TYPEERASE_MASSERASE 0x00000001U /*!< Flash Mass erase activation */ -/** - * @} - */ - -/** @defgroup FLASHEx_Voltage_Range FLASH Voltage Range - * @{ - */ -#define FLASH_VOLTAGE_RANGE_1 0x00000000U /*!< Device operating range: 1.8V to 2.1V */ -#define FLASH_VOLTAGE_RANGE_2 0x00000001U /*!< Device operating range: 2.1V to 2.7V */ -#define FLASH_VOLTAGE_RANGE_3 0x00000002U /*!< Device operating range: 2.7V to 3.6V */ -#define FLASH_VOLTAGE_RANGE_4 0x00000003U /*!< Device operating range: 2.7V to 3.6V + External Vpp */ -/** - * @} - */ - -/** @defgroup FLASHEx_WRP_State FLASH WRP State - * @{ - */ -#define OB_WRPSTATE_DISABLE 0x00000000U /*!< Disable the write protection of the desired bank 1 sectors */ -#define OB_WRPSTATE_ENABLE 0x00000001U /*!< Enable the write protection of the desired bank 1 sectors */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Type FLASH Option Type - * @{ - */ -#define OPTIONBYTE_WRP 0x00000001U /*!< WRP option byte configuration */ -#define OPTIONBYTE_RDP 0x00000002U /*!< RDP option byte configuration */ -#define OPTIONBYTE_USER 0x00000004U /*!< USER option byte configuration */ -#define OPTIONBYTE_BOR 0x00000008U /*!< BOR option byte configuration */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Bytes_Read_Protection FLASH Option Bytes Read Protection - * @{ - */ -#define OB_RDP_LEVEL_0 ((uint8_t)0xAA) -#define OB_RDP_LEVEL_1 ((uint8_t)0x55) -#define OB_RDP_LEVEL_2 ((uint8_t)0xCC) /*!< Warning: When enabling read protection level 2 - it s no more possible to go back to level 1 or 0 */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Bytes_IWatchdog FLASH Option Bytes IWatchdog - * @{ - */ -#define OB_IWDG_SW ((uint8_t)0x20) /*!< Software IWDG selected */ -#define OB_IWDG_HW ((uint8_t)0x00) /*!< Hardware IWDG selected */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Bytes_nRST_STOP FLASH Option Bytes nRST_STOP - * @{ - */ -#define OB_STOP_NO_RST ((uint8_t)0x40) /*!< No reset generated when entering in STOP */ -#define OB_STOP_RST ((uint8_t)0x00) /*!< Reset generated when entering in STOP */ -/** - * @} - */ - - -/** @defgroup FLASHEx_Option_Bytes_nRST_STDBY FLASH Option Bytes nRST_STDBY - * @{ - */ -#define OB_STDBY_NO_RST ((uint8_t)0x80) /*!< No reset generated when entering in STANDBY */ -#define OB_STDBY_RST ((uint8_t)0x00) /*!< Reset generated when entering in STANDBY */ -/** - * @} - */ - -/** @defgroup FLASHEx_BOR_Reset_Level FLASH BOR Reset Level - * @{ - */ -#define OB_BOR_LEVEL3 ((uint8_t)0x00) /*!< Supply voltage ranges from 2.70 to 3.60 V */ -#define OB_BOR_LEVEL2 ((uint8_t)0x04) /*!< Supply voltage ranges from 2.40 to 2.70 V */ -#define OB_BOR_LEVEL1 ((uint8_t)0x08) /*!< Supply voltage ranges from 2.10 to 2.40 V */ -#define OB_BOR_OFF ((uint8_t)0x0C) /*!< Supply voltage ranges from 1.62 to 2.10 V */ -/** - * @} - */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup FLASHEx_PCROP_State FLASH PCROP State - * @{ - */ -#define OB_PCROP_STATE_DISABLE 0x00000000U /*!< Disable PCROP */ -#define OB_PCROP_STATE_ENABLE 0x00000001U /*!< Enable PCROP */ -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ - STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/** @defgroup FLASHEx_Advanced_Option_Type FLASH Advanced Option Type - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define OPTIONBYTE_PCROP 0x00000001U /*!< PCROP option byte configuration */ -#define OPTIONBYTE_BOOTCONFIG 0x00000002U /*!< BOOTConfig option byte configuration */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -#define OPTIONBYTE_PCROP 0x00000001U /*!= FLASH_BASE) && ((ADDRESS) <= FLASH_END)) || \ - (((ADDRESS) >= FLASH_OTP_BASE) && ((ADDRESS) <= FLASH_OTP_END))) - -#define IS_FLASH_NBSECTORS(NBSECTORS) (((NBSECTORS) != 0) && ((NBSECTORS) <= FLASH_SECTOR_TOTAL)) - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFF000000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F401xC) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xC */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F401xC) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xC */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_BOOT(BOOT) (((BOOT) == OB_DUAL_BOOT_ENABLE) || ((BOOT) == OB_DUAL_BOOT_DISABLE)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_PCROP_SELECT(PCROP) (((PCROP) == OB_PCROP_SELECTED) || ((PCROP) == OB_PCROP_DESELECTED)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ - STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup FLASHEx_Private_Functions FLASH Private Functions - * @{ - */ -void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange); -void FLASH_FlushCaches(void); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_FLASH_EX_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h deleted file mode 100644 index 2112e74..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ramfunc.h - * @author MCD Application Team - * @brief Header file of FLASH RAMFUNC driver. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_FLASH_RAMFUNC_H -#define __STM32F4xx_FLASH_RAMFUNC_H - -#ifdef __cplusplus -extern "C" { -#endif -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FLASH_RAMFUNC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup FLASH_RAMFUNC_Exported_Functions - * @{ - */ - -/** @addtogroup FLASH_RAMFUNC_Exported_Functions_Group1 - * @{ - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void); -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void); -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void); -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_FLASH_RAMFUNC_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h deleted file mode 100644 index 5f3d749..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h +++ /dev/null @@ -1,325 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_gpio.h - * @author MCD Application Team - * @brief Header file of GPIO HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_GPIO_H -#define __STM32F4xx_HAL_GPIO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup GPIO - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Types GPIO Exported Types - * @{ - */ - -/** - * @brief 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_pins_define */ - - uint32_t Mode; /*!< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref GPIO_mode_define */ - - uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins. - This parameter can be a value of @ref GPIO_pull_define */ - - uint32_t Speed; /*!< Specifies the speed for the selected pins. - This parameter can be a value of @ref GPIO_speed_define */ - - uint32_t Alternate; /*!< Peripheral to be connected to the selected pins. - This parameter can be a value of @ref GPIO_Alternate_function_selection */ -}GPIO_InitTypeDef; - -/** - * @brief GPIO Bit SET and Bit RESET enumeration - */ -typedef enum -{ - GPIO_PIN_RESET = 0, - GPIO_PIN_SET -}GPIO_PinState; -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup GPIO_Exported_Constants GPIO Exported Constants - * @{ - */ - -/** @defgroup GPIO_pins_define GPIO pins define - * @{ - */ -#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */ -#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */ -#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */ -#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */ -#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */ -#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */ -#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */ -#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */ -#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */ -#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */ -#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */ -#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */ -#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */ -#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */ -#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */ -#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */ -#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */ - -#define GPIO_PIN_MASK 0x0000FFFFU /* PIN mask for assert test */ -/** - * @} - */ - -/** @defgroup GPIO_mode_define GPIO mode define - * @brief GPIO Configuration Mode - * Elements values convention: 0x00WX00YZ - * - W : EXTI trigger detection on 3 bits - * - X : EXTI mode (IT or Event) on 2 bits - * - Y : Output type (Push Pull or Open Drain) on 1 bit - * - Z : GPIO mode (Input, Output, Alternate or Analog) on 2 bits - * @{ - */ -#define GPIO_MODE_INPUT MODE_INPUT /*!< Input Floating Mode */ -#define GPIO_MODE_OUTPUT_PP (MODE_OUTPUT | OUTPUT_PP) /*!< Output Push Pull Mode */ -#define GPIO_MODE_OUTPUT_OD (MODE_OUTPUT | OUTPUT_OD) /*!< Output Open Drain Mode */ -#define GPIO_MODE_AF_PP (MODE_AF | OUTPUT_PP) /*!< Alternate Function Push Pull Mode */ -#define GPIO_MODE_AF_OD (MODE_AF | OUTPUT_OD) /*!< Alternate Function Open Drain Mode */ - -#define GPIO_MODE_ANALOG MODE_ANALOG /*!< Analog Mode */ - -#define GPIO_MODE_IT_RISING (MODE_INPUT | EXTI_IT | TRIGGER_RISING) /*!< External Interrupt Mode with Rising edge trigger detection */ -#define GPIO_MODE_IT_FALLING (MODE_INPUT | EXTI_IT | TRIGGER_FALLING) /*!< External Interrupt Mode with Falling edge trigger detection */ -#define GPIO_MODE_IT_RISING_FALLING (MODE_INPUT | EXTI_IT | TRIGGER_RISING | TRIGGER_FALLING) /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ - -#define GPIO_MODE_EVT_RISING (MODE_INPUT | EXTI_EVT | TRIGGER_RISING) /*!< External Event Mode with Rising edge trigger detection */ -#define GPIO_MODE_EVT_FALLING (MODE_INPUT | EXTI_EVT | TRIGGER_FALLING) /*!< External Event Mode with Falling edge trigger detection */ -#define GPIO_MODE_EVT_RISING_FALLING (MODE_INPUT | EXTI_EVT | TRIGGER_RISING | TRIGGER_FALLING) /*!< External Event Mode with Rising/Falling edge trigger detection */ - -/** - * @} - */ - -/** @defgroup GPIO_speed_define GPIO speed define - * @brief GPIO Output Maximum frequency - * @{ - */ -#define GPIO_SPEED_FREQ_LOW 0x00000000U /*!< IO works at 2 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_MEDIUM 0x00000001U /*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_HIGH 0x00000002U /*!< range 25 MHz to 100 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_VERY_HIGH 0x00000003U /*!< range 50 MHz to 200 MHz, please refer to the product datasheet */ -/** - * @} - */ - - /** @defgroup GPIO_pull_define GPIO pull define - * @brief GPIO Pull-Up or Pull-Down Activation - * @{ - */ -#define GPIO_NOPULL 0x00000000U /*!< No Pull-up or Pull-down activation */ -#define GPIO_PULLUP 0x00000001U /*!< Pull-up activation */ -#define GPIO_PULLDOWN 0x00000002U /*!< Pull-down activation */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Macros GPIO Exported Macros - * @{ - */ - -/** - * @brief Checks whether the specified EXTI line flag is set or not. - * @param __EXTI_LINE__ specifies the EXTI line flag to check. - * This parameter can be GPIO_PIN_x where x can be(0..15) - * @retval The new state of __EXTI_LINE__ (SET or RESET). - */ -#define __HAL_GPIO_EXTI_GET_FLAG(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) - -/** - * @brief Clears the EXTI's line pending flags. - * @param __EXTI_LINE__ specifies the EXTI lines flags to clear. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) - * @retval None - */ -#define __HAL_GPIO_EXTI_CLEAR_FLAG(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) - -/** - * @brief Checks whether the specified EXTI line is asserted or not. - * @param __EXTI_LINE__ specifies the EXTI line to check. - * This parameter can be GPIO_PIN_x where x can be(0..15) - * @retval The new state of __EXTI_LINE__ (SET or RESET). - */ -#define __HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) - -/** - * @brief Clears the EXTI's line pending bits. - * @param __EXTI_LINE__ specifies the EXTI lines to clear. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) - * @retval None - */ -#define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) - -/** - * @brief Generates a Software interrupt on selected EXTI line. - * @param __EXTI_LINE__ specifies the EXTI line to check. - * This parameter can be GPIO_PIN_x where x can be(0..15) - * @retval None - */ -#define __HAL_GPIO_EXTI_GENERATE_SWIT(__EXTI_LINE__) (EXTI->SWIER |= (__EXTI_LINE__)) -/** - * @} - */ - -/* Include GPIO HAL Extension module */ -#include "stm32f4xx_hal_gpio_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup GPIO_Exported_Functions - * @{ - */ - -/** @addtogroup GPIO_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init); -void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); -/** - * @} - */ - -/** @addtogroup GPIO_Exported_Functions_Group2 - * @{ - */ -/* IO operation functions *****************************************************/ -GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); -void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin); -void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup GPIO_Private_Constants GPIO Private Constants - * @{ - */ -#define GPIO_MODE_Pos 0U -#define GPIO_MODE (0x3UL << GPIO_MODE_Pos) -#define MODE_INPUT (0x0UL << GPIO_MODE_Pos) -#define MODE_OUTPUT (0x1UL << GPIO_MODE_Pos) -#define MODE_AF (0x2UL << GPIO_MODE_Pos) -#define MODE_ANALOG (0x3UL << GPIO_MODE_Pos) -#define OUTPUT_TYPE_Pos 4U -#define OUTPUT_TYPE (0x1UL << OUTPUT_TYPE_Pos) -#define OUTPUT_PP (0x0UL << OUTPUT_TYPE_Pos) -#define OUTPUT_OD (0x1UL << OUTPUT_TYPE_Pos) -#define EXTI_MODE_Pos 16U -#define EXTI_MODE (0x3UL << EXTI_MODE_Pos) -#define EXTI_IT (0x1UL << EXTI_MODE_Pos) -#define EXTI_EVT (0x2UL << EXTI_MODE_Pos) -#define TRIGGER_MODE_Pos 20U -#define TRIGGER_MODE (0x7UL << TRIGGER_MODE_Pos) -#define TRIGGER_RISING (0x1UL << TRIGGER_MODE_Pos) -#define TRIGGER_FALLING (0x2UL << TRIGGER_MODE_Pos) - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup GPIO_Private_Macros GPIO Private Macros - * @{ - */ -#define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) -#define IS_GPIO_PIN(PIN) (((((uint32_t)PIN) & GPIO_PIN_MASK ) != 0x00U) && ((((uint32_t)PIN) & ~GPIO_PIN_MASK) == 0x00U)) -#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ - ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ - ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ - ((MODE) == GPIO_MODE_AF_PP) ||\ - ((MODE) == GPIO_MODE_AF_OD) ||\ - ((MODE) == GPIO_MODE_IT_RISING) ||\ - ((MODE) == GPIO_MODE_IT_FALLING) ||\ - ((MODE) == GPIO_MODE_IT_RISING_FALLING) ||\ - ((MODE) == GPIO_MODE_EVT_RISING) ||\ - ((MODE) == GPIO_MODE_EVT_FALLING) ||\ - ((MODE) == GPIO_MODE_EVT_RISING_FALLING) ||\ - ((MODE) == GPIO_MODE_ANALOG)) -#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_SPEED_FREQ_LOW) || ((SPEED) == GPIO_SPEED_FREQ_MEDIUM) || \ - ((SPEED) == GPIO_SPEED_FREQ_HIGH) || ((SPEED) == GPIO_SPEED_FREQ_VERY_HIGH)) -#define IS_GPIO_PULL(PULL) (((PULL) == GPIO_NOPULL) || ((PULL) == GPIO_PULLUP) || \ - ((PULL) == GPIO_PULLDOWN)) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup GPIO_Private_Functions GPIO Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_GPIO_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h deleted file mode 100644 index 5e0b7cc..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h +++ /dev/null @@ -1,1590 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_gpio_ex.h - * @author MCD Application Team - * @brief Header file of GPIO HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_GPIO_EX_H -#define __STM32F4xx_HAL_GPIO_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup GPIOEx GPIOEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Constants GPIO Exported Constants - * @{ - */ - -/** @defgroup GPIO_Alternate_function_selection GPIO Alternate Function Selection - * @{ - */ - -/*------------------------------------------ STM32F429xx/STM32F439xx ---------*/ -#if defined(STM32F429xx) || defined(STM32F439xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 14 selection - */ -#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F429xx || STM32F439xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ -/** @brief GPIO_Legacy - */ -#define GPIO_AF5_I2S3ext GPIO_AF5_SPI3 /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F427xx || STM32F437xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ -#if defined(STM32F407xx) || defined(STM32F417xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F407xx || STM32F417xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F405xx || STM32F415xx */ - -/*----------------------------------------------------------------------------*/ - -/*---------------------------------------- STM32F401xx------------------------*/ -#if defined(STM32F401xC) || defined(STM32F401xE) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ - - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F401xC || STM32F401xE */ -/*----------------------------------------------------------------------------*/ - -/*--------------- STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-------------*/ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ -#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ -#define GPIO_AF10_FMC ((uint8_t)0x0A) /* FMC Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -/*----------------------------------------------------------------------------*/ - -/*--------------- STM32F413xx/STM32F423xx-------------------------------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ -#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ -#define GPIO_AF3_DFSDM2 ((uint8_t)0x03) /* DFSDM2 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF6_DFSDM2 ((uint8_t)0x06) /* DFSDM2 Alternate Function mapping */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_SAI1 ((uint8_t)0x07) /* SAI1 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ -#define GPIO_AF7_DFSDM2 ((uint8_t)0x07) /* DFSDM2 Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ -#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_SAI1 ((uint8_t)0x0A) /* SAI1 Alternate Function mapping */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF10_DFSDM2 ((uint8_t)0x0A) /* DFSDM2 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ -#define GPIO_AF10_FSMC ((uint8_t)0x0A) /* FSMC Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_UART4 ((uint8_t)0x0B) /* UART4 Alternate Function mapping */ -#define GPIO_AF11_UART5 ((uint8_t)0x0B) /* UART5 Alternate Function mapping */ -#define GPIO_AF11_UART9 ((uint8_t)0x0B) /* UART9 Alternate Function mapping */ -#define GPIO_AF11_UART10 ((uint8_t)0x0B) /* UART10 Alternate Function mapping */ -#define GPIO_AF11_CAN3 ((uint8_t)0x0B) /* CAN3 Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ - -/** - * @brief AF 14 selection - */ -#define GPIO_AF14_RNG ((uint8_t)0x0E) /* RNG Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F413xx || STM32F423xx */ - -/*---------------------------------------- STM32F411xx------------------------*/ -#if defined(STM32F411xE) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F411xE */ - -/*---------------------------------------- STM32F410xx------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#if defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#endif /* STM32F410Cx || STM32F410Rx */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI1 ((uint8_t)0x06) /* SPI1 Alternate Function mapping */ -#if defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#endif /* STM32F410Cx || STM32F410Rx */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/*---------------------------------------- STM32F446xx -----------------------*/ -#if defined(STM32F446xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ -#define GPIO_AF3_CEC ((uint8_t)0x03) /* CEC Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF4_CEC ((uint8_t)0x04) /* CEC Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4 Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_UART5 ((uint8_t)0x07) /* UART5 Alternate Function mapping */ -#define GPIO_AF7_SPI2 ((uint8_t)0x07) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_SPDIFRX ((uint8_t)0x07) /* SPDIFRX Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_SPDIFRX ((uint8_t)0x08) /* SPDIFRX Alternate Function mapping */ -#define GPIO_AF8_SAI2 ((uint8_t)0x08) /* SAI2 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ -#define GPIO_AF10_SAI2 ((uint8_t)0x0A) /* SAI2 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ - -#endif /* STM32F446xx */ -/*----------------------------------------------------------------------------*/ - -/*-------------------------------- STM32F469xx/STM32F479xx--------------------*/ -#if defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ -#define GPIO_AF13_DSI ((uint8_t)0x0D) /* DSI Alternate Function mapping */ - -/** - * @brief AF 14 selection - */ -#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ - -#endif /* STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Macros GPIO Exported Macros - * @{ - */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Functions GPIO Exported Functions - * @{ - */ -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup GPIOEx_Private_Constants GPIO Private Constants - * @{ - */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup GPIOEx_Private_Macros GPIO Private Macros - * @{ - */ -/** @defgroup GPIOEx_Get_Port_Index GPIO Get Port Index - * @{ - */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U :\ - ((__GPIOx__) == (GPIOF))? 5U :\ - ((__GPIOx__) == (GPIOG))? 6U :\ - ((__GPIOx__) == (GPIOH))? 7U : 8U) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U :\ - ((__GPIOx__) == (GPIOF))? 5U :\ - ((__GPIOx__) == (GPIOG))? 6U :\ - ((__GPIOx__) == (GPIOH))? 7U :\ - ((__GPIOx__) == (GPIOI))? 8U :\ - ((__GPIOx__) == (GPIOJ))? 9U : 10U) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U : 7U) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U : 7U) -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ - -#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U :\ - ((__GPIOx__) == (GPIOF))? 5U :\ - ((__GPIOx__) == (GPIOG))? 6U : 7U) -#endif /* STM32F446xx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U : 7U) -#endif /* STM32F412Vx */ -#if defined(STM32F412Rx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U : 7U) -#endif /* STM32F412Rx */ -#if defined(STM32F412Cx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U : 7U) -#endif /* STM32F412Cx */ - -/** - * @} - */ - -/** @defgroup GPIOEx_IS_Alternat_function_selection GPIO Check Alternate Function - * @{ - */ -/*------------------------- STM32F429xx/STM32F439xx---------------------------*/ -#if defined(STM32F429xx) || defined(STM32F439xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ - ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ - ((AF) == GPIO_AF14_LTDC)) - -#endif /* STM32F429xx || STM32F439xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ - ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1)) - -#endif /* STM32F427xx || STM32F437xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ -#if defined(STM32F407xx) || defined(STM32F417xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F407xx || STM32F417xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF12_OTG_HS_FS) || ((AF) == GPIO_AF12_SDIO) || \ - ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F405xx || STM32F415xx */ - -/*----------------------------------------------------------------------------*/ - -/*---------------------------------------- STM32F401xx------------------------*/ -#if defined(STM32F401xC) || defined(STM32F401xE) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF12_SDIO) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM9) || \ - ((AF) == GPIO_AF3_TIM10) || ((AF) == GPIO_AF3_TIM11) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF7_USART1) || \ - ((AF) == GPIO_AF7_USART2) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF15_EVENTOUT)) -#endif /* STM32F401xC || STM32F401xE */ -/*----------------------------------------------------------------------------*/ -/*---------------------------------------- STM32F410xx------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_GPIO_AF(AF) (((AF) < 10U) || ((AF) == 15U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/*---------------------------------------- STM32F411xx------------------------*/ -#if defined(STM32F411xE) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF4_I2C1) || \ - ((AF) == GPIO_AF4_I2C2) || ((AF) == GPIO_AF4_I2C3) || \ - ((AF) == GPIO_AF5_SPI1) || ((AF) == GPIO_AF5_SPI2) || \ - ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI4) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF6_SPI5) || ((AF) == GPIO_AF7_SPI3) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF8_USART6) || ((AF) == GPIO_AF10_OTG_FS) || \ - ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F411xE */ -/*----------------------------------------------------------------------------*/ - -/*----------------------------------------------- STM32F446xx ----------------*/ -#if defined(STM32F446xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ - ((AF) == GPIO_AF3_CEC) || ((AF) == GPIO_AF4_CEC) || \ - ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI2) || \ - ((AF) == GPIO_AF6_SPI4) || ((AF) == GPIO_AF7_UART5) || \ - ((AF) == GPIO_AF7_SPI2) || ((AF) == GPIO_AF7_SPI3) || \ - ((AF) == GPIO_AF7_SPDIFRX) || ((AF) == GPIO_AF8_SPDIFRX) || \ - ((AF) == GPIO_AF8_SAI2) || ((AF) == GPIO_AF9_QSPI) || \ - ((AF) == GPIO_AF10_SAI2) || ((AF) == GPIO_AF10_QSPI)) - -#endif /* STM32F446xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------------------------- STM32F469xx/STM32F479xx --------*/ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ - ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ - ((AF) == GPIO_AF14_LTDC) || ((AF) == GPIO_AF13_DSI) || \ - ((AF) == GPIO_AF9_QSPI) || ((AF) == GPIO_AF10_QSPI)) - -#endif /* STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-----------*/ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 11U) && ((AF) != 14U) && ((AF) != 13U)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -/*----------------------------------------------------------------------------*/ - -/*------------------STM32F413xx/STM32F423xx-----------------------------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 13U)) -#endif /* STM32F413xx || STM32F423xx */ -/*----------------------------------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup GPIOEx_Private_Functions GPIO Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_GPIO_EX_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h deleted file mode 100644 index b37126e..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h +++ /dev/null @@ -1,741 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_i2c.h - * @author MCD Application Team - * @brief Header file of I2C HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_I2C_H -#define __STM32F4xx_HAL_I2C_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup I2C - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup I2C_Exported_Types I2C Exported Types - * @{ - */ - -/** @defgroup I2C_Configuration_Structure_definition I2C Configuration Structure definition - * @brief I2C Configuration Structure definition - * @{ - */ -typedef struct -{ - uint32_t ClockSpeed; /*!< Specifies the clock frequency. - This parameter must be set to a value lower than 400kHz */ - - uint32_t DutyCycle; /*!< Specifies the I2C fast mode duty cycle. - This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */ - - uint32_t OwnAddress1; /*!< Specifies the first device own address. - This parameter can be a 7-bit or 10-bit address. */ - - uint32_t AddressingMode; /*!< Specifies if 7-bit or 10-bit addressing mode is selected. - This parameter can be a value of @ref I2C_addressing_mode */ - - uint32_t DualAddressMode; /*!< Specifies if dual addressing mode is selected. - This parameter can be a value of @ref I2C_dual_addressing_mode */ - - uint32_t OwnAddress2; /*!< Specifies the second device own address if dual addressing mode is selected - This parameter can be a 7-bit address. */ - - uint32_t GeneralCallMode; /*!< Specifies if general call mode is selected. - This parameter can be a value of @ref I2C_general_call_addressing_mode */ - - uint32_t NoStretchMode; /*!< Specifies if nostretch mode is selected. - This parameter can be a value of @ref I2C_nostretch_mode */ - -} I2C_InitTypeDef; - -/** - * @} - */ - -/** @defgroup HAL_state_structure_definition HAL state structure definition - * @brief HAL State structure definition - * @note HAL I2C State value coding follow below described bitmap : - * b7-b6 Error information - * 00 : No Error - * 01 : Abort (Abort user request on going) - * 10 : Timeout - * 11 : Error - * b5 Peripheral initialization status - * 0 : Reset (Peripheral not initialized) - * 1 : Init done (Peripheral initialized and ready to use. HAL I2C Init function called) - * b4 (not used) - * x : Should be set to 0 - * b3 - * 0 : Ready or Busy (No Listen mode ongoing) - * 1 : Listen (Peripheral in Address Listen Mode) - * b2 Intrinsic process state - * 0 : Ready - * 1 : Busy (Peripheral busy with some configuration or internal operations) - * b1 Rx state - * 0 : Ready (no Rx operation ongoing) - * 1 : Busy (Rx operation ongoing) - * b0 Tx state - * 0 : Ready (no Tx operation ongoing) - * 1 : Busy (Tx operation ongoing) - * @{ - */ -typedef enum -{ - HAL_I2C_STATE_RESET = 0x00U, /*!< Peripheral is not yet Initialized */ - HAL_I2C_STATE_READY = 0x20U, /*!< Peripheral Initialized and ready for use */ - HAL_I2C_STATE_BUSY = 0x24U, /*!< An internal process is ongoing */ - HAL_I2C_STATE_BUSY_TX = 0x21U, /*!< Data Transmission process is ongoing */ - HAL_I2C_STATE_BUSY_RX = 0x22U, /*!< Data Reception process is ongoing */ - HAL_I2C_STATE_LISTEN = 0x28U, /*!< Address Listen Mode is ongoing */ - HAL_I2C_STATE_BUSY_TX_LISTEN = 0x29U, /*!< Address Listen Mode and Data Transmission - process is ongoing */ - HAL_I2C_STATE_BUSY_RX_LISTEN = 0x2AU, /*!< Address Listen Mode and Data Reception - process is ongoing */ - HAL_I2C_STATE_ABORT = 0x60U, /*!< Abort user request ongoing */ - HAL_I2C_STATE_TIMEOUT = 0xA0U, /*!< Timeout state */ - HAL_I2C_STATE_ERROR = 0xE0U /*!< Error */ - -} HAL_I2C_StateTypeDef; - -/** - * @} - */ - -/** @defgroup HAL_mode_structure_definition HAL mode structure definition - * @brief HAL Mode structure definition - * @note HAL I2C Mode value coding follow below described bitmap :\n - * b7 (not used)\n - * x : Should be set to 0\n - * b6\n - * 0 : None\n - * 1 : Memory (HAL I2C communication is in Memory Mode)\n - * b5\n - * 0 : None\n - * 1 : Slave (HAL I2C communication is in Slave Mode)\n - * b4\n - * 0 : None\n - * 1 : Master (HAL I2C communication is in Master Mode)\n - * b3-b2-b1-b0 (not used)\n - * xxxx : Should be set to 0000 - * @{ - */ -typedef enum -{ - HAL_I2C_MODE_NONE = 0x00U, /*!< No I2C communication on going */ - HAL_I2C_MODE_MASTER = 0x10U, /*!< I2C communication is in Master Mode */ - HAL_I2C_MODE_SLAVE = 0x20U, /*!< I2C communication is in Slave Mode */ - HAL_I2C_MODE_MEM = 0x40U /*!< I2C communication is in Memory Mode */ - -} HAL_I2C_ModeTypeDef; - -/** - * @} - */ - -/** @defgroup I2C_Error_Code_definition I2C Error Code definition - * @brief I2C Error Code definition - * @{ - */ -#define HAL_I2C_ERROR_NONE 0x00000000U /*!< No error */ -#define HAL_I2C_ERROR_BERR 0x00000001U /*!< BERR error */ -#define HAL_I2C_ERROR_ARLO 0x00000002U /*!< ARLO error */ -#define HAL_I2C_ERROR_AF 0x00000004U /*!< AF error */ -#define HAL_I2C_ERROR_OVR 0x00000008U /*!< OVR error */ -#define HAL_I2C_ERROR_DMA 0x00000010U /*!< DMA transfer error */ -#define HAL_I2C_ERROR_TIMEOUT 0x00000020U /*!< Timeout Error */ -#define HAL_I2C_ERROR_SIZE 0x00000040U /*!< Size Management error */ -#define HAL_I2C_ERROR_DMA_PARAM 0x00000080U /*!< DMA Parameter Error */ -#define HAL_I2C_WRONG_START 0x00000200U /*!< Wrong start Error */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -#define HAL_I2C_ERROR_INVALID_CALLBACK 0x00000100U /*!< Invalid Callback error */ -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @defgroup I2C_handle_Structure_definition I2C handle Structure definition - * @brief I2C handle Structure definition - * @{ - */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -typedef struct __I2C_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ -{ - I2C_TypeDef *Instance; /*!< I2C registers base address */ - - I2C_InitTypeDef Init; /*!< I2C communication parameters */ - - uint8_t *pBuffPtr; /*!< Pointer to I2C transfer buffer */ - - uint16_t XferSize; /*!< I2C transfer size */ - - __IO uint16_t XferCount; /*!< I2C transfer counter */ - - __IO uint32_t XferOptions; /*!< I2C transfer options */ - - __IO uint32_t PreviousState; /*!< I2C communication Previous state and mode - context for internal usage */ - - DMA_HandleTypeDef *hdmatx; /*!< I2C Tx DMA handle parameters */ - - DMA_HandleTypeDef *hdmarx; /*!< I2C Rx DMA handle parameters */ - - HAL_LockTypeDef Lock; /*!< I2C locking object */ - - __IO HAL_I2C_StateTypeDef State; /*!< I2C communication state */ - - __IO HAL_I2C_ModeTypeDef Mode; /*!< I2C communication mode */ - - __IO uint32_t ErrorCode; /*!< I2C Error code */ - - __IO uint32_t Devaddress; /*!< I2C Target device address */ - - __IO uint32_t Memaddress; /*!< I2C Target memory address */ - - __IO uint32_t MemaddSize; /*!< I2C Target memory address size */ - - __IO uint32_t EventCount; /*!< I2C Event counter */ - - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - void (* MasterTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Master Tx Transfer completed callback */ - void (* MasterRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Master Rx Transfer completed callback */ - void (* SlaveTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Slave Tx Transfer completed callback */ - void (* SlaveRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Slave Rx Transfer completed callback */ - void (* ListenCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Listen Complete callback */ - void (* MemTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Memory Tx Transfer completed callback */ - void (* MemRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Memory Rx Transfer completed callback */ - void (* ErrorCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Error callback */ - void (* AbortCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Abort callback */ - - void (* AddrCallback)(struct __I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*!< I2C Slave Address Match callback */ - - void (* MspInitCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Msp Init callback */ - void (* MspDeInitCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Msp DeInit callback */ - -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ -} I2C_HandleTypeDef; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -/** - * @brief HAL I2C Callback ID enumeration definition - */ -typedef enum -{ - HAL_I2C_MASTER_TX_COMPLETE_CB_ID = 0x00U, /*!< I2C Master Tx Transfer completed callback ID */ - HAL_I2C_MASTER_RX_COMPLETE_CB_ID = 0x01U, /*!< I2C Master Rx Transfer completed callback ID */ - HAL_I2C_SLAVE_TX_COMPLETE_CB_ID = 0x02U, /*!< I2C Slave Tx Transfer completed callback ID */ - HAL_I2C_SLAVE_RX_COMPLETE_CB_ID = 0x03U, /*!< I2C Slave Rx Transfer completed callback ID */ - HAL_I2C_LISTEN_COMPLETE_CB_ID = 0x04U, /*!< I2C Listen Complete callback ID */ - HAL_I2C_MEM_TX_COMPLETE_CB_ID = 0x05U, /*!< I2C Memory Tx Transfer callback ID */ - HAL_I2C_MEM_RX_COMPLETE_CB_ID = 0x06U, /*!< I2C Memory Rx Transfer completed callback ID */ - HAL_I2C_ERROR_CB_ID = 0x07U, /*!< I2C Error callback ID */ - HAL_I2C_ABORT_CB_ID = 0x08U, /*!< I2C Abort callback ID */ - - HAL_I2C_MSPINIT_CB_ID = 0x09U, /*!< I2C Msp Init callback ID */ - HAL_I2C_MSPDEINIT_CB_ID = 0x0AU /*!< I2C Msp DeInit callback ID */ - -} HAL_I2C_CallbackIDTypeDef; - -/** - * @brief HAL I2C Callback pointer definition - */ -typedef void (*pI2C_CallbackTypeDef)(I2C_HandleTypeDef *hi2c); /*!< pointer to an I2C callback function */ -typedef void (*pI2C_AddrCallbackTypeDef)(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*!< pointer to an I2C Address Match callback function */ - -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** - * @} - */ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup I2C_Exported_Constants I2C Exported Constants - * @{ - */ - -/** @defgroup I2C_duty_cycle_in_fast_mode I2C duty cycle in fast mode - * @{ - */ -#define I2C_DUTYCYCLE_2 0x00000000U -#define I2C_DUTYCYCLE_16_9 I2C_CCR_DUTY -/** - * @} - */ - -/** @defgroup I2C_addressing_mode I2C addressing mode - * @{ - */ -#define I2C_ADDRESSINGMODE_7BIT 0x00004000U -#define I2C_ADDRESSINGMODE_10BIT (I2C_OAR1_ADDMODE | 0x00004000U) -/** - * @} - */ - -/** @defgroup I2C_dual_addressing_mode I2C dual addressing mode - * @{ - */ -#define I2C_DUALADDRESS_DISABLE 0x00000000U -#define I2C_DUALADDRESS_ENABLE I2C_OAR2_ENDUAL -/** - * @} - */ - -/** @defgroup I2C_general_call_addressing_mode I2C general call addressing mode - * @{ - */ -#define I2C_GENERALCALL_DISABLE 0x00000000U -#define I2C_GENERALCALL_ENABLE I2C_CR1_ENGC -/** - * @} - */ - -/** @defgroup I2C_nostretch_mode I2C nostretch mode - * @{ - */ -#define I2C_NOSTRETCH_DISABLE 0x00000000U -#define I2C_NOSTRETCH_ENABLE I2C_CR1_NOSTRETCH -/** - * @} - */ - -/** @defgroup I2C_Memory_Address_Size I2C Memory Address Size - * @{ - */ -#define I2C_MEMADD_SIZE_8BIT 0x00000001U -#define I2C_MEMADD_SIZE_16BIT 0x00000010U -/** - * @} - */ - -/** @defgroup I2C_XferDirection_definition I2C XferDirection definition - * @{ - */ -#define I2C_DIRECTION_RECEIVE 0x00000000U -#define I2C_DIRECTION_TRANSMIT 0x00000001U -/** - * @} - */ - -/** @defgroup I2C_XferOptions_definition I2C XferOptions definition - * @{ - */ -#define I2C_FIRST_FRAME 0x00000001U -#define I2C_FIRST_AND_NEXT_FRAME 0x00000002U -#define I2C_NEXT_FRAME 0x00000004U -#define I2C_FIRST_AND_LAST_FRAME 0x00000008U -#define I2C_LAST_FRAME_NO_STOP 0x00000010U -#define I2C_LAST_FRAME 0x00000020U - -/* List of XferOptions in usage of : - * 1- Restart condition in all use cases (direction change or not) - */ -#define I2C_OTHER_FRAME (0x00AA0000U) -#define I2C_OTHER_AND_LAST_FRAME (0xAA000000U) -/** - * @} - */ - -/** @defgroup I2C_Interrupt_configuration_definition I2C Interrupt configuration definition - * @brief I2C Interrupt definition - * Elements values convention: 0xXXXXXXXX - * - XXXXXXXX : Interrupt control mask - * @{ - */ -#define I2C_IT_BUF I2C_CR2_ITBUFEN -#define I2C_IT_EVT I2C_CR2_ITEVTEN -#define I2C_IT_ERR I2C_CR2_ITERREN -/** - * @} - */ - -/** @defgroup I2C_Flag_definition I2C Flag definition - * @{ - */ - -#define I2C_FLAG_OVR 0x00010800U -#define I2C_FLAG_AF 0x00010400U -#define I2C_FLAG_ARLO 0x00010200U -#define I2C_FLAG_BERR 0x00010100U -#define I2C_FLAG_TXE 0x00010080U -#define I2C_FLAG_RXNE 0x00010040U -#define I2C_FLAG_STOPF 0x00010010U -#define I2C_FLAG_ADD10 0x00010008U -#define I2C_FLAG_BTF 0x00010004U -#define I2C_FLAG_ADDR 0x00010002U -#define I2C_FLAG_SB 0x00010001U -#define I2C_FLAG_DUALF 0x00100080U -#define I2C_FLAG_GENCALL 0x00100010U -#define I2C_FLAG_TRA 0x00100004U -#define I2C_FLAG_BUSY 0x00100002U -#define I2C_FLAG_MSL 0x00100001U -/** - * @} - */ - -/** - * @} - */ - -/* Exported macros -----------------------------------------------------------*/ - -/** @defgroup I2C_Exported_Macros I2C Exported Macros - * @{ - */ - -/** @brief Reset I2C handle state. - * @param __HANDLE__ specifies the I2C Handle. - * @retval None - */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -#define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) do{ \ - (__HANDLE__)->State = HAL_I2C_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_I2C_STATE_RESET) -#endif - -/** @brief Enable or disable the specified I2C interrupts. - * @param __HANDLE__ specifies the I2C Handle. - * @param __INTERRUPT__ specifies the interrupt source to enable or disable. - * This parameter can be one of the following values: - * @arg I2C_IT_BUF: Buffer interrupt enable - * @arg I2C_IT_EVT: Event interrupt enable - * @arg I2C_IT_ERR: Error interrupt enable - * @retval None - */ -#define __HAL_I2C_ENABLE_IT(__HANDLE__, __INTERRUPT__) SET_BIT((__HANDLE__)->Instance->CR2,(__INTERRUPT__)) -#define __HAL_I2C_DISABLE_IT(__HANDLE__, __INTERRUPT__) CLEAR_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__)) - -/** @brief Checks if the specified I2C interrupt source is enabled or disabled. - * @param __HANDLE__ specifies the I2C Handle. - * @param __INTERRUPT__ specifies the I2C interrupt source to check. - * This parameter can be one of the following values: - * @arg I2C_IT_BUF: Buffer interrupt enable - * @arg I2C_IT_EVT: Event interrupt enable - * @arg I2C_IT_ERR: Error interrupt enable - * @retval The new state of __INTERRUPT__ (TRUE or FALSE). - */ -#define __HAL_I2C_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR2 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) - -/** @brief Checks whether the specified I2C flag is set or not. - * @param __HANDLE__ specifies the I2C Handle. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg I2C_FLAG_OVR: Overrun/Underrun flag - * @arg I2C_FLAG_AF: Acknowledge failure flag - * @arg I2C_FLAG_ARLO: Arbitration lost flag - * @arg I2C_FLAG_BERR: Bus error flag - * @arg I2C_FLAG_TXE: Data register empty flag - * @arg I2C_FLAG_RXNE: Data register not empty flag - * @arg I2C_FLAG_STOPF: Stop detection flag - * @arg I2C_FLAG_ADD10: 10-bit header sent flag - * @arg I2C_FLAG_BTF: Byte transfer finished flag - * @arg I2C_FLAG_ADDR: Address sent flag - * Address matched flag - * @arg I2C_FLAG_SB: Start bit flag - * @arg I2C_FLAG_DUALF: Dual flag - * @arg I2C_FLAG_GENCALL: General call header flag - * @arg I2C_FLAG_TRA: Transmitter/Receiver flag - * @arg I2C_FLAG_BUSY: Bus busy flag - * @arg I2C_FLAG_MSL: Master/Slave flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) ((((uint8_t)((__FLAG__) >> 16U)) == 0x01U) ? \ - (((((__HANDLE__)->Instance->SR1) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET) : \ - (((((__HANDLE__)->Instance->SR2) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET)) - -/** @brief Clears the I2C pending flags which are cleared by writing 0 in a specific bit. - * @param __HANDLE__ specifies the I2C Handle. - * @param __FLAG__ specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) - * @arg I2C_FLAG_AF: Acknowledge failure flag - * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) - * @arg I2C_FLAG_BERR: Bus error flag - * @retval None - */ -#define __HAL_I2C_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR1 = ~((__FLAG__) & I2C_FLAG_MASK)) - -/** @brief Clears the I2C ADDR pending flag. - * @param __HANDLE__ specifies the I2C Handle. - * This parameter can be I2C where x: 1, 2, or 3 to select the I2C peripheral. - * @retval None - */ -#define __HAL_I2C_CLEAR_ADDRFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg = 0x00U; \ - tmpreg = (__HANDLE__)->Instance->SR1; \ - tmpreg = (__HANDLE__)->Instance->SR2; \ - UNUSED(tmpreg); \ - } while(0) - -/** @brief Clears the I2C STOPF pending flag. - * @param __HANDLE__ specifies the I2C Handle. - * @retval None - */ -#define __HAL_I2C_CLEAR_STOPFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg = 0x00U; \ - tmpreg = (__HANDLE__)->Instance->SR1; \ - SET_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE); \ - UNUSED(tmpreg); \ - } while(0) - -/** @brief Enable the specified I2C peripheral. - * @param __HANDLE__ specifies the I2C Handle. - * @retval None - */ -#define __HAL_I2C_ENABLE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE) - -/** @brief Disable the specified I2C peripheral. - * @param __HANDLE__ specifies the I2C Handle. - * @retval None - */ -#define __HAL_I2C_DISABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE) - -/** - * @} - */ - -/* Include I2C HAL Extension module */ -#include "stm32f4xx_hal_i2c_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup I2C_Exported_Functions - * @{ - */ - -/** @addtogroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ -/* Initialization and de-initialization functions******************************/ -HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c); -HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c); - -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID); - -HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @addtogroup I2C_Exported_Functions_Group2 Input and Output operation functions - * @{ - */ -/* IO operation functions ****************************************************/ -/******* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout); - -/******* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); - -HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c); -HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c); -HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress); - -/******* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); - -HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); -/** - * @} - */ - -/** @addtogroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @{ - */ -/******* I2C IRQHandler and Callbacks used in non blocking modes (Interrupt and DMA) */ -void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c); -void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); -void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c); -/** - * @} - */ - -/** @addtogroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions - * @{ - */ -/* Peripheral State, Mode and Error functions *********************************/ -HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c); -HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c); -uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c); - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup I2C_Private_Constants I2C Private Constants - * @{ - */ -#define I2C_FLAG_MASK 0x0000FFFFU -#define I2C_MIN_PCLK_FREQ_STANDARD 2000000U /*!< 2 MHz */ -#define I2C_MIN_PCLK_FREQ_FAST 4000000U /*!< 4 MHz */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup I2C_Private_Macros I2C Private Macros - * @{ - */ - -#define I2C_MIN_PCLK_FREQ(__PCLK__, __SPEED__) (((__SPEED__) <= 100000U) ? ((__PCLK__) < I2C_MIN_PCLK_FREQ_STANDARD) : ((__PCLK__) < I2C_MIN_PCLK_FREQ_FAST)) -#define I2C_CCR_CALCULATION(__PCLK__, __SPEED__, __COEFF__) (((((__PCLK__) - 1U)/((__SPEED__) * (__COEFF__))) + 1U) & I2C_CCR_CCR) -#define I2C_FREQRANGE(__PCLK__) ((__PCLK__)/1000000U) -#define I2C_RISE_TIME(__FREQRANGE__, __SPEED__) (((__SPEED__) <= 100000U) ? ((__FREQRANGE__) + 1U) : ((((__FREQRANGE__) * 300U) / 1000U) + 1U)) -#define I2C_SPEED_STANDARD(__PCLK__, __SPEED__) ((I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 2U) < 4U)? 4U:I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 2U)) -#define I2C_SPEED_FAST(__PCLK__, __SPEED__, __DUTYCYCLE__) (((__DUTYCYCLE__) == I2C_DUTYCYCLE_2)? I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 3U) : (I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 25U) | I2C_DUTYCYCLE_16_9)) -#define I2C_SPEED(__PCLK__, __SPEED__, __DUTYCYCLE__) (((__SPEED__) <= 100000U)? (I2C_SPEED_STANDARD((__PCLK__), (__SPEED__))) : \ - ((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__)) & I2C_CCR_CCR) == 0U)? 1U : \ - ((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__))) | I2C_CCR_FS)) - -#define I2C_7BIT_ADD_WRITE(__ADDRESS__) ((uint8_t)((__ADDRESS__) & (uint8_t)(~I2C_OAR1_ADD0))) -#define I2C_7BIT_ADD_READ(__ADDRESS__) ((uint8_t)((__ADDRESS__) | I2C_OAR1_ADD0)) - -#define I2C_10BIT_ADDRESS(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF))) -#define I2C_10BIT_HEADER_WRITE(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)0x00F0))) -#define I2C_10BIT_HEADER_READ(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)(0x00F1)))) - -#define I2C_MEM_ADD_MSB(__ADDRESS__) ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0xFF00)) >> 8))) -#define I2C_MEM_ADD_LSB(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF))) - -/** @defgroup I2C_IS_RTC_Definitions I2C Private macros to check input parameters - * @{ - */ -#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DUTYCYCLE_2) || \ - ((CYCLE) == I2C_DUTYCYCLE_16_9)) -#define IS_I2C_ADDRESSING_MODE(ADDRESS) (((ADDRESS) == I2C_ADDRESSINGMODE_7BIT) || \ - ((ADDRESS) == I2C_ADDRESSINGMODE_10BIT)) -#define IS_I2C_DUAL_ADDRESS(ADDRESS) (((ADDRESS) == I2C_DUALADDRESS_DISABLE) || \ - ((ADDRESS) == I2C_DUALADDRESS_ENABLE)) -#define IS_I2C_GENERAL_CALL(CALL) (((CALL) == I2C_GENERALCALL_DISABLE) || \ - ((CALL) == I2C_GENERALCALL_ENABLE)) -#define IS_I2C_NO_STRETCH(STRETCH) (((STRETCH) == I2C_NOSTRETCH_DISABLE) || \ - ((STRETCH) == I2C_NOSTRETCH_ENABLE)) -#define IS_I2C_MEMADD_SIZE(SIZE) (((SIZE) == I2C_MEMADD_SIZE_8BIT) || \ - ((SIZE) == I2C_MEMADD_SIZE_16BIT)) -#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) > 0U) && ((SPEED) <= 400000U)) -#define IS_I2C_OWN_ADDRESS1(ADDRESS1) (((ADDRESS1) & 0xFFFFFC00U) == 0U) -#define IS_I2C_OWN_ADDRESS2(ADDRESS2) (((ADDRESS2) & 0xFFFFFF01U) == 0U) -#define IS_I2C_TRANSFER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_FIRST_FRAME) || \ - ((REQUEST) == I2C_FIRST_AND_NEXT_FRAME) || \ - ((REQUEST) == I2C_NEXT_FRAME) || \ - ((REQUEST) == I2C_FIRST_AND_LAST_FRAME) || \ - ((REQUEST) == I2C_LAST_FRAME) || \ - ((REQUEST) == I2C_LAST_FRAME_NO_STOP) || \ - IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST)) - -#define IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_OTHER_FRAME) || \ - ((REQUEST) == I2C_OTHER_AND_LAST_FRAME)) - -#define I2C_CHECK_FLAG(__ISR__, __FLAG__) ((((__ISR__) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET) -#define I2C_CHECK_IT_SOURCE(__CR1__, __IT__) ((((__CR1__) & (__IT__)) == (__IT__)) ? SET : RESET) -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup I2C_Private_Functions I2C Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_HAL_I2C_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h deleted file mode 100644 index e2ee7c8..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h +++ /dev/null @@ -1,115 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_i2c_ex.h - * @author MCD Application Team - * @brief Header file of I2C HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_I2C_EX_H -#define __STM32F4xx_HAL_I2C_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup I2CEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup I2CEx_Exported_Constants I2C Exported Constants - * @{ - */ - -/** @defgroup I2CEx_Analog_Filter I2C Analog Filter - * @{ - */ -#define I2C_ANALOGFILTER_ENABLE 0x00000000U -#define I2C_ANALOGFILTER_DISABLE I2C_FLTR_ANOFF -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup I2CEx_Exported_Functions - * @{ - */ - -/** @addtogroup I2CEx_Exported_Functions_Group1 - * @{ - */ -/* Peripheral Control functions ************************************************/ -HAL_StatusTypeDef HAL_I2CEx_ConfigAnalogFilter(I2C_HandleTypeDef *hi2c, uint32_t AnalogFilter); -HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter); -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup I2CEx_Private_Constants I2C Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup I2CEx_Private_Macros I2C Private Macros - * @{ - */ -#define IS_I2C_ANALOG_FILTER(FILTER) (((FILTER) == I2C_ANALOGFILTER_ENABLE) || \ - ((FILTER) == I2C_ANALOGFILTER_DISABLE)) -#define IS_I2C_DIGITAL_FILTER(FILTER) ((FILTER) <= 0x0000000FU) -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_I2C_EX_H */ - - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc.h deleted file mode 100644 index 7165690..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc.h +++ /dev/null @@ -1,720 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_ltdc.h - * @author MCD Application Team - * @brief Header file of LTDC HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_LTDC_H -#define STM32F4xx_HAL_LTDC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -#if defined (LTDC) - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup LTDC LTDC - * @brief LTDC HAL module driver - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup LTDC_Exported_Types LTDC Exported Types - * @{ - */ -#define MAX_LAYER 2U - -/** - * @brief LTDC color structure definition - */ -typedef struct -{ - uint8_t Blue; /*!< Configures the blue value. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. */ - - uint8_t Green; /*!< Configures the green value. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. */ - - uint8_t Red; /*!< Configures the red value. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. */ - - uint8_t Reserved; /*!< Reserved 0xFF */ -} LTDC_ColorTypeDef; - -/** - * @brief LTDC Init structure definition - */ -typedef struct -{ - uint32_t HSPolarity; /*!< configures the horizontal synchronization polarity. - This parameter can be one value of @ref LTDC_HS_POLARITY */ - - uint32_t VSPolarity; /*!< configures the vertical synchronization polarity. - This parameter can be one value of @ref LTDC_VS_POLARITY */ - - uint32_t DEPolarity; /*!< configures the data enable polarity. - This parameter can be one of value of @ref LTDC_DE_POLARITY */ - - uint32_t PCPolarity; /*!< configures the pixel clock polarity. - This parameter can be one of value of @ref LTDC_PC_POLARITY */ - - uint32_t HorizontalSync; /*!< configures the number of Horizontal synchronization width. - This parameter must be a number between - Min_Data = 0x000 and Max_Data = 0xFFF. */ - - uint32_t VerticalSync; /*!< configures the number of Vertical synchronization height. - This parameter must be a number between - Min_Data = 0x000 and Max_Data = 0x7FF. */ - - uint32_t AccumulatedHBP; /*!< configures the accumulated horizontal back porch width. - This parameter must be a number between - Min_Data = LTDC_HorizontalSync and Max_Data = 0xFFF. */ - - uint32_t AccumulatedVBP; /*!< configures the accumulated vertical back porch height. - This parameter must be a number between - Min_Data = LTDC_VerticalSync and Max_Data = 0x7FF. */ - - uint32_t AccumulatedActiveW; /*!< configures the accumulated active width. - This parameter must be a number between - Min_Data = LTDC_AccumulatedHBP and Max_Data = 0xFFF. */ - - uint32_t AccumulatedActiveH; /*!< configures the accumulated active height. - This parameter must be a number between - Min_Data = LTDC_AccumulatedVBP and Max_Data = 0x7FF. */ - - uint32_t TotalWidth; /*!< configures the total width. - This parameter must be a number between - Min_Data = LTDC_AccumulatedActiveW and Max_Data = 0xFFF. */ - - uint32_t TotalHeigh; /*!< configures the total height. - This parameter must be a number between - Min_Data = LTDC_AccumulatedActiveH and Max_Data = 0x7FF. */ - - LTDC_ColorTypeDef Backcolor; /*!< Configures the background color. */ -} LTDC_InitTypeDef; - -/** - * @brief LTDC Layer structure definition - */ -typedef struct -{ - uint32_t WindowX0; /*!< Configures the Window Horizontal Start Position. - This parameter must be a number between - Min_Data = 0x000 and Max_Data = 0xFFF. */ - - uint32_t WindowX1; /*!< Configures the Window Horizontal Stop Position. - This parameter must be a number between - Min_Data = 0x000 and Max_Data = 0xFFF. */ - - uint32_t WindowY0; /*!< Configures the Window vertical Start Position. - This parameter must be a number between - Min_Data = 0x000 and Max_Data = 0x7FF. */ - - uint32_t WindowY1; /*!< Configures the Window vertical Stop Position. - This parameter must be a number between - Min_Data = 0x0000 and Max_Data = 0x7FF. */ - - uint32_t PixelFormat; /*!< Specifies the pixel format. - This parameter can be one of value of @ref LTDC_Pixelformat */ - - uint32_t Alpha; /*!< Specifies the constant alpha used for blending. - This parameter must be a number between - Min_Data = 0x00 and Max_Data = 0xFF. */ - - uint32_t Alpha0; /*!< Configures the default alpha value. - This parameter must be a number between - Min_Data = 0x00 and Max_Data = 0xFF. */ - - uint32_t BlendingFactor1; /*!< Select the blending factor 1. - This parameter can be one of value of @ref LTDC_BlendingFactor1 */ - - uint32_t BlendingFactor2; /*!< Select the blending factor 2. - This parameter can be one of value of @ref LTDC_BlendingFactor2 */ - - uint32_t FBStartAdress; /*!< Configures the color frame buffer address */ - - uint32_t ImageWidth; /*!< Configures the color frame buffer line length. - This parameter must be a number between - Min_Data = 0x0000 and Max_Data = 0x1FFF. */ - - uint32_t ImageHeight; /*!< Specifies the number of line in frame buffer. - This parameter must be a number between - Min_Data = 0x000 and Max_Data = 0x7FF. */ - - LTDC_ColorTypeDef Backcolor; /*!< Configures the layer background color. */ -} LTDC_LayerCfgTypeDef; - -/** - * @brief HAL LTDC State structures definition - */ -typedef enum -{ - HAL_LTDC_STATE_RESET = 0x00U, /*!< LTDC not yet initialized or disabled */ - HAL_LTDC_STATE_READY = 0x01U, /*!< LTDC initialized and ready for use */ - HAL_LTDC_STATE_BUSY = 0x02U, /*!< LTDC internal process is ongoing */ - HAL_LTDC_STATE_TIMEOUT = 0x03U, /*!< LTDC Timeout state */ - HAL_LTDC_STATE_ERROR = 0x04U /*!< LTDC state error */ -} HAL_LTDC_StateTypeDef; - -/** - * @brief LTDC handle Structure definition - */ -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) -typedef struct __LTDC_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */ -{ - LTDC_TypeDef *Instance; /*!< LTDC Register base address */ - - LTDC_InitTypeDef Init; /*!< LTDC parameters */ - - LTDC_LayerCfgTypeDef LayerCfg[MAX_LAYER]; /*!< LTDC Layers parameters */ - - HAL_LockTypeDef Lock; /*!< LTDC Lock */ - - __IO HAL_LTDC_StateTypeDef State; /*!< LTDC state */ - - __IO uint32_t ErrorCode; /*!< LTDC Error code */ - -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) - void (* LineEventCallback)(struct __LTDC_HandleTypeDef *hltdc); /*!< LTDC Line Event Callback */ - void (* ReloadEventCallback)(struct __LTDC_HandleTypeDef *hltdc); /*!< LTDC Reload Event Callback */ - void (* ErrorCallback)(struct __LTDC_HandleTypeDef *hltdc); /*!< LTDC Error Callback */ - - void (* MspInitCallback)(struct __LTDC_HandleTypeDef *hltdc); /*!< LTDC Msp Init callback */ - void (* MspDeInitCallback)(struct __LTDC_HandleTypeDef *hltdc); /*!< LTDC Msp DeInit callback */ - -#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */ - - -} LTDC_HandleTypeDef; - -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) -/** - * @brief HAL LTDC Callback ID enumeration definition - */ -typedef enum -{ - HAL_LTDC_MSPINIT_CB_ID = 0x00U, /*!< LTDC MspInit callback ID */ - HAL_LTDC_MSPDEINIT_CB_ID = 0x01U, /*!< LTDC MspDeInit callback ID */ - - HAL_LTDC_LINE_EVENT_CB_ID = 0x02U, /*!< LTDC Line Event Callback ID */ - HAL_LTDC_RELOAD_EVENT_CB_ID = 0x03U, /*!< LTDC Reload Callback ID */ - HAL_LTDC_ERROR_CB_ID = 0x04U /*!< LTDC Error Callback ID */ - -} HAL_LTDC_CallbackIDTypeDef; - -/** - * @brief HAL LTDC Callback pointer definition - */ -typedef void (*pLTDC_CallbackTypeDef)(LTDC_HandleTypeDef *hltdc); /*!< pointer to an LTDC callback function */ - -#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup LTDC_Exported_Constants LTDC Exported Constants - * @{ - */ - -/** @defgroup LTDC_Error_Code LTDC Error Code - * @{ - */ -#define HAL_LTDC_ERROR_NONE 0x00000000U /*!< LTDC No error */ -#define HAL_LTDC_ERROR_TE 0x00000001U /*!< LTDC Transfer error */ -#define HAL_LTDC_ERROR_FU 0x00000002U /*!< LTDC FIFO Underrun */ -#define HAL_LTDC_ERROR_TIMEOUT 0x00000020U /*!< LTDC Timeout error */ -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) -#define HAL_LTDC_ERROR_INVALID_CALLBACK 0x00000040U /*!< LTDC Invalid Callback error */ -#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @defgroup LTDC_Layer LTDC Layer - * @{ - */ -#define LTDC_LAYER_1 0x00000000U /*!< LTDC Layer 1 */ -#define LTDC_LAYER_2 0x00000001U /*!< LTDC Layer 2 */ -/** - * @} - */ - -/** @defgroup LTDC_HS_POLARITY LTDC HS POLARITY - * @{ - */ -#define LTDC_HSPOLARITY_AL 0x00000000U /*!< Horizontal Synchronization is active low. */ -#define LTDC_HSPOLARITY_AH LTDC_GCR_HSPOL /*!< Horizontal Synchronization is active high. */ -/** - * @} - */ - -/** @defgroup LTDC_VS_POLARITY LTDC VS POLARITY - * @{ - */ -#define LTDC_VSPOLARITY_AL 0x00000000U /*!< Vertical Synchronization is active low. */ -#define LTDC_VSPOLARITY_AH LTDC_GCR_VSPOL /*!< Vertical Synchronization is active high. */ -/** - * @} - */ - -/** @defgroup LTDC_DE_POLARITY LTDC DE POLARITY - * @{ - */ -#define LTDC_DEPOLARITY_AL 0x00000000U /*!< Data Enable, is active low. */ -#define LTDC_DEPOLARITY_AH LTDC_GCR_DEPOL /*!< Data Enable, is active high. */ -/** - * @} - */ - -/** @defgroup LTDC_PC_POLARITY LTDC PC POLARITY - * @{ - */ -#define LTDC_PCPOLARITY_IPC 0x00000000U /*!< input pixel clock. */ -#define LTDC_PCPOLARITY_IIPC LTDC_GCR_PCPOL /*!< inverted input pixel clock. */ -/** - * @} - */ - -/** @defgroup LTDC_SYNC LTDC SYNC - * @{ - */ -#define LTDC_HORIZONTALSYNC (LTDC_SSCR_HSW >> 16U) /*!< Horizontal synchronization width. */ -#define LTDC_VERTICALSYNC LTDC_SSCR_VSH /*!< Vertical synchronization height. */ -/** - * @} - */ - -/** @defgroup LTDC_BACK_COLOR LTDC BACK COLOR - * @{ - */ -#define LTDC_COLOR 0x000000FFU /*!< Color mask */ -/** - * @} - */ - -/** @defgroup LTDC_BlendingFactor1 LTDC Blending Factor1 - * @{ - */ -#define LTDC_BLENDING_FACTOR1_CA 0x00000400U /*!< Blending factor : Cte Alpha */ -#define LTDC_BLENDING_FACTOR1_PAxCA 0x00000600U /*!< Blending factor : Cte Alpha x Pixel Alpha*/ -/** - * @} - */ - -/** @defgroup LTDC_BlendingFactor2 LTDC Blending Factor2 - * @{ - */ -#define LTDC_BLENDING_FACTOR2_CA 0x00000005U /*!< Blending factor : Cte Alpha */ -#define LTDC_BLENDING_FACTOR2_PAxCA 0x00000007U /*!< Blending factor : Cte Alpha x Pixel Alpha*/ -/** - * @} - */ - -/** @defgroup LTDC_Pixelformat LTDC Pixel format - * @{ - */ -#define LTDC_PIXEL_FORMAT_ARGB8888 0x00000000U /*!< ARGB8888 LTDC pixel format */ -#define LTDC_PIXEL_FORMAT_RGB888 0x00000001U /*!< RGB888 LTDC pixel format */ -#define LTDC_PIXEL_FORMAT_RGB565 0x00000002U /*!< RGB565 LTDC pixel format */ -#define LTDC_PIXEL_FORMAT_ARGB1555 0x00000003U /*!< ARGB1555 LTDC pixel format */ -#define LTDC_PIXEL_FORMAT_ARGB4444 0x00000004U /*!< ARGB4444 LTDC pixel format */ -#define LTDC_PIXEL_FORMAT_L8 0x00000005U /*!< L8 LTDC pixel format */ -#define LTDC_PIXEL_FORMAT_AL44 0x00000006U /*!< AL44 LTDC pixel format */ -#define LTDC_PIXEL_FORMAT_AL88 0x00000007U /*!< AL88 LTDC pixel format */ -/** - * @} - */ - -/** @defgroup LTDC_Alpha LTDC Alpha - * @{ - */ -#define LTDC_ALPHA LTDC_LxCACR_CONSTA /*!< LTDC Constant Alpha mask */ -/** - * @} - */ - -/** @defgroup LTDC_LAYER_Config LTDC LAYER Config - * @{ - */ -#define LTDC_STOPPOSITION (LTDC_LxWHPCR_WHSPPOS >> 16U) /*!< LTDC Layer stop position */ -#define LTDC_STARTPOSITION LTDC_LxWHPCR_WHSTPOS /*!< LTDC Layer start position */ - -#define LTDC_COLOR_FRAME_BUFFER LTDC_LxCFBLR_CFBLL /*!< LTDC Layer Line length */ -#define LTDC_LINE_NUMBER LTDC_LxCFBLNR_CFBLNBR /*!< LTDC Layer Line number */ -/** - * @} - */ - -/** @defgroup LTDC_Interrupts LTDC Interrupts - * @{ - */ -#define LTDC_IT_LI LTDC_IER_LIE /*!< LTDC Line Interrupt */ -#define LTDC_IT_FU LTDC_IER_FUIE /*!< LTDC FIFO Underrun Interrupt */ -#define LTDC_IT_TE LTDC_IER_TERRIE /*!< LTDC Transfer Error Interrupt */ -#define LTDC_IT_RR LTDC_IER_RRIE /*!< LTDC Register Reload Interrupt */ -/** - * @} - */ - -/** @defgroup LTDC_Flags LTDC Flags - * @{ - */ -#define LTDC_FLAG_LI LTDC_ISR_LIF /*!< LTDC Line Interrupt Flag */ -#define LTDC_FLAG_FU LTDC_ISR_FUIF /*!< LTDC FIFO Underrun interrupt Flag */ -#define LTDC_FLAG_TE LTDC_ISR_TERRIF /*!< LTDC Transfer Error interrupt Flag */ -#define LTDC_FLAG_RR LTDC_ISR_RRIF /*!< LTDC Register Reload interrupt Flag */ -/** - * @} - */ - -/** @defgroup LTDC_Reload_Type LTDC Reload Type - * @{ - */ -#define LTDC_RELOAD_IMMEDIATE LTDC_SRCR_IMR /*!< Immediate Reload */ -#define LTDC_RELOAD_VERTICAL_BLANKING LTDC_SRCR_VBR /*!< Vertical Blanking Reload */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup LTDC_Exported_Macros LTDC Exported Macros - * @{ - */ - -/** @brief Reset LTDC handle state. - * @param __HANDLE__ LTDC handle - * @retval None - */ -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) -#define __HAL_LTDC_RESET_HANDLE_STATE(__HANDLE__) do{ \ - (__HANDLE__)->State = HAL_LTDC_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_LTDC_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_LTDC_STATE_RESET) -#endif /*USE_HAL_LTDC_REGISTER_CALLBACKS */ - -/** - * @brief Enable the LTDC. - * @param __HANDLE__ LTDC handle - * @retval None. - */ -#define __HAL_LTDC_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->GCR |= LTDC_GCR_LTDCEN) - -/** - * @brief Disable the LTDC. - * @param __HANDLE__ LTDC handle - * @retval None. - */ -#define __HAL_LTDC_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->GCR &= ~(LTDC_GCR_LTDCEN)) - -/** - * @brief Enable the LTDC Layer. - * @param __HANDLE__ LTDC handle - * @param __LAYER__ Specify the layer to be enabled. - * This parameter can be LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). - * @retval None. - */ -#define __HAL_LTDC_LAYER_ENABLE(__HANDLE__, __LAYER__) ((LTDC_LAYER((__HANDLE__), (__LAYER__)))->CR\ - |= (uint32_t)LTDC_LxCR_LEN) - -/** - * @brief Disable the LTDC Layer. - * @param __HANDLE__ LTDC handle - * @param __LAYER__ Specify the layer to be disabled. - * This parameter can be LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). - * @retval None. - */ -#define __HAL_LTDC_LAYER_DISABLE(__HANDLE__, __LAYER__) ((LTDC_LAYER((__HANDLE__), (__LAYER__)))->CR\ - &= ~(uint32_t)LTDC_LxCR_LEN) - -/** - * @brief Reload immediately all LTDC Layers. - * @param __HANDLE__ LTDC handle - * @retval None. - */ -#define __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG(__HANDLE__) ((__HANDLE__)->Instance->SRCR |= LTDC_SRCR_IMR) - -/** - * @brief Reload during vertical blanking period all LTDC Layers. - * @param __HANDLE__ LTDC handle - * @retval None. - */ -#define __HAL_LTDC_VERTICAL_BLANKING_RELOAD_CONFIG(__HANDLE__) ((__HANDLE__)->Instance->SRCR |= LTDC_SRCR_VBR) - -/* Interrupt & Flag management */ -/** - * @brief Get the LTDC pending flags. - * @param __HANDLE__ LTDC handle - * @param __FLAG__ Get the specified flag. - * This parameter can be any combination of the following values: - * @arg LTDC_FLAG_LI: Line Interrupt flag - * @arg LTDC_FLAG_FU: FIFO Underrun Interrupt flag - * @arg LTDC_FLAG_TE: Transfer Error interrupt flag - * @arg LTDC_FLAG_RR: Register Reload Interrupt Flag - * @retval The state of FLAG (SET or RESET). - */ -#define __HAL_LTDC_GET_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ISR & (__FLAG__)) - -/** - * @brief Clears the LTDC pending flags. - * @param __HANDLE__ LTDC handle - * @param __FLAG__ Specify the flag to clear. - * This parameter can be any combination of the following values: - * @arg LTDC_FLAG_LI: Line Interrupt flag - * @arg LTDC_FLAG_FU: FIFO Underrun Interrupt flag - * @arg LTDC_FLAG_TE: Transfer Error interrupt flag - * @arg LTDC_FLAG_RR: Register Reload Interrupt Flag - * @retval None - */ -#define __HAL_LTDC_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ICR = (__FLAG__)) - -/** - * @brief Enables the specified LTDC interrupts. - * @param __HANDLE__ LTDC handle - * @param __INTERRUPT__ Specify the LTDC interrupt sources to be enabled. - * This parameter can be any combination of the following values: - * @arg LTDC_IT_LI: Line Interrupt flag - * @arg LTDC_IT_FU: FIFO Underrun Interrupt flag - * @arg LTDC_IT_TE: Transfer Error interrupt flag - * @arg LTDC_IT_RR: Register Reload Interrupt Flag - * @retval None - */ -#define __HAL_LTDC_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IER |= (__INTERRUPT__)) - -/** - * @brief Disables the specified LTDC interrupts. - * @param __HANDLE__ LTDC handle - * @param __INTERRUPT__ Specify the LTDC interrupt sources to be disabled. - * This parameter can be any combination of the following values: - * @arg LTDC_IT_LI: Line Interrupt flag - * @arg LTDC_IT_FU: FIFO Underrun Interrupt flag - * @arg LTDC_IT_TE: Transfer Error interrupt flag - * @arg LTDC_IT_RR: Register Reload Interrupt Flag - * @retval None - */ -#define __HAL_LTDC_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IER &= ~(__INTERRUPT__)) - -/** - * @brief Check whether the specified LTDC interrupt has occurred or not. - * @param __HANDLE__ LTDC handle - * @param __INTERRUPT__ Specify the LTDC interrupt source to check. - * This parameter can be one of the following values: - * @arg LTDC_IT_LI: Line Interrupt flag - * @arg LTDC_IT_FU: FIFO Underrun Interrupt flag - * @arg LTDC_IT_TE: Transfer Error interrupt flag - * @arg LTDC_IT_RR: Register Reload Interrupt Flag - * @retval The state of INTERRUPT (SET or RESET). - */ -#define __HAL_LTDC_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IER & (__INTERRUPT__)) -/** - * @} - */ - -/* Include LTDC HAL Extension module */ -#include "stm32f4xx_hal_ltdc_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup LTDC_Exported_Functions - * @{ - */ -/** @addtogroup LTDC_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -HAL_StatusTypeDef HAL_LTDC_Init(LTDC_HandleTypeDef *hltdc); -HAL_StatusTypeDef HAL_LTDC_DeInit(LTDC_HandleTypeDef *hltdc); -void HAL_LTDC_MspInit(LTDC_HandleTypeDef *hltdc); -void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc); -void HAL_LTDC_ErrorCallback(LTDC_HandleTypeDef *hltdc); -void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef *hltdc); -void HAL_LTDC_ReloadEventCallback(LTDC_HandleTypeDef *hltdc); - -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_LTDC_RegisterCallback(LTDC_HandleTypeDef *hltdc, HAL_LTDC_CallbackIDTypeDef CallbackID, - pLTDC_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_LTDC_UnRegisterCallback(LTDC_HandleTypeDef *hltdc, HAL_LTDC_CallbackIDTypeDef CallbackID); -#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @addtogroup LTDC_Exported_Functions_Group2 - * @{ - */ -/* IO operation functions *****************************************************/ -void HAL_LTDC_IRQHandler(LTDC_HandleTypeDef *hltdc); -/** - * @} - */ - -/** @addtogroup LTDC_Exported_Functions_Group3 - * @{ - */ -/* Peripheral Control functions ***********************************************/ -HAL_StatusTypeDef HAL_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_SetWindowSize(LTDC_HandleTypeDef *hltdc, uint32_t XSize, uint32_t YSize, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_SetWindowPosition(LTDC_HandleTypeDef *hltdc, uint32_t X0, uint32_t Y0, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_SetPixelFormat(LTDC_HandleTypeDef *hltdc, uint32_t Pixelformat, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_SetAlpha(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_SetAddress(LTDC_HandleTypeDef *hltdc, uint32_t Address, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_SetPitch(LTDC_HandleTypeDef *hltdc, uint32_t LinePitchInPixels, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_ConfigColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t RGBValue, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_ConfigCLUT(LTDC_HandleTypeDef *hltdc, const uint32_t *pCLUT, uint32_t CLUTSize, - uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_EnableColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_DisableColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_EnableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_DisableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_ProgramLineEvent(LTDC_HandleTypeDef *hltdc, uint32_t Line); -HAL_StatusTypeDef HAL_LTDC_EnableDither(LTDC_HandleTypeDef *hltdc); -HAL_StatusTypeDef HAL_LTDC_DisableDither(LTDC_HandleTypeDef *hltdc); -HAL_StatusTypeDef HAL_LTDC_Reload(LTDC_HandleTypeDef *hltdc, uint32_t ReloadType); -HAL_StatusTypeDef HAL_LTDC_ConfigLayer_NoReload(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, - uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_SetWindowSize_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t XSize, uint32_t YSize, - uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_SetWindowPosition_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t X0, uint32_t Y0, - uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_SetPixelFormat_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Pixelformat, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_SetAlpha_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_SetAddress_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Address, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_SetPitch_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LinePitchInPixels, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_ConfigColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t RGBValue, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_EnableColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_DisableColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_EnableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); -HAL_StatusTypeDef HAL_LTDC_DisableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); - -/** - * @} - */ - -/** @addtogroup LTDC_Exported_Functions_Group4 - * @{ - */ -/* Peripheral State functions *************************************************/ -HAL_LTDC_StateTypeDef HAL_LTDC_GetState(const LTDC_HandleTypeDef *hltdc); -uint32_t HAL_LTDC_GetError(const LTDC_HandleTypeDef *hltdc); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup LTDC_Private_Macros LTDC Private Macros - * @{ - */ -#define LTDC_LAYER(__HANDLE__, __LAYER__) ((LTDC_Layer_TypeDef *)((uint32_t)(\ - ((uint32_t)((__HANDLE__)->Instance))\ - + 0x84U + (0x80U*(__LAYER__))))) -#define IS_LTDC_LAYER(__LAYER__) ((__LAYER__) < MAX_LAYER) -#define IS_LTDC_HSPOL(__HSPOL__) (((__HSPOL__) == LTDC_HSPOLARITY_AL)\ - || ((__HSPOL__) == LTDC_HSPOLARITY_AH)) -#define IS_LTDC_VSPOL(__VSPOL__) (((__VSPOL__) == LTDC_VSPOLARITY_AL)\ - || ((__VSPOL__) == LTDC_VSPOLARITY_AH)) -#define IS_LTDC_DEPOL(__DEPOL__) (((__DEPOL__) == LTDC_DEPOLARITY_AL)\ - || ((__DEPOL__) == LTDC_DEPOLARITY_AH)) -#define IS_LTDC_PCPOL(__PCPOL__) (((__PCPOL__) == LTDC_PCPOLARITY_IPC)\ - || ((__PCPOL__) == LTDC_PCPOLARITY_IIPC)) -#define IS_LTDC_HSYNC(__HSYNC__) ((__HSYNC__) <= LTDC_HORIZONTALSYNC) -#define IS_LTDC_VSYNC(__VSYNC__) ((__VSYNC__) <= LTDC_VERTICALSYNC) -#define IS_LTDC_AHBP(__AHBP__) ((__AHBP__) <= LTDC_HORIZONTALSYNC) -#define IS_LTDC_AVBP(__AVBP__) ((__AVBP__) <= LTDC_VERTICALSYNC) -#define IS_LTDC_AAW(__AAW__) ((__AAW__) <= LTDC_HORIZONTALSYNC) -#define IS_LTDC_AAH(__AAH__) ((__AAH__) <= LTDC_VERTICALSYNC) -#define IS_LTDC_TOTALW(__TOTALW__) ((__TOTALW__) <= LTDC_HORIZONTALSYNC) -#define IS_LTDC_TOTALH(__TOTALH__) ((__TOTALH__) <= LTDC_VERTICALSYNC) -#define IS_LTDC_BLUEVALUE(__BBLUE__) ((__BBLUE__) <= LTDC_COLOR) -#define IS_LTDC_GREENVALUE(__BGREEN__) ((__BGREEN__) <= LTDC_COLOR) -#define IS_LTDC_REDVALUE(__BRED__) ((__BRED__) <= LTDC_COLOR) -#define IS_LTDC_BLENDING_FACTOR1(__BLENDING_FACTOR1__) (((__BLENDING_FACTOR1__) == LTDC_BLENDING_FACTOR1_CA) || \ - ((__BLENDING_FACTOR1__) == LTDC_BLENDING_FACTOR1_PAxCA)) -#define IS_LTDC_BLENDING_FACTOR2(__BLENDING_FACTOR1__) (((__BLENDING_FACTOR1__) == LTDC_BLENDING_FACTOR2_CA) || \ - ((__BLENDING_FACTOR1__) == LTDC_BLENDING_FACTOR2_PAxCA)) -#define IS_LTDC_PIXEL_FORMAT(__PIXEL_FORMAT__) (((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_ARGB8888) || \ - ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_RGB888) || \ - ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_RGB565) || \ - ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_ARGB1555) || \ - ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_ARGB4444) || \ - ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_L8) || \ - ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_AL44) || \ - ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_AL88)) -#define IS_LTDC_ALPHA(__ALPHA__) ((__ALPHA__) <= LTDC_ALPHA) -#define IS_LTDC_HCONFIGST(__HCONFIGST__) ((__HCONFIGST__) <= LTDC_STARTPOSITION) -#define IS_LTDC_HCONFIGSP(__HCONFIGSP__) ((__HCONFIGSP__) <= LTDC_STOPPOSITION) -#define IS_LTDC_VCONFIGST(__VCONFIGST__) ((__VCONFIGST__) <= LTDC_STARTPOSITION) -#define IS_LTDC_VCONFIGSP(__VCONFIGSP__) ((__VCONFIGSP__) <= LTDC_STOPPOSITION) -#define IS_LTDC_CFBP(__CFBP__) ((__CFBP__) <= LTDC_COLOR_FRAME_BUFFER) -#define IS_LTDC_CFBLL(__CFBLL__) ((__CFBLL__) <= LTDC_COLOR_FRAME_BUFFER) -#define IS_LTDC_CFBLNBR(__CFBLNBR__) ((__CFBLNBR__) <= LTDC_LINE_NUMBER) -#define IS_LTDC_LIPOS(__LIPOS__) ((__LIPOS__) <= 0x7FFU) -#define IS_LTDC_RELOAD(__RELOADTYPE__) (((__RELOADTYPE__) == LTDC_RELOAD_IMMEDIATE) || \ - ((__RELOADTYPE__) == LTDC_RELOAD_VERTICAL_BLANKING)) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup LTDC_Private_Functions LTDC Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* LTDC */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_LTDC_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc_ex.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc_ex.h deleted file mode 100644 index b9c39e4..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc_ex.h +++ /dev/null @@ -1,83 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_ltdc_ex.h - * @author MCD Application Team - * @brief Header file of LTDC HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_LTDC_EX_H -#define STM32F4xx_HAL_LTDC_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -#if defined (LTDC) && defined (DSI) - -#include "stm32f4xx_hal_dsi.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup LTDCEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup LTDCEx_Exported_Functions - * @{ - */ - -/** @addtogroup LTDCEx_Exported_Functions_Group1 - * @{ - */ -HAL_StatusTypeDef HAL_LTDCEx_StructInitFromVideoConfig(LTDC_HandleTypeDef *hltdc, DSI_VidCfgTypeDef *VidCfg); -HAL_StatusTypeDef HAL_LTDCEx_StructInitFromAdaptedCommandConfig(LTDC_HandleTypeDef *hltdc, DSI_CmdCfgTypeDef *CmdCfg); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* LTDC && DSI */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_LTDC_EX_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nand.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nand.h deleted file mode 100644 index 9db3882..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nand.h +++ /dev/null @@ -1,387 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_nand.h - * @author MCD Application Team - * @brief Header file of NAND HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_NAND_H -#define STM32F4xx_HAL_NAND_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) || defined(FSMC_Bank2_3) - -/* Includes ------------------------------------------------------------------*/ -#if defined(FSMC_Bank2_3) -#include "stm32f4xx_ll_fsmc.h" -#else -#include "stm32f4xx_ll_fmc.h" -#endif /* FSMC_Bank2_3 */ - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup NAND - * @{ - */ - -/* Exported typedef ----------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/** @defgroup NAND_Exported_Types NAND Exported Types - * @{ - */ - -/** - * @brief HAL NAND State structures definition - */ -typedef enum -{ - HAL_NAND_STATE_RESET = 0x00U, /*!< NAND not yet initialized or disabled */ - HAL_NAND_STATE_READY = 0x01U, /*!< NAND initialized and ready for use */ - HAL_NAND_STATE_BUSY = 0x02U, /*!< NAND internal process is ongoing */ - HAL_NAND_STATE_ERROR = 0x03U /*!< NAND error state */ -} HAL_NAND_StateTypeDef; - -/** - * @brief NAND Memory electronic signature Structure definition - */ -typedef struct -{ - /*State = HAL_NAND_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_NAND_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_NAND_STATE_RESET) -#endif /* USE_HAL_NAND_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup NAND_Exported_Functions NAND Exported Functions - * @{ - */ - -/** @addtogroup NAND_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ - -/* Initialization/de-initialization functions ********************************/ -HAL_StatusTypeDef HAL_NAND_Init(NAND_HandleTypeDef *hnand, FMC_NAND_PCC_TimingTypeDef *ComSpace_Timing, - FMC_NAND_PCC_TimingTypeDef *AttSpace_Timing); -HAL_StatusTypeDef HAL_NAND_DeInit(NAND_HandleTypeDef *hnand); - -HAL_StatusTypeDef HAL_NAND_ConfigDevice(NAND_HandleTypeDef *hnand, const NAND_DeviceConfigTypeDef *pDeviceConfig); - -HAL_StatusTypeDef HAL_NAND_Read_ID(NAND_HandleTypeDef *hnand, NAND_IDTypeDef *pNAND_ID); - -void HAL_NAND_MspInit(NAND_HandleTypeDef *hnand); -void HAL_NAND_MspDeInit(NAND_HandleTypeDef *hnand); -void HAL_NAND_IRQHandler(NAND_HandleTypeDef *hnand); -void HAL_NAND_ITCallback(NAND_HandleTypeDef *hnand); - -/** - * @} - */ - -/** @addtogroup NAND_Exported_Functions_Group2 Input and Output functions - * @{ - */ - -/* IO operation functions ****************************************************/ -HAL_StatusTypeDef HAL_NAND_Reset(NAND_HandleTypeDef *hnand); - -HAL_StatusTypeDef HAL_NAND_Read_Page_8b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - uint8_t *pBuffer, uint32_t NumPageToRead); -HAL_StatusTypeDef HAL_NAND_Write_Page_8b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - const uint8_t *pBuffer, uint32_t NumPageToWrite); -HAL_StatusTypeDef HAL_NAND_Read_SpareArea_8b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - uint8_t *pBuffer, uint32_t NumSpareAreaToRead); -HAL_StatusTypeDef HAL_NAND_Write_SpareArea_8b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - const uint8_t *pBuffer, uint32_t NumSpareAreaTowrite); - -HAL_StatusTypeDef HAL_NAND_Read_Page_16b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - uint16_t *pBuffer, uint32_t NumPageToRead); -HAL_StatusTypeDef HAL_NAND_Write_Page_16b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - const uint16_t *pBuffer, uint32_t NumPageToWrite); -HAL_StatusTypeDef HAL_NAND_Read_SpareArea_16b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - uint16_t *pBuffer, uint32_t NumSpareAreaToRead); -HAL_StatusTypeDef HAL_NAND_Write_SpareArea_16b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - const uint16_t *pBuffer, uint32_t NumSpareAreaTowrite); - -HAL_StatusTypeDef HAL_NAND_Erase_Block(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress); - -uint32_t HAL_NAND_Address_Inc(const NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress); - -#if (USE_HAL_NAND_REGISTER_CALLBACKS == 1) -/* NAND callback registering/unregistering */ -HAL_StatusTypeDef HAL_NAND_RegisterCallback(NAND_HandleTypeDef *hnand, HAL_NAND_CallbackIDTypeDef CallbackId, - pNAND_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_NAND_UnRegisterCallback(NAND_HandleTypeDef *hnand, HAL_NAND_CallbackIDTypeDef CallbackId); -#endif /* USE_HAL_NAND_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @addtogroup NAND_Exported_Functions_Group3 Peripheral Control functions - * @{ - */ - -/* NAND Control functions ****************************************************/ -HAL_StatusTypeDef HAL_NAND_ECC_Enable(NAND_HandleTypeDef *hnand); -HAL_StatusTypeDef HAL_NAND_ECC_Disable(NAND_HandleTypeDef *hnand); -HAL_StatusTypeDef HAL_NAND_GetECC(NAND_HandleTypeDef *hnand, uint32_t *ECCval, uint32_t Timeout); - -/** - * @} - */ - -/** @addtogroup NAND_Exported_Functions_Group4 Peripheral State functions - * @{ - */ -/* NAND State functions *******************************************************/ -HAL_NAND_StateTypeDef HAL_NAND_GetState(const NAND_HandleTypeDef *hnand); -uint32_t HAL_NAND_Read_Status(const NAND_HandleTypeDef *hnand); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup NAND_Private_Constants NAND Private Constants - * @{ - */ -#if defined(FMC_Bank2_3) -#define NAND_DEVICE1 0x70000000UL -#define NAND_DEVICE2 0x80000000UL -#else -#define NAND_DEVICE 0x80000000UL -#endif /* FMC_Bank2_3 */ -#define NAND_WRITE_TIMEOUT 0x01000000UL - -#define CMD_AREA (1UL<<16U) /* A16 = CLE high */ -#define ADDR_AREA (1UL<<17U) /* A17 = ALE high */ - -#define NAND_CMD_AREA_A ((uint8_t)0x00) -#define NAND_CMD_AREA_B ((uint8_t)0x01) -#define NAND_CMD_AREA_C ((uint8_t)0x50) -#define NAND_CMD_AREA_TRUE1 ((uint8_t)0x30) - -#define NAND_CMD_WRITE0 ((uint8_t)0x80) -#define NAND_CMD_WRITE_TRUE1 ((uint8_t)0x10) -#define NAND_CMD_ERASE0 ((uint8_t)0x60) -#define NAND_CMD_ERASE1 ((uint8_t)0xD0) -#define NAND_CMD_READID ((uint8_t)0x90) -#define NAND_CMD_STATUS ((uint8_t)0x70) -#define NAND_CMD_LOCK_STATUS ((uint8_t)0x7A) -#define NAND_CMD_RESET ((uint8_t)0xFF) - -/* NAND memory status */ -#define NAND_VALID_ADDRESS 0x00000100UL -#define NAND_INVALID_ADDRESS 0x00000200UL -#define NAND_TIMEOUT_ERROR 0x00000400UL -#define NAND_BUSY 0x00000000UL -#define NAND_ERROR 0x00000001UL -#define NAND_READY 0x00000040UL -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup NAND_Private_Macros NAND Private Macros - * @{ - */ - -/** - * @brief NAND memory address computation. - * @param __ADDRESS__ NAND memory address. - * @param __HANDLE__ NAND handle. - * @retval NAND Raw address value - */ -#define ARRAY_ADDRESS(__ADDRESS__ , __HANDLE__) ((__ADDRESS__)->Page + \ - (((__ADDRESS__)->Block + \ - (((__ADDRESS__)->Plane) * \ - ((__HANDLE__)->Config.PlaneSize))) * \ - ((__HANDLE__)->Config.BlockSize))) - -/** - * @brief NAND memory Column address computation. - * @param __HANDLE__ NAND handle. - * @retval NAND Raw address value - */ -#define COLUMN_ADDRESS( __HANDLE__) ((__HANDLE__)->Config.PageSize) - -/** - * @brief NAND memory address cycling. - * @param __ADDRESS__ NAND memory address. - * @retval NAND address cycling value. - */ -#define ADDR_1ST_CYCLE(__ADDRESS__) (uint8_t)(__ADDRESS__) /* 1st addressing cycle */ -#define ADDR_2ND_CYCLE(__ADDRESS__) (uint8_t)((__ADDRESS__) >> 8) /* 2nd addressing cycle */ -#define ADDR_3RD_CYCLE(__ADDRESS__) (uint8_t)((__ADDRESS__) >> 16) /* 3rd addressing cycle */ -#define ADDR_4TH_CYCLE(__ADDRESS__) (uint8_t)((__ADDRESS__) >> 24) /* 4th addressing cycle */ - -/** - * @brief NAND memory Columns cycling. - * @param __ADDRESS__ NAND memory address. - * @retval NAND Column address cycling value. - */ -#define COLUMN_1ST_CYCLE(__ADDRESS__) (uint8_t)((__ADDRESS__) & 0xFFU) /* 1st Column addressing cycle */ -#define COLUMN_2ND_CYCLE(__ADDRESS__) (uint8_t)((__ADDRESS__) >> 8) /* 2nd Column addressing cycle */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* FMC_Bank3) || defined(FMC_Bank2_3) || defined(FSMC_Bank2_3 */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_NAND_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nor.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nor.h deleted file mode 100644 index 427c2cc..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nor.h +++ /dev/null @@ -1,330 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_nor.h - * @author MCD Application Team - * @brief Header file of NOR HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_NOR_H -#define STM32F4xx_HAL_NOR_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(FMC_Bank1) || defined(FSMC_Bank1) - -/* Includes ------------------------------------------------------------------*/ -#if defined(FSMC_Bank1) -#include "stm32f4xx_ll_fsmc.h" -#else -#include "stm32f4xx_ll_fmc.h" -#endif /* FMC_Bank1 */ - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup NOR - * @{ - */ - -/* Exported typedef ----------------------------------------------------------*/ -/** @defgroup NOR_Exported_Types NOR Exported Types - * @{ - */ - -/** - * @brief HAL SRAM State structures definition - */ -typedef enum -{ - HAL_NOR_STATE_RESET = 0x00U, /*!< NOR not yet initialized or disabled */ - HAL_NOR_STATE_READY = 0x01U, /*!< NOR initialized and ready for use */ - HAL_NOR_STATE_BUSY = 0x02U, /*!< NOR internal processing is ongoing */ - HAL_NOR_STATE_ERROR = 0x03U, /*!< NOR error state */ - HAL_NOR_STATE_PROTECTED = 0x04U /*!< NOR NORSRAM device write protected */ -} HAL_NOR_StateTypeDef; - -/** - * @brief FMC NOR Status typedef - */ -typedef enum -{ - HAL_NOR_STATUS_SUCCESS = 0U, - HAL_NOR_STATUS_ONGOING, - HAL_NOR_STATUS_ERROR, - HAL_NOR_STATUS_TIMEOUT -} HAL_NOR_StatusTypeDef; - -/** - * @brief FMC NOR ID typedef - */ -typedef struct -{ - uint16_t Manufacturer_Code; /*!< Defines the device's manufacturer code used to identify the memory */ - - uint16_t Device_Code1; - - uint16_t Device_Code2; - - uint16_t Device_Code3; /*!< Defines the device's codes used to identify the memory. - These codes can be accessed by performing read operations with specific - control signals and addresses set.They can also be accessed by issuing - an Auto Select command */ -} NOR_IDTypeDef; - -/** - * @brief FMC NOR CFI typedef - */ -typedef struct -{ - /*!< Defines the information stored in the memory's Common flash interface - which contains a description of various electrical and timing parameters, - density information and functions supported by the memory */ - - uint16_t CFI_1; - - uint16_t CFI_2; - - uint16_t CFI_3; - - uint16_t CFI_4; -} NOR_CFITypeDef; - -/** - * @brief NOR handle Structure definition - */ -#if (USE_HAL_NOR_REGISTER_CALLBACKS == 1) -typedef struct __NOR_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_NOR_REGISTER_CALLBACKS */ - -{ - FMC_NORSRAM_TypeDef *Instance; /*!< Register base address */ - - FMC_NORSRAM_EXTENDED_TypeDef *Extended; /*!< Extended mode register base address */ - - FMC_NORSRAM_InitTypeDef Init; /*!< NOR device control configuration parameters */ - - HAL_LockTypeDef Lock; /*!< NOR locking object */ - - __IO HAL_NOR_StateTypeDef State; /*!< NOR device access state */ - - uint32_t CommandSet; /*!< NOR algorithm command set and control */ - -#if (USE_HAL_NOR_REGISTER_CALLBACKS == 1) - void (* MspInitCallback)(struct __NOR_HandleTypeDef *hnor); /*!< NOR Msp Init callback */ - void (* MspDeInitCallback)(struct __NOR_HandleTypeDef *hnor); /*!< NOR Msp DeInit callback */ -#endif /* USE_HAL_NOR_REGISTER_CALLBACKS */ -} NOR_HandleTypeDef; - -#if (USE_HAL_NOR_REGISTER_CALLBACKS == 1) -/** - * @brief HAL NOR Callback ID enumeration definition - */ -typedef enum -{ - HAL_NOR_MSP_INIT_CB_ID = 0x00U, /*!< NOR MspInit Callback ID */ - HAL_NOR_MSP_DEINIT_CB_ID = 0x01U /*!< NOR MspDeInit Callback ID */ -} HAL_NOR_CallbackIDTypeDef; - -/** - * @brief HAL NOR Callback pointer definition - */ -typedef void (*pNOR_CallbackTypeDef)(NOR_HandleTypeDef *hnor); -#endif /* USE_HAL_NOR_REGISTER_CALLBACKS */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup NOR_Exported_Macros NOR Exported Macros - * @{ - */ -/** @brief Reset NOR handle state - * @param __HANDLE__ specifies the NOR handle. - * @retval None - */ -#if (USE_HAL_NOR_REGISTER_CALLBACKS == 1) -#define __HAL_NOR_RESET_HANDLE_STATE(__HANDLE__) do { \ - (__HANDLE__)->State = HAL_NOR_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_NOR_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_NOR_STATE_RESET) -#endif /* USE_HAL_NOR_REGISTER_CALLBACKS */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup NOR_Exported_Functions NOR Exported Functions - * @{ - */ - -/** @addtogroup NOR_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ - -/* Initialization/de-initialization functions ********************************/ -HAL_StatusTypeDef HAL_NOR_Init(NOR_HandleTypeDef *hnor, FMC_NORSRAM_TimingTypeDef *Timing, - FMC_NORSRAM_TimingTypeDef *ExtTiming); -HAL_StatusTypeDef HAL_NOR_DeInit(NOR_HandleTypeDef *hnor); -void HAL_NOR_MspInit(NOR_HandleTypeDef *hnor); -void HAL_NOR_MspDeInit(NOR_HandleTypeDef *hnor); -void HAL_NOR_MspWait(NOR_HandleTypeDef *hnor, uint32_t Timeout); -/** - * @} - */ - -/** @addtogroup NOR_Exported_Functions_Group2 Input and Output functions - * @{ - */ - -/* I/O operation functions ***************************************************/ -HAL_StatusTypeDef HAL_NOR_Read_ID(NOR_HandleTypeDef *hnor, NOR_IDTypeDef *pNOR_ID); -HAL_StatusTypeDef HAL_NOR_ReturnToReadMode(NOR_HandleTypeDef *hnor); -HAL_StatusTypeDef HAL_NOR_Read(NOR_HandleTypeDef *hnor, uint32_t *pAddress, uint16_t *pData); -HAL_StatusTypeDef HAL_NOR_Program(NOR_HandleTypeDef *hnor, uint32_t *pAddress, uint16_t *pData); - -HAL_StatusTypeDef HAL_NOR_ReadBuffer(NOR_HandleTypeDef *hnor, uint32_t uwAddress, uint16_t *pData, - uint32_t uwBufferSize); -HAL_StatusTypeDef HAL_NOR_ProgramBuffer(NOR_HandleTypeDef *hnor, uint32_t uwAddress, uint16_t *pData, - uint32_t uwBufferSize); - -HAL_StatusTypeDef HAL_NOR_Erase_Block(NOR_HandleTypeDef *hnor, uint32_t BlockAddress, uint32_t Address); -HAL_StatusTypeDef HAL_NOR_Erase_Chip(NOR_HandleTypeDef *hnor, uint32_t Address); -HAL_StatusTypeDef HAL_NOR_Read_CFI(NOR_HandleTypeDef *hnor, NOR_CFITypeDef *pNOR_CFI); - -#if (USE_HAL_NOR_REGISTER_CALLBACKS == 1) -/* NOR callback registering/unregistering */ -HAL_StatusTypeDef HAL_NOR_RegisterCallback(NOR_HandleTypeDef *hnor, HAL_NOR_CallbackIDTypeDef CallbackId, - pNOR_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_NOR_UnRegisterCallback(NOR_HandleTypeDef *hnor, HAL_NOR_CallbackIDTypeDef CallbackId); -#endif /* USE_HAL_NOR_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @addtogroup NOR_Exported_Functions_Group3 NOR Control functions - * @{ - */ - -/* NOR Control functions *****************************************************/ -HAL_StatusTypeDef HAL_NOR_WriteOperation_Enable(NOR_HandleTypeDef *hnor); -HAL_StatusTypeDef HAL_NOR_WriteOperation_Disable(NOR_HandleTypeDef *hnor); -/** - * @} - */ - -/** @addtogroup NOR_Exported_Functions_Group4 NOR State functions - * @{ - */ - -/* NOR State functions ********************************************************/ -HAL_NOR_StateTypeDef HAL_NOR_GetState(const NOR_HandleTypeDef *hnor); -HAL_NOR_StatusTypeDef HAL_NOR_GetStatus(NOR_HandleTypeDef *hnor, uint32_t Address, uint32_t Timeout); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup NOR_Private_Constants NOR Private Constants - * @{ - */ -/* NOR device IDs addresses */ -#define MC_ADDRESS ((uint16_t)0x0000) -#define DEVICE_CODE1_ADDR ((uint16_t)0x0001) -#define DEVICE_CODE2_ADDR ((uint16_t)0x000E) -#define DEVICE_CODE3_ADDR ((uint16_t)0x000F) - -/* NOR CFI IDs addresses */ -#define CFI1_ADDRESS ((uint16_t)0x0061) -#define CFI2_ADDRESS ((uint16_t)0x0062) -#define CFI3_ADDRESS ((uint16_t)0x0063) -#define CFI4_ADDRESS ((uint16_t)0x0064) - -/* NOR operation wait timeout */ -#define NOR_TMEOUT ((uint16_t)0xFFFF) - -/* NOR memory data width */ -#define NOR_MEMORY_8B ((uint8_t)0x00) -#define NOR_MEMORY_16B ((uint8_t)0x01) - -/* NOR memory device read/write start address */ -#define NOR_MEMORY_ADRESS1 (0x60000000U) -#define NOR_MEMORY_ADRESS2 (0x64000000U) -#define NOR_MEMORY_ADRESS3 (0x68000000U) -#define NOR_MEMORY_ADRESS4 (0x6C000000U) -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup NOR_Private_Macros NOR Private Macros - * @{ - */ -/** - * @brief NOR memory address shifting. - * @param __NOR_ADDRESS NOR base address - * @param __NOR_MEMORY_WIDTH_ NOR memory width - * @param __ADDRESS__ NOR memory address - * @retval NOR shifted address value - */ -#define NOR_ADDR_SHIFT(__NOR_ADDRESS, __NOR_MEMORY_WIDTH_, __ADDRESS__) \ - ((uint32_t)(((__NOR_MEMORY_WIDTH_) == NOR_MEMORY_16B)? \ - ((uint32_t)((__NOR_ADDRESS) + (2U * (__ADDRESS__)))): \ - ((uint32_t)((__NOR_ADDRESS) + (__ADDRESS__))))) - -/** - * @brief NOR memory write data to specified address. - * @param __ADDRESS__ NOR memory address - * @param __DATA__ Data to write - * @retval None - */ -#define NOR_WRITE(__ADDRESS__, __DATA__) do{ \ - (*(__IO uint16_t *)((uint32_t)(__ADDRESS__)) = (__DATA__)); \ - __DSB(); \ - } while(0) - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* FMC_Bank1 || FSMC_Bank1 */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_NOR_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pccard.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pccard.h deleted file mode 100644 index 0be5de5..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pccard.h +++ /dev/null @@ -1,286 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pccard.h - * @author MCD Application Team - * @brief Header file of PCCARD HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_PCCARD_H -#define STM32F4xx_HAL_PCCARD_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(FMC_Bank4) || defined(FSMC_Bank4) - -/* Includes ------------------------------------------------------------------*/ -#if defined(FSMC_Bank4) -#include "stm32f4xx_ll_fsmc.h" -#else -#include "stm32f4xx_ll_fmc.h" -#endif /* FSMC_Bank4 */ - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup PCCARD - * @{ - */ - -/* Exported typedef ----------------------------------------------------------*/ -/** @defgroup PCCARD_Exported_Types PCCARD Exported Types - * @{ - */ - -/** - * @brief HAL PCCARD State structures definition - */ -typedef enum -{ - HAL_PCCARD_STATE_RESET = 0x00U, /*!< PCCARD peripheral not yet initialized or disabled */ - HAL_PCCARD_STATE_READY = 0x01U, /*!< PCCARD peripheral ready */ - HAL_PCCARD_STATE_BUSY = 0x02U, /*!< PCCARD peripheral busy */ - HAL_PCCARD_STATE_ERROR = 0x04U /*!< PCCARD peripheral error */ -} HAL_PCCARD_StateTypeDef; - -typedef enum -{ - HAL_PCCARD_STATUS_SUCCESS = 0U, - HAL_PCCARD_STATUS_ONGOING, - HAL_PCCARD_STATUS_ERROR, - HAL_PCCARD_STATUS_TIMEOUT -} HAL_PCCARD_StatusTypeDef; - -/** - * @brief FMC_PCCARD handle Structure definition - */ -#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1) -typedef struct __PCCARD_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */ -{ - FMC_PCCARD_TypeDef *Instance; /*!< Register base address for PCCARD device */ - - FMC_PCCARD_InitTypeDef Init; /*!< PCCARD device control configuration parameters */ - - __IO HAL_PCCARD_StateTypeDef State; /*!< PCCARD device access state */ - - HAL_LockTypeDef Lock; /*!< PCCARD Lock */ - -#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1) - void (* MspInitCallback)(struct __PCCARD_HandleTypeDef *hpccard); /*!< PCCARD Msp Init callback */ - void (* MspDeInitCallback)(struct __PCCARD_HandleTypeDef *hpccard); /*!< PCCARD Msp DeInit callback */ - void (* ItCallback)(struct __PCCARD_HandleTypeDef *hpccard); /*!< PCCARD IT callback */ -#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */ -} PCCARD_HandleTypeDef; - -#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1) -/** - * @brief HAL PCCARD Callback ID enumeration definition - */ -typedef enum -{ - HAL_PCCARD_MSP_INIT_CB_ID = 0x00U, /*!< PCCARD MspInit Callback ID */ - HAL_PCCARD_MSP_DEINIT_CB_ID = 0x01U, /*!< PCCARD MspDeInit Callback ID */ - HAL_PCCARD_IT_CB_ID = 0x02U /*!< PCCARD IT Callback ID */ -} HAL_PCCARD_CallbackIDTypeDef; - -/** - * @brief HAL PCCARD Callback pointer definition - */ -typedef void (*pPCCARD_CallbackTypeDef)(PCCARD_HandleTypeDef *hpccard); -#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PCCARD_Exported_Macros PCCARD Exported Macros - * @{ - */ -/** @brief Reset PCCARD handle state - * @param __HANDLE__ specifies the PCCARD handle. - * @retval None - */ -#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1) -#define __HAL_PCCARD_RESET_HANDLE_STATE(__HANDLE__) do { \ - (__HANDLE__)->State = HAL_PCCARD_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_PCCARD_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_PCCARD_STATE_RESET) -#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PCCARD_Exported_Functions - * @{ - */ - -/** @addtogroup PCCARD_Exported_Functions_Group1 - * @{ - */ -/* Initialization/de-initialization functions **********************************/ -HAL_StatusTypeDef HAL_PCCARD_Init(PCCARD_HandleTypeDef *hpccard, FMC_NAND_PCC_TimingTypeDef *ComSpaceTiming, - FMC_NAND_PCC_TimingTypeDef *AttSpaceTiming, - FMC_NAND_PCC_TimingTypeDef *IOSpaceTiming); -HAL_StatusTypeDef HAL_PCCARD_DeInit(PCCARD_HandleTypeDef *hpccard); -void HAL_PCCARD_MspInit(PCCARD_HandleTypeDef *hpccard); -void HAL_PCCARD_MspDeInit(PCCARD_HandleTypeDef *hpccard); -/** - * @} - */ - -/** @addtogroup PCCARD_Exported_Functions_Group2 - * @{ - */ -/* IO operation functions *****************************************************/ -HAL_StatusTypeDef HAL_PCCARD_Read_ID(PCCARD_HandleTypeDef *hpccard, uint8_t CompactFlash_ID[], uint8_t *pStatus); -HAL_StatusTypeDef HAL_PCCARD_Write_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t *pBuffer, uint16_t SectorAddress, - uint8_t *pStatus); -HAL_StatusTypeDef HAL_PCCARD_Read_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t *pBuffer, uint16_t SectorAddress, - uint8_t *pStatus); -HAL_StatusTypeDef HAL_PCCARD_Erase_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t SectorAddress, uint8_t *pStatus); -HAL_StatusTypeDef HAL_PCCARD_Reset(PCCARD_HandleTypeDef *hpccard); -void HAL_PCCARD_IRQHandler(PCCARD_HandleTypeDef *hpccard); -void HAL_PCCARD_ITCallback(PCCARD_HandleTypeDef *hpccard); - -#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1) -/* PCCARD callback registering/unregistering */ -HAL_StatusTypeDef HAL_PCCARD_RegisterCallback(PCCARD_HandleTypeDef *hpccard, HAL_PCCARD_CallbackIDTypeDef CallbackId, - pPCCARD_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_PCCARD_UnRegisterCallback(PCCARD_HandleTypeDef *hpccard, - HAL_PCCARD_CallbackIDTypeDef CallbackId); -#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @addtogroup PCCARD_Exported_Functions_Group3 - * @{ - */ -/* PCCARD State functions *******************************************************/ -HAL_PCCARD_StateTypeDef HAL_PCCARD_GetState(PCCARD_HandleTypeDef *hpccard); -HAL_PCCARD_StatusTypeDef HAL_PCCARD_GetStatus(PCCARD_HandleTypeDef *hpccard); -HAL_PCCARD_StatusTypeDef HAL_PCCARD_ReadStatus(PCCARD_HandleTypeDef *hpccard); -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup PCCARD_Private_Constants PCCARD Private Constants - * @{ - */ -#define PCCARD_DEVICE_ADDRESS 0x90000000U -#define PCCARD_ATTRIBUTE_SPACE_ADDRESS 0x98000000U /* Attribute space size to @0x9BFF FFFF */ -#define PCCARD_COMMON_SPACE_ADDRESS PCCARD_DEVICE_ADDRESS /* Common space size to @0x93FF FFFF */ -#define PCCARD_IO_SPACE_ADDRESS 0x9C000000U /* IO space size to @0x9FFF FFFF */ -#define PCCARD_IO_SPACE_PRIMARY_ADDR 0x9C0001F0U /* IO space size to @0x9FFF FFFF */ - -/* Flash-ATA registers description */ -#define ATA_DATA ((uint8_t)0x00) /* Data register */ -#define ATA_SECTOR_COUNT ((uint8_t)0x02) /* Sector Count register */ -#define ATA_SECTOR_NUMBER ((uint8_t)0x03) /* Sector Number register */ -#define ATA_CYLINDER_LOW ((uint8_t)0x04) /* Cylinder low register */ -#define ATA_CYLINDER_HIGH ((uint8_t)0x05) /* Cylinder high register */ -#define ATA_CARD_HEAD ((uint8_t)0x06) /* Card/Head register */ -#define ATA_STATUS_CMD ((uint8_t)0x07) /* Status(read)/Command(write) register */ -#define ATA_STATUS_CMD_ALTERNATE ((uint8_t)0x0E) /* Alternate Status(read)/Command(write) register */ -#define ATA_COMMON_DATA_AREA ((uint16_t)0x0400) /* Start of data area (for Common access only!) */ -#define ATA_CARD_CONFIGURATION ((uint16_t)0x0202) /* Card Configuration and Status Register */ - -/* Flash-ATA commands */ -#define ATA_READ_SECTOR_CMD ((uint8_t)0x20) -#define ATA_WRITE_SECTOR_CMD ((uint8_t)0x30) -#define ATA_ERASE_SECTOR_CMD ((uint8_t)0xC0) -#define ATA_IDENTIFY_CMD ((uint8_t)0xEC) - -/* PC Card/Compact Flash status */ -#define PCCARD_TIMEOUT_ERROR ((uint8_t)0x60) -#define PCCARD_BUSY ((uint8_t)0x80) -#define PCCARD_PROGR ((uint8_t)0x01) -#define PCCARD_READY ((uint8_t)0x40) - -#define PCCARD_SECTOR_SIZE 255U /* In half words */ - -/** - * @} - */ -/* Compact Flash redefinition */ -#define HAL_CF_Init HAL_PCCARD_Init -#define HAL_CF_DeInit HAL_PCCARD_DeInit -#define HAL_CF_MspInit HAL_PCCARD_MspInit -#define HAL_CF_MspDeInit HAL_PCCARD_MspDeInit - -#define HAL_CF_Read_ID HAL_PCCARD_Read_ID -#define HAL_CF_Write_Sector HAL_PCCARD_Write_Sector -#define HAL_CF_Read_Sector HAL_PCCARD_Read_Sector -#define HAL_CF_Erase_Sector HAL_PCCARD_Erase_Sector -#define HAL_CF_Reset HAL_PCCARD_Reset -#define HAL_CF_IRQHandler HAL_PCCARD_IRQHandler -#define HAL_CF_ITCallback HAL_PCCARD_ITCallback - -#define HAL_CF_GetState HAL_PCCARD_GetState -#define HAL_CF_GetStatus HAL_PCCARD_GetStatus -#define HAL_CF_ReadStatus HAL_PCCARD_ReadStatus - -#define HAL_CF_STATUS_SUCCESS HAL_PCCARD_STATUS_SUCCESS -#define HAL_CF_STATUS_ONGOING HAL_PCCARD_STATUS_ONGOING -#define HAL_CF_STATUS_ERROR HAL_PCCARD_STATUS_ERROR -#define HAL_CF_STATUS_TIMEOUT HAL_PCCARD_STATUS_TIMEOUT -#define HAL_CF_StatusTypeDef HAL_PCCARD_StatusTypeDef - -#define CF_DEVICE_ADDRESS PCCARD_DEVICE_ADDRESS -#define CF_ATTRIBUTE_SPACE_ADDRESS PCCARD_ATTRIBUTE_SPACE_ADDRESS -#define CF_COMMON_SPACE_ADDRESS PCCARD_COMMON_SPACE_ADDRESS -#define CF_IO_SPACE_ADDRESS PCCARD_IO_SPACE_ADDRESS -#define CF_IO_SPACE_PRIMARY_ADDR PCCARD_IO_SPACE_PRIMARY_ADDR - -#define CF_TIMEOUT_ERROR PCCARD_TIMEOUT_ERROR -#define CF_BUSY PCCARD_BUSY -#define CF_PROGR PCCARD_PROGR -#define CF_READY PCCARD_READY - -#define CF_SECTOR_SIZE PCCARD_SECTOR_SIZE - -/* Private macros ------------------------------------------------------------*/ -/** - * @} - */ - - -/** - * @} - */ - -#endif /* FMC_Bank4 || FSMC_Bank4 */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_PCCARD_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h deleted file mode 100644 index a7273d5..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h +++ /dev/null @@ -1,436 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr.h - * @author MCD Application Team - * @brief Header file of PWR HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_PWR_H -#define __STM32F4xx_HAL_PWR_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup PWR - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup PWR_Exported_Types PWR Exported Types - * @{ - */ - -/** - * @brief PWR PVD configuration structure definition - */ -typedef struct -{ - uint32_t PVDLevel; /*!< PVDLevel: Specifies the PVD detection level. - This parameter can be a value of @ref PWR_PVD_detection_level */ - - uint32_t Mode; /*!< Mode: Specifies the operating mode for the selected pins. - This parameter can be a value of @ref PWR_PVD_Mode */ -}PWR_PVDTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWR_Exported_Constants PWR Exported Constants - * @{ - */ - -/** @defgroup PWR_WakeUp_Pins PWR WakeUp Pins - * @{ - */ -#define PWR_WAKEUP_PIN1 0x00000100U -/** - * @} - */ - -/** @defgroup PWR_PVD_detection_level PWR PVD detection level - * @{ - */ -#define PWR_PVDLEVEL_0 PWR_CR_PLS_LEV0 -#define PWR_PVDLEVEL_1 PWR_CR_PLS_LEV1 -#define PWR_PVDLEVEL_2 PWR_CR_PLS_LEV2 -#define PWR_PVDLEVEL_3 PWR_CR_PLS_LEV3 -#define PWR_PVDLEVEL_4 PWR_CR_PLS_LEV4 -#define PWR_PVDLEVEL_5 PWR_CR_PLS_LEV5 -#define PWR_PVDLEVEL_6 PWR_CR_PLS_LEV6 -#define PWR_PVDLEVEL_7 PWR_CR_PLS_LEV7/* External input analog voltage - (Compare internally to VREFINT) */ -/** - * @} - */ - -/** @defgroup PWR_PVD_Mode PWR PVD Mode - * @{ - */ -#define PWR_PVD_MODE_NORMAL 0x00000000U /*!< basic mode is used */ -#define PWR_PVD_MODE_IT_RISING 0x00010001U /*!< External Interrupt Mode with Rising edge trigger detection */ -#define PWR_PVD_MODE_IT_FALLING 0x00010002U /*!< External Interrupt Mode with Falling edge trigger detection */ -#define PWR_PVD_MODE_IT_RISING_FALLING 0x00010003U /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ -#define PWR_PVD_MODE_EVENT_RISING 0x00020001U /*!< Event Mode with Rising edge trigger detection */ -#define PWR_PVD_MODE_EVENT_FALLING 0x00020002U /*!< Event Mode with Falling edge trigger detection */ -#define PWR_PVD_MODE_EVENT_RISING_FALLING 0x00020003U /*!< Event Mode with Rising/Falling edge trigger detection */ -/** - * @} - */ - - -/** @defgroup PWR_Regulator_state_in_STOP_mode PWR Regulator state in SLEEP/STOP mode - * @{ - */ -#define PWR_MAINREGULATOR_ON 0x00000000U -#define PWR_LOWPOWERREGULATOR_ON PWR_CR_LPDS -/** - * @} - */ - -/** @defgroup PWR_SLEEP_mode_entry PWR SLEEP mode entry - * @{ - */ -#define PWR_SLEEPENTRY_WFI ((uint8_t)0x01) -#define PWR_SLEEPENTRY_WFE ((uint8_t)0x02) -#define PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR ((uint8_t)0x03) - -/** - * @} - */ - -/** @defgroup PWR_STOP_mode_entry PWR STOP mode entry - * @{ - */ -#define PWR_STOPENTRY_WFI ((uint8_t)0x01) -#define PWR_STOPENTRY_WFE ((uint8_t)0x02) -#define PWR_STOPENTRY_WFE_NO_EVT_CLEAR ((uint8_t)0x03) -/** - * @} - */ - -/** @defgroup PWR_Flag PWR Flag - * @{ - */ -#define PWR_FLAG_WU PWR_CSR_WUF -#define PWR_FLAG_SB PWR_CSR_SBF -#define PWR_FLAG_PVDO PWR_CSR_PVDO -#define PWR_FLAG_BRR PWR_CSR_BRR -#define PWR_FLAG_VOSRDY PWR_CSR_VOSRDY -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PWR_Exported_Macro PWR Exported Macro - * @{ - */ - -/** @brief Check PWR flag is set or not. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag. This flag indicates that a wakeup event - * was received from the WKUP pin or from the RTC alarm (Alarm A - * or Alarm B), RTC Tamper event, RTC TimeStamp event or RTC Wakeup. - * An additional wakeup event is detected if the WKUP pin is enabled - * (by setting the EWUP bit) when the WKUP pin level is already high. - * @arg PWR_FLAG_SB: StandBy flag. This flag indicates that the system was - * resumed from StandBy mode. - * @arg PWR_FLAG_PVDO: PVD Output. This flag is valid only if PVD is enabled - * by the HAL_PWR_EnablePVD() function. The PVD is stopped by Standby mode - * For this reason, this bit is equal to 0 after Standby or reset - * until the PVDE bit is set. - * @arg PWR_FLAG_BRR: Backup regulator ready flag. This bit is not reset - * when the device wakes up from Standby mode or by a system reset - * or power reset. - * @arg PWR_FLAG_VOSRDY: This flag indicates that the Regulator voltage - * scaling output selection is ready. - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_PWR_GET_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the PWR's pending flags. - * @param __FLAG__ specifies the flag to clear. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag - * @arg PWR_FLAG_SB: StandBy flag - */ -#define __HAL_PWR_CLEAR_FLAG(__FLAG__) (PWR->CR |= (__FLAG__) << 2U) - -/** - * @brief Enable the PVD Exti Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_IT() (EXTI->IMR |= (PWR_EXTI_LINE_PVD)) - -/** - * @brief Disable the PVD EXTI Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_IT() (EXTI->IMR &= ~(PWR_EXTI_LINE_PVD)) - -/** - * @brief Enable event on PVD Exti Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_EVENT() (EXTI->EMR |= (PWR_EXTI_LINE_PVD)) - -/** - * @brief Disable event on PVD Exti Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_EVENT() (EXTI->EMR &= ~(PWR_EXTI_LINE_PVD)) - -/** - * @brief Enable the PVD Extended Interrupt Rising Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE() SET_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) - -/** - * @brief Disable the PVD Extended Interrupt Rising Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE() CLEAR_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) - -/** - * @brief Enable the PVD Extended Interrupt Falling Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE() SET_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) - - -/** - * @brief Disable the PVD Extended Interrupt Falling Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE() CLEAR_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) - - -/** - * @brief PVD EXTI line configuration: set rising & falling edge trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE();\ - __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE();\ - }while(0U) - -/** - * @brief Disable the PVD Extended Interrupt Rising & Falling Trigger. - * This parameter can be: - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE();\ - __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE();\ - }while(0U) - -/** - * @brief checks whether the specified PVD Exti interrupt flag is set or not. - * @retval EXTI PVD Line Status. - */ -#define __HAL_PWR_PVD_EXTI_GET_FLAG() (EXTI->PR & (PWR_EXTI_LINE_PVD)) - -/** - * @brief Clear the PVD Exti flag. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_CLEAR_FLAG() (EXTI->PR = (PWR_EXTI_LINE_PVD)) - -/** - * @brief Generates a Software interrupt on PVD EXTI line. - * @retval None - */ -#define __HAL_PWR_PVD_EXTI_GENERATE_SWIT() (EXTI->SWIER |= (PWR_EXTI_LINE_PVD)) - -/** - * @} - */ - -/* Include PWR HAL Extension module */ -#include "stm32f4xx_hal_pwr_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PWR_Exported_Functions PWR Exported Functions - * @{ - */ - -/** @addtogroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -void HAL_PWR_DeInit(void); -void HAL_PWR_EnableBkUpAccess(void); -void HAL_PWR_DisableBkUpAccess(void); -/** - * @} - */ - -/** @addtogroup PWR_Exported_Functions_Group2 Peripheral Control functions - * @{ - */ -/* Peripheral Control functions **********************************************/ -/* PVD configuration */ -void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD); -void HAL_PWR_EnablePVD(void); -void HAL_PWR_DisablePVD(void); - -/* WakeUp pins configuration */ -void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx); -void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx); - -/* Low Power modes entry */ -void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry); -void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry); -void HAL_PWR_EnterSTANDBYMode(void); - -/* Power PVD IRQ Handler */ -void HAL_PWR_PVD_IRQHandler(void); -void HAL_PWR_PVDCallback(void); - -/* Cortex System Control functions *******************************************/ -void HAL_PWR_EnableSleepOnExit(void); -void HAL_PWR_DisableSleepOnExit(void); -void HAL_PWR_EnableSEVOnPend(void); -void HAL_PWR_DisableSEVOnPend(void); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup PWR_Private_Constants PWR Private Constants - * @{ - */ - -/** @defgroup PWR_PVD_EXTI_Line PWR PVD EXTI Line - * @{ - */ -#define PWR_EXTI_LINE_PVD ((uint32_t)EXTI_IMR_MR16) /*!< External interrupt line 16 Connected to the PVD EXTI Line */ -/** - * @} - */ - -/** @defgroup PWR_register_alias_address PWR Register alias address - * @{ - */ -/* ------------- PWR registers bit address in the alias region ---------------*/ -#define PWR_OFFSET (PWR_BASE - PERIPH_BASE) -#define PWR_CR_OFFSET 0x00U -#define PWR_CSR_OFFSET 0x04U -#define PWR_CR_OFFSET_BB (PWR_OFFSET + PWR_CR_OFFSET) -#define PWR_CSR_OFFSET_BB (PWR_OFFSET + PWR_CSR_OFFSET) -/** - * @} - */ - -/** @defgroup PWR_CR_register_alias PWR CR Register alias address - * @{ - */ -/* --- CR Register ---*/ -/* Alias word address of DBP bit */ -#define DBP_BIT_NUMBER PWR_CR_DBP_Pos -#define CR_DBP_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (DBP_BIT_NUMBER * 4U)) - -/* Alias word address of PVDE bit */ -#define PVDE_BIT_NUMBER PWR_CR_PVDE_Pos -#define CR_PVDE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (PVDE_BIT_NUMBER * 4U)) - -/* Alias word address of VOS bit */ -#define VOS_BIT_NUMBER PWR_CR_VOS_Pos -#define CR_VOS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (VOS_BIT_NUMBER * 4U)) -/** - * @} - */ - -/** @defgroup PWR_CSR_register_alias PWR CSR Register alias address - * @{ - */ -/* --- CSR Register ---*/ -/* Alias word address of EWUP bit */ -#define EWUP_BIT_NUMBER PWR_CSR_EWUP_Pos -#define CSR_EWUP_BB (PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (EWUP_BIT_NUMBER * 4U)) -/** - * @} - */ - -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PWR_Private_Macros PWR Private Macros - * @{ - */ - -/** @defgroup PWR_IS_PWR_Definitions PWR Private macros to check input parameters - * @{ - */ -#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLEVEL_0) || ((LEVEL) == PWR_PVDLEVEL_1)|| \ - ((LEVEL) == PWR_PVDLEVEL_2) || ((LEVEL) == PWR_PVDLEVEL_3)|| \ - ((LEVEL) == PWR_PVDLEVEL_4) || ((LEVEL) == PWR_PVDLEVEL_5)|| \ - ((LEVEL) == PWR_PVDLEVEL_6) || ((LEVEL) == PWR_PVDLEVEL_7)) -#define IS_PWR_PVD_MODE(MODE) (((MODE) == PWR_PVD_MODE_IT_RISING)|| ((MODE) == PWR_PVD_MODE_IT_FALLING) || \ - ((MODE) == PWR_PVD_MODE_IT_RISING_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING) || \ - ((MODE) == PWR_PVD_MODE_EVENT_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING_FALLING) || \ - ((MODE) == PWR_PVD_MODE_NORMAL)) -#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_ON) || \ - ((REGULATOR) == PWR_LOWPOWERREGULATOR_ON)) - -#define IS_PWR_SLEEP_ENTRY(ENTRY) (((ENTRY) == PWR_SLEEPENTRY_WFI) || \ - ((ENTRY) == PWR_SLEEPENTRY_WFE) || \ - ((ENTRY) == PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR)) - -#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPENTRY_WFI) || \ - ((ENTRY) == PWR_STOPENTRY_WFE) || \ - ((ENTRY) == PWR_STOPENTRY_WFE_NO_EVT_CLEAR)) -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_HAL_PWR_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h deleted file mode 100644 index 57fd4d9..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h +++ /dev/null @@ -1,340 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr_ex.h - * @author MCD Application Team - * @brief Header file of PWR HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_PWR_EX_H -#define __STM32F4xx_HAL_PWR_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup PWREx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWREx_Exported_Constants PWREx Exported Constants - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) - -/** @defgroup PWREx_Regulator_state_in_UnderDrive_mode PWREx Regulator state in UnderDrive mode - * @{ - */ -#define PWR_MAINREGULATOR_UNDERDRIVE_ON PWR_CR_MRUDS -#define PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON ((uint32_t)(PWR_CR_LPDS | PWR_CR_LPUDS)) -/** - * @} - */ - -/** @defgroup PWREx_Over_Under_Drive_Flag PWREx Over Under Drive Flag - * @{ - */ -#define PWR_FLAG_ODRDY PWR_CSR_ODRDY -#define PWR_FLAG_ODSWRDY PWR_CSR_ODSWRDY -#define PWR_FLAG_UDRDY PWR_CSR_UDSWRDY -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -/** @defgroup PWREx_Regulator_Voltage_Scale PWREx Regulator Voltage Scale - * @{ - */ -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) -#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK = 168 MHz. */ -#define PWR_REGULATOR_VOLTAGE_SCALE2 0x00000000U /* Scale 2 mode: the maximum value of fHCLK = 144 MHz. */ -#else -#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK is 168 MHz. It can be extended to - 180 MHz by activating the over-drive mode. */ -#define PWR_REGULATOR_VOLTAGE_SCALE2 PWR_CR_VOS_1 /* Scale 2 mode: the maximum value of fHCLK is 144 MHz. It can be extended to - 168 MHz by activating the over-drive mode. */ -#define PWR_REGULATOR_VOLTAGE_SCALE3 PWR_CR_VOS_0 /* Scale 3 mode: the maximum value of fHCLK is 120 MHz. */ -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ -/** - * @} - */ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup PWREx_WakeUp_Pins PWREx WakeUp Pins - * @{ - */ -#define PWR_WAKEUP_PIN2 0x00000080U -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define PWR_WAKEUP_PIN3 0x00000040U -#endif /* STM32F410xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Zx || STM32F412Vx || \ - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/** - * @} - */ -#endif /* STM32F410xx || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PWREx_Exported_Constants PWREx Exported Constants - * @{ - */ - -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) -/** @brief macros configure the main internal regulator output voltage. - * @param __REGULATOR__ specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption when the device does - * not operate at the maximum frequency (refer to the datasheets for more details). - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode - * @retval None - */ -#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ - UNUSED(tmpreg); \ - } while(0U) -#else -/** @brief macros configure the main internal regulator output voltage. - * @param __REGULATOR__ specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption when the device does - * not operate at the maximum frequency (refer to the datasheets for more details). - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode - * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode - * @retval None - */ -#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macros to enable or disable the Over drive mode. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - */ -#define __HAL_PWR_OVERDRIVE_ENABLE() (*(__IO uint32_t *) CR_ODEN_BB = ENABLE) -#define __HAL_PWR_OVERDRIVE_DISABLE() (*(__IO uint32_t *) CR_ODEN_BB = DISABLE) - -/** @brief Macros to enable or disable the Over drive switching. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - */ -#define __HAL_PWR_OVERDRIVESWITCHING_ENABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = ENABLE) -#define __HAL_PWR_OVERDRIVESWITCHING_DISABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = DISABLE) - -/** @brief Macros to enable or disable the Under drive mode. - * @note This mode is enabled only with STOP low power mode. - * In this mode, the 1.2V domain is preserved in reduced leakage mode. This - * mode is only available when the main regulator or the low power regulator - * is in low voltage mode. - * @note If the Under-drive mode was enabled, it is automatically disabled after - * exiting Stop mode. - * When the voltage regulator operates in Under-drive mode, an additional - * startup delay is induced when waking up from Stop mode. - */ -#define __HAL_PWR_UNDERDRIVE_ENABLE() (PWR->CR |= (uint32_t)PWR_CR_UDEN) -#define __HAL_PWR_UNDERDRIVE_DISABLE() (PWR->CR &= (uint32_t)(~PWR_CR_UDEN)) - -/** @brief Check PWR flag is set or not. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg PWR_FLAG_ODRDY: This flag indicates that the Over-drive mode - * is ready - * @arg PWR_FLAG_ODSWRDY: This flag indicates that the Over-drive mode - * switching is ready - * @arg PWR_FLAG_UDRDY: This flag indicates that the Under-drive mode - * is enabled in Stop mode - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_PWR_GET_ODRUDR_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the Under-Drive Ready flag. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - */ -#define __HAL_PWR_CLEAR_ODRUDR_FLAG() (PWR->CSR |= PWR_FLAG_UDRDY) - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PWREx_Exported_Functions PWREx Exported Functions - * @{ - */ - -/** @addtogroup PWREx_Exported_Functions_Group1 - * @{ - */ -void HAL_PWREx_EnableFlashPowerDown(void); -void HAL_PWREx_DisableFlashPowerDown(void); -HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void); -HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void); -uint32_t HAL_PWREx_GetVoltageRange(void); -HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling); - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ - defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -void HAL_PWREx_EnableMainRegulatorLowVoltage(void); -void HAL_PWREx_DisableMainRegulatorLowVoltage(void); -void HAL_PWREx_EnableLowRegulatorLowVoltage(void); -void HAL_PWREx_DisableLowRegulatorLowVoltage(void); -#endif /* STM32F410xx || STM32F401xC || STM32F401xE || STM32F411xE || STM32F412Zx || STM32F412Vx ||\ - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void); -HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void); -HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup PWREx_Private_Constants PWREx Private Constants - * @{ - */ - -/** @defgroup PWREx_register_alias_address PWREx Register alias address - * @{ - */ -/* ------------- PWR registers bit address in the alias region ---------------*/ -/* --- CR Register ---*/ -/* Alias word address of FPDS bit */ -#define FPDS_BIT_NUMBER PWR_CR_FPDS_Pos -#define CR_FPDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (FPDS_BIT_NUMBER * 4U)) - -/* Alias word address of ODEN bit */ -#define ODEN_BIT_NUMBER PWR_CR_ODEN_Pos -#define CR_ODEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODEN_BIT_NUMBER * 4U)) - -/* Alias word address of ODSWEN bit */ -#define ODSWEN_BIT_NUMBER PWR_CR_ODSWEN_Pos -#define CR_ODSWEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODSWEN_BIT_NUMBER * 4U)) - -/* Alias word address of MRLVDS bit */ -#define MRLVDS_BIT_NUMBER PWR_CR_MRLVDS_Pos -#define CR_MRLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (MRLVDS_BIT_NUMBER * 4U)) - -/* Alias word address of LPLVDS bit */ -#define LPLVDS_BIT_NUMBER PWR_CR_LPLVDS_Pos -#define CR_LPLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (LPLVDS_BIT_NUMBER * 4U)) - - /** - * @} - */ - -/** @defgroup PWREx_CSR_register_alias PWRx CSR Register alias address - * @{ - */ -/* --- CSR Register ---*/ -/* Alias word address of BRE bit */ -#define BRE_BIT_NUMBER PWR_CSR_BRE_Pos -#define CSR_BRE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (BRE_BIT_NUMBER * 4U)) - -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PWREx_Private_Macros PWREx Private Macros - * @{ - */ - -/** @defgroup PWREx_IS_PWR_Definitions PWREx Private macros to check input parameters - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_PWR_REGULATOR_UNDERDRIVE(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_UNDERDRIVE_ON) || \ - ((REGULATOR) == PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) -#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ - ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2)) -#else -#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ - ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2) || \ - ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE3)) -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ - -#if defined(STM32F446xx) -#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2)) -#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2) || \ - ((PIN) == PWR_WAKEUP_PIN3)) -#else -#define IS_PWR_WAKEUP_PIN(PIN) ((PIN) == PWR_WAKEUP_PIN1) -#endif /* STM32F446xx */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_HAL_PWR_EX_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h deleted file mode 100644 index 2e3909a..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h +++ /dev/null @@ -1,1458 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc.h - * @author MCD Application Team - * @brief Header file of RCC HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_RCC_H -#define __STM32F4xx_HAL_RCC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/* Include RCC HAL Extended module */ -/* (include on top of file since RCC structures are defined in extended file) */ -#include "stm32f4xx_hal_rcc_ex.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup RCC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup RCC_Exported_Types RCC Exported Types - * @{ - */ - -/** - * @brief RCC Internal/External Oscillator (HSE, HSI, LSE and LSI) configuration structure definition - */ -typedef struct -{ - uint32_t OscillatorType; /*!< The oscillators to be configured. - This parameter can be a value of @ref RCC_Oscillator_Type */ - - uint32_t HSEState; /*!< The new state of the HSE. - This parameter can be a value of @ref RCC_HSE_Config */ - - uint32_t LSEState; /*!< The new state of the LSE. - This parameter can be a value of @ref RCC_LSE_Config */ - - uint32_t HSIState; /*!< The new state of the HSI. - This parameter can be a value of @ref RCC_HSI_Config */ - - uint32_t HSICalibrationValue; /*!< The HSI calibration trimming value (default is RCC_HSICALIBRATION_DEFAULT). - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F */ - - uint32_t LSIState; /*!< The new state of the LSI. - This parameter can be a value of @ref RCC_LSI_Config */ - - RCC_PLLInitTypeDef PLL; /*!< PLL structure parameters */ -} RCC_OscInitTypeDef; - -/** - * @brief RCC System, AHB and APB busses clock configuration structure definition - */ -typedef struct -{ - uint32_t ClockType; /*!< The clock to be configured. - This parameter can be a value of @ref RCC_System_Clock_Type */ - - uint32_t SYSCLKSource; /*!< The clock source (SYSCLKS) used as system clock. - This parameter can be a value of @ref RCC_System_Clock_Source */ - - 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_AHB_Clock_Source */ - - 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_APB1_APB2_Clock_Source */ - - 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_APB1_APB2_Clock_Source */ - -} RCC_ClkInitTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup RCC_Exported_Constants RCC Exported Constants - * @{ - */ - -/** @defgroup RCC_Oscillator_Type Oscillator Type - * @{ - */ -#define RCC_OSCILLATORTYPE_NONE 0x00000000U -#define RCC_OSCILLATORTYPE_HSE 0x00000001U -#define RCC_OSCILLATORTYPE_HSI 0x00000002U -#define RCC_OSCILLATORTYPE_LSE 0x00000004U -#define RCC_OSCILLATORTYPE_LSI 0x00000008U -/** - * @} - */ - -/** @defgroup RCC_HSE_Config HSE Config - * @{ - */ -#define RCC_HSE_OFF 0x00000000U -#define RCC_HSE_ON RCC_CR_HSEON -#define RCC_HSE_BYPASS ((uint32_t)(RCC_CR_HSEBYP | RCC_CR_HSEON)) -/** - * @} - */ - -/** @defgroup RCC_LSE_Config LSE Config - * @{ - */ -#define RCC_LSE_OFF 0x00000000U -#define RCC_LSE_ON RCC_BDCR_LSEON -#define RCC_LSE_BYPASS ((uint32_t)(RCC_BDCR_LSEBYP | RCC_BDCR_LSEON)) -/** - * @} - */ - -/** @defgroup RCC_HSI_Config HSI Config - * @{ - */ -#define RCC_HSI_OFF ((uint8_t)0x00) -#define RCC_HSI_ON ((uint8_t)0x01) - -#define RCC_HSICALIBRATION_DEFAULT 0x10U /* Default HSI calibration trimming value */ -/** - * @} - */ - -/** @defgroup RCC_LSI_Config LSI Config - * @{ - */ -#define RCC_LSI_OFF ((uint8_t)0x00) -#define RCC_LSI_ON ((uint8_t)0x01) -/** - * @} - */ - -/** @defgroup RCC_PLL_Config PLL Config - * @{ - */ -#define RCC_PLL_NONE ((uint8_t)0x00) -#define RCC_PLL_OFF ((uint8_t)0x01) -#define RCC_PLL_ON ((uint8_t)0x02) -/** - * @} - */ - -/** @defgroup RCC_PLLP_Clock_Divider PLLP Clock Divider - * @{ - */ -#define RCC_PLLP_DIV2 0x00000002U -#define RCC_PLLP_DIV4 0x00000004U -#define RCC_PLLP_DIV6 0x00000006U -#define RCC_PLLP_DIV8 0x00000008U -/** - * @} - */ - -/** @defgroup RCC_PLL_Clock_Source PLL Clock Source - * @{ - */ -#define RCC_PLLSOURCE_HSI RCC_PLLCFGR_PLLSRC_HSI -#define RCC_PLLSOURCE_HSE RCC_PLLCFGR_PLLSRC_HSE -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Type System Clock Type - * @{ - */ -#define RCC_CLOCKTYPE_SYSCLK 0x00000001U -#define RCC_CLOCKTYPE_HCLK 0x00000002U -#define RCC_CLOCKTYPE_PCLK1 0x00000004U -#define RCC_CLOCKTYPE_PCLK2 0x00000008U -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Source System Clock Source - * @note The RCC_SYSCLKSOURCE_PLLRCLK parameter is available only for - * STM32F446xx devices. - * @{ - */ -#define RCC_SYSCLKSOURCE_HSI RCC_CFGR_SW_HSI -#define RCC_SYSCLKSOURCE_HSE RCC_CFGR_SW_HSE -#define RCC_SYSCLKSOURCE_PLLCLK RCC_CFGR_SW_PLL -#define RCC_SYSCLKSOURCE_PLLRCLK ((uint32_t)(RCC_CFGR_SW_0 | RCC_CFGR_SW_1)) -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Source_Status System Clock Source Status - * @note The RCC_SYSCLKSOURCE_STATUS_PLLRCLK parameter is available only for - * STM32F446xx devices. - * @{ - */ -#define RCC_SYSCLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ -#define RCC_SYSCLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ -#define RCC_SYSCLKSOURCE_STATUS_PLLCLK RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ -#define RCC_SYSCLKSOURCE_STATUS_PLLRCLK ((uint32_t)(RCC_CFGR_SWS_0 | RCC_CFGR_SWS_1)) /*!< PLLR used as system clock */ -/** - * @} - */ - -/** @defgroup RCC_AHB_Clock_Source AHB Clock Source - * @{ - */ -#define RCC_SYSCLK_DIV1 RCC_CFGR_HPRE_DIV1 -#define RCC_SYSCLK_DIV2 RCC_CFGR_HPRE_DIV2 -#define RCC_SYSCLK_DIV4 RCC_CFGR_HPRE_DIV4 -#define RCC_SYSCLK_DIV8 RCC_CFGR_HPRE_DIV8 -#define RCC_SYSCLK_DIV16 RCC_CFGR_HPRE_DIV16 -#define RCC_SYSCLK_DIV64 RCC_CFGR_HPRE_DIV64 -#define RCC_SYSCLK_DIV128 RCC_CFGR_HPRE_DIV128 -#define RCC_SYSCLK_DIV256 RCC_CFGR_HPRE_DIV256 -#define RCC_SYSCLK_DIV512 RCC_CFGR_HPRE_DIV512 -/** - * @} - */ - -/** @defgroup RCC_APB1_APB2_Clock_Source APB1/APB2 Clock Source - * @{ - */ -#define RCC_HCLK_DIV1 RCC_CFGR_PPRE1_DIV1 -#define RCC_HCLK_DIV2 RCC_CFGR_PPRE1_DIV2 -#define RCC_HCLK_DIV4 RCC_CFGR_PPRE1_DIV4 -#define RCC_HCLK_DIV8 RCC_CFGR_PPRE1_DIV8 -#define RCC_HCLK_DIV16 RCC_CFGR_PPRE1_DIV16 -/** - * @} - */ - -/** @defgroup RCC_RTC_Clock_Source RTC Clock Source - * @{ - */ -#define RCC_RTCCLKSOURCE_NO_CLK 0x00000000U -#define RCC_RTCCLKSOURCE_LSE 0x00000100U -#define RCC_RTCCLKSOURCE_LSI 0x00000200U -#define RCC_RTCCLKSOURCE_HSE_DIVX 0x00000300U -#define RCC_RTCCLKSOURCE_HSE_DIV2 0x00020300U -#define RCC_RTCCLKSOURCE_HSE_DIV3 0x00030300U -#define RCC_RTCCLKSOURCE_HSE_DIV4 0x00040300U -#define RCC_RTCCLKSOURCE_HSE_DIV5 0x00050300U -#define RCC_RTCCLKSOURCE_HSE_DIV6 0x00060300U -#define RCC_RTCCLKSOURCE_HSE_DIV7 0x00070300U -#define RCC_RTCCLKSOURCE_HSE_DIV8 0x00080300U -#define RCC_RTCCLKSOURCE_HSE_DIV9 0x00090300U -#define RCC_RTCCLKSOURCE_HSE_DIV10 0x000A0300U -#define RCC_RTCCLKSOURCE_HSE_DIV11 0x000B0300U -#define RCC_RTCCLKSOURCE_HSE_DIV12 0x000C0300U -#define RCC_RTCCLKSOURCE_HSE_DIV13 0x000D0300U -#define RCC_RTCCLKSOURCE_HSE_DIV14 0x000E0300U -#define RCC_RTCCLKSOURCE_HSE_DIV15 0x000F0300U -#define RCC_RTCCLKSOURCE_HSE_DIV16 0x00100300U -#define RCC_RTCCLKSOURCE_HSE_DIV17 0x00110300U -#define RCC_RTCCLKSOURCE_HSE_DIV18 0x00120300U -#define RCC_RTCCLKSOURCE_HSE_DIV19 0x00130300U -#define RCC_RTCCLKSOURCE_HSE_DIV20 0x00140300U -#define RCC_RTCCLKSOURCE_HSE_DIV21 0x00150300U -#define RCC_RTCCLKSOURCE_HSE_DIV22 0x00160300U -#define RCC_RTCCLKSOURCE_HSE_DIV23 0x00170300U -#define RCC_RTCCLKSOURCE_HSE_DIV24 0x00180300U -#define RCC_RTCCLKSOURCE_HSE_DIV25 0x00190300U -#define RCC_RTCCLKSOURCE_HSE_DIV26 0x001A0300U -#define RCC_RTCCLKSOURCE_HSE_DIV27 0x001B0300U -#define RCC_RTCCLKSOURCE_HSE_DIV28 0x001C0300U -#define RCC_RTCCLKSOURCE_HSE_DIV29 0x001D0300U -#define RCC_RTCCLKSOURCE_HSE_DIV30 0x001E0300U -#define RCC_RTCCLKSOURCE_HSE_DIV31 0x001F0300U -/** - * @} - */ - -/** @defgroup RCC_MCO_Index MCO Index - * @{ - */ -#define RCC_MCO1 0x00000000U -#define RCC_MCO2 0x00000001U -/** - * @} - */ - -/** @defgroup RCC_MCO1_Clock_Source MCO1 Clock Source - * @{ - */ -#define RCC_MCO1SOURCE_HSI 0x00000000U -#define RCC_MCO1SOURCE_LSE RCC_CFGR_MCO1_0 -#define RCC_MCO1SOURCE_HSE RCC_CFGR_MCO1_1 -#define RCC_MCO1SOURCE_PLLCLK RCC_CFGR_MCO1 -/** - * @} - */ - -/** @defgroup RCC_MCOx_Clock_Prescaler MCOx Clock Prescaler - * @{ - */ -#define RCC_MCODIV_1 0x00000000U -#define RCC_MCODIV_2 RCC_CFGR_MCO1PRE_2 -#define RCC_MCODIV_3 ((uint32_t)RCC_CFGR_MCO1PRE_0 | RCC_CFGR_MCO1PRE_2) -#define RCC_MCODIV_4 ((uint32_t)RCC_CFGR_MCO1PRE_1 | RCC_CFGR_MCO1PRE_2) -#define RCC_MCODIV_5 RCC_CFGR_MCO1PRE -/** - * @} - */ - -/** @defgroup RCC_Interrupt Interrupts - * @{ - */ -#define RCC_IT_LSIRDY ((uint8_t)0x01) -#define RCC_IT_LSERDY ((uint8_t)0x02) -#define RCC_IT_HSIRDY ((uint8_t)0x04) -#define RCC_IT_HSERDY ((uint8_t)0x08) -#define RCC_IT_PLLRDY ((uint8_t)0x10) -#define RCC_IT_PLLI2SRDY ((uint8_t)0x20) -#define RCC_IT_CSS ((uint8_t)0x80) -/** - * @} - */ - -/** @defgroup RCC_Flag Flags - * Elements values convention: 0XXYYYYYb - * - YYYYY : Flag position in the register - * - 0XX : Register index - * - 01: CR register - * - 10: BDCR register - * - 11: CSR register - * @{ - */ -/* Flags in the CR register */ -#define RCC_FLAG_HSIRDY ((uint8_t)0x21) -#define RCC_FLAG_HSERDY ((uint8_t)0x31) -#define RCC_FLAG_PLLRDY ((uint8_t)0x39) -#define RCC_FLAG_PLLI2SRDY ((uint8_t)0x3B) - -/* Flags in the BDCR register */ -#define RCC_FLAG_LSERDY ((uint8_t)0x41) - -/* Flags in the CSR register */ -#define RCC_FLAG_LSIRDY ((uint8_t)0x61) -#define RCC_FLAG_BORRST ((uint8_t)0x79) -#define RCC_FLAG_PINRST ((uint8_t)0x7A) -#define RCC_FLAG_PORRST ((uint8_t)0x7B) -#define RCC_FLAG_SFTRST ((uint8_t)0x7C) -#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) -#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) -#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup RCC_Exported_Macros RCC Exported Macros - * @{ - */ - -/** @defgroup RCC_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOB_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOH_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DMA1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DMA2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_GPIOA_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOAEN)) -#define __HAL_RCC_GPIOB_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOBEN)) -#define __HAL_RCC_GPIOC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOCEN)) -#define __HAL_RCC_GPIOH_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOHEN)) -#define __HAL_RCC_DMA1_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA1EN)) -#define __HAL_RCC_DMA2_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2EN)) -/** - * @} - */ - -/** @defgroup RCC_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOA_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) != RESET) -#define __HAL_RCC_GPIOB_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) != RESET) -#define __HAL_RCC_GPIOC_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) != RESET) -#define __HAL_RCC_GPIOH_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) != RESET) -#define __HAL_RCC_DMA1_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) != RESET) -#define __HAL_RCC_DMA2_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) != RESET) - -#define __HAL_RCC_GPIOA_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) == RESET) -#define __HAL_RCC_GPIOB_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) == RESET) -#define __HAL_RCC_GPIOC_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) == RESET) -#define __HAL_RCC_GPIOH_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) == RESET) -#define __HAL_RCC_DMA1_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) == RESET) -#define __HAL_RCC_DMA2_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_WWDG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_PWR_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_TIM5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM5EN)) -#define __HAL_RCC_WWDG_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_WWDGEN)) -#define __HAL_RCC_SPI2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN)) -#define __HAL_RCC_USART2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART2EN)) -#define __HAL_RCC_I2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN)) -#define __HAL_RCC_I2C2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C2EN)) -#define __HAL_RCC_PWR_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_PWREN)) -/** - * @} - */ - -/** @defgroup RCC_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) != RESET) -#define __HAL_RCC_WWDG_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) != RESET) -#define __HAL_RCC_SPI2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) != RESET) -#define __HAL_RCC_USART2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) != RESET) -#define __HAL_RCC_I2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) != RESET) -#define __HAL_RCC_I2C2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) != RESET) -#define __HAL_RCC_PWR_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) != RESET) - -#define __HAL_RCC_TIM5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) == RESET) -#define __HAL_RCC_WWDG_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) == RESET) -#define __HAL_RCC_SPI2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) == RESET) -#define __HAL_RCC_USART2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) == RESET) -#define __HAL_RCC_I2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) == RESET) -#define __HAL_RCC_I2C2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) == RESET) -#define __HAL_RCC_PWR_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SYSCFG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM9_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM11_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_TIM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM1EN)) -#define __HAL_RCC_USART1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN)) -#define __HAL_RCC_USART6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART6EN)) -#define __HAL_RCC_ADC1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN)) -#define __HAL_RCC_SPI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN)) -#define __HAL_RCC_SYSCFG_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SYSCFGEN)) -#define __HAL_RCC_TIM9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM9EN)) -#define __HAL_RCC_TIM11_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM11EN)) -/** - * @} - */ - -/** @defgroup RCC_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) != RESET) -#define __HAL_RCC_USART1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) != RESET) -#define __HAL_RCC_USART6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) != RESET) -#define __HAL_RCC_ADC1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) != RESET) -#define __HAL_RCC_SPI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) != RESET) -#define __HAL_RCC_SYSCFG_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) != RESET) -#define __HAL_RCC_TIM9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) != RESET) -#define __HAL_RCC_TIM11_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) != RESET) - -#define __HAL_RCC_TIM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) == RESET) -#define __HAL_RCC_USART1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) == RESET) -#define __HAL_RCC_USART6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) == RESET) -#define __HAL_RCC_ADC1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) == RESET) -#define __HAL_RCC_SPI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) == RESET) -#define __HAL_RCC_SYSCFG_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) == RESET) -#define __HAL_RCC_TIM9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) == RESET) -#define __HAL_RCC_TIM11_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_GPIOA_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOARST)) -#define __HAL_RCC_GPIOB_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOBRST)) -#define __HAL_RCC_GPIOC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOCRST)) -#define __HAL_RCC_GPIOH_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOHRST)) -#define __HAL_RCC_DMA1_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA1RST)) -#define __HAL_RCC_DMA2_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2RST)) - -#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) -#define __HAL_RCC_GPIOA_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOARST)) -#define __HAL_RCC_GPIOB_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOBRST)) -#define __HAL_RCC_GPIOC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOCRST)) -#define __HAL_RCC_GPIOH_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOHRST)) -#define __HAL_RCC_DMA1_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA1RST)) -#define __HAL_RCC_DMA2_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2RST)) -/** - * @} - */ - -/** @defgroup RCC_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM5RST)) -#define __HAL_RCC_WWDG_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_WWDGRST)) -#define __HAL_RCC_SPI2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI2RST)) -#define __HAL_RCC_USART2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART2RST)) -#define __HAL_RCC_I2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C1RST)) -#define __HAL_RCC_I2C2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C2RST)) -#define __HAL_RCC_PWR_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_PWRRST)) - -#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) -#define __HAL_RCC_TIM5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM5RST)) -#define __HAL_RCC_WWDG_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_WWDGRST)) -#define __HAL_RCC_SPI2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI2RST)) -#define __HAL_RCC_USART2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART2RST)) -#define __HAL_RCC_I2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C1RST)) -#define __HAL_RCC_I2C2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C2RST)) -#define __HAL_RCC_PWR_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_PWRRST)) -/** - * @} - */ - -/** @defgroup RCC_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM1RST)) -#define __HAL_RCC_USART1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART1RST)) -#define __HAL_RCC_USART6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART6RST)) -#define __HAL_RCC_ADC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_ADCRST)) -#define __HAL_RCC_SPI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI1RST)) -#define __HAL_RCC_SYSCFG_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SYSCFGRST)) -#define __HAL_RCC_TIM9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM9RST)) -#define __HAL_RCC_TIM11_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM11RST)) - -#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) -#define __HAL_RCC_TIM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM1RST)) -#define __HAL_RCC_USART1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART1RST)) -#define __HAL_RCC_USART6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART6RST)) -#define __HAL_RCC_ADC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_ADCRST)) -#define __HAL_RCC_SPI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI1RST)) -#define __HAL_RCC_SYSCFG_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SYSCFGRST)) -#define __HAL_RCC_TIM9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM9RST)) -#define __HAL_RCC_TIM11_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM11RST)) -/** - * @} - */ - -/** @defgroup RCC_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOA_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOALPEN)) -#define __HAL_RCC_GPIOB_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOBLPEN)) -#define __HAL_RCC_GPIOC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOCLPEN)) -#define __HAL_RCC_GPIOH_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOHLPEN)) -#define __HAL_RCC_DMA1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA1LPEN)) -#define __HAL_RCC_DMA2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2LPEN)) - -#define __HAL_RCC_GPIOA_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOALPEN)) -#define __HAL_RCC_GPIOB_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOBLPEN)) -#define __HAL_RCC_GPIOC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOCLPEN)) -#define __HAL_RCC_GPIOH_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOHLPEN)) -#define __HAL_RCC_DMA1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA1LPEN)) -#define __HAL_RCC_DMA2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2LPEN)) -/** - * @} - */ - -/** @defgroup RCC_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM5LPEN)) -#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_WWDGLPEN)) -#define __HAL_RCC_SPI2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI2LPEN)) -#define __HAL_RCC_USART2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART2LPEN)) -#define __HAL_RCC_I2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C1LPEN)) -#define __HAL_RCC_I2C2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C2LPEN)) -#define __HAL_RCC_PWR_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_PWRLPEN)) - -#define __HAL_RCC_TIM5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM5LPEN)) -#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_WWDGLPEN)) -#define __HAL_RCC_SPI2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI2LPEN)) -#define __HAL_RCC_USART2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART2LPEN)) -#define __HAL_RCC_I2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C1LPEN)) -#define __HAL_RCC_I2C2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C2LPEN)) -#define __HAL_RCC_PWR_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_PWRLPEN)) -/** - * @} - */ - -/** @defgroup RCC_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM1LPEN)) -#define __HAL_RCC_USART1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART1LPEN)) -#define __HAL_RCC_USART6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART6LPEN)) -#define __HAL_RCC_ADC1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC1LPEN)) -#define __HAL_RCC_SPI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI1LPEN)) -#define __HAL_RCC_SYSCFG_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SYSCFGLPEN)) -#define __HAL_RCC_TIM9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM9LPEN)) -#define __HAL_RCC_TIM11_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM11LPEN)) - -#define __HAL_RCC_TIM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM1LPEN)) -#define __HAL_RCC_USART1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART1LPEN)) -#define __HAL_RCC_USART6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART6LPEN)) -#define __HAL_RCC_ADC1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC1LPEN)) -#define __HAL_RCC_SPI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI1LPEN)) -#define __HAL_RCC_SYSCFG_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SYSCFGLPEN)) -#define __HAL_RCC_TIM9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM9LPEN)) -#define __HAL_RCC_TIM11_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM11LPEN)) -/** - * @} - */ - -/** @defgroup RCC_HSI_Configuration HSI Configuration - * @{ - */ - -/** @brief Macros to enable or disable the Internal High Speed oscillator (HSI). - * @note The HSI is stopped by hardware when entering STOP and STANDBY modes. - * It is used (enabled by hardware) as system clock source after startup - * from Reset, wake-up from STOP and STANDBY mode, or in case of failure - * of the HSE used directly or indirectly as system clock (if the Clock - * Security System CSS is enabled). - * @note HSI can not be stopped if it is used as system clock source. In this case, - * you have to select another source of the system clock then stop the HSI. - * @note After enabling the HSI, the application software should wait on HSIRDY - * flag to be set indicating that HSI clock is stable and can be used as - * system clock source. - * This parameter can be: ENABLE or DISABLE. - * @note When the HSI is stopped, HSIRDY flag goes low after 6 HSI oscillator - * clock cycles. - */ -#define __HAL_RCC_HSI_ENABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = ENABLE) -#define __HAL_RCC_HSI_DISABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = DISABLE) - -/** @brief Macro to adjust the Internal High Speed oscillator (HSI) calibration value. - * @note The calibration is used to compensate for the variations in voltage - * and temperature that influence the frequency of the internal HSI RC. - * @param __HSICalibrationValue__ specifies the calibration trimming value. - * (default is RCC_HSICALIBRATION_DEFAULT). - * This parameter must be a number between 0 and 0x1F. - */ -#define __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(__HSICalibrationValue__) (MODIFY_REG(RCC->CR,\ - RCC_CR_HSITRIM, (uint32_t)(__HSICalibrationValue__) << RCC_CR_HSITRIM_Pos)) -/** - * @} - */ - -/** @defgroup RCC_LSI_Configuration LSI Configuration - * @{ - */ - -/** @brief Macros to enable or disable the Internal Low Speed oscillator (LSI). - * @note After enabling the LSI, the application software should wait on - * LSIRDY flag to be set indicating that LSI clock is stable and can - * be used to clock the IWDG and/or the RTC. - * @note LSI can not be disabled if the IWDG is running. - * @note When the LSI is stopped, LSIRDY flag goes low after 6 LSI oscillator - * clock cycles. - */ -#define __HAL_RCC_LSI_ENABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = ENABLE) -#define __HAL_RCC_LSI_DISABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = DISABLE) -/** - * @} - */ - -/** @defgroup RCC_HSE_Configuration HSE Configuration - * @{ - */ - -/** - * @brief Macro to configure the External High Speed oscillator (HSE). - * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not supported by this macro. - * User should request a transition to HSE Off first and then HSE On or HSE Bypass. - * @note After enabling the HSE (RCC_HSE_ON or RCC_HSE_Bypass), the application - * software should wait on HSERDY flag to be set indicating that HSE clock - * is stable and can be used to clock the PLL and/or system clock. - * @note HSE state can not be changed if it is used directly or through the - * PLL as system clock. In this case, you have to select another source - * of the system clock then change the HSE state (ex. disable it). - * @note The HSE is stopped by hardware when entering STOP and STANDBY modes. - * @note This function reset the CSSON bit, so if the clock security system(CSS) - * was previously enabled you have to enable it again after calling this - * function. - * @param __STATE__ specifies the new state of the HSE. - * This parameter can be one of the following values: - * @arg RCC_HSE_OFF: turn OFF the HSE oscillator, HSERDY flag goes low after - * 6 HSE oscillator clock cycles. - * @arg RCC_HSE_ON: turn ON the HSE oscillator. - * @arg RCC_HSE_BYPASS: HSE oscillator bypassed with external clock. - */ -#define __HAL_RCC_HSE_CONFIG(__STATE__) \ - do { \ - if ((__STATE__) == RCC_HSE_ON) \ - { \ - SET_BIT(RCC->CR, RCC_CR_HSEON); \ - } \ - else if ((__STATE__) == RCC_HSE_BYPASS) \ - { \ - SET_BIT(RCC->CR, RCC_CR_HSEBYP); \ - SET_BIT(RCC->CR, RCC_CR_HSEON); \ - } \ - else \ - { \ - CLEAR_BIT(RCC->CR, RCC_CR_HSEON); \ - CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); \ - } \ - } while(0U) -/** - * @} - */ - -/** @defgroup RCC_LSE_Configuration LSE Configuration - * @{ - */ - -/** - * @brief Macro to configure the External Low Speed oscillator (LSE). - * @note Transition LSE Bypass to LSE On and LSE On to LSE Bypass are not supported by this macro. - * User should request a transition to LSE Off first and then LSE On or LSE Bypass. - * @note As the LSE is in the Backup domain and write access is denied to - * this domain after reset, you have to enable write access using - * HAL_PWR_EnableBkUpAccess() function before to configure the LSE - * (to be done once after reset). - * @note After enabling the LSE (RCC_LSE_ON or RCC_LSE_BYPASS), the application - * software should wait on LSERDY flag to be set indicating that LSE clock - * is stable and can be used to clock the RTC. - * @param __STATE__ specifies the new state of the LSE. - * This parameter can be one of the following values: - * @arg RCC_LSE_OFF: turn OFF the LSE oscillator, LSERDY flag goes low after - * 6 LSE oscillator clock cycles. - * @arg RCC_LSE_ON: turn ON the LSE oscillator. - * @arg RCC_LSE_BYPASS: LSE oscillator bypassed with external clock. - */ -#define __HAL_RCC_LSE_CONFIG(__STATE__) \ - do { \ - if((__STATE__) == RCC_LSE_ON) \ - { \ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ - } \ - else if((__STATE__) == RCC_LSE_BYPASS) \ - { \ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ - } \ - else \ - { \ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ - } \ - } while(0U) -/** - * @} - */ - -/** @defgroup RCC_Internal_RTC_Clock_Configuration RTC Clock Configuration - * @{ - */ - -/** @brief Macros to enable or disable the RTC clock. - * @note These macros must be used only after the RTC clock source was selected. - */ -#define __HAL_RCC_RTC_ENABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = ENABLE) -#define __HAL_RCC_RTC_DISABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = DISABLE) - -/** @brief Macros to configure the RTC clock (RTCCLK). - * @note As the RTC clock configuration bits are in the Backup domain and write - * access is denied to this domain after reset, you have to enable write - * access using the Power Backup Access macro before to configure - * the RTC clock source (to be done once after reset). - * @note Once the RTC clock is configured it can't be changed unless the - * Backup domain is reset using __HAL_RCC_BackupReset_RELEASE() macro, or by - * a Power On Reset (POR). - * @param __RTCCLKSource__ specifies the RTC clock source. - * This parameter can be one of the following values: - * @arg @ref RCC_RTCCLKSOURCE_NO_CLK : No clock selected as RTC clock. - * @arg @ref RCC_RTCCLKSOURCE_LSE : LSE selected as RTC clock. - * @arg @ref RCC_RTCCLKSOURCE_LSI : LSI selected as RTC clock. - * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() - * @note If the LSE or LSI is used as RTC clock source, the RTC continues to - * work in STOP and STANDBY modes, and can be used as wake-up source. - * However, when the HSE clock is used as RTC clock source, the RTC - * cannot be used in STOP and STANDBY modes. - * @note The maximum input clock frequency for RTC is 1MHz (when using HSE as - * RTC clock source). - */ -#define __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__) (((__RTCCLKSource__) & RCC_BDCR_RTCSEL) == RCC_BDCR_RTCSEL) ? \ - MODIFY_REG(RCC->CFGR, RCC_CFGR_RTCPRE, ((__RTCCLKSource__) & 0xFFFFCFFU)) : CLEAR_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) - -#define __HAL_RCC_RTC_CONFIG(__RTCCLKSource__) do { __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__); \ - RCC->BDCR |= ((__RTCCLKSource__) & 0x00000FFFU); \ - } while(0U) - -/** @brief Macro to get the RTC clock source. - * @retval The clock source can be one of the following values: - * @arg @ref RCC_RTCCLKSOURCE_NO_CLK No clock selected as RTC clock - * @arg @ref RCC_RTCCLKSOURCE_LSE LSE selected as RTC clock - * @arg @ref RCC_RTCCLKSOURCE_LSI LSI selected as RTC clock - * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() - */ -#define __HAL_RCC_GET_RTC_SOURCE() (READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)) - -/** - * @brief Get the RTC and HSE clock divider (RTCPRE). - * @retval Returned value can be one of the following values: - * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() - */ -#define __HAL_RCC_GET_RTC_HSE_PRESCALER() (READ_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) | RCC_BDCR_RTCSEL) - -/** @brief Macros to force or release the Backup domain reset. - * @note This function resets the RTC peripheral (including the backup registers) - * and the RTC clock source selection in RCC_CSR register. - * @note The BKPSRAM is not affected by this reset. - */ -#define __HAL_RCC_BACKUPRESET_FORCE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = ENABLE) -#define __HAL_RCC_BACKUPRESET_RELEASE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = DISABLE) -/** - * @} - */ - -/** @defgroup RCC_PLL_Configuration PLL Configuration - * @{ - */ - -/** @brief Macros to enable or disable the main PLL. - * @note After enabling the main PLL, the application software should wait on - * PLLRDY flag to be set indicating that PLL clock is stable and can - * be used as system clock source. - * @note The main PLL can not be disabled if it is used as system clock source - * @note The main PLL is disabled by hardware when entering STOP and STANDBY modes. - */ -#define __HAL_RCC_PLL_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = ENABLE) -#define __HAL_RCC_PLL_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = DISABLE) - -/** @brief Macro to configure the PLL clock source. - * @note This function must be used only when the main PLL is disabled. - * @param __PLLSOURCE__ specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry - * - */ -#define __HAL_RCC_PLL_PLLSOURCE_CONFIG(__PLLSOURCE__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, (__PLLSOURCE__)) - -/** @brief Macro to configure the PLL multiplication factor. - * @note This function must be used only when the main PLL is disabled. - * @param __PLLM__ specifies the division factor for PLL VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * - */ -#define __HAL_RCC_PLL_PLLM_CONFIG(__PLLM__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, (__PLLM__)) -/** - * @} - */ - -/** @defgroup RCC_Get_Clock_source Get Clock source - * @{ - */ -/** - * @brief Macro to configure the system clock source. - * @param __RCC_SYSCLKSOURCE__ specifies the system clock source. - * This parameter can be one of the following values: - * - RCC_SYSCLKSOURCE_HSI: HSI oscillator is used as system clock source. - * - RCC_SYSCLKSOURCE_HSE: HSE oscillator is used as system clock source. - * - RCC_SYSCLKSOURCE_PLLCLK: PLL output is used as system clock source. - * - RCC_SYSCLKSOURCE_PLLRCLK: PLLR output is used as system clock source. This - * parameter is available only for STM32F446xx devices. - */ -#define __HAL_RCC_SYSCLK_CONFIG(__RCC_SYSCLKSOURCE__) MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, (__RCC_SYSCLKSOURCE__)) - -/** @brief Macro to get the clock source used as system clock. - * @retval The clock source used as system clock. The returned value can be one - * of the following: - * - RCC_SYSCLKSOURCE_STATUS_HSI: HSI used as system clock. - * - RCC_SYSCLKSOURCE_STATUS_HSE: HSE used as system clock. - * - RCC_SYSCLKSOURCE_STATUS_PLLCLK: PLL used as system clock. - * - RCC_SYSCLKSOURCE_STATUS_PLLRCLK: PLLR used as system clock. This parameter - * is available only for STM32F446xx devices. - */ -#define __HAL_RCC_GET_SYSCLK_SOURCE() (RCC->CFGR & RCC_CFGR_SWS) - -/** @brief Macro to get the oscillator used as PLL clock source. - * @retval The oscillator used as PLL clock source. The returned value can be one - * of the following: - * - RCC_PLLSOURCE_HSI: HSI oscillator is used as PLL clock source. - * - RCC_PLLSOURCE_HSE: HSE oscillator is used as PLL clock source. - */ -#define __HAL_RCC_GET_PLL_OSCSOURCE() ((uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC)) -/** - * @} - */ - -/** @defgroup RCCEx_MCOx_Clock_Config RCC Extended MCOx Clock Config - * @{ - */ - -/** @brief Macro to configure the MCO1 clock. - * @param __MCOCLKSOURCE__ specifies the MCO clock source. - * This parameter can be one of the following values: - * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source - * @param __MCODIV__ specifies the MCO clock prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCODIV_1: no division applied to MCOx clock - * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock - * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock - * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock - * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock - */ -#define __HAL_RCC_MCO1_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), ((__MCOCLKSOURCE__) | (__MCODIV__))) - -/** @brief Macro to configure the MCO2 clock. - * @param __MCOCLKSOURCE__ specifies the MCO clock source. - * This parameter can be one of the following values: - * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx - * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices - * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source - * @param __MCODIV__ specifies the MCO clock prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCODIV_1: no division applied to MCOx clock - * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock - * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock - * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock - * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock - * @note For STM32F410Rx devices, to output I2SCLK clock on MCO2, you should have - * at least one of the SPI clocks enabled (SPI1, SPI2 or SPI5). - */ -#define __HAL_RCC_MCO2_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), ((__MCOCLKSOURCE__) | ((__MCODIV__) << 3U))); -/** - * @} - */ - -/** @defgroup RCC_Flags_Interrupts_Management Flags Interrupts Management - * @brief macros to manage the specified RCC Flags and interrupts. - * @{ - */ - -/** @brief Enable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to enable - * the selected interrupts). - * @param __INTERRUPT__ specifies the RCC interrupt sources to be enabled. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - */ -#define __HAL_RCC_ENABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS |= (__INTERRUPT__)) - -/** @brief Disable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to disable - * the selected interrupts). - * @param __INTERRUPT__ specifies the RCC interrupt sources to be disabled. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - */ -#define __HAL_RCC_DISABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS &= (uint8_t)(~(__INTERRUPT__))) - -/** @brief Clear the RCC's interrupt pending bits (Perform Byte access to RCC_CIR[23:16] - * bits to clear the selected interrupt pending bits. - * @param __INTERRUPT__ specifies the interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - * @arg RCC_IT_CSS: Clock Security System interrupt - */ -#define __HAL_RCC_CLEAR_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE2_ADDRESS = (__INTERRUPT__)) - -/** @brief Check the RCC's interrupt has occurred or not. - * @param __INTERRUPT__ specifies the RCC interrupt source to check. - * This parameter can be one of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - * @arg RCC_IT_CSS: Clock Security System interrupt - * @retval The new state of __INTERRUPT__ (TRUE or FALSE). - */ -#define __HAL_RCC_GET_IT(__INTERRUPT__) ((RCC->CIR & (__INTERRUPT__)) == (__INTERRUPT__)) - -/** @brief Set RMVF bit to clear the reset flags: RCC_FLAG_PINRST, RCC_FLAG_PORRST, - * RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST and RCC_FLAG_LPWRRST. - */ -#define __HAL_RCC_CLEAR_RESET_FLAGS() (RCC->CSR |= RCC_CSR_RMVF) - -/** @brief Check RCC flag is set or not. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready. - * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready. - * @arg RCC_FLAG_PLLRDY: Main PLL clock ready. - * @arg RCC_FLAG_PLLI2SRDY: PLLI2S clock ready. - * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready. - * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready. - * @arg RCC_FLAG_BORRST: POR/PDR or BOR reset. - * @arg RCC_FLAG_PINRST: Pin reset. - * @arg RCC_FLAG_PORRST: POR/PDR reset. - * @arg RCC_FLAG_SFTRST: Software reset. - * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset. - * @arg RCC_FLAG_WWDGRST: Window Watchdog reset. - * @arg RCC_FLAG_LPWRRST: Low Power reset. - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define RCC_FLAG_MASK ((uint8_t)0x1FU) -#define __HAL_RCC_GET_FLAG(__FLAG__) (((((((__FLAG__) >> 5U)\ - == 1U)? RCC->CR :((((__FLAG__) >> 5U) == 2U) ? RCC->BDCR :((((__FLAG__) >> 5U) == 3U)? RCC->CSR :RCC->CIR))) &\ - (1U << ((__FLAG__) & RCC_FLAG_MASK)))!= 0U)? 1U : 0U) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup RCC_Exported_Functions - * @{ - */ - -/** @addtogroup RCC_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions ******************************/ -HAL_StatusTypeDef HAL_RCC_DeInit(void); -HAL_StatusTypeDef HAL_RCC_OscConfig(const RCC_OscInitTypeDef *RCC_OscInitStruct); -HAL_StatusTypeDef HAL_RCC_ClockConfig(const RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency); -/** - * @} - */ - -/** @addtogroup RCC_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions ************************************************/ -void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv); -void HAL_RCC_EnableCSS(void); -void HAL_RCC_DisableCSS(void); -uint32_t HAL_RCC_GetSysClockFreq(void); -uint32_t HAL_RCC_GetHCLKFreq(void); -uint32_t HAL_RCC_GetPCLK1Freq(void); -uint32_t HAL_RCC_GetPCLK2Freq(void); -void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct); -void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency); - -/* CSS NMI IRQ handler */ -void HAL_RCC_NMI_IRQHandler(void); - -/* User Callbacks in non blocking mode (IT mode) */ -void HAL_RCC_CSSCallback(void); - -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup RCC_Private_Constants RCC Private Constants - * @{ - */ - -/** @defgroup RCC_BitAddress_AliasRegion RCC BitAddress AliasRegion - * @brief RCC registers bit address in the alias region - * @{ - */ -#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) -/* --- CR Register --- */ -/* Alias word address of HSION bit */ -#define RCC_CR_OFFSET (RCC_OFFSET + 0x00U) -#define RCC_HSION_BIT_NUMBER 0x00U -#define RCC_CR_HSION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_HSION_BIT_NUMBER * 4U)) -/* Alias word address of CSSON bit */ -#define RCC_CSSON_BIT_NUMBER 0x13U -#define RCC_CR_CSSON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_CSSON_BIT_NUMBER * 4U)) -/* Alias word address of PLLON bit */ -#define RCC_PLLON_BIT_NUMBER 0x18U -#define RCC_CR_PLLON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLON_BIT_NUMBER * 4U)) - -/* --- BDCR Register --- */ -/* Alias word address of RTCEN bit */ -#define RCC_BDCR_OFFSET (RCC_OFFSET + 0x70U) -#define RCC_RTCEN_BIT_NUMBER 0x0FU -#define RCC_BDCR_RTCEN_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_RTCEN_BIT_NUMBER * 4U)) -/* Alias word address of BDRST bit */ -#define RCC_BDRST_BIT_NUMBER 0x10U -#define RCC_BDCR_BDRST_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_BDRST_BIT_NUMBER * 4U)) - -/* --- CSR Register --- */ -/* Alias word address of LSION bit */ -#define RCC_CSR_OFFSET (RCC_OFFSET + 0x74U) -#define RCC_LSION_BIT_NUMBER 0x00U -#define RCC_CSR_LSION_BB (PERIPH_BB_BASE + (RCC_CSR_OFFSET * 32U) + (RCC_LSION_BIT_NUMBER * 4U)) - -/* CR register byte 3 (Bits[23:16]) base address */ -#define RCC_CR_BYTE2_ADDRESS 0x40023802U - -/* CIR register byte 2 (Bits[15:8]) base address */ -#define RCC_CIR_BYTE1_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x01U)) - -/* CIR register byte 3 (Bits[23:16]) base address */ -#define RCC_CIR_BYTE2_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x02U)) - -/* BDCR register base address */ -#define RCC_BDCR_BYTE0_ADDRESS (PERIPH_BASE + RCC_BDCR_OFFSET) - -#define RCC_DBP_TIMEOUT_VALUE 2U -#define RCC_LSE_TIMEOUT_VALUE LSE_STARTUP_TIMEOUT - -#define HSE_TIMEOUT_VALUE HSE_STARTUP_TIMEOUT -#define HSI_TIMEOUT_VALUE 2U /* 2 ms */ -#define LSI_TIMEOUT_VALUE 2U /* 2 ms */ -#define CLOCKSWITCH_TIMEOUT_VALUE 5000U /* 5 s */ - -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup RCC_Private_Macros RCC Private Macros - * @{ - */ - -/** @defgroup RCC_IS_RCC_Definitions RCC Private macros to check input parameters - * @{ - */ -#define IS_RCC_OSCILLATORTYPE(OSCILLATOR) ((OSCILLATOR) <= 15U) - -#define IS_RCC_HSE(HSE) (((HSE) == RCC_HSE_OFF) || ((HSE) == RCC_HSE_ON) || \ - ((HSE) == RCC_HSE_BYPASS)) - -#define IS_RCC_LSE(LSE) (((LSE) == RCC_LSE_OFF) || ((LSE) == RCC_LSE_ON) || \ - ((LSE) == RCC_LSE_BYPASS)) - -#define IS_RCC_HSI(HSI) (((HSI) == RCC_HSI_OFF) || ((HSI) == RCC_HSI_ON)) - -#define IS_RCC_LSI(LSI) (((LSI) == RCC_LSI_OFF) || ((LSI) == RCC_LSI_ON)) - -#define IS_RCC_PLL(PLL) (((PLL) == RCC_PLL_NONE) ||((PLL) == RCC_PLL_OFF) || ((PLL) == RCC_PLL_ON)) - -#define IS_RCC_PLLSOURCE(SOURCE) (((SOURCE) == RCC_PLLSOURCE_HSI) || \ - ((SOURCE) == RCC_PLLSOURCE_HSE)) - -#define IS_RCC_SYSCLKSOURCE(SOURCE) (((SOURCE) == RCC_SYSCLKSOURCE_HSI) || \ - ((SOURCE) == RCC_SYSCLKSOURCE_HSE) || \ - ((SOURCE) == RCC_SYSCLKSOURCE_PLLCLK) || \ - ((SOURCE) == RCC_SYSCLKSOURCE_PLLRCLK)) - -#define IS_RCC_RTCCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_RTCCLKSOURCE_LSE) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_LSI) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV2) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV3) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV4) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV5) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV6) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV7) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV8) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV9) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV10) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV11) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV12) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV13) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV14) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV15) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV16) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV17) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV18) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV19) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV20) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV21) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV22) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV23) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV24) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV25) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV26) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV27) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV28) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV29) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV30) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV31)) - -#define IS_RCC_PLLM_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 63U)) - -#define IS_RCC_PLLP_VALUE(VALUE) (((VALUE) == 2U) || ((VALUE) == 4U) || ((VALUE) == 6U) || ((VALUE) == 8U)) - -#define IS_RCC_PLLQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_HCLK(HCLK) (((HCLK) == RCC_SYSCLK_DIV1) || ((HCLK) == RCC_SYSCLK_DIV2) || \ - ((HCLK) == RCC_SYSCLK_DIV4) || ((HCLK) == RCC_SYSCLK_DIV8) || \ - ((HCLK) == RCC_SYSCLK_DIV16) || ((HCLK) == RCC_SYSCLK_DIV64) || \ - ((HCLK) == RCC_SYSCLK_DIV128) || ((HCLK) == RCC_SYSCLK_DIV256) || \ - ((HCLK) == RCC_SYSCLK_DIV512)) - -#define IS_RCC_CLOCKTYPE(CLK) ((1U <= (CLK)) && ((CLK) <= 15U)) - -#define IS_RCC_PCLK(PCLK) (((PCLK) == RCC_HCLK_DIV1) || ((PCLK) == RCC_HCLK_DIV2) || \ - ((PCLK) == RCC_HCLK_DIV4) || ((PCLK) == RCC_HCLK_DIV8) || \ - ((PCLK) == RCC_HCLK_DIV16)) - -#define IS_RCC_MCO(MCOx) (((MCOx) == RCC_MCO1) || ((MCOx) == RCC_MCO2)) - -#define IS_RCC_MCO1SOURCE(SOURCE) (((SOURCE) == RCC_MCO1SOURCE_HSI) || ((SOURCE) == RCC_MCO1SOURCE_LSE) || \ - ((SOURCE) == RCC_MCO1SOURCE_HSE) || ((SOURCE) == RCC_MCO1SOURCE_PLLCLK)) - -#define IS_RCC_MCODIV(DIV) (((DIV) == RCC_MCODIV_1) || ((DIV) == RCC_MCODIV_2) || \ - ((DIV) == RCC_MCODIV_3) || ((DIV) == RCC_MCODIV_4) || \ - ((DIV) == RCC_MCODIV_5)) -#define IS_RCC_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1FU) - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_RCC_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h deleted file mode 100644 index 3b62134..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h +++ /dev/null @@ -1,7190 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc_ex.h - * @author MCD Application Team - * @brief Header file of RCC HAL Extension module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_RCC_EX_H -#define __STM32F4xx_HAL_RCC_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup RCCEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Types RCCEx Exported Types - * @{ - */ - -/** - * @brief RCC PLL configuration structure definition - */ -typedef struct -{ - uint32_t PLLState; /*!< The new state of the PLL. - This parameter can be a value of @ref RCC_PLL_Config */ - - uint32_t PLLSource; /*!< RCC_PLLSource: PLL entry clock source. - This parameter must be a value of @ref RCC_PLL_Clock_Source */ - - uint32_t PLLM; /*!< PLLM: Division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 0 and Max_Data = 63 */ - - uint32_t PLLN; /*!< PLLN: Multiplication factor for PLL VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 - except for STM32F411xE devices where the Min_Data = 192 */ - - uint32_t PLLP; /*!< PLLP: Division factor for main system clock (SYSCLK). - This parameter must be a value of @ref RCC_PLLP_Clock_Divider */ - - uint32_t PLLQ; /*!< PLLQ: Division factor for OTG FS, SDIO and RNG clocks. - This parameter must be a number between Min_Data = 2 and Max_Data = 15 */ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) - uint32_t PLLR; /*!< PLLR: PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. - This parameter is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx - and STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. - This parameter must be a number between Min_Data = 2 and Max_Data = 7 */ -#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -} RCC_PLLInitTypeDef; - -#if defined(STM32F446xx) -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ - uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ - - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ - - uint32_t PLLI2SP; /*!< Specifies division factor for SPDIFRX Clock. - This parameter must be a value of @ref RCCEx_PLLI2SP_Clock_Divider */ - - uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S */ -} RCC_PLLI2SInitTypeDef; - -/** - * @brief PLLSAI Clock structure definition - */ -typedef struct -{ - uint32_t PLLSAIM; /*!< Specifies division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ - - uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ - - uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS, SDIO and RNG clocks. - This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ - - uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLSAI is selected as Clock Source SAI */ -} RCC_PLLSAIInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ - - uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLSAI is selected as Clock Source SAI */ - - uint32_t Sai1ClockSelection; /*!< Specifies SAI1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_SAI1_Clock_Source */ - - uint32_t Sai2ClockSelection; /*!< Specifies SAI2 Clock Source Selection. - This parameter can be a value of @ref RCCEx_SAI2_Clock_Source */ - - uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ - - uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. - This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ - - uint32_t CecClockSelection; /*!< Specifies CEC Clock Source Selection. - This parameter can be a value of @ref RCCEx_CEC_Clock_Source */ - - uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ - - uint32_t SpdifClockSelection; /*!< Specifies SPDIFRX Clock Source Selection. - This parameter can be a value of @ref RCCEx_SPDIFRX_Clock_Source */ - - uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. - This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -} RCC_PeriphCLKInitTypeDef; -#endif /* STM32F446xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - uint32_t I2SClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2S_APB_Clock_Source */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ - - uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -} RCC_PeriphCLKInitTypeDef; -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ - uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ - - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ - - uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S */ -} RCC_PLLI2SInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S */ - -#if defined(STM32F413xx) || defined(STM32F423xx) - uint32_t PLLDivR; /*!< Specifies the PLL division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLL is selected as Clock Source SAI */ - - uint32_t PLLI2SDivR; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ -#endif /* STM32F413xx || STM32F423xx */ - - uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ - - uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. - This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ - - uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ - - uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. - This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ - - uint32_t Dfsdm1ClockSelection; /*!< Specifies DFSDM1 Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM1_Kernel_Clock_Source */ - - uint32_t Dfsdm1AudioClockSelection;/*!< Specifies DFSDM1 Audio Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM1_Audio_Clock_Source */ - -#if defined(STM32F413xx) || defined(STM32F423xx) - uint32_t Dfsdm2ClockSelection; /*!< Specifies DFSDM2 Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM2_Kernel_Clock_Source */ - - uint32_t Dfsdm2AudioClockSelection;/*!< Specifies DFSDM2 Audio Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM2_Audio_Clock_Source */ - - uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ - - uint32_t SaiAClockSelection; /*!< Specifies SAI1_A Clock Prescalers Selection - This parameter can be a value of @ref RCCEx_SAI1_BlockA_Clock_Source */ - - uint32_t SaiBClockSelection; /*!< Specifies SAI1_B Clock Prescalers Selection - This parameter can be a value of @ref RCCEx_SAI1_BlockB_Clock_Source */ -#endif /* STM32F413xx || STM32F423xx */ - - uint32_t PLLI2SSelection; /*!< Specifies PLL I2S Clock Source Selection. - This parameter can be a value of @ref RCCEx_PLL_I2S_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -} RCC_PeriphCLKInitTypeDef; -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI1 clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ -} RCC_PLLI2SInitTypeDef; - -/** - * @brief PLLSAI Clock structure definition - */ -typedef struct -{ - uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432. - This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ -#if defined(STM32F469xx) || defined(STM32F479xx) - uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS and SDIO clocks. - This parameter is only available in STM32F469xx/STM32F479xx devices. - This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ -#endif /* STM32F469xx || STM32F479xx */ - - uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI1 clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ - - uint32_t PLLSAIR; /*!< specifies the division factor for LTDC clock - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLSAI is selected as Clock Source LTDC */ - -} RCC_PLLSAIInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ - - uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLSAI is selected as Clock Source SAI */ - - uint32_t PLLSAIDivR; /*!< Specifies the PLLSAI division factor for LTDC clock. - This parameter must be one value of @ref RCCEx_PLLSAI_DIVR */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Prescalers Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -#if defined(STM32F469xx) || defined(STM32F479xx) - uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. - This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ - - uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. - This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ -#endif /* STM32F469xx || STM32F479xx */ -} RCC_PeriphCLKInitTypeDef; - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ -#if defined(STM32F411xE) - uint32_t PLLI2SM; /*!< PLLM: Division factor for PLLI2S VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 62 */ -#endif /* STM32F411xE */ - - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 - Except for STM32F411xE devices where the Min_Data = 192. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - -} RCC_PLLI2SInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ -} RCC_PeriphCLKInitTypeDef; -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Constants RCCEx Exported Constants - * @{ - */ - -/** @defgroup RCCEx_Periph_Clock_Selection RCC Periph Clock Selection - * @{ - */ -/* Peripheral Clock source for STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -#define RCC_PERIPHCLK_I2S_APB1 0x00000001U -#define RCC_PERIPHCLK_I2S_APB2 0x00000002U -#define RCC_PERIPHCLK_TIM 0x00000004U -#define RCC_PERIPHCLK_RTC 0x00000008U -#define RCC_PERIPHCLK_FMPI2C1 0x00000010U -#define RCC_PERIPHCLK_CLK48 0x00000020U -#define RCC_PERIPHCLK_SDIO 0x00000040U -#define RCC_PERIPHCLK_PLLI2S 0x00000080U -#define RCC_PERIPHCLK_DFSDM1 0x00000100U -#define RCC_PERIPHCLK_DFSDM1_AUDIO 0x00000200U -#endif /* STM32F412Zx || STM32F412Vx) || STM32F412Rx || STM32F412Cx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define RCC_PERIPHCLK_DFSDM2 0x00000400U -#define RCC_PERIPHCLK_DFSDM2_AUDIO 0x00000800U -#define RCC_PERIPHCLK_LPTIM1 0x00001000U -#define RCC_PERIPHCLK_SAIA 0x00002000U -#define RCC_PERIPHCLK_SAIB 0x00004000U -#endif /* STM32F413xx || STM32F423xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------- Peripheral Clock source for STM32F410xx ----------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_TIM 0x00000002U -#define RCC_PERIPHCLK_RTC 0x00000004U -#define RCC_PERIPHCLK_FMPI2C1 0x00000008U -#define RCC_PERIPHCLK_LPTIM1 0x00000010U -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/*----------------------------------------------------------------------------*/ - -/*------------------- Peripheral Clock source for STM32F446xx ----------------*/ -#if defined(STM32F446xx) -#define RCC_PERIPHCLK_I2S_APB1 0x00000001U -#define RCC_PERIPHCLK_I2S_APB2 0x00000002U -#define RCC_PERIPHCLK_SAI1 0x00000004U -#define RCC_PERIPHCLK_SAI2 0x00000008U -#define RCC_PERIPHCLK_TIM 0x00000010U -#define RCC_PERIPHCLK_RTC 0x00000020U -#define RCC_PERIPHCLK_CEC 0x00000040U -#define RCC_PERIPHCLK_FMPI2C1 0x00000080U -#define RCC_PERIPHCLK_CLK48 0x00000100U -#define RCC_PERIPHCLK_SDIO 0x00000200U -#define RCC_PERIPHCLK_SPDIFRX 0x00000400U -#define RCC_PERIPHCLK_PLLI2S 0x00000800U -#endif /* STM32F446xx */ -/*-----------------------------------------------------------------------------*/ - -/*----------- Peripheral Clock source for STM32F469xx/STM32F479xx -------------*/ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U -#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U -#define RCC_PERIPHCLK_LTDC 0x00000008U -#define RCC_PERIPHCLK_TIM 0x00000010U -#define RCC_PERIPHCLK_RTC 0x00000020U -#define RCC_PERIPHCLK_PLLI2S 0x00000040U -#define RCC_PERIPHCLK_CLK48 0x00000080U -#define RCC_PERIPHCLK_SDIO 0x00000100U -#endif /* STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*-------- Peripheral Clock source for STM32F42xxx/STM32F43xxx ---------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U -#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U -#define RCC_PERIPHCLK_LTDC 0x00000008U -#define RCC_PERIPHCLK_TIM 0x00000010U -#define RCC_PERIPHCLK_RTC 0x00000020U -#define RCC_PERIPHCLK_PLLI2S 0x00000040U -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -/*----------------------------------------------------------------------------*/ - -/*-------- Peripheral Clock source for STM32F40xxx/STM32F41xxx ---------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_RTC 0x00000002U -#define RCC_PERIPHCLK_PLLI2S 0x00000004U -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define RCC_PERIPHCLK_TIM 0x00000008U -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ -/*----------------------------------------------------------------------------*/ -/** - * @} - */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) || \ - defined(STM32F479xx) -/** @defgroup RCCEx_I2S_Clock_Source I2S Clock Source - * @{ - */ -#define RCC_I2SCLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SCLKSOURCE_EXT RCC_CFGR_I2SSRC -/** - * @} - */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F469xx || STM32F479xx */ - -/** @defgroup RCCEx_PLLSAI_DIVR RCC PLLSAI DIVR - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PLLSAIDIVR_2 0x00000000U -#define RCC_PLLSAIDIVR_4 0x00010000U -#define RCC_PLLSAIDIVR_8 0x00020000U -#define RCC_PLLSAIDIVR_16 0x00030000U -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_PLLI2SP_Clock_Divider RCC PLLI2SP Clock Divider - * @{ - */ -#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) -#define RCC_PLLI2SP_DIV2 0x00000002U -#define RCC_PLLI2SP_DIV4 0x00000004U -#define RCC_PLLI2SP_DIV6 0x00000006U -#define RCC_PLLI2SP_DIV8 0x00000008U -#endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -/** - * @} - */ - -/** @defgroup RCCEx_PLLSAIP_Clock_Divider RCC PLLSAIP Clock Divider - * @{ - */ -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PLLSAIP_DIV2 0x00000002U -#define RCC_PLLSAIP_DIV4 0x00000004U -#define RCC_PLLSAIP_DIV6 0x00000006U -#define RCC_PLLSAIP_DIV8 0x00000008U -#endif /* STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @defgroup RCCEx_SAI_BlockA_Clock_Source RCC SAI BlockA Clock Source - * @{ - */ -#define RCC_SAIACLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAIACLKSOURCE_PLLI2S 0x00100000U -#define RCC_SAIACLKSOURCE_EXT 0x00200000U -/** - * @} - */ - -/** @defgroup RCCEx_SAI_BlockB_Clock_Source RCC SAI BlockB Clock Source - * @{ - */ -#define RCC_SAIBCLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAIBCLKSOURCE_PLLI2S 0x00400000U -#define RCC_SAIBCLKSOURCE_EXT 0x00800000U -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source - * @{ - */ -#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U -#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR_CK48MSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source - * @{ - */ -#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U -#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_SDIOSEL) -/** - * @} - */ - -/** @defgroup RCCEx_DSI_Clock_Source RCC DSI Clock Source - * @{ - */ -#define RCC_DSICLKSOURCE_DSIPHY 0x00000000U -#define RCC_DSICLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_DSISEL) -/** - * @} - */ -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F446xx) -/** @defgroup RCCEx_SAI1_Clock_Source RCC SAI1 Clock Source - * @{ - */ -#define RCC_SAI1CLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAI1CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI1SRC_0) -#define RCC_SAI1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1SRC_1) -#define RCC_SAI1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1SRC) -/** - * @} - */ - -/** @defgroup RCCEx_SAI2_Clock_Source RCC SAI2 Clock Source - * @{ - */ -#define RCC_SAI2CLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAI2CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI2SRC_0) -#define RCC_SAI2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI2SRC_1) -#define RCC_SAI2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI2SRC) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source - * @{ - */ -#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) -#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) -#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source - * @{ - */ -#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) -#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) -#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) -/** - * @} - */ - -/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source - * @{ - */ -#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) -/** - * @} - */ - -/** @defgroup RCCEx_CEC_Clock_Source RCC CEC Clock Source - * @{ - */ -#define RCC_CECCLKSOURCE_HSI 0x00000000U -#define RCC_CECCLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_CECSEL) -/** - * @} - */ - -/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source - * @{ - */ -#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U -#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR2_CK48MSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source - * @{ - */ -#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U -#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SPDIFRX_Clock_Source RCC SPDIFRX Clock Source - * @{ - */ -#define RCC_SPDIFRXCLKSOURCE_PLLR 0x00000000U -#define RCC_SPDIFRXCLKSOURCE_PLLI2SP ((uint32_t)RCC_DCKCFGR2_SPDIFRXSEL) -/** - * @} - */ - -#endif /* STM32F446xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_SAI1_BlockA_Clock_Source RCC SAI BlockA Clock Source - * @{ - */ -#define RCC_SAIACLKSOURCE_PLLI2SR 0x00000000U -#define RCC_SAIACLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0) -#define RCC_SAIACLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1ASRC_1) -#define RCC_SAIACLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0 | RCC_DCKCFGR_SAI1ASRC_1) -/** - * @} - */ - -/** @defgroup RCCEx_SAI1_BlockB_Clock_Source RCC SAI BlockB Clock Source - * @{ - */ -#define RCC_SAIBCLKSOURCE_PLLI2SR 0x00000000U -#define RCC_SAIBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0) -#define RCC_SAIBCLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1BSRC_1) -#define RCC_SAIBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0 | RCC_DCKCFGR_SAI1BSRC_1) -/** - * @} - */ - -/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source - * @{ - */ -#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U -#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) -#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) -#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) -/** - * @} - */ - - -/** @defgroup RCCEx_DFSDM2_Audio_Clock_Source RCC DFSDM2 Audio Clock Source - * @{ - */ -#define RCC_DFSDM2AUDIOCLKSOURCE_I2S1 0x00000000U -#define RCC_DFSDM2AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM2ASEL) -/** - * @} - */ - -/** @defgroup RCCEx_DFSDM2_Kernel_Clock_Source RCC DFSDM2 Kernel Clock Source - * @{ - */ -#define RCC_DFSDM2CLKSOURCE_PCLK2 0x00000000U -#define RCC_DFSDM2CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) -/** - * @} - */ - -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_PLL_I2S_Clock_Source PLL I2S Clock Source - * @{ - */ -#define RCC_PLLI2SCLKSOURCE_PLLSRC 0x00000000U -#define RCC_PLLI2SCLKSOURCE_EXT ((uint32_t)RCC_PLLI2SCFGR_PLLI2SSRC) -/** - * @} - */ - -/** @defgroup RCCEx_DFSDM1_Audio_Clock_Source RCC DFSDM1 Audio Clock Source - * @{ - */ -#define RCC_DFSDM1AUDIOCLKSOURCE_I2S1 0x00000000U -#define RCC_DFSDM1AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM1ASEL) -/** - * @} - */ - -/** @defgroup RCCEx_DFSDM1_Kernel_Clock_Source RCC DFSDM1 Kernel Clock Source - * @{ - */ -#define RCC_DFSDM1CLKSOURCE_PCLK2 0x00000000U -#define RCC_DFSDM1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source - * @{ - */ -#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) -#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) -#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source - * @{ - */ -#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) -#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) -#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) -/** - * @} - */ - -/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source - * @{ - */ -#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) -/** - * @} - */ - -/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source - * @{ - */ -#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U -#define RCC_CLK48CLKSOURCE_PLLI2SQ ((uint32_t)RCC_DCKCFGR2_CK48MSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source - * @{ - */ -#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U -#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) -/** - * @} - */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) - -/** @defgroup RCCEx_I2S_APB_Clock_Source RCC I2S APB Clock Source - * @{ - */ -#define RCC_I2SAPBCLKSOURCE_PLLR 0x00000000U -#define RCC_I2SAPBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2SSRC_0) -#define RCC_I2SAPBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2SSRC_1) -/** - * @} - */ - -/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source - * @{ - */ -#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) -/** - * @} - */ - -/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source - * @{ - */ -#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U -#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) -#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) -#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) -/** - * @} - */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_TIM_PRescaler_Selection RCC TIM PRescaler Selection - * @{ - */ -#define RCC_TIMPRES_DESACTIVATED ((uint8_t)0x00) -#define RCC_TIMPRES_ACTIVATED ((uint8_t)0x01) -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ - STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -/** @defgroup RCCEx_LSE_Dual_Mode_Selection RCC LSE Dual Mode Selection - * @{ - */ -#define RCC_LSE_LOWPOWER_MODE ((uint8_t)0x00) -#define RCC_LSE_HIGHDRIVE_MODE ((uint8_t)0x01) -/** - * @} - */ -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx ||\ - STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source - * @{ - */ -#define RCC_MCO2SOURCE_SYSCLK 0x00000000U -#define RCC_MCO2SOURCE_PLLI2SCLK RCC_CFGR_MCO2_0 -#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 -#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 -/** - * @} - */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F413xx | STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source - * @{ - */ -#define RCC_MCO2SOURCE_SYSCLK 0x00000000U -#define RCC_MCO2SOURCE_I2SCLK RCC_CFGR_MCO2_0 -#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 -#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 -/** - * @} - */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Macros RCCEx Exported Macros - * @{ - */ -/*------------------- STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx --------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOJ_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOK_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DMA2D_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) -#define __HAL_RCC_GPIOJ_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOJEN)) -#define __HAL_RCC_GPIOK_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOKEN)) -#define __HAL_RCC_DMA2D_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2DEN)) -#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) -#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) -#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) -#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) - -/** - * @brief Enable ETHERNET clock. - */ -#define __HAL_RCC_ETH_CLK_ENABLE() do { \ - __HAL_RCC_ETHMAC_CLK_ENABLE(); \ - __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ - __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ - } while(0U) -/** - * @brief Disable ETHERNET clock. - */ -#define __HAL_RCC_ETH_CLK_DISABLE() do { \ - __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ - __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ - __HAL_RCC_ETHMAC_CLK_DISABLE(); \ - } while(0U) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) -#define __HAL_RCC_GPIOJ_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) != RESET) -#define __HAL_RCC_GPIOK_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) != RESET) -#define __HAL_RCC_DMA2D_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) != RESET) -#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) -#define __HAL_RCC_GPIOJ_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) == RESET) -#define __HAL_RCC_GPIOK_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) == RESET) -#define __HAL_RCC_DMA2D_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) == RESET) -#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_HASH_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) -#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ - -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) -#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) -#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) - -#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) -#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ - -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) -#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) -#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) -#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) -#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) -#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) -#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) -#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -#define __HAL_RCC_SPI6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI6EN)) -#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_LTDC_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_LTDCEN)) -#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_DSI_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DSIEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) -#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) -#define __HAL_RCC_SPI6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) != RESET) -#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))!= RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))== RESET) -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) -#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -#define __HAL_RCC_SPI6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) == RESET) -#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) != RESET) -#define __HAL_RCC_LTDC_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) == RESET) -#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) != RESET) -#define __HAL_RCC_DSI_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) == RESET) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x22E017FFU) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_GPIOJ_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOJRST)) -#define __HAL_RCC_GPIOK_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOKRST)) -#define __HAL_RCC_DMA2D_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2DRST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_GPIOJ_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOJRST)) -#define __HAL_RCC_GPIOK_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOKRST)) -#define __HAL_RCC_DMA2D_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2DRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F469xx) -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000C1U) -#endif /* STM32F427xx || STM32F429xx || STM32F469xx */ -#if defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000F1U) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) - -#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000001U) -#endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx */ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000003U) -#endif /* STM32F469xx || STM32F479xx */ -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) -#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) -#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) -#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xF6FEC9FFU) -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x0C777933U) -#endif /* STM32F469xx || STM32F479xx */ -#if defined(STM32F429xx) || defined(STM32F439xx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x04777933U) -#endif /* STM32F429xx || STM32F439xx */ -#if defined(STM32F427xx) || defined(STM32F437xx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00777933U) -#endif /* STM32F427xx || STM32F437xx */ -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SPI6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI6RST)) -#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SPI6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI6RST)) -#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_LTDCRST)) -#define __HAL_RCC_LTDC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_LTDCRST)) -#endif /* STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DSIRST)) -#define __HAL_RCC_DSI_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DSIRST)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_GPIOJ_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOJLPEN)) -#define __HAL_RCC_GPIOK_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOKLPEN)) -#define __HAL_RCC_SRAM3_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM3LPEN)) -#define __HAL_RCC_DMA2D_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2DLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_GPIOJ_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOJLPEN)) -#define __HAL_RCC_GPIOK_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOKLPEN)) -#define __HAL_RCC_DMA2D_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2DLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) - -#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) -#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) - -#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) -#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_SPI6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI6LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_SPI6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI6LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_LTDCLPEN)) - -#define __HAL_RCC_LTDC_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_LTDCLPEN)) -#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DSILPEN)) -#define __HAL_RCC_DSI_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DSILPEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*----------------------------------- STM32F40xxx/STM32F41xxx-----------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#if defined(STM32F407xx)|| defined(STM32F417xx) -/** - * @brief Enable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETH_CLK_ENABLE() do { \ - __HAL_RCC_ETHMAC_CLK_ENABLE(); \ - __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ - __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ - } while(0U) - -/** - * @brief Disable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) -#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) -#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) -#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) -#define __HAL_RCC_ETH_CLK_DISABLE() do { \ - __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ - __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ - __HAL_RCC_ETHMAC_CLK_DISABLE(); \ - } while(0U) -#endif /* STM32F407xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN))== RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#if defined(STM32F407xx)|| defined(STM32F417xx) -/** - * @brief Enable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) -#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) -/** - * @brief Disable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) -#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) -#endif /* STM32F407xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_HASH_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) -#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) -#endif /* STM32F415xx || STM32F417xx */ -/** - * @} - */ - - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) -#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) -#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) - -#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) -#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) -#endif /* STM32F415xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) -#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) -#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) -#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) -#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#if defined (STM32F405xx) || defined (STM32F415xx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x206011FFU) -#endif /* STM32F405xx || STM32F415xx */ -#if defined (STM32F407xx) || defined (STM32F417xx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x226011FFU) -#endif /* STM32F407xx || STM32F417xx */ -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#if defined (STM32F415xx) || defined (STM32F417xx) -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000F1U) -#endif /* STM32F415xx || STM32F417xx */ -#if defined (STM32F405xx) || defined (STM32F407xx) -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000C1U) -#endif /* STM32F405xx || STM32F407xx */ -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) -#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) - -#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) -#endif /* STM32F415xx || STM32F417xx */ - -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000001U) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) - -#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) -#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xF6FEC9FFU) -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x04777933U) -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) -#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) - -#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) -#endif /* STM32F415xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) -#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) -/** - * @} - */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------- STM32F401xE/STM32F401xC --------------------------*/ -#if defined(STM32F401xC) || defined(STM32F401xE) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -/** - * @} - */ -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060109FU) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x00000080U) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x10E2C80FU) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00077931U) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -/** - * @} - */ -#endif /* STM32F401xC || STM32F401xE*/ -/*----------------------------------------------------------------------------*/ - -/*-------------------------------- STM32F410xx -------------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_RNGEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) != RESET) - -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB1) peripheral clock. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) -#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) -#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) -#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) - -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) -#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) -#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) - -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x80601087U) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_RNGRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_RNGRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() -#define __HAL_RCC_AHB2_RELEASE_RESET() -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() -#define __HAL_RCC_AHB3_RELEASE_RESET() -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#if defined (STM32F410Rx) || defined (STM32F410Cx) -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x31624A18U) -#endif /* STM32F410Rx || STM32F410Cx */ -#if defined (STM32F410Tx) -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x31620A18U) -#endif /* STM32F410Tx */ -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) -#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) - -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) -#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#if defined (STM32F410Rx) || defined (STM32F410Cx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00155131U) -#endif /* STM32F410Rx || STM32F410Cx */ -#if defined (STM32F410Tx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00055111U) -#endif /* STM32F410Tx */ -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_RNGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_RNGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) -#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) - -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) -#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) -/** - * @} - */ - -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/*----------------------------------------------------------------------------*/ - -/*-------------------------------- STM32F411xx -------------------------------*/ -#if defined(STM32F411xE) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEX_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060109FU) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x00000080U) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x10E2C80FU) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00177931U) -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -/** - * @} - */ -#endif /* STM32F411xE */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F446xx -----------------------------*/ -#if defined(STM32F446xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN))!= RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) -#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) - -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) -#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) -#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) - -#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) -#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPDIFRX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CEC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#define __HAL_RCC_SPDIFRX_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPDIFRXEN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#define __HAL_RCC_CEC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CECEN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#define __HAL_RCC_SPDIFRX_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#define __HAL_RCC_CEC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#define __HAL_RCC_SPDIFRX_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#define __HAL_RCC_CEC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SAI2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) -#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) -#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) -#define __HAL_RCC_SAI2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI2EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) -#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) -#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) -#define __HAL_RCC_SAI2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) -#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) -#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) -#define __HAL_RCC_SAI2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x206010FFU) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x00000081U) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000003U) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) - -#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) -#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) - -#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) -#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x3FFFC9FFU) -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_SPDIFRX_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPDIFRXRST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_CEC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CECRST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_SPDIFRX_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPDIFRXRST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_CEC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CECRST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00C77933U) -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) -#define __HAL_RCC_SAI2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI2RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) -#define __HAL_RCC_SAI2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI2RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) - -#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) -#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) - -#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_SPDIFRX_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPDIFRXLPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_CEC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CECLPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_SPDIFRX_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPDIFRXLPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_CEC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CECLPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) -#define __HAL_RCC_SAI2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI2LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) -#define __HAL_RCC_SAI2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI2LPEN)) -/** - * @} - */ - -#endif /* STM32F446xx */ -/*----------------------------------------------------------------------------*/ - -/*-------STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx-------*/ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) - -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AES_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_AES_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_AESEN)) -#endif /* STM32F423xx */ - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) - -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AES_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) != RESET) -#define __HAL_RCC_AES_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) == RESET) -#endif /* STM32F423xx */ - -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) -#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) -#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) - -#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) -#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN3EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) -#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) -#endif /* STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN))!= RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) -#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) -#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) -#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART9EN)) -#define __HAL_RCC_UART10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART10EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM1EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM2EN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) != RESET) -#define __HAL_RCC_UART10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) == RESET) -#define __HAL_RCC_UART10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#if defined (STM32F412Zx) || defined(STM32F413xx) || defined (STM32F423xx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x006010FFU) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined (STM32F412Cx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x00601087U) -#endif /* STM32F412Cx */ -#if defined (STM32F412Vx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060109FU) -#endif /* STM32F412Vx */ -#if defined (STM32F412Rx) -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060108FU) -#endif /* STM32F412Rx */ -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000D0U) -#define __HAL_RCC_AES_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_AESRST)) -#define __HAL_RCC_AES_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_AESRST)) -#else -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000C0U) -#endif /* STM32F423xx */ -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) - -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000003U) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) - -#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) -#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) - -#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) -#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Cx) -#define __HAL_RCC_AHB3_FORCE_RESET() -#define __HAL_RCC_AHB3_RELEASE_RESET() - -#define __HAL_RCC_FSMC_FORCE_RESET() -#define __HAL_RCC_QSPI_FORCE_RESET() - -#define __HAL_RCC_FSMC_RELEASE_RESET() -#define __HAL_RCC_QSPI_RELEASE_RESET() -#endif /* STM32F412Cx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xFFFECBFFU) -#endif /* STM32F413xx || STM32F423xx */ -#if defined (STM32F412Zx) || defined (STM32F412Vx) || defined (STM32F412Rx) || defined (STM32F412Cx) -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x17E6C9FFU) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN3RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN3RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#if defined(STM32F413xx)|| defined(STM32F423xx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x035779F3U) -#endif /* STM32F413xx || STM32F423xx */ -#if defined (STM32F412Zx) || defined (STM32F412Vx) || defined (STM32F412Rx) || defined (STM32F412Cx) -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x01177933U) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART9RST)) -#define __HAL_RCC_UART10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART10RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM1RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM2RST)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART9RST)) -#define __HAL_RCC_UART10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART10RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM1RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM2RST)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AES_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_AESLPEN)) -#define __HAL_RCC_AES_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_AESLPEN)) -#endif /* STM32F423xx */ - -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) - -#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN3LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN3LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART9LPEN)) -#define __HAL_RCC_UART10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART10LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART9LPEN)) -#define __HAL_RCC_UART10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART10LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------------- PLL Configuration --------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the main PLL clock source, multiplication and division factors. - * @note This function must be used only when the main PLL is disabled. - * @param __RCC_PLLSource__ specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry - * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. - * @param __PLLM__ specifies the division factor for PLL VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLN parameter correctly to ensure that the VCO - * output frequency is between 100 and 432 MHz. - * - * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) - * This parameter must be a number in the range {2, 4, 6, or 8}. - * - * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * @note If the USB OTG FS is used in your application, you have to set the - * PLLQ parameter correctly to have 48 MHz clock for the USB. However, - * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work - * correctly. - * - * @param __PLLR__ PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note This parameter is only available in STM32F446xx/STM32F469xx/STM32F479xx/ - STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. - * - */ -#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__,__PLLR__) \ - (RCC->PLLCFGR = ((__RCC_PLLSource__) | (__PLLM__) | \ - ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ - ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ - ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos) | \ - ((__PLLR__) << RCC_PLLCFGR_PLLR_Pos))) -#else -/** @brief Macro to configure the main PLL clock source, multiplication and division factors. - * @note This function must be used only when the main PLL is disabled. - * @param __RCC_PLLSource__ specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry - * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. - * @param __PLLM__ specifies the division factor for PLL VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432 - * Except for STM32F411xE devices where Min_Data = 192. - * @note You have to set the PLLN parameter correctly to ensure that the VCO - * output frequency is between 100 and 432 MHz, Except for STM32F411xE devices - * where frequency is between 192 and 432 MHz. - * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) - * This parameter must be a number in the range {2, 4, 6, or 8}. - * - * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * @note If the USB OTG FS is used in your application, you have to set the - * PLLQ parameter correctly to have 48 MHz clock for the USB. However, - * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work - * correctly. - * - */ -#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__) \ - (RCC->PLLCFGR = (0x20000000U | (__RCC_PLLSource__) | (__PLLM__)| \ - ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ - ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ - ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos))) -#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -/*----------------------------------------------------------------------------*/ - -/*----------------------------PLLI2S Configuration ---------------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - -/** @brief Macros to enable or disable the PLLI2S. - * @note The PLLI2S is disabled by hardware when entering STOP and STANDBY modes. - */ -#define __HAL_RCC_PLLI2S_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = ENABLE) -#define __HAL_RCC_PLLI2S_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = DISABLE) - -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F412Cx */ -#if defined(STM32F446xx) -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 1 MHz to limit PLLI2S jitter. - * - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLI2SP__ specifies division factor for SPDIFRX Clock. - * This parameter must be a number in the range {2, 4, 6, or 8}. - * @note the PLLI2SP parameter is only available with STM32F446xx Devices - * - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - * @param __PLLI2SQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - */ -#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SP__, __PLLI2SQ__, __PLLI2SR__) \ - (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ - ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((((__PLLI2SP__) >> 1U) -1U) << RCC_PLLI2SCFGR_PLLI2SP_Pos) |\ - ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 1 MHz to limit PLLI2S jitter. - * - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - * @param __PLLI2SQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - */ -#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) \ - (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ - ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#else -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - */ -#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SN__, __PLLI2SR__) \ - (RCC->PLLI2SCFGR = (((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#endif /* STM32F446xx */ - -#if defined(STM32F411xE) -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note The PLLI2SM parameter is only used with STM32F411xE/STM32F410xx Devices - * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLLI2S jitter. - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 192 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 192 and Max_Data = 432 MHz. - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - */ -#define __HAL_RCC_PLLI2S_I2SCLK_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ - ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#endif /* STM32F411xE */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro used by the SAI HAL driver to configure the PLLI2S clock multiplication and division factors. - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API) - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * @param __PLLI2SQ__ specifies the division factor for SAI1 clock. - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * @note the PLLI2SQ parameter is only available with STM32F427xx/437xx/429xx/439xx/469xx/479xx - * Devices and can be configured using the __HAL_RCC_PLLI2S_PLLSAICLK_CONFIG() macro - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - */ -#define __HAL_RCC_PLLI2S_SAICLK_CONFIG(__PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SN__) << 6U) |\ - ((__PLLI2SQ__) << 24U) |\ - ((__PLLI2SR__) << 28U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------------ PLLSAI Configuration ------------------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macros to Enable or Disable the PLLISAI. - * @note The PLLSAI is only available with STM32F429x/439x Devices. - * @note The PLLSAI is disabled by hardware when entering STOP and STANDBY modes. - */ -#define __HAL_RCC_PLLSAI_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = ENABLE) -#define __HAL_RCC_PLLSAI_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = DISABLE) - -#if defined(STM32F446xx) -/** @brief Macro to configure the PLLSAI clock multiplication and division factors. - * - * @param __PLLSAIM__ specifies the division factor for PLLSAI VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLSAIM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 1 MHz to limit PLLI2S jitter. - * @note The PLLSAIM parameter is only used with STM32F446xx Devices - * - * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLSAIP__ specifies division factor for OTG FS, SDIO and RNG clocks. - * This parameter must be a number in the range {2, 4, 6, or 8}. - * @note the PLLSAIP parameter is only available with STM32F446xx Devices - * - * @param __PLLSAIQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * - * @param __PLLSAIR__ specifies the division factor for LTDC clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices - */ -#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIM__, __PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ - (RCC->PLLSAICFGR = ((__PLLSAIM__) | \ - ((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ - ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) | \ - ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos))) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro to configure the PLLSAI clock multiplication and division factors. - * - * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLSAIP__ specifies division factor for SDIO and CLK48 clocks. - * This parameter must be a number in the range {2, 4, 6, or 8}. - * - * @param __PLLSAIQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * - * @param __PLLSAIR__ specifies the division factor for LTDC clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - */ -#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ - (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) |\ - ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) |\ - ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) |\ - ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -/** @brief Macro to configure the PLLSAI clock multiplication and division factors. - * - * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLSAIQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * - * @param __PLLSAIR__ specifies the division factor for LTDC clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices - */ -#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIQ__, __PLLSAIR__) \ - (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ - ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) | \ - ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------- PLLSAI/PLLI2S Dividers Configuration -------------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. - * @note This function must be called before enabling the PLLI2S. - * @param __PLLI2SDivR__ specifies the PLLI2S division factor for SAI1 clock. - * This parameter must be a number between 1 and 32. - * SAI1 clock frequency = f(PLLI2SR) / __PLLI2SDivR__ - */ -#define __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(__PLLI2SDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, (__PLLI2SDivR__)-1U)) - -/** @brief Macro to configure the SAI clock Divider coming from PLL. - * @param __PLLDivR__ specifies the PLL division factor for SAI1 clock. - * This parameter must be a number between 1 and 32. - * SAI1 clock frequency = f(PLLR) / __PLLDivR__ - */ -#define __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(__PLLDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, ((__PLLDivR__)-1U)<<8U)) -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. - * @note This function must be called before enabling the PLLI2S. - * @param __PLLI2SDivQ__ specifies the PLLI2S division factor for SAI1 clock. - * This parameter must be a number between 1 and 32. - * SAI1 clock frequency = f(PLLI2SQ) / __PLLI2SDivQ__ - */ -#define __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(__PLLI2SDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, (__PLLI2SDivQ__)-1U)) - -/** @brief Macro to configure the SAI clock Divider coming from PLLSAI. - * @note This function must be called before enabling the PLLSAI. - * @param __PLLSAIDivQ__ specifies the PLLSAI division factor for SAI1 clock . - * This parameter must be a number between Min_Data = 1 and Max_Data = 32. - * SAI1 clock frequency = f(PLLSAIQ) / __PLLSAIDivQ__ - */ -#define __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(__PLLSAIDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, ((__PLLSAIDivQ__)-1U)<<8U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro to configure the LTDC clock Divider coming from PLLSAI. - * - * @note The LTDC peripheral is only available with STM32F427/437/429/439/469/479xx Devices. - * @note This function must be called before enabling the PLLSAI. - * @param __PLLSAIDivR__ specifies the PLLSAI division factor for LTDC clock . - * This parameter must be a number between Min_Data = 2 and Max_Data = 16. - * LTDC clock frequency = f(PLLSAIR) / __PLLSAIDivR__ - */ -#define __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(__PLLSAIDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR, (__PLLSAIDivR__))) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------- Peripheral Clock selection -----------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) ||\ - defined(STM32F479xx) -/** @brief Macro to configure the I2S clock source (I2SCLK). - * @note This function must be called before enabling the I2S APB clock. - * @param __SOURCE__ specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. - * @arg RCC_I2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin - * used as I2S clock source. - */ -#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (MODIFY_REG(RCC->CFGR, RCC_CFGR_I2SSRC, (__SOURCE__))) - - -/** @brief Macro to get the I2S clock source (I2SCLK). - * @retval The clock source can be one of the following values: - * @arg @ref RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. - * @arg @ref RCC_I2SCLKSOURCE_EXT External clock mapped on the I2S_CKIN pin - * used as I2S clock source - */ -#define __HAL_RCC_GET_I2S_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_I2SSRC))) -#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - -/** @brief Macro to configure SAI1BlockA clock source selection. - * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block A clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIACLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used - * as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used - * as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin - * used as SAI1 Block A clock. - */ -#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) - -/** @brief Macro to configure SAI1BlockB clock source selection. - * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block B clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIBCLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used - * as SAI1 Block B clock. - * @arg RCC_SAIBCLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used - * as SAI1 Block B clock. - * @arg RCC_SAIBCLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin - * used as SAI1 Block B clock. - */ -#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F446xx) -/** @brief Macro to configure SAI1 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI1 clock source. - * This parameter can be one of the following values: - * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. - */ -#define __HAL_RCC_SAI1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC, (__SOURCE__))) - -/** @brief Macro to Get SAI1 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. - */ -#define __HAL_RCC_GET_SAI1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC)) - -/** @brief Macro to configure SAI2 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI2 clock source. - * This parameter can be one of the following values: - * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. - */ -#define __HAL_RCC_SAI2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC, (__SOURCE__))) - -/** @brief Macro to Get SAI2 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. - */ -#define __HAL_RCC_GET_SAI2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC)) - -/** @brief Macro to configure I2S APB1 clock source selection. - * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. - * @param __SOURCE__ specifies the I2S APB1 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB1 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) - -/** @brief Macro to configure I2S APB2 clock source selection. - * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. - * @param __SOURCE__ specifies the SAI Block A clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB2 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) - -/** @brief Macro to configure the CEC clock. - * @param __SOURCE__ specifies the CEC clock source. - * This parameter can be one of the following values: - * @arg RCC_CECCLKSOURCE_HSI: HSI selected as CEC clock - * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock - */ -#define __HAL_RCC_CEC_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CEC clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CECCLKSOURCE_HSI488: HSI selected as CEC clock - * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock - */ -#define __HAL_RCC_GET_CEC_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL)) - -/** @brief Macro to configure the FMPI2C1 clock. - * @param __SOURCE__ specifies the FMPI2C1 clock source. - * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the FMPI2C1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) - -/** @brief Macro to configure the CLK48 clock. - * @param __SOURCE__ specifies the CLK48 clock source. - * This parameter can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CLK48 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) - -/** @brief Macro to configure the SDIO clock. - * @param __SOURCE__ specifies the SDIO clock source. - * This parameter can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SDIO clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) - -/** @brief Macro to configure the SPDIFRX clock. - * @param __SOURCE__ specifies the SPDIFRX clock source. - * This parameter can be one of the following values: - * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. - * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. - */ -#define __HAL_RCC_SPDIFRX_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SPDIFRX clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. - * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. - */ -#define __HAL_RCC_GET_SPDIFRX_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL)) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) - -/** @brief Macro to configure the CLK48 clock. - * @param __SOURCE__ specifies the CLK48 clock source. - * This parameter can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CLK48 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL)) - -/** @brief Macro to configure the SDIO clock. - * @param __SOURCE__ specifies the SDIO clock source. - * This parameter can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SDIO clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL)) - -/** @brief Macro to configure the DSI clock. - * @param __SOURCE__ specifies the DSI clock source. - * This parameter can be one of the following values: - * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. - * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. - */ -#define __HAL_RCC_DSI_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the DSI clock. - * @retval The clock source can be one of the following values: - * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. - * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. - */ -#define __HAL_RCC_GET_DSI_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL)) - -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the DFSDM1 clock. - * @param __DFSDM1_CLKSOURCE__ specifies the DFSDM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernel clock. - * @retval None - */ -#define __HAL_RCC_DFSDM1_CONFIG(__DFSDM1_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM1_CLKSOURCE__)) - -/** @brief Macro to get the DFSDM1 clock source. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernel clock. - */ -#define __HAL_RCC_GET_DFSDM1_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) - -/** @brief Macro to configure DFSDM1 Audio clock source selection. - * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ - STM32F413xx/STM32F423xx Devices. - * @param __SOURCE__ specifies the DFSDM1 Audio clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_DFSDM1AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL, (__SOURCE__))) - -/** @brief Macro to Get DFSDM1 Audio clock source selection. - * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ - STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_GET_DFSDM1AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL)) - -#if defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the DFSDM2 clock. - * @param __DFSDM2_CLKSOURCE__ specifies the DFSDM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernel clock. - * @retval None - */ -#define __HAL_RCC_DFSDM2_CONFIG(__DFSDM2_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM2_CLKSOURCE__)) - -/** @brief Macro to get the DFSDM2 clock source. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernel clock. - */ -#define __HAL_RCC_GET_DFSDM2_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) - -/** @brief Macro to configure DFSDM1 Audio clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @param __SOURCE__ specifies the DFSDM2 Audio clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_DFSDM2AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL, (__SOURCE__))) - -/** @brief Macro to Get DFSDM2 Audio clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_GET_DFSDM2AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL)) - -/** @brief Macro to configure SAI1BlockA clock source selection. - * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block A clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) - -/** @brief Macro to Get SAI1 BlockA clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_SAI_BLOCKA_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC)) - -/** @brief Macro to configure SAI1 BlockB clock source selection. - * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block B clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) - -/** @brief Macro to Get SAI1 BlockB clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_SAI_BLOCKB_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC)) - -/** @brief Macro to configure the LPTIM1 clock. - * @param __SOURCE__ specifies the LPTIM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the LPTIM1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) -#endif /* STM32F413xx || STM32F423xx */ - -/** @brief Macro to configure I2S APB1 clock source selection. - * @param __SOURCE__ specifies the I2S APB1 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB1 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) - -/** @brief Macro to configure I2S APB2 clock source selection. - * @param __SOURCE__ specifies the I2S APB2 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB2 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) - -/** @brief Macro to configure the PLL I2S clock source (PLLI2SCLK). - * @note This macro must be called before enabling the I2S APB clock. - * @param __SOURCE__ specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLI2SCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - * @arg RCC_PLLI2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin - * used as I2S clock source. - */ -#define __HAL_RCC_PLL_I2S_CONFIG(__SOURCE__) (*(__IO uint32_t *) RCC_PLLI2SCFGR_PLLI2SSRC_BB = (__SOURCE__)) - -/** @brief Macro to configure the FMPI2C1 clock. - * @param __SOURCE__ specifies the FMPI2C1 clock source. - * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the FMPI2C1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) - -/** @brief Macro to configure the CLK48 clock. - * @param __SOURCE__ specifies the CLK48 clock source. - * This parameter can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock. - */ -#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CLK48 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock - */ -#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) - -/** @brief Macro to configure the SDIO clock. - * @param __SOURCE__ specifies the SDIO clock source. - * This parameter can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SDIO clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) - -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @brief Macro to configure I2S clock source selection. - * @param __SOURCE__ specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. - * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. - */ -#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC, (__SOURCE__))) - -/** @brief Macro to Get I2S clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. - * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. - */ -#define __HAL_RCC_GET_I2S_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC)) - -/** @brief Macro to configure the FMPI2C1 clock. - * @param __SOURCE__ specifies the FMPI2C1 clock source. - * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the FMPI2C1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) - -/** @brief Macro to configure the LPTIM1 clock. - * @param __SOURCE__ specifies the LPTIM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the LPTIM1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the Timers clocks prescalers - * @note This feature is only available with STM32F429x/439x Devices. - * @param __PRESC__ specifies the Timers clocks prescalers selection - * This parameter can be one of the following values: - * @arg RCC_TIMPRES_DESACTIVATED: The Timers kernels clocks prescaler is - * equal to HPRE if PPREx is corresponding to division by 1 or 2, - * else it is equal to [(HPRE * PPREx) / 2] if PPREx is corresponding to - * division by 4 or more. - * @arg RCC_TIMPRES_ACTIVATED: The Timers kernels clocks prescaler is - * equal to HPRE if PPREx is corresponding to division by 1, 2 or 4, - * else it is equal to [(HPRE * PPREx) / 4] if PPREx is corresponding - * to division by 8 or more. - */ -#define __HAL_RCC_TIMCLKPRESCALER(__PRESC__) (*(__IO uint32_t *) RCC_DCKCFGR_TIMPRE_BB = (__PRESC__)) - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx) || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE ||\ - STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx ||\ - STM32F423xx */ - -/*----------------------------------------------------------------------------*/ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Enable PLLSAI_RDY interrupt. - */ -#define __HAL_RCC_PLLSAI_ENABLE_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYIE)) - -/** @brief Disable PLLSAI_RDY interrupt. - */ -#define __HAL_RCC_PLLSAI_DISABLE_IT() (RCC->CIR &= ~(RCC_CIR_PLLSAIRDYIE)) - -/** @brief Clear the PLLSAI RDY interrupt pending bits. - */ -#define __HAL_RCC_PLLSAI_CLEAR_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYF)) - -/** @brief Check the PLLSAI RDY interrupt has occurred or not. - * @retval The new state (TRUE or FALSE). - */ -#define __HAL_RCC_PLLSAI_GET_IT() ((RCC->CIR & (RCC_CIR_PLLSAIRDYIE)) == (RCC_CIR_PLLSAIRDYIE)) - -/** @brief Check PLLSAI RDY flag is set or not. - * @retval The new state (TRUE or FALSE). - */ -#define __HAL_RCC_PLLSAI_GET_FLAG() ((RCC->CR & (RCC_CR_PLLSAIRDY)) == (RCC_CR_PLLSAIRDY)) - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @brief Macros to enable or disable the RCC MCO1 feature. - */ -#define __HAL_RCC_MCO1_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = ENABLE) -#define __HAL_RCC_MCO1_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = DISABLE) - -/** @brief Macros to enable or disable the RCC MCO2 feature. - */ -#define __HAL_RCC_MCO2_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = ENABLE) -#define __HAL_RCC_MCO2_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = DISABLE) - -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup RCCEx_Exported_Functions - * @{ - */ - -/** @addtogroup RCCEx_Exported_Functions_Group1 - * @{ - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); - -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk); - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -void HAL_RCCEx_SelectLSEMode(uint8_t Mode); -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -#if defined(RCC_PLLI2S_SUPPORT) -HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit); -HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void); -#endif /* RCC_PLLI2S_SUPPORT */ -#if defined(RCC_PLLSAI_SUPPORT) -HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit); -HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void); -#endif /* RCC_PLLSAI_SUPPORT */ -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup RCCEx_Private_Constants RCCEx Private Constants - * @{ - */ - -/** @defgroup RCCEx_BitAddress_AliasRegion RCC BitAddress AliasRegion - * @brief RCC registers bit address in the alias region - * @{ - */ -/* --- CR Register ---*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/* Alias word address of PLLSAION bit */ -#define RCC_PLLSAION_BIT_NUMBER 0x1CU -#define RCC_CR_PLLSAION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLSAION_BIT_NUMBER * 4U)) - -#define PLLSAI_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/* Alias word address of PLLI2SON bit */ -#define RCC_PLLI2SON_BIT_NUMBER 0x1AU -#define RCC_CR_PLLI2SON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLI2SON_BIT_NUMBER * 4U)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/* --- DCKCFGR Register ---*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ - defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/* Alias word address of TIMPRE bit */ -#define RCC_DCKCFGR_OFFSET (RCC_OFFSET + 0x8CU) -#define RCC_TIMPRE_BIT_NUMBER 0x18U -#define RCC_DCKCFGR_TIMPRE_BB (PERIPH_BB_BASE + (RCC_DCKCFGR_OFFSET * 32U) + (RCC_TIMPRE_BIT_NUMBER * 4U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F410xx || STM32F401xC ||\ - STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/* --- CFGR Register ---*/ -#define RCC_CFGR_OFFSET (RCC_OFFSET + 0x08U) -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) -/* Alias word address of I2SSRC bit */ -#define RCC_I2SSRC_BIT_NUMBER 0x17U -#define RCC_CFGR_I2SSRC_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_I2SSRC_BIT_NUMBER * 4U)) - -#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/* --- PLLI2SCFGR Register ---*/ -#define RCC_PLLI2SCFGR_OFFSET (RCC_OFFSET + 0x84U) -/* Alias word address of PLLI2SSRC bit */ -#define RCC_PLLI2SSRC_BIT_NUMBER 0x16U -#define RCC_PLLI2SCFGR_PLLI2SSRC_BB (PERIPH_BB_BASE\ - + (RCC_PLLI2SCFGR_OFFSET * 32U) + (RCC_PLLI2SSRC_BIT_NUMBER * 4U)) - -#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx | STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/* Alias word address of MCO1EN bit */ -#define RCC_MCO1EN_BIT_NUMBER 0x8U -#define RCC_CFGR_MCO1EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO1EN_BIT_NUMBER * 4U)) - -/* Alias word address of MCO2EN bit */ -#define RCC_MCO2EN_BIT_NUMBER 0x9U -#define RCC_CFGR_MCO2EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO2EN_BIT_NUMBER * 4U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#define PLL_TIMEOUT_VALUE 2U /* 2 ms */ -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup RCCEx_Private_Macros RCCEx Private Macros - * @{ - */ -/** @defgroup RCCEx_IS_RCC_Definitions RCC Private macros to check input parameters - * @{ - */ -#define IS_RCC_PLLN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) -#define IS_RCC_PLLI2SN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000007FU)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000007U)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000000FU)) -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000001FU)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F446xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000FFFU)) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000001FFU)) -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000003FFU)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00007FFFU)) -#endif /* STM32F413xx || STM32F423xx */ - -#define IS_RCC_PLLI2SR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_PLLSAIN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) - -#define IS_RCC_PLLSAIQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_PLLSAIR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLSAI_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#define IS_RCC_PLLI2S_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#define IS_RCC_PLLSAI_DIVR_VALUE(VALUE) (((VALUE) == RCC_PLLSAIDIVR_2) ||\ - ((VALUE) == RCC_PLLSAIDIVR_4) ||\ - ((VALUE) == RCC_PLLSAIDIVR_8) ||\ - ((VALUE) == RCC_PLLSAIDIVR_16)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PLLI2SM_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 63U)) - -#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ - ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) -#endif /* STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ - ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) - -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) - -#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) - -#define IS_RCC_I2SAPBCLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPBCLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLSRC)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F446xx) -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLI2SP_VALUE(VALUE) (((VALUE) == RCC_PLLI2SP_DIV2) ||\ - ((VALUE) == RCC_PLLI2SP_DIV4) ||\ - ((VALUE) == RCC_PLLI2SP_DIV6) ||\ - ((VALUE) == RCC_PLLI2SP_DIV8)) - -#define IS_RCC_PLLSAIM_VALUE(VALUE) ((VALUE) <= 63U) - -#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ - ((VALUE) == RCC_PLLSAIP_DIV4) ||\ - ((VALUE) == RCC_PLLSAIP_DIV6) ||\ - ((VALUE) == RCC_PLLSAIP_DIV8)) - -#define IS_RCC_SAI1CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI1CLKSOURCE_PLLSAI) ||\ - ((SOURCE) == RCC_SAI1CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_SAI1CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAI1CLKSOURCE_EXT)) - -#define IS_RCC_SAI2CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI2CLKSOURCE_PLLSAI) ||\ - ((SOURCE) == RCC_SAI2CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_SAI2CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAI2CLKSOURCE_PLLSRC)) - -#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) - -#define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) - -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) - -#define IS_RCC_CECCLKSOURCE(SOURCE) (((SOURCE) == RCC_CECCLKSOURCE_HSI) ||\ - ((SOURCE) == RCC_CECCLKSOURCE_LSE)) - -#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ - ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) - -#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ - ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) - -#define IS_RCC_SPDIFRXCLKSOURCE(SOURCE) (((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ - ((VALUE) == RCC_PLLSAIP_DIV4) ||\ - ((VALUE) == RCC_PLLSAIP_DIV6) ||\ - ((VALUE) == RCC_PLLSAIP_DIV8)) - -#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ - ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) - -#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ - ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) - -#define IS_RCC_DSIBYTELANECLKSOURCE(SOURCE) (((SOURCE) == RCC_DSICLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_DSICLKSOURCE_DSIPHY)) - -#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ - ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLI2SCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_PLLI2SCLKSOURCE_PLLSRC) || \ - ((__SOURCE__) == RCC_PLLI2SCLKSOURCE_EXT)) - -#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) - -#define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) - -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) - -#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ - ((SOURCE) == RCC_CLK48CLKSOURCE_PLLI2SQ)) - -#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ - ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) - -#define IS_RCC_DFSDM1CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1CLKSOURCE_PCLK2) || \ - ((__SOURCE__) == RCC_DFSDM1CLKSOURCE_SYSCLK)) - -#define IS_RCC_DFSDM1AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S1) || \ - ((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S2)) - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_DFSDM2CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2CLKSOURCE_PCLK2) || \ - ((__SOURCE__) == RCC_DFSDM2CLKSOURCE_SYSCLK)) - -#define IS_RCC_DFSDM2AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S1) || \ - ((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S2)) - -#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) - -#define IS_RCC_SAIACLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIACLKSOURCE_PLLI2SR) ||\ - ((SOURCE) == RCC_SAIACLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_SAIACLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAIACLKSOURCE_PLLSRC)) - -#define IS_RCC_SAIBCLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIBCLKSOURCE_PLLI2SR) ||\ - ((SOURCE) == RCC_SAIBCLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_SAIBCLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAIBCLKSOURCE_PLLSRC)) - -#define IS_RCC_PLL_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#define IS_RCC_PLLI2S_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#endif /* STM32F413xx || STM32F423xx */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - -#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_PLLI2SCLK)|| \ - ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) - -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || \ - STM32F412Rx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_I2SCLK)|| \ - ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_RCC_EX_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h deleted file mode 100644 index 856772d..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h +++ /dev/null @@ -1,238 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_sdram.h - * @author MCD Application Team - * @brief Header file of SDRAM HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_SDRAM_H -#define STM32F4xx_HAL_SDRAM_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(FMC_Bank5_6) - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_ll_fmc.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup SDRAM - * @{ - */ - -/* Exported typedef ----------------------------------------------------------*/ - -/** @defgroup SDRAM_Exported_Types SDRAM Exported Types - * @{ - */ - -/** - * @brief HAL SDRAM State structure definition - */ -typedef enum -{ - HAL_SDRAM_STATE_RESET = 0x00U, /*!< SDRAM not yet initialized or disabled */ - HAL_SDRAM_STATE_READY = 0x01U, /*!< SDRAM initialized and ready for use */ - HAL_SDRAM_STATE_BUSY = 0x02U, /*!< SDRAM internal process is ongoing */ - HAL_SDRAM_STATE_ERROR = 0x03U, /*!< SDRAM error state */ - HAL_SDRAM_STATE_WRITE_PROTECTED = 0x04U, /*!< SDRAM device write protected */ - HAL_SDRAM_STATE_PRECHARGED = 0x05U /*!< SDRAM device precharged */ - -} HAL_SDRAM_StateTypeDef; - -/** - * @brief SDRAM handle Structure definition - */ -#if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1) -typedef struct __SDRAM_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_SDRAM_REGISTER_CALLBACKS */ -{ - FMC_SDRAM_TypeDef *Instance; /*!< Register base address */ - - FMC_SDRAM_InitTypeDef Init; /*!< SDRAM device configuration parameters */ - - __IO HAL_SDRAM_StateTypeDef State; /*!< SDRAM access state */ - - HAL_LockTypeDef Lock; /*!< SDRAM locking object */ - - DMA_HandleTypeDef *hdma; /*!< Pointer DMA handler */ - -#if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1) - void (* MspInitCallback)(struct __SDRAM_HandleTypeDef *hsdram); /*!< SDRAM Msp Init callback */ - void (* MspDeInitCallback)(struct __SDRAM_HandleTypeDef *hsdram); /*!< SDRAM Msp DeInit callback */ - void (* RefreshErrorCallback)(struct __SDRAM_HandleTypeDef *hsdram); /*!< SDRAM Refresh Error callback */ - void (* DmaXferCpltCallback)(DMA_HandleTypeDef *hdma); /*!< SDRAM DMA Xfer Complete callback */ - void (* DmaXferErrorCallback)(DMA_HandleTypeDef *hdma); /*!< SDRAM DMA Xfer Error callback */ -#endif /* USE_HAL_SDRAM_REGISTER_CALLBACKS */ -} SDRAM_HandleTypeDef; - -#if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1) -/** - * @brief HAL SDRAM Callback ID enumeration definition - */ -typedef enum -{ - HAL_SDRAM_MSP_INIT_CB_ID = 0x00U, /*!< SDRAM MspInit Callback ID */ - HAL_SDRAM_MSP_DEINIT_CB_ID = 0x01U, /*!< SDRAM MspDeInit Callback ID */ - HAL_SDRAM_REFRESH_ERR_CB_ID = 0x02U, /*!< SDRAM Refresh Error Callback ID */ - HAL_SDRAM_DMA_XFER_CPLT_CB_ID = 0x03U, /*!< SDRAM DMA Xfer Complete Callback ID */ - HAL_SDRAM_DMA_XFER_ERR_CB_ID = 0x04U /*!< SDRAM DMA Xfer Error Callback ID */ -} HAL_SDRAM_CallbackIDTypeDef; - -/** - * @brief HAL SDRAM Callback pointer definition - */ -typedef void (*pSDRAM_CallbackTypeDef)(SDRAM_HandleTypeDef *hsdram); -typedef void (*pSDRAM_DmaCallbackTypeDef)(DMA_HandleTypeDef *hdma); -#endif /* USE_HAL_SDRAM_REGISTER_CALLBACKS */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ - -/** @defgroup SDRAM_Exported_Macros SDRAM Exported Macros - * @{ - */ - -/** @brief Reset SDRAM handle state - * @param __HANDLE__ specifies the SDRAM handle. - * @retval None - */ -#if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1) -#define __HAL_SDRAM_RESET_HANDLE_STATE(__HANDLE__) do { \ - (__HANDLE__)->State = HAL_SDRAM_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_SDRAM_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_SDRAM_STATE_RESET) -#endif /* USE_HAL_SDRAM_REGISTER_CALLBACKS */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @addtogroup SDRAM_Exported_Functions SDRAM Exported Functions - * @{ - */ - -/** @addtogroup SDRAM_Exported_Functions_Group1 - * @{ - */ - -/* Initialization/de-initialization functions *********************************/ -HAL_StatusTypeDef HAL_SDRAM_Init(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_TimingTypeDef *Timing); -HAL_StatusTypeDef HAL_SDRAM_DeInit(SDRAM_HandleTypeDef *hsdram); -void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef *hsdram); -void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef *hsdram); - -void HAL_SDRAM_IRQHandler(SDRAM_HandleTypeDef *hsdram); -void HAL_SDRAM_RefreshErrorCallback(SDRAM_HandleTypeDef *hsdram); -void HAL_SDRAM_DMA_XferCpltCallback(DMA_HandleTypeDef *hdma); -void HAL_SDRAM_DMA_XferErrorCallback(DMA_HandleTypeDef *hdma); - -/** - * @} - */ - -/** @addtogroup SDRAM_Exported_Functions_Group2 - * @{ - */ -/* I/O operation functions ****************************************************/ -HAL_StatusTypeDef HAL_SDRAM_Read_8b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint8_t *pDstBuffer, - uint32_t BufferSize); -HAL_StatusTypeDef HAL_SDRAM_Write_8b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint8_t *pSrcBuffer, - uint32_t BufferSize); -HAL_StatusTypeDef HAL_SDRAM_Read_16b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint16_t *pDstBuffer, - uint32_t BufferSize); -HAL_StatusTypeDef HAL_SDRAM_Write_16b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint16_t *pSrcBuffer, - uint32_t BufferSize); -HAL_StatusTypeDef HAL_SDRAM_Read_32b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pDstBuffer, - uint32_t BufferSize); -HAL_StatusTypeDef HAL_SDRAM_Write_32b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pSrcBuffer, - uint32_t BufferSize); - -HAL_StatusTypeDef HAL_SDRAM_Read_DMA(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pDstBuffer, - uint32_t BufferSize); -HAL_StatusTypeDef HAL_SDRAM_Write_DMA(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pSrcBuffer, - uint32_t BufferSize); - -#if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1) -/* SDRAM callback registering/unregistering */ -HAL_StatusTypeDef HAL_SDRAM_RegisterCallback(SDRAM_HandleTypeDef *hsdram, HAL_SDRAM_CallbackIDTypeDef CallbackId, - pSDRAM_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_SDRAM_UnRegisterCallback(SDRAM_HandleTypeDef *hsdram, HAL_SDRAM_CallbackIDTypeDef CallbackId); -HAL_StatusTypeDef HAL_SDRAM_RegisterDmaCallback(SDRAM_HandleTypeDef *hsdram, HAL_SDRAM_CallbackIDTypeDef CallbackId, - pSDRAM_DmaCallbackTypeDef pCallback); -#endif /* USE_HAL_SDRAM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @addtogroup SDRAM_Exported_Functions_Group3 - * @{ - */ -/* SDRAM Control functions *****************************************************/ -HAL_StatusTypeDef HAL_SDRAM_WriteProtection_Enable(SDRAM_HandleTypeDef *hsdram); -HAL_StatusTypeDef HAL_SDRAM_WriteProtection_Disable(SDRAM_HandleTypeDef *hsdram); -HAL_StatusTypeDef HAL_SDRAM_SendCommand(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command, - uint32_t Timeout); -HAL_StatusTypeDef HAL_SDRAM_ProgramRefreshRate(SDRAM_HandleTypeDef *hsdram, uint32_t RefreshRate); -HAL_StatusTypeDef HAL_SDRAM_SetAutoRefreshNumber(SDRAM_HandleTypeDef *hsdram, uint32_t AutoRefreshNumber); -uint32_t HAL_SDRAM_GetModeStatus(SDRAM_HandleTypeDef *hsdram); - -/** - * @} - */ - -/** @addtogroup SDRAM_Exported_Functions_Group4 - * @{ - */ -/* SDRAM State functions ********************************************************/ -HAL_SDRAM_StateTypeDef HAL_SDRAM_GetState(const SDRAM_HandleTypeDef *hsdram); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* FMC_Bank5_6 */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_SDRAM_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h deleted file mode 100644 index 84d1b51..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h +++ /dev/null @@ -1,733 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_spi.h - * @author MCD Application Team - * @brief Header file of SPI HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_SPI_H -#define STM32F4xx_HAL_SPI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup SPI - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup SPI_Exported_Types SPI Exported Types - * @{ - */ - -/** - * @brief SPI Configuration Structure definition - */ -typedef struct -{ - uint32_t Mode; /*!< Specifies the SPI operating mode. - This parameter can be a value of @ref SPI_Mode */ - - uint32_t Direction; /*!< Specifies the SPI bidirectional mode state. - This parameter can be a value of @ref SPI_Direction */ - - uint32_t DataSize; /*!< Specifies the SPI data size. - This parameter can be a value of @ref SPI_Data_Size */ - - uint32_t CLKPolarity; /*!< Specifies the serial clock steady state. - This parameter can be a value of @ref SPI_Clock_Polarity */ - - uint32_t CLKPhase; /*!< Specifies the clock active edge for the bit capture. - This parameter can be a value of @ref SPI_Clock_Phase */ - - uint32_t NSS; /*!< Specifies whether the NSS signal is managed by - hardware (NSS pin) or by software using the SSI bit. - This parameter can be a value of @ref SPI_Slave_Select_management */ - - uint32_t BaudRatePrescaler; /*!< Specifies the Baud Rate prescaler value which will be - used to configure the transmit and receive SCK clock. - This parameter can be a value of @ref SPI_BaudRate_Prescaler - @note The communication clock is derived from the master - clock. The slave clock does not need to be set. */ - - uint32_t FirstBit; /*!< Specifies whether data transfers start from MSB or LSB bit. - This parameter can be a value of @ref SPI_MSB_LSB_transmission */ - - uint32_t TIMode; /*!< Specifies if the TI mode is enabled or not. - This parameter can be a value of @ref SPI_TI_mode */ - - uint32_t CRCCalculation; /*!< Specifies if the CRC calculation is enabled or not. - This parameter can be a value of @ref SPI_CRC_Calculation */ - - uint32_t CRCPolynomial; /*!< Specifies the polynomial used for the CRC calculation. - This parameter must be an odd number between Min_Data = 1 and Max_Data = 65535 */ -} SPI_InitTypeDef; - -/** - * @brief HAL SPI State structure definition - */ -typedef enum -{ - HAL_SPI_STATE_RESET = 0x00U, /*!< Peripheral not Initialized */ - HAL_SPI_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ - HAL_SPI_STATE_BUSY = 0x02U, /*!< an internal process is ongoing */ - HAL_SPI_STATE_BUSY_TX = 0x03U, /*!< Data Transmission process is ongoing */ - HAL_SPI_STATE_BUSY_RX = 0x04U, /*!< Data Reception process is ongoing */ - HAL_SPI_STATE_BUSY_TX_RX = 0x05U, /*!< Data Transmission and Reception process is ongoing */ - HAL_SPI_STATE_ERROR = 0x06U, /*!< SPI error state */ - HAL_SPI_STATE_ABORT = 0x07U /*!< SPI abort is ongoing */ -} HAL_SPI_StateTypeDef; - -/** - * @brief SPI handle Structure definition - */ -typedef struct __SPI_HandleTypeDef -{ - SPI_TypeDef *Instance; /*!< SPI registers base address */ - - SPI_InitTypeDef Init; /*!< SPI communication parameters */ - - const uint8_t *pTxBuffPtr; /*!< Pointer to SPI Tx transfer Buffer */ - - uint16_t TxXferSize; /*!< SPI Tx Transfer size */ - - __IO uint16_t TxXferCount; /*!< SPI Tx Transfer Counter */ - - uint8_t *pRxBuffPtr; /*!< Pointer to SPI Rx transfer Buffer */ - - uint16_t RxXferSize; /*!< SPI Rx Transfer size */ - - __IO uint16_t RxXferCount; /*!< SPI Rx Transfer Counter */ - - void (*RxISR)(struct __SPI_HandleTypeDef *hspi); /*!< function pointer on Rx ISR */ - - void (*TxISR)(struct __SPI_HandleTypeDef *hspi); /*!< function pointer on Tx ISR */ - - DMA_HandleTypeDef *hdmatx; /*!< SPI Tx DMA Handle parameters */ - - DMA_HandleTypeDef *hdmarx; /*!< SPI Rx DMA Handle parameters */ - - HAL_LockTypeDef Lock; /*!< Locking object */ - - __IO HAL_SPI_StateTypeDef State; /*!< SPI communication state */ - - __IO uint32_t ErrorCode; /*!< SPI Error code */ - -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - void (* TxCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Tx Completed callback */ - void (* RxCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Rx Completed callback */ - void (* TxRxCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI TxRx Completed callback */ - void (* TxHalfCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Tx Half Completed callback */ - void (* RxHalfCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Rx Half Completed callback */ - void (* TxRxHalfCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI TxRx Half Completed callback */ - void (* ErrorCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Error callback */ - void (* AbortCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Abort callback */ - void (* MspInitCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Msp Init callback */ - void (* MspDeInitCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Msp DeInit callback */ - -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} SPI_HandleTypeDef; - -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) -/** - * @brief HAL SPI Callback ID enumeration definition - */ -typedef enum -{ - HAL_SPI_TX_COMPLETE_CB_ID = 0x00U, /*!< SPI Tx Completed callback ID */ - HAL_SPI_RX_COMPLETE_CB_ID = 0x01U, /*!< SPI Rx Completed callback ID */ - HAL_SPI_TX_RX_COMPLETE_CB_ID = 0x02U, /*!< SPI TxRx Completed callback ID */ - HAL_SPI_TX_HALF_COMPLETE_CB_ID = 0x03U, /*!< SPI Tx Half Completed callback ID */ - HAL_SPI_RX_HALF_COMPLETE_CB_ID = 0x04U, /*!< SPI Rx Half Completed callback ID */ - HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID = 0x05U, /*!< SPI TxRx Half Completed callback ID */ - HAL_SPI_ERROR_CB_ID = 0x06U, /*!< SPI Error callback ID */ - HAL_SPI_ABORT_CB_ID = 0x07U, /*!< SPI Abort callback ID */ - HAL_SPI_MSPINIT_CB_ID = 0x08U, /*!< SPI Msp Init callback ID */ - HAL_SPI_MSPDEINIT_CB_ID = 0x09U /*!< SPI Msp DeInit callback ID */ - -} HAL_SPI_CallbackIDTypeDef; - -/** - * @brief HAL SPI Callback pointer definition - */ -typedef void (*pSPI_CallbackTypeDef)(SPI_HandleTypeDef *hspi); /*!< pointer to an SPI callback function */ - -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SPI_Exported_Constants SPI Exported Constants - * @{ - */ - -/** @defgroup SPI_Error_Code SPI Error Code - * @{ - */ -#define HAL_SPI_ERROR_NONE (0x00000000U) /*!< No error */ -#define HAL_SPI_ERROR_MODF (0x00000001U) /*!< MODF error */ -#define HAL_SPI_ERROR_CRC (0x00000002U) /*!< CRC error */ -#define HAL_SPI_ERROR_OVR (0x00000004U) /*!< OVR error */ -#define HAL_SPI_ERROR_FRE (0x00000008U) /*!< FRE error */ -#define HAL_SPI_ERROR_DMA (0x00000010U) /*!< DMA transfer error */ -#define HAL_SPI_ERROR_FLAG (0x00000020U) /*!< Error on RXNE/TXE/BSY Flag */ -#define HAL_SPI_ERROR_ABORT (0x00000040U) /*!< Error during SPI Abort procedure */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) -#define HAL_SPI_ERROR_INVALID_CALLBACK (0x00000080U) /*!< Invalid Callback error */ -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @defgroup SPI_Mode SPI Mode - * @{ - */ -#define SPI_MODE_SLAVE (0x00000000U) -#define SPI_MODE_MASTER (SPI_CR1_MSTR | SPI_CR1_SSI) -/** - * @} - */ - -/** @defgroup SPI_Direction SPI Direction Mode - * @{ - */ -#define SPI_DIRECTION_2LINES (0x00000000U) -#define SPI_DIRECTION_2LINES_RXONLY SPI_CR1_RXONLY -#define SPI_DIRECTION_1LINE SPI_CR1_BIDIMODE -/** - * @} - */ - -/** @defgroup SPI_Data_Size SPI Data Size - * @{ - */ -#define SPI_DATASIZE_8BIT (0x00000000U) -#define SPI_DATASIZE_16BIT SPI_CR1_DFF -/** - * @} - */ - -/** @defgroup SPI_Clock_Polarity SPI Clock Polarity - * @{ - */ -#define SPI_POLARITY_LOW (0x00000000U) -#define SPI_POLARITY_HIGH SPI_CR1_CPOL -/** - * @} - */ - -/** @defgroup SPI_Clock_Phase SPI Clock Phase - * @{ - */ -#define SPI_PHASE_1EDGE (0x00000000U) -#define SPI_PHASE_2EDGE SPI_CR1_CPHA -/** - * @} - */ - -/** @defgroup SPI_Slave_Select_management SPI Slave Select Management - * @{ - */ -#define SPI_NSS_SOFT SPI_CR1_SSM -#define SPI_NSS_HARD_INPUT (0x00000000U) -#define SPI_NSS_HARD_OUTPUT (SPI_CR2_SSOE << 16U) -/** - * @} - */ - -/** @defgroup SPI_BaudRate_Prescaler SPI BaudRate Prescaler - * @{ - */ -#define SPI_BAUDRATEPRESCALER_2 (0x00000000U) -#define SPI_BAUDRATEPRESCALER_4 (SPI_CR1_BR_0) -#define SPI_BAUDRATEPRESCALER_8 (SPI_CR1_BR_1) -#define SPI_BAUDRATEPRESCALER_16 (SPI_CR1_BR_1 | SPI_CR1_BR_0) -#define SPI_BAUDRATEPRESCALER_32 (SPI_CR1_BR_2) -#define SPI_BAUDRATEPRESCALER_64 (SPI_CR1_BR_2 | SPI_CR1_BR_0) -#define SPI_BAUDRATEPRESCALER_128 (SPI_CR1_BR_2 | SPI_CR1_BR_1) -#define SPI_BAUDRATEPRESCALER_256 (SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0) -/** - * @} - */ - -/** @defgroup SPI_MSB_LSB_transmission SPI MSB LSB Transmission - * @{ - */ -#define SPI_FIRSTBIT_MSB (0x00000000U) -#define SPI_FIRSTBIT_LSB SPI_CR1_LSBFIRST -/** - * @} - */ - -/** @defgroup SPI_TI_mode SPI TI Mode - * @{ - */ -#define SPI_TIMODE_DISABLE (0x00000000U) -#define SPI_TIMODE_ENABLE SPI_CR2_FRF -/** - * @} - */ - -/** @defgroup SPI_CRC_Calculation SPI CRC Calculation - * @{ - */ -#define SPI_CRCCALCULATION_DISABLE (0x00000000U) -#define SPI_CRCCALCULATION_ENABLE SPI_CR1_CRCEN -/** - * @} - */ - -/** @defgroup SPI_Interrupt_definition SPI Interrupt Definition - * @{ - */ -#define SPI_IT_TXE SPI_CR2_TXEIE -#define SPI_IT_RXNE SPI_CR2_RXNEIE -#define SPI_IT_ERR SPI_CR2_ERRIE -/** - * @} - */ - -/** @defgroup SPI_Flags_definition SPI Flags Definition - * @{ - */ -#define SPI_FLAG_RXNE SPI_SR_RXNE /* SPI status flag: Rx buffer not empty flag */ -#define SPI_FLAG_TXE SPI_SR_TXE /* SPI status flag: Tx buffer empty flag */ -#define SPI_FLAG_BSY SPI_SR_BSY /* SPI status flag: Busy flag */ -#define SPI_FLAG_CRCERR SPI_SR_CRCERR /* SPI Error flag: CRC error flag */ -#define SPI_FLAG_MODF SPI_SR_MODF /* SPI Error flag: Mode fault flag */ -#define SPI_FLAG_OVR SPI_SR_OVR /* SPI Error flag: Overrun flag */ -#define SPI_FLAG_FRE SPI_SR_FRE /* SPI Error flag: TI mode frame format error flag */ -#define SPI_FLAG_MASK (SPI_SR_RXNE | SPI_SR_TXE | SPI_SR_BSY | SPI_SR_CRCERR\ - | SPI_SR_MODF | SPI_SR_OVR | SPI_SR_FRE) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup SPI_Exported_Macros SPI Exported Macros - * @{ - */ - -/** @brief Reset SPI handle state. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) -#define __HAL_SPI_RESET_HANDLE_STATE(__HANDLE__) \ - do{ \ - (__HANDLE__)->State = HAL_SPI_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_SPI_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_SPI_STATE_RESET) -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - -/** @brief Enable the specified SPI interrupts. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @param __INTERRUPT__ specifies the interrupt source to enable. - * This parameter can be one of the following values: - * @arg SPI_IT_TXE: Tx buffer empty interrupt enable - * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable - * @arg SPI_IT_ERR: Error interrupt enable - * @retval None - */ -#define __HAL_SPI_ENABLE_IT(__HANDLE__, __INTERRUPT__) SET_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__)) - -/** @brief Disable the specified SPI interrupts. - * @param __HANDLE__ specifies the SPI handle. - * This parameter can be SPIx where x: 1, 2, or 3 to select the SPI peripheral. - * @param __INTERRUPT__ specifies the interrupt source to disable. - * This parameter can be one of the following values: - * @arg SPI_IT_TXE: Tx buffer empty interrupt enable - * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable - * @arg SPI_IT_ERR: Error interrupt enable - * @retval None - */ -#define __HAL_SPI_DISABLE_IT(__HANDLE__, __INTERRUPT__) CLEAR_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__)) - -/** @brief Check whether the specified SPI interrupt source is enabled or not. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @param __INTERRUPT__ specifies the SPI interrupt source to check. - * This parameter can be one of the following values: - * @arg SPI_IT_TXE: Tx buffer empty interrupt enable - * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable - * @arg SPI_IT_ERR: Error interrupt enable - * @retval The new state of __IT__ (TRUE or FALSE). - */ -#define __HAL_SPI_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR2\ - & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) - -/** @brief Check whether the specified SPI flag is set or not. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg SPI_FLAG_RXNE: Receive buffer not empty flag - * @arg SPI_FLAG_TXE: Transmit buffer empty flag - * @arg SPI_FLAG_CRCERR: CRC error flag - * @arg SPI_FLAG_MODF: Mode fault flag - * @arg SPI_FLAG_OVR: Overrun flag - * @arg SPI_FLAG_BSY: Busy flag - * @arg SPI_FLAG_FRE: Frame format error flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_SPI_GET_FLAG(__HANDLE__, __FLAG__) ((((__HANDLE__)->Instance->SR) & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the SPI CRCERR pending flag. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_CRCERRFLAG(__HANDLE__) ((__HANDLE__)->Instance->SR = (uint16_t)(~SPI_FLAG_CRCERR)) - -/** @brief Clear the SPI MODF pending flag. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_MODFFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg_modf = 0x00U; \ - tmpreg_modf = (__HANDLE__)->Instance->SR; \ - CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_SPE); \ - UNUSED(tmpreg_modf); \ - } while(0U) - -/** @brief Clear the SPI OVR pending flag. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_OVRFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg_ovr = 0x00U; \ - tmpreg_ovr = (__HANDLE__)->Instance->DR; \ - tmpreg_ovr = (__HANDLE__)->Instance->SR; \ - UNUSED(tmpreg_ovr); \ - } while(0U) - -/** @brief Clear the SPI FRE pending flag. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_FREFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg_fre = 0x00U; \ - tmpreg_fre = (__HANDLE__)->Instance->SR; \ - UNUSED(tmpreg_fre); \ - } while(0U) - -/** @brief Enable the SPI peripheral. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_ENABLE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_SPE) - -/** @brief Disable the SPI peripheral. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_DISABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_SPE) - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup SPI_Private_Macros SPI Private Macros - * @{ - */ - -/** @brief Set the SPI transmit-only mode. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define SPI_1LINE_TX(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_BIDIOE) - -/** @brief Set the SPI receive-only mode. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define SPI_1LINE_RX(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_BIDIOE) - -/** @brief Reset the CRC calculation of the SPI. - * @param __HANDLE__ specifies the SPI Handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define SPI_RESET_CRC(__HANDLE__) \ - do{ \ - CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_CRCEN); \ - SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_CRCEN); \ - } while(0U) - -/** @brief Check whether the specified SPI flag is set or not. - * @param __SR__ copy of SPI SR register. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg SPI_FLAG_RXNE: Receive buffer not empty flag - * @arg SPI_FLAG_TXE: Transmit buffer empty flag - * @arg SPI_FLAG_CRCERR: CRC error flag - * @arg SPI_FLAG_MODF: Mode fault flag - * @arg SPI_FLAG_OVR: Overrun flag - * @arg SPI_FLAG_BSY: Busy flag - * @arg SPI_FLAG_FRE: Frame format error flag - * @retval SET or RESET. - */ -#define SPI_CHECK_FLAG(__SR__, __FLAG__) ((((__SR__) & ((__FLAG__) & SPI_FLAG_MASK)) == \ - ((__FLAG__) & SPI_FLAG_MASK)) ? SET : RESET) - -/** @brief Check whether the specified SPI Interrupt is set or not. - * @param __CR2__ copy of SPI CR2 register. - * @param __INTERRUPT__ specifies the SPI interrupt source to check. - * This parameter can be one of the following values: - * @arg SPI_IT_TXE: Tx buffer empty interrupt enable - * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable - * @arg SPI_IT_ERR: Error interrupt enable - * @retval SET or RESET. - */ -#define SPI_CHECK_IT_SOURCE(__CR2__, __INTERRUPT__) ((((__CR2__) & (__INTERRUPT__)) == \ - (__INTERRUPT__)) ? SET : RESET) - -/** @brief Checks if SPI Mode parameter is in allowed range. - * @param __MODE__ specifies the SPI Mode. - * This parameter can be a value of @ref SPI_Mode - * @retval None - */ -#define IS_SPI_MODE(__MODE__) (((__MODE__) == SPI_MODE_SLAVE) || \ - ((__MODE__) == SPI_MODE_MASTER)) - -/** @brief Checks if SPI Direction Mode parameter is in allowed range. - * @param __MODE__ specifies the SPI Direction Mode. - * This parameter can be a value of @ref SPI_Direction - * @retval None - */ -#define IS_SPI_DIRECTION(__MODE__) (((__MODE__) == SPI_DIRECTION_2LINES) || \ - ((__MODE__) == SPI_DIRECTION_2LINES_RXONLY) || \ - ((__MODE__) == SPI_DIRECTION_1LINE)) - -/** @brief Checks if SPI Direction Mode parameter is 2 lines. - * @param __MODE__ specifies the SPI Direction Mode. - * @retval None - */ -#define IS_SPI_DIRECTION_2LINES(__MODE__) ((__MODE__) == SPI_DIRECTION_2LINES) - -/** @brief Checks if SPI Direction Mode parameter is 1 or 2 lines. - * @param __MODE__ specifies the SPI Direction Mode. - * @retval None - */ -#define IS_SPI_DIRECTION_2LINES_OR_1LINE(__MODE__) (((__MODE__) == SPI_DIRECTION_2LINES) || \ - ((__MODE__) == SPI_DIRECTION_1LINE)) - -/** @brief Checks if SPI Data Size parameter is in allowed range. - * @param __DATASIZE__ specifies the SPI Data Size. - * This parameter can be a value of @ref SPI_Data_Size - * @retval None - */ -#define IS_SPI_DATASIZE(__DATASIZE__) (((__DATASIZE__) == SPI_DATASIZE_16BIT) || \ - ((__DATASIZE__) == SPI_DATASIZE_8BIT)) - -/** @brief Checks if SPI Serial clock steady state parameter is in allowed range. - * @param __CPOL__ specifies the SPI serial clock steady state. - * This parameter can be a value of @ref SPI_Clock_Polarity - * @retval None - */ -#define IS_SPI_CPOL(__CPOL__) (((__CPOL__) == SPI_POLARITY_LOW) || \ - ((__CPOL__) == SPI_POLARITY_HIGH)) - -/** @brief Checks if SPI Clock Phase parameter is in allowed range. - * @param __CPHA__ specifies the SPI Clock Phase. - * This parameter can be a value of @ref SPI_Clock_Phase - * @retval None - */ -#define IS_SPI_CPHA(__CPHA__) (((__CPHA__) == SPI_PHASE_1EDGE) || \ - ((__CPHA__) == SPI_PHASE_2EDGE)) - -/** @brief Checks if SPI Slave Select parameter is in allowed range. - * @param __NSS__ specifies the SPI Slave Select management parameter. - * This parameter can be a value of @ref SPI_Slave_Select_management - * @retval None - */ -#define IS_SPI_NSS(__NSS__) (((__NSS__) == SPI_NSS_SOFT) || \ - ((__NSS__) == SPI_NSS_HARD_INPUT) || \ - ((__NSS__) == SPI_NSS_HARD_OUTPUT)) - -/** @brief Checks if SPI Baudrate prescaler parameter is in allowed range. - * @param __PRESCALER__ specifies the SPI Baudrate prescaler. - * This parameter can be a value of @ref SPI_BaudRate_Prescaler - * @retval None - */ -#define IS_SPI_BAUDRATE_PRESCALER(__PRESCALER__) (((__PRESCALER__) == SPI_BAUDRATEPRESCALER_2) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_4) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_8) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_16) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_32) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_64) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_128) || \ - ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_256)) - -/** @brief Checks if SPI MSB LSB transmission parameter is in allowed range. - * @param __BIT__ specifies the SPI MSB LSB transmission (whether data transfer starts from MSB or LSB bit). - * This parameter can be a value of @ref SPI_MSB_LSB_transmission - * @retval None - */ -#define IS_SPI_FIRST_BIT(__BIT__) (((__BIT__) == SPI_FIRSTBIT_MSB) || \ - ((__BIT__) == SPI_FIRSTBIT_LSB)) - -/** @brief Checks if SPI TI mode parameter is in allowed range. - * @param __MODE__ specifies the SPI TI mode. - * This parameter can be a value of @ref SPI_TI_mode - * @retval None - */ -#define IS_SPI_TIMODE(__MODE__) (((__MODE__) == SPI_TIMODE_DISABLE) || \ - ((__MODE__) == SPI_TIMODE_ENABLE)) - -/** @brief Checks if SPI CRC calculation enabled state is in allowed range. - * @param __CALCULATION__ specifies the SPI CRC calculation enable state. - * This parameter can be a value of @ref SPI_CRC_Calculation - * @retval None - */ -#define IS_SPI_CRC_CALCULATION(__CALCULATION__) (((__CALCULATION__) == SPI_CRCCALCULATION_DISABLE) || \ - ((__CALCULATION__) == SPI_CRCCALCULATION_ENABLE)) - -/** @brief Checks if SPI polynomial value to be used for the CRC calculation, is in allowed range. - * @param __POLYNOMIAL__ specifies the SPI polynomial value to be used for the CRC calculation. - * This parameter must be a number between Min_Data = 0 and Max_Data = 65535 - * @retval None - */ -#define IS_SPI_CRC_POLYNOMIAL(__POLYNOMIAL__) (((__POLYNOMIAL__) >= 0x1U) && \ - ((__POLYNOMIAL__) <= 0xFFFFU) && \ - (((__POLYNOMIAL__)&0x1U) != 0U)) - -/** @brief Checks if DMA handle is valid. - * @param __HANDLE__ specifies a DMA Handle. - * @retval None - */ -#define IS_SPI_DMA_HANDLE(__HANDLE__) ((__HANDLE__) != NULL) - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup SPI_Exported_Functions - * @{ - */ - -/** @addtogroup SPI_Exported_Functions_Group1 - * @{ - */ -/* Initialization/de-initialization functions ********************************/ -HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi); -HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi); -void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi); -void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi); - -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) -HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID, - pSPI_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @addtogroup SPI_Exported_Functions_Group2 - * @{ - */ -/* I/O operation functions ***************************************************/ -HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size); -HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size); -HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi); -HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi); -HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi); -/* Transfer Abort functions */ -HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi); -HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi); - -void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi); -/** - * @} - */ - -/** @addtogroup SPI_Exported_Functions_Group3 - * @{ - */ -/* Peripheral State and Error functions ***************************************/ -HAL_SPI_StateTypeDef HAL_SPI_GetState(const SPI_HandleTypeDef *hspi); -uint32_t HAL_SPI_GetError(const SPI_HandleTypeDef *hspi); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_SPI_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sram.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sram.h deleted file mode 100644 index a6e6111..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sram.h +++ /dev/null @@ -1,236 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_sram.h - * @author MCD Application Team - * @brief Header file of SRAM HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_SRAM_H -#define STM32F4xx_HAL_SRAM_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(FMC_Bank1) || defined(FSMC_Bank1) - -/* Includes ------------------------------------------------------------------*/ -#if defined(FSMC_Bank1) -#include "stm32f4xx_ll_fsmc.h" -#else -#include "stm32f4xx_ll_fmc.h" -#endif /* FSMC_Bank1 */ - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ -/** @addtogroup SRAM - * @{ - */ - -/* Exported typedef ----------------------------------------------------------*/ - -/** @defgroup SRAM_Exported_Types SRAM Exported Types - * @{ - */ -/** - * @brief HAL SRAM State structures definition - */ -typedef enum -{ - HAL_SRAM_STATE_RESET = 0x00U, /*!< SRAM not yet initialized or disabled */ - HAL_SRAM_STATE_READY = 0x01U, /*!< SRAM initialized and ready for use */ - HAL_SRAM_STATE_BUSY = 0x02U, /*!< SRAM internal process is ongoing */ - HAL_SRAM_STATE_ERROR = 0x03U, /*!< SRAM error state */ - HAL_SRAM_STATE_PROTECTED = 0x04U /*!< SRAM peripheral NORSRAM device write protected */ - -} HAL_SRAM_StateTypeDef; - -/** - * @brief SRAM handle Structure definition - */ -#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1) -typedef struct __SRAM_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */ -{ - FMC_NORSRAM_TypeDef *Instance; /*!< Register base address */ - - FMC_NORSRAM_EXTENDED_TypeDef *Extended; /*!< Extended mode register base address */ - - FMC_NORSRAM_InitTypeDef Init; /*!< SRAM device control configuration parameters */ - - HAL_LockTypeDef Lock; /*!< SRAM locking object */ - - __IO HAL_SRAM_StateTypeDef State; /*!< SRAM device access state */ - - DMA_HandleTypeDef *hdma; /*!< Pointer DMA handler */ - -#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1) - void (* MspInitCallback)(struct __SRAM_HandleTypeDef *hsram); /*!< SRAM Msp Init callback */ - void (* MspDeInitCallback)(struct __SRAM_HandleTypeDef *hsram); /*!< SRAM Msp DeInit callback */ - void (* DmaXferCpltCallback)(DMA_HandleTypeDef *hdma); /*!< SRAM DMA Xfer Complete callback */ - void (* DmaXferErrorCallback)(DMA_HandleTypeDef *hdma); /*!< SRAM DMA Xfer Error callback */ -#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */ -} SRAM_HandleTypeDef; - -#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1) -/** - * @brief HAL SRAM Callback ID enumeration definition - */ -typedef enum -{ - HAL_SRAM_MSP_INIT_CB_ID = 0x00U, /*!< SRAM MspInit Callback ID */ - HAL_SRAM_MSP_DEINIT_CB_ID = 0x01U, /*!< SRAM MspDeInit Callback ID */ - HAL_SRAM_DMA_XFER_CPLT_CB_ID = 0x02U, /*!< SRAM DMA Xfer Complete Callback ID */ - HAL_SRAM_DMA_XFER_ERR_CB_ID = 0x03U /*!< SRAM DMA Xfer Complete Callback ID */ -} HAL_SRAM_CallbackIDTypeDef; - -/** - * @brief HAL SRAM Callback pointer definition - */ -typedef void (*pSRAM_CallbackTypeDef)(SRAM_HandleTypeDef *hsram); -typedef void (*pSRAM_DmaCallbackTypeDef)(DMA_HandleTypeDef *hdma); -#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ - -/** @defgroup SRAM_Exported_Macros SRAM Exported Macros - * @{ - */ - -/** @brief Reset SRAM handle state - * @param __HANDLE__ SRAM handle - * @retval None - */ -#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1) -#define __HAL_SRAM_RESET_HANDLE_STATE(__HANDLE__) do { \ - (__HANDLE__)->State = HAL_SRAM_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_SRAM_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_SRAM_STATE_RESET) -#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup SRAM_Exported_Functions SRAM Exported Functions - * @{ - */ - -/** @addtogroup SRAM_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ - -/* Initialization/de-initialization functions ********************************/ -HAL_StatusTypeDef HAL_SRAM_Init(SRAM_HandleTypeDef *hsram, FMC_NORSRAM_TimingTypeDef *Timing, - FMC_NORSRAM_TimingTypeDef *ExtTiming); -HAL_StatusTypeDef HAL_SRAM_DeInit(SRAM_HandleTypeDef *hsram); -void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram); -void HAL_SRAM_MspDeInit(SRAM_HandleTypeDef *hsram); - -/** - * @} - */ - -/** @addtogroup SRAM_Exported_Functions_Group2 Input Output and memory control functions - * @{ - */ - -/* I/O operation functions ***************************************************/ -HAL_StatusTypeDef HAL_SRAM_Read_8b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint8_t *pDstBuffer, - uint32_t BufferSize); -HAL_StatusTypeDef HAL_SRAM_Write_8b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint8_t *pSrcBuffer, - uint32_t BufferSize); -HAL_StatusTypeDef HAL_SRAM_Read_16b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint16_t *pDstBuffer, - uint32_t BufferSize); -HAL_StatusTypeDef HAL_SRAM_Write_16b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint16_t *pSrcBuffer, - uint32_t BufferSize); -HAL_StatusTypeDef HAL_SRAM_Read_32b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pDstBuffer, - uint32_t BufferSize); -HAL_StatusTypeDef HAL_SRAM_Write_32b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pSrcBuffer, - uint32_t BufferSize); -HAL_StatusTypeDef HAL_SRAM_Read_DMA(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pDstBuffer, - uint32_t BufferSize); -HAL_StatusTypeDef HAL_SRAM_Write_DMA(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pSrcBuffer, - uint32_t BufferSize); - -void HAL_SRAM_DMA_XferCpltCallback(DMA_HandleTypeDef *hdma); -void HAL_SRAM_DMA_XferErrorCallback(DMA_HandleTypeDef *hdma); - -#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1) -/* SRAM callback registering/unregistering */ -HAL_StatusTypeDef HAL_SRAM_RegisterCallback(SRAM_HandleTypeDef *hsram, HAL_SRAM_CallbackIDTypeDef CallbackId, - pSRAM_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_SRAM_UnRegisterCallback(SRAM_HandleTypeDef *hsram, HAL_SRAM_CallbackIDTypeDef CallbackId); -HAL_StatusTypeDef HAL_SRAM_RegisterDmaCallback(SRAM_HandleTypeDef *hsram, HAL_SRAM_CallbackIDTypeDef CallbackId, - pSRAM_DmaCallbackTypeDef pCallback); -#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @addtogroup SRAM_Exported_Functions_Group3 Control functions - * @{ - */ - -/* SRAM Control functions ****************************************************/ -HAL_StatusTypeDef HAL_SRAM_WriteOperation_Enable(SRAM_HandleTypeDef *hsram); -HAL_StatusTypeDef HAL_SRAM_WriteOperation_Disable(SRAM_HandleTypeDef *hsram); - -/** - * @} - */ - -/** @addtogroup SRAM_Exported_Functions_Group4 Peripheral State functions - * @{ - */ - -/* SRAM State functions ******************************************************/ -HAL_SRAM_StateTypeDef HAL_SRAM_GetState(const SRAM_HandleTypeDef *hsram); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* FMC_Bank1 || FSMC_Bank1 */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_SRAM_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h deleted file mode 100644 index 53c9bf6..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h +++ /dev/null @@ -1,2157 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim.h - * @author MCD Application Team - * @brief Header file of TIM HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_TIM_H -#define STM32F4xx_HAL_TIM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup TIM - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup TIM_Exported_Types TIM Exported Types - * @{ - */ - -/** - * @brief TIM Time base Configuration Structure definition - */ -typedef struct -{ - uint32_t Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t CounterMode; /*!< Specifies the counter mode. - This parameter can be a value of @ref TIM_Counter_Mode */ - - uint32_t Period; /*!< Specifies the period value to be loaded into the active - Auto-Reload Register at the next update event. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ - - uint32_t ClockDivision; /*!< Specifies the clock division. - This parameter can be a value of @ref TIM_ClockDivision */ - - uint32_t RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter - reaches zero, an update event is generated and counting restarts - from the RCR value (N). - This means in PWM mode that (N+1) corresponds to: - - the number of PWM periods in edge-aligned mode - - the number of half PWM period in center-aligned mode - GP timers: this parameter must be a number between Min_Data = 0x00 and - Max_Data = 0xFF. - Advanced timers: this parameter must be a number between Min_Data = 0x0000 and - Max_Data = 0xFFFF. */ - - uint32_t AutoReloadPreload; /*!< Specifies the auto-reload preload. - This parameter can be a value of @ref TIM_AutoReloadPreload */ -} TIM_Base_InitTypeDef; - -/** - * @brief TIM Output Compare Configuration Structure definition - */ -typedef struct -{ - uint32_t OCMode; /*!< Specifies the TIM mode. - This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ - - uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_Output_Compare_Polarity */ - - uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_Output_Compare_N_Polarity - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCFastMode; /*!< Specifies the Fast mode state. - This parameter can be a value of @ref TIM_Output_Fast_State - @note This parameter is valid only in PWM1 and PWM2 mode. */ - - - uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ -} TIM_OC_InitTypeDef; - -/** - * @brief TIM One Pulse Mode Configuration Structure definition - */ -typedef struct -{ - uint32_t OCMode; /*!< Specifies the TIM mode. - This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ - - uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_Output_Compare_Polarity */ - - uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_Output_Compare_N_Polarity - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t ICSelection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t ICFilter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_OnePulse_InitTypeDef; - -/** - * @brief TIM Input Capture Configuration Structure definition - */ -typedef struct -{ - uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t ICSelection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t ICPrescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t ICFilter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_IC_InitTypeDef; - -/** - * @brief TIM Encoder Configuration Structure definition - */ -typedef struct -{ - uint32_t EncoderMode; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Mode */ - - uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ - - uint32_t IC1Selection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC1Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - - uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ - - uint32_t IC2Selection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t IC2Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC2Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_Encoder_InitTypeDef; - -/** - * @brief Clock Configuration Handle Structure definition - */ -typedef struct -{ - uint32_t ClockSource; /*!< TIM clock sources - This parameter can be a value of @ref TIM_Clock_Source */ - uint32_t ClockPolarity; /*!< TIM clock polarity - This parameter can be a value of @ref TIM_Clock_Polarity */ - uint32_t ClockPrescaler; /*!< TIM clock prescaler - This parameter can be a value of @ref TIM_Clock_Prescaler */ - uint32_t ClockFilter; /*!< TIM clock filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_ClockConfigTypeDef; - -/** - * @brief TIM Clear Input Configuration Handle Structure definition - */ -typedef struct -{ - uint32_t ClearInputState; /*!< TIM clear Input state - This parameter can be ENABLE or DISABLE */ - uint32_t ClearInputSource; /*!< TIM clear Input sources - This parameter can be a value of @ref TIM_ClearInput_Source */ - uint32_t ClearInputPolarity; /*!< TIM Clear Input polarity - This parameter can be a value of @ref TIM_ClearInput_Polarity */ - uint32_t ClearInputPrescaler; /*!< TIM Clear Input prescaler - This parameter must be 0: When OCRef clear feature is used with ETR source, - ETR prescaler must be off */ - uint32_t ClearInputFilter; /*!< TIM Clear Input filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_ClearInputConfigTypeDef; - -/** - * @brief TIM Master configuration Structure definition - */ -typedef struct -{ - uint32_t MasterOutputTrigger; /*!< Trigger output (TRGO) selection - This parameter can be a value of @ref TIM_Master_Mode_Selection */ - uint32_t MasterSlaveMode; /*!< Master/slave mode selection - This parameter can be a value of @ref TIM_Master_Slave_Mode - @note When the Master/slave mode is enabled, the effect of - an event on the trigger input (TRGI) is delayed to allow a - perfect synchronization between the current timer and its - slaves (through TRGO). It is not mandatory in case of timer - synchronization mode. */ -} TIM_MasterConfigTypeDef; - -/** - * @brief TIM Slave configuration Structure definition - */ -typedef struct -{ - uint32_t SlaveMode; /*!< Slave mode selection - This parameter can be a value of @ref TIM_Slave_Mode */ - uint32_t InputTrigger; /*!< Input Trigger source - This parameter can be a value of @ref TIM_Trigger_Selection */ - uint32_t TriggerPolarity; /*!< Input Trigger polarity - This parameter can be a value of @ref TIM_Trigger_Polarity */ - uint32_t TriggerPrescaler; /*!< Input trigger prescaler - This parameter can be a value of @ref TIM_Trigger_Prescaler */ - uint32_t TriggerFilter; /*!< Input trigger filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - -} TIM_SlaveConfigTypeDef; - -/** - * @brief TIM Break input(s) and Dead time configuration Structure definition - * @note 2 break inputs can be configured (BKIN and BKIN2) with configurable - * filter and polarity. - */ -typedef struct -{ - uint32_t OffStateRunMode; /*!< TIM off state in run mode, This parameter can be a value of @ref TIM_OSSR_Off_State_Selection_for_Run_mode_state */ - - uint32_t OffStateIDLEMode; /*!< TIM off state in IDLE mode, This parameter can be a value of @ref TIM_OSSI_Off_State_Selection_for_Idle_mode_state */ - - uint32_t LockLevel; /*!< TIM Lock level, This parameter can be a value of @ref TIM_Lock_level */ - - uint32_t DeadTime; /*!< TIM dead Time, This parameter can be a number between Min_Data = 0x00 and Max_Data = 0xFF */ - - uint32_t BreakState; /*!< TIM Break State, This parameter can be a value of @ref TIM_Break_Input_enable_disable */ - - uint32_t BreakPolarity; /*!< TIM Break input polarity, This parameter can be a value of @ref TIM_Break_Polarity */ - - uint32_t BreakFilter; /*!< Specifies the break input filter.This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - - uint32_t AutomaticOutput; /*!< TIM Automatic Output Enable state, This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ - -} TIM_BreakDeadTimeConfigTypeDef; - -/** - * @brief HAL State structures definition - */ -typedef enum -{ - HAL_TIM_STATE_RESET = 0x00U, /*!< Peripheral not yet initialized or disabled */ - HAL_TIM_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ - HAL_TIM_STATE_BUSY = 0x02U, /*!< An internal process is ongoing */ - HAL_TIM_STATE_TIMEOUT = 0x03U, /*!< Timeout state */ - HAL_TIM_STATE_ERROR = 0x04U /*!< Reception process is ongoing */ -} HAL_TIM_StateTypeDef; - -/** - * @brief TIM Channel States definition - */ -typedef enum -{ - HAL_TIM_CHANNEL_STATE_RESET = 0x00U, /*!< TIM Channel initial state */ - HAL_TIM_CHANNEL_STATE_READY = 0x01U, /*!< TIM Channel ready for use */ - HAL_TIM_CHANNEL_STATE_BUSY = 0x02U, /*!< An internal process is ongoing on the TIM channel */ -} HAL_TIM_ChannelStateTypeDef; - -/** - * @brief DMA Burst States definition - */ -typedef enum -{ - HAL_DMA_BURST_STATE_RESET = 0x00U, /*!< DMA Burst initial state */ - HAL_DMA_BURST_STATE_READY = 0x01U, /*!< DMA Burst ready for use */ - HAL_DMA_BURST_STATE_BUSY = 0x02U, /*!< Ongoing DMA Burst */ -} HAL_TIM_DMABurstStateTypeDef; - -/** - * @brief HAL Active channel structures definition - */ -typedef enum -{ - HAL_TIM_ACTIVE_CHANNEL_1 = 0x01U, /*!< The active channel is 1 */ - HAL_TIM_ACTIVE_CHANNEL_2 = 0x02U, /*!< The active channel is 2 */ - HAL_TIM_ACTIVE_CHANNEL_3 = 0x04U, /*!< The active channel is 3 */ - HAL_TIM_ACTIVE_CHANNEL_4 = 0x08U, /*!< The active channel is 4 */ - HAL_TIM_ACTIVE_CHANNEL_CLEARED = 0x00U /*!< All active channels cleared */ -} HAL_TIM_ActiveChannel; - -/** - * @brief TIM Time Base Handle Structure definition - */ -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -typedef struct __TIM_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -{ - TIM_TypeDef *Instance; /*!< Register base address */ - TIM_Base_InitTypeDef Init; /*!< TIM Time Base required parameters */ - HAL_TIM_ActiveChannel Channel; /*!< Active channel */ - DMA_HandleTypeDef *hdma[7]; /*!< DMA Handlers array - This array is accessed by a @ref DMA_Handle_index */ - HAL_LockTypeDef Lock; /*!< Locking object */ - __IO HAL_TIM_StateTypeDef State; /*!< TIM operation state */ - __IO HAL_TIM_ChannelStateTypeDef ChannelState[4]; /*!< TIM channel operation state */ - __IO HAL_TIM_ChannelStateTypeDef ChannelNState[4]; /*!< TIM complementary channel operation state */ - __IO HAL_TIM_DMABurstStateTypeDef DMABurstState; /*!< DMA burst operation state */ - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - void (* Base_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp Init Callback */ - void (* Base_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp DeInit Callback */ - void (* IC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp Init Callback */ - void (* IC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp DeInit Callback */ - void (* OC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp Init Callback */ - void (* OC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp DeInit Callback */ - void (* PWM_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp Init Callback */ - void (* PWM_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp DeInit Callback */ - void (* OnePulse_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp Init Callback */ - void (* OnePulse_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp DeInit Callback */ - void (* Encoder_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp Init Callback */ - void (* Encoder_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp DeInit Callback */ - void (* HallSensor_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp Init Callback */ - void (* HallSensor_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp DeInit Callback */ - void (* PeriodElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed Callback */ - void (* PeriodElapsedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed half complete Callback */ - void (* TriggerCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger Callback */ - void (* TriggerHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger half complete Callback */ - void (* IC_CaptureCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture Callback */ - void (* IC_CaptureHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture half complete Callback */ - void (* OC_DelayElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Output Compare Delay Elapsed Callback */ - void (* PWM_PulseFinishedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished Callback */ - void (* PWM_PulseFinishedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished half complete Callback */ - void (* ErrorCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Error Callback */ - void (* CommutationCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation Callback */ - void (* CommutationHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation half complete Callback */ - void (* BreakCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Break Callback */ -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} TIM_HandleTypeDef; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -/** - * @brief HAL TIM Callback ID enumeration definition - */ -typedef enum -{ - HAL_TIM_BASE_MSPINIT_CB_ID = 0x00U /*!< TIM Base MspInit Callback ID */ - , HAL_TIM_BASE_MSPDEINIT_CB_ID = 0x01U /*!< TIM Base MspDeInit Callback ID */ - , HAL_TIM_IC_MSPINIT_CB_ID = 0x02U /*!< TIM IC MspInit Callback ID */ - , HAL_TIM_IC_MSPDEINIT_CB_ID = 0x03U /*!< TIM IC MspDeInit Callback ID */ - , HAL_TIM_OC_MSPINIT_CB_ID = 0x04U /*!< TIM OC MspInit Callback ID */ - , HAL_TIM_OC_MSPDEINIT_CB_ID = 0x05U /*!< TIM OC MspDeInit Callback ID */ - , HAL_TIM_PWM_MSPINIT_CB_ID = 0x06U /*!< TIM PWM MspInit Callback ID */ - , HAL_TIM_PWM_MSPDEINIT_CB_ID = 0x07U /*!< TIM PWM MspDeInit Callback ID */ - , HAL_TIM_ONE_PULSE_MSPINIT_CB_ID = 0x08U /*!< TIM One Pulse MspInit Callback ID */ - , HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID = 0x09U /*!< TIM One Pulse MspDeInit Callback ID */ - , HAL_TIM_ENCODER_MSPINIT_CB_ID = 0x0AU /*!< TIM Encoder MspInit Callback ID */ - , HAL_TIM_ENCODER_MSPDEINIT_CB_ID = 0x0BU /*!< TIM Encoder MspDeInit Callback ID */ - , HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID = 0x0CU /*!< TIM Hall Sensor MspDeInit Callback ID */ - , HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID = 0x0DU /*!< TIM Hall Sensor MspDeInit Callback ID */ - , HAL_TIM_PERIOD_ELAPSED_CB_ID = 0x0EU /*!< TIM Period Elapsed Callback ID */ - , HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID = 0x0FU /*!< TIM Period Elapsed half complete Callback ID */ - , HAL_TIM_TRIGGER_CB_ID = 0x10U /*!< TIM Trigger Callback ID */ - , HAL_TIM_TRIGGER_HALF_CB_ID = 0x11U /*!< TIM Trigger half complete Callback ID */ - , HAL_TIM_IC_CAPTURE_CB_ID = 0x12U /*!< TIM Input Capture Callback ID */ - , HAL_TIM_IC_CAPTURE_HALF_CB_ID = 0x13U /*!< TIM Input Capture half complete Callback ID */ - , HAL_TIM_OC_DELAY_ELAPSED_CB_ID = 0x14U /*!< TIM Output Compare Delay Elapsed Callback ID */ - , HAL_TIM_PWM_PULSE_FINISHED_CB_ID = 0x15U /*!< TIM PWM Pulse Finished Callback ID */ - , HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID = 0x16U /*!< TIM PWM Pulse Finished half complete Callback ID */ - , HAL_TIM_ERROR_CB_ID = 0x17U /*!< TIM Error Callback ID */ - , HAL_TIM_COMMUTATION_CB_ID = 0x18U /*!< TIM Commutation Callback ID */ - , HAL_TIM_COMMUTATION_HALF_CB_ID = 0x19U /*!< TIM Commutation half complete Callback ID */ - , HAL_TIM_BREAK_CB_ID = 0x1AU /*!< TIM Break Callback ID */ -} HAL_TIM_CallbackIDTypeDef; - -/** - * @brief HAL TIM Callback pointer definition - */ -typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to the TIM callback function */ - -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ -/* End of exported types -----------------------------------------------------*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup TIM_Exported_Constants TIM Exported Constants - * @{ - */ - -/** @defgroup TIM_ClearInput_Source TIM Clear Input Source - * @{ - */ -#define TIM_CLEARINPUTSOURCE_NONE 0x00000000U /*!< OCREF_CLR is disabled */ -#define TIM_CLEARINPUTSOURCE_ETR 0x00000001U /*!< OCREF_CLR is connected to ETRF input */ -/** - * @} - */ - -/** @defgroup TIM_DMA_Base_address TIM DMA Base Address - * @{ - */ -#define TIM_DMABASE_CR1 0x00000000U -#define TIM_DMABASE_CR2 0x00000001U -#define TIM_DMABASE_SMCR 0x00000002U -#define TIM_DMABASE_DIER 0x00000003U -#define TIM_DMABASE_SR 0x00000004U -#define TIM_DMABASE_EGR 0x00000005U -#define TIM_DMABASE_CCMR1 0x00000006U -#define TIM_DMABASE_CCMR2 0x00000007U -#define TIM_DMABASE_CCER 0x00000008U -#define TIM_DMABASE_CNT 0x00000009U -#define TIM_DMABASE_PSC 0x0000000AU -#define TIM_DMABASE_ARR 0x0000000BU -#define TIM_DMABASE_RCR 0x0000000CU -#define TIM_DMABASE_CCR1 0x0000000DU -#define TIM_DMABASE_CCR2 0x0000000EU -#define TIM_DMABASE_CCR3 0x0000000FU -#define TIM_DMABASE_CCR4 0x00000010U -#define TIM_DMABASE_BDTR 0x00000011U -#define TIM_DMABASE_DCR 0x00000012U -#define TIM_DMABASE_DMAR 0x00000013U -/** - * @} - */ - -/** @defgroup TIM_Event_Source TIM Event Source - * @{ - */ -#define TIM_EVENTSOURCE_UPDATE TIM_EGR_UG /*!< Reinitialize the counter and generates an update of the registers */ -#define TIM_EVENTSOURCE_CC1 TIM_EGR_CC1G /*!< A capture/compare event is generated on channel 1 */ -#define TIM_EVENTSOURCE_CC2 TIM_EGR_CC2G /*!< A capture/compare event is generated on channel 2 */ -#define TIM_EVENTSOURCE_CC3 TIM_EGR_CC3G /*!< A capture/compare event is generated on channel 3 */ -#define TIM_EVENTSOURCE_CC4 TIM_EGR_CC4G /*!< A capture/compare event is generated on channel 4 */ -#define TIM_EVENTSOURCE_COM TIM_EGR_COMG /*!< A commutation event is generated */ -#define TIM_EVENTSOURCE_TRIGGER TIM_EGR_TG /*!< A trigger event is generated */ -#define TIM_EVENTSOURCE_BREAK TIM_EGR_BG /*!< A break event is generated */ -/** - * @} - */ - -/** @defgroup TIM_Input_Channel_Polarity TIM Input Channel polarity - * @{ - */ -#define TIM_INPUTCHANNELPOLARITY_RISING 0x00000000U /*!< Polarity for TIx source */ -#define TIM_INPUTCHANNELPOLARITY_FALLING TIM_CCER_CC1P /*!< Polarity for TIx source */ -#define TIM_INPUTCHANNELPOLARITY_BOTHEDGE (TIM_CCER_CC1P | TIM_CCER_CC1NP) /*!< Polarity for TIx source */ -/** - * @} - */ - -/** @defgroup TIM_ETR_Polarity TIM ETR Polarity - * @{ - */ -#define TIM_ETRPOLARITY_INVERTED TIM_SMCR_ETP /*!< Polarity for ETR source */ -#define TIM_ETRPOLARITY_NONINVERTED 0x00000000U /*!< Polarity for ETR source */ -/** - * @} - */ - -/** @defgroup TIM_ETR_Prescaler TIM ETR Prescaler - * @{ - */ -#define TIM_ETRPRESCALER_DIV1 0x00000000U /*!< No prescaler is used */ -#define TIM_ETRPRESCALER_DIV2 TIM_SMCR_ETPS_0 /*!< ETR input source is divided by 2 */ -#define TIM_ETRPRESCALER_DIV4 TIM_SMCR_ETPS_1 /*!< ETR input source is divided by 4 */ -#define TIM_ETRPRESCALER_DIV8 TIM_SMCR_ETPS /*!< ETR input source is divided by 8 */ -/** - * @} - */ - -/** @defgroup TIM_Counter_Mode TIM Counter Mode - * @{ - */ -#define TIM_COUNTERMODE_UP 0x00000000U /*!< Counter used as up-counter */ -#define TIM_COUNTERMODE_DOWN TIM_CR1_DIR /*!< Counter used as down-counter */ -#define TIM_COUNTERMODE_CENTERALIGNED1 TIM_CR1_CMS_0 /*!< Center-aligned mode 1 */ -#define TIM_COUNTERMODE_CENTERALIGNED2 TIM_CR1_CMS_1 /*!< Center-aligned mode 2 */ -#define TIM_COUNTERMODE_CENTERALIGNED3 TIM_CR1_CMS /*!< Center-aligned mode 3 */ -/** - * @} - */ - -/** @defgroup TIM_ClockDivision TIM Clock Division - * @{ - */ -#define TIM_CLOCKDIVISION_DIV1 0x00000000U /*!< Clock division: tDTS=tCK_INT */ -#define TIM_CLOCKDIVISION_DIV2 TIM_CR1_CKD_0 /*!< Clock division: tDTS=2*tCK_INT */ -#define TIM_CLOCKDIVISION_DIV4 TIM_CR1_CKD_1 /*!< Clock division: tDTS=4*tCK_INT */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_State TIM Output Compare State - * @{ - */ -#define TIM_OUTPUTSTATE_DISABLE 0x00000000U /*!< Capture/Compare 1 output disabled */ -#define TIM_OUTPUTSTATE_ENABLE TIM_CCER_CC1E /*!< Capture/Compare 1 output enabled */ -/** - * @} - */ - -/** @defgroup TIM_AutoReloadPreload TIM Auto-Reload Preload - * @{ - */ -#define TIM_AUTORELOAD_PRELOAD_DISABLE 0x00000000U /*!< TIMx_ARR register is not buffered */ -#define TIM_AUTORELOAD_PRELOAD_ENABLE TIM_CR1_ARPE /*!< TIMx_ARR register is buffered */ - -/** - * @} - */ - -/** @defgroup TIM_Output_Fast_State TIM Output Fast State - * @{ - */ -#define TIM_OCFAST_DISABLE 0x00000000U /*!< Output Compare fast disable */ -#define TIM_OCFAST_ENABLE TIM_CCMR1_OC1FE /*!< Output Compare fast enable */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_State TIM Complementary Output Compare State - * @{ - */ -#define TIM_OUTPUTNSTATE_DISABLE 0x00000000U /*!< OCxN is disabled */ -#define TIM_OUTPUTNSTATE_ENABLE TIM_CCER_CC1NE /*!< OCxN is enabled */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Polarity TIM Output Compare Polarity - * @{ - */ -#define TIM_OCPOLARITY_HIGH 0x00000000U /*!< Capture/Compare output polarity */ -#define TIM_OCPOLARITY_LOW TIM_CCER_CC1P /*!< Capture/Compare output polarity */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Polarity TIM Complementary Output Compare Polarity - * @{ - */ -#define TIM_OCNPOLARITY_HIGH 0x00000000U /*!< Capture/Compare complementary output polarity */ -#define TIM_OCNPOLARITY_LOW TIM_CCER_CC1NP /*!< Capture/Compare complementary output polarity */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Idle_State TIM Output Compare Idle State - * @{ - */ -#define TIM_OCIDLESTATE_SET TIM_CR2_OIS1 /*!< Output Idle state: OCx=1 when MOE=0 */ -#define TIM_OCIDLESTATE_RESET 0x00000000U /*!< Output Idle state: OCx=0 when MOE=0 */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Idle_State TIM Complementary Output Compare Idle State - * @{ - */ -#define TIM_OCNIDLESTATE_SET TIM_CR2_OIS1N /*!< Complementary output Idle state: OCxN=1 when MOE=0 */ -#define TIM_OCNIDLESTATE_RESET 0x00000000U /*!< Complementary output Idle state: OCxN=0 when MOE=0 */ -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Polarity TIM Input Capture Polarity - * @{ - */ -#define TIM_ICPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Capture triggered by rising edge on timer input */ -#define TIM_ICPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Capture triggered by falling edge on timer input */ -#define TIM_ICPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Capture triggered by both rising and falling edges on timer input*/ -/** - * @} - */ - -/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity - * @{ - */ -#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ -#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection - * @{ - */ -#define TIM_ICSELECTION_DIRECTTI TIM_CCMR1_CC1S_0 /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to IC1, IC2, IC3 or IC4, respectively */ -#define TIM_ICSELECTION_INDIRECTTI TIM_CCMR1_CC1S_1 /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to IC2, IC1, IC4 or IC3, respectively */ -#define TIM_ICSELECTION_TRC TIM_CCMR1_CC1S /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC */ -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Prescaler TIM Input Capture Prescaler - * @{ - */ -#define TIM_ICPSC_DIV1 0x00000000U /*!< Capture performed each time an edge is detected on the capture input */ -#define TIM_ICPSC_DIV2 TIM_CCMR1_IC1PSC_0 /*!< Capture performed once every 2 events */ -#define TIM_ICPSC_DIV4 TIM_CCMR1_IC1PSC_1 /*!< Capture performed once every 4 events */ -#define TIM_ICPSC_DIV8 TIM_CCMR1_IC1PSC /*!< Capture performed once every 8 events */ -/** - * @} - */ - -/** @defgroup TIM_One_Pulse_Mode TIM One Pulse Mode - * @{ - */ -#define TIM_OPMODE_SINGLE TIM_CR1_OPM /*!< Counter stops counting at the next update event */ -#define TIM_OPMODE_REPETITIVE 0x00000000U /*!< Counter is not stopped at update event */ -/** - * @} - */ - -/** @defgroup TIM_Encoder_Mode TIM Encoder Mode - * @{ - */ -#define TIM_ENCODERMODE_TI1 TIM_SMCR_SMS_0 /*!< Quadrature encoder mode 1, x2 mode, counts up/down on TI1FP1 edge depending on TI2FP2 level */ -#define TIM_ENCODERMODE_TI2 TIM_SMCR_SMS_1 /*!< Quadrature encoder mode 2, x2 mode, counts up/down on TI2FP2 edge depending on TI1FP1 level. */ -#define TIM_ENCODERMODE_TI12 (TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< Quadrature encoder mode 3, x4 mode, counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input. */ -/** - * @} - */ - -/** @defgroup TIM_Interrupt_definition TIM interrupt Definition - * @{ - */ -#define TIM_IT_UPDATE TIM_DIER_UIE /*!< Update interrupt */ -#define TIM_IT_CC1 TIM_DIER_CC1IE /*!< Capture/Compare 1 interrupt */ -#define TIM_IT_CC2 TIM_DIER_CC2IE /*!< Capture/Compare 2 interrupt */ -#define TIM_IT_CC3 TIM_DIER_CC3IE /*!< Capture/Compare 3 interrupt */ -#define TIM_IT_CC4 TIM_DIER_CC4IE /*!< Capture/Compare 4 interrupt */ -#define TIM_IT_COM TIM_DIER_COMIE /*!< Commutation interrupt */ -#define TIM_IT_TRIGGER TIM_DIER_TIE /*!< Trigger interrupt */ -#define TIM_IT_BREAK TIM_DIER_BIE /*!< Break interrupt */ -/** - * @} - */ - -/** @defgroup TIM_Commutation_Source TIM Commutation Source - * @{ - */ -#define TIM_COMMUTATION_TRGI TIM_CR2_CCUS /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit or when an rising edge occurs on trigger input */ -#define TIM_COMMUTATION_SOFTWARE 0x00000000U /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit */ -/** - * @} - */ - -/** @defgroup TIM_DMA_sources TIM DMA Sources - * @{ - */ -#define TIM_DMA_UPDATE TIM_DIER_UDE /*!< DMA request is triggered by the update event */ -#define TIM_DMA_CC1 TIM_DIER_CC1DE /*!< DMA request is triggered by the capture/compare macth 1 event */ -#define TIM_DMA_CC2 TIM_DIER_CC2DE /*!< DMA request is triggered by the capture/compare macth 2 event event */ -#define TIM_DMA_CC3 TIM_DIER_CC3DE /*!< DMA request is triggered by the capture/compare macth 3 event event */ -#define TIM_DMA_CC4 TIM_DIER_CC4DE /*!< DMA request is triggered by the capture/compare macth 4 event event */ -#define TIM_DMA_COM TIM_DIER_COMDE /*!< DMA request is triggered by the commutation event */ -#define TIM_DMA_TRIGGER TIM_DIER_TDE /*!< DMA request is triggered by the trigger event */ -/** - * @} - */ - -/** @defgroup TIM_CC_DMA_Request CCx DMA request selection - * @{ - */ -#define TIM_CCDMAREQUEST_CC 0x00000000U /*!< CCx DMA request sent when capture or compare match event occurs */ -#define TIM_CCDMAREQUEST_UPDATE TIM_CR2_CCDS /*!< CCx DMA requests sent when update event occurs */ -/** - * @} - */ - -/** @defgroup TIM_Flag_definition TIM Flag Definition - * @{ - */ -#define TIM_FLAG_UPDATE TIM_SR_UIF /*!< Update interrupt flag */ -#define TIM_FLAG_CC1 TIM_SR_CC1IF /*!< Capture/Compare 1 interrupt flag */ -#define TIM_FLAG_CC2 TIM_SR_CC2IF /*!< Capture/Compare 2 interrupt flag */ -#define TIM_FLAG_CC3 TIM_SR_CC3IF /*!< Capture/Compare 3 interrupt flag */ -#define TIM_FLAG_CC4 TIM_SR_CC4IF /*!< Capture/Compare 4 interrupt flag */ -#define TIM_FLAG_COM TIM_SR_COMIF /*!< Commutation interrupt flag */ -#define TIM_FLAG_TRIGGER TIM_SR_TIF /*!< Trigger interrupt flag */ -#define TIM_FLAG_BREAK TIM_SR_BIF /*!< Break interrupt flag */ -#define TIM_FLAG_CC1OF TIM_SR_CC1OF /*!< Capture 1 overcapture flag */ -#define TIM_FLAG_CC2OF TIM_SR_CC2OF /*!< Capture 2 overcapture flag */ -#define TIM_FLAG_CC3OF TIM_SR_CC3OF /*!< Capture 3 overcapture flag */ -#define TIM_FLAG_CC4OF TIM_SR_CC4OF /*!< Capture 4 overcapture flag */ -/** - * @} - */ - -/** @defgroup TIM_Channel TIM Channel - * @{ - */ -#define TIM_CHANNEL_1 0x00000000U /*!< Capture/compare channel 1 identifier */ -#define TIM_CHANNEL_2 0x00000004U /*!< Capture/compare channel 2 identifier */ -#define TIM_CHANNEL_3 0x00000008U /*!< Capture/compare channel 3 identifier */ -#define TIM_CHANNEL_4 0x0000000CU /*!< Capture/compare channel 4 identifier */ -#define TIM_CHANNEL_ALL 0x0000003CU /*!< Global Capture/compare channel identifier */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Source TIM Clock Source - * @{ - */ -#define TIM_CLOCKSOURCE_INTERNAL TIM_SMCR_ETPS_0 /*!< Internal clock source */ -#define TIM_CLOCKSOURCE_ETRMODE1 TIM_TS_ETRF /*!< External clock source mode 1 (ETRF) */ -#define TIM_CLOCKSOURCE_ETRMODE2 TIM_SMCR_ETPS_1 /*!< External clock source mode 2 */ -#define TIM_CLOCKSOURCE_TI1ED TIM_TS_TI1F_ED /*!< External clock source mode 1 (TTI1FP1 + edge detect.) */ -#define TIM_CLOCKSOURCE_TI1 TIM_TS_TI1FP1 /*!< External clock source mode 1 (TTI1FP1) */ -#define TIM_CLOCKSOURCE_TI2 TIM_TS_TI2FP2 /*!< External clock source mode 1 (TTI2FP2) */ -#define TIM_CLOCKSOURCE_ITR0 TIM_TS_ITR0 /*!< External clock source mode 1 (ITR0) */ -#define TIM_CLOCKSOURCE_ITR1 TIM_TS_ITR1 /*!< External clock source mode 1 (ITR1) */ -#define TIM_CLOCKSOURCE_ITR2 TIM_TS_ITR2 /*!< External clock source mode 1 (ITR2) */ -#define TIM_CLOCKSOURCE_ITR3 TIM_TS_ITR3 /*!< External clock source mode 1 (ITR3) */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Polarity TIM Clock Polarity - * @{ - */ -#define TIM_CLOCKPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx clock sources */ -#define TIM_CLOCKPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx clock sources */ -#define TIM_CLOCKPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIx clock sources */ -#define TIM_CLOCKPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIx clock sources */ -#define TIM_CLOCKPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIx clock sources */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Prescaler TIM Clock Prescaler - * @{ - */ -#define TIM_CLOCKPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_CLOCKPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Clock: Capture performed once every 2 events. */ -#define TIM_CLOCKPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Clock: Capture performed once every 4 events. */ -#define TIM_CLOCKPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Clock: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_ClearInput_Polarity TIM Clear Input Polarity - * @{ - */ -#define TIM_CLEARINPUTPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx pin */ -#define TIM_CLEARINPUTPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx pin */ -/** - * @} - */ - -/** @defgroup TIM_ClearInput_Prescaler TIM Clear Input Prescaler - * @{ - */ -#define TIM_CLEARINPUTPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_CLEARINPUTPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR pin: Capture performed once every 2 events. */ -#define TIM_CLEARINPUTPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR pin: Capture performed once every 4 events. */ -#define TIM_CLEARINPUTPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR pin: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_OSSR_Off_State_Selection_for_Run_mode_state TIM OSSR OffState Selection for Run mode state - * @{ - */ -#define TIM_OSSR_ENABLE TIM_BDTR_OSSR /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ -#define TIM_OSSR_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ -/** - * @} - */ - -/** @defgroup TIM_OSSI_Off_State_Selection_for_Idle_mode_state TIM OSSI OffState Selection for Idle mode state - * @{ - */ -#define TIM_OSSI_ENABLE TIM_BDTR_OSSI /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ -#define TIM_OSSI_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ -/** - * @} - */ -/** @defgroup TIM_Lock_level TIM Lock level - * @{ - */ -#define TIM_LOCKLEVEL_OFF 0x00000000U /*!< LOCK OFF */ -#define TIM_LOCKLEVEL_1 TIM_BDTR_LOCK_0 /*!< LOCK Level 1 */ -#define TIM_LOCKLEVEL_2 TIM_BDTR_LOCK_1 /*!< LOCK Level 2 */ -#define TIM_LOCKLEVEL_3 TIM_BDTR_LOCK /*!< LOCK Level 3 */ -/** - * @} - */ - -/** @defgroup TIM_Break_Input_enable_disable TIM Break Input Enable - * @{ - */ -#define TIM_BREAK_ENABLE TIM_BDTR_BKE /*!< Break input BRK is enabled */ -#define TIM_BREAK_DISABLE 0x00000000U /*!< Break input BRK is disabled */ -/** - * @} - */ - -/** @defgroup TIM_Break_Polarity TIM Break Input Polarity - * @{ - */ -#define TIM_BREAKPOLARITY_LOW 0x00000000U /*!< Break input BRK is active low */ -#define TIM_BREAKPOLARITY_HIGH TIM_BDTR_BKP /*!< Break input BRK is active high */ -/** - * @} - */ - -/** @defgroup TIM_AOE_Bit_Set_Reset TIM Automatic Output Enable - * @{ - */ -#define TIM_AUTOMATICOUTPUT_DISABLE 0x00000000U /*!< MOE can be set only by software */ -#define TIM_AUTOMATICOUTPUT_ENABLE TIM_BDTR_AOE /*!< MOE can be set by software or automatically at the next update event (if none of the break inputs BRK and BRK2 is active) */ -/** - * @} - */ - -/** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection - * @{ - */ -#define TIM_TRGO_RESET 0x00000000U /*!< TIMx_EGR.UG bit is used as trigger output (TRGO) */ -#define TIM_TRGO_ENABLE TIM_CR2_MMS_0 /*!< TIMx_CR1.CEN bit is used as trigger output (TRGO) */ -#define TIM_TRGO_UPDATE TIM_CR2_MMS_1 /*!< Update event is used as trigger output (TRGO) */ -#define TIM_TRGO_OC1 (TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< Capture or a compare match 1 is used as trigger output (TRGO) */ -#define TIM_TRGO_OC1REF TIM_CR2_MMS_2 /*!< OC1REF signal is used as trigger output (TRGO) */ -#define TIM_TRGO_OC2REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_0) /*!< OC2REF signal is used as trigger output(TRGO) */ -#define TIM_TRGO_OC3REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1) /*!< OC3REF signal is used as trigger output(TRGO) */ -#define TIM_TRGO_OC4REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< OC4REF signal is used as trigger output(TRGO) */ -/** - * @} - */ - -/** @defgroup TIM_Master_Slave_Mode TIM Master/Slave Mode - * @{ - */ -#define TIM_MASTERSLAVEMODE_ENABLE TIM_SMCR_MSM /*!< No action */ -#define TIM_MASTERSLAVEMODE_DISABLE 0x00000000U /*!< Master/slave mode is selected */ -/** - * @} - */ - -/** @defgroup TIM_Slave_Mode TIM Slave mode - * @{ - */ -#define TIM_SLAVEMODE_DISABLE 0x00000000U /*!< Slave mode disabled */ -#define TIM_SLAVEMODE_RESET TIM_SMCR_SMS_2 /*!< Reset Mode */ -#define TIM_SLAVEMODE_GATED (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0) /*!< Gated Mode */ -#define TIM_SLAVEMODE_TRIGGER (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1) /*!< Trigger Mode */ -#define TIM_SLAVEMODE_EXTERNAL1 (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< External Clock Mode 1 */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_and_PWM_modes TIM Output Compare and PWM Modes - * @{ - */ -#define TIM_OCMODE_TIMING 0x00000000U /*!< Frozen */ -#define TIM_OCMODE_ACTIVE TIM_CCMR1_OC1M_0 /*!< Set channel to active level on match */ -#define TIM_OCMODE_INACTIVE TIM_CCMR1_OC1M_1 /*!< Set channel to inactive level on match */ -#define TIM_OCMODE_TOGGLE (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< Toggle */ -#define TIM_OCMODE_PWM1 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1) /*!< PWM mode 1 */ -#define TIM_OCMODE_PWM2 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< PWM mode 2 */ -#define TIM_OCMODE_FORCED_ACTIVE (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0) /*!< Force active level */ -#define TIM_OCMODE_FORCED_INACTIVE TIM_CCMR1_OC1M_2 /*!< Force inactive level */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Selection TIM Trigger Selection - * @{ - */ -#define TIM_TS_ITR0 0x00000000U /*!< Internal Trigger 0 (ITR0) */ -#define TIM_TS_ITR1 TIM_SMCR_TS_0 /*!< Internal Trigger 1 (ITR1) */ -#define TIM_TS_ITR2 TIM_SMCR_TS_1 /*!< Internal Trigger 2 (ITR2) */ -#define TIM_TS_ITR3 (TIM_SMCR_TS_0 | TIM_SMCR_TS_1) /*!< Internal Trigger 3 (ITR3) */ -#define TIM_TS_TI1F_ED TIM_SMCR_TS_2 /*!< TI1 Edge Detector (TI1F_ED) */ -#define TIM_TS_TI1FP1 (TIM_SMCR_TS_0 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 1 (TI1FP1) */ -#define TIM_TS_TI2FP2 (TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 2 (TI2FP2) */ -#define TIM_TS_ETRF (TIM_SMCR_TS_0 | TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered External Trigger input (ETRF) */ -#define TIM_TS_NONE 0x0000FFFFU /*!< No trigger selected */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Polarity TIM Trigger Polarity - * @{ - */ -#define TIM_TRIGGERPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx trigger sources */ -#define TIM_TRIGGERPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx trigger sources */ -#define TIM_TRIGGERPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -#define TIM_TRIGGERPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -#define TIM_TRIGGERPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Prescaler TIM Trigger Prescaler - * @{ - */ -#define TIM_TRIGGERPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_TRIGGERPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Trigger: Capture performed once every 2 events. */ -#define TIM_TRIGGERPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Trigger: Capture performed once every 4 events. */ -#define TIM_TRIGGERPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Trigger: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_TI1_Selection TIM TI1 Input Selection - * @{ - */ -#define TIM_TI1SELECTION_CH1 0x00000000U /*!< The TIMx_CH1 pin is connected to TI1 input */ -#define TIM_TI1SELECTION_XORCOMBINATION TIM_CR2_TI1S /*!< The TIMx_CH1, CH2 and CH3 pins are connected to the TI1 input (XOR combination) */ -/** - * @} - */ - -/** @defgroup TIM_DMA_Burst_Length TIM DMA Burst Length - * @{ - */ -#define TIM_DMABURSTLENGTH_1TRANSFER 0x00000000U /*!< The transfer is done to 1 register starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_2TRANSFERS 0x00000100U /*!< The transfer is done to 2 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_3TRANSFERS 0x00000200U /*!< The transfer is done to 3 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_4TRANSFERS 0x00000300U /*!< The transfer is done to 4 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_5TRANSFERS 0x00000400U /*!< The transfer is done to 5 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_6TRANSFERS 0x00000500U /*!< The transfer is done to 6 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_7TRANSFERS 0x00000600U /*!< The transfer is done to 7 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_8TRANSFERS 0x00000700U /*!< The transfer is done to 8 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_9TRANSFERS 0x00000800U /*!< The transfer is done to 9 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_10TRANSFERS 0x00000900U /*!< The transfer is done to 10 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_11TRANSFERS 0x00000A00U /*!< The transfer is done to 11 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_12TRANSFERS 0x00000B00U /*!< The transfer is done to 12 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_13TRANSFERS 0x00000C00U /*!< The transfer is done to 13 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_14TRANSFERS 0x00000D00U /*!< The transfer is done to 14 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_15TRANSFERS 0x00000E00U /*!< The transfer is done to 15 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_16TRANSFERS 0x00000F00U /*!< The transfer is done to 16 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_17TRANSFERS 0x00001000U /*!< The transfer is done to 17 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_18TRANSFERS 0x00001100U /*!< The transfer is done to 18 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ -/** - * @} - */ - -/** @defgroup DMA_Handle_index TIM DMA Handle Index - * @{ - */ -#define TIM_DMA_ID_UPDATE ((uint16_t) 0x0000) /*!< Index of the DMA handle used for Update DMA requests */ -#define TIM_DMA_ID_CC1 ((uint16_t) 0x0001) /*!< Index of the DMA handle used for Capture/Compare 1 DMA requests */ -#define TIM_DMA_ID_CC2 ((uint16_t) 0x0002) /*!< Index of the DMA handle used for Capture/Compare 2 DMA requests */ -#define TIM_DMA_ID_CC3 ((uint16_t) 0x0003) /*!< Index of the DMA handle used for Capture/Compare 3 DMA requests */ -#define TIM_DMA_ID_CC4 ((uint16_t) 0x0004) /*!< Index of the DMA handle used for Capture/Compare 4 DMA requests */ -#define TIM_DMA_ID_COMMUTATION ((uint16_t) 0x0005) /*!< Index of the DMA handle used for Commutation DMA requests */ -#define TIM_DMA_ID_TRIGGER ((uint16_t) 0x0006) /*!< Index of the DMA handle used for Trigger DMA requests */ -/** - * @} - */ - -/** @defgroup Channel_CC_State TIM Capture/Compare Channel State - * @{ - */ -#define TIM_CCx_ENABLE 0x00000001U /*!< Input or output channel is enabled */ -#define TIM_CCx_DISABLE 0x00000000U /*!< Input or output channel is disabled */ -#define TIM_CCxN_ENABLE 0x00000004U /*!< Complementary output channel is enabled */ -#define TIM_CCxN_DISABLE 0x00000000U /*!< Complementary output channel is enabled */ -/** - * @} - */ - -/** - * @} - */ -/* End of exported constants -------------------------------------------------*/ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup TIM_Exported_Macros TIM Exported Macros - * @{ - */ - -/** @brief Reset TIM handle state. - * @param __HANDLE__ TIM handle. - * @retval None - */ -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) do { \ - (__HANDLE__)->State = HAL_TIM_STATE_RESET; \ - (__HANDLE__)->ChannelState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->DMABurstState = HAL_DMA_BURST_STATE_RESET; \ - (__HANDLE__)->Base_MspInitCallback = NULL; \ - (__HANDLE__)->Base_MspDeInitCallback = NULL; \ - (__HANDLE__)->IC_MspInitCallback = NULL; \ - (__HANDLE__)->IC_MspDeInitCallback = NULL; \ - (__HANDLE__)->OC_MspInitCallback = NULL; \ - (__HANDLE__)->OC_MspDeInitCallback = NULL; \ - (__HANDLE__)->PWM_MspInitCallback = NULL; \ - (__HANDLE__)->PWM_MspDeInitCallback = NULL; \ - (__HANDLE__)->OnePulse_MspInitCallback = NULL; \ - (__HANDLE__)->OnePulse_MspDeInitCallback = NULL; \ - (__HANDLE__)->Encoder_MspInitCallback = NULL; \ - (__HANDLE__)->Encoder_MspDeInitCallback = NULL; \ - (__HANDLE__)->HallSensor_MspInitCallback = NULL; \ - (__HANDLE__)->HallSensor_MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) do { \ - (__HANDLE__)->State = HAL_TIM_STATE_RESET; \ - (__HANDLE__)->ChannelState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->ChannelNState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ - (__HANDLE__)->DMABurstState = HAL_DMA_BURST_STATE_RESET; \ - } while(0) -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @brief Enable the TIM peripheral. - * @param __HANDLE__ TIM handle - * @retval None - */ -#define __HAL_TIM_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|=(TIM_CR1_CEN)) - -/** - * @brief Enable the TIM main Output. - * @param __HANDLE__ TIM handle - * @retval None - */ -#define __HAL_TIM_MOE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->BDTR|=(TIM_BDTR_MOE)) - -/** - * @brief Disable the TIM peripheral. - * @param __HANDLE__ TIM handle - * @retval None - */ -#define __HAL_TIM_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ - } \ - } \ - } while(0) - -/** - * @brief Disable the TIM main Output. - * @param __HANDLE__ TIM handle - * @retval None - * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been - * disabled - */ -#define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ - } \ - } \ - } while(0) - -/** - * @brief Disable the TIM main Output. - * @param __HANDLE__ TIM handle - * @retval None - * @note The Main Output Enable of a timer instance is disabled unconditionally - */ -#define __HAL_TIM_MOE_DISABLE_UNCONDITIONALLY(__HANDLE__) (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE) - -/** @brief Enable the specified TIM interrupt. - * @param __HANDLE__ specifies the TIM Handle. - * @param __INTERRUPT__ specifies the TIM interrupt source to enable. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval None - */ -#define __HAL_TIM_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER |= (__INTERRUPT__)) - -/** @brief Disable the specified TIM interrupt. - * @param __HANDLE__ specifies the TIM Handle. - * @param __INTERRUPT__ specifies the TIM interrupt source to disable. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval None - */ -#define __HAL_TIM_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER &= ~(__INTERRUPT__)) - -/** @brief Enable the specified DMA request. - * @param __HANDLE__ specifies the TIM Handle. - * @param __DMA__ specifies the TIM DMA request to enable. - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: Update DMA request - * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request - * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request - * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request - * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request - * @arg TIM_DMA_COM: Commutation DMA request - * @arg TIM_DMA_TRIGGER: Trigger DMA request - * @retval None - */ -#define __HAL_TIM_ENABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER |= (__DMA__)) - -/** @brief Disable the specified DMA request. - * @param __HANDLE__ specifies the TIM Handle. - * @param __DMA__ specifies the TIM DMA request to disable. - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: Update DMA request - * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request - * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request - * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request - * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request - * @arg TIM_DMA_COM: Commutation DMA request - * @arg TIM_DMA_TRIGGER: Trigger DMA request - * @retval None - */ -#define __HAL_TIM_DISABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER &= ~(__DMA__)) - -/** @brief Check whether the specified TIM interrupt flag is set or not. - * @param __HANDLE__ specifies the TIM Handle. - * @param __FLAG__ specifies the TIM interrupt flag to check. - * This parameter can be one of the following values: - * @arg TIM_FLAG_UPDATE: Update interrupt flag - * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag - * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag - * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag - * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag - * @arg TIM_FLAG_COM: Commutation interrupt flag - * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag - * @arg TIM_FLAG_BREAK: Break interrupt flag - * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag - * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag - * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag - * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__)) - -/** @brief Clear the specified TIM interrupt flag. - * @param __HANDLE__ specifies the TIM Handle. - * @param __FLAG__ specifies the TIM interrupt flag to clear. - * This parameter can be one of the following values: - * @arg TIM_FLAG_UPDATE: Update interrupt flag - * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag - * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag - * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag - * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag - * @arg TIM_FLAG_COM: Commutation interrupt flag - * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag - * @arg TIM_FLAG_BREAK: Break interrupt flag - * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag - * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag - * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag - * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_TIM_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) - -/** - * @brief Check whether the specified TIM interrupt source is enabled or not. - * @param __HANDLE__ TIM handle - * @param __INTERRUPT__ specifies the TIM interrupt source to check. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval The state of TIM_IT (SET or RESET). - */ -#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ - == (__INTERRUPT__)) ? SET : RESET) - -/** @brief Clear the TIM interrupt pending bits. - * @param __HANDLE__ TIM handle - * @param __INTERRUPT__ specifies the interrupt pending bit to clear. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval None - */ -#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) - -/** - * @brief Indicates whether or not the TIM Counter is used as downcounter. - * @param __HANDLE__ TIM handle. - * @retval False (Counter used as upcounter) or True (Counter used as downcounter) - * @note This macro is particularly useful to get the counting mode when the timer operates in Center-aligned mode - * or Encoder mode. - */ -#define __HAL_TIM_IS_TIM_COUNTING_DOWN(__HANDLE__) (((__HANDLE__)->Instance->CR1 &(TIM_CR1_DIR)) == (TIM_CR1_DIR)) - -/** - * @brief Set the TIM Prescaler on runtime. - * @param __HANDLE__ TIM handle. - * @param __PRESC__ specifies the Prescaler new value. - * @retval None - */ -#define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__) ((__HANDLE__)->Instance->PSC = (__PRESC__)) - -/** - * @brief Set the TIM Counter Register value on runtime. - * @param __HANDLE__ TIM handle. - * @param __COUNTER__ specifies the Counter register new value. - * @retval None - */ -#define __HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->CNT = (__COUNTER__)) - -/** - * @brief Get the TIM Counter Register value on runtime. - * @param __HANDLE__ TIM handle. - * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) - */ -#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) - -/** - * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. - * @param __HANDLE__ TIM handle. - * @param __AUTORELOAD__ specifies the Counter register new value. - * @retval None - */ -#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ - do{ \ - (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ - (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ - } while(0) - -/** - * @brief Get the TIM Autoreload Register value on runtime. - * @param __HANDLE__ TIM handle. - * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) - */ -#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) - -/** - * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. - * @param __HANDLE__ TIM handle. - * @param __CKD__ specifies the clock division value. - * This parameter can be one of the following value: - * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT - * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT - * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT - * @retval None - */ -#define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ - do{ \ - (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ - (__HANDLE__)->Instance->CR1 |= (__CKD__); \ - (__HANDLE__)->Init.ClockDivision = (__CKD__); \ - } while(0) - -/** - * @brief Get the TIM Clock Division value on runtime. - * @param __HANDLE__ TIM handle. - * @retval The clock division can be one of the following values: - * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT - * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT - * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT - */ -#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) - -/** - * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() - * function. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __ICPSC__ specifies the Input Capture4 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -#define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ - do{ \ - TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ - } while(0) - -/** - * @brief Get the TIM Input Capture prescaler on runtime. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: get input capture 1 prescaler value - * @arg TIM_CHANNEL_2: get input capture 2 prescaler value - * @arg TIM_CHANNEL_3: get input capture 3 prescaler value - * @arg TIM_CHANNEL_4: get input capture 4 prescaler value - * @retval The input capture prescaler can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - */ -#define __HAL_TIM_GET_ICPRESCALER(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? (((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC2PSC) >> 8U) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC3PSC) :\ - (((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC4PSC)) >> 8U) - -/** - * @brief Set the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __COMPARE__ specifies the Capture Compare register new value. - * @retval None - */ -#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ - ((__HANDLE__)->Instance->CCR4 = (__COMPARE__))) - -/** - * @brief Get the TIM Capture Compare Register value on runtime. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channel associated with the capture compare register - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: get capture/compare 1 register value - * @arg TIM_CHANNEL_2: get capture/compare 2 register value - * @arg TIM_CHANNEL_3: get capture/compare 3 register value - * @arg TIM_CHANNEL_4: get capture/compare 4 register value - * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) - */ -#define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ - ((__HANDLE__)->Instance->CCR4)) - -/** - * @brief Set the TIM Output compare preload. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval None - */ -#define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ - ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE)) - -/** - * @brief Reset the TIM Output compare preload. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval None - */ -#define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ - ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE)) - -/** - * @brief Enable fast mode for a given channel. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @note When fast mode is enabled an active edge on the trigger input acts - * like a compare match on CCx output. Delay to sample the trigger - * input and to activate CCx output is reduced to 3 clock cycles. - * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. - * @retval None - */ -#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ - ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE)) - -/** - * @brief Disable fast mode for a given channel. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @note When fast mode is disabled CCx output behaves normally depending - * on counter and CCRx values even when the trigger is ON. The minimum - * delay to activate CCx output when an active edge occurs on the - * trigger input is 5 clock cycles. - * @retval None - */ -#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ - ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE)) - -/** - * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. - * @param __HANDLE__ TIM handle. - * @note When the URS bit of the TIMx_CR1 register is set, only counter - * overflow/underflow generates an update interrupt or DMA request (if - * enabled) - * @retval None - */ -#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) - -/** - * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. - * @param __HANDLE__ TIM handle. - * @note When the URS bit of the TIMx_CR1 register is reset, any of the - * following events generate an update interrupt or DMA request (if - * enabled): - * _ Counter overflow underflow - * _ Setting the UG bit - * _ Update generation through the slave mode controller - * @retval None - */ -#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) - -/** - * @brief Set the TIM Capture x input polarity on runtime. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __POLARITY__ Polarity for TIx source - * @arg TIM_INPUTCHANNELPOLARITY_RISING: Rising Edge - * @arg TIM_INPUTCHANNELPOLARITY_FALLING: Falling Edge - * @arg TIM_INPUTCHANNELPOLARITY_BOTHEDGE: Rising and Falling Edge - * @retval None - */ -#define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - do{ \ - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ - }while(0) - -/** @brief Select the Capture/compare DMA request source. - * @param __HANDLE__ specifies the TIM Handle. - * @param __CCDMA__ specifies Capture/compare DMA request source - * This parameter can be one of the following values: - * @arg TIM_CCDMAREQUEST_CC: CCx DMA request generated on Capture/Compare event - * @arg TIM_CCDMAREQUEST_UPDATE: CCx DMA request generated on Update event - * @retval None - */ -#define __HAL_TIM_SELECT_CCDMAREQUEST(__HANDLE__, __CCDMA__) \ - MODIFY_REG((__HANDLE__)->Instance->CR2, TIM_CR2_CCDS, (__CCDMA__)) - -/** - * @} - */ -/* End of exported macros ----------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup TIM_Private_Constants TIM Private Constants - * @{ - */ -/* The counter of a timer instance is disabled only if all the CCx and CCxN - channels have been disabled */ -#define TIM_CCER_CCxE_MASK ((uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E)) -#define TIM_CCER_CCxNE_MASK ((uint32_t)(TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) -/** - * @} - */ -/* End of private constants --------------------------------------------------*/ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup TIM_Private_Macros TIM Private Macros - * @{ - */ -#define IS_TIM_CLEARINPUT_SOURCE(__MODE__) (((__MODE__) == TIM_CLEARINPUTSOURCE_NONE) || \ - ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) - -#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ - ((__BASE__) == TIM_DMABASE_CR2) || \ - ((__BASE__) == TIM_DMABASE_SMCR) || \ - ((__BASE__) == TIM_DMABASE_DIER) || \ - ((__BASE__) == TIM_DMABASE_SR) || \ - ((__BASE__) == TIM_DMABASE_EGR) || \ - ((__BASE__) == TIM_DMABASE_CCMR1) || \ - ((__BASE__) == TIM_DMABASE_CCMR2) || \ - ((__BASE__) == TIM_DMABASE_CCER) || \ - ((__BASE__) == TIM_DMABASE_CNT) || \ - ((__BASE__) == TIM_DMABASE_PSC) || \ - ((__BASE__) == TIM_DMABASE_ARR) || \ - ((__BASE__) == TIM_DMABASE_RCR) || \ - ((__BASE__) == TIM_DMABASE_CCR1) || \ - ((__BASE__) == TIM_DMABASE_CCR2) || \ - ((__BASE__) == TIM_DMABASE_CCR3) || \ - ((__BASE__) == TIM_DMABASE_CCR4) || \ - ((__BASE__) == TIM_DMABASE_BDTR)) - -#define IS_TIM_EVENT_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFFFF00U) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) - -#define IS_TIM_COUNTER_MODE(__MODE__) (((__MODE__) == TIM_COUNTERMODE_UP) || \ - ((__MODE__) == TIM_COUNTERMODE_DOWN) || \ - ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED1) || \ - ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ - ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) - -#define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ - ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ - ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) - -#define IS_TIM_AUTORELOAD_PRELOAD(PRELOAD) (((PRELOAD) == TIM_AUTORELOAD_PRELOAD_DISABLE) || \ - ((PRELOAD) == TIM_AUTORELOAD_PRELOAD_ENABLE)) - -#define IS_TIM_FAST_STATE(__STATE__) (((__STATE__) == TIM_OCFAST_DISABLE) || \ - ((__STATE__) == TIM_OCFAST_ENABLE)) - -#define IS_TIM_OC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCPOLARITY_HIGH) || \ - ((__POLARITY__) == TIM_OCPOLARITY_LOW)) - -#define IS_TIM_OCN_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCNPOLARITY_HIGH) || \ - ((__POLARITY__) == TIM_OCNPOLARITY_LOW)) - -#define IS_TIM_OCIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCIDLESTATE_SET) || \ - ((__STATE__) == TIM_OCIDLESTATE_RESET)) - -#define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ - ((__STATE__) == TIM_OCNIDLESTATE_RESET)) - -#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ - ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) - -#define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ - ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ - ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) - -#define IS_TIM_IC_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_ICSELECTION_DIRECTTI) || \ - ((__SELECTION__) == TIM_ICSELECTION_INDIRECTTI) || \ - ((__SELECTION__) == TIM_ICSELECTION_TRC)) - -#define IS_TIM_IC_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_ICPSC_DIV1) || \ - ((__PRESCALER__) == TIM_ICPSC_DIV2) || \ - ((__PRESCALER__) == TIM_ICPSC_DIV4) || \ - ((__PRESCALER__) == TIM_ICPSC_DIV8)) - -#define IS_TIM_OPM_MODE(__MODE__) (((__MODE__) == TIM_OPMODE_SINGLE) || \ - ((__MODE__) == TIM_OPMODE_REPETITIVE)) - -#define IS_TIM_ENCODER_MODE(__MODE__) (((__MODE__) == TIM_ENCODERMODE_TI1) || \ - ((__MODE__) == TIM_ENCODERMODE_TI2) || \ - ((__MODE__) == TIM_ENCODERMODE_TI12)) - -#define IS_TIM_DMA_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFF80FFU) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) - -#define IS_TIM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ - ((__CHANNEL__) == TIM_CHANNEL_2) || \ - ((__CHANNEL__) == TIM_CHANNEL_3) || \ - ((__CHANNEL__) == TIM_CHANNEL_4) || \ - ((__CHANNEL__) == TIM_CHANNEL_ALL)) - -#define IS_TIM_OPM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ - ((__CHANNEL__) == TIM_CHANNEL_2)) - -#define IS_TIM_PERIOD(__HANDLE__, __PERIOD__) ((IS_TIM_32B_COUNTER_INSTANCE(((__HANDLE__)->Instance)) == 0U) ? \ - (((__PERIOD__) > 0U) && ((__PERIOD__) <= 0x0000FFFFU)) : \ - ((__PERIOD__) > 0U)) - -#define IS_TIM_COMPLEMENTARY_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ - ((__CHANNEL__) == TIM_CHANNEL_2) || \ - ((__CHANNEL__) == TIM_CHANNEL_3)) - -#define IS_TIM_CLOCKSOURCE(__CLOCK__) (((__CLOCK__) == TIM_CLOCKSOURCE_INTERNAL) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE1) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE2) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_TI1ED) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_TI1) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_TI2) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR0) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR1) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR2) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR3)) - -#define IS_TIM_CLOCKPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLOCKPOLARITY_INVERTED) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_NONINVERTED) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_RISING) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_FALLING) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_BOTHEDGE)) - -#define IS_TIM_CLOCKPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV1) || \ - ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV2) || \ - ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV4) || \ - ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV8)) - -#define IS_TIM_CLOCKFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_CLEARINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLEARINPUTPOLARITY_INVERTED) || \ - ((__POLARITY__) == TIM_CLEARINPUTPOLARITY_NONINVERTED)) - -#define IS_TIM_CLEARINPUT_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV1) || \ - ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV2) || \ - ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV4) || \ - ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV8)) - -#define IS_TIM_CLEARINPUT_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_OSSR_STATE(__STATE__) (((__STATE__) == TIM_OSSR_ENABLE) || \ - ((__STATE__) == TIM_OSSR_DISABLE)) - -#define IS_TIM_OSSI_STATE(__STATE__) (((__STATE__) == TIM_OSSI_ENABLE) || \ - ((__STATE__) == TIM_OSSI_DISABLE)) - -#define IS_TIM_LOCK_LEVEL(__LEVEL__) (((__LEVEL__) == TIM_LOCKLEVEL_OFF) || \ - ((__LEVEL__) == TIM_LOCKLEVEL_1) || \ - ((__LEVEL__) == TIM_LOCKLEVEL_2) || \ - ((__LEVEL__) == TIM_LOCKLEVEL_3)) - -#define IS_TIM_BREAK_FILTER(__BRKFILTER__) ((__BRKFILTER__) <= 0xFUL) - -#define IS_TIM_BREAK_STATE(__STATE__) (((__STATE__) == TIM_BREAK_ENABLE) || \ - ((__STATE__) == TIM_BREAK_DISABLE)) - -#define IS_TIM_BREAK_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_BREAKPOLARITY_LOW) || \ - ((__POLARITY__) == TIM_BREAKPOLARITY_HIGH)) - -#define IS_TIM_AUTOMATIC_OUTPUT_STATE(__STATE__) (((__STATE__) == TIM_AUTOMATICOUTPUT_ENABLE) || \ - ((__STATE__) == TIM_AUTOMATICOUTPUT_DISABLE)) - -#define IS_TIM_TRGO_SOURCE(__SOURCE__) (((__SOURCE__) == TIM_TRGO_RESET) || \ - ((__SOURCE__) == TIM_TRGO_ENABLE) || \ - ((__SOURCE__) == TIM_TRGO_UPDATE) || \ - ((__SOURCE__) == TIM_TRGO_OC1) || \ - ((__SOURCE__) == TIM_TRGO_OC1REF) || \ - ((__SOURCE__) == TIM_TRGO_OC2REF) || \ - ((__SOURCE__) == TIM_TRGO_OC3REF) || \ - ((__SOURCE__) == TIM_TRGO_OC4REF)) - -#define IS_TIM_MSM_STATE(__STATE__) (((__STATE__) == TIM_MASTERSLAVEMODE_ENABLE) || \ - ((__STATE__) == TIM_MASTERSLAVEMODE_DISABLE)) - -#define IS_TIM_SLAVE_MODE(__MODE__) (((__MODE__) == TIM_SLAVEMODE_DISABLE) || \ - ((__MODE__) == TIM_SLAVEMODE_RESET) || \ - ((__MODE__) == TIM_SLAVEMODE_GATED) || \ - ((__MODE__) == TIM_SLAVEMODE_TRIGGER) || \ - ((__MODE__) == TIM_SLAVEMODE_EXTERNAL1)) - -#define IS_TIM_PWM_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_PWM1) || \ - ((__MODE__) == TIM_OCMODE_PWM2)) - -#define IS_TIM_OC_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_TIMING) || \ - ((__MODE__) == TIM_OCMODE_ACTIVE) || \ - ((__MODE__) == TIM_OCMODE_INACTIVE) || \ - ((__MODE__) == TIM_OCMODE_TOGGLE) || \ - ((__MODE__) == TIM_OCMODE_FORCED_ACTIVE) || \ - ((__MODE__) == TIM_OCMODE_FORCED_INACTIVE)) - -#define IS_TIM_TRIGGER_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ - ((__SELECTION__) == TIM_TS_ITR1) || \ - ((__SELECTION__) == TIM_TS_ITR2) || \ - ((__SELECTION__) == TIM_TS_ITR3) || \ - ((__SELECTION__) == TIM_TS_TI1F_ED) || \ - ((__SELECTION__) == TIM_TS_TI1FP1) || \ - ((__SELECTION__) == TIM_TS_TI2FP2) || \ - ((__SELECTION__) == TIM_TS_ETRF)) - -#define IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ - ((__SELECTION__) == TIM_TS_ITR1) || \ - ((__SELECTION__) == TIM_TS_ITR2) || \ - ((__SELECTION__) == TIM_TS_ITR3) || \ - ((__SELECTION__) == TIM_TS_NONE)) - -#define IS_TIM_TRIGGERPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_TRIGGERPOLARITY_INVERTED ) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_NONINVERTED) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_RISING ) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_FALLING ) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_BOTHEDGE )) - -#define IS_TIM_TRIGGERPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV1) || \ - ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV2) || \ - ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV4) || \ - ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV8)) - -#define IS_TIM_TRIGGERFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_TI1SELECTION(__TI1SELECTION__) (((__TI1SELECTION__) == TIM_TI1SELECTION_CH1) || \ - ((__TI1SELECTION__) == TIM_TI1SELECTION_XORCOMBINATION)) - -#define IS_TIM_DMA_LENGTH(__LENGTH__) (((__LENGTH__) == TIM_DMABURSTLENGTH_1TRANSFER) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_2TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_3TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_4TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_5TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_6TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_7TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_8TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_9TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_10TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_11TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_12TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_13TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_14TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_15TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_16TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_17TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_18TRANSFERS)) - -#define IS_TIM_DMA_DATA_LENGTH(LENGTH) (((LENGTH) >= 0x1U) && ((LENGTH) < 0x10000U)) - -#define IS_TIM_IC_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_DEADTIME(__DEADTIME__) ((__DEADTIME__) <= 0xFFU) - -#define IS_TIM_SLAVEMODE_TRIGGER_ENABLED(__TRIGGER__) ((__TRIGGER__) == TIM_SLAVEMODE_TRIGGER) - -#define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ - ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) - -#define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ - ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) - -#define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ - ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) - -#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ - ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) - -#define TIM_CHANNEL_STATE_GET(__HANDLE__, __CHANNEL__)\ - (((__CHANNEL__) == TIM_CHANNEL_1) ? (__HANDLE__)->ChannelState[0] :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? (__HANDLE__)->ChannelState[1] :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? (__HANDLE__)->ChannelState[2] :\ - (__HANDLE__)->ChannelState[3]) - -#define TIM_CHANNEL_STATE_SET(__HANDLE__, __CHANNEL__, __CHANNEL_STATE__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->ChannelState[0] = (__CHANNEL_STATE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->ChannelState[1] = (__CHANNEL_STATE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->ChannelState[2] = (__CHANNEL_STATE__)) :\ - ((__HANDLE__)->ChannelState[3] = (__CHANNEL_STATE__))) - -#define TIM_CHANNEL_STATE_SET_ALL(__HANDLE__, __CHANNEL_STATE__)\ - do {\ - (__HANDLE__)->ChannelState[0] = (__CHANNEL_STATE__);\ - (__HANDLE__)->ChannelState[1] = (__CHANNEL_STATE__);\ - (__HANDLE__)->ChannelState[2] = (__CHANNEL_STATE__);\ - (__HANDLE__)->ChannelState[3] = (__CHANNEL_STATE__);\ - } while(0) - -#define TIM_CHANNEL_N_STATE_GET(__HANDLE__, __CHANNEL__)\ - (((__CHANNEL__) == TIM_CHANNEL_1) ? (__HANDLE__)->ChannelNState[0] :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? (__HANDLE__)->ChannelNState[1] :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? (__HANDLE__)->ChannelNState[2] :\ - (__HANDLE__)->ChannelNState[3]) - -#define TIM_CHANNEL_N_STATE_SET(__HANDLE__, __CHANNEL__, __CHANNEL_STATE__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->ChannelNState[0] = (__CHANNEL_STATE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->ChannelNState[1] = (__CHANNEL_STATE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->ChannelNState[2] = (__CHANNEL_STATE__)) :\ - ((__HANDLE__)->ChannelNState[3] = (__CHANNEL_STATE__))) - -#define TIM_CHANNEL_N_STATE_SET_ALL(__HANDLE__, __CHANNEL_STATE__)\ - do {\ - (__HANDLE__)->ChannelNState[0] = \ - (__CHANNEL_STATE__); \ - (__HANDLE__)->ChannelNState[1] = \ - (__CHANNEL_STATE__); \ - (__HANDLE__)->ChannelNState[2] = \ - (__CHANNEL_STATE__); \ - (__HANDLE__)->ChannelNState[3] = \ - (__CHANNEL_STATE__); \ - } while(0) - -/** - * @} - */ -/* End of private macros -----------------------------------------------------*/ - -/* Include TIM HAL Extended module */ -#include "stm32f4xx_hal_tim_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup TIM_Exported_Functions TIM Exported Functions - * @{ - */ - -/** @addtogroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * @{ - */ -/* Time Base functions ********************************************************/ -HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, const uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * @{ - */ -/* Timer Output Compare functions *********************************************/ -HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length); -HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * @{ - */ -/* Timer PWM functions ********************************************************/ -HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length); -HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * @{ - */ -/* Timer Input Capture functions **********************************************/ -HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * @{ - */ -/* Timer One Pulse functions **************************************************/ -HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode); -HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * @{ - */ -/* Timer Encoder functions ****************************************************/ -HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, const TIM_Encoder_InitTypeDef *sConfig); -HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, - uint32_t *pData2, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief IRQ handler management - * @{ - */ -/* Interrupt Handler functions ***********************************************/ -void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ -/* Control functions *********************************************************/ -HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_OC_InitTypeDef *sConfig, - uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_OC_InitTypeDef *sConfig, - uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_IC_InitTypeDef *sConfig, - uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, - uint32_t OutputChannel, uint32_t InputChannel); -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, - const TIM_ClearInputConfigTypeDef *sClearInputConfig, - uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, const TIM_ClockConfigTypeDef *sClockSourceConfig); -HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, - uint32_t BurstLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_MultiWriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, - uint32_t BurstLength, uint32_t DataLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, - uint32_t BurstLength, uint32_t DataLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); -uint32_t HAL_TIM_ReadCapturedValue(const TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * @{ - */ -/* Callback in non blocking modes (Interrupt and DMA) *************************/ -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); - -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, - pTIM_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief Peripheral State functions - * @{ - */ -/* Peripheral State functions ************************************************/ -HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(const TIM_HandleTypeDef *htim); - -/* Peripheral Channel state functions ************************************************/ -HAL_TIM_ActiveChannel HAL_TIM_GetActiveChannel(const TIM_HandleTypeDef *htim); -HAL_TIM_ChannelStateTypeDef HAL_TIM_GetChannelState(const TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_TIM_DMABurstStateTypeDef HAL_TIM_DMABurstState(const TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** - * @} - */ -/* End of exported functions -------------------------------------------------*/ - -/* Private functions----------------------------------------------------------*/ -/** @defgroup TIM_Private_Functions TIM Private Functions - * @{ - */ -void TIM_Base_SetConfig(TIM_TypeDef *TIMx, const TIM_Base_InitTypeDef *Structure); -void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); -void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); -void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, - uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter); - -void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma); -void TIM_DMAError(DMA_HandleTypeDef *hdma); -void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma); -void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma); -void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -void TIM_ResetCallback(TIM_HandleTypeDef *htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ -/* End of private functions --------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_TIM_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h deleted file mode 100644 index 4f1d01b..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h +++ /dev/null @@ -1,357 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim_ex.h - * @author MCD Application Team - * @brief Header file of TIM HAL Extended module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_TIM_EX_H -#define STM32F4xx_HAL_TIM_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup TIMEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Types TIM Extended Exported Types - * @{ - */ - -/** - * @brief TIM Hall sensor Configuration Structure definition - */ - -typedef struct -{ - uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC1Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - - uint32_t Commutation_Delay; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ -} TIM_HallSensor_InitTypeDef; -/** - * @} - */ -/* End of exported types -----------------------------------------------------*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Constants TIM Extended Exported Constants - * @{ - */ - -/** @defgroup TIMEx_Remap TIM Extended Remapping - * @{ - */ -#if defined (TIM2) -#if defined(TIM8) -#define TIM_TIM2_TIM8_TRGO 0x00000000U /*!< TIM2 ITR1 is connected to TIM8 TRGO */ -#endif /* TIM8 */ -#define TIM_TIM2_ETH_PTP TIM_OR_ITR1_RMP_0 /*!< TIM2 ITR1 is connected to PTP trigger output */ -#define TIM_TIM2_USBFS_SOF TIM_OR_ITR1_RMP_1 /*!< TIM2 ITR1 is connected to OTG FS SOF */ -#define TIM_TIM2_USBHS_SOF (TIM_OR_ITR1_RMP_1 | TIM_OR_ITR1_RMP_0) /*!< TIM2 ITR1 is connected to OTG HS SOF */ -#endif /* TIM2 */ - -#define TIM_TIM5_GPIO 0x00000000U /*!< TIM5 TI4 is connected to GPIO */ -#define TIM_TIM5_LSI TIM_OR_TI4_RMP_0 /*!< TIM5 TI4 is connected to LSI */ -#define TIM_TIM5_LSE TIM_OR_TI4_RMP_1 /*!< TIM5 TI4 is connected to LSE */ -#define TIM_TIM5_RTC (TIM_OR_TI4_RMP_1 | TIM_OR_TI4_RMP_0) /*!< TIM5 TI4 is connected to the RTC wakeup interrupt */ - -#define TIM_TIM11_GPIO 0x00000000U /*!< TIM11 TI1 is connected to GPIO */ -#define TIM_TIM11_HSE TIM_OR_TI1_RMP_1 /*!< TIM11 TI1 is connected to HSE_RTC clock */ -#if defined(SPDIFRX) -#define TIM_TIM11_SPDIFRX TIM_OR_TI1_RMP_0 /*!< TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC */ -#endif /* SPDIFRX*/ - -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) -#define LPTIM_REMAP_MASK 0x10000000U - -#define TIM_TIM9_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM9 ITR1 is connected to TIM3 TRGO */ -#define TIM_TIM9_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM9_ITR1_RMP) /*!< TIM9 ITR1 is connected to LPTIM1 output */ - -#define TIM_TIM5_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM5 ITR1 is connected to TIM3 TRGO */ -#define TIM_TIM5_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM5_ITR1_RMP) /*!< TIM5 ITR1 is connected to LPTIM1 output */ - -#define TIM_TIM1_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM1 ITR2 is connected to TIM3 TRGO */ -#define TIM_TIM1_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM1_ITR2_RMP) /*!< TIM1 ITR2 is connected to LPTIM1 output */ -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ -/** - * @} - */ - -/** - * @} - */ -/* End of exported constants -------------------------------------------------*/ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Macros TIM Extended Exported Macros - * @{ - */ - -/** - * @} - */ -/* End of exported macro -----------------------------------------------------*/ - -/* Private macro -------------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Macros TIM Extended Private Macros - * @{ - */ -#if defined(SPDIFRX) -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_SPDIFRX) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#elif defined(TIM2) -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ - ((TIM_REMAP) == TIM_TIM2_ETH_PTP) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE))) || \ - (((INSTANCE) == TIM1) && (((TIM_REMAP) == TIM_TIM1_TIM3_TRGO) || \ - ((TIM_REMAP) == TIM_TIM1_LPTIM))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_TIM3_TRGO) || \ - ((TIM_REMAP) == TIM_TIM5_LPTIM))) || \ - (((INSTANCE) == TIM9) && (((TIM_REMAP) == TIM_TIM9_TIM3_TRGO) || \ - ((TIM_REMAP) == TIM_TIM9_LPTIM)))) -#elif defined(TIM8) -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ - ((TIM_REMAP) == TIM_TIM2_ETH_PTP) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#else -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_ETH_PTP) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ -#else -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#endif /* SPDIFRX */ - -/** - * @} - */ -/* End of private macro ------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup TIMEx_Exported_Functions TIM Extended Exported Functions - * @{ - */ - -/** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * @{ - */ -/* Timer Hall Sensor functions **********************************************/ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, const TIM_HallSensor_InitTypeDef *sConfig); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); - -void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim); - -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * @{ - */ -/* Timer Complementary Output Compare functions *****************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); - -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * @{ - */ -/* Timer Complementary PWM functions ****************************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * @{ - */ -/* Timer Complementary One Pulse functions **********************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ -/* Extended Control functions ************************************************/ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, - const TIM_MasterConfigTypeDef *sMasterConfig); -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, - const TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); -HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions - * @brief Extended Callbacks functions - * @{ - */ -/* Extended Callback **********************************************************/ -void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim); -void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions - * @brief Extended Peripheral State functions - * @{ - */ -/* Extended Peripheral State functions ***************************************/ -HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(const TIM_HandleTypeDef *htim); -HAL_TIM_ChannelStateTypeDef HAL_TIMEx_GetChannelNState(const TIM_HandleTypeDef *htim, uint32_t ChannelN); -/** - * @} - */ - -/** - * @} - */ -/* End of exported functions -------------------------------------------------*/ - -/* Private functions----------------------------------------------------------*/ -/** @addtogroup TIMEx_Private_Functions TIM Extended Private Functions - * @{ - */ -void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); -void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma); -/** - * @} - */ -/* End of private functions --------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* STM32F4xx_HAL_TIM_EX_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h deleted file mode 100644 index e6ce82f..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +++ /dev/null @@ -1,909 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_uart.h - * @author MCD Application Team - * @brief Header file of UART HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_UART_H -#define __STM32F4xx_HAL_UART_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup UART - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup UART_Exported_Types UART Exported Types - * @{ - */ - -/** - * @brief UART Init Structure definition - */ -typedef struct -{ - uint32_t BaudRate; /*!< This member configures the UART communication baud rate. - The baud rate is computed using the following formula: - - IntegerDivider = ((PCLKx) / (8 * (OVR8+1) * (huart->Init.BaudRate))) - - FractionalDivider = ((IntegerDivider - ((uint32_t) IntegerDivider)) * 8 * (OVR8+1)) + 0.5 - Where OVR8 is the "oversampling by 8 mode" configuration bit in the CR1 register. */ - - uint32_t WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. - This parameter can be a value of @ref UART_Word_Length */ - - uint32_t StopBits; /*!< Specifies the number of stop bits transmitted. - This parameter can be a value of @ref UART_Stop_Bits */ - - uint32_t Parity; /*!< Specifies the parity mode. - This parameter can be a value of @ref UART_Parity - @note When parity is enabled, the computed parity is inserted - at the MSB position of the transmitted data (9th bit when - the word length is set to 9 data bits; 8th bit when the - word length is set to 8 data bits). */ - - uint32_t Mode; /*!< Specifies whether the Receive or Transmit mode is enabled or disabled. - This parameter can be a value of @ref UART_Mode */ - - uint32_t HwFlowCtl; /*!< Specifies whether the hardware flow control mode is enabled or disabled. - This parameter can be a value of @ref UART_Hardware_Flow_Control */ - - uint32_t OverSampling; /*!< Specifies whether the Over sampling 8 is enabled or disabled, to achieve higher speed (up to fPCLK/8). - This parameter can be a value of @ref UART_Over_Sampling */ -} UART_InitTypeDef; - -/** - * @brief HAL UART State structures definition - * @note HAL UART State value is a combination of 2 different substates: gState and RxState. - * - gState contains UART state information related to global Handle management - * and also information related to Tx operations. - * gState value coding follow below described bitmap : - * b7-b6 Error information - * 00 : No Error - * 01 : (Not Used) - * 10 : Timeout - * 11 : Error - * b5 Peripheral initialization status - * 0 : Reset (Peripheral not initialized) - * 1 : Init done (Peripheral initialized. HAL UART Init function already called) - * b4-b3 (not used) - * xx : Should be set to 00 - * b2 Intrinsic process state - * 0 : Ready - * 1 : Busy (Peripheral busy with some configuration or internal operations) - * b1 (not used) - * x : Should be set to 0 - * b0 Tx state - * 0 : Ready (no Tx operation ongoing) - * 1 : Busy (Tx operation ongoing) - * - RxState contains information related to Rx operations. - * RxState value coding follow below described bitmap : - * b7-b6 (not used) - * xx : Should be set to 00 - * b5 Peripheral initialization status - * 0 : Reset (Peripheral not initialized) - * 1 : Init done (Peripheral initialized) - * b4-b2 (not used) - * xxx : Should be set to 000 - * b1 Rx state - * 0 : Ready (no Rx operation ongoing) - * 1 : Busy (Rx operation ongoing) - * b0 (not used) - * x : Should be set to 0. - */ -typedef enum -{ - HAL_UART_STATE_RESET = 0x00U, /*!< Peripheral is not yet Initialized - Value is allowed for gState and RxState */ - HAL_UART_STATE_READY = 0x20U, /*!< Peripheral Initialized and ready for use - Value is allowed for gState and RxState */ - HAL_UART_STATE_BUSY = 0x24U, /*!< an internal process is ongoing - Value is allowed for gState only */ - HAL_UART_STATE_BUSY_TX = 0x21U, /*!< Data Transmission process is ongoing - Value is allowed for gState only */ - HAL_UART_STATE_BUSY_RX = 0x22U, /*!< Data Reception process is ongoing - Value is allowed for RxState only */ - HAL_UART_STATE_BUSY_TX_RX = 0x23U, /*!< Data Transmission and Reception process is ongoing - Not to be used for neither gState nor RxState. - Value is result of combination (Or) between gState and RxState values */ - HAL_UART_STATE_TIMEOUT = 0xA0U, /*!< Timeout state - Value is allowed for gState only */ - HAL_UART_STATE_ERROR = 0xE0U /*!< Error - Value is allowed for gState only */ -} HAL_UART_StateTypeDef; - -/** - * @brief HAL UART Reception type definition - * @note HAL UART Reception type value aims to identify which type of Reception is ongoing. - * This parameter can be a value of @ref UART_Reception_Type_Values : - * HAL_UART_RECEPTION_STANDARD = 0x00U, - * HAL_UART_RECEPTION_TOIDLE = 0x01U, - */ -typedef uint32_t HAL_UART_RxTypeTypeDef; - -/** - * @brief HAL UART Rx Event type definition - * @note HAL UART Rx Event type value aims to identify which type of Event has occurred - * leading to call of the RxEvent callback. - * This parameter can be a value of @ref UART_RxEvent_Type_Values : - * HAL_UART_RXEVENT_TC = 0x00U, - * HAL_UART_RXEVENT_HT = 0x01U, - * HAL_UART_RXEVENT_IDLE = 0x02U, - */ -typedef uint32_t HAL_UART_RxEventTypeTypeDef; - -/** - * @brief UART handle Structure definition - */ -typedef struct __UART_HandleTypeDef -{ - USART_TypeDef *Instance; /*!< UART registers base address */ - - UART_InitTypeDef Init; /*!< UART communication parameters */ - - const uint8_t *pTxBuffPtr; /*!< Pointer to UART Tx transfer Buffer */ - - uint16_t TxXferSize; /*!< UART Tx Transfer size */ - - __IO uint16_t TxXferCount; /*!< UART Tx Transfer Counter */ - - uint8_t *pRxBuffPtr; /*!< Pointer to UART Rx transfer Buffer */ - - uint16_t RxXferSize; /*!< UART Rx Transfer size */ - - __IO uint16_t RxXferCount; /*!< UART Rx Transfer Counter */ - - __IO HAL_UART_RxTypeTypeDef ReceptionType; /*!< Type of ongoing reception */ - - __IO HAL_UART_RxEventTypeTypeDef RxEventType; /*!< Type of Rx Event */ - - DMA_HandleTypeDef *hdmatx; /*!< UART Tx DMA Handle parameters */ - - DMA_HandleTypeDef *hdmarx; /*!< UART Rx DMA Handle parameters */ - - HAL_LockTypeDef Lock; /*!< Locking object */ - - __IO HAL_UART_StateTypeDef gState; /*!< UART state information related to global Handle management - and also related to Tx operations. - This parameter can be a value of @ref HAL_UART_StateTypeDef */ - - __IO HAL_UART_StateTypeDef RxState; /*!< UART state information related to Rx operations. - This parameter can be a value of @ref HAL_UART_StateTypeDef */ - - __IO uint32_t ErrorCode; /*!< UART Error code */ - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - void (* TxHalfCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Tx Half Complete Callback */ - void (* TxCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Tx Complete Callback */ - void (* RxHalfCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Rx Half Complete Callback */ - void (* RxCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Rx Complete Callback */ - void (* ErrorCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Error Callback */ - void (* AbortCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Complete Callback */ - void (* AbortTransmitCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Transmit Complete Callback */ - void (* AbortReceiveCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Receive Complete Callback */ - void (* WakeupCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Wakeup Callback */ - void (* RxEventCallback)(struct __UART_HandleTypeDef *huart, uint16_t Pos); /*!< UART Reception Event Callback */ - - void (* MspInitCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Msp Init callback */ - void (* MspDeInitCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Msp DeInit callback */ -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - -} UART_HandleTypeDef; - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) -/** - * @brief HAL UART Callback ID enumeration definition - */ -typedef enum -{ - HAL_UART_TX_HALFCOMPLETE_CB_ID = 0x00U, /*!< UART Tx Half Complete Callback ID */ - HAL_UART_TX_COMPLETE_CB_ID = 0x01U, /*!< UART Tx Complete Callback ID */ - HAL_UART_RX_HALFCOMPLETE_CB_ID = 0x02U, /*!< UART Rx Half Complete Callback ID */ - HAL_UART_RX_COMPLETE_CB_ID = 0x03U, /*!< UART Rx Complete Callback ID */ - HAL_UART_ERROR_CB_ID = 0x04U, /*!< UART Error Callback ID */ - HAL_UART_ABORT_COMPLETE_CB_ID = 0x05U, /*!< UART Abort Complete Callback ID */ - HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID = 0x06U, /*!< UART Abort Transmit Complete Callback ID */ - HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID = 0x07U, /*!< UART Abort Receive Complete Callback ID */ - HAL_UART_WAKEUP_CB_ID = 0x08U, /*!< UART Wakeup Callback ID */ - - HAL_UART_MSPINIT_CB_ID = 0x0BU, /*!< UART MspInit callback ID */ - HAL_UART_MSPDEINIT_CB_ID = 0x0CU /*!< UART MspDeInit callback ID */ - -} HAL_UART_CallbackIDTypeDef; - -/** - * @brief HAL UART Callback pointer definition - */ -typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer to an UART callback function */ -typedef void (*pUART_RxEventCallbackTypeDef)(struct __UART_HandleTypeDef *huart, uint16_t Pos); /*!< pointer to a UART Rx Event specific callback function */ - -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup UART_Exported_Constants UART Exported Constants - * @{ - */ - -/** @defgroup UART_Error_Code UART Error Code - * @{ - */ -#define HAL_UART_ERROR_NONE 0x00000000U /*!< No error */ -#define HAL_UART_ERROR_PE 0x00000001U /*!< Parity error */ -#define HAL_UART_ERROR_NE 0x00000002U /*!< Noise error */ -#define HAL_UART_ERROR_FE 0x00000004U /*!< Frame error */ -#define HAL_UART_ERROR_ORE 0x00000008U /*!< Overrun error */ -#define HAL_UART_ERROR_DMA 0x00000010U /*!< DMA transfer error */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) -#define HAL_UART_ERROR_INVALID_CALLBACK 0x00000020U /*!< Invalid Callback error */ -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @defgroup UART_Word_Length UART Word Length - * @{ - */ -#define UART_WORDLENGTH_8B 0x00000000U -#define UART_WORDLENGTH_9B ((uint32_t)USART_CR1_M) -/** - * @} - */ - -/** @defgroup UART_Stop_Bits UART Number of Stop Bits - * @{ - */ -#define UART_STOPBITS_1 0x00000000U -#define UART_STOPBITS_2 ((uint32_t)USART_CR2_STOP_1) -/** - * @} - */ - -/** @defgroup UART_Parity UART Parity - * @{ - */ -#define UART_PARITY_NONE 0x00000000U -#define UART_PARITY_EVEN ((uint32_t)USART_CR1_PCE) -#define UART_PARITY_ODD ((uint32_t)(USART_CR1_PCE | USART_CR1_PS)) -/** - * @} - */ - -/** @defgroup UART_Hardware_Flow_Control UART Hardware Flow Control - * @{ - */ -#define UART_HWCONTROL_NONE 0x00000000U -#define UART_HWCONTROL_RTS ((uint32_t)USART_CR3_RTSE) -#define UART_HWCONTROL_CTS ((uint32_t)USART_CR3_CTSE) -#define UART_HWCONTROL_RTS_CTS ((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE)) -/** - * @} - */ - -/** @defgroup UART_Mode UART Transfer Mode - * @{ - */ -#define UART_MODE_RX ((uint32_t)USART_CR1_RE) -#define UART_MODE_TX ((uint32_t)USART_CR1_TE) -#define UART_MODE_TX_RX ((uint32_t)(USART_CR1_TE | USART_CR1_RE)) -/** - * @} - */ - -/** @defgroup UART_State UART State - * @{ - */ -#define UART_STATE_DISABLE 0x00000000U -#define UART_STATE_ENABLE ((uint32_t)USART_CR1_UE) -/** - * @} - */ - -/** @defgroup UART_Over_Sampling UART Over Sampling - * @{ - */ -#define UART_OVERSAMPLING_16 0x00000000U -#define UART_OVERSAMPLING_8 ((uint32_t)USART_CR1_OVER8) -/** - * @} - */ - -/** @defgroup UART_LIN_Break_Detection_Length UART LIN Break Detection Length - * @{ - */ -#define UART_LINBREAKDETECTLENGTH_10B 0x00000000U -#define UART_LINBREAKDETECTLENGTH_11B ((uint32_t)USART_CR2_LBDL) -/** - * @} - */ - -/** @defgroup UART_WakeUp_functions UART Wakeup Functions - * @{ - */ -#define UART_WAKEUPMETHOD_IDLELINE 0x00000000U -#define UART_WAKEUPMETHOD_ADDRESSMARK ((uint32_t)USART_CR1_WAKE) -/** - * @} - */ - -/** @defgroup UART_Flags UART FLags - * Elements values convention: 0xXXXX - * - 0xXXXX : Flag mask in the SR register - * @{ - */ -#define UART_FLAG_CTS ((uint32_t)USART_SR_CTS) -#define UART_FLAG_LBD ((uint32_t)USART_SR_LBD) -#define UART_FLAG_TXE ((uint32_t)USART_SR_TXE) -#define UART_FLAG_TC ((uint32_t)USART_SR_TC) -#define UART_FLAG_RXNE ((uint32_t)USART_SR_RXNE) -#define UART_FLAG_IDLE ((uint32_t)USART_SR_IDLE) -#define UART_FLAG_ORE ((uint32_t)USART_SR_ORE) -#define UART_FLAG_NE ((uint32_t)USART_SR_NE) -#define UART_FLAG_FE ((uint32_t)USART_SR_FE) -#define UART_FLAG_PE ((uint32_t)USART_SR_PE) -/** - * @} - */ - -/** @defgroup UART_Interrupt_definition UART Interrupt Definitions - * Elements values convention: 0xY000XXXX - * - XXXX : Interrupt mask (16 bits) in the Y register - * - Y : Interrupt source register (2bits) - * - 0001: CR1 register - * - 0010: CR2 register - * - 0011: CR3 register - * @{ - */ - -#define UART_IT_PE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_PEIE)) -#define UART_IT_TXE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_TXEIE)) -#define UART_IT_TC ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_TCIE)) -#define UART_IT_RXNE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_RXNEIE)) -#define UART_IT_IDLE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_IDLEIE)) - -#define UART_IT_LBD ((uint32_t)(UART_CR2_REG_INDEX << 28U | USART_CR2_LBDIE)) - -#define UART_IT_CTS ((uint32_t)(UART_CR3_REG_INDEX << 28U | USART_CR3_CTSIE)) -#define UART_IT_ERR ((uint32_t)(UART_CR3_REG_INDEX << 28U | USART_CR3_EIE)) -/** - * @} - */ - -/** @defgroup UART_Reception_Type_Values UART Reception type values - * @{ - */ -#define HAL_UART_RECEPTION_STANDARD (0x00000000U) /*!< Standard reception */ -#define HAL_UART_RECEPTION_TOIDLE (0x00000001U) /*!< Reception till completion or IDLE event */ -/** - * @} - */ - -/** @defgroup UART_RxEvent_Type_Values UART RxEvent type values - * @{ - */ -#define HAL_UART_RXEVENT_TC (0x00000000U) /*!< RxEvent linked to Transfer Complete event */ -#define HAL_UART_RXEVENT_HT (0x00000001U) /*!< RxEvent linked to Half Transfer event */ -#define HAL_UART_RXEVENT_IDLE (0x00000002U) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup UART_Exported_Macros UART Exported Macros - * @{ - */ - -/** @brief Reset UART handle gstate & RxState - * @param __HANDLE__ specifies the UART Handle. - * UART Handle selects the USARTx or UARTy peripheral - * (USART,UART availability and x,y values depending on device). - * @retval None - */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) -#define __HAL_UART_RESET_HANDLE_STATE(__HANDLE__) do{ \ - (__HANDLE__)->gState = HAL_UART_STATE_RESET; \ - (__HANDLE__)->RxState = HAL_UART_STATE_RESET; \ - (__HANDLE__)->MspInitCallback = NULL; \ - (__HANDLE__)->MspDeInitCallback = NULL; \ - } while(0U) -#else -#define __HAL_UART_RESET_HANDLE_STATE(__HANDLE__) do{ \ - (__HANDLE__)->gState = HAL_UART_STATE_RESET; \ - (__HANDLE__)->RxState = HAL_UART_STATE_RESET; \ - } while(0U) -#endif /*USE_HAL_UART_REGISTER_CALLBACKS */ - -/** @brief Flushes the UART DR register - * @param __HANDLE__ specifies the UART Handle. - * UART Handle selects the USARTx or UARTy peripheral - * (USART,UART availability and x,y values depending on device). - */ -#define __HAL_UART_FLUSH_DRREGISTER(__HANDLE__) ((__HANDLE__)->Instance->DR) - -/** @brief Checks whether the specified UART flag is set or not. - * @param __HANDLE__ specifies the UART Handle. - * UART Handle selects the USARTx or UARTy peripheral - * (USART,UART availability and x,y values depending on device). - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg UART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5) - * @arg UART_FLAG_LBD: LIN Break detection flag - * @arg UART_FLAG_TXE: Transmit data register empty flag - * @arg UART_FLAG_TC: Transmission Complete flag - * @arg UART_FLAG_RXNE: Receive data register not empty flag - * @arg UART_FLAG_IDLE: Idle Line detection flag - * @arg UART_FLAG_ORE: Overrun Error flag - * @arg UART_FLAG_NE: Noise Error flag - * @arg UART_FLAG_FE: Framing Error flag - * @arg UART_FLAG_PE: Parity Error flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clears the specified UART pending flag. - * @param __HANDLE__ specifies the UART Handle. - * UART Handle selects the USARTx or UARTy peripheral - * (USART,UART availability and x,y values depending on device). - * @param __FLAG__ specifies the flag to check. - * This parameter can be any combination of the following values: - * @arg UART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5). - * @arg UART_FLAG_LBD: LIN Break detection flag. - * @arg UART_FLAG_TC: Transmission Complete flag. - * @arg UART_FLAG_RXNE: Receive data register not empty flag. - * - * @note PE (Parity error), FE (Framing error), NE (Noise error), ORE (Overrun - * error) and IDLE (Idle line detected) flags are cleared by software - * sequence: a read operation to USART_SR register followed by a read - * operation to USART_DR register. - * @note RXNE flag can be also cleared by a read to the USART_DR register. - * @note TC flag can be also cleared by software sequence: a read operation to - * USART_SR register followed by a write operation to USART_DR register. - * @note TXE flag is cleared only by a write to the USART_DR register. - * - * @retval None - */ -#define __HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) - -/** @brief Clears the UART PE pending flag. - * @param __HANDLE__ specifies the UART Handle. - * UART Handle selects the USARTx or UARTy peripheral - * (USART,UART availability and x,y values depending on device). - * @retval None - */ -#define __HAL_UART_CLEAR_PEFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg = 0x00U; \ - tmpreg = (__HANDLE__)->Instance->SR; \ - tmpreg = (__HANDLE__)->Instance->DR; \ - UNUSED(tmpreg); \ - } while(0U) - -/** @brief Clears the UART FE pending flag. - * @param __HANDLE__ specifies the UART Handle. - * UART Handle selects the USARTx or UARTy peripheral - * (USART,UART availability and x,y values depending on device). - * @retval None - */ -#define __HAL_UART_CLEAR_FEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) - -/** @brief Clears the UART NE pending flag. - * @param __HANDLE__ specifies the UART Handle. - * UART Handle selects the USARTx or UARTy peripheral - * (USART,UART availability and x,y values depending on device). - * @retval None - */ -#define __HAL_UART_CLEAR_NEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) - -/** @brief Clears the UART ORE pending flag. - * @param __HANDLE__ specifies the UART Handle. - * UART Handle selects the USARTx or UARTy peripheral - * (USART,UART availability and x,y values depending on device). - * @retval None - */ -#define __HAL_UART_CLEAR_OREFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) - -/** @brief Clears the UART IDLE pending flag. - * @param __HANDLE__ specifies the UART Handle. - * UART Handle selects the USARTx or UARTy peripheral - * (USART,UART availability and x,y values depending on device). - * @retval None - */ -#define __HAL_UART_CLEAR_IDLEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) - -/** @brief Enable the specified UART interrupt. - * @param __HANDLE__ specifies the UART Handle. - * UART Handle selects the USARTx or UARTy peripheral - * (USART,UART availability and x,y values depending on device). - * @param __INTERRUPT__ specifies the UART interrupt source to enable. - * This parameter can be one of the following values: - * @arg UART_IT_CTS: CTS change interrupt - * @arg UART_IT_LBD: LIN Break detection interrupt - * @arg UART_IT_TXE: Transmit Data Register empty interrupt - * @arg UART_IT_TC: Transmission complete interrupt - * @arg UART_IT_RXNE: Receive Data register not empty interrupt - * @arg UART_IT_IDLE: Idle line detection interrupt - * @arg UART_IT_PE: Parity Error interrupt - * @arg UART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) - * @retval None - */ -#define __HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__HANDLE__)->Instance->CR1 |= ((__INTERRUPT__) & UART_IT_MASK)): \ - (((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__HANDLE__)->Instance->CR2 |= ((__INTERRUPT__) & UART_IT_MASK)): \ - ((__HANDLE__)->Instance->CR3 |= ((__INTERRUPT__) & UART_IT_MASK))) - -/** @brief Disable the specified UART interrupt. - * @param __HANDLE__ specifies the UART Handle. - * UART Handle selects the USARTx or UARTy peripheral - * (USART,UART availability and x,y values depending on device). - * @param __INTERRUPT__ specifies the UART interrupt source to disable. - * This parameter can be one of the following values: - * @arg UART_IT_CTS: CTS change interrupt - * @arg UART_IT_LBD: LIN Break detection interrupt - * @arg UART_IT_TXE: Transmit Data Register empty interrupt - * @arg UART_IT_TC: Transmission complete interrupt - * @arg UART_IT_RXNE: Receive Data register not empty interrupt - * @arg UART_IT_IDLE: Idle line detection interrupt - * @arg UART_IT_PE: Parity Error interrupt - * @arg UART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) - * @retval None - */ -#define __HAL_UART_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__HANDLE__)->Instance->CR1 &= ~((__INTERRUPT__) & UART_IT_MASK)): \ - (((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__HANDLE__)->Instance->CR2 &= ~((__INTERRUPT__) & UART_IT_MASK)): \ - ((__HANDLE__)->Instance->CR3 &= ~ ((__INTERRUPT__) & UART_IT_MASK))) - -/** @brief Checks whether the specified UART interrupt source is enabled or not. - * @param __HANDLE__ specifies the UART Handle. - * UART Handle selects the USARTx or UARTy peripheral - * (USART,UART availability and x,y values depending on device). - * @param __IT__ specifies the UART interrupt source to check. - * This parameter can be one of the following values: - * @arg UART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) - * @arg UART_IT_LBD: LIN Break detection interrupt - * @arg UART_IT_TXE: Transmit Data Register empty interrupt - * @arg UART_IT_TC: Transmission complete interrupt - * @arg UART_IT_RXNE: Receive Data register not empty interrupt - * @arg UART_IT_IDLE: Idle line detection interrupt - * @arg UART_IT_ERR: Error interrupt - * @retval The new state of __IT__ (TRUE or FALSE). - */ -#define __HAL_UART_GET_IT_SOURCE(__HANDLE__, __IT__) (((((__IT__) >> 28U) == UART_CR1_REG_INDEX)? (__HANDLE__)->Instance->CR1:(((((uint32_t)(__IT__)) >> 28U) == UART_CR2_REG_INDEX)? \ - (__HANDLE__)->Instance->CR2 : (__HANDLE__)->Instance->CR3)) & (((uint32_t)(__IT__)) & UART_IT_MASK)) - -/** @brief Enable CTS flow control - * @note This macro allows to enable CTS hardware flow control for a given UART instance, - * without need to call HAL_UART_Init() function. - * As involving direct access to UART registers, usage of this macro should be fully endorsed by user. - * @note As macro is expected to be used for modifying CTS Hw flow control feature activation, without need - * for USART instance Deinit/Init, following conditions for macro call should be fulfilled : - * - UART instance should have already been initialised (through call of HAL_UART_Init() ) - * - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) - * and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). - * @param __HANDLE__ specifies the UART Handle. - * The Handle Instance can be any USARTx (supporting the HW Flow control feature). - * It is used to select the USART peripheral (USART availability and x value depending on device). - * @retval None - */ -#define __HAL_UART_HWCONTROL_CTS_ENABLE(__HANDLE__) \ - do{ \ - ATOMIC_SET_BIT((__HANDLE__)->Instance->CR3, USART_CR3_CTSE); \ - (__HANDLE__)->Init.HwFlowCtl |= USART_CR3_CTSE; \ - } while(0U) - -/** @brief Disable CTS flow control - * @note This macro allows to disable CTS hardware flow control for a given UART instance, - * without need to call HAL_UART_Init() function. - * As involving direct access to UART registers, usage of this macro should be fully endorsed by user. - * @note As macro is expected to be used for modifying CTS Hw flow control feature activation, without need - * for USART instance Deinit/Init, following conditions for macro call should be fulfilled : - * - UART instance should have already been initialised (through call of HAL_UART_Init() ) - * - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) - * and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). - * @param __HANDLE__ specifies the UART Handle. - * The Handle Instance can be any USARTx (supporting the HW Flow control feature). - * It is used to select the USART peripheral (USART availability and x value depending on device). - * @retval None - */ -#define __HAL_UART_HWCONTROL_CTS_DISABLE(__HANDLE__) \ - do{ \ - ATOMIC_CLEAR_BIT((__HANDLE__)->Instance->CR3, USART_CR3_CTSE); \ - (__HANDLE__)->Init.HwFlowCtl &= ~(USART_CR3_CTSE); \ - } while(0U) - -/** @brief Enable RTS flow control - * This macro allows to enable RTS hardware flow control for a given UART instance, - * without need to call HAL_UART_Init() function. - * As involving direct access to UART registers, usage of this macro should be fully endorsed by user. - * @note As macro is expected to be used for modifying RTS Hw flow control feature activation, without need - * for USART instance Deinit/Init, following conditions for macro call should be fulfilled : - * - UART instance should have already been initialised (through call of HAL_UART_Init() ) - * - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) - * and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). - * @param __HANDLE__ specifies the UART Handle. - * The Handle Instance can be any USARTx (supporting the HW Flow control feature). - * It is used to select the USART peripheral (USART availability and x value depending on device). - * @retval None - */ -#define __HAL_UART_HWCONTROL_RTS_ENABLE(__HANDLE__) \ - do{ \ - ATOMIC_SET_BIT((__HANDLE__)->Instance->CR3, USART_CR3_RTSE); \ - (__HANDLE__)->Init.HwFlowCtl |= USART_CR3_RTSE; \ - } while(0U) - -/** @brief Disable RTS flow control - * This macro allows to disable RTS hardware flow control for a given UART instance, - * without need to call HAL_UART_Init() function. - * As involving direct access to UART registers, usage of this macro should be fully endorsed by user. - * @note As macro is expected to be used for modifying RTS Hw flow control feature activation, without need - * for USART instance Deinit/Init, following conditions for macro call should be fulfilled : - * - UART instance should have already been initialised (through call of HAL_UART_Init() ) - * - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) - * and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). - * @param __HANDLE__ specifies the UART Handle. - * The Handle Instance can be any USARTx (supporting the HW Flow control feature). - * It is used to select the USART peripheral (USART availability and x value depending on device). - * @retval None - */ -#define __HAL_UART_HWCONTROL_RTS_DISABLE(__HANDLE__) \ - do{ \ - ATOMIC_CLEAR_BIT((__HANDLE__)->Instance->CR3, USART_CR3_RTSE);\ - (__HANDLE__)->Init.HwFlowCtl &= ~(USART_CR3_RTSE); \ - } while(0U) - -/** @brief Macro to enable the UART's one bit sample method - * @param __HANDLE__ specifies the UART Handle. - * @retval None - */ -#define __HAL_UART_ONE_BIT_SAMPLE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3|= USART_CR3_ONEBIT) - -/** @brief Macro to disable the UART's one bit sample method - * @param __HANDLE__ specifies the UART Handle. - * @retval None - */ -#define __HAL_UART_ONE_BIT_SAMPLE_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3\ - &= (uint16_t)~((uint16_t)USART_CR3_ONEBIT)) - -/** @brief Enable UART - * @param __HANDLE__ specifies the UART Handle. - * @retval None - */ -#define __HAL_UART_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 |= USART_CR1_UE) - -/** @brief Disable UART - * @param __HANDLE__ specifies the UART Handle. - * @retval None - */ -#define __HAL_UART_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 &= ~USART_CR1_UE) -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup UART_Exported_Functions - * @{ - */ - -/** @addtogroup UART_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ - -/* Initialization/de-initialization functions **********************************/ -HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart); -HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart); -HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength); -HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod); -HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart); -void HAL_UART_MspInit(UART_HandleTypeDef *huart); -void HAL_UART_MspDeInit(UART_HandleTypeDef *huart); - -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, - pUART_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID); - -HAL_StatusTypeDef HAL_UART_RegisterRxEventCallback(UART_HandleTypeDef *huart, pUART_RxEventCallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_UART_UnRegisterRxEventCallback(UART_HandleTypeDef *huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @addtogroup UART_Exported_Functions_Group2 IO operation functions - * @{ - */ - -/* IO operation functions *******************************************************/ -HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart); -HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart); -HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart); - -HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen, - uint32_t Timeout); -HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); - -HAL_UART_RxEventTypeTypeDef HAL_UARTEx_GetRxEventType(UART_HandleTypeDef *huart); - -/* Transfer Abort functions */ -HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart); -HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart); -HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart); -HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart); -HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart); -HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart); - -void HAL_UART_IRQHandler(UART_HandleTypeDef *huart); -void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); -void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); -void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); -void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart); -void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart); -void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart); -void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart); -void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart); - -void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size); - -/** - * @} - */ - -/** @addtogroup UART_Exported_Functions_Group3 - * @{ - */ -/* Peripheral Control functions ************************************************/ -HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart); -HAL_StatusTypeDef HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart); -HAL_StatusTypeDef HAL_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart); -HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart); -HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart); -/** - * @} - */ - -/** @addtogroup UART_Exported_Functions_Group4 - * @{ - */ -/* Peripheral State functions **************************************************/ -HAL_UART_StateTypeDef HAL_UART_GetState(const UART_HandleTypeDef *huart); -uint32_t HAL_UART_GetError(const UART_HandleTypeDef *huart); -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup UART_Private_Constants UART Private Constants - * @{ - */ -/** @brief UART interruptions flag mask - * - */ -#define UART_IT_MASK 0x0000FFFFU - -#define UART_CR1_REG_INDEX 1U -#define UART_CR2_REG_INDEX 2U -#define UART_CR3_REG_INDEX 3U -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup UART_Private_Macros UART Private Macros - * @{ - */ -#define IS_UART_WORD_LENGTH(LENGTH) (((LENGTH) == UART_WORDLENGTH_8B) || \ - ((LENGTH) == UART_WORDLENGTH_9B)) -#define IS_UART_LIN_WORD_LENGTH(LENGTH) (((LENGTH) == UART_WORDLENGTH_8B)) -#define IS_UART_STOPBITS(STOPBITS) (((STOPBITS) == UART_STOPBITS_1) || \ - ((STOPBITS) == UART_STOPBITS_2)) -#define IS_UART_PARITY(PARITY) (((PARITY) == UART_PARITY_NONE) || \ - ((PARITY) == UART_PARITY_EVEN) || \ - ((PARITY) == UART_PARITY_ODD)) -#define IS_UART_HARDWARE_FLOW_CONTROL(CONTROL)\ - (((CONTROL) == UART_HWCONTROL_NONE) || \ - ((CONTROL) == UART_HWCONTROL_RTS) || \ - ((CONTROL) == UART_HWCONTROL_CTS) || \ - ((CONTROL) == UART_HWCONTROL_RTS_CTS)) -#define IS_UART_MODE(MODE) ((((MODE) & 0x0000FFF3U) == 0x00U) && ((MODE) != 0x00U)) -#define IS_UART_STATE(STATE) (((STATE) == UART_STATE_DISABLE) || \ - ((STATE) == UART_STATE_ENABLE)) -#define IS_UART_OVERSAMPLING(SAMPLING) (((SAMPLING) == UART_OVERSAMPLING_16) || \ - ((SAMPLING) == UART_OVERSAMPLING_8)) -#define IS_UART_LIN_OVERSAMPLING(SAMPLING) (((SAMPLING) == UART_OVERSAMPLING_16)) -#define IS_UART_LIN_BREAK_DETECT_LENGTH(LENGTH) (((LENGTH) == UART_LINBREAKDETECTLENGTH_10B) || \ - ((LENGTH) == UART_LINBREAKDETECTLENGTH_11B)) -#define IS_UART_WAKEUPMETHOD(WAKEUP) (((WAKEUP) == UART_WAKEUPMETHOD_IDLELINE) || \ - ((WAKEUP) == UART_WAKEUPMETHOD_ADDRESSMARK)) -#define IS_UART_BAUDRATE(BAUDRATE) ((BAUDRATE) <= 10500000U) -#define IS_UART_ADDRESS(ADDRESS) ((ADDRESS) <= 0x0FU) - -#define UART_DIV_SAMPLING16(_PCLK_, _BAUD_) ((uint32_t)((((uint64_t)(_PCLK_))*25U)/(4U*((uint64_t)(_BAUD_))))) -#define UART_DIVMANT_SAMPLING16(_PCLK_, _BAUD_) (UART_DIV_SAMPLING16((_PCLK_), (_BAUD_))/100U) -#define UART_DIVFRAQ_SAMPLING16(_PCLK_, _BAUD_) ((((UART_DIV_SAMPLING16((_PCLK_), (_BAUD_)) - (UART_DIVMANT_SAMPLING16((_PCLK_), (_BAUD_)) * 100U)) * 16U)\ - + 50U) / 100U) -/* UART BRR = mantissa + overflow + fraction - = (UART DIVMANT << 4) + (UART DIVFRAQ & 0xF0) + (UART DIVFRAQ & 0x0FU) */ -#define UART_BRR_SAMPLING16(_PCLK_, _BAUD_) ((UART_DIVMANT_SAMPLING16((_PCLK_), (_BAUD_)) << 4U) + \ - (UART_DIVFRAQ_SAMPLING16((_PCLK_), (_BAUD_)) & 0xF0U) + \ - (UART_DIVFRAQ_SAMPLING16((_PCLK_), (_BAUD_)) & 0x0FU)) - -#define UART_DIV_SAMPLING8(_PCLK_, _BAUD_) ((uint32_t)((((uint64_t)(_PCLK_))*25U)/(2U*((uint64_t)(_BAUD_))))) -#define UART_DIVMANT_SAMPLING8(_PCLK_, _BAUD_) (UART_DIV_SAMPLING8((_PCLK_), (_BAUD_))/100U) -#define UART_DIVFRAQ_SAMPLING8(_PCLK_, _BAUD_) ((((UART_DIV_SAMPLING8((_PCLK_), (_BAUD_)) - (UART_DIVMANT_SAMPLING8((_PCLK_), (_BAUD_)) * 100U)) * 8U)\ - + 50U) / 100U) -/* UART BRR = mantissa + overflow + fraction - = (UART DIVMANT << 4) + ((UART DIVFRAQ & 0xF8) << 1) + (UART DIVFRAQ & 0x07U) */ -#define UART_BRR_SAMPLING8(_PCLK_, _BAUD_) ((UART_DIVMANT_SAMPLING8((_PCLK_), (_BAUD_)) << 4U) + \ - ((UART_DIVFRAQ_SAMPLING8((_PCLK_), (_BAUD_)) & 0xF8U) << 1U) + \ - (UART_DIVFRAQ_SAMPLING8((_PCLK_), (_BAUD_)) & 0x07U)) - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup UART_Private_Functions UART Private Functions - * @{ - */ - -HAL_StatusTypeDef UART_Start_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef UART_Start_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_UART_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h deleted file mode 100644 index ce19d4d..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h +++ /dev/null @@ -1,2105 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_bus.h - * @author MCD Application Team - * @brief Header file of BUS LL module. - - @verbatim - ##### RCC Limitations ##### - ============================================================================== - [..] - A delay between an RCC peripheral clock enable and the effective peripheral - enabling should be taken into account in order to manage the peripheral read/write - from/to registers. - (+) This delay depends on the peripheral mapping. - (++) AHB & APB peripherals, 1 dummy read is necessary - - [..] - Workarounds: - (#) For AHB & APB peripherals, a dummy read to the peripheral register has been - inserted in each LL_{BUS}_GRP{x}_EnableClock() function. - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_BUS_H -#define __STM32F4xx_LL_BUS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined(RCC) - -/** @defgroup BUS_LL BUS - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup BUS_LL_Exported_Constants BUS Exported Constants - * @{ - */ - -/** @defgroup BUS_LL_EC_AHB1_GRP1_PERIPH AHB1 GRP1 PERIPH - * @{ - */ -#define LL_AHB1_GRP1_PERIPH_ALL 0xFFFFFFFFU -#define LL_AHB1_GRP1_PERIPH_GPIOA RCC_AHB1ENR_GPIOAEN -#define LL_AHB1_GRP1_PERIPH_GPIOB RCC_AHB1ENR_GPIOBEN -#define LL_AHB1_GRP1_PERIPH_GPIOC RCC_AHB1ENR_GPIOCEN -#if defined(GPIOD) -#define LL_AHB1_GRP1_PERIPH_GPIOD RCC_AHB1ENR_GPIODEN -#endif /* GPIOD */ -#if defined(GPIOE) -#define LL_AHB1_GRP1_PERIPH_GPIOE RCC_AHB1ENR_GPIOEEN -#endif /* GPIOE */ -#if defined(GPIOF) -#define LL_AHB1_GRP1_PERIPH_GPIOF RCC_AHB1ENR_GPIOFEN -#endif /* GPIOF */ -#if defined(GPIOG) -#define LL_AHB1_GRP1_PERIPH_GPIOG RCC_AHB1ENR_GPIOGEN -#endif /* GPIOG */ -#if defined(GPIOH) -#define LL_AHB1_GRP1_PERIPH_GPIOH RCC_AHB1ENR_GPIOHEN -#endif /* GPIOH */ -#if defined(GPIOI) -#define LL_AHB1_GRP1_PERIPH_GPIOI RCC_AHB1ENR_GPIOIEN -#endif /* GPIOI */ -#if defined(GPIOJ) -#define LL_AHB1_GRP1_PERIPH_GPIOJ RCC_AHB1ENR_GPIOJEN -#endif /* GPIOJ */ -#if defined(GPIOK) -#define LL_AHB1_GRP1_PERIPH_GPIOK RCC_AHB1ENR_GPIOKEN -#endif /* GPIOK */ -#define LL_AHB1_GRP1_PERIPH_CRC RCC_AHB1ENR_CRCEN -#if defined(RCC_AHB1ENR_BKPSRAMEN) -#define LL_AHB1_GRP1_PERIPH_BKPSRAM RCC_AHB1ENR_BKPSRAMEN -#endif /* RCC_AHB1ENR_BKPSRAMEN */ -#if defined(RCC_AHB1ENR_CCMDATARAMEN) -#define LL_AHB1_GRP1_PERIPH_CCMDATARAM RCC_AHB1ENR_CCMDATARAMEN -#endif /* RCC_AHB1ENR_CCMDATARAMEN */ -#define LL_AHB1_GRP1_PERIPH_DMA1 RCC_AHB1ENR_DMA1EN -#define LL_AHB1_GRP1_PERIPH_DMA2 RCC_AHB1ENR_DMA2EN -#if defined(RCC_AHB1ENR_RNGEN) -#define LL_AHB1_GRP1_PERIPH_RNG RCC_AHB1ENR_RNGEN -#endif /* RCC_AHB1ENR_RNGEN */ -#if defined(DMA2D) -#define LL_AHB1_GRP1_PERIPH_DMA2D RCC_AHB1ENR_DMA2DEN -#endif /* DMA2D */ -#if defined(ETH) -#define LL_AHB1_GRP1_PERIPH_ETHMAC RCC_AHB1ENR_ETHMACEN -#define LL_AHB1_GRP1_PERIPH_ETHMACTX RCC_AHB1ENR_ETHMACTXEN -#define LL_AHB1_GRP1_PERIPH_ETHMACRX RCC_AHB1ENR_ETHMACRXEN -#define LL_AHB1_GRP1_PERIPH_ETHMACPTP RCC_AHB1ENR_ETHMACPTPEN -#endif /* ETH */ -#if defined(USB_OTG_HS) -#define LL_AHB1_GRP1_PERIPH_OTGHS RCC_AHB1ENR_OTGHSEN -#define LL_AHB1_GRP1_PERIPH_OTGHSULPI RCC_AHB1ENR_OTGHSULPIEN -#endif /* USB_OTG_HS */ -#define LL_AHB1_GRP1_PERIPH_FLITF RCC_AHB1LPENR_FLITFLPEN -#define LL_AHB1_GRP1_PERIPH_SRAM1 RCC_AHB1LPENR_SRAM1LPEN -#if defined(RCC_AHB1LPENR_SRAM2LPEN) -#define LL_AHB1_GRP1_PERIPH_SRAM2 RCC_AHB1LPENR_SRAM2LPEN -#endif /* RCC_AHB1LPENR_SRAM2LPEN */ -#if defined(RCC_AHB1LPENR_SRAM3LPEN) -#define LL_AHB1_GRP1_PERIPH_SRAM3 RCC_AHB1LPENR_SRAM3LPEN -#endif /* RCC_AHB1LPENR_SRAM3LPEN */ -/** - * @} - */ - -#if defined(RCC_AHB2_SUPPORT) -/** @defgroup BUS_LL_EC_AHB2_GRP1_PERIPH AHB2 GRP1 PERIPH - * @{ - */ -#define LL_AHB2_GRP1_PERIPH_ALL 0xFFFFFFFFU -#if defined(DCMI) -#define LL_AHB2_GRP1_PERIPH_DCMI RCC_AHB2ENR_DCMIEN -#endif /* DCMI */ -#if defined(CRYP) -#define LL_AHB2_GRP1_PERIPH_CRYP RCC_AHB2ENR_CRYPEN -#endif /* CRYP */ -#if defined(AES) -#define LL_AHB2_GRP1_PERIPH_AES RCC_AHB2ENR_AESEN -#endif /* AES */ -#if defined(HASH) -#define LL_AHB2_GRP1_PERIPH_HASH RCC_AHB2ENR_HASHEN -#endif /* HASH */ -#if defined(RCC_AHB2ENR_RNGEN) -#define LL_AHB2_GRP1_PERIPH_RNG RCC_AHB2ENR_RNGEN -#endif /* RCC_AHB2ENR_RNGEN */ -#if defined(USB_OTG_FS) -#define LL_AHB2_GRP1_PERIPH_OTGFS RCC_AHB2ENR_OTGFSEN -#endif /* USB_OTG_FS */ -/** - * @} - */ -#endif /* RCC_AHB2_SUPPORT */ - -#if defined(RCC_AHB3_SUPPORT) -/** @defgroup BUS_LL_EC_AHB3_GRP1_PERIPH AHB3 GRP1 PERIPH - * @{ - */ -#define LL_AHB3_GRP1_PERIPH_ALL 0xFFFFFFFFU -#if defined(FSMC_Bank1) -#define LL_AHB3_GRP1_PERIPH_FSMC RCC_AHB3ENR_FSMCEN -#endif /* FSMC_Bank1 */ -#if defined(FMC_Bank1) -#define LL_AHB3_GRP1_PERIPH_FMC RCC_AHB3ENR_FMCEN -#endif /* FMC_Bank1 */ -#if defined(QUADSPI) -#define LL_AHB3_GRP1_PERIPH_QSPI RCC_AHB3ENR_QSPIEN -#endif /* QUADSPI */ -/** - * @} - */ -#endif /* RCC_AHB3_SUPPORT */ - -/** @defgroup BUS_LL_EC_APB1_GRP1_PERIPH APB1 GRP1 PERIPH - * @{ - */ -#define LL_APB1_GRP1_PERIPH_ALL 0xFFFFFFFFU -#if defined(TIM2) -#define LL_APB1_GRP1_PERIPH_TIM2 RCC_APB1ENR_TIM2EN -#endif /* TIM2 */ -#if defined(TIM3) -#define LL_APB1_GRP1_PERIPH_TIM3 RCC_APB1ENR_TIM3EN -#endif /* TIM3 */ -#if defined(TIM4) -#define LL_APB1_GRP1_PERIPH_TIM4 RCC_APB1ENR_TIM4EN -#endif /* TIM4 */ -#define LL_APB1_GRP1_PERIPH_TIM5 RCC_APB1ENR_TIM5EN -#if defined(TIM6) -#define LL_APB1_GRP1_PERIPH_TIM6 RCC_APB1ENR_TIM6EN -#endif /* TIM6 */ -#if defined(TIM7) -#define LL_APB1_GRP1_PERIPH_TIM7 RCC_APB1ENR_TIM7EN -#endif /* TIM7 */ -#if defined(TIM12) -#define LL_APB1_GRP1_PERIPH_TIM12 RCC_APB1ENR_TIM12EN -#endif /* TIM12 */ -#if defined(TIM13) -#define LL_APB1_GRP1_PERIPH_TIM13 RCC_APB1ENR_TIM13EN -#endif /* TIM13 */ -#if defined(TIM14) -#define LL_APB1_GRP1_PERIPH_TIM14 RCC_APB1ENR_TIM14EN -#endif /* TIM14 */ -#if defined(LPTIM1) -#define LL_APB1_GRP1_PERIPH_LPTIM1 RCC_APB1ENR_LPTIM1EN -#endif /* LPTIM1 */ -#if defined(RCC_APB1ENR_RTCAPBEN) -#define LL_APB1_GRP1_PERIPH_RTCAPB RCC_APB1ENR_RTCAPBEN -#endif /* RCC_APB1ENR_RTCAPBEN */ -#define LL_APB1_GRP1_PERIPH_WWDG RCC_APB1ENR_WWDGEN -#if defined(SPI2) -#define LL_APB1_GRP1_PERIPH_SPI2 RCC_APB1ENR_SPI2EN -#endif /* SPI2 */ -#if defined(SPI3) -#define LL_APB1_GRP1_PERIPH_SPI3 RCC_APB1ENR_SPI3EN -#endif /* SPI3 */ -#if defined(SPDIFRX) -#define LL_APB1_GRP1_PERIPH_SPDIFRX RCC_APB1ENR_SPDIFRXEN -#endif /* SPDIFRX */ -#define LL_APB1_GRP1_PERIPH_USART2 RCC_APB1ENR_USART2EN -#if defined(USART3) -#define LL_APB1_GRP1_PERIPH_USART3 RCC_APB1ENR_USART3EN -#endif /* USART3 */ -#if defined(UART4) -#define LL_APB1_GRP1_PERIPH_UART4 RCC_APB1ENR_UART4EN -#endif /* UART4 */ -#if defined(UART5) -#define LL_APB1_GRP1_PERIPH_UART5 RCC_APB1ENR_UART5EN -#endif /* UART5 */ -#define LL_APB1_GRP1_PERIPH_I2C1 RCC_APB1ENR_I2C1EN -#define LL_APB1_GRP1_PERIPH_I2C2 RCC_APB1ENR_I2C2EN -#if defined(I2C3) -#define LL_APB1_GRP1_PERIPH_I2C3 RCC_APB1ENR_I2C3EN -#endif /* I2C3 */ -#if defined(FMPI2C1) -#define LL_APB1_GRP1_PERIPH_FMPI2C1 RCC_APB1ENR_FMPI2C1EN -#endif /* FMPI2C1 */ -#if defined(CAN1) -#define LL_APB1_GRP1_PERIPH_CAN1 RCC_APB1ENR_CAN1EN -#endif /* CAN1 */ -#if defined(CAN2) -#define LL_APB1_GRP1_PERIPH_CAN2 RCC_APB1ENR_CAN2EN -#endif /* CAN2 */ -#if defined(CAN3) -#define LL_APB1_GRP1_PERIPH_CAN3 RCC_APB1ENR_CAN3EN -#endif /* CAN3 */ -#if defined(CEC) -#define LL_APB1_GRP1_PERIPH_CEC RCC_APB1ENR_CECEN -#endif /* CEC */ -#define LL_APB1_GRP1_PERIPH_PWR RCC_APB1ENR_PWREN -#if defined(DAC1) -#define LL_APB1_GRP1_PERIPH_DAC1 RCC_APB1ENR_DACEN -#endif /* DAC1 */ -#if defined(UART7) -#define LL_APB1_GRP1_PERIPH_UART7 RCC_APB1ENR_UART7EN -#endif /* UART7 */ -#if defined(UART8) -#define LL_APB1_GRP1_PERIPH_UART8 RCC_APB1ENR_UART8EN -#endif /* UART8 */ -/** - * @} - */ - -/** @defgroup BUS_LL_EC_APB2_GRP1_PERIPH APB2 GRP1 PERIPH - * @{ - */ -#define LL_APB2_GRP1_PERIPH_ALL 0xFFFFFFFFU -#define LL_APB2_GRP1_PERIPH_TIM1 RCC_APB2ENR_TIM1EN -#if defined(TIM8) -#define LL_APB2_GRP1_PERIPH_TIM8 RCC_APB2ENR_TIM8EN -#endif /* TIM8 */ -#define LL_APB2_GRP1_PERIPH_USART1 RCC_APB2ENR_USART1EN -#if defined(USART6) -#define LL_APB2_GRP1_PERIPH_USART6 RCC_APB2ENR_USART6EN -#endif /* USART6 */ -#if defined(UART9) -#define LL_APB2_GRP1_PERIPH_UART9 RCC_APB2ENR_UART9EN -#endif /* UART9 */ -#if defined(UART10) -#define LL_APB2_GRP1_PERIPH_UART10 RCC_APB2ENR_UART10EN -#endif /* UART10 */ -#define LL_APB2_GRP1_PERIPH_ADC1 RCC_APB2ENR_ADC1EN -#if defined(ADC2) -#define LL_APB2_GRP1_PERIPH_ADC2 RCC_APB2ENR_ADC2EN -#endif /* ADC2 */ -#if defined(ADC3) -#define LL_APB2_GRP1_PERIPH_ADC3 RCC_APB2ENR_ADC3EN -#endif /* ADC3 */ -#if defined(SDIO) -#define LL_APB2_GRP1_PERIPH_SDIO RCC_APB2ENR_SDIOEN -#endif /* SDIO */ -#define LL_APB2_GRP1_PERIPH_SPI1 RCC_APB2ENR_SPI1EN -#if defined(SPI4) -#define LL_APB2_GRP1_PERIPH_SPI4 RCC_APB2ENR_SPI4EN -#endif /* SPI4 */ -#define LL_APB2_GRP1_PERIPH_SYSCFG RCC_APB2ENR_SYSCFGEN -#if defined(RCC_APB2ENR_EXTITEN) -#define LL_APB2_GRP1_PERIPH_EXTI RCC_APB2ENR_EXTITEN -#endif /* RCC_APB2ENR_EXTITEN */ -#define LL_APB2_GRP1_PERIPH_TIM9 RCC_APB2ENR_TIM9EN -#if defined(TIM10) -#define LL_APB2_GRP1_PERIPH_TIM10 RCC_APB2ENR_TIM10EN -#endif /* TIM10 */ -#define LL_APB2_GRP1_PERIPH_TIM11 RCC_APB2ENR_TIM11EN -#if defined(SPI5) -#define LL_APB2_GRP1_PERIPH_SPI5 RCC_APB2ENR_SPI5EN -#endif /* SPI5 */ -#if defined(SPI6) -#define LL_APB2_GRP1_PERIPH_SPI6 RCC_APB2ENR_SPI6EN -#endif /* SPI6 */ -#if defined(SAI1) -#define LL_APB2_GRP1_PERIPH_SAI1 RCC_APB2ENR_SAI1EN -#endif /* SAI1 */ -#if defined(SAI2) -#define LL_APB2_GRP1_PERIPH_SAI2 RCC_APB2ENR_SAI2EN -#endif /* SAI2 */ -#if defined(LTDC) -#define LL_APB2_GRP1_PERIPH_LTDC RCC_APB2ENR_LTDCEN -#endif /* LTDC */ -#if defined(DSI) -#define LL_APB2_GRP1_PERIPH_DSI RCC_APB2ENR_DSIEN -#endif /* DSI */ -#if defined(DFSDM1_Channel0) -#define LL_APB2_GRP1_PERIPH_DFSDM1 RCC_APB2ENR_DFSDM1EN -#endif /* DFSDM1_Channel0 */ -#if defined(DFSDM2_Channel0) -#define LL_APB2_GRP1_PERIPH_DFSDM2 RCC_APB2ENR_DFSDM2EN -#endif /* DFSDM2_Channel0 */ -#define LL_APB2_GRP1_PERIPH_ADC RCC_APB2RSTR_ADCRST -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup BUS_LL_Exported_Functions BUS Exported Functions - * @{ - */ - -/** @defgroup BUS_LL_EF_AHB1 AHB1 - * @{ - */ - -/** - * @brief Enable AHB1 peripherals clock. - * @rmtoll AHB1ENR GPIOAEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOBEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOCEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIODEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOEEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOFEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOGEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOHEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOIEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOJEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR GPIOKEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR CRCEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR BKPSRAMEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR CCMDATARAMEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR DMA1EN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR DMA2EN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR RNGEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR DMA2DEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR ETHMACEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR ETHMACTXEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR ETHMACRXEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR ETHMACPTPEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR OTGHSEN LL_AHB1_GRP1_EnableClock\n - * AHB1ENR OTGHSULPIEN LL_AHB1_GRP1_EnableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CCMDATARAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_EnableClock(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB1ENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB1ENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Check if AHB1 peripheral clock is enabled or not - * @rmtoll AHB1ENR GPIOAEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOBEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOCEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIODEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOEEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOFEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOGEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOHEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOIEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOJEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR GPIOKEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR CRCEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR BKPSRAMEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR CCMDATARAMEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR DMA1EN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR DMA2EN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR RNGEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR DMA2DEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR ETHMACEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR ETHMACTXEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR ETHMACRXEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR ETHMACPTPEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR OTGHSEN LL_AHB1_GRP1_IsEnabledClock\n - * AHB1ENR OTGHSULPIEN LL_AHB1_GRP1_IsEnabledClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CCMDATARAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) - * - * (*) value not defined in all devices. - * @retval State of Periphs (1 or 0). - */ -__STATIC_INLINE uint32_t LL_AHB1_GRP1_IsEnabledClock(uint32_t Periphs) -{ - return (READ_BIT(RCC->AHB1ENR, Periphs) == Periphs); -} - -/** - * @brief Disable AHB1 peripherals clock. - * @rmtoll AHB1ENR GPIOAEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOBEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOCEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIODEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOEEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOFEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOGEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOHEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOIEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOJEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR GPIOKEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR CRCEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR BKPSRAMEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR CCMDATARAMEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR DMA1EN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR DMA2EN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR RNGEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR DMA2DEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR ETHMACEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR ETHMACTXEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR ETHMACRXEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR ETHMACPTPEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR OTGHSEN LL_AHB1_GRP1_DisableClock\n - * AHB1ENR OTGHSULPIEN LL_AHB1_GRP1_DisableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CCMDATARAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_DisableClock(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB1ENR, Periphs); -} - -/** - * @brief Force AHB1 peripherals reset. - * @rmtoll AHB1RSTR GPIOARST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOBRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOCRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIODRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOERST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOFRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOGRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOHRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOIRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOJRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR GPIOKRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR CRCRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR DMA1RST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR DMA2RST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR RNGRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR DMA2DRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR ETHMACRST LL_AHB1_GRP1_ForceReset\n - * AHB1RSTR OTGHSRST LL_AHB1_GRP1_ForceReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_ALL - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_ForceReset(uint32_t Periphs) -{ - SET_BIT(RCC->AHB1RSTR, Periphs); -} - -/** - * @brief Release AHB1 peripherals reset. - * @rmtoll AHB1RSTR GPIOARST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOBRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOCRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIODRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOERST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOFRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOGRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOHRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOIRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOJRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR GPIOKRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR CRCRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR DMA1RST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR DMA2RST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR RNGRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR DMA2DRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR ETHMACRST LL_AHB1_GRP1_ReleaseReset\n - * AHB1RSTR OTGHSRST LL_AHB1_GRP1_ReleaseReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_ALL - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_ReleaseReset(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB1RSTR, Periphs); -} - -/** - * @brief Enable AHB1 peripheral clocks in low-power mode - * @rmtoll AHB1LPENR GPIOALPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOBLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOCLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIODLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOELPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOFLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOGLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOHLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOILPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOJLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR GPIOKLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR CRCLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR FLITFLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR SRAM1LPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR SRAM2LPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR SRAM3LPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR DMA1LPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR DMA2LPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR DMA2DLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR RNGLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR ETHMACLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR ETHMACTXLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR ETHMACRXLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR ETHMACPTPLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR OTGHSLPEN LL_AHB1_GRP1_EnableClockLowPower\n - * AHB1LPENR OTGHSULPILPEN LL_AHB1_GRP1_EnableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_FLITF - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM1 - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM2 (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM3 (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_EnableClockLowPower(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB1LPENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB1LPENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Disable AHB1 peripheral clocks in low-power mode - * @rmtoll AHB1LPENR GPIOALPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOBLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOCLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIODLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOELPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOFLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOGLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOHLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOILPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOJLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR GPIOKLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR CRCLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR FLITFLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR SRAM1LPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR SRAM2LPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR SRAM3LPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR DMA1LPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR DMA2LPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR DMA2DLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR RNGLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR ETHMACLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR ETHMACTXLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR ETHMACRXLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR ETHMACPTPLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR OTGHSLPEN LL_AHB1_GRP1_DisableClockLowPower\n - * AHB1LPENR OTGHSULPILPEN LL_AHB1_GRP1_DisableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_CRC - * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_FLITF - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM1 - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM2 (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM3 (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 - * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) - * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB1_GRP1_DisableClockLowPower(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB1LPENR, Periphs); -} - -/** - * @} - */ - -#if defined(RCC_AHB2_SUPPORT) -/** @defgroup BUS_LL_EF_AHB2 AHB2 - * @{ - */ - -/** - * @brief Enable AHB2 peripherals clock. - * @rmtoll AHB2ENR DCMIEN LL_AHB2_GRP1_EnableClock\n - * AHB2ENR CRYPEN LL_AHB2_GRP1_EnableClock\n - * AHB2ENR AESEN LL_AHB2_GRP1_EnableClock\n - * AHB2ENR HASHEN LL_AHB2_GRP1_EnableClock\n - * AHB2ENR RNGEN LL_AHB2_GRP1_EnableClock\n - * AHB2ENR OTGFSEN LL_AHB2_GRP1_EnableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_EnableClock(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB2ENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB2ENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Check if AHB2 peripheral clock is enabled or not - * @rmtoll AHB2ENR DCMIEN LL_AHB2_GRP1_IsEnabledClock\n - * AHB2ENR CRYPEN LL_AHB2_GRP1_IsEnabledClock\n - * AHB2ENR AESEN LL_AHB2_GRP1_IsEnabledClock\n - * AHB2ENR HASHEN LL_AHB2_GRP1_IsEnabledClock\n - * AHB2ENR RNGEN LL_AHB2_GRP1_IsEnabledClock\n - * AHB2ENR OTGFSEN LL_AHB2_GRP1_IsEnabledClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval State of Periphs (1 or 0). - */ -__STATIC_INLINE uint32_t LL_AHB2_GRP1_IsEnabledClock(uint32_t Periphs) -{ - return (READ_BIT(RCC->AHB2ENR, Periphs) == Periphs); -} - -/** - * @brief Disable AHB2 peripherals clock. - * @rmtoll AHB2ENR DCMIEN LL_AHB2_GRP1_DisableClock\n - * AHB2ENR CRYPEN LL_AHB2_GRP1_DisableClock\n - * AHB2ENR AESEN LL_AHB2_GRP1_DisableClock\n - * AHB2ENR HASHEN LL_AHB2_GRP1_DisableClock\n - * AHB2ENR RNGEN LL_AHB2_GRP1_DisableClock\n - * AHB2ENR OTGFSEN LL_AHB2_GRP1_DisableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_DisableClock(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB2ENR, Periphs); -} - -/** - * @brief Force AHB2 peripherals reset. - * @rmtoll AHB2RSTR DCMIRST LL_AHB2_GRP1_ForceReset\n - * AHB2RSTR CRYPRST LL_AHB2_GRP1_ForceReset\n - * AHB2RSTR AESRST LL_AHB2_GRP1_ForceReset\n - * AHB2RSTR HASHRST LL_AHB2_GRP1_ForceReset\n - * AHB2RSTR RNGRST LL_AHB2_GRP1_ForceReset\n - * AHB2RSTR OTGFSRST LL_AHB2_GRP1_ForceReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_ALL - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_ForceReset(uint32_t Periphs) -{ - SET_BIT(RCC->AHB2RSTR, Periphs); -} - -/** - * @brief Release AHB2 peripherals reset. - * @rmtoll AHB2RSTR DCMIRST LL_AHB2_GRP1_ReleaseReset\n - * AHB2RSTR CRYPRST LL_AHB2_GRP1_ReleaseReset\n - * AHB2RSTR AESRST LL_AHB2_GRP1_ReleaseReset\n - * AHB2RSTR HASHRST LL_AHB2_GRP1_ReleaseReset\n - * AHB2RSTR RNGRST LL_AHB2_GRP1_ReleaseReset\n - * AHB2RSTR OTGFSRST LL_AHB2_GRP1_ReleaseReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_ALL - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_ReleaseReset(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB2RSTR, Periphs); -} - -/** - * @brief Enable AHB2 peripheral clocks in low-power mode - * @rmtoll AHB2LPENR DCMILPEN LL_AHB2_GRP1_EnableClockLowPower\n - * AHB2LPENR CRYPLPEN LL_AHB2_GRP1_EnableClockLowPower\n - * AHB2LPENR AESLPEN LL_AHB2_GRP1_EnableClockLowPower\n - * AHB2LPENR HASHLPEN LL_AHB2_GRP1_EnableClockLowPower\n - * AHB2LPENR RNGLPEN LL_AHB2_GRP1_EnableClockLowPower\n - * AHB2LPENR OTGFSLPEN LL_AHB2_GRP1_EnableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_EnableClockLowPower(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB2LPENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB2LPENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Disable AHB2 peripheral clocks in low-power mode - * @rmtoll AHB2LPENR DCMILPEN LL_AHB2_GRP1_DisableClockLowPower\n - * AHB2LPENR CRYPLPEN LL_AHB2_GRP1_DisableClockLowPower\n - * AHB2LPENR AESLPEN LL_AHB2_GRP1_DisableClockLowPower\n - * AHB2LPENR HASHLPEN LL_AHB2_GRP1_DisableClockLowPower\n - * AHB2LPENR RNGLPEN LL_AHB2_GRP1_DisableClockLowPower\n - * AHB2LPENR OTGFSLPEN LL_AHB2_GRP1_DisableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) - * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB2_GRP1_DisableClockLowPower(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB2LPENR, Periphs); -} - -/** - * @} - */ -#endif /* RCC_AHB2_SUPPORT */ - -#if defined(RCC_AHB3_SUPPORT) -/** @defgroup BUS_LL_EF_AHB3 AHB3 - * @{ - */ - -/** - * @brief Enable AHB3 peripherals clock. - * @rmtoll AHB3ENR FMCEN LL_AHB3_GRP1_EnableClock\n - * AHB3ENR FSMCEN LL_AHB3_GRP1_EnableClock\n - * AHB3ENR QSPIEN LL_AHB3_GRP1_EnableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_EnableClock(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB3ENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB3ENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Check if AHB3 peripheral clock is enabled or not - * @rmtoll AHB3ENR FMCEN LL_AHB3_GRP1_IsEnabledClock\n - * AHB3ENR FSMCEN LL_AHB3_GRP1_IsEnabledClock\n - * AHB3ENR QSPIEN LL_AHB3_GRP1_IsEnabledClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval State of Periphs (1 or 0). - */ -__STATIC_INLINE uint32_t LL_AHB3_GRP1_IsEnabledClock(uint32_t Periphs) -{ - return (READ_BIT(RCC->AHB3ENR, Periphs) == Periphs); -} - -/** - * @brief Disable AHB3 peripherals clock. - * @rmtoll AHB3ENR FMCEN LL_AHB3_GRP1_DisableClock\n - * AHB3ENR FSMCEN LL_AHB3_GRP1_DisableClock\n - * AHB3ENR QSPIEN LL_AHB3_GRP1_DisableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_DisableClock(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB3ENR, Periphs); -} - -/** - * @brief Force AHB3 peripherals reset. - * @rmtoll AHB3RSTR FMCRST LL_AHB3_GRP1_ForceReset\n - * AHB3RSTR FSMCRST LL_AHB3_GRP1_ForceReset\n - * AHB3RSTR QSPIRST LL_AHB3_GRP1_ForceReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_ALL - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_ForceReset(uint32_t Periphs) -{ - SET_BIT(RCC->AHB3RSTR, Periphs); -} - -/** - * @brief Release AHB3 peripherals reset. - * @rmtoll AHB3RSTR FMCRST LL_AHB3_GRP1_ReleaseReset\n - * AHB3RSTR FSMCRST LL_AHB3_GRP1_ReleaseReset\n - * AHB3RSTR QSPIRST LL_AHB3_GRP1_ReleaseReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB2_GRP1_PERIPH_ALL - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_ReleaseReset(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB3RSTR, Periphs); -} - -/** - * @brief Enable AHB3 peripheral clocks in low-power mode - * @rmtoll AHB3LPENR FMCLPEN LL_AHB3_GRP1_EnableClockLowPower\n - * AHB3LPENR FSMCLPEN LL_AHB3_GRP1_EnableClockLowPower\n - * AHB3LPENR QSPILPEN LL_AHB3_GRP1_EnableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_EnableClockLowPower(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->AHB3LPENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB3LPENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Disable AHB3 peripheral clocks in low-power mode - * @rmtoll AHB3LPENR FMCLPEN LL_AHB3_GRP1_DisableClockLowPower\n - * AHB3LPENR FSMCLPEN LL_AHB3_GRP1_DisableClockLowPower\n - * AHB3LPENR QSPILPEN LL_AHB3_GRP1_DisableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) - * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_AHB3_GRP1_DisableClockLowPower(uint32_t Periphs) -{ - CLEAR_BIT(RCC->AHB3LPENR, Periphs); -} - -/** - * @} - */ -#endif /* RCC_AHB3_SUPPORT */ - -/** @defgroup BUS_LL_EF_APB1 APB1 - * @{ - */ - -/** - * @brief Enable APB1 peripherals clock. - * @rmtoll APB1ENR TIM2EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM3EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM4EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM5EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM6EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM7EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM12EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM13EN LL_APB1_GRP1_EnableClock\n - * APB1ENR TIM14EN LL_APB1_GRP1_EnableClock\n - * APB1ENR LPTIM1EN LL_APB1_GRP1_EnableClock\n - * APB1ENR WWDGEN LL_APB1_GRP1_EnableClock\n - * APB1ENR SPI2EN LL_APB1_GRP1_EnableClock\n - * APB1ENR SPI3EN LL_APB1_GRP1_EnableClock\n - * APB1ENR SPDIFRXEN LL_APB1_GRP1_EnableClock\n - * APB1ENR USART2EN LL_APB1_GRP1_EnableClock\n - * APB1ENR USART3EN LL_APB1_GRP1_EnableClock\n - * APB1ENR UART4EN LL_APB1_GRP1_EnableClock\n - * APB1ENR UART5EN LL_APB1_GRP1_EnableClock\n - * APB1ENR I2C1EN LL_APB1_GRP1_EnableClock\n - * APB1ENR I2C2EN LL_APB1_GRP1_EnableClock\n - * APB1ENR I2C3EN LL_APB1_GRP1_EnableClock\n - * APB1ENR FMPI2C1EN LL_APB1_GRP1_EnableClock\n - * APB1ENR CAN1EN LL_APB1_GRP1_EnableClock\n - * APB1ENR CAN2EN LL_APB1_GRP1_EnableClock\n - * APB1ENR CAN3EN LL_APB1_GRP1_EnableClock\n - * APB1ENR CECEN LL_APB1_GRP1_EnableClock\n - * APB1ENR PWREN LL_APB1_GRP1_EnableClock\n - * APB1ENR DACEN LL_APB1_GRP1_EnableClock\n - * APB1ENR UART7EN LL_APB1_GRP1_EnableClock\n - * APB1ENR UART8EN LL_APB1_GRP1_EnableClock\n - * APB1ENR RTCAPBEN LL_APB1_GRP1_EnableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_EnableClock(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->APB1ENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->APB1ENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Check if APB1 peripheral clock is enabled or not - * @rmtoll APB1ENR TIM2EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM3EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM4EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM5EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM6EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM7EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM12EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM13EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR TIM14EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR LPTIM1EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR WWDGEN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR SPI2EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR SPI3EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR SPDIFRXEN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR USART2EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR USART3EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR UART4EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR UART5EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR I2C1EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR I2C2EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR I2C3EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR FMPI2C1EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR CAN1EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR CAN2EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR CAN3EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR CECEN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR PWREN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR DACEN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR UART7EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR UART8EN LL_APB1_GRP1_IsEnabledClock\n - * APB1ENR RTCAPBEN LL_APB1_GRP1_IsEnabledClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) - * - * (*) value not defined in all devices. - * @retval State of Periphs (1 or 0). - */ -__STATIC_INLINE uint32_t LL_APB1_GRP1_IsEnabledClock(uint32_t Periphs) -{ - return (READ_BIT(RCC->APB1ENR, Periphs) == Periphs); -} - -/** - * @brief Disable APB1 peripherals clock. - * @rmtoll APB1ENR TIM2EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM3EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM4EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM5EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM6EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM7EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM12EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM13EN LL_APB1_GRP1_DisableClock\n - * APB1ENR TIM14EN LL_APB1_GRP1_DisableClock\n - * APB1ENR LPTIM1EN LL_APB1_GRP1_DisableClock\n - * APB1ENR WWDGEN LL_APB1_GRP1_DisableClock\n - * APB1ENR SPI2EN LL_APB1_GRP1_DisableClock\n - * APB1ENR SPI3EN LL_APB1_GRP1_DisableClock\n - * APB1ENR SPDIFRXEN LL_APB1_GRP1_DisableClock\n - * APB1ENR USART2EN LL_APB1_GRP1_DisableClock\n - * APB1ENR USART3EN LL_APB1_GRP1_DisableClock\n - * APB1ENR UART4EN LL_APB1_GRP1_DisableClock\n - * APB1ENR UART5EN LL_APB1_GRP1_DisableClock\n - * APB1ENR I2C1EN LL_APB1_GRP1_DisableClock\n - * APB1ENR I2C2EN LL_APB1_GRP1_DisableClock\n - * APB1ENR I2C3EN LL_APB1_GRP1_DisableClock\n - * APB1ENR FMPI2C1EN LL_APB1_GRP1_DisableClock\n - * APB1ENR CAN1EN LL_APB1_GRP1_DisableClock\n - * APB1ENR CAN2EN LL_APB1_GRP1_DisableClock\n - * APB1ENR CAN3EN LL_APB1_GRP1_DisableClock\n - * APB1ENR CECEN LL_APB1_GRP1_DisableClock\n - * APB1ENR PWREN LL_APB1_GRP1_DisableClock\n - * APB1ENR DACEN LL_APB1_GRP1_DisableClock\n - * APB1ENR UART7EN LL_APB1_GRP1_DisableClock\n - * APB1ENR UART8EN LL_APB1_GRP1_DisableClock\n - * APB1ENR RTCAPBEN LL_APB1_GRP1_DisableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_DisableClock(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB1ENR, Periphs); -} - -/** - * @brief Force APB1 peripherals reset. - * @rmtoll APB1RSTR TIM2RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM3RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM4RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM5RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM6RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM7RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM12RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM13RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR TIM14RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR LPTIM1RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR WWDGRST LL_APB1_GRP1_ForceReset\n - * APB1RSTR SPI2RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR SPI3RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR SPDIFRXRST LL_APB1_GRP1_ForceReset\n - * APB1RSTR USART2RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR USART3RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR UART4RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR UART5RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR I2C1RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR I2C2RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR I2C3RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR FMPI2C1RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR CAN1RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR CAN2RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR CAN3RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR CECRST LL_APB1_GRP1_ForceReset\n - * APB1RSTR PWRRST LL_APB1_GRP1_ForceReset\n - * APB1RSTR DACRST LL_APB1_GRP1_ForceReset\n - * APB1RSTR UART7RST LL_APB1_GRP1_ForceReset\n - * APB1RSTR UART8RST LL_APB1_GRP1_ForceReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_ForceReset(uint32_t Periphs) -{ - SET_BIT(RCC->APB1RSTR, Periphs); -} - -/** - * @brief Release APB1 peripherals reset. - * @rmtoll APB1RSTR TIM2RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM3RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM4RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM5RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM6RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM7RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM12RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM13RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR TIM14RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR LPTIM1RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR WWDGRST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR SPI2RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR SPI3RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR SPDIFRXRST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR USART2RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR USART3RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR UART4RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR UART5RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR I2C1RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR I2C2RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR I2C3RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR FMPI2C1RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR CAN1RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR CAN2RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR CAN3RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR CECRST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR PWRRST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR DACRST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR UART7RST LL_APB1_GRP1_ReleaseReset\n - * APB1RSTR UART8RST LL_APB1_GRP1_ReleaseReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_ReleaseReset(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB1RSTR, Periphs); -} - -/** - * @brief Enable APB1 peripheral clocks in low-power mode - * @rmtoll APB1LPENR TIM2LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM3LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM4LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM5LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM6LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM7LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM12LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM13LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR TIM14LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR LPTIM1LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR WWDGLPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR SPI2LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR SPI3LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR SPDIFRXLPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR USART2LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR USART3LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR UART4LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR UART5LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR I2C1LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR I2C2LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR I2C3LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR FMPI2C1LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR CAN1LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR CAN2LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR CAN3LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR CECLPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR PWRLPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR DACLPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR UART7LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR UART8LPEN LL_APB1_GRP1_EnableClockLowPower\n - * APB1LPENR RTCAPBLPEN LL_APB1_GRP1_EnableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_EnableClockLowPower(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->APB1LPENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->APB1LPENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Disable APB1 peripheral clocks in low-power mode - * @rmtoll APB1LPENR TIM2LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM3LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM4LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM5LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM6LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM7LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM12LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM13LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR TIM14LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR LPTIM1LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR WWDGLPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR SPI2LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR SPI3LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR SPDIFRXLPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR USART2LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR USART3LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR UART4LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR UART5LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR I2C1LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR I2C2LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR I2C3LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR FMPI2C1LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR CAN1LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR CAN2LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR CAN3LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR CECLPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR PWRLPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR DACLPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR UART7LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR UART8LPEN LL_APB1_GRP1_DisableClockLowPower\n - * APB1LPENR RTCAPBLPEN LL_APB1_GRP1_DisableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 - * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_WWDG - * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) - * @arg @ref LL_APB1_GRP1_PERIPH_USART2 - * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 - * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) - * @arg @ref LL_APB1_GRP1_PERIPH_PWR - * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) - * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB1_GRP1_DisableClockLowPower(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB1LPENR, Periphs); -} - -/** - * @} - */ - -/** @defgroup BUS_LL_EF_APB2 APB2 - * @{ - */ - -/** - * @brief Enable APB2 peripherals clock. - * @rmtoll APB2ENR TIM1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR TIM8EN LL_APB2_GRP1_EnableClock\n - * APB2ENR USART1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR USART6EN LL_APB2_GRP1_EnableClock\n - * APB2ENR UART9EN LL_APB2_GRP1_EnableClock\n - * APB2ENR UART10EN LL_APB2_GRP1_EnableClock\n - * APB2ENR ADC1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR ADC2EN LL_APB2_GRP1_EnableClock\n - * APB2ENR ADC3EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SDIOEN LL_APB2_GRP1_EnableClock\n - * APB2ENR SPI1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SPI4EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SYSCFGEN LL_APB2_GRP1_EnableClock\n - * APB2ENR EXTITEN LL_APB2_GRP1_EnableClock\n - * APB2ENR TIM9EN LL_APB2_GRP1_EnableClock\n - * APB2ENR TIM10EN LL_APB2_GRP1_EnableClock\n - * APB2ENR TIM11EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SPI5EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SPI6EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SAI1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR SAI2EN LL_APB2_GRP1_EnableClock\n - * APB2ENR LTDCEN LL_APB2_GRP1_EnableClock\n - * APB2ENR DSIEN LL_APB2_GRP1_EnableClock\n - * APB2ENR DFSDM1EN LL_APB2_GRP1_EnableClock\n - * APB2ENR DFSDM2EN LL_APB2_GRP1_EnableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 - * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_EnableClock(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->APB2ENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->APB2ENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Check if APB2 peripheral clock is enabled or not - * @rmtoll APB2ENR TIM1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR TIM8EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR USART1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR USART6EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR UART9EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR UART10EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR ADC1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR ADC2EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR ADC3EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SDIOEN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SPI1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SPI4EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SYSCFGEN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR EXTITEN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR TIM9EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR TIM10EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR TIM11EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SPI5EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SPI6EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SAI1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR SAI2EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR LTDCEN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR DSIEN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR DFSDM1EN LL_APB2_GRP1_IsEnabledClock\n - * APB2ENR DFSDM2EN LL_APB2_GRP1_IsEnabledClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 - * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval State of Periphs (1 or 0). - */ -__STATIC_INLINE uint32_t LL_APB2_GRP1_IsEnabledClock(uint32_t Periphs) -{ - return (READ_BIT(RCC->APB2ENR, Periphs) == Periphs); -} - -/** - * @brief Disable APB2 peripherals clock. - * @rmtoll APB2ENR TIM1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR TIM8EN LL_APB2_GRP1_DisableClock\n - * APB2ENR USART1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR USART6EN LL_APB2_GRP1_DisableClock\n - * APB2ENR UART9EN LL_APB2_GRP1_DisableClock\n - * APB2ENR UART10EN LL_APB2_GRP1_DisableClock\n - * APB2ENR ADC1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR ADC2EN LL_APB2_GRP1_DisableClock\n - * APB2ENR ADC3EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SDIOEN LL_APB2_GRP1_DisableClock\n - * APB2ENR SPI1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SPI4EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SYSCFGEN LL_APB2_GRP1_DisableClock\n - * APB2ENR EXTITEN LL_APB2_GRP1_DisableClock\n - * APB2ENR TIM9EN LL_APB2_GRP1_DisableClock\n - * APB2ENR TIM10EN LL_APB2_GRP1_DisableClock\n - * APB2ENR TIM11EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SPI5EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SPI6EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SAI1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR SAI2EN LL_APB2_GRP1_DisableClock\n - * APB2ENR LTDCEN LL_APB2_GRP1_DisableClock\n - * APB2ENR DSIEN LL_APB2_GRP1_DisableClock\n - * APB2ENR DFSDM1EN LL_APB2_GRP1_DisableClock\n - * APB2ENR DFSDM2EN LL_APB2_GRP1_DisableClock - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 - * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_DisableClock(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB2ENR, Periphs); -} - -/** - * @brief Force APB2 peripherals reset. - * @rmtoll APB2RSTR TIM1RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR TIM8RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR USART1RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR USART6RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR UART9RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR UART10RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR ADCRST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SDIORST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SPI1RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SPI4RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SYSCFGRST LL_APB2_GRP1_ForceReset\n - * APB2RSTR TIM9RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR TIM10RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR TIM11RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SPI5RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SPI6RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SAI1RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR SAI2RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR LTDCRST LL_APB2_GRP1_ForceReset\n - * APB2RSTR DSIRST LL_APB2_GRP1_ForceReset\n - * APB2RSTR DFSDM1RST LL_APB2_GRP1_ForceReset\n - * APB2RSTR DFSDM2RST LL_APB2_GRP1_ForceReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_ALL - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_ForceReset(uint32_t Periphs) -{ - SET_BIT(RCC->APB2RSTR, Periphs); -} - -/** - * @brief Release APB2 peripherals reset. - * @rmtoll APB2RSTR TIM1RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR TIM8RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR USART1RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR USART6RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR UART9RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR UART10RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR ADCRST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SDIORST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SPI1RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SPI4RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SYSCFGRST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR TIM9RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR TIM10RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR TIM11RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SPI5RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SPI6RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SAI1RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR SAI2RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR LTDCRST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR DSIRST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR DFSDM1RST LL_APB2_GRP1_ReleaseReset\n - * APB2RSTR DFSDM2RST LL_APB2_GRP1_ReleaseReset - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_ALL - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_ReleaseReset(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB2RSTR, Periphs); -} - -/** - * @brief Enable APB2 peripheral clocks in low-power mode - * @rmtoll APB2LPENR TIM1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR TIM8LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR USART1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR USART6LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR UART9LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR UART10LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR ADC1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR ADC2LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR ADC3LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SDIOLPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SPI1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SPI4LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SYSCFGLPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR EXTITLPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR TIM9LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR TIM10LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR TIM11LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SPI5LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SPI6LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SAI1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR SAI2LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR LTDCLPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR DSILPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR DFSDM1LPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR DSILPEN LL_APB2_GRP1_EnableClockLowPower\n - * APB2LPENR DFSDM2LPEN LL_APB2_GRP1_EnableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 - * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_EnableClockLowPower(uint32_t Periphs) -{ - __IO uint32_t tmpreg; - SET_BIT(RCC->APB2LPENR, Periphs); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->APB2LPENR, Periphs); - (void)tmpreg; -} - -/** - * @brief Disable APB2 peripheral clocks in low-power mode - * @rmtoll APB2LPENR TIM1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR TIM8LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR USART1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR USART6LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR UART9LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR UART10LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR ADC1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR ADC2LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR ADC3LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SDIOLPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SPI1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SPI4LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SYSCFGLPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR EXTITLPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR TIM9LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR TIM10LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR TIM11LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SPI5LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SPI6LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SAI1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR SAI2LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR LTDCLPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR DSILPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR DFSDM1LPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR DSILPEN LL_APB2_GRP1_DisableClockLowPower\n - * APB2LPENR DFSDM2LPEN LL_APB2_GRP1_DisableClockLowPower - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_USART1 - * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 - * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG - * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 - * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 - * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) - * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_APB2_GRP1_DisableClockLowPower(uint32_t Periphs) -{ - CLEAR_BIT(RCC->APB2LPENR, Periphs); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined(RCC) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_BUS_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h deleted file mode 100644 index 9a183ea..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h +++ /dev/null @@ -1,647 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_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 - (MPU services provided only on some devices) - (+) API to access to MCU info (CPUID register) - (+) API to enable fault handler (SHCSR accesses) - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_CORTEX_H -#define __STM32F4xx_LL_CORTEX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_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. */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_FAULT Handler Fault type - * @{ - */ -#define LL_HANDLER_FAULT_USG SCB_SHCSR_USGFAULTENA_Msk /*!< Usage fault */ -#define LL_HANDLER_FAULT_BUS SCB_SHCSR_BUSFAULTENA_Msk /*!< Bus fault */ -#define LL_HANDLER_FAULT_MEM SCB_SHCSR_MEMFAULTENA_Msk /*!< Memory management fault */ -/** - * @} - */ - -#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 (0x04U << MPU_RASR_SIZE_Pos) /*!< 32B Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_64B (0x05U << MPU_RASR_SIZE_Pos) /*!< 64B Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_128B (0x06U << MPU_RASR_SIZE_Pos) /*!< 128B Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_256B (0x07U << MPU_RASR_SIZE_Pos) /*!< 256B Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_512B (0x08U << MPU_RASR_SIZE_Pos) /*!< 512B Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_1KB (0x09U << MPU_RASR_SIZE_Pos) /*!< 1KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_2KB (0x0AU << MPU_RASR_SIZE_Pos) /*!< 2KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_4KB (0x0BU << MPU_RASR_SIZE_Pos) /*!< 4KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_8KB (0x0CU << MPU_RASR_SIZE_Pos) /*!< 8KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_16KB (0x0DU << MPU_RASR_SIZE_Pos) /*!< 16KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_32KB (0x0EU << MPU_RASR_SIZE_Pos) /*!< 32KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_64KB (0x0FU << MPU_RASR_SIZE_Pos) /*!< 64KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_128KB (0x10U << MPU_RASR_SIZE_Pos) /*!< 128KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_256KB (0x11U << MPU_RASR_SIZE_Pos) /*!< 256KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_512KB (0x12U << MPU_RASR_SIZE_Pos) /*!< 512KB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_1MB (0x13U << MPU_RASR_SIZE_Pos) /*!< 1MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_2MB (0x14U << MPU_RASR_SIZE_Pos) /*!< 2MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_4MB (0x15U << MPU_RASR_SIZE_Pos) /*!< 4MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_8MB (0x16U << MPU_RASR_SIZE_Pos) /*!< 8MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_16MB (0x17U << MPU_RASR_SIZE_Pos) /*!< 16MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_32MB (0x18U << MPU_RASR_SIZE_Pos) /*!< 32MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_64MB (0x19U << MPU_RASR_SIZE_Pos) /*!< 64MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_128MB (0x1AU << MPU_RASR_SIZE_Pos) /*!< 128MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_256MB (0x1BU << MPU_RASR_SIZE_Pos) /*!< 256MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_512MB (0x1CU << MPU_RASR_SIZE_Pos) /*!< 512MB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_1GB (0x1DU << MPU_RASR_SIZE_Pos) /*!< 1GB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_2GB (0x1EU << MPU_RASR_SIZE_Pos) /*!< 2GB Size of the MPU protection region */ -#define LL_MPU_REGION_SIZE_4GB (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 (0x00U << MPU_RASR_AP_Pos) /*!< No access*/ -#define LL_MPU_REGION_PRIV_RW (0x01U << MPU_RASR_AP_Pos) /*!< RW privileged (privileged access only)*/ -#define LL_MPU_REGION_PRIV_RW_URO (0x02U << MPU_RASR_AP_Pos) /*!< RW privileged - RO user (Write in a user program generates a fault) */ -#define LL_MPU_REGION_FULL_ACCESS (0x03U << MPU_RASR_AP_Pos) /*!< RW privileged & user (Full access) */ -#define LL_MPU_REGION_PRIV_RO (0x05U << MPU_RASR_AP_Pos) /*!< RO privileged (privileged read only)*/ -#define LL_MPU_REGION_PRIV_RO_URO (0x06U << MPU_RASR_AP_Pos) /*!< RO privileged & user (read only) */ -/** - * @} - */ - -/** @defgroup CORTEX_LL_EC_TEX MPU TEX Level - * @{ - */ -#define LL_MPU_TEX_LEVEL0 (0x00U << MPU_RASR_TEX_Pos) /*!< b000 for TEX bits */ -#define LL_MPU_TEX_LEVEL1 (0x01U << MPU_RASR_TEX_Pos) /*!< b001 for TEX bits */ -#define LL_MPU_TEX_LEVEL2 (0x02U << MPU_RASR_TEX_Pos) /*!< b010 for TEX bits */ -#define LL_MPU_TEX_LEVEL4 (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)); -} - -/** - * @brief Clear pending events. - * @retval None - */ -__STATIC_INLINE void LL_LPM_ClearEvent(void) -{ - __SEV(); - __WFE(); -} - -/** - * @} - */ - -/** @defgroup CORTEX_LL_EF_HANDLER HANDLER - * @{ - */ - -/** - * @brief Enable a fault in System handler control register (SHCSR) - * @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_EnableFault - * @param Fault This parameter can be a combination of the following values: - * @arg @ref LL_HANDLER_FAULT_USG - * @arg @ref LL_HANDLER_FAULT_BUS - * @arg @ref LL_HANDLER_FAULT_MEM - * @retval None - */ -__STATIC_INLINE void LL_HANDLER_EnableFault(uint32_t Fault) -{ - /* Enable the system handler fault */ - SET_BIT(SCB->SHCSR, Fault); -} - -/** - * @brief Disable a fault in System handler control register (SHCSR) - * @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_DisableFault - * @param Fault This parameter can be a combination of the following values: - * @arg @ref LL_HANDLER_FAULT_USG - * @arg @ref LL_HANDLER_FAULT_BUS - * @arg @ref LL_HANDLER_FAULT_MEM - * @retval None - */ -__STATIC_INLINE void LL_HANDLER_DisableFault(uint32_t Fault) -{ - /* Disable the system handler fault */ - CLEAR_BIT(SCB->SHCSR, Fault); -} - -/** - * @} - */ - -/** @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 Constant number - * @rmtoll SCB_CPUID ARCHITECTURE LL_CPUID_GetConstant - * @retval Value should be equal to 0xF for Cortex-M4 devices - */ -__STATIC_INLINE uint32_t LL_CPUID_GetConstant(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 0xC24 for Cortex-M4 - */ -__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 /* __STM32F4xx_LL_CORTEX_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h deleted file mode 100644 index 055ba5f..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h +++ /dev/null @@ -1,2868 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_dma.h - * @author MCD Application Team - * @brief Header file of DMA LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_DMA_H -#define __STM32F4xx_LL_DMA_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (DMA1) || defined (DMA2) - -/** @defgroup DMA_LL DMA - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup DMA_LL_Private_Variables DMA Private Variables - * @{ - */ -/* Array used to get the DMA stream register offset versus stream index LL_DMA_STREAM_x */ -static const uint8_t STREAM_OFFSET_TAB[] = -{ - (uint8_t)(DMA1_Stream0_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream1_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream2_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream3_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream4_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream5_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream6_BASE - DMA1_BASE), - (uint8_t)(DMA1_Stream7_BASE - DMA1_BASE) -}; - -/** - * @} - */ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup DMA_LL_Private_Constants DMA Private Constants - * @{ - */ -/** - * @} - */ - - -/* Private macros ------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup DMA_LL_ES_INIT DMA Exported Init structure - * @{ - */ -typedef struct -{ - uint32_t PeriphOrM2MSrcAddress; /*!< Specifies the peripheral base address for DMA transfer - or as Source base address in case of memory to memory transfer direction. - - This parameter must be a value between Min_Data = 0 and Max_Data = 0xFFFFFFFF. */ - - uint32_t MemoryOrM2MDstAddress; /*!< Specifies the memory base address for DMA transfer - or as Destination base address in case of memory to memory transfer direction. - - This parameter must be a value between Min_Data = 0 and Max_Data = 0xFFFFFFFF. */ - - uint32_t Direction; /*!< Specifies if the data will be transferred from memory to peripheral, - from memory to memory or from peripheral to memory. - This parameter can be a value of @ref DMA_LL_EC_DIRECTION - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetDataTransferDirection(). */ - - uint32_t Mode; /*!< Specifies the normal or circular operation mode. - This parameter can be a value of @ref DMA_LL_EC_MODE - @note The circular buffer mode cannot be used if the memory to memory - data transfer direction is configured on the selected Stream - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetMode(). */ - - uint32_t PeriphOrM2MSrcIncMode; /*!< Specifies whether the Peripheral address or Source address in case of memory to memory transfer direction - is incremented or not. - This parameter can be a value of @ref DMA_LL_EC_PERIPH - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphIncMode(). */ - - uint32_t MemoryOrM2MDstIncMode; /*!< Specifies whether the Memory address or Destination address in case of memory to memory transfer direction - is incremented or not. - This parameter can be a value of @ref DMA_LL_EC_MEMORY - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemoryIncMode(). */ - - uint32_t PeriphOrM2MSrcDataSize; /*!< Specifies the Peripheral data size alignment or Source data size alignment (byte, half word, word) - in case of memory to memory transfer direction. - This parameter can be a value of @ref DMA_LL_EC_PDATAALIGN - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphSize(). */ - - uint32_t MemoryOrM2MDstDataSize; /*!< Specifies the Memory data size alignment or Destination data size alignment (byte, half word, word) - in case of memory to memory transfer direction. - This parameter can be a value of @ref DMA_LL_EC_MDATAALIGN - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemorySize(). */ - - uint32_t NbData; /*!< Specifies the number of data to transfer, in data unit. - The data unit is equal to the source buffer configuration set in PeripheralSize - or MemorySize parameters depending in the transfer direction. - This parameter must be a value between Min_Data = 0 and Max_Data = 0x0000FFFF - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetDataLength(). */ - - uint32_t Channel; /*!< Specifies the peripheral channel. - This parameter can be a value of @ref DMA_LL_EC_CHANNEL - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetChannelSelection(). */ - - uint32_t Priority; /*!< Specifies the channel priority level. - This parameter can be a value of @ref DMA_LL_EC_PRIORITY - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetStreamPriorityLevel(). */ - - uint32_t FIFOMode; /*!< Specifies if the FIFO mode or Direct mode will be used for the specified stream. - This parameter can be a value of @ref DMA_LL_FIFOMODE - @note The Direct mode (FIFO mode disabled) cannot be used if the - memory-to-memory data transfer is configured on the selected stream - - This feature can be modified afterwards using unitary functions @ref LL_DMA_EnableFifoMode() or @ref LL_DMA_EnableFifoMode() . */ - - uint32_t FIFOThreshold; /*!< Specifies the FIFO threshold level. - This parameter can be a value of @ref DMA_LL_EC_FIFOTHRESHOLD - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetFIFOThreshold(). */ - - uint32_t MemBurst; /*!< Specifies the Burst transfer configuration for the memory transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_LL_EC_MBURST - @note The burst mode is possible only if the address Increment mode is enabled. - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemoryBurstxfer(). */ - - uint32_t PeriphBurst; /*!< Specifies the Burst transfer configuration for the peripheral transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_LL_EC_PBURST - @note The burst mode is possible only if the address Increment mode is enabled. - - This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphBurstxfer(). */ - -} LL_DMA_InitTypeDef; -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup DMA_LL_Exported_Constants DMA Exported Constants - * @{ - */ - -/** @defgroup DMA_LL_EC_STREAM STREAM - * @{ - */ -#define LL_DMA_STREAM_0 0x00000000U -#define LL_DMA_STREAM_1 0x00000001U -#define LL_DMA_STREAM_2 0x00000002U -#define LL_DMA_STREAM_3 0x00000003U -#define LL_DMA_STREAM_4 0x00000004U -#define LL_DMA_STREAM_5 0x00000005U -#define LL_DMA_STREAM_6 0x00000006U -#define LL_DMA_STREAM_7 0x00000007U -#define LL_DMA_STREAM_ALL 0xFFFF0000U -/** - * @} - */ - -/** @defgroup DMA_LL_EC_DIRECTION DIRECTION - * @{ - */ -#define LL_DMA_DIRECTION_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ -#define LL_DMA_DIRECTION_MEMORY_TO_PERIPH DMA_SxCR_DIR_0 /*!< Memory to peripheral direction */ -#define LL_DMA_DIRECTION_MEMORY_TO_MEMORY DMA_SxCR_DIR_1 /*!< Memory to memory direction */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_MODE MODE - * @{ - */ -#define LL_DMA_MODE_NORMAL 0x00000000U /*!< Normal Mode */ -#define LL_DMA_MODE_CIRCULAR DMA_SxCR_CIRC /*!< Circular Mode */ -#define LL_DMA_MODE_PFCTRL DMA_SxCR_PFCTRL /*!< Peripheral flow control mode */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_DOUBLEBUFFER_MODE DOUBLEBUFFER MODE - * @{ - */ -#define LL_DMA_DOUBLEBUFFER_MODE_DISABLE 0x00000000U /*!< Disable double buffering mode */ -#define LL_DMA_DOUBLEBUFFER_MODE_ENABLE DMA_SxCR_DBM /*!< Enable double buffering mode */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_PERIPH PERIPH - * @{ - */ -#define LL_DMA_PERIPH_NOINCREMENT 0x00000000U /*!< Peripheral increment mode Disable */ -#define LL_DMA_PERIPH_INCREMENT DMA_SxCR_PINC /*!< Peripheral increment mode Enable */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_MEMORY MEMORY - * @{ - */ -#define LL_DMA_MEMORY_NOINCREMENT 0x00000000U /*!< Memory increment mode Disable */ -#define LL_DMA_MEMORY_INCREMENT DMA_SxCR_MINC /*!< Memory increment mode Enable */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_PDATAALIGN PDATAALIGN - * @{ - */ -#define LL_DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment : Byte */ -#define LL_DMA_PDATAALIGN_HALFWORD DMA_SxCR_PSIZE_0 /*!< Peripheral data alignment : HalfWord */ -#define LL_DMA_PDATAALIGN_WORD DMA_SxCR_PSIZE_1 /*!< Peripheral data alignment : Word */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_MDATAALIGN MDATAALIGN - * @{ - */ -#define LL_DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment : Byte */ -#define LL_DMA_MDATAALIGN_HALFWORD DMA_SxCR_MSIZE_0 /*!< Memory data alignment : HalfWord */ -#define LL_DMA_MDATAALIGN_WORD DMA_SxCR_MSIZE_1 /*!< Memory data alignment : Word */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_OFFSETSIZE OFFSETSIZE - * @{ - */ -#define LL_DMA_OFFSETSIZE_PSIZE 0x00000000U /*!< Peripheral increment offset size is linked to the PSIZE */ -#define LL_DMA_OFFSETSIZE_FIXEDTO4 DMA_SxCR_PINCOS /*!< Peripheral increment offset size is fixed to 4 (32-bit alignment) */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_PRIORITY PRIORITY - * @{ - */ -#define LL_DMA_PRIORITY_LOW 0x00000000U /*!< Priority level : Low */ -#define LL_DMA_PRIORITY_MEDIUM DMA_SxCR_PL_0 /*!< Priority level : Medium */ -#define LL_DMA_PRIORITY_HIGH DMA_SxCR_PL_1 /*!< Priority level : High */ -#define LL_DMA_PRIORITY_VERYHIGH DMA_SxCR_PL /*!< Priority level : Very_High */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_CHANNEL CHANNEL - * @{ - */ -#define LL_DMA_CHANNEL_0 0x00000000U /* Select Channel0 of DMA Instance */ -#define LL_DMA_CHANNEL_1 DMA_SxCR_CHSEL_0 /* Select Channel1 of DMA Instance */ -#define LL_DMA_CHANNEL_2 DMA_SxCR_CHSEL_1 /* Select Channel2 of DMA Instance */ -#define LL_DMA_CHANNEL_3 (DMA_SxCR_CHSEL_0 | DMA_SxCR_CHSEL_1) /* Select Channel3 of DMA Instance */ -#define LL_DMA_CHANNEL_4 DMA_SxCR_CHSEL_2 /* Select Channel4 of DMA Instance */ -#define LL_DMA_CHANNEL_5 (DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_0) /* Select Channel5 of DMA Instance */ -#define LL_DMA_CHANNEL_6 (DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1) /* Select Channel6 of DMA Instance */ -#define LL_DMA_CHANNEL_7 (DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0) /* Select Channel7 of DMA Instance */ -#if defined (DMA_SxCR_CHSEL_3) -#define LL_DMA_CHANNEL_8 DMA_SxCR_CHSEL_3 /* Select Channel8 of DMA Instance */ -#define LL_DMA_CHANNEL_9 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_0) /* Select Channel9 of DMA Instance */ -#define LL_DMA_CHANNEL_10 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_1) /* Select Channel10 of DMA Instance */ -#define LL_DMA_CHANNEL_11 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0) /* Select Channel11 of DMA Instance */ -#define LL_DMA_CHANNEL_12 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2) /* Select Channel12 of DMA Instance */ -#define LL_DMA_CHANNEL_13 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_0) /* Select Channel13 of DMA Instance */ -#define LL_DMA_CHANNEL_14 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1) /* Select Channel14 of DMA Instance */ -#define LL_DMA_CHANNEL_15 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0) /* Select Channel15 of DMA Instance */ -#endif /* DMA_SxCR_CHSEL_3 */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_MBURST MBURST - * @{ - */ -#define LL_DMA_MBURST_SINGLE 0x00000000U /*!< Memory burst single transfer configuration */ -#define LL_DMA_MBURST_INC4 DMA_SxCR_MBURST_0 /*!< Memory burst of 4 beats transfer configuration */ -#define LL_DMA_MBURST_INC8 DMA_SxCR_MBURST_1 /*!< Memory burst of 8 beats transfer configuration */ -#define LL_DMA_MBURST_INC16 (DMA_SxCR_MBURST_0 | DMA_SxCR_MBURST_1) /*!< Memory burst of 16 beats transfer configuration */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_PBURST PBURST - * @{ - */ -#define LL_DMA_PBURST_SINGLE 0x00000000U /*!< Peripheral burst single transfer configuration */ -#define LL_DMA_PBURST_INC4 DMA_SxCR_PBURST_0 /*!< Peripheral burst of 4 beats transfer configuration */ -#define LL_DMA_PBURST_INC8 DMA_SxCR_PBURST_1 /*!< Peripheral burst of 8 beats transfer configuration */ -#define LL_DMA_PBURST_INC16 (DMA_SxCR_PBURST_0 | DMA_SxCR_PBURST_1) /*!< Peripheral burst of 16 beats transfer configuration */ -/** - * @} - */ - -/** @defgroup DMA_LL_FIFOMODE DMA_LL_FIFOMODE - * @{ - */ -#define LL_DMA_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable (direct mode is enabled) */ -#define LL_DMA_FIFOMODE_ENABLE DMA_SxFCR_DMDIS /*!< FIFO mode enable */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_FIFOSTATUS_0 FIFOSTATUS 0 - * @{ - */ -#define LL_DMA_FIFOSTATUS_0_25 0x00000000U /*!< 0 < fifo_level < 1/4 */ -#define LL_DMA_FIFOSTATUS_25_50 DMA_SxFCR_FS_0 /*!< 1/4 < fifo_level < 1/2 */ -#define LL_DMA_FIFOSTATUS_50_75 DMA_SxFCR_FS_1 /*!< 1/2 < fifo_level < 3/4 */ -#define LL_DMA_FIFOSTATUS_75_100 (DMA_SxFCR_FS_1 | DMA_SxFCR_FS_0) /*!< 3/4 < fifo_level < full */ -#define LL_DMA_FIFOSTATUS_EMPTY DMA_SxFCR_FS_2 /*!< FIFO is empty */ -#define LL_DMA_FIFOSTATUS_FULL (DMA_SxFCR_FS_2 | DMA_SxFCR_FS_0) /*!< FIFO is full */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_FIFOTHRESHOLD FIFOTHRESHOLD - * @{ - */ -#define LL_DMA_FIFOTHRESHOLD_1_4 0x00000000U /*!< FIFO threshold 1 quart full configuration */ -#define LL_DMA_FIFOTHRESHOLD_1_2 DMA_SxFCR_FTH_0 /*!< FIFO threshold half full configuration */ -#define LL_DMA_FIFOTHRESHOLD_3_4 DMA_SxFCR_FTH_1 /*!< FIFO threshold 3 quarts full configuration */ -#define LL_DMA_FIFOTHRESHOLD_FULL DMA_SxFCR_FTH /*!< FIFO threshold full configuration */ -/** - * @} - */ - -/** @defgroup DMA_LL_EC_CURRENTTARGETMEM CURRENTTARGETMEM - * @{ - */ -#define LL_DMA_CURRENTTARGETMEM0 0x00000000U /*!< Set CurrentTarget Memory to Memory 0 */ -#define LL_DMA_CURRENTTARGETMEM1 DMA_SxCR_CT /*!< Set CurrentTarget Memory to Memory 1 */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup DMA_LL_Exported_Macros DMA Exported Macros - * @{ - */ - -/** @defgroup DMA_LL_EM_WRITE_READ Common Write and read registers macros - * @{ - */ -/** - * @brief Write a value in DMA register - * @param __INSTANCE__ DMA Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_DMA_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in DMA register - * @param __INSTANCE__ DMA Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_DMA_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** @defgroup DMA_LL_EM_CONVERT_DMAxCHANNELy Convert DMAxStreamy - * @{ - */ -/** - * @brief Convert DMAx_Streamy into DMAx - * @param __STREAM_INSTANCE__ DMAx_Streamy - * @retval DMAx - */ -#define __LL_DMA_GET_INSTANCE(__STREAM_INSTANCE__) \ -(((uint32_t)(__STREAM_INSTANCE__) > ((uint32_t)DMA1_Stream7)) ? DMA2 : DMA1) - -/** - * @brief Convert DMAx_Streamy into LL_DMA_STREAM_y - * @param __STREAM_INSTANCE__ DMAx_Streamy - * @retval LL_DMA_CHANNEL_y - */ -#define __LL_DMA_GET_STREAM(__STREAM_INSTANCE__) \ -(((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream0)) ? LL_DMA_STREAM_0 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream0)) ? LL_DMA_STREAM_0 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream1)) ? LL_DMA_STREAM_1 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream1)) ? LL_DMA_STREAM_1 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream2)) ? LL_DMA_STREAM_2 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream2)) ? LL_DMA_STREAM_2 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream3)) ? LL_DMA_STREAM_3 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream3)) ? LL_DMA_STREAM_3 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream4)) ? LL_DMA_STREAM_4 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream4)) ? LL_DMA_STREAM_4 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream5)) ? LL_DMA_STREAM_5 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream5)) ? LL_DMA_STREAM_5 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream6)) ? LL_DMA_STREAM_6 : \ - ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream6)) ? LL_DMA_STREAM_6 : \ - LL_DMA_STREAM_7) - -/** - * @brief Convert DMA Instance DMAx and LL_DMA_STREAM_y into DMAx_Streamy - * @param __DMA_INSTANCE__ DMAx - * @param __STREAM__ LL_DMA_STREAM_y - * @retval DMAx_Streamy - */ -#define __LL_DMA_GET_STREAM_INSTANCE(__DMA_INSTANCE__, __STREAM__) \ -((((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_0))) ? DMA1_Stream0 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_0))) ? DMA2_Stream0 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_1))) ? DMA1_Stream1 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_1))) ? DMA2_Stream1 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_2))) ? DMA1_Stream2 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_2))) ? DMA2_Stream2 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_3))) ? DMA1_Stream3 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_3))) ? DMA2_Stream3 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_4))) ? DMA1_Stream4 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_4))) ? DMA2_Stream4 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_5))) ? DMA1_Stream5 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_5))) ? DMA2_Stream5 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_6))) ? DMA1_Stream6 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_6))) ? DMA2_Stream6 : \ - (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_7))) ? DMA1_Stream7 : \ - DMA2_Stream7) - -/** - * @} - */ - -/** - * @} - */ - - -/* Exported functions --------------------------------------------------------*/ - /** @defgroup DMA_LL_Exported_Functions DMA Exported Functions - * @{ - */ - -/** @defgroup DMA_LL_EF_Configuration Configuration - * @{ - */ -/** - * @brief Enable DMA stream. - * @rmtoll CR EN LL_DMA_EnableStream - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableStream(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_EN); -} - -/** - * @brief Disable DMA stream. - * @rmtoll CR EN LL_DMA_DisableStream - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableStream(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_EN); -} - -/** - * @brief Check if DMA stream is enabled or disabled. - * @rmtoll CR EN LL_DMA_IsEnabledStream - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledStream(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_EN) == (DMA_SxCR_EN)); -} - -/** - * @brief Configure all parameters linked to DMA transfer. - * @rmtoll CR DIR LL_DMA_ConfigTransfer\n - * CR CIRC LL_DMA_ConfigTransfer\n - * CR PINC LL_DMA_ConfigTransfer\n - * CR MINC LL_DMA_ConfigTransfer\n - * CR PSIZE LL_DMA_ConfigTransfer\n - * CR MSIZE LL_DMA_ConfigTransfer\n - * CR PL LL_DMA_ConfigTransfer\n - * CR PFCTRL LL_DMA_ConfigTransfer - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Configuration This parameter must be a combination of all the following values: - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY or @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH or @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY - * @arg @ref LL_DMA_MODE_NORMAL or @ref LL_DMA_MODE_CIRCULAR or @ref LL_DMA_MODE_PFCTRL - * @arg @ref LL_DMA_PERIPH_INCREMENT or @ref LL_DMA_PERIPH_NOINCREMENT - * @arg @ref LL_DMA_MEMORY_INCREMENT or @ref LL_DMA_MEMORY_NOINCREMENT - * @arg @ref LL_DMA_PDATAALIGN_BYTE or @ref LL_DMA_PDATAALIGN_HALFWORD or @ref LL_DMA_PDATAALIGN_WORD - * @arg @ref LL_DMA_MDATAALIGN_BYTE or @ref LL_DMA_MDATAALIGN_HALFWORD or @ref LL_DMA_MDATAALIGN_WORD - * @arg @ref LL_DMA_PRIORITY_LOW or @ref LL_DMA_PRIORITY_MEDIUM or @ref LL_DMA_PRIORITY_HIGH or @ref LL_DMA_PRIORITY_VERYHIGH - *@retval None - */ -__STATIC_INLINE void LL_DMA_ConfigTransfer(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Configuration) -{ - MODIFY_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, - DMA_SxCR_DIR | DMA_SxCR_CIRC | DMA_SxCR_PINC | DMA_SxCR_MINC | DMA_SxCR_PSIZE | DMA_SxCR_MSIZE | DMA_SxCR_PL | DMA_SxCR_PFCTRL, - Configuration); -} - -/** - * @brief Set Data transfer direction (read from peripheral or from memory). - * @rmtoll CR DIR LL_DMA_SetDataTransferDirection - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Direction This parameter can be one of the following values: - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetDataTransferDirection(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Direction) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DIR, Direction); -} - -/** - * @brief Get Data transfer direction (read from peripheral or from memory). - * @rmtoll CR DIR LL_DMA_GetDataTransferDirection - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY - */ -__STATIC_INLINE uint32_t LL_DMA_GetDataTransferDirection(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DIR)); -} - -/** - * @brief Set DMA mode normal, circular or peripheral flow control. - * @rmtoll CR CIRC LL_DMA_SetMode\n - * CR PFCTRL LL_DMA_SetMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Mode This parameter can be one of the following values: - * @arg @ref LL_DMA_MODE_NORMAL - * @arg @ref LL_DMA_MODE_CIRCULAR - * @arg @ref LL_DMA_MODE_PFCTRL - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMode(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Mode) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CIRC | DMA_SxCR_PFCTRL, Mode); -} - -/** - * @brief Get DMA mode normal, circular or peripheral flow control. - * @rmtoll CR CIRC LL_DMA_GetMode\n - * CR PFCTRL LL_DMA_GetMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_MODE_NORMAL - * @arg @ref LL_DMA_MODE_CIRCULAR - * @arg @ref LL_DMA_MODE_PFCTRL - */ -__STATIC_INLINE uint32_t LL_DMA_GetMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CIRC | DMA_SxCR_PFCTRL)); -} - -/** - * @brief Set Peripheral increment mode. - * @rmtoll CR PINC LL_DMA_SetPeriphIncMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param IncrementMode This parameter can be one of the following values: - * @arg @ref LL_DMA_PERIPH_NOINCREMENT - * @arg @ref LL_DMA_PERIPH_INCREMENT - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetPeriphIncMode(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t IncrementMode) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINC, IncrementMode); -} - -/** - * @brief Get Peripheral increment mode. - * @rmtoll CR PINC LL_DMA_GetPeriphIncMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_PERIPH_NOINCREMENT - * @arg @ref LL_DMA_PERIPH_INCREMENT - */ -__STATIC_INLINE uint32_t LL_DMA_GetPeriphIncMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINC)); -} - -/** - * @brief Set Memory increment mode. - * @rmtoll CR MINC LL_DMA_SetMemoryIncMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param IncrementMode This parameter can be one of the following values: - * @arg @ref LL_DMA_MEMORY_NOINCREMENT - * @arg @ref LL_DMA_MEMORY_INCREMENT - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMemoryIncMode(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t IncrementMode) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MINC, IncrementMode); -} - -/** - * @brief Get Memory increment mode. - * @rmtoll CR MINC LL_DMA_GetMemoryIncMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_MEMORY_NOINCREMENT - * @arg @ref LL_DMA_MEMORY_INCREMENT - */ -__STATIC_INLINE uint32_t LL_DMA_GetMemoryIncMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MINC)); -} - -/** - * @brief Set Peripheral size. - * @rmtoll CR PSIZE LL_DMA_SetPeriphSize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Size This parameter can be one of the following values: - * @arg @ref LL_DMA_PDATAALIGN_BYTE - * @arg @ref LL_DMA_PDATAALIGN_HALFWORD - * @arg @ref LL_DMA_PDATAALIGN_WORD - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetPeriphSize(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Size) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PSIZE, Size); -} - -/** - * @brief Get Peripheral size. - * @rmtoll CR PSIZE LL_DMA_GetPeriphSize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_PDATAALIGN_BYTE - * @arg @ref LL_DMA_PDATAALIGN_HALFWORD - * @arg @ref LL_DMA_PDATAALIGN_WORD - */ -__STATIC_INLINE uint32_t LL_DMA_GetPeriphSize(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PSIZE)); -} - -/** - * @brief Set Memory size. - * @rmtoll CR MSIZE LL_DMA_SetMemorySize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Size This parameter can be one of the following values: - * @arg @ref LL_DMA_MDATAALIGN_BYTE - * @arg @ref LL_DMA_MDATAALIGN_HALFWORD - * @arg @ref LL_DMA_MDATAALIGN_WORD - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMemorySize(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Size) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MSIZE, Size); -} - -/** - * @brief Get Memory size. - * @rmtoll CR MSIZE LL_DMA_GetMemorySize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_MDATAALIGN_BYTE - * @arg @ref LL_DMA_MDATAALIGN_HALFWORD - * @arg @ref LL_DMA_MDATAALIGN_WORD - */ -__STATIC_INLINE uint32_t LL_DMA_GetMemorySize(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MSIZE)); -} - -/** - * @brief Set Peripheral increment offset size. - * @rmtoll CR PINCOS LL_DMA_SetIncOffsetSize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param OffsetSize This parameter can be one of the following values: - * @arg @ref LL_DMA_OFFSETSIZE_PSIZE - * @arg @ref LL_DMA_OFFSETSIZE_FIXEDTO4 - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetIncOffsetSize(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t OffsetSize) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINCOS, OffsetSize); -} - -/** - * @brief Get Peripheral increment offset size. - * @rmtoll CR PINCOS LL_DMA_GetIncOffsetSize - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_OFFSETSIZE_PSIZE - * @arg @ref LL_DMA_OFFSETSIZE_FIXEDTO4 - */ -__STATIC_INLINE uint32_t LL_DMA_GetIncOffsetSize(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINCOS)); -} - -/** - * @brief Set Stream priority level. - * @rmtoll CR PL LL_DMA_SetStreamPriorityLevel - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Priority This parameter can be one of the following values: - * @arg @ref LL_DMA_PRIORITY_LOW - * @arg @ref LL_DMA_PRIORITY_MEDIUM - * @arg @ref LL_DMA_PRIORITY_HIGH - * @arg @ref LL_DMA_PRIORITY_VERYHIGH - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetStreamPriorityLevel(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Priority) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PL, Priority); -} - -/** - * @brief Get Stream priority level. - * @rmtoll CR PL LL_DMA_GetStreamPriorityLevel - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_PRIORITY_LOW - * @arg @ref LL_DMA_PRIORITY_MEDIUM - * @arg @ref LL_DMA_PRIORITY_HIGH - * @arg @ref LL_DMA_PRIORITY_VERYHIGH - */ -__STATIC_INLINE uint32_t LL_DMA_GetStreamPriorityLevel(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PL)); -} - -/** - * @brief Set Number of data to transfer. - * @rmtoll NDTR NDT LL_DMA_SetDataLength - * @note This action has no effect if - * stream is enabled. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param NbData Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetDataLength(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t NbData) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->NDTR, DMA_SxNDT, NbData); -} - -/** - * @brief Get Number of data to transfer. - * @rmtoll NDTR NDT LL_DMA_GetDataLength - * @note Once the stream is enabled, the return value indicate the - * remaining bytes to be transmitted. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetDataLength(DMA_TypeDef* DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->NDTR, DMA_SxNDT)); -} - -/** - * @brief Select Channel number associated to the Stream. - * @rmtoll CR CHSEL LL_DMA_SetChannelSelection - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Channel This parameter can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @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 - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetChannelSelection(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Channel) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CHSEL, Channel); -} - -/** - * @brief Get the Channel number associated to the Stream. - * @rmtoll CR CHSEL LL_DMA_GetChannelSelection - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_CHANNEL_0 - * @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 - */ -__STATIC_INLINE uint32_t LL_DMA_GetChannelSelection(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CHSEL)); -} - -/** - * @brief Set Memory burst transfer configuration. - * @rmtoll CR MBURST LL_DMA_SetMemoryBurstxfer - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Mburst This parameter can be one of the following values: - * @arg @ref LL_DMA_MBURST_SINGLE - * @arg @ref LL_DMA_MBURST_INC4 - * @arg @ref LL_DMA_MBURST_INC8 - * @arg @ref LL_DMA_MBURST_INC16 - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMemoryBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Mburst) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MBURST, Mburst); -} - -/** - * @brief Get Memory burst transfer configuration. - * @rmtoll CR MBURST LL_DMA_GetMemoryBurstxfer - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_MBURST_SINGLE - * @arg @ref LL_DMA_MBURST_INC4 - * @arg @ref LL_DMA_MBURST_INC8 - * @arg @ref LL_DMA_MBURST_INC16 - */ -__STATIC_INLINE uint32_t LL_DMA_GetMemoryBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MBURST)); -} - -/** - * @brief Set Peripheral burst transfer configuration. - * @rmtoll CR PBURST LL_DMA_SetPeriphBurstxfer - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Pburst This parameter can be one of the following values: - * @arg @ref LL_DMA_PBURST_SINGLE - * @arg @ref LL_DMA_PBURST_INC4 - * @arg @ref LL_DMA_PBURST_INC8 - * @arg @ref LL_DMA_PBURST_INC16 - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetPeriphBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Pburst) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PBURST, Pburst); -} - -/** - * @brief Get Peripheral burst transfer configuration. - * @rmtoll CR PBURST LL_DMA_GetPeriphBurstxfer - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_PBURST_SINGLE - * @arg @ref LL_DMA_PBURST_INC4 - * @arg @ref LL_DMA_PBURST_INC8 - * @arg @ref LL_DMA_PBURST_INC16 - */ -__STATIC_INLINE uint32_t LL_DMA_GetPeriphBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PBURST)); -} - -/** - * @brief Set Current target (only in double buffer mode) to Memory 1 or Memory 0. - * @rmtoll CR CT LL_DMA_SetCurrentTargetMem - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param CurrentMemory This parameter can be one of the following values: - * @arg @ref LL_DMA_CURRENTTARGETMEM0 - * @arg @ref LL_DMA_CURRENTTARGETMEM1 - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetCurrentTargetMem(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t CurrentMemory) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CT, CurrentMemory); -} - -/** - * @brief Get Current target (only in double buffer mode). - * @rmtoll CR CT LL_DMA_GetCurrentTargetMem - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_CURRENTTARGETMEM0 - * @arg @ref LL_DMA_CURRENTTARGETMEM1 - */ -__STATIC_INLINE uint32_t LL_DMA_GetCurrentTargetMem(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CT)); -} - -/** - * @brief Enable the double buffer mode. - * @rmtoll CR DBM LL_DMA_EnableDoubleBufferMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableDoubleBufferMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DBM); -} - -/** - * @brief Disable the double buffer mode. - * @rmtoll CR DBM LL_DMA_DisableDoubleBufferMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableDoubleBufferMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DBM); -} - -/** - * @brief Get FIFO status. - * @rmtoll FCR FS LL_DMA_GetFIFOStatus - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_FIFOSTATUS_0_25 - * @arg @ref LL_DMA_FIFOSTATUS_25_50 - * @arg @ref LL_DMA_FIFOSTATUS_50_75 - * @arg @ref LL_DMA_FIFOSTATUS_75_100 - * @arg @ref LL_DMA_FIFOSTATUS_EMPTY - * @arg @ref LL_DMA_FIFOSTATUS_FULL - */ -__STATIC_INLINE uint32_t LL_DMA_GetFIFOStatus(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FS)); -} - -/** - * @brief Disable Fifo mode. - * @rmtoll FCR DMDIS LL_DMA_DisableFifoMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableFifoMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_DMDIS); -} - -/** - * @brief Enable Fifo mode. - * @rmtoll FCR DMDIS LL_DMA_EnableFifoMode - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableFifoMode(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_DMDIS); -} - -/** - * @brief Select FIFO threshold. - * @rmtoll FCR FTH LL_DMA_SetFIFOThreshold - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Threshold This parameter can be one of the following values: - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 - * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetFIFOThreshold(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Threshold) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH, Threshold); -} - -/** - * @brief Get FIFO threshold. - * @rmtoll FCR FTH LL_DMA_GetFIFOThreshold - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 - * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL - */ -__STATIC_INLINE uint32_t LL_DMA_GetFIFOThreshold(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH)); -} - -/** - * @brief Configure the FIFO . - * @rmtoll FCR FTH LL_DMA_ConfigFifo\n - * FCR DMDIS LL_DMA_ConfigFifo - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param FifoMode This parameter can be one of the following values: - * @arg @ref LL_DMA_FIFOMODE_ENABLE - * @arg @ref LL_DMA_FIFOMODE_DISABLE - * @param FifoThreshold This parameter can be one of the following values: - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 - * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 - * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL - * @retval None - */ -__STATIC_INLINE void LL_DMA_ConfigFifo(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t FifoMode, uint32_t FifoThreshold) -{ - MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH|DMA_SxFCR_DMDIS, FifoMode|FifoThreshold); -} - -/** - * @brief Configure the Source and Destination addresses. - * @note This API must not be called when the DMA stream is enabled. - * @rmtoll M0AR M0A LL_DMA_ConfigAddresses\n - * PAR PA LL_DMA_ConfigAddresses - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param SrcAddress Between 0 to 0xFFFFFFFF - * @param DstAddress Between 0 to 0xFFFFFFFF - * @param Direction This parameter can be one of the following values: - * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH - * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY - * @retval None - */ -__STATIC_INLINE void LL_DMA_ConfigAddresses(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t SrcAddress, uint32_t DstAddress, uint32_t Direction) -{ - /* Direction Memory to Periph */ - if (Direction == LL_DMA_DIRECTION_MEMORY_TO_PERIPH) - { - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, SrcAddress); - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, DstAddress); - } - /* Direction Periph to Memory and Memory to Memory */ - else - { - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, SrcAddress); - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, DstAddress); - } -} - -/** - * @brief Set the Memory address. - * @rmtoll M0AR M0A LL_DMA_SetMemoryAddress - * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. - * @note This API must not be called when the DMA channel is enabled. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param MemoryAddress Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMemoryAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) -{ - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, MemoryAddress); -} - -/** - * @brief Set the Peripheral address. - * @rmtoll PAR PA LL_DMA_SetPeriphAddress - * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. - * @note This API must not be called when the DMA channel is enabled. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param PeriphAddress Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetPeriphAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t PeriphAddress) -{ - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, PeriphAddress); -} - -/** - * @brief Get the Memory address. - * @rmtoll M0AR M0A LL_DMA_GetMemoryAddress - * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetMemoryAddress(DMA_TypeDef* DMAx, uint32_t Stream) -{ - return (READ_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR)); -} - -/** - * @brief Get the Peripheral address. - * @rmtoll PAR PA LL_DMA_GetPeriphAddress - * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetPeriphAddress(DMA_TypeDef* DMAx, uint32_t Stream) -{ - return (READ_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR)); -} - -/** - * @brief Set the Memory to Memory Source address. - * @rmtoll PAR PA LL_DMA_SetM2MSrcAddress - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * @note This API must not be called when the DMA channel is enabled. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param MemoryAddress Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetM2MSrcAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) -{ - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, MemoryAddress); -} - -/** - * @brief Set the Memory to Memory Destination address. - * @rmtoll M0AR M0A LL_DMA_SetM2MDstAddress - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * @note This API must not be called when the DMA channel is enabled. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param MemoryAddress Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetM2MDstAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) - { - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, MemoryAddress); - } - -/** - * @brief Get the Memory to Memory Source address. - * @rmtoll PAR PA LL_DMA_GetM2MSrcAddress - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetM2MSrcAddress(DMA_TypeDef* DMAx, uint32_t Stream) - { - return (READ_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR)); - } - -/** - * @brief Get the Memory to Memory Destination address. - * @rmtoll M0AR M0A LL_DMA_GetM2MDstAddress - * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetM2MDstAddress(DMA_TypeDef* DMAx, uint32_t Stream) -{ - return (READ_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR)); -} - -/** - * @brief Set Memory 1 address (used in case of Double buffer mode). - * @rmtoll M1AR M1A LL_DMA_SetMemory1Address - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @param Address Between 0 to 0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA_SetMemory1Address(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Address) -{ - WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M1AR, Address); -} - -/** - * @brief Get Memory 1 address (used in case of Double buffer mode). - * @rmtoll M1AR M1A LL_DMA_GetMemory1Address - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval Between 0 to 0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA_GetMemory1Address(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M1AR); -} - -/** - * @} - */ - -/** @defgroup DMA_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Get Stream 0 half transfer flag. - * @rmtoll LISR HTIF0 LL_DMA_IsActiveFlag_HT0 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT0(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF0)==(DMA_LISR_HTIF0)); -} - -/** - * @brief Get Stream 1 half transfer flag. - * @rmtoll LISR HTIF1 LL_DMA_IsActiveFlag_HT1 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT1(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF1)==(DMA_LISR_HTIF1)); -} - -/** - * @brief Get Stream 2 half transfer flag. - * @rmtoll LISR HTIF2 LL_DMA_IsActiveFlag_HT2 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT2(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF2)==(DMA_LISR_HTIF2)); -} - -/** - * @brief Get Stream 3 half transfer flag. - * @rmtoll LISR HTIF3 LL_DMA_IsActiveFlag_HT3 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT3(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF3)==(DMA_LISR_HTIF3)); -} - -/** - * @brief Get Stream 4 half transfer flag. - * @rmtoll HISR HTIF4 LL_DMA_IsActiveFlag_HT4 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT4(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF4)==(DMA_HISR_HTIF4)); -} - -/** - * @brief Get Stream 5 half transfer flag. - * @rmtoll HISR HTIF0 LL_DMA_IsActiveFlag_HT5 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT5(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF5)==(DMA_HISR_HTIF5)); -} - -/** - * @brief Get Stream 6 half transfer flag. - * @rmtoll HISR HTIF6 LL_DMA_IsActiveFlag_HT6 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT6(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF6)==(DMA_HISR_HTIF6)); -} - -/** - * @brief Get Stream 7 half transfer flag. - * @rmtoll HISR HTIF7 LL_DMA_IsActiveFlag_HT7 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT7(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF7)==(DMA_HISR_HTIF7)); -} - -/** - * @brief Get Stream 0 transfer complete flag. - * @rmtoll LISR TCIF0 LL_DMA_IsActiveFlag_TC0 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC0(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF0)==(DMA_LISR_TCIF0)); -} - -/** - * @brief Get Stream 1 transfer complete flag. - * @rmtoll LISR TCIF1 LL_DMA_IsActiveFlag_TC1 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC1(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF1)==(DMA_LISR_TCIF1)); -} - -/** - * @brief Get Stream 2 transfer complete flag. - * @rmtoll LISR TCIF2 LL_DMA_IsActiveFlag_TC2 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC2(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF2)==(DMA_LISR_TCIF2)); -} - -/** - * @brief Get Stream 3 transfer complete flag. - * @rmtoll LISR TCIF3 LL_DMA_IsActiveFlag_TC3 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC3(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF3)==(DMA_LISR_TCIF3)); -} - -/** - * @brief Get Stream 4 transfer complete flag. - * @rmtoll HISR TCIF4 LL_DMA_IsActiveFlag_TC4 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC4(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF4)==(DMA_HISR_TCIF4)); -} - -/** - * @brief Get Stream 5 transfer complete flag. - * @rmtoll HISR TCIF0 LL_DMA_IsActiveFlag_TC5 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC5(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF5)==(DMA_HISR_TCIF5)); -} - -/** - * @brief Get Stream 6 transfer complete flag. - * @rmtoll HISR TCIF6 LL_DMA_IsActiveFlag_TC6 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC6(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF6)==(DMA_HISR_TCIF6)); -} - -/** - * @brief Get Stream 7 transfer complete flag. - * @rmtoll HISR TCIF7 LL_DMA_IsActiveFlag_TC7 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC7(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF7)==(DMA_HISR_TCIF7)); -} - -/** - * @brief Get Stream 0 transfer error flag. - * @rmtoll LISR TEIF0 LL_DMA_IsActiveFlag_TE0 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE0(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF0)==(DMA_LISR_TEIF0)); -} - -/** - * @brief Get Stream 1 transfer error flag. - * @rmtoll LISR TEIF1 LL_DMA_IsActiveFlag_TE1 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE1(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF1)==(DMA_LISR_TEIF1)); -} - -/** - * @brief Get Stream 2 transfer error flag. - * @rmtoll LISR TEIF2 LL_DMA_IsActiveFlag_TE2 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE2(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF2)==(DMA_LISR_TEIF2)); -} - -/** - * @brief Get Stream 3 transfer error flag. - * @rmtoll LISR TEIF3 LL_DMA_IsActiveFlag_TE3 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE3(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF3)==(DMA_LISR_TEIF3)); -} - -/** - * @brief Get Stream 4 transfer error flag. - * @rmtoll HISR TEIF4 LL_DMA_IsActiveFlag_TE4 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE4(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF4)==(DMA_HISR_TEIF4)); -} - -/** - * @brief Get Stream 5 transfer error flag. - * @rmtoll HISR TEIF0 LL_DMA_IsActiveFlag_TE5 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE5(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF5)==(DMA_HISR_TEIF5)); -} - -/** - * @brief Get Stream 6 transfer error flag. - * @rmtoll HISR TEIF6 LL_DMA_IsActiveFlag_TE6 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE6(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF6)==(DMA_HISR_TEIF6)); -} - -/** - * @brief Get Stream 7 transfer error flag. - * @rmtoll HISR TEIF7 LL_DMA_IsActiveFlag_TE7 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE7(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF7)==(DMA_HISR_TEIF7)); -} - -/** - * @brief Get Stream 0 direct mode error flag. - * @rmtoll LISR DMEIF0 LL_DMA_IsActiveFlag_DME0 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME0(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF0)==(DMA_LISR_DMEIF0)); -} - -/** - * @brief Get Stream 1 direct mode error flag. - * @rmtoll LISR DMEIF1 LL_DMA_IsActiveFlag_DME1 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME1(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF1)==(DMA_LISR_DMEIF1)); -} - -/** - * @brief Get Stream 2 direct mode error flag. - * @rmtoll LISR DMEIF2 LL_DMA_IsActiveFlag_DME2 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME2(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF2)==(DMA_LISR_DMEIF2)); -} - -/** - * @brief Get Stream 3 direct mode error flag. - * @rmtoll LISR DMEIF3 LL_DMA_IsActiveFlag_DME3 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME3(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF3)==(DMA_LISR_DMEIF3)); -} - -/** - * @brief Get Stream 4 direct mode error flag. - * @rmtoll HISR DMEIF4 LL_DMA_IsActiveFlag_DME4 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME4(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF4)==(DMA_HISR_DMEIF4)); -} - -/** - * @brief Get Stream 5 direct mode error flag. - * @rmtoll HISR DMEIF0 LL_DMA_IsActiveFlag_DME5 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME5(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF5)==(DMA_HISR_DMEIF5)); -} - -/** - * @brief Get Stream 6 direct mode error flag. - * @rmtoll HISR DMEIF6 LL_DMA_IsActiveFlag_DME6 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME6(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF6)==(DMA_HISR_DMEIF6)); -} - -/** - * @brief Get Stream 7 direct mode error flag. - * @rmtoll HISR DMEIF7 LL_DMA_IsActiveFlag_DME7 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME7(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF7)==(DMA_HISR_DMEIF7)); -} - -/** - * @brief Get Stream 0 FIFO error flag. - * @rmtoll LISR FEIF0 LL_DMA_IsActiveFlag_FE0 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE0(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF0)==(DMA_LISR_FEIF0)); -} - -/** - * @brief Get Stream 1 FIFO error flag. - * @rmtoll LISR FEIF1 LL_DMA_IsActiveFlag_FE1 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE1(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF1)==(DMA_LISR_FEIF1)); -} - -/** - * @brief Get Stream 2 FIFO error flag. - * @rmtoll LISR FEIF2 LL_DMA_IsActiveFlag_FE2 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE2(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF2)==(DMA_LISR_FEIF2)); -} - -/** - * @brief Get Stream 3 FIFO error flag. - * @rmtoll LISR FEIF3 LL_DMA_IsActiveFlag_FE3 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE3(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF3)==(DMA_LISR_FEIF3)); -} - -/** - * @brief Get Stream 4 FIFO error flag. - * @rmtoll HISR FEIF4 LL_DMA_IsActiveFlag_FE4 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE4(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF4)==(DMA_HISR_FEIF4)); -} - -/** - * @brief Get Stream 5 FIFO error flag. - * @rmtoll HISR FEIF0 LL_DMA_IsActiveFlag_FE5 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE5(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF5)==(DMA_HISR_FEIF5)); -} - -/** - * @brief Get Stream 6 FIFO error flag. - * @rmtoll HISR FEIF6 LL_DMA_IsActiveFlag_FE6 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE6(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF6)==(DMA_HISR_FEIF6)); -} - -/** - * @brief Get Stream 7 FIFO error flag. - * @rmtoll HISR FEIF7 LL_DMA_IsActiveFlag_FE7 - * @param DMAx DMAx Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE7(DMA_TypeDef *DMAx) -{ - return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF7)==(DMA_HISR_FEIF7)); -} - -/** - * @brief Clear Stream 0 half transfer flag. - * @rmtoll LIFCR CHTIF0 LL_DMA_ClearFlag_HT0 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT0(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF0); -} - -/** - * @brief Clear Stream 1 half transfer flag. - * @rmtoll LIFCR CHTIF1 LL_DMA_ClearFlag_HT1 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT1(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF1); -} - -/** - * @brief Clear Stream 2 half transfer flag. - * @rmtoll LIFCR CHTIF2 LL_DMA_ClearFlag_HT2 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT2(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF2); -} - -/** - * @brief Clear Stream 3 half transfer flag. - * @rmtoll LIFCR CHTIF3 LL_DMA_ClearFlag_HT3 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT3(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF3); -} - -/** - * @brief Clear Stream 4 half transfer flag. - * @rmtoll HIFCR CHTIF4 LL_DMA_ClearFlag_HT4 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT4(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF4); -} - -/** - * @brief Clear Stream 5 half transfer flag. - * @rmtoll HIFCR CHTIF5 LL_DMA_ClearFlag_HT5 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT5(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF5); -} - -/** - * @brief Clear Stream 6 half transfer flag. - * @rmtoll HIFCR CHTIF6 LL_DMA_ClearFlag_HT6 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT6(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF6); -} - -/** - * @brief Clear Stream 7 half transfer flag. - * @rmtoll HIFCR CHTIF7 LL_DMA_ClearFlag_HT7 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_HT7(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF7); -} - -/** - * @brief Clear Stream 0 transfer complete flag. - * @rmtoll LIFCR CTCIF0 LL_DMA_ClearFlag_TC0 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC0(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF0); -} - -/** - * @brief Clear Stream 1 transfer complete flag. - * @rmtoll LIFCR CTCIF1 LL_DMA_ClearFlag_TC1 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC1(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF1); -} - -/** - * @brief Clear Stream 2 transfer complete flag. - * @rmtoll LIFCR CTCIF2 LL_DMA_ClearFlag_TC2 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC2(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF2); -} - -/** - * @brief Clear Stream 3 transfer complete flag. - * @rmtoll LIFCR CTCIF3 LL_DMA_ClearFlag_TC3 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC3(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF3); -} - -/** - * @brief Clear Stream 4 transfer complete flag. - * @rmtoll HIFCR CTCIF4 LL_DMA_ClearFlag_TC4 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC4(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF4); -} - -/** - * @brief Clear Stream 5 transfer complete flag. - * @rmtoll HIFCR CTCIF5 LL_DMA_ClearFlag_TC5 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC5(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF5); -} - -/** - * @brief Clear Stream 6 transfer complete flag. - * @rmtoll HIFCR CTCIF6 LL_DMA_ClearFlag_TC6 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC6(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF6); -} - -/** - * @brief Clear Stream 7 transfer complete flag. - * @rmtoll HIFCR CTCIF7 LL_DMA_ClearFlag_TC7 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TC7(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF7); -} - -/** - * @brief Clear Stream 0 transfer error flag. - * @rmtoll LIFCR CTEIF0 LL_DMA_ClearFlag_TE0 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE0(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF0); -} - -/** - * @brief Clear Stream 1 transfer error flag. - * @rmtoll LIFCR CTEIF1 LL_DMA_ClearFlag_TE1 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE1(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF1); -} - -/** - * @brief Clear Stream 2 transfer error flag. - * @rmtoll LIFCR CTEIF2 LL_DMA_ClearFlag_TE2 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE2(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF2); -} - -/** - * @brief Clear Stream 3 transfer error flag. - * @rmtoll LIFCR CTEIF3 LL_DMA_ClearFlag_TE3 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE3(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF3); -} - -/** - * @brief Clear Stream 4 transfer error flag. - * @rmtoll HIFCR CTEIF4 LL_DMA_ClearFlag_TE4 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE4(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF4); -} - -/** - * @brief Clear Stream 5 transfer error flag. - * @rmtoll HIFCR CTEIF5 LL_DMA_ClearFlag_TE5 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE5(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF5); -} - -/** - * @brief Clear Stream 6 transfer error flag. - * @rmtoll HIFCR CTEIF6 LL_DMA_ClearFlag_TE6 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE6(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF6); -} - -/** - * @brief Clear Stream 7 transfer error flag. - * @rmtoll HIFCR CTEIF7 LL_DMA_ClearFlag_TE7 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_TE7(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF7); -} - -/** - * @brief Clear Stream 0 direct mode error flag. - * @rmtoll LIFCR CDMEIF0 LL_DMA_ClearFlag_DME0 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME0(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF0); -} - -/** - * @brief Clear Stream 1 direct mode error flag. - * @rmtoll LIFCR CDMEIF1 LL_DMA_ClearFlag_DME1 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME1(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF1); -} - -/** - * @brief Clear Stream 2 direct mode error flag. - * @rmtoll LIFCR CDMEIF2 LL_DMA_ClearFlag_DME2 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME2(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF2); -} - -/** - * @brief Clear Stream 3 direct mode error flag. - * @rmtoll LIFCR CDMEIF3 LL_DMA_ClearFlag_DME3 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME3(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF3); -} - -/** - * @brief Clear Stream 4 direct mode error flag. - * @rmtoll HIFCR CDMEIF4 LL_DMA_ClearFlag_DME4 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME4(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF4); -} - -/** - * @brief Clear Stream 5 direct mode error flag. - * @rmtoll HIFCR CDMEIF5 LL_DMA_ClearFlag_DME5 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME5(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF5); -} - -/** - * @brief Clear Stream 6 direct mode error flag. - * @rmtoll HIFCR CDMEIF6 LL_DMA_ClearFlag_DME6 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME6(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF6); -} - -/** - * @brief Clear Stream 7 direct mode error flag. - * @rmtoll HIFCR CDMEIF7 LL_DMA_ClearFlag_DME7 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_DME7(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF7); -} - -/** - * @brief Clear Stream 0 FIFO error flag. - * @rmtoll LIFCR CFEIF0 LL_DMA_ClearFlag_FE0 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE0(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF0); -} - -/** - * @brief Clear Stream 1 FIFO error flag. - * @rmtoll LIFCR CFEIF1 LL_DMA_ClearFlag_FE1 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE1(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF1); -} - -/** - * @brief Clear Stream 2 FIFO error flag. - * @rmtoll LIFCR CFEIF2 LL_DMA_ClearFlag_FE2 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE2(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF2); -} - -/** - * @brief Clear Stream 3 FIFO error flag. - * @rmtoll LIFCR CFEIF3 LL_DMA_ClearFlag_FE3 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE3(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF3); -} - -/** - * @brief Clear Stream 4 FIFO error flag. - * @rmtoll HIFCR CFEIF4 LL_DMA_ClearFlag_FE4 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE4(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF4); -} - -/** - * @brief Clear Stream 5 FIFO error flag. - * @rmtoll HIFCR CFEIF5 LL_DMA_ClearFlag_FE5 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE5(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF5); -} - -/** - * @brief Clear Stream 6 FIFO error flag. - * @rmtoll HIFCR CFEIF6 LL_DMA_ClearFlag_FE6 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE6(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF6); -} - -/** - * @brief Clear Stream 7 FIFO error flag. - * @rmtoll HIFCR CFEIF7 LL_DMA_ClearFlag_FE7 - * @param DMAx DMAx Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA_ClearFlag_FE7(DMA_TypeDef *DMAx) -{ - WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF7); -} - -/** - * @} - */ - -/** @defgroup DMA_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable Half transfer interrupt. - * @rmtoll CR HTIE LL_DMA_EnableIT_HT - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE); -} - -/** - * @brief Enable Transfer error interrupt. - * @rmtoll CR TEIE LL_DMA_EnableIT_TE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE); -} - -/** - * @brief Enable Transfer complete interrupt. - * @rmtoll CR TCIE LL_DMA_EnableIT_TC - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE); -} - -/** - * @brief Enable Direct mode error interrupt. - * @rmtoll CR DMEIE LL_DMA_EnableIT_DME - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE); -} - -/** - * @brief Enable FIFO error interrupt. - * @rmtoll FCR FEIE LL_DMA_EnableIT_FE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_EnableIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE); -} - -/** - * @brief Disable Half transfer interrupt. - * @rmtoll CR HTIE LL_DMA_DisableIT_HT - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE); -} - -/** - * @brief Disable Transfer error interrupt. - * @rmtoll CR TEIE LL_DMA_DisableIT_TE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE); -} - -/** - * @brief Disable Transfer complete interrupt. - * @rmtoll CR TCIE LL_DMA_DisableIT_TC - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE); -} - -/** - * @brief Disable Direct mode error interrupt. - * @rmtoll CR DMEIE LL_DMA_DisableIT_DME - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE); -} - -/** - * @brief Disable FIFO error interrupt. - * @rmtoll FCR FEIE LL_DMA_DisableIT_FE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval None - */ -__STATIC_INLINE void LL_DMA_DisableIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE); -} - -/** - * @brief Check if Half transfer interrupt is enabled. - * @rmtoll CR HTIE LL_DMA_IsEnabledIT_HT - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE) == DMA_SxCR_HTIE); -} - -/** - * @brief Check if Transfer error nterrup is enabled. - * @rmtoll CR TEIE LL_DMA_IsEnabledIT_TE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE) == DMA_SxCR_TEIE); -} - -/** - * @brief Check if Transfer complete interrupt is enabled. - * @rmtoll CR TCIE LL_DMA_IsEnabledIT_TC - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE) == DMA_SxCR_TCIE); -} - -/** - * @brief Check if Direct mode error interrupt is enabled. - * @rmtoll CR DMEIE LL_DMA_IsEnabledIT_DME - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE) == DMA_SxCR_DMEIE); -} - -/** - * @brief Check if FIFO error interrupt is enabled. - * @rmtoll FCR FEIE LL_DMA_IsEnabledIT_FE - * @param DMAx DMAx Instance - * @param Stream This parameter can be one of the following values: - * @arg @ref LL_DMA_STREAM_0 - * @arg @ref LL_DMA_STREAM_1 - * @arg @ref LL_DMA_STREAM_2 - * @arg @ref LL_DMA_STREAM_3 - * @arg @ref LL_DMA_STREAM_4 - * @arg @ref LL_DMA_STREAM_5 - * @arg @ref LL_DMA_STREAM_6 - * @arg @ref LL_DMA_STREAM_7 - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) -{ - return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE) == DMA_SxFCR_FEIE); -} - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup DMA_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -uint32_t LL_DMA_Init(DMA_TypeDef *DMAx, uint32_t Stream, LL_DMA_InitTypeDef *DMA_InitStruct); -uint32_t LL_DMA_DeInit(DMA_TypeDef *DMAx, uint32_t Stream); -void LL_DMA_StructInit(LL_DMA_InitTypeDef *DMA_InitStruct); - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* DMA1 || DMA2 */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_DMA_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma2d.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma2d.h deleted file mode 100644 index 9715c87..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma2d.h +++ /dev/null @@ -1,1900 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_dma2d.h - * @author MCD Application Team - * @brief Header file of DMA2D LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_LL_DMA2D_H -#define STM32F4xx_LL_DMA2D_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (DMA2D) - -/** @defgroup DMA2D_LL DMA2D - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup DMA2D_LL_Private_Macros DMA2D Private Macros - * @{ - */ - -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup DMA2D_LL_ES_Init_Struct DMA2D Exported Init structures - * @{ - */ - -/** - * @brief LL DMA2D Init Structure Definition - */ -typedef struct -{ - uint32_t Mode; /*!< Specifies the DMA2D transfer mode. - - This parameter can be one value of @ref DMA2D_LL_EC_MODE. - - This parameter can be modified afterwards, - using unitary function @ref LL_DMA2D_SetMode(). */ - - uint32_t ColorMode; /*!< Specifies the color format of the output image. - - This parameter can be one value of @ref DMA2D_LL_EC_OUTPUT_COLOR_MODE. - - This parameter can be modified afterwards using, - unitary function @ref LL_DMA2D_SetOutputColorMode(). */ - - uint32_t OutputBlue; /*!< Specifies the Blue value of the output image. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0xFF if RGB888 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x1F if RGB565 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x1F if ARGB1555 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. - - This parameter can be modified afterwards, - using unitary function @ref LL_DMA2D_SetOutputColor() or configuration - function @ref LL_DMA2D_ConfigOutputColor(). */ - - uint32_t OutputGreen; /*!< Specifies the Green value of the output image. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0xFF if RGB888 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x3F if RGB565 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x1F if ARGB1555 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. - - This parameter can be modified afterwards - using unitary function @ref LL_DMA2D_SetOutputColor() or configuration - function @ref LL_DMA2D_ConfigOutputColor(). */ - - uint32_t OutputRed; /*!< Specifies the Red value of the output image. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0xFF if RGB888 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x1F if RGB565 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x1F if ARGB1555 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. - - This parameter can be modified afterwards - using unitary function @ref LL_DMA2D_SetOutputColor() or configuration - function @ref LL_DMA2D_ConfigOutputColor(). */ - - uint32_t OutputAlpha; /*!< Specifies the Alpha channel of the output image. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x01 if ARGB1555 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. - - This parameter is not considered if RGB888 or RGB565 color mode is selected. - - This parameter can be modified afterwards using, - unitary function @ref LL_DMA2D_SetOutputColor() or configuration - function @ref LL_DMA2D_ConfigOutputColor(). */ - - uint32_t OutputMemoryAddress; /*!< Specifies the memory address. - - This parameter must be a number between: - Min_Data = 0x0000 and Max_Data = 0xFFFFFFFF. - - This parameter can be modified afterwards, - using unitary function @ref LL_DMA2D_SetOutputMemAddr(). */ - - - - uint32_t LineOffset; /*!< Specifies the output line offset value. - - This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0x3FFF. - - This parameter can be modified afterwards, - using unitary function @ref LL_DMA2D_SetLineOffset(). */ - - uint32_t NbrOfLines; /*!< Specifies the number of lines of the area to be transferred. - - This parameter must be a number between: - Min_Data = 0x0000 and Max_Data = 0xFFFF. - - This parameter can be modified afterwards, - using unitary function @ref LL_DMA2D_SetNbrOfLines(). */ - - uint32_t NbrOfPixelsPerLines; /*!< Specifies the number of pixels per lines of the area to be transferred. - - This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0x3FFF. - - This parameter can be modified afterwards using, - unitary function @ref LL_DMA2D_SetNbrOfPixelsPerLines(). */ - - -} LL_DMA2D_InitTypeDef; - -/** - * @brief LL DMA2D Layer Configuration Structure Definition - */ -typedef struct -{ - uint32_t MemoryAddress; /*!< Specifies the foreground or background memory address. - - This parameter must be a number between: - Min_Data = 0x0000 and Max_Data = 0xFFFFFFFF. - - This parameter can be modified afterwards using unitary functions - - @ref LL_DMA2D_FGND_SetMemAddr() for foreground layer, - - @ref LL_DMA2D_BGND_SetMemAddr() for background layer. */ - - uint32_t LineOffset; /*!< Specifies the foreground or background line offset value. - - This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0x3FFF. - - This parameter can be modified afterwards using unitary functions - - @ref LL_DMA2D_FGND_SetLineOffset() for foreground layer, - - @ref LL_DMA2D_BGND_SetLineOffset() for background layer. */ - - uint32_t ColorMode; /*!< Specifies the foreground or background color mode. - - This parameter can be one value of @ref DMA2D_LL_EC_INPUT_COLOR_MODE. - - This parameter can be modified afterwards using unitary functions - - @ref LL_DMA2D_FGND_SetColorMode() for foreground layer, - - @ref LL_DMA2D_BGND_SetColorMode() for background layer. */ - - uint32_t CLUTColorMode; /*!< Specifies the foreground or background CLUT color mode. - - This parameter can be one value of @ref DMA2D_LL_EC_CLUT_COLOR_MODE. - - This parameter can be modified afterwards using unitary functions - - @ref LL_DMA2D_FGND_SetCLUTColorMode() for foreground layer, - - @ref LL_DMA2D_BGND_SetCLUTColorMode() for background layer. */ - - uint32_t CLUTSize; /*!< Specifies the foreground or background CLUT size. - - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. - - This parameter can be modified afterwards using unitary functions - - @ref LL_DMA2D_FGND_SetCLUTSize() for foreground layer, - - @ref LL_DMA2D_BGND_SetCLUTSize() for background layer. */ - - uint32_t AlphaMode; /*!< Specifies the foreground or background alpha mode. - - This parameter can be one value of @ref DMA2D_LL_EC_ALPHA_MODE. - - This parameter can be modified afterwards using unitary functions - - @ref LL_DMA2D_FGND_SetAlphaMode() for foreground layer, - - @ref LL_DMA2D_BGND_SetAlphaMode() for background layer. */ - - uint32_t Alpha; /*!< Specifies the foreground or background Alpha value. - - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. - - This parameter can be modified afterwards using unitary functions - - @ref LL_DMA2D_FGND_SetAlpha() for foreground layer, - - @ref LL_DMA2D_BGND_SetAlpha() for background layer. */ - - uint32_t Blue; /*!< Specifies the foreground or background Blue color value. - - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. - - This parameter can be modified afterwards using unitary functions - - @ref LL_DMA2D_FGND_SetBlueColor() for foreground layer, - - @ref LL_DMA2D_BGND_SetBlueColor() for background layer. */ - - uint32_t Green; /*!< Specifies the foreground or background Green color value. - - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. - - This parameter can be modified afterwards using unitary functions - - @ref LL_DMA2D_FGND_SetGreenColor() for foreground layer, - - @ref LL_DMA2D_BGND_SetGreenColor() for background layer. */ - - uint32_t Red; /*!< Specifies the foreground or background Red color value. - - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. - - This parameter can be modified afterwards using unitary functions - - @ref LL_DMA2D_FGND_SetRedColor() for foreground layer, - - @ref LL_DMA2D_BGND_SetRedColor() for background layer. */ - - uint32_t CLUTMemoryAddress; /*!< Specifies the foreground or background CLUT memory address. - - This parameter must be a number between: - Min_Data = 0x0000 and Max_Data = 0xFFFFFFFF. - - This parameter can be modified afterwards using unitary functions - - @ref LL_DMA2D_FGND_SetCLUTMemAddr() for foreground layer, - - @ref LL_DMA2D_BGND_SetCLUTMemAddr() for background layer. */ - - - -} LL_DMA2D_LayerCfgTypeDef; - -/** - * @brief LL DMA2D Output Color Structure Definition - */ -typedef struct -{ - uint32_t ColorMode; /*!< Specifies the color format of the output image. - - This parameter can be one value of @ref DMA2D_LL_EC_OUTPUT_COLOR_MODE. - - This parameter can be modified afterwards using - unitary function @ref LL_DMA2D_SetOutputColorMode(). */ - - uint32_t OutputBlue; /*!< Specifies the Blue value of the output image. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0xFF if RGB888 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x1F if RGB565 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x1F if ARGB1555 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. - - This parameter can be modified afterwards using, - unitary function @ref LL_DMA2D_SetOutputColor() or configuration - function @ref LL_DMA2D_ConfigOutputColor(). */ - - uint32_t OutputGreen; /*!< Specifies the Green value of the output image. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. - - This parameter must be a number between - Min_Data = 0x00 and Max_Data = 0xFF if RGB888 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x3F if RGB565 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x1F if ARGB1555 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. - - This parameter can be modified afterwards, - using unitary function @ref LL_DMA2D_SetOutputColor() or configuration - function @ref LL_DMA2D_ConfigOutputColor(). */ - - uint32_t OutputRed; /*!< Specifies the Red value of the output image. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0xFF if RGB888 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x1F if RGB565 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x1F if ARGB1555 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. - - This parameter can be modified afterwards, - using unitary function @ref LL_DMA2D_SetOutputColor() or configuration - function @ref LL_DMA2D_ConfigOutputColor(). */ - - uint32_t OutputAlpha; /*!< Specifies the Alpha channel of the output image. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x01 if ARGB1555 color mode is selected. - - This parameter must be a number between: - Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. - - This parameter is not considered if RGB888 or RGB565 color mode is selected. - - This parameter can be modified afterwards, - using unitary function @ref LL_DMA2D_SetOutputColor() or configuration - function @ref LL_DMA2D_ConfigOutputColor(). */ - -} LL_DMA2D_ColorTypeDef; - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup DMA2D_LL_Exported_Constants DMA2D Exported Constants - * @{ - */ - -/** @defgroup DMA2D_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_DMA2D_ReadReg function - * @{ - */ -#define LL_DMA2D_FLAG_CEIF DMA2D_ISR_CEIF /*!< Configuration Error Interrupt Flag */ -#define LL_DMA2D_FLAG_CTCIF DMA2D_ISR_CTCIF /*!< CLUT Transfer Complete Interrupt Flag */ -#define LL_DMA2D_FLAG_CAEIF DMA2D_ISR_CAEIF /*!< CLUT Access Error Interrupt Flag */ -#define LL_DMA2D_FLAG_TWIF DMA2D_ISR_TWIF /*!< Transfer Watermark Interrupt Flag */ -#define LL_DMA2D_FLAG_TCIF DMA2D_ISR_TCIF /*!< Transfer Complete Interrupt Flag */ -#define LL_DMA2D_FLAG_TEIF DMA2D_ISR_TEIF /*!< Transfer Error Interrupt Flag */ -/** - * @} - */ - -/** @defgroup DMA2D_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_DMA2D_ReadReg and LL_DMA2D_WriteReg functions - * @{ - */ -#define LL_DMA2D_IT_CEIE DMA2D_CR_CEIE /*!< Configuration Error Interrupt */ -#define LL_DMA2D_IT_CTCIE DMA2D_CR_CTCIE /*!< CLUT Transfer Complete Interrupt */ -#define LL_DMA2D_IT_CAEIE DMA2D_CR_CAEIE /*!< CLUT Access Error Interrupt */ -#define LL_DMA2D_IT_TWIE DMA2D_CR_TWIE /*!< Transfer Watermark Interrupt */ -#define LL_DMA2D_IT_TCIE DMA2D_CR_TCIE /*!< Transfer Complete Interrupt */ -#define LL_DMA2D_IT_TEIE DMA2D_CR_TEIE /*!< Transfer Error Interrupt */ -/** - * @} - */ - -/** @defgroup DMA2D_LL_EC_MODE Mode - * @{ - */ -#define LL_DMA2D_MODE_M2M 0x00000000U /*!< DMA2D memory to memory transfer mode */ -#define LL_DMA2D_MODE_M2M_PFC DMA2D_CR_MODE_0 /*!< DMA2D memory to memory with pixel format conversion transfer mode */ -#define LL_DMA2D_MODE_M2M_BLEND DMA2D_CR_MODE_1 /*!< DMA2D memory to memory with blending transfer mode */ -#define LL_DMA2D_MODE_R2M DMA2D_CR_MODE /*!< DMA2D register to memory transfer mode */ -/** - * @} - */ - -/** @defgroup DMA2D_LL_EC_OUTPUT_COLOR_MODE Output Color Mode - * @{ - */ -#define LL_DMA2D_OUTPUT_MODE_ARGB8888 0x00000000U /*!< ARGB8888 */ -#define LL_DMA2D_OUTPUT_MODE_RGB888 DMA2D_OPFCCR_CM_0 /*!< RGB888 */ -#define LL_DMA2D_OUTPUT_MODE_RGB565 DMA2D_OPFCCR_CM_1 /*!< RGB565 */ -#define LL_DMA2D_OUTPUT_MODE_ARGB1555 (DMA2D_OPFCCR_CM_0|DMA2D_OPFCCR_CM_1) /*!< ARGB1555 */ -#define LL_DMA2D_OUTPUT_MODE_ARGB4444 DMA2D_OPFCCR_CM_2 /*!< ARGB4444 */ -/** - * @} - */ - -/** @defgroup DMA2D_LL_EC_INPUT_COLOR_MODE Input Color Mode - * @{ - */ -#define LL_DMA2D_INPUT_MODE_ARGB8888 0x00000000U /*!< ARGB8888 */ -#define LL_DMA2D_INPUT_MODE_RGB888 DMA2D_FGPFCCR_CM_0 /*!< RGB888 */ -#define LL_DMA2D_INPUT_MODE_RGB565 DMA2D_FGPFCCR_CM_1 /*!< RGB565 */ -#define LL_DMA2D_INPUT_MODE_ARGB1555 (DMA2D_FGPFCCR_CM_0|DMA2D_FGPFCCR_CM_1) /*!< ARGB1555 */ -#define LL_DMA2D_INPUT_MODE_ARGB4444 DMA2D_FGPFCCR_CM_2 /*!< ARGB4444 */ -#define LL_DMA2D_INPUT_MODE_L8 (DMA2D_FGPFCCR_CM_0|DMA2D_FGPFCCR_CM_2) /*!< L8 */ -#define LL_DMA2D_INPUT_MODE_AL44 (DMA2D_FGPFCCR_CM_1|DMA2D_FGPFCCR_CM_2) /*!< AL44 */ -#define LL_DMA2D_INPUT_MODE_AL88 (DMA2D_FGPFCCR_CM_0|DMA2D_FGPFCCR_CM_1|DMA2D_FGPFCCR_CM_2) /*!< AL88 */ -#define LL_DMA2D_INPUT_MODE_L4 DMA2D_FGPFCCR_CM_3 /*!< L4 */ -#define LL_DMA2D_INPUT_MODE_A8 (DMA2D_FGPFCCR_CM_0|DMA2D_FGPFCCR_CM_3) /*!< A8 */ -#define LL_DMA2D_INPUT_MODE_A4 (DMA2D_FGPFCCR_CM_1|DMA2D_FGPFCCR_CM_3) /*!< A4 */ -/** - * @} - */ - -/** @defgroup DMA2D_LL_EC_ALPHA_MODE Alpha Mode - * @{ - */ -#define LL_DMA2D_ALPHA_MODE_NO_MODIF 0x00000000U /*!< No modification of the alpha channel value */ -#define LL_DMA2D_ALPHA_MODE_REPLACE DMA2D_FGPFCCR_AM_0 /*!< Replace original alpha channel value by - programmed alpha value */ -#define LL_DMA2D_ALPHA_MODE_COMBINE DMA2D_FGPFCCR_AM_1 /*!< Replace original alpha channel value by - programmed alpha value with, - original alpha channel value */ -/** - * @} - */ - - - - -/** @defgroup DMA2D_LL_EC_CLUT_COLOR_MODE CLUT Color Mode - * @{ - */ -#define LL_DMA2D_CLUT_COLOR_MODE_ARGB8888 0x00000000U /*!< ARGB8888 */ -#define LL_DMA2D_CLUT_COLOR_MODE_RGB888 DMA2D_FGPFCCR_CCM /*!< RGB888 */ -/** - * @} - */ - - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup DMA2D_LL_Exported_Macros DMA2D Exported Macros - * @{ - */ - -/** @defgroup DMA2D_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in DMA2D register. - * @param __INSTANCE__ DMA2D Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_DMA2D_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG((__INSTANCE__)->__REG__, (__VALUE__)) - -/** - * @brief Read a value in DMA2D register. - * @param __INSTANCE__ DMA2D Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_DMA2D_ReadReg(__INSTANCE__, __REG__) READ_REG((__INSTANCE__)->__REG__) -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup DMA2D_LL_Exported_Functions DMA2D Exported Functions - * @{ - */ - -/** @defgroup DMA2D_LL_EF_Configuration Configuration Functions - * @{ - */ - -/** - * @brief Start a DMA2D transfer. - * @rmtoll CR START LL_DMA2D_Start - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_Start(DMA2D_TypeDef *DMA2Dx) -{ - SET_BIT(DMA2Dx->CR, DMA2D_CR_START); -} - -/** - * @brief Indicate if a DMA2D transfer is ongoing. - * @rmtoll CR START LL_DMA2D_IsTransferOngoing - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsTransferOngoing(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->CR, DMA2D_CR_START) == (DMA2D_CR_START)) ? 1UL : 0UL); -} - -/** - * @brief Suspend DMA2D transfer. - * @note This API can be used to suspend automatic foreground or background CLUT loading. - * @rmtoll CR SUSP LL_DMA2D_Suspend - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_Suspend(DMA2D_TypeDef *DMA2Dx) -{ - MODIFY_REG(DMA2Dx->CR, DMA2D_CR_SUSP | DMA2D_CR_START, DMA2D_CR_SUSP); -} - -/** - * @brief Resume DMA2D transfer. - * @note This API can be used to resume automatic foreground or background CLUT loading. - * @rmtoll CR SUSP LL_DMA2D_Resume - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_Resume(DMA2D_TypeDef *DMA2Dx) -{ - CLEAR_BIT(DMA2Dx->CR, DMA2D_CR_SUSP | DMA2D_CR_START); -} - -/** - * @brief Indicate if DMA2D transfer is suspended. - * @note This API can be used to indicate whether or not automatic foreground or - * background CLUT loading is suspended. - * @rmtoll CR SUSP LL_DMA2D_IsSuspended - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsSuspended(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->CR, DMA2D_CR_SUSP) == (DMA2D_CR_SUSP)) ? 1UL : 0UL); -} - -/** - * @brief Abort DMA2D transfer. - * @note This API can be used to abort automatic foreground or background CLUT loading. - * @rmtoll CR ABORT LL_DMA2D_Abort - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_Abort(DMA2D_TypeDef *DMA2Dx) -{ - MODIFY_REG(DMA2Dx->CR, DMA2D_CR_ABORT | DMA2D_CR_START, DMA2D_CR_ABORT); -} - -/** - * @brief Indicate if DMA2D transfer is aborted. - * @note This API can be used to indicate whether or not automatic foreground or - * background CLUT loading is aborted. - * @rmtoll CR ABORT LL_DMA2D_IsAborted - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsAborted(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->CR, DMA2D_CR_ABORT) == (DMA2D_CR_ABORT)) ? 1UL : 0UL); -} - -/** - * @brief Set DMA2D mode. - * @rmtoll CR MODE LL_DMA2D_SetMode - * @param DMA2Dx DMA2D Instance - * @param Mode This parameter can be one of the following values: - * @arg @ref LL_DMA2D_MODE_M2M - * @arg @ref LL_DMA2D_MODE_M2M_PFC - * @arg @ref LL_DMA2D_MODE_M2M_BLEND - * @arg @ref LL_DMA2D_MODE_R2M - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_SetMode(DMA2D_TypeDef *DMA2Dx, uint32_t Mode) -{ - MODIFY_REG(DMA2Dx->CR, DMA2D_CR_MODE, Mode); -} - -/** - * @brief Return DMA2D mode - * @rmtoll CR MODE LL_DMA2D_GetMode - * @param DMA2Dx DMA2D Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA2D_MODE_M2M - * @arg @ref LL_DMA2D_MODE_M2M_PFC - * @arg @ref LL_DMA2D_MODE_M2M_BLEND - * @arg @ref LL_DMA2D_MODE_R2M - */ -__STATIC_INLINE uint32_t LL_DMA2D_GetMode(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->CR, DMA2D_CR_MODE)); -} - -/** - * @brief Set DMA2D output color mode. - * @rmtoll OPFCCR CM LL_DMA2D_SetOutputColorMode - * @param DMA2Dx DMA2D Instance - * @param ColorMode This parameter can be one of the following values: - * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB8888 - * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB888 - * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB565 - * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB1555 - * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB4444 - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_SetOutputColorMode(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode) -{ - MODIFY_REG(DMA2Dx->OPFCCR, DMA2D_OPFCCR_CM, ColorMode); -} - -/** - * @brief Return DMA2D output color mode. - * @rmtoll OPFCCR CM LL_DMA2D_GetOutputColorMode - * @param DMA2Dx DMA2D Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB8888 - * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB888 - * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB565 - * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB1555 - * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB4444 - */ -__STATIC_INLINE uint32_t LL_DMA2D_GetOutputColorMode(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->OPFCCR, DMA2D_OPFCCR_CM)); -} - - - - -/** - * @brief Set DMA2D line offset, expressed on 14 bits ([13:0] bits). - * @rmtoll OOR LO LL_DMA2D_SetLineOffset - * @param DMA2Dx DMA2D Instance - * @param LineOffset Value between Min_Data=0 and Max_Data=0x3FFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_SetLineOffset(DMA2D_TypeDef *DMA2Dx, uint32_t LineOffset) -{ - MODIFY_REG(DMA2Dx->OOR, DMA2D_OOR_LO, LineOffset); -} - -/** - * @brief Return DMA2D line offset, expressed on 14 bits ([13:0] bits). - * @rmtoll OOR LO LL_DMA2D_GetLineOffset - * @param DMA2Dx DMA2D Instance - * @retval Line offset value between Min_Data=0 and Max_Data=0x3FFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_GetLineOffset(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->OOR, DMA2D_OOR_LO)); -} - -/** - * @brief Set DMA2D number of pixels per lines, expressed on 14 bits ([13:0] bits). - * @rmtoll NLR PL LL_DMA2D_SetNbrOfPixelsPerLines - * @param DMA2Dx DMA2D Instance - * @param NbrOfPixelsPerLines Value between Min_Data=0 and Max_Data=0x3FFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_SetNbrOfPixelsPerLines(DMA2D_TypeDef *DMA2Dx, uint32_t NbrOfPixelsPerLines) -{ - MODIFY_REG(DMA2Dx->NLR, DMA2D_NLR_PL, (NbrOfPixelsPerLines << DMA2D_NLR_PL_Pos)); -} - -/** - * @brief Return DMA2D number of pixels per lines, expressed on 14 bits ([13:0] bits) - * @rmtoll NLR PL LL_DMA2D_GetNbrOfPixelsPerLines - * @param DMA2Dx DMA2D Instance - * @retval Number of pixels per lines value between Min_Data=0 and Max_Data=0x3FFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_GetNbrOfPixelsPerLines(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->NLR, DMA2D_NLR_PL) >> DMA2D_NLR_PL_Pos); -} - -/** - * @brief Set DMA2D number of lines, expressed on 16 bits ([15:0] bits). - * @rmtoll NLR NL LL_DMA2D_SetNbrOfLines - * @param DMA2Dx DMA2D Instance - * @param NbrOfLines Value between Min_Data=0 and Max_Data=0xFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_SetNbrOfLines(DMA2D_TypeDef *DMA2Dx, uint32_t NbrOfLines) -{ - MODIFY_REG(DMA2Dx->NLR, DMA2D_NLR_NL, NbrOfLines); -} - -/** - * @brief Return DMA2D number of lines, expressed on 16 bits ([15:0] bits). - * @rmtoll NLR NL LL_DMA2D_GetNbrOfLines - * @param DMA2Dx DMA2D Instance - * @retval Number of lines value between Min_Data=0 and Max_Data=0xFFFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_GetNbrOfLines(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->NLR, DMA2D_NLR_NL)); -} - -/** - * @brief Set DMA2D output memory address, expressed on 32 bits ([31:0] bits). - * @rmtoll OMAR MA LL_DMA2D_SetOutputMemAddr - * @param DMA2Dx DMA2D Instance - * @param OutputMemoryAddress Value between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_SetOutputMemAddr(DMA2D_TypeDef *DMA2Dx, uint32_t OutputMemoryAddress) -{ - LL_DMA2D_WriteReg(DMA2Dx, OMAR, OutputMemoryAddress); -} - -/** - * @brief Get DMA2D output memory address, expressed on 32 bits ([31:0] bits). - * @rmtoll OMAR MA LL_DMA2D_GetOutputMemAddr - * @param DMA2Dx DMA2D Instance - * @retval Output memory address value between Min_Data=0 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_GetOutputMemAddr(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(LL_DMA2D_ReadReg(DMA2Dx, OMAR)); -} - -/** - * @brief Set DMA2D output color, expressed on 32 bits ([31:0] bits). - * @note Output color format depends on output color mode, ARGB8888, RGB888, - * RGB565, ARGB1555 or ARGB4444. - * @note LL_DMA2D_ConfigOutputColor() API may be used instead if colors values formatting - * with respect to color mode is not done by the user code. - * @rmtoll OCOLR BLUE LL_DMA2D_SetOutputColor\n - * OCOLR GREEN LL_DMA2D_SetOutputColor\n - * OCOLR RED LL_DMA2D_SetOutputColor\n - * OCOLR ALPHA LL_DMA2D_SetOutputColor - * @param DMA2Dx DMA2D Instance - * @param OutputColor Value between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_SetOutputColor(DMA2D_TypeDef *DMA2Dx, uint32_t OutputColor) -{ - WRITE_REG(DMA2Dx->OCOLR, OutputColor); -} - -/** - * @brief Get DMA2D output color, expressed on 32 bits ([31:0] bits). - * @note Alpha channel and red, green, blue color values must be retrieved from the returned - * value based on the output color mode (ARGB8888, RGB888, RGB565, ARGB1555 or ARGB4444) - * as set by @ref LL_DMA2D_SetOutputColorMode. - * @rmtoll OCOLR BLUE LL_DMA2D_GetOutputColor\n - * OCOLR GREEN LL_DMA2D_GetOutputColor\n - * OCOLR RED LL_DMA2D_GetOutputColor\n - * OCOLR ALPHA LL_DMA2D_GetOutputColor - * @param DMA2Dx DMA2D Instance - * @retval Output color value between Min_Data=0 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_GetOutputColor(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->OCOLR, \ - (DMA2D_OCOLR_BLUE_1 | DMA2D_OCOLR_GREEN_1 | DMA2D_OCOLR_RED_1 | DMA2D_OCOLR_ALPHA_1))); -} - -/** - * @brief Set DMA2D line watermark, expressed on 16 bits ([15:0] bits). - * @rmtoll LWR LW LL_DMA2D_SetLineWatermark - * @param DMA2Dx DMA2D Instance - * @param LineWatermark Value between Min_Data=0 and Max_Data=0xFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_SetLineWatermark(DMA2D_TypeDef *DMA2Dx, uint32_t LineWatermark) -{ - MODIFY_REG(DMA2Dx->LWR, DMA2D_LWR_LW, LineWatermark); -} - -/** - * @brief Return DMA2D line watermark, expressed on 16 bits ([15:0] bits). - * @rmtoll LWR LW LL_DMA2D_GetLineWatermark - * @param DMA2Dx DMA2D Instance - * @retval Line watermark value between Min_Data=0 and Max_Data=0xFFFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_GetLineWatermark(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->LWR, DMA2D_LWR_LW)); -} - -/** - * @brief Set DMA2D dead time, expressed on 8 bits ([7:0] bits). - * @rmtoll AMTCR DT LL_DMA2D_SetDeadTime - * @param DMA2Dx DMA2D Instance - * @param DeadTime Value between Min_Data=0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_SetDeadTime(DMA2D_TypeDef *DMA2Dx, uint32_t DeadTime) -{ - MODIFY_REG(DMA2Dx->AMTCR, DMA2D_AMTCR_DT, (DeadTime << DMA2D_AMTCR_DT_Pos)); -} - -/** - * @brief Return DMA2D dead time, expressed on 8 bits ([7:0] bits). - * @rmtoll AMTCR DT LL_DMA2D_GetDeadTime - * @param DMA2Dx DMA2D Instance - * @retval Dead time value between Min_Data=0 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_GetDeadTime(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->AMTCR, DMA2D_AMTCR_DT) >> DMA2D_AMTCR_DT_Pos); -} - -/** - * @brief Enable DMA2D dead time functionality. - * @rmtoll AMTCR EN LL_DMA2D_EnableDeadTime - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_EnableDeadTime(DMA2D_TypeDef *DMA2Dx) -{ - SET_BIT(DMA2Dx->AMTCR, DMA2D_AMTCR_EN); -} - -/** - * @brief Disable DMA2D dead time functionality. - * @rmtoll AMTCR EN LL_DMA2D_DisableDeadTime - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_DisableDeadTime(DMA2D_TypeDef *DMA2Dx) -{ - CLEAR_BIT(DMA2Dx->AMTCR, DMA2D_AMTCR_EN); -} - -/** - * @brief Indicate if DMA2D dead time functionality is enabled. - * @rmtoll AMTCR EN LL_DMA2D_IsEnabledDeadTime - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsEnabledDeadTime(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->AMTCR, DMA2D_AMTCR_EN) == (DMA2D_AMTCR_EN)) ? 1UL : 0UL); -} - -/** @defgroup DMA2D_LL_EF_FGND_Configuration Foreground Configuration Functions - * @{ - */ - -/** - * @brief Set DMA2D foreground memory address, expressed on 32 bits ([31:0] bits). - * @rmtoll FGMAR MA LL_DMA2D_FGND_SetMemAddr - * @param DMA2Dx DMA2D Instance - * @param MemoryAddress Value between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_FGND_SetMemAddr(DMA2D_TypeDef *DMA2Dx, uint32_t MemoryAddress) -{ - LL_DMA2D_WriteReg(DMA2Dx, FGMAR, MemoryAddress); -} - -/** - * @brief Get DMA2D foreground memory address, expressed on 32 bits ([31:0] bits). - * @rmtoll FGMAR MA LL_DMA2D_FGND_GetMemAddr - * @param DMA2Dx DMA2D Instance - * @retval Foreground memory address value between Min_Data=0 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetMemAddr(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(LL_DMA2D_ReadReg(DMA2Dx, FGMAR)); -} - -/** - * @brief Enable DMA2D foreground CLUT loading. - * @rmtoll FGPFCCR START LL_DMA2D_FGND_EnableCLUTLoad - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_FGND_EnableCLUTLoad(DMA2D_TypeDef *DMA2Dx) -{ - SET_BIT(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_START); -} - -/** - * @brief Indicate if DMA2D foreground CLUT loading is enabled. - * @rmtoll FGPFCCR START LL_DMA2D_FGND_IsEnabledCLUTLoad - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_FGND_IsEnabledCLUTLoad(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_START) == (DMA2D_FGPFCCR_START)) ? 1UL : 0UL); -} - -/** - * @brief Set DMA2D foreground color mode. - * @rmtoll FGPFCCR CM LL_DMA2D_FGND_SetColorMode - * @param DMA2Dx DMA2D Instance - * @param ColorMode This parameter can be one of the following values: - * @arg @ref LL_DMA2D_INPUT_MODE_ARGB8888 - * @arg @ref LL_DMA2D_INPUT_MODE_RGB888 - * @arg @ref LL_DMA2D_INPUT_MODE_RGB565 - * @arg @ref LL_DMA2D_INPUT_MODE_ARGB1555 - * @arg @ref LL_DMA2D_INPUT_MODE_ARGB4444 - * @arg @ref LL_DMA2D_INPUT_MODE_L8 - * @arg @ref LL_DMA2D_INPUT_MODE_AL44 - * @arg @ref LL_DMA2D_INPUT_MODE_AL88 - * @arg @ref LL_DMA2D_INPUT_MODE_L4 - * @arg @ref LL_DMA2D_INPUT_MODE_A8 - * @arg @ref LL_DMA2D_INPUT_MODE_A4 - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_FGND_SetColorMode(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode) -{ - MODIFY_REG(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_CM, ColorMode); -} - -/** - * @brief Return DMA2D foreground color mode. - * @rmtoll FGPFCCR CM LL_DMA2D_FGND_GetColorMode - * @param DMA2Dx DMA2D Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA2D_INPUT_MODE_ARGB8888 - * @arg @ref LL_DMA2D_INPUT_MODE_RGB888 - * @arg @ref LL_DMA2D_INPUT_MODE_RGB565 - * @arg @ref LL_DMA2D_INPUT_MODE_ARGB1555 - * @arg @ref LL_DMA2D_INPUT_MODE_ARGB4444 - * @arg @ref LL_DMA2D_INPUT_MODE_L8 - * @arg @ref LL_DMA2D_INPUT_MODE_AL44 - * @arg @ref LL_DMA2D_INPUT_MODE_AL88 - * @arg @ref LL_DMA2D_INPUT_MODE_L4 - * @arg @ref LL_DMA2D_INPUT_MODE_A8 - * @arg @ref LL_DMA2D_INPUT_MODE_A4 - */ -__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetColorMode(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_CM)); -} - -/** - * @brief Set DMA2D foreground alpha mode. - * @rmtoll FGPFCCR AM LL_DMA2D_FGND_SetAlphaMode - * @param DMA2Dx DMA2D Instance - * @param AphaMode This parameter can be one of the following values: - * @arg @ref LL_DMA2D_ALPHA_MODE_NO_MODIF - * @arg @ref LL_DMA2D_ALPHA_MODE_REPLACE - * @arg @ref LL_DMA2D_ALPHA_MODE_COMBINE - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_FGND_SetAlphaMode(DMA2D_TypeDef *DMA2Dx, uint32_t AphaMode) -{ - MODIFY_REG(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_AM, AphaMode); -} - -/** - * @brief Return DMA2D foreground alpha mode. - * @rmtoll FGPFCCR AM LL_DMA2D_FGND_GetAlphaMode - * @param DMA2Dx DMA2D Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA2D_ALPHA_MODE_NO_MODIF - * @arg @ref LL_DMA2D_ALPHA_MODE_REPLACE - * @arg @ref LL_DMA2D_ALPHA_MODE_COMBINE - */ -__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetAlphaMode(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_AM)); -} - -/** - * @brief Set DMA2D foreground alpha value, expressed on 8 bits ([7:0] bits). - * @rmtoll FGPFCCR ALPHA LL_DMA2D_FGND_SetAlpha - * @param DMA2Dx DMA2D Instance - * @param Alpha Value between Min_Data=0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_FGND_SetAlpha(DMA2D_TypeDef *DMA2Dx, uint32_t Alpha) -{ - MODIFY_REG(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_ALPHA, (Alpha << DMA2D_FGPFCCR_ALPHA_Pos)); -} - -/** - * @brief Return DMA2D foreground alpha value, expressed on 8 bits ([7:0] bits). - * @rmtoll FGPFCCR ALPHA LL_DMA2D_FGND_GetAlpha - * @param DMA2Dx DMA2D Instance - * @retval Alpha value between Min_Data=0 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetAlpha(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_ALPHA) >> DMA2D_FGPFCCR_ALPHA_Pos); -} - - -/** - * @brief Set DMA2D foreground line offset, expressed on 14 bits ([13:0] bits). - * @rmtoll FGOR LO LL_DMA2D_FGND_SetLineOffset - * @param DMA2Dx DMA2D Instance - * @param LineOffset Value between Min_Data=0 and Max_Data=0x3FF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_FGND_SetLineOffset(DMA2D_TypeDef *DMA2Dx, uint32_t LineOffset) -{ - MODIFY_REG(DMA2Dx->FGOR, DMA2D_FGOR_LO, LineOffset); -} - -/** - * @brief Return DMA2D foreground line offset, expressed on 14 bits ([13:0] bits). - * @rmtoll FGOR LO LL_DMA2D_FGND_GetLineOffset - * @param DMA2Dx DMA2D Instance - * @retval Foreground line offset value between Min_Data=0 and Max_Data=0x3FF - */ -__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetLineOffset(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->FGOR, DMA2D_FGOR_LO)); -} - -/** - * @brief Set DMA2D foreground color values, expressed on 24 bits ([23:0] bits). - * @rmtoll FGCOLR RED LL_DMA2D_FGND_SetColor - * @rmtoll FGCOLR GREEN LL_DMA2D_FGND_SetColor - * @rmtoll FGCOLR BLUE LL_DMA2D_FGND_SetColor - * @param DMA2Dx DMA2D Instance - * @param Red Value between Min_Data=0 and Max_Data=0xFF - * @param Green Value between Min_Data=0 and Max_Data=0xFF - * @param Blue Value between Min_Data=0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_FGND_SetColor(DMA2D_TypeDef *DMA2Dx, uint32_t Red, uint32_t Green, uint32_t Blue) -{ - MODIFY_REG(DMA2Dx->FGCOLR, (DMA2D_FGCOLR_RED | DMA2D_FGCOLR_GREEN | DMA2D_FGCOLR_BLUE), \ - ((Red << DMA2D_FGCOLR_RED_Pos) | (Green << DMA2D_FGCOLR_GREEN_Pos) | Blue)); -} - -/** - * @brief Set DMA2D foreground red color value, expressed on 8 bits ([7:0] bits). - * @rmtoll FGCOLR RED LL_DMA2D_FGND_SetRedColor - * @param DMA2Dx DMA2D Instance - * @param Red Value between Min_Data=0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_FGND_SetRedColor(DMA2D_TypeDef *DMA2Dx, uint32_t Red) -{ - MODIFY_REG(DMA2Dx->FGCOLR, DMA2D_FGCOLR_RED, (Red << DMA2D_FGCOLR_RED_Pos)); -} - -/** - * @brief Return DMA2D foreground red color value, expressed on 8 bits ([7:0] bits). - * @rmtoll FGCOLR RED LL_DMA2D_FGND_GetRedColor - * @param DMA2Dx DMA2D Instance - * @retval Red color value between Min_Data=0 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetRedColor(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->FGCOLR, DMA2D_FGCOLR_RED) >> DMA2D_FGCOLR_RED_Pos); -} - -/** - * @brief Set DMA2D foreground green color value, expressed on 8 bits ([7:0] bits). - * @rmtoll FGCOLR GREEN LL_DMA2D_FGND_SetGreenColor - * @param DMA2Dx DMA2D Instance - * @param Green Value between Min_Data=0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_FGND_SetGreenColor(DMA2D_TypeDef *DMA2Dx, uint32_t Green) -{ - MODIFY_REG(DMA2Dx->FGCOLR, DMA2D_FGCOLR_GREEN, (Green << DMA2D_FGCOLR_GREEN_Pos)); -} - -/** - * @brief Return DMA2D foreground green color value, expressed on 8 bits ([7:0] bits). - * @rmtoll FGCOLR GREEN LL_DMA2D_FGND_GetGreenColor - * @param DMA2Dx DMA2D Instance - * @retval Green color value between Min_Data=0 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetGreenColor(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->FGCOLR, DMA2D_FGCOLR_GREEN) >> DMA2D_FGCOLR_GREEN_Pos); -} - -/** - * @brief Set DMA2D foreground blue color value, expressed on 8 bits ([7:0] bits). - * @rmtoll FGCOLR BLUE LL_DMA2D_FGND_SetBlueColor - * @param DMA2Dx DMA2D Instance - * @param Blue Value between Min_Data=0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_FGND_SetBlueColor(DMA2D_TypeDef *DMA2Dx, uint32_t Blue) -{ - MODIFY_REG(DMA2Dx->FGCOLR, DMA2D_FGCOLR_BLUE, Blue); -} - -/** - * @brief Return DMA2D foreground blue color value, expressed on 8 bits ([7:0] bits). - * @rmtoll FGCOLR BLUE LL_DMA2D_FGND_GetBlueColor - * @param DMA2Dx DMA2D Instance - * @retval Blue color value between Min_Data=0 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetBlueColor(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->FGCOLR, DMA2D_FGCOLR_BLUE)); -} - -/** - * @brief Set DMA2D foreground CLUT memory address, expressed on 32 bits ([31:0] bits). - * @rmtoll FGCMAR MA LL_DMA2D_FGND_SetCLUTMemAddr - * @param DMA2Dx DMA2D Instance - * @param CLUTMemoryAddress Value between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_FGND_SetCLUTMemAddr(DMA2D_TypeDef *DMA2Dx, uint32_t CLUTMemoryAddress) -{ - LL_DMA2D_WriteReg(DMA2Dx, FGCMAR, CLUTMemoryAddress); -} - -/** - * @brief Get DMA2D foreground CLUT memory address, expressed on 32 bits ([31:0] bits). - * @rmtoll FGCMAR MA LL_DMA2D_FGND_GetCLUTMemAddr - * @param DMA2Dx DMA2D Instance - * @retval Foreground CLUT memory address value between Min_Data=0 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetCLUTMemAddr(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(LL_DMA2D_ReadReg(DMA2Dx, FGCMAR)); -} - -/** - * @brief Set DMA2D foreground CLUT size, expressed on 8 bits ([7:0] bits). - * @rmtoll FGPFCCR CS LL_DMA2D_FGND_SetCLUTSize - * @param DMA2Dx DMA2D Instance - * @param CLUTSize Value between Min_Data=0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_FGND_SetCLUTSize(DMA2D_TypeDef *DMA2Dx, uint32_t CLUTSize) -{ - MODIFY_REG(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_CS, (CLUTSize << DMA2D_FGPFCCR_CS_Pos)); -} - -/** - * @brief Get DMA2D foreground CLUT size, expressed on 8 bits ([7:0] bits). - * @rmtoll FGPFCCR CS LL_DMA2D_FGND_GetCLUTSize - * @param DMA2Dx DMA2D Instance - * @retval Foreground CLUT size value between Min_Data=0 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetCLUTSize(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_CS) >> DMA2D_FGPFCCR_CS_Pos); -} - -/** - * @brief Set DMA2D foreground CLUT color mode. - * @rmtoll FGPFCCR CCM LL_DMA2D_FGND_SetCLUTColorMode - * @param DMA2Dx DMA2D Instance - * @param CLUTColorMode This parameter can be one of the following values: - * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_ARGB8888 - * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_RGB888 - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_FGND_SetCLUTColorMode(DMA2D_TypeDef *DMA2Dx, uint32_t CLUTColorMode) -{ - MODIFY_REG(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_CCM, CLUTColorMode); -} - -/** - * @brief Return DMA2D foreground CLUT color mode. - * @rmtoll FGPFCCR CCM LL_DMA2D_FGND_GetCLUTColorMode - * @param DMA2Dx DMA2D Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_ARGB8888 - * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_RGB888 - */ -__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetCLUTColorMode(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_CCM)); -} - -/** - * @} - */ - -/** @defgroup DMA2D_LL_EF_BGND_Configuration Background Configuration Functions - * @{ - */ - -/** - * @brief Set DMA2D background memory address, expressed on 32 bits ([31:0] bits). - * @rmtoll BGMAR MA LL_DMA2D_BGND_SetMemAddr - * @param DMA2Dx DMA2D Instance - * @param MemoryAddress Value between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_BGND_SetMemAddr(DMA2D_TypeDef *DMA2Dx, uint32_t MemoryAddress) -{ - LL_DMA2D_WriteReg(DMA2Dx, BGMAR, MemoryAddress); -} - -/** - * @brief Get DMA2D background memory address, expressed on 32 bits ([31:0] bits). - * @rmtoll BGMAR MA LL_DMA2D_BGND_GetMemAddr - * @param DMA2Dx DMA2D Instance - * @retval Background memory address value between Min_Data=0 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetMemAddr(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(LL_DMA2D_ReadReg(DMA2Dx, BGMAR)); -} - -/** - * @brief Enable DMA2D background CLUT loading. - * @rmtoll BGPFCCR START LL_DMA2D_BGND_EnableCLUTLoad - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_BGND_EnableCLUTLoad(DMA2D_TypeDef *DMA2Dx) -{ - SET_BIT(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_START); -} - -/** - * @brief Indicate if DMA2D background CLUT loading is enabled. - * @rmtoll BGPFCCR START LL_DMA2D_BGND_IsEnabledCLUTLoad - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_BGND_IsEnabledCLUTLoad(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_START) == (DMA2D_BGPFCCR_START)) ? 1UL : 0UL); -} - -/** - * @brief Set DMA2D background color mode. - * @rmtoll BGPFCCR CM LL_DMA2D_BGND_SetColorMode - * @param DMA2Dx DMA2D Instance - * @param ColorMode This parameter can be one of the following values: - * @arg @ref LL_DMA2D_INPUT_MODE_ARGB8888 - * @arg @ref LL_DMA2D_INPUT_MODE_RGB888 - * @arg @ref LL_DMA2D_INPUT_MODE_RGB565 - * @arg @ref LL_DMA2D_INPUT_MODE_ARGB1555 - * @arg @ref LL_DMA2D_INPUT_MODE_ARGB4444 - * @arg @ref LL_DMA2D_INPUT_MODE_L8 - * @arg @ref LL_DMA2D_INPUT_MODE_AL44 - * @arg @ref LL_DMA2D_INPUT_MODE_AL88 - * @arg @ref LL_DMA2D_INPUT_MODE_L4 - * @arg @ref LL_DMA2D_INPUT_MODE_A8 - * @arg @ref LL_DMA2D_INPUT_MODE_A4 - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_BGND_SetColorMode(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode) -{ - MODIFY_REG(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_CM, ColorMode); -} - -/** - * @brief Return DMA2D background color mode. - * @rmtoll BGPFCCR CM LL_DMA2D_BGND_GetColorMode - * @param DMA2Dx DMA2D Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA2D_INPUT_MODE_ARGB8888 - * @arg @ref LL_DMA2D_INPUT_MODE_RGB888 - * @arg @ref LL_DMA2D_INPUT_MODE_RGB565 - * @arg @ref LL_DMA2D_INPUT_MODE_ARGB1555 - * @arg @ref LL_DMA2D_INPUT_MODE_ARGB4444 - * @arg @ref LL_DMA2D_INPUT_MODE_L8 - * @arg @ref LL_DMA2D_INPUT_MODE_AL44 - * @arg @ref LL_DMA2D_INPUT_MODE_AL88 - * @arg @ref LL_DMA2D_INPUT_MODE_L4 - * @arg @ref LL_DMA2D_INPUT_MODE_A8 - * @arg @ref LL_DMA2D_INPUT_MODE_A4 - */ -__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetColorMode(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_CM)); -} - -/** - * @brief Set DMA2D background alpha mode. - * @rmtoll BGPFCCR AM LL_DMA2D_BGND_SetAlphaMode - * @param DMA2Dx DMA2D Instance - * @param AphaMode This parameter can be one of the following values: - * @arg @ref LL_DMA2D_ALPHA_MODE_NO_MODIF - * @arg @ref LL_DMA2D_ALPHA_MODE_REPLACE - * @arg @ref LL_DMA2D_ALPHA_MODE_COMBINE - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_BGND_SetAlphaMode(DMA2D_TypeDef *DMA2Dx, uint32_t AphaMode) -{ - MODIFY_REG(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_AM, AphaMode); -} - -/** - * @brief Return DMA2D background alpha mode. - * @rmtoll BGPFCCR AM LL_DMA2D_BGND_GetAlphaMode - * @param DMA2Dx DMA2D Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA2D_ALPHA_MODE_NO_MODIF - * @arg @ref LL_DMA2D_ALPHA_MODE_REPLACE - * @arg @ref LL_DMA2D_ALPHA_MODE_COMBINE - */ -__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetAlphaMode(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_AM)); -} - -/** - * @brief Set DMA2D background alpha value, expressed on 8 bits ([7:0] bits). - * @rmtoll BGPFCCR ALPHA LL_DMA2D_BGND_SetAlpha - * @param DMA2Dx DMA2D Instance - * @param Alpha Value between Min_Data=0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_BGND_SetAlpha(DMA2D_TypeDef *DMA2Dx, uint32_t Alpha) -{ - MODIFY_REG(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_ALPHA, (Alpha << DMA2D_BGPFCCR_ALPHA_Pos)); -} - -/** - * @brief Return DMA2D background alpha value, expressed on 8 bits ([7:0] bits). - * @rmtoll BGPFCCR ALPHA LL_DMA2D_BGND_GetAlpha - * @param DMA2Dx DMA2D Instance - * @retval Alpha value between Min_Data=0 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetAlpha(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_ALPHA) >> DMA2D_BGPFCCR_ALPHA_Pos); -} - - -/** - * @brief Set DMA2D background line offset, expressed on 14 bits ([13:0] bits). - * @rmtoll BGOR LO LL_DMA2D_BGND_SetLineOffset - * @param DMA2Dx DMA2D Instance - * @param LineOffset Value between Min_Data=0 and Max_Data=0x3FF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_BGND_SetLineOffset(DMA2D_TypeDef *DMA2Dx, uint32_t LineOffset) -{ - MODIFY_REG(DMA2Dx->BGOR, DMA2D_BGOR_LO, LineOffset); -} - -/** - * @brief Return DMA2D background line offset, expressed on 14 bits ([13:0] bits). - * @rmtoll BGOR LO LL_DMA2D_BGND_GetLineOffset - * @param DMA2Dx DMA2D Instance - * @retval Background line offset value between Min_Data=0 and Max_Data=0x3FF - */ -__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetLineOffset(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->BGOR, DMA2D_BGOR_LO)); -} - -/** - * @brief Set DMA2D background color values, expressed on 24 bits ([23:0] bits). - * @rmtoll BGCOLR RED LL_DMA2D_BGND_SetColor - * @rmtoll BGCOLR GREEN LL_DMA2D_BGND_SetColor - * @rmtoll BGCOLR BLUE LL_DMA2D_BGND_SetColor - * @param DMA2Dx DMA2D Instance - * @param Red Value between Min_Data=0 and Max_Data=0xFF - * @param Green Value between Min_Data=0 and Max_Data=0xFF - * @param Blue Value between Min_Data=0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_BGND_SetColor(DMA2D_TypeDef *DMA2Dx, uint32_t Red, uint32_t Green, uint32_t Blue) -{ - MODIFY_REG(DMA2Dx->BGCOLR, (DMA2D_BGCOLR_RED | DMA2D_BGCOLR_GREEN | DMA2D_BGCOLR_BLUE), \ - ((Red << DMA2D_BGCOLR_RED_Pos) | (Green << DMA2D_BGCOLR_GREEN_Pos) | Blue)); -} - -/** - * @brief Set DMA2D background red color value, expressed on 8 bits ([7:0] bits). - * @rmtoll BGCOLR RED LL_DMA2D_BGND_SetRedColor - * @param DMA2Dx DMA2D Instance - * @param Red Value between Min_Data=0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_BGND_SetRedColor(DMA2D_TypeDef *DMA2Dx, uint32_t Red) -{ - MODIFY_REG(DMA2Dx->BGCOLR, DMA2D_BGCOLR_RED, (Red << DMA2D_BGCOLR_RED_Pos)); -} - -/** - * @brief Return DMA2D background red color value, expressed on 8 bits ([7:0] bits). - * @rmtoll BGCOLR RED LL_DMA2D_BGND_GetRedColor - * @param DMA2Dx DMA2D Instance - * @retval Red color value between Min_Data=0 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetRedColor(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->BGCOLR, DMA2D_BGCOLR_RED) >> DMA2D_BGCOLR_RED_Pos); -} - -/** - * @brief Set DMA2D background green color value, expressed on 8 bits ([7:0] bits). - * @rmtoll BGCOLR GREEN LL_DMA2D_BGND_SetGreenColor - * @param DMA2Dx DMA2D Instance - * @param Green Value between Min_Data=0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_BGND_SetGreenColor(DMA2D_TypeDef *DMA2Dx, uint32_t Green) -{ - MODIFY_REG(DMA2Dx->BGCOLR, DMA2D_BGCOLR_GREEN, (Green << DMA2D_BGCOLR_GREEN_Pos)); -} - -/** - * @brief Return DMA2D background green color value, expressed on 8 bits ([7:0] bits). - * @rmtoll BGCOLR GREEN LL_DMA2D_BGND_GetGreenColor - * @param DMA2Dx DMA2D Instance - * @retval Green color value between Min_Data=0 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetGreenColor(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->BGCOLR, DMA2D_BGCOLR_GREEN) >> DMA2D_BGCOLR_GREEN_Pos); -} - -/** - * @brief Set DMA2D background blue color value, expressed on 8 bits ([7:0] bits). - * @rmtoll BGCOLR BLUE LL_DMA2D_BGND_SetBlueColor - * @param DMA2Dx DMA2D Instance - * @param Blue Value between Min_Data=0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_BGND_SetBlueColor(DMA2D_TypeDef *DMA2Dx, uint32_t Blue) -{ - MODIFY_REG(DMA2Dx->BGCOLR, DMA2D_BGCOLR_BLUE, Blue); -} - -/** - * @brief Return DMA2D background blue color value, expressed on 8 bits ([7:0] bits). - * @rmtoll BGCOLR BLUE LL_DMA2D_BGND_GetBlueColor - * @param DMA2Dx DMA2D Instance - * @retval Blue color value between Min_Data=0 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetBlueColor(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->BGCOLR, DMA2D_BGCOLR_BLUE)); -} - -/** - * @brief Set DMA2D background CLUT memory address, expressed on 32 bits ([31:0] bits). - * @rmtoll BGCMAR MA LL_DMA2D_BGND_SetCLUTMemAddr - * @param DMA2Dx DMA2D Instance - * @param CLUTMemoryAddress Value between Min_Data=0 and Max_Data=0xFFFFFFFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_BGND_SetCLUTMemAddr(DMA2D_TypeDef *DMA2Dx, uint32_t CLUTMemoryAddress) -{ - LL_DMA2D_WriteReg(DMA2Dx, BGCMAR, CLUTMemoryAddress); -} - -/** - * @brief Get DMA2D background CLUT memory address, expressed on 32 bits ([31:0] bits). - * @rmtoll BGCMAR MA LL_DMA2D_BGND_GetCLUTMemAddr - * @param DMA2Dx DMA2D Instance - * @retval Background CLUT memory address value between Min_Data=0 and Max_Data=0xFFFFFFFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetCLUTMemAddr(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(LL_DMA2D_ReadReg(DMA2Dx, BGCMAR)); -} - -/** - * @brief Set DMA2D background CLUT size, expressed on 8 bits ([7:0] bits). - * @rmtoll BGPFCCR CS LL_DMA2D_BGND_SetCLUTSize - * @param DMA2Dx DMA2D Instance - * @param CLUTSize Value between Min_Data=0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_BGND_SetCLUTSize(DMA2D_TypeDef *DMA2Dx, uint32_t CLUTSize) -{ - MODIFY_REG(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_CS, (CLUTSize << DMA2D_BGPFCCR_CS_Pos)); -} - -/** - * @brief Get DMA2D background CLUT size, expressed on 8 bits ([7:0] bits). - * @rmtoll BGPFCCR CS LL_DMA2D_BGND_GetCLUTSize - * @param DMA2Dx DMA2D Instance - * @retval Background CLUT size value between Min_Data=0 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetCLUTSize(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_CS) >> DMA2D_BGPFCCR_CS_Pos); -} - -/** - * @brief Set DMA2D background CLUT color mode. - * @rmtoll BGPFCCR CCM LL_DMA2D_BGND_SetCLUTColorMode - * @param DMA2Dx DMA2D Instance - * @param CLUTColorMode This parameter can be one of the following values: - * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_ARGB8888 - * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_RGB888 - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_BGND_SetCLUTColorMode(DMA2D_TypeDef *DMA2Dx, uint32_t CLUTColorMode) -{ - MODIFY_REG(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_CCM, CLUTColorMode); -} - -/** - * @brief Return DMA2D background CLUT color mode. - * @rmtoll BGPFCCR CCM LL_DMA2D_BGND_GetCLUTColorMode - * @param DMA2Dx DMA2D Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_ARGB8888 - * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_RGB888 - */ -__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetCLUTColorMode(const DMA2D_TypeDef *DMA2Dx) -{ - return (uint32_t)(READ_BIT(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_CCM)); -} - -/** - * @} - */ - -/** - * @} - */ - - -/** @defgroup DMA2D_LL_EF_FLAG_MANAGEMENT Flag Management - * @{ - */ - -/** - * @brief Check if the DMA2D Configuration Error Interrupt Flag is set or not - * @rmtoll ISR CEIF LL_DMA2D_IsActiveFlag_CE - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsActiveFlag_CE(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->ISR, DMA2D_ISR_CEIF) == (DMA2D_ISR_CEIF)) ? 1UL : 0UL); -} - -/** - * @brief Check if the DMA2D CLUT Transfer Complete Interrupt Flag is set or not - * @rmtoll ISR CTCIF LL_DMA2D_IsActiveFlag_CTC - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsActiveFlag_CTC(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->ISR, DMA2D_ISR_CTCIF) == (DMA2D_ISR_CTCIF)) ? 1UL : 0UL); -} - -/** - * @brief Check if the DMA2D CLUT Access Error Interrupt Flag is set or not - * @rmtoll ISR CAEIF LL_DMA2D_IsActiveFlag_CAE - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsActiveFlag_CAE(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->ISR, DMA2D_ISR_CAEIF) == (DMA2D_ISR_CAEIF)) ? 1UL : 0UL); -} - -/** - * @brief Check if the DMA2D Transfer Watermark Interrupt Flag is set or not - * @rmtoll ISR TWIF LL_DMA2D_IsActiveFlag_TW - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsActiveFlag_TW(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->ISR, DMA2D_ISR_TWIF) == (DMA2D_ISR_TWIF)) ? 1UL : 0UL); -} - -/** - * @brief Check if the DMA2D Transfer Complete Interrupt Flag is set or not - * @rmtoll ISR TCIF LL_DMA2D_IsActiveFlag_TC - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsActiveFlag_TC(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->ISR, DMA2D_ISR_TCIF) == (DMA2D_ISR_TCIF)) ? 1UL : 0UL); -} - -/** - * @brief Check if the DMA2D Transfer Error Interrupt Flag is set or not - * @rmtoll ISR TEIF LL_DMA2D_IsActiveFlag_TE - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsActiveFlag_TE(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->ISR, DMA2D_ISR_TEIF) == (DMA2D_ISR_TEIF)) ? 1UL : 0UL); -} - -/** - * @brief Clear DMA2D Configuration Error Interrupt Flag - * @rmtoll IFCR CCEIF LL_DMA2D_ClearFlag_CE - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_ClearFlag_CE(DMA2D_TypeDef *DMA2Dx) -{ - WRITE_REG(DMA2Dx->IFCR, DMA2D_IFCR_CCEIF); -} - -/** - * @brief Clear DMA2D CLUT Transfer Complete Interrupt Flag - * @rmtoll IFCR CCTCIF LL_DMA2D_ClearFlag_CTC - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_ClearFlag_CTC(DMA2D_TypeDef *DMA2Dx) -{ - WRITE_REG(DMA2Dx->IFCR, DMA2D_IFCR_CCTCIF); -} - -/** - * @brief Clear DMA2D CLUT Access Error Interrupt Flag - * @rmtoll IFCR CAECIF LL_DMA2D_ClearFlag_CAE - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_ClearFlag_CAE(DMA2D_TypeDef *DMA2Dx) -{ - WRITE_REG(DMA2Dx->IFCR, DMA2D_IFCR_CAECIF); -} - -/** - * @brief Clear DMA2D Transfer Watermark Interrupt Flag - * @rmtoll IFCR CTWIF LL_DMA2D_ClearFlag_TW - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_ClearFlag_TW(DMA2D_TypeDef *DMA2Dx) -{ - WRITE_REG(DMA2Dx->IFCR, DMA2D_IFCR_CTWIF); -} - -/** - * @brief Clear DMA2D Transfer Complete Interrupt Flag - * @rmtoll IFCR CTCIF LL_DMA2D_ClearFlag_TC - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_ClearFlag_TC(DMA2D_TypeDef *DMA2Dx) -{ - WRITE_REG(DMA2Dx->IFCR, DMA2D_IFCR_CTCIF); -} - -/** - * @brief Clear DMA2D Transfer Error Interrupt Flag - * @rmtoll IFCR CTEIF LL_DMA2D_ClearFlag_TE - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_ClearFlag_TE(DMA2D_TypeDef *DMA2Dx) -{ - WRITE_REG(DMA2Dx->IFCR, DMA2D_IFCR_CTEIF); -} - -/** - * @} - */ - -/** @defgroup DMA2D_LL_EF_IT_MANAGEMENT Interruption Management - * @{ - */ - -/** - * @brief Enable Configuration Error Interrupt - * @rmtoll CR CEIE LL_DMA2D_EnableIT_CE - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_EnableIT_CE(DMA2D_TypeDef *DMA2Dx) -{ - SET_BIT(DMA2Dx->CR, DMA2D_CR_CEIE); -} - -/** - * @brief Enable CLUT Transfer Complete Interrupt - * @rmtoll CR CTCIE LL_DMA2D_EnableIT_CTC - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_EnableIT_CTC(DMA2D_TypeDef *DMA2Dx) -{ - SET_BIT(DMA2Dx->CR, DMA2D_CR_CTCIE); -} - -/** - * @brief Enable CLUT Access Error Interrupt - * @rmtoll CR CAEIE LL_DMA2D_EnableIT_CAE - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_EnableIT_CAE(DMA2D_TypeDef *DMA2Dx) -{ - SET_BIT(DMA2Dx->CR, DMA2D_CR_CAEIE); -} - -/** - * @brief Enable Transfer Watermark Interrupt - * @rmtoll CR TWIE LL_DMA2D_EnableIT_TW - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_EnableIT_TW(DMA2D_TypeDef *DMA2Dx) -{ - SET_BIT(DMA2Dx->CR, DMA2D_CR_TWIE); -} - -/** - * @brief Enable Transfer Complete Interrupt - * @rmtoll CR TCIE LL_DMA2D_EnableIT_TC - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_EnableIT_TC(DMA2D_TypeDef *DMA2Dx) -{ - SET_BIT(DMA2Dx->CR, DMA2D_CR_TCIE); -} - -/** - * @brief Enable Transfer Error Interrupt - * @rmtoll CR TEIE LL_DMA2D_EnableIT_TE - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_EnableIT_TE(DMA2D_TypeDef *DMA2Dx) -{ - SET_BIT(DMA2Dx->CR, DMA2D_CR_TEIE); -} - -/** - * @brief Disable Configuration Error Interrupt - * @rmtoll CR CEIE LL_DMA2D_DisableIT_CE - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_DisableIT_CE(DMA2D_TypeDef *DMA2Dx) -{ - CLEAR_BIT(DMA2Dx->CR, DMA2D_CR_CEIE); -} - -/** - * @brief Disable CLUT Transfer Complete Interrupt - * @rmtoll CR CTCIE LL_DMA2D_DisableIT_CTC - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_DisableIT_CTC(DMA2D_TypeDef *DMA2Dx) -{ - CLEAR_BIT(DMA2Dx->CR, DMA2D_CR_CTCIE); -} - -/** - * @brief Disable CLUT Access Error Interrupt - * @rmtoll CR CAEIE LL_DMA2D_DisableIT_CAE - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_DisableIT_CAE(DMA2D_TypeDef *DMA2Dx) -{ - CLEAR_BIT(DMA2Dx->CR, DMA2D_CR_CAEIE); -} - -/** - * @brief Disable Transfer Watermark Interrupt - * @rmtoll CR TWIE LL_DMA2D_DisableIT_TW - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_DisableIT_TW(DMA2D_TypeDef *DMA2Dx) -{ - CLEAR_BIT(DMA2Dx->CR, DMA2D_CR_TWIE); -} - -/** - * @brief Disable Transfer Complete Interrupt - * @rmtoll CR TCIE LL_DMA2D_DisableIT_TC - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_DisableIT_TC(DMA2D_TypeDef *DMA2Dx) -{ - CLEAR_BIT(DMA2Dx->CR, DMA2D_CR_TCIE); -} - -/** - * @brief Disable Transfer Error Interrupt - * @rmtoll CR TEIE LL_DMA2D_DisableIT_TE - * @param DMA2Dx DMA2D Instance - * @retval None - */ -__STATIC_INLINE void LL_DMA2D_DisableIT_TE(DMA2D_TypeDef *DMA2Dx) -{ - CLEAR_BIT(DMA2Dx->CR, DMA2D_CR_TEIE); -} - -/** - * @brief Check if the DMA2D Configuration Error interrupt source is enabled or disabled. - * @rmtoll CR CEIE LL_DMA2D_IsEnabledIT_CE - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsEnabledIT_CE(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->CR, DMA2D_CR_CEIE) == (DMA2D_CR_CEIE)) ? 1UL : 0UL); -} - -/** - * @brief Check if the DMA2D CLUT Transfer Complete interrupt source is enabled or disabled. - * @rmtoll CR CTCIE LL_DMA2D_IsEnabledIT_CTC - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsEnabledIT_CTC(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->CR, DMA2D_CR_CTCIE) == (DMA2D_CR_CTCIE)) ? 1UL : 0UL); -} - -/** - * @brief Check if the DMA2D CLUT Access Error interrupt source is enabled or disabled. - * @rmtoll CR CAEIE LL_DMA2D_IsEnabledIT_CAE - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsEnabledIT_CAE(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->CR, DMA2D_CR_CAEIE) == (DMA2D_CR_CAEIE)) ? 1UL : 0UL); -} - -/** - * @brief Check if the DMA2D Transfer Watermark interrupt source is enabled or disabled. - * @rmtoll CR TWIE LL_DMA2D_IsEnabledIT_TW - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsEnabledIT_TW(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->CR, DMA2D_CR_TWIE) == (DMA2D_CR_TWIE)) ? 1UL : 0UL); -} - -/** - * @brief Check if the DMA2D Transfer Complete interrupt source is enabled or disabled. - * @rmtoll CR TCIE LL_DMA2D_IsEnabledIT_TC - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsEnabledIT_TC(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->CR, DMA2D_CR_TCIE) == (DMA2D_CR_TCIE)) ? 1UL : 0UL); -} - -/** - * @brief Check if the DMA2D Transfer Error interrupt source is enabled or disabled. - * @rmtoll CR TEIE LL_DMA2D_IsEnabledIT_TE - * @param DMA2Dx DMA2D Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_DMA2D_IsEnabledIT_TE(const DMA2D_TypeDef *DMA2Dx) -{ - return ((READ_BIT(DMA2Dx->CR, DMA2D_CR_TEIE) == (DMA2D_CR_TEIE)) ? 1UL : 0UL); -} - - - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup DMA2D_LL_EF_Init_Functions Initialization and De-initialization Functions - * @{ - */ - -ErrorStatus LL_DMA2D_DeInit(const DMA2D_TypeDef *DMA2Dx); -ErrorStatus LL_DMA2D_Init(DMA2D_TypeDef *DMA2Dx, LL_DMA2D_InitTypeDef *DMA2D_InitStruct); -void LL_DMA2D_StructInit(LL_DMA2D_InitTypeDef *DMA2D_InitStruct); -void LL_DMA2D_ConfigLayer(DMA2D_TypeDef *DMA2Dx, LL_DMA2D_LayerCfgTypeDef *DMA2D_LayerCfg, uint32_t LayerIdx); -void LL_DMA2D_LayerCfgStructInit(LL_DMA2D_LayerCfgTypeDef *DMA2D_LayerCfg); -void LL_DMA2D_ConfigOutputColor(DMA2D_TypeDef *DMA2Dx, LL_DMA2D_ColorTypeDef *DMA2D_ColorStruct); -uint32_t LL_DMA2D_GetOutputBlueColor(const DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode); -uint32_t LL_DMA2D_GetOutputGreenColor(const DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode); -uint32_t LL_DMA2D_GetOutputRedColor(const DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode); -uint32_t LL_DMA2D_GetOutputAlphaColor(const DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode); -void LL_DMA2D_ConfigSize(DMA2D_TypeDef *DMA2Dx, uint32_t NbrOfLines, uint32_t NbrOfPixelsPerLines); - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined (DMA2D) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_LL_DMA2D_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h deleted file mode 100644 index 65ab691..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h +++ /dev/null @@ -1,954 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_exti.h - * @author MCD Application Team - * @brief Header file of EXTI LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS.Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_EXTI_H -#define __STM32F4xx_LL_EXTI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (EXTI) - -/** @defgroup EXTI_LL EXTI - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private Macros ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup EXTI_LL_Private_Macros EXTI Private Macros - * @{ - */ -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup EXTI_LL_ES_INIT EXTI Exported Init structure - * @{ - */ -typedef struct -{ - - uint32_t Line_0_31; /*!< Specifies the EXTI lines to be enabled or disabled for Lines in range 0 to 31 - This parameter can be any combination of @ref EXTI_LL_EC_LINE */ - - FunctionalState LineCommand; /*!< Specifies the new state of the selected EXTI lines. - This parameter can be set either to ENABLE or DISABLE */ - - uint8_t Mode; /*!< Specifies the mode for the EXTI lines. - This parameter can be a value of @ref EXTI_LL_EC_MODE. */ - - uint8_t Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. - This parameter can be a value of @ref EXTI_LL_EC_TRIGGER. */ -} LL_EXTI_InitTypeDef; - -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup EXTI_LL_Exported_Constants EXTI Exported Constants - * @{ - */ - -/** @defgroup EXTI_LL_EC_LINE LINE - * @{ - */ -#define LL_EXTI_LINE_0 EXTI_IMR_IM0 /*!< Extended line 0 */ -#define LL_EXTI_LINE_1 EXTI_IMR_IM1 /*!< Extended line 1 */ -#define LL_EXTI_LINE_2 EXTI_IMR_IM2 /*!< Extended line 2 */ -#define LL_EXTI_LINE_3 EXTI_IMR_IM3 /*!< Extended line 3 */ -#define LL_EXTI_LINE_4 EXTI_IMR_IM4 /*!< Extended line 4 */ -#define LL_EXTI_LINE_5 EXTI_IMR_IM5 /*!< Extended line 5 */ -#define LL_EXTI_LINE_6 EXTI_IMR_IM6 /*!< Extended line 6 */ -#define LL_EXTI_LINE_7 EXTI_IMR_IM7 /*!< Extended line 7 */ -#define LL_EXTI_LINE_8 EXTI_IMR_IM8 /*!< Extended line 8 */ -#define LL_EXTI_LINE_9 EXTI_IMR_IM9 /*!< Extended line 9 */ -#define LL_EXTI_LINE_10 EXTI_IMR_IM10 /*!< Extended line 10 */ -#define LL_EXTI_LINE_11 EXTI_IMR_IM11 /*!< Extended line 11 */ -#define LL_EXTI_LINE_12 EXTI_IMR_IM12 /*!< Extended line 12 */ -#define LL_EXTI_LINE_13 EXTI_IMR_IM13 /*!< Extended line 13 */ -#define LL_EXTI_LINE_14 EXTI_IMR_IM14 /*!< Extended line 14 */ -#define LL_EXTI_LINE_15 EXTI_IMR_IM15 /*!< Extended line 15 */ -#if defined(EXTI_IMR_IM16) -#define LL_EXTI_LINE_16 EXTI_IMR_IM16 /*!< Extended line 16 */ -#endif -#define LL_EXTI_LINE_17 EXTI_IMR_IM17 /*!< Extended line 17 */ -#if defined(EXTI_IMR_IM18) -#define LL_EXTI_LINE_18 EXTI_IMR_IM18 /*!< Extended line 18 */ -#endif -#define LL_EXTI_LINE_19 EXTI_IMR_IM19 /*!< Extended line 19 */ -#if defined(EXTI_IMR_IM20) -#define LL_EXTI_LINE_20 EXTI_IMR_IM20 /*!< Extended line 20 */ -#endif -#if defined(EXTI_IMR_IM21) -#define LL_EXTI_LINE_21 EXTI_IMR_IM21 /*!< Extended line 21 */ -#endif -#if defined(EXTI_IMR_IM22) -#define LL_EXTI_LINE_22 EXTI_IMR_IM22 /*!< Extended line 22 */ -#endif -#if defined(EXTI_IMR_IM23) -#define LL_EXTI_LINE_23 EXTI_IMR_IM23 /*!< Extended line 23 */ -#endif -#if defined(EXTI_IMR_IM24) -#define LL_EXTI_LINE_24 EXTI_IMR_IM24 /*!< Extended line 24 */ -#endif -#if defined(EXTI_IMR_IM25) -#define LL_EXTI_LINE_25 EXTI_IMR_IM25 /*!< Extended line 25 */ -#endif -#if defined(EXTI_IMR_IM26) -#define LL_EXTI_LINE_26 EXTI_IMR_IM26 /*!< Extended line 26 */ -#endif -#if defined(EXTI_IMR_IM27) -#define LL_EXTI_LINE_27 EXTI_IMR_IM27 /*!< Extended line 27 */ -#endif -#if defined(EXTI_IMR_IM28) -#define LL_EXTI_LINE_28 EXTI_IMR_IM28 /*!< Extended line 28 */ -#endif -#if defined(EXTI_IMR_IM29) -#define LL_EXTI_LINE_29 EXTI_IMR_IM29 /*!< Extended line 29 */ -#endif -#if defined(EXTI_IMR_IM30) -#define LL_EXTI_LINE_30 EXTI_IMR_IM30 /*!< Extended line 30 */ -#endif -#if defined(EXTI_IMR_IM31) -#define LL_EXTI_LINE_31 EXTI_IMR_IM31 /*!< Extended line 31 */ -#endif -#define LL_EXTI_LINE_ALL_0_31 EXTI_IMR_IM /*!< All Extended line not reserved*/ - - -#define LL_EXTI_LINE_ALL ((uint32_t)0xFFFFFFFFU) /*!< All Extended line */ - -#if defined(USE_FULL_LL_DRIVER) -#define LL_EXTI_LINE_NONE ((uint32_t)0x00000000U) /*!< None Extended line */ -#endif /*USE_FULL_LL_DRIVER*/ - -/** - * @} - */ -#if defined(USE_FULL_LL_DRIVER) - -/** @defgroup EXTI_LL_EC_MODE Mode - * @{ - */ -#define LL_EXTI_MODE_IT ((uint8_t)0x00U) /*!< Interrupt Mode */ -#define LL_EXTI_MODE_EVENT ((uint8_t)0x01U) /*!< Event Mode */ -#define LL_EXTI_MODE_IT_EVENT ((uint8_t)0x02U) /*!< Interrupt & Event Mode */ -/** - * @} - */ - -/** @defgroup EXTI_LL_EC_TRIGGER Edge Trigger - * @{ - */ -#define LL_EXTI_TRIGGER_NONE ((uint8_t)0x00U) /*!< No Trigger Mode */ -#define LL_EXTI_TRIGGER_RISING ((uint8_t)0x01U) /*!< Trigger Rising Mode */ -#define LL_EXTI_TRIGGER_FALLING ((uint8_t)0x02U) /*!< Trigger Falling Mode */ -#define LL_EXTI_TRIGGER_RISING_FALLING ((uint8_t)0x03U) /*!< Trigger Rising & Falling Mode */ - -/** - * @} - */ - - -#endif /*USE_FULL_LL_DRIVER*/ - - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup EXTI_LL_Exported_Macros EXTI Exported Macros - * @{ - */ - -/** @defgroup EXTI_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in EXTI register - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_EXTI_WriteReg(__REG__, __VALUE__) WRITE_REG(EXTI->__REG__, (__VALUE__)) - -/** - * @brief Read a value in EXTI register - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_EXTI_ReadReg(__REG__) READ_REG(EXTI->__REG__) -/** - * @} - */ - - -/** - * @} - */ - - - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup EXTI_LL_Exported_Functions EXTI Exported Functions - * @{ - */ -/** @defgroup EXTI_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable ExtiLine Interrupt request for Lines in range 0 to 31 - * @note The reset value for the direct or internal lines (see RM) - * is set to 1 in order to enable the interrupt by default. - * Bits are set automatically at Power on. - * @rmtoll IMR IMx LL_EXTI_EnableIT_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_EnableIT_0_31(uint32_t ExtiLine) -{ - SET_BIT(EXTI->IMR, ExtiLine); -} - -/** - * @brief Disable ExtiLine Interrupt request for Lines in range 0 to 31 - * @note The reset value for the direct or internal lines (see RM) - * is set to 1 in order to enable the interrupt by default. - * Bits are set automatically at Power on. - * @rmtoll IMR IMx LL_EXTI_DisableIT_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_DisableIT_0_31(uint32_t ExtiLine) -{ - CLEAR_BIT(EXTI->IMR, ExtiLine); -} - - -/** - * @brief Indicate if ExtiLine Interrupt request is enabled for Lines in range 0 to 31 - * @note The reset value for the direct or internal lines (see RM) - * is set to 1 in order to enable the interrupt by default. - * Bits are set automatically at Power on. - * @rmtoll IMR IMx LL_EXTI_IsEnabledIT_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_EXTI_IsEnabledIT_0_31(uint32_t ExtiLine) -{ - return (READ_BIT(EXTI->IMR, ExtiLine) == (ExtiLine)); -} - - -/** - * @} - */ - -/** @defgroup EXTI_LL_EF_Event_Management Event_Management - * @{ - */ - -/** - * @brief Enable ExtiLine Event request for Lines in range 0 to 31 - * @rmtoll EMR EMx LL_EXTI_EnableEvent_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_EnableEvent_0_31(uint32_t ExtiLine) -{ - SET_BIT(EXTI->EMR, ExtiLine); - -} - - -/** - * @brief Disable ExtiLine Event request for Lines in range 0 to 31 - * @rmtoll EMR EMx LL_EXTI_DisableEvent_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_DisableEvent_0_31(uint32_t ExtiLine) -{ - CLEAR_BIT(EXTI->EMR, ExtiLine); -} - - -/** - * @brief Indicate if ExtiLine Event request is enabled for Lines in range 0 to 31 - * @rmtoll EMR EMx LL_EXTI_IsEnabledEvent_0_31 - * @param ExtiLine This parameter can be one of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_17 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @arg @ref LL_EXTI_LINE_23(*) - * @arg @ref LL_EXTI_LINE_ALL_0_31 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_EXTI_IsEnabledEvent_0_31(uint32_t ExtiLine) -{ - return (READ_BIT(EXTI->EMR, ExtiLine) == (ExtiLine)); - -} - - -/** - * @} - */ - -/** @defgroup EXTI_LL_EF_Rising_Trigger_Management Rising_Trigger_Management - * @{ - */ - -/** - * @brief Enable ExtiLine Rising Edge Trigger for Lines in range 0 to 31 - * @note The configurable wakeup lines are edge-triggered. No glitch must be - * generated on these lines. If a rising edge on a configurable interrupt - * line occurs during a write operation in the EXTI_RTSR register, the - * pending bit is not set. - * Rising and falling edge triggers can be set for - * the same interrupt line. In this case, both generate a trigger - * condition. - * @rmtoll RTSR RTx LL_EXTI_EnableRisingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_EnableRisingTrig_0_31(uint32_t ExtiLine) -{ - SET_BIT(EXTI->RTSR, ExtiLine); - -} - - -/** - * @brief Disable ExtiLine Rising Edge Trigger for Lines in range 0 to 31 - * @note The configurable wakeup lines are edge-triggered. No glitch must be - * generated on these lines. If a rising edge on a configurable interrupt - * line occurs during a write operation in the EXTI_RTSR register, the - * pending bit is not set. - * Rising and falling edge triggers can be set for - * the same interrupt line. In this case, both generate a trigger - * condition. - * @rmtoll RTSR RTx LL_EXTI_DisableRisingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_DisableRisingTrig_0_31(uint32_t ExtiLine) -{ - CLEAR_BIT(EXTI->RTSR, ExtiLine); - -} - - -/** - * @brief Check if rising edge trigger is enabled for Lines in range 0 to 31 - * @rmtoll RTSR RTx LL_EXTI_IsEnabledRisingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_EXTI_IsEnabledRisingTrig_0_31(uint32_t ExtiLine) -{ - return (READ_BIT(EXTI->RTSR, ExtiLine) == (ExtiLine)); -} - - -/** - * @} - */ - -/** @defgroup EXTI_LL_EF_Falling_Trigger_Management Falling_Trigger_Management - * @{ - */ - -/** - * @brief Enable ExtiLine Falling Edge Trigger for Lines in range 0 to 31 - * @note The configurable wakeup lines are edge-triggered. No glitch must be - * generated on these lines. If a falling edge on a configurable interrupt - * line occurs during a write operation in the EXTI_FTSR register, the - * pending bit is not set. - * Rising and falling edge triggers can be set for - * the same interrupt line. In this case, both generate a trigger - * condition. - * @rmtoll FTSR FTx LL_EXTI_EnableFallingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_EnableFallingTrig_0_31(uint32_t ExtiLine) -{ - SET_BIT(EXTI->FTSR, ExtiLine); -} - - -/** - * @brief Disable ExtiLine Falling Edge Trigger for Lines in range 0 to 31 - * @note The configurable wakeup lines are edge-triggered. No glitch must be - * generated on these lines. If a Falling edge on a configurable interrupt - * line occurs during a write operation in the EXTI_FTSR register, the - * pending bit is not set. - * Rising and falling edge triggers can be set for the same interrupt line. - * In this case, both generate a trigger condition. - * @rmtoll FTSR FTx LL_EXTI_DisableFallingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_DisableFallingTrig_0_31(uint32_t ExtiLine) -{ - CLEAR_BIT(EXTI->FTSR, ExtiLine); -} - - -/** - * @brief Check if falling edge trigger is enabled for Lines in range 0 to 31 - * @rmtoll FTSR FTx LL_EXTI_IsEnabledFallingTrig_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_EXTI_IsEnabledFallingTrig_0_31(uint32_t ExtiLine) -{ - return (READ_BIT(EXTI->FTSR, ExtiLine) == (ExtiLine)); -} - - -/** - * @} - */ - -/** @defgroup EXTI_LL_EF_Software_Interrupt_Management Software_Interrupt_Management - * @{ - */ - -/** - * @brief Generate a software Interrupt Event for Lines in range 0 to 31 - * @note If the interrupt is enabled on this line in the EXTI_IMR, writing a 1 to - * this bit when it is at '0' sets the corresponding pending bit in EXTI_PR - * resulting in an interrupt request generation. - * This bit is cleared by clearing the corresponding bit in the EXTI_PR - * register (by writing a 1 into the bit) - * @rmtoll SWIER SWIx LL_EXTI_GenerateSWI_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_GenerateSWI_0_31(uint32_t ExtiLine) -{ - SET_BIT(EXTI->SWIER, ExtiLine); -} - - -/** - * @} - */ - -/** @defgroup EXTI_LL_EF_Flag_Management Flag_Management - * @{ - */ - -/** - * @brief Check if the ExtLine Flag is set or not for Lines in range 0 to 31 - * @note This bit is set when the selected edge event arrives on the interrupt - * line. This bit is cleared by writing a 1 to the bit. - * @rmtoll PR PIFx LL_EXTI_IsActiveFlag_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_EXTI_IsActiveFlag_0_31(uint32_t ExtiLine) -{ - return (READ_BIT(EXTI->PR, ExtiLine) == (ExtiLine)); -} - - -/** - * @brief Read ExtLine Combination Flag for Lines in range 0 to 31 - * @note This bit is set when the selected edge event arrives on the interrupt - * line. This bit is cleared by writing a 1 to the bit. - * @rmtoll PR PIFx LL_EXTI_ReadFlag_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval @note This bit is set when the selected edge event arrives on the interrupt - */ -__STATIC_INLINE uint32_t LL_EXTI_ReadFlag_0_31(uint32_t ExtiLine) -{ - return (uint32_t)(READ_BIT(EXTI->PR, ExtiLine)); -} - - -/** - * @brief Clear ExtLine Flags for Lines in range 0 to 31 - * @note This bit is set when the selected edge event arrives on the interrupt - * line. This bit is cleared by writing a 1 to the bit. - * @rmtoll PR PIFx LL_EXTI_ClearFlag_0_31 - * @param ExtiLine This parameter can be a combination of the following values: - * @arg @ref LL_EXTI_LINE_0 - * @arg @ref LL_EXTI_LINE_1 - * @arg @ref LL_EXTI_LINE_2 - * @arg @ref LL_EXTI_LINE_3 - * @arg @ref LL_EXTI_LINE_4 - * @arg @ref LL_EXTI_LINE_5 - * @arg @ref LL_EXTI_LINE_6 - * @arg @ref LL_EXTI_LINE_7 - * @arg @ref LL_EXTI_LINE_8 - * @arg @ref LL_EXTI_LINE_9 - * @arg @ref LL_EXTI_LINE_10 - * @arg @ref LL_EXTI_LINE_11 - * @arg @ref LL_EXTI_LINE_12 - * @arg @ref LL_EXTI_LINE_13 - * @arg @ref LL_EXTI_LINE_14 - * @arg @ref LL_EXTI_LINE_15 - * @arg @ref LL_EXTI_LINE_16 - * @arg @ref LL_EXTI_LINE_18 - * @arg @ref LL_EXTI_LINE_19(*) - * @arg @ref LL_EXTI_LINE_20(*) - * @arg @ref LL_EXTI_LINE_21 - * @arg @ref LL_EXTI_LINE_22 - * @note (*): Available in some devices - * @note Please check each device line mapping for EXTI Line availability - * @retval None - */ -__STATIC_INLINE void LL_EXTI_ClearFlag_0_31(uint32_t ExtiLine) -{ - WRITE_REG(EXTI->PR, ExtiLine); -} - - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup EXTI_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -uint32_t LL_EXTI_Init(LL_EXTI_InitTypeDef *EXTI_InitStruct); -uint32_t LL_EXTI_DeInit(void); -void LL_EXTI_StructInit(LL_EXTI_InitTypeDef *EXTI_InitStruct); - - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* EXTI */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_EXTI_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h deleted file mode 100644 index 1085d81..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h +++ /dev/null @@ -1,1423 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_fmc.h - * @author MCD Application Team - * @brief Header file of FMC HAL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_LL_FMC_H -#define STM32F4xx_LL_FMC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FMC_LL - * @{ - */ - -/** @addtogroup FMC_LL_Private_Macros - * @{ - */ -#if defined(FMC_Bank1) - -#define IS_FMC_NORSRAM_BANK(__BANK__) (((__BANK__) == FMC_NORSRAM_BANK1) || \ - ((__BANK__) == FMC_NORSRAM_BANK2) || \ - ((__BANK__) == FMC_NORSRAM_BANK3) || \ - ((__BANK__) == FMC_NORSRAM_BANK4)) -#define IS_FMC_MUX(__MUX__) (((__MUX__) == FMC_DATA_ADDRESS_MUX_DISABLE) || \ - ((__MUX__) == FMC_DATA_ADDRESS_MUX_ENABLE)) -#define IS_FMC_MEMORY(__MEMORY__) (((__MEMORY__) == FMC_MEMORY_TYPE_SRAM) || \ - ((__MEMORY__) == FMC_MEMORY_TYPE_PSRAM)|| \ - ((__MEMORY__) == FMC_MEMORY_TYPE_NOR)) -#define IS_FMC_NORSRAM_MEMORY_WIDTH(__WIDTH__) (((__WIDTH__) == FMC_NORSRAM_MEM_BUS_WIDTH_8) || \ - ((__WIDTH__) == FMC_NORSRAM_MEM_BUS_WIDTH_16) || \ - ((__WIDTH__) == FMC_NORSRAM_MEM_BUS_WIDTH_32)) -#define IS_FMC_PAGESIZE(__SIZE__) (((__SIZE__) == FMC_PAGE_SIZE_NONE) || \ - ((__SIZE__) == FMC_PAGE_SIZE_128) || \ - ((__SIZE__) == FMC_PAGE_SIZE_256) || \ - ((__SIZE__) == FMC_PAGE_SIZE_512) || \ - ((__SIZE__) == FMC_PAGE_SIZE_1024)) -#if defined(FMC_BCR1_WFDIS) -#define IS_FMC_WRITE_FIFO(__FIFO__) (((__FIFO__) == FMC_WRITE_FIFO_DISABLE) || \ - ((__FIFO__) == FMC_WRITE_FIFO_ENABLE)) -#endif /* FMC_BCR1_WFDIS */ -#define IS_FMC_ACCESS_MODE(__MODE__) (((__MODE__) == FMC_ACCESS_MODE_A) || \ - ((__MODE__) == FMC_ACCESS_MODE_B) || \ - ((__MODE__) == FMC_ACCESS_MODE_C) || \ - ((__MODE__) == FMC_ACCESS_MODE_D)) -#define IS_FMC_BURSTMODE(__STATE__) (((__STATE__) == FMC_BURST_ACCESS_MODE_DISABLE) || \ - ((__STATE__) == FMC_BURST_ACCESS_MODE_ENABLE)) -#define IS_FMC_WAIT_POLARITY(__POLARITY__) (((__POLARITY__) == FMC_WAIT_SIGNAL_POLARITY_LOW) || \ - ((__POLARITY__) == FMC_WAIT_SIGNAL_POLARITY_HIGH)) -#define IS_FMC_WRAP_MODE(__MODE__) (((__MODE__) == FMC_WRAP_MODE_DISABLE) || \ - ((__MODE__) == FMC_WRAP_MODE_ENABLE)) -#define IS_FMC_WAIT_SIGNAL_ACTIVE(__ACTIVE__) (((__ACTIVE__) == FMC_WAIT_TIMING_BEFORE_WS) || \ - ((__ACTIVE__) == FMC_WAIT_TIMING_DURING_WS)) -#define IS_FMC_WRITE_OPERATION(__OPERATION__) (((__OPERATION__) == FMC_WRITE_OPERATION_DISABLE) || \ - ((__OPERATION__) == FMC_WRITE_OPERATION_ENABLE)) -#define IS_FMC_WAITE_SIGNAL(__SIGNAL__) (((__SIGNAL__) == FMC_WAIT_SIGNAL_DISABLE) || \ - ((__SIGNAL__) == FMC_WAIT_SIGNAL_ENABLE)) -#define IS_FMC_EXTENDED_MODE(__MODE__) (((__MODE__) == FMC_EXTENDED_MODE_DISABLE) || \ - ((__MODE__) == FMC_EXTENDED_MODE_ENABLE)) -#define IS_FMC_ASYNWAIT(__STATE__) (((__STATE__) == FMC_ASYNCHRONOUS_WAIT_DISABLE) || \ - ((__STATE__) == FMC_ASYNCHRONOUS_WAIT_ENABLE)) -#define IS_FMC_DATA_LATENCY(__LATENCY__) (((__LATENCY__) > 1U) && ((__LATENCY__) <= 17U)) -#define IS_FMC_WRITE_BURST(__BURST__) (((__BURST__) == FMC_WRITE_BURST_DISABLE) || \ - ((__BURST__) == FMC_WRITE_BURST_ENABLE)) -#define IS_FMC_CONTINOUS_CLOCK(__CCLOCK__) (((__CCLOCK__) == FMC_CONTINUOUS_CLOCK_SYNC_ONLY) || \ - ((__CCLOCK__) == FMC_CONTINUOUS_CLOCK_SYNC_ASYNC)) -#define IS_FMC_ADDRESS_SETUP_TIME(__TIME__) ((__TIME__) <= 15U) -#define IS_FMC_ADDRESS_HOLD_TIME(__TIME__) (((__TIME__) > 0U) && ((__TIME__) <= 15U)) -#define IS_FMC_DATASETUP_TIME(__TIME__) (((__TIME__) > 0U) && ((__TIME__) <= 255U)) -#define IS_FMC_DATAHOLD_DURATION(__DATAHOLD__) ((__DATAHOLD__) <= 3U) -#define IS_FMC_TURNAROUND_TIME(__TIME__) ((__TIME__) <= 15U) -#define IS_FMC_CLK_DIV(__DIV__) (((__DIV__) > 1U) && ((__DIV__) <= 16U)) -#define IS_FMC_NORSRAM_DEVICE(__INSTANCE__) ((__INSTANCE__) == FMC_NORSRAM_DEVICE) -#define IS_FMC_NORSRAM_EXTENDED_DEVICE(__INSTANCE__) ((__INSTANCE__) == FMC_NORSRAM_EXTENDED_DEVICE) - -#endif /* FMC_Bank1 */ -#if (defined(FMC_Bank3) || defined(FMC_Bank2_3)) - -#if defined(FMC_Bank2_3) -#define IS_FMC_NAND_BANK(__BANK__) (((__BANK__) == FMC_NAND_BANK2) || \ - ((__BANK__) == FMC_NAND_BANK3)) -#else -#define IS_FMC_NAND_BANK(__BANK__) ((__BANK__) == FMC_NAND_BANK3) -#endif /* FMC_Bank2_3 */ -#define IS_FMC_WAIT_FEATURE(__FEATURE__) (((__FEATURE__) == FMC_NAND_PCC_WAIT_FEATURE_DISABLE) || \ - ((__FEATURE__) == FMC_NAND_PCC_WAIT_FEATURE_ENABLE)) -#define IS_FMC_NAND_MEMORY_WIDTH(__WIDTH__) (((__WIDTH__) == FMC_NAND_PCC_MEM_BUS_WIDTH_8) || \ - ((__WIDTH__) == FMC_NAND_PCC_MEM_BUS_WIDTH_16)) -#define IS_FMC_ECC_STATE(__STATE__) (((__STATE__) == FMC_NAND_ECC_DISABLE) || \ - ((__STATE__) == FMC_NAND_ECC_ENABLE)) - -#define IS_FMC_ECCPAGE_SIZE(__SIZE__) (((__SIZE__) == FMC_NAND_ECC_PAGE_SIZE_256BYTE) || \ - ((__SIZE__) == FMC_NAND_ECC_PAGE_SIZE_512BYTE) || \ - ((__SIZE__) == FMC_NAND_ECC_PAGE_SIZE_1024BYTE) || \ - ((__SIZE__) == FMC_NAND_ECC_PAGE_SIZE_2048BYTE) || \ - ((__SIZE__) == FMC_NAND_ECC_PAGE_SIZE_4096BYTE) || \ - ((__SIZE__) == FMC_NAND_ECC_PAGE_SIZE_8192BYTE)) -#define IS_FMC_TCLR_TIME(__TIME__) ((__TIME__) <= 255U) -#define IS_FMC_TAR_TIME(__TIME__) ((__TIME__) <= 255U) -#define IS_FMC_SETUP_TIME(__TIME__) ((__TIME__) <= 254U) -#define IS_FMC_WAIT_TIME(__TIME__) ((__TIME__) <= 254U) -#define IS_FMC_HOLD_TIME(__TIME__) ((__TIME__) <= 254U) -#define IS_FMC_HIZ_TIME(__TIME__) ((__TIME__) <= 254U) -#define IS_FMC_NAND_DEVICE(__INSTANCE__) ((__INSTANCE__) == FMC_NAND_DEVICE) - -#endif /* FMC_Bank3) || defined(FMC_Bank2_3 */ -#if defined(FMC_Bank4) -#define IS_FMC_PCCARD_DEVICE(__INSTANCE__) ((__INSTANCE__) == FMC_PCCARD_DEVICE) - -#endif /* FMC_Bank4 */ -#if defined(FMC_Bank5_6) - -#define IS_FMC_SDMEMORY_WIDTH(__WIDTH__) (((__WIDTH__) == FMC_SDRAM_MEM_BUS_WIDTH_8) || \ - ((__WIDTH__) == FMC_SDRAM_MEM_BUS_WIDTH_16) || \ - ((__WIDTH__) == FMC_SDRAM_MEM_BUS_WIDTH_32)) -#define IS_FMC_WRITE_PROTECTION(__WRITE__) (((__WRITE__) == FMC_SDRAM_WRITE_PROTECTION_DISABLE) || \ - ((__WRITE__) == FMC_SDRAM_WRITE_PROTECTION_ENABLE)) -#define IS_FMC_SDCLOCK_PERIOD(__PERIOD__) (((__PERIOD__) == FMC_SDRAM_CLOCK_DISABLE) || \ - ((__PERIOD__) == FMC_SDRAM_CLOCK_PERIOD_2) || \ - ((__PERIOD__) == FMC_SDRAM_CLOCK_PERIOD_3)) -#define IS_FMC_READ_BURST(__RBURST__) (((__RBURST__) == FMC_SDRAM_RBURST_DISABLE) || \ - ((__RBURST__) == FMC_SDRAM_RBURST_ENABLE)) -#define IS_FMC_READPIPE_DELAY(__DELAY__) (((__DELAY__) == FMC_SDRAM_RPIPE_DELAY_0) || \ - ((__DELAY__) == FMC_SDRAM_RPIPE_DELAY_1) || \ - ((__DELAY__) == FMC_SDRAM_RPIPE_DELAY_2)) -#define IS_FMC_COMMAND_MODE(__COMMAND__) (((__COMMAND__) == FMC_SDRAM_CMD_NORMAL_MODE) || \ - ((__COMMAND__) == FMC_SDRAM_CMD_CLK_ENABLE) || \ - ((__COMMAND__) == FMC_SDRAM_CMD_PALL) || \ - ((__COMMAND__) == FMC_SDRAM_CMD_AUTOREFRESH_MODE) || \ - ((__COMMAND__) == FMC_SDRAM_CMD_LOAD_MODE) || \ - ((__COMMAND__) == FMC_SDRAM_CMD_SELFREFRESH_MODE) || \ - ((__COMMAND__) == FMC_SDRAM_CMD_POWERDOWN_MODE)) -#define IS_FMC_COMMAND_TARGET(__TARGET__) (((__TARGET__) == FMC_SDRAM_CMD_TARGET_BANK1) || \ - ((__TARGET__) == FMC_SDRAM_CMD_TARGET_BANK2) || \ - ((__TARGET__) == FMC_SDRAM_CMD_TARGET_BANK1_2)) -#define IS_FMC_LOADTOACTIVE_DELAY(__DELAY__) (((__DELAY__) > 0U) && ((__DELAY__) <= 16U)) -#define IS_FMC_EXITSELFREFRESH_DELAY(__DELAY__) (((__DELAY__) > 0U) && ((__DELAY__) <= 16U)) -#define IS_FMC_SELFREFRESH_TIME(__TIME__) (((__TIME__) > 0U) && ((__TIME__) <= 16U)) -#define IS_FMC_ROWCYCLE_DELAY(__DELAY__) (((__DELAY__) > 0U) && ((__DELAY__) <= 16U)) -#define IS_FMC_WRITE_RECOVERY_TIME(__TIME__) (((__TIME__) > 0U) && ((__TIME__) <= 16U)) -#define IS_FMC_RP_DELAY(__DELAY__) (((__DELAY__) > 0U) && ((__DELAY__) <= 16U)) -#define IS_FMC_RCD_DELAY(__DELAY__) (((__DELAY__) > 0U) && ((__DELAY__) <= 16U)) -#define IS_FMC_AUTOREFRESH_NUMBER(__NUMBER__) (((__NUMBER__) > 0U) && ((__NUMBER__) <= 15U)) -#define IS_FMC_MODE_REGISTER(__CONTENT__) ((__CONTENT__) <= 8191U) -#define IS_FMC_REFRESH_RATE(__RATE__) ((__RATE__) <= 8191U) -#define IS_FMC_SDRAM_DEVICE(__INSTANCE__) ((__INSTANCE__) == FMC_SDRAM_DEVICE) -#define IS_FMC_SDRAM_BANK(__BANK__) (((__BANK__) == FMC_SDRAM_BANK1) || \ - ((__BANK__) == FMC_SDRAM_BANK2)) -#define IS_FMC_COLUMNBITS_NUMBER(__COLUMN__) (((__COLUMN__) == FMC_SDRAM_COLUMN_BITS_NUM_8) || \ - ((__COLUMN__) == FMC_SDRAM_COLUMN_BITS_NUM_9) || \ - ((__COLUMN__) == FMC_SDRAM_COLUMN_BITS_NUM_10) || \ - ((__COLUMN__) == FMC_SDRAM_COLUMN_BITS_NUM_11)) -#define IS_FMC_ROWBITS_NUMBER(__ROW__) (((__ROW__) == FMC_SDRAM_ROW_BITS_NUM_11) || \ - ((__ROW__) == FMC_SDRAM_ROW_BITS_NUM_12) || \ - ((__ROW__) == FMC_SDRAM_ROW_BITS_NUM_13)) -#define IS_FMC_INTERNALBANK_NUMBER(__NUMBER__) (((__NUMBER__) == FMC_SDRAM_INTERN_BANKS_NUM_2) || \ - ((__NUMBER__) == FMC_SDRAM_INTERN_BANKS_NUM_4)) -#define IS_FMC_CAS_LATENCY(__LATENCY__) (((__LATENCY__) == FMC_SDRAM_CAS_LATENCY_1) || \ - ((__LATENCY__) == FMC_SDRAM_CAS_LATENCY_2) || \ - ((__LATENCY__) == FMC_SDRAM_CAS_LATENCY_3)) - -#endif /* FMC_Bank5_6 */ - -/** - * @} - */ - -/* Exported typedef ----------------------------------------------------------*/ - -/** @defgroup FMC_LL_Exported_typedef FMC Low Layer Exported Types - * @{ - */ - -#if defined(FMC_Bank1) -#define FMC_NORSRAM_TypeDef FMC_Bank1_TypeDef -#define FMC_NORSRAM_EXTENDED_TypeDef FMC_Bank1E_TypeDef -#endif /* FMC_Bank1 */ -#if defined(FMC_Bank2_3) -#define FMC_NAND_TypeDef FMC_Bank2_3_TypeDef -#else -#define FMC_NAND_TypeDef FMC_Bank3_TypeDef -#endif /* FMC_Bank2_3 */ -#if defined(FMC_Bank4) -#define FMC_PCCARD_TypeDef FMC_Bank4_TypeDef -#endif /* FMC_Bank4 */ -#if defined(FMC_Bank5_6) -#define FMC_SDRAM_TypeDef FMC_Bank5_6_TypeDef -#endif /* FMC_Bank5_6 */ - -#if defined(FMC_Bank1) -#define FMC_NORSRAM_DEVICE FMC_Bank1 -#define FMC_NORSRAM_EXTENDED_DEVICE FMC_Bank1E -#endif /* FMC_Bank1 */ -#if defined(FMC_Bank2_3) -#define FMC_NAND_DEVICE FMC_Bank2_3 -#else -#define FMC_NAND_DEVICE FMC_Bank3 -#endif /* FMC_Bank2_3 */ -#if defined(FMC_Bank4) -#define FMC_PCCARD_DEVICE FMC_Bank4 -#endif /* FMC_Bank4 */ -#if defined(FMC_Bank5_6) -#define FMC_SDRAM_DEVICE FMC_Bank5_6 -#endif /* FMC_Bank5_6 */ - -#if defined(FMC_Bank1) -/** - * @brief FMC NORSRAM Configuration Structure definition - */ -typedef struct -{ - uint32_t NSBank; /*!< Specifies the NORSRAM memory device that will be used. - This parameter can be a value of @ref FMC_NORSRAM_Bank */ - - uint32_t DataAddressMux; /*!< Specifies whether the address and data values are - multiplexed on the data bus or not. - This parameter can be a value of @ref FMC_Data_Address_Bus_Multiplexing*/ - - uint32_t MemoryType; /*!< Specifies the type of external memory attached to - the corresponding memory device. - This parameter can be a value of @ref FMC_Memory_Type */ - - uint32_t MemoryDataWidth; /*!< Specifies the external memory device width. - This parameter can be a value of @ref FMC_NORSRAM_Data_Width */ - - uint32_t BurstAccessMode; /*!< Enables or disables the burst access mode for Flash memory, - valid only with synchronous burst Flash memories. - This parameter can be a value of @ref FMC_Burst_Access_Mode */ - - uint32_t WaitSignalPolarity; /*!< Specifies the wait signal polarity, valid only when accessing - the Flash memory in burst mode. - This parameter can be a value of @ref FMC_Wait_Signal_Polarity */ - - uint32_t WrapMode; /*!< Enables or disables the Wrapped burst access mode for Flash - memory, valid only when accessing Flash memories in burst mode. - This parameter can be a value of @ref FMC_Wrap_Mode - This mode is not available for the STM32F446/467/479xx devices */ - - uint32_t WaitSignalActive; /*!< Specifies if the wait signal is asserted by the memory one - clock cycle before the wait state or during the wait state, - valid only when accessing memories in burst mode. - This parameter can be a value of @ref FMC_Wait_Timing */ - - uint32_t WriteOperation; /*!< Enables or disables the write operation in the selected device - by the FMC. - This parameter can be a value of @ref FMC_Write_Operation */ - - uint32_t WaitSignal; /*!< Enables or disables the wait state insertion via wait - signal, valid for Flash memory access in burst mode. - This parameter can be a value of @ref FMC_Wait_Signal */ - - uint32_t ExtendedMode; /*!< Enables or disables the extended mode. - This parameter can be a value of @ref FMC_Extended_Mode */ - - uint32_t AsynchronousWait; /*!< Enables or disables wait signal during asynchronous transfers, - valid only with asynchronous Flash memories. - This parameter can be a value of @ref FMC_AsynchronousWait */ - - uint32_t WriteBurst; /*!< Enables or disables the write burst operation. - This parameter can be a value of @ref FMC_Write_Burst */ - - uint32_t ContinuousClock; /*!< Enables or disables the FMC clock output to external memory devices. - This parameter is only enabled through the FMC_BCR1 register, - and don't care through FMC_BCR2..4 registers. - This parameter can be a value of @ref FMC_Continous_Clock */ - - uint32_t WriteFifo; /*!< Enables or disables the write FIFO used by the FMC controller. - This parameter is only enabled through the FMC_BCR1 register, - and don't care through FMC_BCR2..4 registers. - This parameter can be a value of @ref FMC_Write_FIFO - This mode is available only for the STM32F446/469/479xx devices */ - - uint32_t PageSize; /*!< Specifies the memory page size. - This parameter can be a value of @ref FMC_Page_Size */ -} FMC_NORSRAM_InitTypeDef; - -/** - * @brief FMC NORSRAM Timing parameters structure definition - */ -typedef struct -{ - uint32_t AddressSetupTime; /*!< Defines the number of HCLK cycles to configure - the duration of the address setup time. - This parameter can be a value between Min_Data = 0 and Max_Data = 15. - @note This parameter is not used with synchronous NOR Flash memories. */ - - uint32_t AddressHoldTime; /*!< Defines the number of HCLK cycles to configure - the duration of the address hold time. - This parameter can be a value between Min_Data = 1 and Max_Data = 15. - @note This parameter is not used with synchronous NOR Flash memories. */ - - uint32_t DataSetupTime; /*!< Defines the number of HCLK cycles to configure - the duration of the data setup time. - This parameter can be a value between Min_Data = 1 and Max_Data = 255. - @note This parameter is used for SRAMs, ROMs and asynchronous multiplexed - NOR Flash memories. */ - - uint32_t BusTurnAroundDuration; /*!< Defines the number of HCLK cycles to configure - the duration of the bus turnaround. - This parameter can be a value between Min_Data = 0 and Max_Data = 15. - @note This parameter is only used for multiplexed NOR Flash memories. */ - - uint32_t CLKDivision; /*!< Defines the period of CLK clock output signal, expressed in number of - HCLK cycles. This parameter can be a value between Min_Data = 2 and - Max_Data = 16. - @note This parameter is not used for asynchronous NOR Flash, SRAM or ROM - accesses. */ - - uint32_t DataLatency; /*!< Defines the number of memory clock cycles to issue - to the memory before getting the first data. - The parameter value depends on the memory type as shown below: - - It must be set to 0 in case of a CRAM - - It is don't care in asynchronous NOR, SRAM or ROM accesses - - It may assume a value between Min_Data = 2 and Max_Data = 17 - in NOR Flash memories with synchronous burst mode enable */ - - uint32_t AccessMode; /*!< Specifies the asynchronous access mode. - This parameter can be a value of @ref FMC_Access_Mode */ -} FMC_NORSRAM_TimingTypeDef; -#endif /* FMC_Bank1 */ - -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) -/** - * @brief FMC NAND Configuration Structure definition - */ -typedef struct -{ - uint32_t NandBank; /*!< Specifies the NAND memory device that will be used. - This parameter can be a value of @ref FMC_NAND_Bank */ - - uint32_t Waitfeature; /*!< Enables or disables the Wait feature for the NAND Memory device. - This parameter can be any value of @ref FMC_Wait_feature */ - - uint32_t MemoryDataWidth; /*!< Specifies the external memory device width. - This parameter can be any value of @ref FMC_NAND_Data_Width */ - - uint32_t EccComputation; /*!< Enables or disables the ECC computation. - This parameter can be any value of @ref FMC_ECC */ - - uint32_t ECCPageSize; /*!< Defines the page size for the extended ECC. - This parameter can be any value of @ref FMC_ECC_Page_Size */ - - uint32_t TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the - delay between CLE low and RE low. - This parameter can be a value between Min_Data = 0 and Max_Data = 255 */ - - uint32_t TARSetupTime; /*!< Defines the number of HCLK cycles to configure the - delay between ALE low and RE low. - This parameter can be a number between Min_Data = 0 and Max_Data = 255 */ -} FMC_NAND_InitTypeDef; -#endif /* FMC_Bank3 || FMC_Bank2_3 */ - -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) || defined(FMC_Bank4) -/** - * @brief FMC NAND Timing parameters structure definition - */ -typedef struct -{ - uint32_t SetupTime; /*!< Defines the number of HCLK cycles to setup address before - the command assertion for NAND-Flash read or write access - to common/Attribute or I/O memory space (depending on - the memory space timing to be configured). - This parameter can be a value between Min_Data = 0 and Max_Data = 254 */ - - uint32_t WaitSetupTime; /*!< Defines the minimum number of HCLK cycles to assert the - command for NAND-Flash read or write access to - common/Attribute or I/O memory space (depending on the - memory space timing to be configured). - This parameter can be a number between Min_Data = 0 and Max_Data = 254 */ - - uint32_t HoldSetupTime; /*!< Defines the number of HCLK clock cycles to hold address - (and data for write access) after the command de-assertion - for NAND-Flash read or write access to common/Attribute - or I/O memory space (depending on the memory space timing - to be configured). - This parameter can be a number between Min_Data = 0 and Max_Data = 254 */ - - uint32_t HiZSetupTime; /*!< Defines the number of HCLK clock cycles during which the - data bus is kept in HiZ after the start of a NAND-Flash - write access to common/Attribute or I/O memory space (depending - on the memory space timing to be configured). - This parameter can be a number between Min_Data = 0 and Max_Data = 254 */ -} FMC_NAND_PCC_TimingTypeDef; -#endif /* FMC_Bank3 || FMC_Bank2_3 */ - -#if defined(FMC_Bank4) -/** - * @brief FMC PCCARD Configuration Structure definition - */ -typedef struct -{ - uint32_t Waitfeature; /*!< Enables or disables the Wait feature for the PCCARD Memory device. - This parameter can be any value of @ref FMC_Wait_feature */ - - uint32_t TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the - delay between CLE low and RE low. - This parameter can be a value between Min_Data = 0 and Max_Data = 255 */ - - uint32_t TARSetupTime; /*!< Defines the number of HCLK cycles to configure the - delay between ALE low and RE low. - This parameter can be a number between Min_Data = 0 and Max_Data = 255 */ -} FMC_PCCARD_InitTypeDef; -#endif /* FMC_Bank4 */ - -#if defined(FMC_Bank5_6) -/** - * @brief FMC SDRAM Configuration Structure definition - */ -typedef struct -{ - uint32_t SDBank; /*!< Specifies the SDRAM memory device that will be used. - This parameter can be a value of @ref FMC_SDRAM_Bank */ - - uint32_t ColumnBitsNumber; /*!< Defines the number of bits of column address. - This parameter can be a value of @ref FMC_SDRAM_Column_Bits_number. */ - - uint32_t RowBitsNumber; /*!< Defines the number of bits of column address. - This parameter can be a value of @ref FMC_SDRAM_Row_Bits_number. */ - - uint32_t MemoryDataWidth; /*!< Defines the memory device width. - This parameter can be a value of @ref FMC_SDRAM_Memory_Bus_Width. */ - - uint32_t InternalBankNumber; /*!< Defines the number of the device's internal banks. - This parameter can be of @ref FMC_SDRAM_Internal_Banks_Number. */ - - uint32_t CASLatency; /*!< Defines the SDRAM CAS latency in number of memory clock cycles. - This parameter can be a value of @ref FMC_SDRAM_CAS_Latency. */ - - uint32_t WriteProtection; /*!< Enables the SDRAM device to be accessed in write mode. - This parameter can be a value of @ref FMC_SDRAM_Write_Protection. */ - - uint32_t SDClockPeriod; /*!< Define the SDRAM Clock Period for both SDRAM devices and they allow - to disable the clock before changing frequency. - This parameter can be a value of @ref FMC_SDRAM_Clock_Period. */ - - uint32_t ReadBurst; /*!< This bit enable the SDRAM controller to anticipate the next read - commands during the CAS latency and stores data in the Read FIFO. - This parameter can be a value of @ref FMC_SDRAM_Read_Burst. */ - - uint32_t ReadPipeDelay; /*!< Define the delay in system clock cycles on read data path. - This parameter can be a value of @ref FMC_SDRAM_Read_Pipe_Delay. */ -} FMC_SDRAM_InitTypeDef; - -/** - * @brief FMC SDRAM Timing parameters structure definition - */ -typedef struct -{ - uint32_t LoadToActiveDelay; /*!< Defines the delay between a Load Mode Register command and - an active or Refresh command in number of memory clock cycles. - This parameter can be a value between Min_Data = 1 and Max_Data = 16 */ - - uint32_t ExitSelfRefreshDelay; /*!< Defines the delay from releasing the self refresh command to - issuing the Activate command in number of memory clock cycles. - This parameter can be a value between Min_Data = 1 and Max_Data = 16 */ - - uint32_t SelfRefreshTime; /*!< Defines the minimum Self Refresh period in number of memory clock - cycles. - This parameter can be a value between Min_Data = 1 and Max_Data = 16 */ - - uint32_t RowCycleDelay; /*!< Defines the delay between the Refresh command and the Activate command - and the delay between two consecutive Refresh commands in number of - memory clock cycles. - This parameter can be a value between Min_Data = 1 and Max_Data = 16 */ - - uint32_t WriteRecoveryTime; /*!< Defines the Write recovery Time in number of memory clock cycles. - This parameter can be a value between Min_Data = 1 and Max_Data = 16 */ - - uint32_t RPDelay; /*!< Defines the delay between a Precharge Command and an other command - in number of memory clock cycles. - This parameter can be a value between Min_Data = 1 and Max_Data = 16 */ - - uint32_t RCDDelay; /*!< Defines the delay between the Activate Command and a Read/Write - command in number of memory clock cycles. - This parameter can be a value between Min_Data = 1 and Max_Data = 16 */ -} FMC_SDRAM_TimingTypeDef; - -/** - * @brief SDRAM command parameters structure definition - */ -typedef struct -{ - uint32_t CommandMode; /*!< Defines the command issued to the SDRAM device. - This parameter can be a value of @ref FMC_SDRAM_Command_Mode. */ - - uint32_t CommandTarget; /*!< Defines which device (1 or 2) the command will be issued to. - This parameter can be a value of @ref FMC_SDRAM_Command_Target. */ - - uint32_t AutoRefreshNumber; /*!< Defines the number of consecutive auto refresh command issued - in auto refresh mode. - This parameter can be a value between Min_Data = 1 and Max_Data = 15 */ - - uint32_t ModeRegisterDefinition; /*!< Defines the SDRAM Mode register content */ -} FMC_SDRAM_CommandTypeDef; -#endif /* FMC_Bank5_6 */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @addtogroup FMC_LL_Exported_Constants FMC Low Layer Exported Constants - * @{ - */ -#if defined(FMC_Bank1) - -/** @defgroup FMC_LL_NOR_SRAM_Controller FMC NOR/SRAM Controller - * @{ - */ - -/** @defgroup FMC_NORSRAM_Bank FMC NOR/SRAM Bank - * @{ - */ -#define FMC_NORSRAM_BANK1 (0x00000000U) -#define FMC_NORSRAM_BANK2 (0x00000002U) -#define FMC_NORSRAM_BANK3 (0x00000004U) -#define FMC_NORSRAM_BANK4 (0x00000006U) -/** - * @} - */ - -/** @defgroup FMC_Data_Address_Bus_Multiplexing FMC Data Address Bus Multiplexing - * @{ - */ -#define FMC_DATA_ADDRESS_MUX_DISABLE (0x00000000U) -#define FMC_DATA_ADDRESS_MUX_ENABLE (0x00000002U) -/** - * @} - */ - -/** @defgroup FMC_Memory_Type FMC Memory Type - * @{ - */ -#define FMC_MEMORY_TYPE_SRAM (0x00000000U) -#define FMC_MEMORY_TYPE_PSRAM (0x00000004U) -#define FMC_MEMORY_TYPE_NOR (0x00000008U) -/** - * @} - */ - -/** @defgroup FMC_NORSRAM_Data_Width FMC NORSRAM Data Width - * @{ - */ -#define FMC_NORSRAM_MEM_BUS_WIDTH_8 (0x00000000U) -#define FMC_NORSRAM_MEM_BUS_WIDTH_16 (0x00000010U) -#define FMC_NORSRAM_MEM_BUS_WIDTH_32 (0x00000020U) -/** - * @} - */ - -/** @defgroup FMC_NORSRAM_Flash_Access FMC NOR/SRAM Flash Access - * @{ - */ -#define FMC_NORSRAM_FLASH_ACCESS_ENABLE (0x00000040U) -#define FMC_NORSRAM_FLASH_ACCESS_DISABLE (0x00000000U) -/** - * @} - */ - -/** @defgroup FMC_Burst_Access_Mode FMC Burst Access Mode - * @{ - */ -#define FMC_BURST_ACCESS_MODE_DISABLE (0x00000000U) -#define FMC_BURST_ACCESS_MODE_ENABLE (0x00000100U) -/** - * @} - */ - -/** @defgroup FMC_Wait_Signal_Polarity FMC Wait Signal Polarity - * @{ - */ -#define FMC_WAIT_SIGNAL_POLARITY_LOW (0x00000000U) -#define FMC_WAIT_SIGNAL_POLARITY_HIGH (0x00000200U) -/** - * @} - */ - -/** @defgroup FMC_Wrap_Mode FMC Wrap Mode - * @note This mode is not available for the STM32F446/469/479xx devices - * @{ - */ -#define FMC_WRAP_MODE_DISABLE (0x00000000U) -#define FMC_WRAP_MODE_ENABLE (0x00000400U) -/** - * @} - */ - -/** @defgroup FMC_Wait_Timing FMC Wait Timing - * @{ - */ -#define FMC_WAIT_TIMING_BEFORE_WS (0x00000000U) -#define FMC_WAIT_TIMING_DURING_WS (0x00000800U) -/** - * @} - */ - -/** @defgroup FMC_Write_Operation FMC Write Operation - * @{ - */ -#define FMC_WRITE_OPERATION_DISABLE (0x00000000U) -#define FMC_WRITE_OPERATION_ENABLE (0x00001000U) -/** - * @} - */ - -/** @defgroup FMC_Wait_Signal FMC Wait Signal - * @{ - */ -#define FMC_WAIT_SIGNAL_DISABLE (0x00000000U) -#define FMC_WAIT_SIGNAL_ENABLE (0x00002000U) -/** - * @} - */ - -/** @defgroup FMC_Extended_Mode FMC Extended Mode - * @{ - */ -#define FMC_EXTENDED_MODE_DISABLE (0x00000000U) -#define FMC_EXTENDED_MODE_ENABLE (0x00004000U) -/** - * @} - */ - -/** @defgroup FMC_AsynchronousWait FMC Asynchronous Wait - * @{ - */ -#define FMC_ASYNCHRONOUS_WAIT_DISABLE (0x00000000U) -#define FMC_ASYNCHRONOUS_WAIT_ENABLE (0x00008000U) -/** - * @} - */ - -/** @defgroup FMC_Page_Size FMC Page Size - * @{ - */ -#define FMC_PAGE_SIZE_NONE (0x00000000U) -#define FMC_PAGE_SIZE_128 FMC_BCR1_CPSIZE_0 -#define FMC_PAGE_SIZE_256 FMC_BCR1_CPSIZE_1 -#define FMC_PAGE_SIZE_512 (FMC_BCR1_CPSIZE_0\ - | FMC_BCR1_CPSIZE_1) -#define FMC_PAGE_SIZE_1024 FMC_BCR1_CPSIZE_2 -/** - * @} - */ - -/** @defgroup FMC_Write_Burst FMC Write Burst - * @{ - */ -#define FMC_WRITE_BURST_DISABLE (0x00000000U) -#define FMC_WRITE_BURST_ENABLE (0x00080000U) -/** - * @} - */ - -/** @defgroup FMC_Continous_Clock FMC Continuous Clock - * @{ - */ -#define FMC_CONTINUOUS_CLOCK_SYNC_ONLY (0x00000000U) -#define FMC_CONTINUOUS_CLOCK_SYNC_ASYNC (0x00100000U) -/** - * @} - */ - -#if defined(FMC_BCR1_WFDIS) -/** @defgroup FMC_Write_FIFO FMC Write FIFO - * @note These values are available only for the STM32F446/469/479xx devices. - * @{ - */ -#define FMC_WRITE_FIFO_DISABLE FMC_BCR1_WFDIS -#define FMC_WRITE_FIFO_ENABLE (0x00000000U) -#endif /* FMC_BCR1_WFDIS */ -/** - * @} - */ - -/** @defgroup FMC_Access_Mode FMC Access Mode - * @{ - */ -#define FMC_ACCESS_MODE_A (0x00000000U) -#define FMC_ACCESS_MODE_B (0x10000000U) -#define FMC_ACCESS_MODE_C (0x20000000U) -#define FMC_ACCESS_MODE_D (0x30000000U) -/** - * @} - */ - -/** - * @} - */ -#endif /* FMC_Bank1 */ - -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) || defined(FMC_Bank4) - -/** @defgroup FMC_LL_NAND_Controller FMC NAND Controller - * @{ - */ -/** @defgroup FMC_NAND_Bank FMC NAND Bank - * @{ - */ -#if defined(FMC_Bank2_3) -#define FMC_NAND_BANK2 (0x00000010U) -#endif /* FMC_Bank2_3 */ -#define FMC_NAND_BANK3 (0x00000100U) -/** - * @} - */ - -/** @defgroup FMC_Wait_feature FMC Wait feature - * @{ - */ -#define FMC_NAND_PCC_WAIT_FEATURE_DISABLE (0x00000000U) -#define FMC_NAND_PCC_WAIT_FEATURE_ENABLE (0x00000002U) -/** - * @} - */ - -/** @defgroup FMC_PCR_Memory_Type FMC PCR Memory Type - * @{ - */ -#if defined(FMC_Bank4) -#define FMC_PCR_MEMORY_TYPE_PCCARD (0x00000000U) -#endif /* FMC_Bank4 */ -#define FMC_PCR_MEMORY_TYPE_NAND (0x00000008U) -/** - * @} - */ - -/** @defgroup FMC_NAND_Data_Width FMC NAND Data Width - * @{ - */ -#define FMC_NAND_PCC_MEM_BUS_WIDTH_8 (0x00000000U) -#define FMC_NAND_PCC_MEM_BUS_WIDTH_16 (0x00000010U) -/** - * @} - */ - -/** @defgroup FMC_ECC FMC ECC - * @{ - */ -#define FMC_NAND_ECC_DISABLE (0x00000000U) -#define FMC_NAND_ECC_ENABLE (0x00000040U) -/** - * @} - */ - -/** @defgroup FMC_ECC_Page_Size FMC ECC Page Size - * @{ - */ -#define FMC_NAND_ECC_PAGE_SIZE_256BYTE (0x00000000U) -#define FMC_NAND_ECC_PAGE_SIZE_512BYTE (0x00020000U) -#define FMC_NAND_ECC_PAGE_SIZE_1024BYTE (0x00040000U) -#define FMC_NAND_ECC_PAGE_SIZE_2048BYTE (0x00060000U) -#define FMC_NAND_ECC_PAGE_SIZE_4096BYTE (0x00080000U) -#define FMC_NAND_ECC_PAGE_SIZE_8192BYTE (0x000A0000U) -/** - * @} - */ - -/** - * @} - */ -#endif /* FMC_Bank3 || FMC_Bank2_3 || FMC_Bank4 */ - -#if defined(FMC_Bank5_6) -/** @defgroup FMC_LL_SDRAM_Controller FMC SDRAM Controller - * @{ - */ -/** @defgroup FMC_SDRAM_Bank FMC SDRAM Bank - * @{ - */ -#define FMC_SDRAM_BANK1 (0x00000000U) -#define FMC_SDRAM_BANK2 (0x00000001U) -/** - * @} - */ - -/** @defgroup FMC_SDRAM_Column_Bits_number FMC SDRAM Column Bits number - * @{ - */ -#define FMC_SDRAM_COLUMN_BITS_NUM_8 (0x00000000U) -#define FMC_SDRAM_COLUMN_BITS_NUM_9 (0x00000001U) -#define FMC_SDRAM_COLUMN_BITS_NUM_10 (0x00000002U) -#define FMC_SDRAM_COLUMN_BITS_NUM_11 (0x00000003U) -/** - * @} - */ - -/** @defgroup FMC_SDRAM_Row_Bits_number FMC SDRAM Row Bits number - * @{ - */ -#define FMC_SDRAM_ROW_BITS_NUM_11 (0x00000000U) -#define FMC_SDRAM_ROW_BITS_NUM_12 (0x00000004U) -#define FMC_SDRAM_ROW_BITS_NUM_13 (0x00000008U) -/** - * @} - */ - -/** @defgroup FMC_SDRAM_Memory_Bus_Width FMC SDRAM Memory Bus Width - * @{ - */ -#define FMC_SDRAM_MEM_BUS_WIDTH_8 (0x00000000U) -#define FMC_SDRAM_MEM_BUS_WIDTH_16 (0x00000010U) -#define FMC_SDRAM_MEM_BUS_WIDTH_32 (0x00000020U) -/** - * @} - */ - -/** @defgroup FMC_SDRAM_Internal_Banks_Number FMC SDRAM Internal Banks Number - * @{ - */ -#define FMC_SDRAM_INTERN_BANKS_NUM_2 (0x00000000U) -#define FMC_SDRAM_INTERN_BANKS_NUM_4 (0x00000040U) -/** - * @} - */ - -/** @defgroup FMC_SDRAM_CAS_Latency FMC SDRAM CAS Latency - * @{ - */ -#define FMC_SDRAM_CAS_LATENCY_1 (0x00000080U) -#define FMC_SDRAM_CAS_LATENCY_2 (0x00000100U) -#define FMC_SDRAM_CAS_LATENCY_3 (0x00000180U) -/** - * @} - */ - -/** @defgroup FMC_SDRAM_Write_Protection FMC SDRAM Write Protection - * @{ - */ -#define FMC_SDRAM_WRITE_PROTECTION_DISABLE (0x00000000U) -#define FMC_SDRAM_WRITE_PROTECTION_ENABLE (0x00000200U) -/** - * @} - */ - -/** @defgroup FMC_SDRAM_Clock_Period FMC SDRAM Clock Period - * @{ - */ -#define FMC_SDRAM_CLOCK_DISABLE (0x00000000U) -#define FMC_SDRAM_CLOCK_PERIOD_2 (0x00000800U) -#define FMC_SDRAM_CLOCK_PERIOD_3 (0x00000C00U) -/** - * @} - */ - -/** @defgroup FMC_SDRAM_Read_Burst FMC SDRAM Read Burst - * @{ - */ -#define FMC_SDRAM_RBURST_DISABLE (0x00000000U) -#define FMC_SDRAM_RBURST_ENABLE (0x00001000U) -/** - * @} - */ - -/** @defgroup FMC_SDRAM_Read_Pipe_Delay FMC SDRAM Read Pipe Delay - * @{ - */ -#define FMC_SDRAM_RPIPE_DELAY_0 (0x00000000U) -#define FMC_SDRAM_RPIPE_DELAY_1 (0x00002000U) -#define FMC_SDRAM_RPIPE_DELAY_2 (0x00004000U) -/** - * @} - */ - -/** @defgroup FMC_SDRAM_Command_Mode FMC SDRAM Command Mode - * @{ - */ -#define FMC_SDRAM_CMD_NORMAL_MODE (0x00000000U) -#define FMC_SDRAM_CMD_CLK_ENABLE (0x00000001U) -#define FMC_SDRAM_CMD_PALL (0x00000002U) -#define FMC_SDRAM_CMD_AUTOREFRESH_MODE (0x00000003U) -#define FMC_SDRAM_CMD_LOAD_MODE (0x00000004U) -#define FMC_SDRAM_CMD_SELFREFRESH_MODE (0x00000005U) -#define FMC_SDRAM_CMD_POWERDOWN_MODE (0x00000006U) -/** - * @} - */ - -/** @defgroup FMC_SDRAM_Command_Target FMC SDRAM Command Target - * @{ - */ -#define FMC_SDRAM_CMD_TARGET_BANK2 FMC_SDCMR_CTB2 -#define FMC_SDRAM_CMD_TARGET_BANK1 FMC_SDCMR_CTB1 -#define FMC_SDRAM_CMD_TARGET_BANK1_2 (0x00000018U) -/** - * @} - */ - -/** @defgroup FMC_SDRAM_Mode_Status FMC SDRAM Mode Status - * @{ - */ -#define FMC_SDRAM_NORMAL_MODE (0x00000000U) -#define FMC_SDRAM_SELF_REFRESH_MODE FMC_SDSR_MODES1_0 -#define FMC_SDRAM_POWER_DOWN_MODE FMC_SDSR_MODES1_1 -/** - * @} - */ - -/** - * @} - */ - -#endif /* FMC_Bank5_6 */ - -/** @defgroup FMC_LL_Interrupt_definition FMC Low Layer Interrupt definition - * @{ - */ -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) || defined(FMC_Bank4) -#define FMC_IT_RISING_EDGE (0x00000008U) -#define FMC_IT_LEVEL (0x00000010U) -#define FMC_IT_FALLING_EDGE (0x00000020U) -#endif /* FMC_Bank3 || FMC_Bank2_3 || FMC_Bank4 */ -#if defined(FMC_Bank5_6) -#define FMC_IT_REFRESH_ERROR (0x00004000U) -#endif /* FMC_Bank5_6 */ -/** - * @} - */ - -/** @defgroup FMC_LL_Flag_definition FMC Low Layer Flag definition - * @{ - */ -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) || defined(FMC_Bank4) -#define FMC_FLAG_RISING_EDGE (0x00000001U) -#define FMC_FLAG_LEVEL (0x00000002U) -#define FMC_FLAG_FALLING_EDGE (0x00000004U) -#define FMC_FLAG_FEMPT (0x00000040U) -#endif /* FMC_Bank3 || FMC_Bank2_3 || FMC_Bank4 */ -#if defined(FMC_Bank5_6) -#define FMC_SDRAM_FLAG_REFRESH_IT FMC_SDSR_RE -#define FMC_SDRAM_FLAG_BUSY FMC_SDSR_BUSY -#define FMC_SDRAM_FLAG_REFRESH_ERROR FMC_SDRTR_CRE -#endif /* FMC_Bank5_6 */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/** @defgroup FMC_LL_Private_Macros FMC_LL Private Macros - * @{ - */ -#if defined(FMC_Bank1) -/** @defgroup FMC_LL_NOR_Macros FMC NOR/SRAM Macros - * @brief macros to handle NOR device enable/disable and read/write operations - * @{ - */ - -/** - * @brief Enable the NORSRAM device access. - * @param __INSTANCE__ FMC_NORSRAM Instance - * @param __BANK__ FMC_NORSRAM Bank - * @retval None - */ -#define __FMC_NORSRAM_ENABLE(__INSTANCE__, __BANK__) ((__INSTANCE__)->BTCR[(__BANK__)]\ - |= FMC_BCR1_MBKEN) - -/** - * @brief Disable the NORSRAM device access. - * @param __INSTANCE__ FMC_NORSRAM Instance - * @param __BANK__ FMC_NORSRAM Bank - * @retval None - */ -#define __FMC_NORSRAM_DISABLE(__INSTANCE__, __BANK__) ((__INSTANCE__)->BTCR[(__BANK__)]\ - &= ~FMC_BCR1_MBKEN) - -/** - * @} - */ -#endif /* FMC_Bank1 */ - -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) -/** @defgroup FMC_LL_NAND_Macros FMC NAND Macros - * @brief macros to handle NAND device enable/disable - * @{ - */ - -/** - * @brief Enable the NAND device access. - * @param __INSTANCE__ FMC_NAND Instance - * @param __BANK__ FMC_NAND Bank - * @retval None - */ -#if defined(FMC_Bank2_3) -#if defined (FMC_PCR_PBKEN) -#define __FMC_NAND_ENABLE(__INSTANCE__) ((__INSTANCE__)->PCR |= FMC_PCR_PBKEN) -#else -#define __FMC_NAND_ENABLE(__INSTANCE__, __BANK__) (((__BANK__) == FMC_NAND_BANK2) ? \ - ((__INSTANCE__)->PCR2 |= FMC_PCR2_PBKEN) : \ - ((__INSTANCE__)->PCR3 |= FMC_PCR3_PBKEN)) -#endif /* FMC_PCR_PBKEN */ -#else -#define __FMC_NAND_ENABLE(__INSTANCE__) ((__INSTANCE__)->PCR |= FMC_PCR_PBKEN) -#endif /* FMC_Bank2_3 */ - -/** - * @brief Disable the NAND device access. - * @param __INSTANCE__ FMC_NAND Instance - * @param __BANK__ FMC_NAND Bank - * @retval None - */ -#if defined(FMC_Bank2_3) -#if defined (FMC_PCR_PBKEN) -#define __FMC_NAND_DISABLE(__INSTANCE__, __BANK__) CLEAR_BIT((__INSTANCE__)->PCR, FMC_PCR_PBKEN) -#else -#define __FMC_NAND_DISABLE(__INSTANCE__, __BANK__) (((__BANK__) == FMC_NAND_BANK2) ? \ - CLEAR_BIT((__INSTANCE__)->PCR2, FMC_PCR2_PBKEN) : \ - CLEAR_BIT((__INSTANCE__)->PCR3, FMC_PCR3_PBKEN)) -#endif /* FMC_PCR_PBKEN */ -#else -#define __FMC_NAND_DISABLE(__INSTANCE__, __BANK__) CLEAR_BIT((__INSTANCE__)->PCR, FMC_PCR_PBKEN) -#endif /* FMC_Bank2_3 */ - -/** - * @} - */ -#endif /* FMC_Bank3 || FMC_Bank2_3 */ - -#if defined(FMC_Bank4) -/** @defgroup FMC_LL_PCCARD_Macros FMC PCCARD Macros - * @brief macros to handle PCCARD read/write operations - * @{ - */ -/** - * @brief Enable the PCCARD device access. - * @param __INSTANCE__ FMC_PCCARD Instance - * @retval None - */ -#define __FMC_PCCARD_ENABLE(__INSTANCE__) ((__INSTANCE__)->PCR4 |= FMC_PCR4_PBKEN) - -/** - * @brief Disable the PCCARD device access. - * @param __INSTANCE__ FMC_PCCARD Instance - * @retval None - */ -#define __FMC_PCCARD_DISABLE(__INSTANCE__) ((__INSTANCE__)->PCR4 &= ~FMC_PCR4_PBKEN) -/** - * @} - */ - -#endif /* FMC_Bank4 */ -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) -/** @defgroup FMC_LL_NAND_Interrupt FMC NAND Interrupt - * @brief macros to handle NAND interrupts - * @{ - */ - -/** - * @brief Enable the NAND device interrupt. - * @param __INSTANCE__ FMC_NAND instance - * @param __BANK__ FMC_NAND Bank - * @param __INTERRUPT__ FMC_NAND interrupt - * This parameter can be any combination of the following values: - * @arg FMC_IT_RISING_EDGE: Interrupt rising edge. - * @arg FMC_IT_LEVEL: Interrupt level. - * @arg FMC_IT_FALLING_EDGE: Interrupt falling edge. - * @retval None - */ -#if defined(FMC_Bank2_3) -#define __FMC_NAND_ENABLE_IT(__INSTANCE__, __BANK__, __INTERRUPT__) (((__BANK__) == FMC_NAND_BANK2) ? \ - ((__INSTANCE__)->SR2 |= (__INTERRUPT__)) : \ - ((__INSTANCE__)->SR3 |= (__INTERRUPT__))) -#else -#define __FMC_NAND_ENABLE_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->SR |= (__INTERRUPT__)) -#endif /* FMC_Bank2_3 */ - -/** - * @brief Disable the NAND device interrupt. - * @param __INSTANCE__ FMC_NAND Instance - * @param __BANK__ FMC_NAND Bank - * @param __INTERRUPT__ FMC_NAND interrupt - * This parameter can be any combination of the following values: - * @arg FMC_IT_RISING_EDGE: Interrupt rising edge. - * @arg FMC_IT_LEVEL: Interrupt level. - * @arg FMC_IT_FALLING_EDGE: Interrupt falling edge. - * @retval None - */ -#if defined(FMC_Bank2_3) -#define __FMC_NAND_DISABLE_IT(__INSTANCE__, __BANK__, __INTERRUPT__) (((__BANK__) == FMC_NAND_BANK2) ? \ - ((__INSTANCE__)->SR2 &= ~(__INTERRUPT__)) : \ - ((__INSTANCE__)->SR3 &= ~(__INTERRUPT__))) -#else -#define __FMC_NAND_DISABLE_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->SR &= ~(__INTERRUPT__)) -#endif /* FMC_Bank2_3 */ - -/** - * @brief Get flag status of the NAND device. - * @param __INSTANCE__ FMC_NAND Instance - * @param __BANK__ FMC_NAND Bank - * @param __FLAG__ FMC_NAND flag - * This parameter can be any combination of the following values: - * @arg FMC_FLAG_RISING_EDGE: Interrupt rising edge flag. - * @arg FMC_FLAG_LEVEL: Interrupt level edge flag. - * @arg FMC_FLAG_FALLING_EDGE: Interrupt falling edge flag. - * @arg FMC_FLAG_FEMPT: FIFO empty flag. - * @retval The state of FLAG (SET or RESET). - */ -#if defined(FMC_Bank2_3) -#define __FMC_NAND_GET_FLAG(__INSTANCE__, __BANK__, __FLAG__) (((__BANK__) == FMC_NAND_BANK2) ? \ - (((__INSTANCE__)->SR2 &(__FLAG__)) == (__FLAG__)) : \ - (((__INSTANCE__)->SR3 &(__FLAG__)) == (__FLAG__))) -#else -#define __FMC_NAND_GET_FLAG(__INSTANCE__, __BANK__, __FLAG__) (((__INSTANCE__)->SR &(__FLAG__)) == (__FLAG__)) -#endif /* FMC_Bank2_3 */ - -/** - * @brief Clear flag status of the NAND device. - * @param __INSTANCE__ FMC_NAND Instance - * @param __BANK__ FMC_NAND Bank - * @param __FLAG__ FMC_NAND flag - * This parameter can be any combination of the following values: - * @arg FMC_FLAG_RISING_EDGE: Interrupt rising edge flag. - * @arg FMC_FLAG_LEVEL: Interrupt level edge flag. - * @arg FMC_FLAG_FALLING_EDGE: Interrupt falling edge flag. - * @arg FMC_FLAG_FEMPT: FIFO empty flag. - * @retval None - */ -#if defined(FMC_Bank2_3) -#define __FMC_NAND_CLEAR_FLAG(__INSTANCE__, __BANK__, __FLAG__) (((__BANK__) == FMC_NAND_BANK2) ? \ - ((__INSTANCE__)->SR2 &= ~(__FLAG__)) : \ - ((__INSTANCE__)->SR3 &= ~(__FLAG__))) -#else -#define __FMC_NAND_CLEAR_FLAG(__INSTANCE__, __FLAG__) ((__INSTANCE__)->SR &= ~(__FLAG__)) -#endif /* FMC_Bank2_3 */ - -/** - * @} - */ -#endif /* FMC_Bank3) || defined(FMC_Bank2_3 */ - -#if defined(FMC_Bank4) -/** @defgroup FMC_LL_PCCARD_Interrupt FMC PCCARD Interrupt - * @brief macros to handle PCCARD interrupts - * @{ - */ - -/** - * @brief Enable the PCCARD device interrupt. - * @param __INSTANCE__ FMC_PCCARD instance - * @param __INTERRUPT__ FMC_PCCARD interrupt - * This parameter can be any combination of the following values: - * @arg FMC_IT_RISING_EDGE: Interrupt rising edge. - * @arg FMC_IT_LEVEL: Interrupt level. - * @arg FMC_IT_FALLING_EDGE: Interrupt falling edge. - * @retval None - */ -#define __FMC_PCCARD_ENABLE_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->SR4 |= (__INTERRUPT__)) - -/** - * @brief Disable the PCCARD device interrupt. - * @param __INSTANCE__ FMC_PCCARD instance - * @param __INTERRUPT__ FMC_PCCARD interrupt - * This parameter can be any combination of the following values: - * @arg FMC_IT_RISING_EDGE: Interrupt rising edge. - * @arg FMC_IT_LEVEL: Interrupt level. - * @arg FMC_IT_FALLING_EDGE: Interrupt falling edge. - * @retval None - */ -#define __FMC_PCCARD_DISABLE_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->SR4 &= ~(__INTERRUPT__)) - -/** - * @brief Get flag status of the PCCARD device. - * @param __INSTANCE__ FMC_PCCARD instance - * @param __FLAG__ FMC_PCCARD flag - * This parameter can be any combination of the following values: - * @arg FMC_FLAG_RISING_EDGE: Interrupt rising edge flag. - * @arg FMC_FLAG_LEVEL: Interrupt level edge flag. - * @arg FMC_FLAG_FALLING_EDGE: Interrupt falling edge flag. - * @arg FMC_FLAG_FEMPT: FIFO empty flag. - * @retval The state of FLAG (SET or RESET). - */ -#define __FMC_PCCARD_GET_FLAG(__INSTANCE__, __FLAG__) (((__INSTANCE__)->SR4 &(__FLAG__)) == (__FLAG__)) - -/** - * @brief Clear flag status of the PCCARD device. - * @param __INSTANCE__ FMC_PCCARD instance - * @param __FLAG__ FMC_PCCARD flag - * This parameter can be any combination of the following values: - * @arg FMC_FLAG_RISING_EDGE: Interrupt rising edge flag. - * @arg FMC_FLAG_LEVEL: Interrupt level edge flag. - * @arg FMC_FLAG_FALLING_EDGE: Interrupt falling edge flag. - * @arg FMC_FLAG_FEMPT: FIFO empty flag. - * @retval None - */ -#define __FMC_PCCARD_CLEAR_FLAG(__INSTANCE__, __FLAG__) ((__INSTANCE__)->SR4 &= ~(__FLAG__)) - -/** - * @} - */ -#endif /* FMC_Bank4 */ - -#if defined(FMC_Bank5_6) -/** @defgroup FMC_LL_SDRAM_Interrupt FMC SDRAM Interrupt - * @brief macros to handle SDRAM interrupts - * @{ - */ - -/** - * @brief Enable the SDRAM device interrupt. - * @param __INSTANCE__ FMC_SDRAM instance - * @param __INTERRUPT__ FMC_SDRAM interrupt - * This parameter can be any combination of the following values: - * @arg FMC_IT_REFRESH_ERROR: Interrupt refresh error - * @retval None - */ -#define __FMC_SDRAM_ENABLE_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->SDRTR |= (__INTERRUPT__)) - -/** - * @brief Disable the SDRAM device interrupt. - * @param __INSTANCE__ FMC_SDRAM instance - * @param __INTERRUPT__ FMC_SDRAM interrupt - * This parameter can be any combination of the following values: - * @arg FMC_IT_REFRESH_ERROR: Interrupt refresh error - * @retval None - */ -#define __FMC_SDRAM_DISABLE_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->SDRTR &= ~(__INTERRUPT__)) - -/** - * @brief Get flag status of the SDRAM device. - * @param __INSTANCE__ FMC_SDRAM instance - * @param __FLAG__ FMC_SDRAM flag - * This parameter can be any combination of the following values: - * @arg FMC_SDRAM_FLAG_REFRESH_IT: Interrupt refresh error. - * @arg FMC_SDRAM_FLAG_BUSY: SDRAM busy flag. - * @arg FMC_SDRAM_FLAG_REFRESH_ERROR: Refresh error flag. - * @retval The state of FLAG (SET or RESET). - */ -#define __FMC_SDRAM_GET_FLAG(__INSTANCE__, __FLAG__) (((__INSTANCE__)->SDSR &(__FLAG__)) == (__FLAG__)) - -/** - * @brief Clear flag status of the SDRAM device. - * @param __INSTANCE__ FMC_SDRAM instance - * @param __FLAG__ FMC_SDRAM flag - * This parameter can be any combination of the following values: - * @arg FMC_SDRAM_FLAG_REFRESH_ERROR - * @retval None - */ -#define __FMC_SDRAM_CLEAR_FLAG(__INSTANCE__, __FLAG__) ((__INSTANCE__)->SDRTR |= (__FLAG__)) - -/** - * @} - */ -#endif /* FMC_Bank5_6 */ -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup FMC_LL_Private_Functions FMC LL Private Functions - * @{ - */ - -#if defined(FMC_Bank1) -/** @defgroup FMC_LL_NORSRAM NOR SRAM - * @{ - */ -/** @defgroup FMC_LL_NORSRAM_Private_Functions_Group1 NOR SRAM Initialization/de-initialization functions - * @{ - */ -HAL_StatusTypeDef FMC_NORSRAM_Init(FMC_NORSRAM_TypeDef *Device, - const FMC_NORSRAM_InitTypeDef *Init); -HAL_StatusTypeDef FMC_NORSRAM_Timing_Init(FMC_NORSRAM_TypeDef *Device, - const FMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank); -HAL_StatusTypeDef FMC_NORSRAM_Extended_Timing_Init(FMC_NORSRAM_EXTENDED_TypeDef *Device, - const FMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank, - uint32_t ExtendedMode); -HAL_StatusTypeDef FMC_NORSRAM_DeInit(FMC_NORSRAM_TypeDef *Device, - FMC_NORSRAM_EXTENDED_TypeDef *ExDevice, uint32_t Bank); -/** - * @} - */ - -/** @defgroup FMC_LL_NORSRAM_Private_Functions_Group2 NOR SRAM Control functions - * @{ - */ -HAL_StatusTypeDef FMC_NORSRAM_WriteOperation_Enable(FMC_NORSRAM_TypeDef *Device, uint32_t Bank); -HAL_StatusTypeDef FMC_NORSRAM_WriteOperation_Disable(FMC_NORSRAM_TypeDef *Device, uint32_t Bank); -/** - * @} - */ -/** - * @} - */ -#endif /* FMC_Bank1 */ - -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) -/** @defgroup FMC_LL_NAND NAND - * @{ - */ -/** @defgroup FMC_LL_NAND_Private_Functions_Group1 NAND Initialization/de-initialization functions - * @{ - */ -HAL_StatusTypeDef FMC_NAND_Init(FMC_NAND_TypeDef *Device, const FMC_NAND_InitTypeDef *Init); -HAL_StatusTypeDef FMC_NAND_CommonSpace_Timing_Init(FMC_NAND_TypeDef *Device, - const FMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank); -HAL_StatusTypeDef FMC_NAND_AttributeSpace_Timing_Init(FMC_NAND_TypeDef *Device, - const FMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank); -HAL_StatusTypeDef FMC_NAND_DeInit(FMC_NAND_TypeDef *Device, uint32_t Bank); -/** - * @} - */ - -/** @defgroup FMC_LL_NAND_Private_Functions_Group2 NAND Control functions - * @{ - */ -HAL_StatusTypeDef FMC_NAND_ECC_Enable(FMC_NAND_TypeDef *Device, uint32_t Bank); -HAL_StatusTypeDef FMC_NAND_ECC_Disable(FMC_NAND_TypeDef *Device, uint32_t Bank); -HAL_StatusTypeDef FMC_NAND_GetECC(const FMC_NAND_TypeDef *Device, uint32_t *ECCval, uint32_t Bank, - uint32_t Timeout); -/** - * @} - */ -/** - * @} - */ -#endif /* FMC_Bank3) || defined(FMC_Bank2_3 */ - -#if defined(FMC_Bank4) -/** @defgroup FMC_LL_PCCARD PCCARD - * @{ - */ -/** @defgroup FMC_LL_PCCARD_Private_Functions_Group1 PCCARD Initialization/de-initialization functions - * @{ - */ -HAL_StatusTypeDef FMC_PCCARD_Init(FMC_PCCARD_TypeDef *Device, const FMC_PCCARD_InitTypeDef *Init); -HAL_StatusTypeDef FMC_PCCARD_CommonSpace_Timing_Init(FMC_PCCARD_TypeDef *Device, - const FMC_NAND_PCC_TimingTypeDef *Timing); -HAL_StatusTypeDef FMC_PCCARD_AttributeSpace_Timing_Init(FMC_PCCARD_TypeDef *Device, - const FMC_NAND_PCC_TimingTypeDef *Timing); -HAL_StatusTypeDef FMC_PCCARD_IOSpace_Timing_Init(FMC_PCCARD_TypeDef *Device, - const FMC_NAND_PCC_TimingTypeDef *Timing); -HAL_StatusTypeDef FMC_PCCARD_DeInit(FMC_PCCARD_TypeDef *Device); -/** - * @} - */ -/** - * @} - */ -#endif /* FMC_Bank4 */ - -#if defined(FMC_Bank5_6) -/** @defgroup FMC_LL_SDRAM SDRAM - * @{ - */ -/** @defgroup FMC_LL_SDRAM_Private_Functions_Group1 SDRAM Initialization/de-initialization functions - * @{ - */ -HAL_StatusTypeDef FMC_SDRAM_Init(FMC_SDRAM_TypeDef *Device, const FMC_SDRAM_InitTypeDef *Init); -HAL_StatusTypeDef FMC_SDRAM_Timing_Init(FMC_SDRAM_TypeDef *Device, - const FMC_SDRAM_TimingTypeDef *Timing, uint32_t Bank); -HAL_StatusTypeDef FMC_SDRAM_DeInit(FMC_SDRAM_TypeDef *Device, uint32_t Bank); -/** - * @} - */ - -/** @defgroup FMC_LL_SDRAM_Private_Functions_Group2 SDRAM Control functions - * @{ - */ -HAL_StatusTypeDef FMC_SDRAM_WriteProtection_Enable(FMC_SDRAM_TypeDef *Device, uint32_t Bank); -HAL_StatusTypeDef FMC_SDRAM_WriteProtection_Disable(FMC_SDRAM_TypeDef *Device, uint32_t Bank); -HAL_StatusTypeDef FMC_SDRAM_SendCommand(FMC_SDRAM_TypeDef *Device, - const FMC_SDRAM_CommandTypeDef *Command, uint32_t Timeout); -HAL_StatusTypeDef FMC_SDRAM_ProgramRefreshRate(FMC_SDRAM_TypeDef *Device, uint32_t RefreshRate); -HAL_StatusTypeDef FMC_SDRAM_SetAutoRefreshNumber(FMC_SDRAM_TypeDef *Device, - uint32_t AutoRefreshNumber); -uint32_t FMC_SDRAM_GetModeStatus(const FMC_SDRAM_TypeDef *Device, uint32_t Bank); -/** - * @} - */ -/** - * @} - */ -#endif /* FMC_Bank5_6 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_LL_FMC_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h deleted file mode 100644 index 6bee7fd..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h +++ /dev/null @@ -1,981 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_gpio.h - * @author MCD Application Team - * @brief Header file of GPIO LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_GPIO_H -#define __STM32F4xx_LL_GPIO_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPIOI) || defined (GPIOJ) || defined (GPIOK) - -/** @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_MODER0_0 /*!< Select output mode */ -#define LL_GPIO_MODE_ALTERNATE GPIO_MODER_MODER0_1 /*!< Select alternate function mode */ -#define LL_GPIO_MODE_ANALOG GPIO_MODER_MODER0 /*!< 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_OSPEEDR0_0 /*!< Select I/O medium output speed */ -#define LL_GPIO_SPEED_FREQ_HIGH GPIO_OSPEEDER_OSPEEDR0_1 /*!< Select I/O fast output speed */ -#define LL_GPIO_SPEED_FREQ_VERY_HIGH GPIO_OSPEEDER_OSPEEDR0 /*!< Select I/O high output speed */ -/** - * @} - */ - -/** @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_PUPDR0_0 /*!< Select I/O pull up */ -#define LL_GPIO_PULL_DOWN GPIO_PUPDR_PUPDR0_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 */ -#define LL_GPIO_AF_8 (0x0000008U) /*!< Select alternate function 8 */ -#define LL_GPIO_AF_9 (0x0000009U) /*!< Select alternate function 9 */ -#define LL_GPIO_AF_10 (0x000000AU) /*!< Select alternate function 10 */ -#define LL_GPIO_AF_11 (0x000000BU) /*!< Select alternate function 11 */ -#define LL_GPIO_AF_12 (0x000000CU) /*!< Select alternate function 12 */ -#define LL_GPIO_AF_13 (0x000000DU) /*!< Select alternate function 13 */ -#define LL_GPIO_AF_14 (0x000000EU) /*!< Select alternate function 14 */ -#define LL_GPIO_AF_15 (0x000000FU) /*!< Select alternate function 15 */ -/** - * @} - */ - -/** - * @} - */ - -/* 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, (GPIO_MODER_MODER0 << (POSITION_VAL(Pin) * 2U)), (Mode << (POSITION_VAL(Pin) * 2U))); -} - -/** - * @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, - (GPIO_MODER_MODER0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U)); -} - -/** - * @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) >> POSITION_VAL(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, (GPIO_OSPEEDER_OSPEEDR0 << (POSITION_VAL(Pin) * 2U)), - (Speed << (POSITION_VAL(Pin) * 2U))); -} - -/** - * @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, - (GPIO_OSPEEDER_OSPEEDR0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U)); -} - -/** - * @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, (GPIO_PUPDR_PUPDR0 << (POSITION_VAL(Pin) * 2U)), (Pull << (POSITION_VAL(Pin) * 2U))); -} - -/** - * @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, - (GPIO_PUPDR_PUPDR0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U)); -} - -/** - * @brief Configure gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port. - * @note Possible values are from AF0 to AF15 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 - * @arg @ref LL_GPIO_AF_8 - * @arg @ref LL_GPIO_AF_9 - * @arg @ref LL_GPIO_AF_10 - * @arg @ref LL_GPIO_AF_11 - * @arg @ref LL_GPIO_AF_12 - * @arg @ref LL_GPIO_AF_13 - * @arg @ref LL_GPIO_AF_14 - * @arg @ref LL_GPIO_AF_15 - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate) -{ - MODIFY_REG(GPIOx->AFR[0], (GPIO_AFRL_AFSEL0 << (POSITION_VAL(Pin) * 4U)), - (Alternate << (POSITION_VAL(Pin) * 4U))); -} - -/** - * @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 - * @arg @ref LL_GPIO_AF_8 - * @arg @ref LL_GPIO_AF_9 - * @arg @ref LL_GPIO_AF_10 - * @arg @ref LL_GPIO_AF_11 - * @arg @ref LL_GPIO_AF_12 - * @arg @ref LL_GPIO_AF_13 - * @arg @ref LL_GPIO_AF_14 - * @arg @ref LL_GPIO_AF_15 - */ -__STATIC_INLINE uint32_t LL_GPIO_GetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin) -{ - return (uint32_t)(READ_BIT(GPIOx->AFR[0], - (GPIO_AFRL_AFSEL0 << (POSITION_VAL(Pin) * 4U))) >> (POSITION_VAL(Pin) * 4U)); -} - -/** - * @brief Configure gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port. - * @note Possible values are from AF0 to AF15 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 - * @arg @ref LL_GPIO_AF_8 - * @arg @ref LL_GPIO_AF_9 - * @arg @ref LL_GPIO_AF_10 - * @arg @ref LL_GPIO_AF_11 - * @arg @ref LL_GPIO_AF_12 - * @arg @ref LL_GPIO_AF_13 - * @arg @ref LL_GPIO_AF_14 - * @arg @ref LL_GPIO_AF_15 - * @retval None - */ -__STATIC_INLINE void LL_GPIO_SetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate) -{ - MODIFY_REG(GPIOx->AFR[1], (GPIO_AFRH_AFSEL8 << (POSITION_VAL(Pin >> 8U) * 4U)), - (Alternate << (POSITION_VAL(Pin >> 8U) * 4U))); -} - -/** - * @brief Return gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port. - * @note Possible values are from AF0 to AF15 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 - * @arg @ref LL_GPIO_AF_8 - * @arg @ref LL_GPIO_AF_9 - * @arg @ref LL_GPIO_AF_10 - * @arg @ref LL_GPIO_AF_11 - * @arg @ref LL_GPIO_AF_12 - * @arg @ref LL_GPIO_AF_13 - * @arg @ref LL_GPIO_AF_14 - * @arg @ref LL_GPIO_AF_15 - */ -__STATIC_INLINE uint32_t LL_GPIO_GetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin) -{ - return (uint32_t)(READ_BIT(GPIOx->AFR[1], - (GPIO_AFRH_AFSEL8 << (POSITION_VAL(Pin >> 8U) * 4U))) >> (POSITION_VAL(Pin >> 8U) * 4U)); -} - - -/** - * @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); - 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 BSRR 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->BSRR, (PinMask << 16)); -} - -/** - * @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 (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPIOI) || defined (GPIOJ) || defined (GPIOK) */ -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_GPIO_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h deleted file mode 100644 index 5a17be5..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h +++ /dev/null @@ -1,1890 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_i2c.h - * @author MCD Application Team - * @brief Header file of I2C LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_I2C_H -#define __STM32F4xx_LL_I2C_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (I2C1) || defined (I2C2) || defined (I2C3) - -/** @defgroup I2C_LL I2C - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup I2C_LL_Private_Constants I2C Private Constants - * @{ - */ - -/* Defines used to perform compute and check in the macros */ -#define LL_I2C_MAX_SPEED_STANDARD 100000U -#define LL_I2C_MAX_SPEED_FAST 400000U -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup I2C_LL_Private_Macros I2C Private Macros - * @{ - */ -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup I2C_LL_ES_INIT I2C Exported Init structure - * @{ - */ -typedef struct -{ - uint32_t PeripheralMode; /*!< Specifies the peripheral mode. - This parameter can be a value of @ref I2C_LL_EC_PERIPHERAL_MODE - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetMode(). */ - - uint32_t ClockSpeed; /*!< Specifies the clock frequency. - This parameter must be set to a value lower than 400kHz (in Hz) - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetClockPeriod() - or @ref LL_I2C_SetDutyCycle() or @ref LL_I2C_SetClockSpeedMode() or @ref LL_I2C_ConfigSpeed(). */ - - uint32_t DutyCycle; /*!< Specifies the I2C fast mode duty cycle. - This parameter can be a value of @ref I2C_LL_EC_DUTYCYCLE - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetDutyCycle(). */ - -#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) - uint32_t AnalogFilter; /*!< Enables or disables analog noise filter. - This parameter can be a value of @ref I2C_LL_EC_ANALOGFILTER_SELECTION - - This feature can be modified afterwards using unitary functions @ref LL_I2C_EnableAnalogFilter() or LL_I2C_DisableAnalogFilter(). */ - - uint32_t DigitalFilter; /*!< Configures the digital noise filter. - This parameter can be a number between Min_Data = 0x00 and Max_Data = 0x0F - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetDigitalFilter(). */ - -#endif - uint32_t OwnAddress1; /*!< Specifies the device own address 1. - This parameter must be a value between Min_Data = 0x00 and Max_Data = 0x3FF - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetOwnAddress1(). */ - - uint32_t TypeAcknowledge; /*!< Specifies the ACKnowledge or Non ACKnowledge condition after the address receive match code or next received byte. - This parameter can be a value of @ref I2C_LL_EC_I2C_ACKNOWLEDGE - - This feature can be modified afterwards using unitary function @ref LL_I2C_AcknowledgeNextData(). */ - - uint32_t OwnAddrSize; /*!< Specifies the device own address 1 size (7-bit or 10-bit). - This parameter can be a value of @ref I2C_LL_EC_OWNADDRESS1 - - This feature can be modified afterwards using unitary function @ref LL_I2C_SetOwnAddress1(). */ -} LL_I2C_InitTypeDef; -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup I2C_LL_Exported_Constants I2C Exported Constants - * @{ - */ - -/** @defgroup I2C_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_I2C_ReadReg function - * @{ - */ -#define LL_I2C_SR1_SB I2C_SR1_SB /*!< Start Bit (master mode) */ -#define LL_I2C_SR1_ADDR I2C_SR1_ADDR /*!< Address sent (master mode) or - Address matched flag (slave mode) */ -#define LL_I2C_SR1_BTF I2C_SR1_BTF /*!< Byte Transfer Finished flag */ -#define LL_I2C_SR1_ADD10 I2C_SR1_ADD10 /*!< 10-bit header sent (master mode) */ -#define LL_I2C_SR1_STOPF I2C_SR1_STOPF /*!< Stop detection flag (slave mode) */ -#define LL_I2C_SR1_RXNE I2C_SR1_RXNE /*!< Data register not empty (receivers) */ -#define LL_I2C_SR1_TXE I2C_SR1_TXE /*!< Data register empty (transmitters) */ -#define LL_I2C_SR1_BERR I2C_SR1_BERR /*!< Bus error */ -#define LL_I2C_SR1_ARLO I2C_SR1_ARLO /*!< Arbitration lost */ -#define LL_I2C_SR1_AF I2C_SR1_AF /*!< Acknowledge failure flag */ -#define LL_I2C_SR1_OVR I2C_SR1_OVR /*!< Overrun/Underrun */ -#define LL_I2C_SR1_PECERR I2C_ISR_PECERR /*!< PEC Error in reception (SMBus mode) */ -#define LL_I2C_SR1_TIMEOUT I2C_ISR_TIMEOUT /*!< Timeout detection flag (SMBus mode) */ -#define LL_I2C_SR1_SMALERT I2C_ISR_SMALERT /*!< SMBus alert (SMBus mode) */ -#define LL_I2C_SR2_MSL I2C_SR2_MSL /*!< Master/Slave flag */ -#define LL_I2C_SR2_BUSY I2C_SR2_BUSY /*!< Bus busy flag */ -#define LL_I2C_SR2_TRA I2C_SR2_TRA /*!< Transmitter/receiver direction */ -#define LL_I2C_SR2_GENCALL I2C_SR2_GENCALL /*!< General call address (Slave mode) */ -#define LL_I2C_SR2_SMBDEFAULT I2C_SR2_SMBDEFAULT /*!< SMBus Device default address (Slave mode) */ -#define LL_I2C_SR2_SMBHOST I2C_SR2_SMBHOST /*!< SMBus Host address (Slave mode) */ -#define LL_I2C_SR2_DUALF I2C_SR2_DUALF /*!< Dual flag (Slave mode) */ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_I2C_ReadReg and LL_I2C_WriteReg functions - * @{ - */ -#define LL_I2C_CR2_ITEVTEN I2C_CR2_ITEVTEN /*!< Events interrupts enable */ -#define LL_I2C_CR2_ITBUFEN I2C_CR2_ITBUFEN /*!< Buffer interrupts enable */ -#define LL_I2C_CR2_ITERREN I2C_CR2_ITERREN /*!< Error interrupts enable */ -/** - * @} - */ - -#if defined(I2C_FLTR_ANOFF) -/** @defgroup I2C_LL_EC_ANALOGFILTER_SELECTION Analog Filter Selection - * @{ - */ -#define LL_I2C_ANALOGFILTER_ENABLE 0x00000000U /*!< Analog filter is enabled. */ -#define LL_I2C_ANALOGFILTER_DISABLE I2C_FLTR_ANOFF /*!< Analog filter is disabled.*/ -/** - * @} - */ - -#endif -/** @defgroup I2C_LL_EC_OWNADDRESS1 Own Address 1 Length - * @{ - */ -#define LL_I2C_OWNADDRESS1_7BIT 0x00004000U /*!< Own address 1 is a 7-bit address. */ -#define LL_I2C_OWNADDRESS1_10BIT (uint32_t)(I2C_OAR1_ADDMODE | 0x00004000U) /*!< Own address 1 is a 10-bit address. */ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_DUTYCYCLE Fast Mode Duty Cycle - * @{ - */ -#define LL_I2C_DUTYCYCLE_2 0x00000000U /*!< I2C fast mode Tlow/Thigh = 2 */ -#define LL_I2C_DUTYCYCLE_16_9 I2C_CCR_DUTY /*!< I2C fast mode Tlow/Thigh = 16/9 */ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_CLOCK_SPEED_MODE Master Clock Speed Mode - * @{ - */ -#define LL_I2C_CLOCK_SPEED_STANDARD_MODE 0x00000000U /*!< Master clock speed range is standard mode */ -#define LL_I2C_CLOCK_SPEED_FAST_MODE I2C_CCR_FS /*!< Master clock speed range is fast mode */ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_PERIPHERAL_MODE Peripheral Mode - * @{ - */ -#define LL_I2C_MODE_I2C 0x00000000U /*!< I2C Master or Slave mode */ -#define LL_I2C_MODE_SMBUS_HOST (uint32_t)(I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP) /*!< SMBus Host address acknowledge */ -#define LL_I2C_MODE_SMBUS_DEVICE I2C_CR1_SMBUS /*!< SMBus Device default mode (Default address not acknowledge) */ -#define LL_I2C_MODE_SMBUS_DEVICE_ARP (uint32_t)(I2C_CR1_SMBUS | I2C_CR1_ENARP) /*!< SMBus Device Default address acknowledge */ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_I2C_ACKNOWLEDGE Acknowledge Generation - * @{ - */ -#define LL_I2C_ACK I2C_CR1_ACK /*!< ACK is sent after current received byte. */ -#define LL_I2C_NACK 0x00000000U /*!< NACK is sent after current received byte.*/ -/** - * @} - */ - -/** @defgroup I2C_LL_EC_DIRECTION Read Write Direction - * @{ - */ -#define LL_I2C_DIRECTION_WRITE I2C_SR2_TRA /*!< Bus is in write transfer */ -#define LL_I2C_DIRECTION_READ 0x00000000U /*!< Bus is in read transfer */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup I2C_LL_Exported_Macros I2C Exported Macros - * @{ - */ - -/** @defgroup I2C_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in I2C register - * @param __INSTANCE__ I2C Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_I2C_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in I2C register - * @param __INSTANCE__ I2C Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_I2C_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** @defgroup I2C_LL_EM_Exported_Macros_Helper Exported Macros Helper - * @{ - */ - -/** - * @brief Convert Peripheral Clock Frequency in Mhz. - * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). - * @retval Value of peripheral clock (in Mhz) - */ -#define __LL_I2C_FREQ_HZ_TO_MHZ(__PCLK__) (uint32_t)((__PCLK__)/1000000U) - -/** - * @brief Convert Peripheral Clock Frequency in Hz. - * @param __PCLK__ This parameter must be a value of peripheral clock (in Mhz). - * @retval Value of peripheral clock (in Hz) - */ -#define __LL_I2C_FREQ_MHZ_TO_HZ(__PCLK__) (uint32_t)((__PCLK__)*1000000U) - -/** - * @brief Compute I2C Clock rising time. - * @param __FREQRANGE__ This parameter must be a value of peripheral clock (in Mhz). - * @param __SPEED__ This parameter must be a value lower than 400kHz (in Hz). - * @retval Value between Min_Data=0x02 and Max_Data=0x3F - */ -#define __LL_I2C_RISE_TIME(__FREQRANGE__, __SPEED__) (uint32_t)(((__SPEED__) <= LL_I2C_MAX_SPEED_STANDARD) ? ((__FREQRANGE__) + 1U) : ((((__FREQRANGE__) * 300U) / 1000U) + 1U)) - -/** - * @brief Compute Speed clock range to a Clock Control Register (I2C_CCR_CCR) value. - * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). - * @param __SPEED__ This parameter must be a value lower than 400kHz (in Hz). - * @param __DUTYCYCLE__ This parameter can be one of the following values: - * @arg @ref LL_I2C_DUTYCYCLE_2 - * @arg @ref LL_I2C_DUTYCYCLE_16_9 - * @retval Value between Min_Data=0x004 and Max_Data=0xFFF, except in FAST DUTY mode where Min_Data=0x001. - */ -#define __LL_I2C_SPEED_TO_CCR(__PCLK__, __SPEED__, __DUTYCYCLE__) (uint32_t)(((__SPEED__) <= LL_I2C_MAX_SPEED_STANDARD)? \ - (__LL_I2C_SPEED_STANDARD_TO_CCR((__PCLK__), (__SPEED__))) : \ - (__LL_I2C_SPEED_FAST_TO_CCR((__PCLK__), (__SPEED__), (__DUTYCYCLE__)))) - -/** - * @brief Compute Speed Standard clock range to a Clock Control Register (I2C_CCR_CCR) value. - * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). - * @param __SPEED__ This parameter must be a value lower than 100kHz (in Hz). - * @retval Value between Min_Data=0x004 and Max_Data=0xFFF. - */ -#define __LL_I2C_SPEED_STANDARD_TO_CCR(__PCLK__, __SPEED__) (uint32_t)(((((__PCLK__)/((__SPEED__) << 1U)) & I2C_CCR_CCR) < 4U)? 4U:((__PCLK__) / ((__SPEED__) << 1U))) - -/** - * @brief Compute Speed Fast clock range to a Clock Control Register (I2C_CCR_CCR) value. - * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). - * @param __SPEED__ This parameter must be a value between Min_Data=100Khz and Max_Data=400Khz (in Hz). - * @param __DUTYCYCLE__ This parameter can be one of the following values: - * @arg @ref LL_I2C_DUTYCYCLE_2 - * @arg @ref LL_I2C_DUTYCYCLE_16_9 - * @retval Value between Min_Data=0x001 and Max_Data=0xFFF - */ -#define __LL_I2C_SPEED_FAST_TO_CCR(__PCLK__, __SPEED__, __DUTYCYCLE__) (uint32_t)(((__DUTYCYCLE__) == LL_I2C_DUTYCYCLE_2)? \ - (((((__PCLK__) / ((__SPEED__) * 3U)) & I2C_CCR_CCR) == 0U)? 1U:((__PCLK__) / ((__SPEED__) * 3U))) : \ - (((((__PCLK__) / ((__SPEED__) * 25U)) & I2C_CCR_CCR) == 0U)? 1U:((__PCLK__) / ((__SPEED__) * 25U)))) - -/** - * @brief Get the Least significant bits of a 10-Bits address. - * @param __ADDRESS__ This parameter must be a value of a 10-Bits slave address. - * @retval Value between Min_Data=0x00 and Max_Data=0xFF - */ -#define __LL_I2C_10BIT_ADDRESS(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FF)))) - -/** - * @brief Convert a 10-Bits address to a 10-Bits header with Write direction. - * @param __ADDRESS__ This parameter must be a value of a 10-Bits slave address. - * @retval Value between Min_Data=0xF0 and Max_Data=0xF6 - */ -#define __LL_I2C_10BIT_HEADER_WRITE(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0x0300))) >> 7) | (uint16_t)(0xF0)))) - -/** - * @brief Convert a 10-Bits address to a 10-Bits header with Read direction. - * @param __ADDRESS__ This parameter must be a value of a 10-Bits slave address. - * @retval Value between Min_Data=0xF1 and Max_Data=0xF7 - */ -#define __LL_I2C_10BIT_HEADER_READ(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0x0300))) >> 7) | (uint16_t)(0xF1)))) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup I2C_LL_Exported_Functions I2C Exported Functions - * @{ - */ - -/** @defgroup I2C_LL_EF_Configuration Configuration - * @{ - */ - -/** - * @brief Enable I2C peripheral (PE = 1). - * @rmtoll CR1 PE LL_I2C_Enable - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_Enable(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_PE); -} - -/** - * @brief Disable I2C peripheral (PE = 0). - * @rmtoll CR1 PE LL_I2C_Disable - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_Disable(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_PE); -} - -/** - * @brief Check if the I2C peripheral is enabled or disabled. - * @rmtoll CR1 PE LL_I2C_IsEnabled - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabled(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_PE) == (I2C_CR1_PE)); -} - -#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) -/** - * @brief Configure Noise Filters (Analog and Digital). - * @note If the analog filter is also enabled, the digital filter is added to analog filter. - * The filters can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll FLTR ANOFF LL_I2C_ConfigFilters\n - * FLTR DNF LL_I2C_ConfigFilters - * @param I2Cx I2C Instance. - * @param AnalogFilter This parameter can be one of the following values: - * @arg @ref LL_I2C_ANALOGFILTER_ENABLE - * @arg @ref LL_I2C_ANALOGFILTER_DISABLE - * @param DigitalFilter This parameter must be a value between Min_Data=0x00 (Digital filter disabled) and Max_Data=0x0F (Digital filter enabled and filtering capability up to 15*TPCLK1) - * This parameter is used to configure the digital noise filter on SDA and SCL input. The digital filter will suppress the spikes with a length of up to DNF[3:0]*TPCLK1. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ConfigFilters(I2C_TypeDef *I2Cx, uint32_t AnalogFilter, uint32_t DigitalFilter) -{ - MODIFY_REG(I2Cx->FLTR, I2C_FLTR_ANOFF | I2C_FLTR_DNF, AnalogFilter | DigitalFilter); -} -#endif -#if defined(I2C_FLTR_DNF) - -/** - * @brief Configure Digital Noise Filter. - * @note If the analog filter is also enabled, the digital filter is added to analog filter. - * This filter can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll FLTR DNF LL_I2C_SetDigitalFilter - * @param I2Cx I2C Instance. - * @param DigitalFilter This parameter must be a value between Min_Data=0x00 (Digital filter disabled) and Max_Data=0x0F (Digital filter enabled and filtering capability up to 15*TPCLK1) - * This parameter is used to configure the digital noise filter on SDA and SCL input. The digital filter will suppress the spikes with a length of up to DNF[3:0]*TPCLK1. - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetDigitalFilter(I2C_TypeDef *I2Cx, uint32_t DigitalFilter) -{ - MODIFY_REG(I2Cx->FLTR, I2C_FLTR_DNF, DigitalFilter); -} - -/** - * @brief Get the current Digital Noise Filter configuration. - * @rmtoll FLTR DNF LL_I2C_GetDigitalFilter - * @param I2Cx I2C Instance. - * @retval Value between Min_Data=0x0 and Max_Data=0xF - */ -__STATIC_INLINE uint32_t LL_I2C_GetDigitalFilter(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->FLTR, I2C_FLTR_DNF)); -} -#endif -#if defined(I2C_FLTR_ANOFF) - -/** - * @brief Enable Analog Noise Filter. - * @note This filter can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll FLTR ANOFF LL_I2C_EnableAnalogFilter - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableAnalogFilter(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->FLTR, I2C_FLTR_ANOFF); -} - -/** - * @brief Disable Analog Noise Filter. - * @note This filter can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll FLTR ANOFF LL_I2C_DisableAnalogFilter - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableAnalogFilter(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->FLTR, I2C_FLTR_ANOFF); -} - -/** - * @brief Check if Analog Noise Filter is enabled or disabled. - * @rmtoll FLTR ANOFF LL_I2C_IsEnabledAnalogFilter - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledAnalogFilter(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->FLTR, I2C_FLTR_ANOFF) == (I2C_FLTR_ANOFF)); -} -#endif - -/** - * @brief Enable DMA transmission requests. - * @rmtoll CR2 DMAEN LL_I2C_EnableDMAReq_TX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableDMAReq_TX(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_DMAEN); -} - -/** - * @brief Disable DMA transmission requests. - * @rmtoll CR2 DMAEN LL_I2C_DisableDMAReq_TX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableDMAReq_TX(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_DMAEN); -} - -/** - * @brief Check if DMA transmission requests are enabled or disabled. - * @rmtoll CR2 DMAEN LL_I2C_IsEnabledDMAReq_TX - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledDMAReq_TX(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_DMAEN) == (I2C_CR2_DMAEN)); -} - -/** - * @brief Enable DMA reception requests. - * @rmtoll CR2 DMAEN LL_I2C_EnableDMAReq_RX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableDMAReq_RX(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_DMAEN); -} - -/** - * @brief Disable DMA reception requests. - * @rmtoll CR2 DMAEN LL_I2C_DisableDMAReq_RX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableDMAReq_RX(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_DMAEN); -} - -/** - * @brief Check if DMA reception requests are enabled or disabled. - * @rmtoll CR2 DMAEN LL_I2C_IsEnabledDMAReq_RX - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledDMAReq_RX(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_DMAEN) == (I2C_CR2_DMAEN)); -} - -/** - * @brief Get the data register address used for DMA transfer. - * @rmtoll DR DR LL_I2C_DMA_GetRegAddr - * @param I2Cx I2C Instance. - * @retval Address of data register - */ -__STATIC_INLINE uint32_t LL_I2C_DMA_GetRegAddr(I2C_TypeDef *I2Cx) -{ - return (uint32_t) & (I2Cx->DR); -} - -/** - * @brief Enable Clock stretching. - * @note This bit can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll CR1 NOSTRETCH LL_I2C_EnableClockStretching - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableClockStretching(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_NOSTRETCH); -} - -/** - * @brief Disable Clock stretching. - * @note This bit can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll CR1 NOSTRETCH LL_I2C_DisableClockStretching - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableClockStretching(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_NOSTRETCH); -} - -/** - * @brief Check if Clock stretching is enabled or disabled. - * @rmtoll CR1 NOSTRETCH LL_I2C_IsEnabledClockStretching - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledClockStretching(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_NOSTRETCH) != (I2C_CR1_NOSTRETCH)); -} - -/** - * @brief Enable General Call. - * @note When enabled the Address 0x00 is ACKed. - * @rmtoll CR1 ENGC LL_I2C_EnableGeneralCall - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableGeneralCall(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_ENGC); -} - -/** - * @brief Disable General Call. - * @note When disabled the Address 0x00 is NACKed. - * @rmtoll CR1 ENGC LL_I2C_DisableGeneralCall - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableGeneralCall(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_ENGC); -} - -/** - * @brief Check if General Call is enabled or disabled. - * @rmtoll CR1 ENGC LL_I2C_IsEnabledGeneralCall - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledGeneralCall(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_ENGC) == (I2C_CR1_ENGC)); -} - -/** - * @brief Set the Own Address1. - * @rmtoll OAR1 ADD0 LL_I2C_SetOwnAddress1\n - * OAR1 ADD1_7 LL_I2C_SetOwnAddress1\n - * OAR1 ADD8_9 LL_I2C_SetOwnAddress1\n - * OAR1 ADDMODE LL_I2C_SetOwnAddress1 - * @param I2Cx I2C Instance. - * @param OwnAddress1 This parameter must be a value between Min_Data=0 and Max_Data=0x3FF. - * @param OwnAddrSize This parameter can be one of the following values: - * @arg @ref LL_I2C_OWNADDRESS1_7BIT - * @arg @ref LL_I2C_OWNADDRESS1_10BIT - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetOwnAddress1(I2C_TypeDef *I2Cx, uint32_t OwnAddress1, uint32_t OwnAddrSize) -{ - MODIFY_REG(I2Cx->OAR1, I2C_OAR1_ADD0 | I2C_OAR1_ADD1_7 | I2C_OAR1_ADD8_9 | I2C_OAR1_ADDMODE, OwnAddress1 | OwnAddrSize); -} - -/** - * @brief Set the 7bits Own Address2. - * @note This action has no effect if own address2 is enabled. - * @rmtoll OAR2 ADD2 LL_I2C_SetOwnAddress2 - * @param I2Cx I2C Instance. - * @param OwnAddress2 This parameter must be a value between Min_Data=0 and Max_Data=0x7F. - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetOwnAddress2(I2C_TypeDef *I2Cx, uint32_t OwnAddress2) -{ - MODIFY_REG(I2Cx->OAR2, I2C_OAR2_ADD2, OwnAddress2); -} - -/** - * @brief Enable acknowledge on Own Address2 match address. - * @rmtoll OAR2 ENDUAL LL_I2C_EnableOwnAddress2 - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableOwnAddress2(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->OAR2, I2C_OAR2_ENDUAL); -} - -/** - * @brief Disable acknowledge on Own Address2 match address. - * @rmtoll OAR2 ENDUAL LL_I2C_DisableOwnAddress2 - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableOwnAddress2(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->OAR2, I2C_OAR2_ENDUAL); -} - -/** - * @brief Check if Own Address1 acknowledge is enabled or disabled. - * @rmtoll OAR2 ENDUAL LL_I2C_IsEnabledOwnAddress2 - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledOwnAddress2(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->OAR2, I2C_OAR2_ENDUAL) == (I2C_OAR2_ENDUAL)); -} - -/** - * @brief Configure the Peripheral clock frequency. - * @rmtoll CR2 FREQ LL_I2C_SetPeriphClock - * @param I2Cx I2C Instance. - * @param PeriphClock Peripheral Clock (in Hz) - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetPeriphClock(I2C_TypeDef *I2Cx, uint32_t PeriphClock) -{ - MODIFY_REG(I2Cx->CR2, I2C_CR2_FREQ, __LL_I2C_FREQ_HZ_TO_MHZ(PeriphClock)); -} - -/** - * @brief Get the Peripheral clock frequency. - * @rmtoll CR2 FREQ LL_I2C_GetPeriphClock - * @param I2Cx I2C Instance. - * @retval Value of Peripheral Clock (in Hz) - */ -__STATIC_INLINE uint32_t LL_I2C_GetPeriphClock(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(__LL_I2C_FREQ_MHZ_TO_HZ(READ_BIT(I2Cx->CR2, I2C_CR2_FREQ))); -} - -/** - * @brief Configure the Duty cycle (Fast mode only). - * @rmtoll CCR DUTY LL_I2C_SetDutyCycle - * @param I2Cx I2C Instance. - * @param DutyCycle This parameter can be one of the following values: - * @arg @ref LL_I2C_DUTYCYCLE_2 - * @arg @ref LL_I2C_DUTYCYCLE_16_9 - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetDutyCycle(I2C_TypeDef *I2Cx, uint32_t DutyCycle) -{ - MODIFY_REG(I2Cx->CCR, I2C_CCR_DUTY, DutyCycle); -} - -/** - * @brief Get the Duty cycle (Fast mode only). - * @rmtoll CCR DUTY LL_I2C_GetDutyCycle - * @param I2Cx I2C Instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_DUTYCYCLE_2 - * @arg @ref LL_I2C_DUTYCYCLE_16_9 - */ -__STATIC_INLINE uint32_t LL_I2C_GetDutyCycle(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->CCR, I2C_CCR_DUTY)); -} - -/** - * @brief Configure the I2C master clock speed mode. - * @rmtoll CCR FS LL_I2C_SetClockSpeedMode - * @param I2Cx I2C Instance. - * @param ClockSpeedMode This parameter can be one of the following values: - * @arg @ref LL_I2C_CLOCK_SPEED_STANDARD_MODE - * @arg @ref LL_I2C_CLOCK_SPEED_FAST_MODE - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetClockSpeedMode(I2C_TypeDef *I2Cx, uint32_t ClockSpeedMode) -{ - MODIFY_REG(I2Cx->CCR, I2C_CCR_FS, ClockSpeedMode); -} - -/** - * @brief Get the the I2C master speed mode. - * @rmtoll CCR FS LL_I2C_GetClockSpeedMode - * @param I2Cx I2C Instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_CLOCK_SPEED_STANDARD_MODE - * @arg @ref LL_I2C_CLOCK_SPEED_FAST_MODE - */ -__STATIC_INLINE uint32_t LL_I2C_GetClockSpeedMode(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->CCR, I2C_CCR_FS)); -} - -/** - * @brief Configure the SCL, SDA rising time. - * @note This bit can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll TRISE TRISE LL_I2C_SetRiseTime - * @param I2Cx I2C Instance. - * @param RiseTime This parameter must be a value between Min_Data=0x02 and Max_Data=0x3F. - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetRiseTime(I2C_TypeDef *I2Cx, uint32_t RiseTime) -{ - MODIFY_REG(I2Cx->TRISE, I2C_TRISE_TRISE, RiseTime); -} - -/** - * @brief Get the SCL, SDA rising time. - * @rmtoll TRISE TRISE LL_I2C_GetRiseTime - * @param I2Cx I2C Instance. - * @retval Value between Min_Data=0x02 and Max_Data=0x3F - */ -__STATIC_INLINE uint32_t LL_I2C_GetRiseTime(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->TRISE, I2C_TRISE_TRISE)); -} - -/** - * @brief Configure the SCL high and low period. - * @note This bit can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll CCR CCR LL_I2C_SetClockPeriod - * @param I2Cx I2C Instance. - * @param ClockPeriod This parameter must be a value between Min_Data=0x004 and Max_Data=0xFFF, except in FAST DUTY mode where Min_Data=0x001. - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetClockPeriod(I2C_TypeDef *I2Cx, uint32_t ClockPeriod) -{ - MODIFY_REG(I2Cx->CCR, I2C_CCR_CCR, ClockPeriod); -} - -/** - * @brief Get the SCL high and low period. - * @rmtoll CCR CCR LL_I2C_GetClockPeriod - * @param I2Cx I2C Instance. - * @retval Value between Min_Data=0x004 and Max_Data=0xFFF, except in FAST DUTY mode where Min_Data=0x001. - */ -__STATIC_INLINE uint32_t LL_I2C_GetClockPeriod(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->CCR, I2C_CCR_CCR)); -} - -/** - * @brief Configure the SCL speed. - * @note This bit can only be programmed when the I2C is disabled (PE = 0). - * @rmtoll CR2 FREQ LL_I2C_ConfigSpeed\n - * TRISE TRISE LL_I2C_ConfigSpeed\n - * CCR FS LL_I2C_ConfigSpeed\n - * CCR DUTY LL_I2C_ConfigSpeed\n - * CCR CCR LL_I2C_ConfigSpeed - * @param I2Cx I2C Instance. - * @param PeriphClock Peripheral Clock (in Hz) - * @param ClockSpeed This parameter must be a value lower than 400kHz (in Hz). - * @param DutyCycle This parameter can be one of the following values: - * @arg @ref LL_I2C_DUTYCYCLE_2 - * @arg @ref LL_I2C_DUTYCYCLE_16_9 - * @retval None - */ -__STATIC_INLINE void LL_I2C_ConfigSpeed(I2C_TypeDef *I2Cx, uint32_t PeriphClock, uint32_t ClockSpeed, - uint32_t DutyCycle) -{ - uint32_t freqrange = 0x0U; - uint32_t clockconfig = 0x0U; - - /* Compute frequency range */ - freqrange = __LL_I2C_FREQ_HZ_TO_MHZ(PeriphClock); - - /* Configure I2Cx: Frequency range register */ - MODIFY_REG(I2Cx->CR2, I2C_CR2_FREQ, freqrange); - - /* Configure I2Cx: Rise Time register */ - MODIFY_REG(I2Cx->TRISE, I2C_TRISE_TRISE, __LL_I2C_RISE_TIME(freqrange, ClockSpeed)); - - /* Configure Speed mode, Duty Cycle and Clock control register value */ - if (ClockSpeed > LL_I2C_MAX_SPEED_STANDARD) - { - /* Set Speed mode at fast and duty cycle for Clock Speed request in fast clock range */ - clockconfig = LL_I2C_CLOCK_SPEED_FAST_MODE | \ - __LL_I2C_SPEED_FAST_TO_CCR(PeriphClock, ClockSpeed, DutyCycle) | \ - DutyCycle; - } - else - { - /* Set Speed mode at standard for Clock Speed request in standard clock range */ - clockconfig = LL_I2C_CLOCK_SPEED_STANDARD_MODE | \ - __LL_I2C_SPEED_STANDARD_TO_CCR(PeriphClock, ClockSpeed); - } - - /* Configure I2Cx: Clock control register */ - MODIFY_REG(I2Cx->CCR, (I2C_CCR_FS | I2C_CCR_DUTY | I2C_CCR_CCR), clockconfig); -} - -/** - * @brief Configure peripheral mode. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 SMBUS LL_I2C_SetMode\n - * CR1 SMBTYPE LL_I2C_SetMode\n - * CR1 ENARP LL_I2C_SetMode - * @param I2Cx I2C Instance. - * @param PeripheralMode This parameter can be one of the following values: - * @arg @ref LL_I2C_MODE_I2C - * @arg @ref LL_I2C_MODE_SMBUS_HOST - * @arg @ref LL_I2C_MODE_SMBUS_DEVICE - * @arg @ref LL_I2C_MODE_SMBUS_DEVICE_ARP - * @retval None - */ -__STATIC_INLINE void LL_I2C_SetMode(I2C_TypeDef *I2Cx, uint32_t PeripheralMode) -{ - MODIFY_REG(I2Cx->CR1, I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP, PeripheralMode); -} - -/** - * @brief Get peripheral mode. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 SMBUS LL_I2C_GetMode\n - * CR1 SMBTYPE LL_I2C_GetMode\n - * CR1 ENARP LL_I2C_GetMode - * @param I2Cx I2C Instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_MODE_I2C - * @arg @ref LL_I2C_MODE_SMBUS_HOST - * @arg @ref LL_I2C_MODE_SMBUS_DEVICE - * @arg @ref LL_I2C_MODE_SMBUS_DEVICE_ARP - */ -__STATIC_INLINE uint32_t LL_I2C_GetMode(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->CR1, I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP)); -} - -/** - * @brief Enable SMBus alert (Host or Device mode) - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note SMBus Device mode: - * - SMBus Alert pin is drived low and - * Alert Response Address Header acknowledge is enabled. - * SMBus Host mode: - * - SMBus Alert pin management is supported. - * @rmtoll CR1 ALERT LL_I2C_EnableSMBusAlert - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableSMBusAlert(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_ALERT); -} - -/** - * @brief Disable SMBus alert (Host or Device mode) - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note SMBus Device mode: - * - SMBus Alert pin is not drived (can be used as a standard GPIO) and - * Alert Response Address Header acknowledge is disabled. - * SMBus Host mode: - * - SMBus Alert pin management is not supported. - * @rmtoll CR1 ALERT LL_I2C_DisableSMBusAlert - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableSMBusAlert(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_ALERT); -} - -/** - * @brief Check if SMBus alert (Host or Device mode) is enabled or disabled. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 ALERT LL_I2C_IsEnabledSMBusAlert - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusAlert(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_ALERT) == (I2C_CR1_ALERT)); -} - -/** - * @brief Enable SMBus Packet Error Calculation (PEC). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 ENPEC LL_I2C_EnableSMBusPEC - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableSMBusPEC(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_ENPEC); -} - -/** - * @brief Disable SMBus Packet Error Calculation (PEC). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 ENPEC LL_I2C_DisableSMBusPEC - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableSMBusPEC(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_ENPEC); -} - -/** - * @brief Check if SMBus Packet Error Calculation (PEC) is enabled or disabled. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 ENPEC LL_I2C_IsEnabledSMBusPEC - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusPEC(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_ENPEC) == (I2C_CR1_ENPEC)); -} - -/** - * @} - */ - -/** @defgroup I2C_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable TXE interrupt. - * @rmtoll CR2 ITEVTEN LL_I2C_EnableIT_TX\n - * CR2 ITBUFEN LL_I2C_EnableIT_TX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableIT_TX(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); -} - -/** - * @brief Disable TXE interrupt. - * @rmtoll CR2 ITEVTEN LL_I2C_DisableIT_TX\n - * CR2 ITBUFEN LL_I2C_DisableIT_TX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableIT_TX(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); -} - -/** - * @brief Check if the TXE Interrupt is enabled or disabled. - * @rmtoll CR2 ITEVTEN LL_I2C_IsEnabledIT_TX\n - * CR2 ITBUFEN LL_I2C_IsEnabledIT_TX - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_TX(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN) == (I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN)); -} - -/** - * @brief Enable RXNE interrupt. - * @rmtoll CR2 ITEVTEN LL_I2C_EnableIT_RX\n - * CR2 ITBUFEN LL_I2C_EnableIT_RX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableIT_RX(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); -} - -/** - * @brief Disable RXNE interrupt. - * @rmtoll CR2 ITEVTEN LL_I2C_DisableIT_RX\n - * CR2 ITBUFEN LL_I2C_DisableIT_RX - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableIT_RX(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); -} - -/** - * @brief Check if the RXNE Interrupt is enabled or disabled. - * @rmtoll CR2 ITEVTEN LL_I2C_IsEnabledIT_RX\n - * CR2 ITBUFEN LL_I2C_IsEnabledIT_RX - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_RX(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN) == (I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN)); -} - -/** - * @brief Enable Events interrupts. - * @note Any of these events will generate interrupt : - * Start Bit (SB) - * Address sent, Address matched (ADDR) - * 10-bit header sent (ADD10) - * Stop detection (STOPF) - * Byte transfer finished (BTF) - * - * @note Any of these events will generate interrupt if Buffer interrupts are enabled too(using unitary function @ref LL_I2C_EnableIT_BUF()) : - * Receive buffer not empty (RXNE) - * Transmit buffer empty (TXE) - * @rmtoll CR2 ITEVTEN LL_I2C_EnableIT_EVT - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableIT_EVT(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN); -} - -/** - * @brief Disable Events interrupts. - * @note Any of these events will generate interrupt : - * Start Bit (SB) - * Address sent, Address matched (ADDR) - * 10-bit header sent (ADD10) - * Stop detection (STOPF) - * Byte transfer finished (BTF) - * Receive buffer not empty (RXNE) - * Transmit buffer empty (TXE) - * @rmtoll CR2 ITEVTEN LL_I2C_DisableIT_EVT - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableIT_EVT(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN); -} - -/** - * @brief Check if Events interrupts are enabled or disabled. - * @rmtoll CR2 ITEVTEN LL_I2C_IsEnabledIT_EVT - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_EVT(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN) == (I2C_CR2_ITEVTEN)); -} - -/** - * @brief Enable Buffer interrupts. - * @note Any of these Buffer events will generate interrupt if Events interrupts are enabled too(using unitary function @ref LL_I2C_EnableIT_EVT()) : - * Receive buffer not empty (RXNE) - * Transmit buffer empty (TXE) - * @rmtoll CR2 ITBUFEN LL_I2C_EnableIT_BUF - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableIT_BUF(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_ITBUFEN); -} - -/** - * @brief Disable Buffer interrupts. - * @note Any of these Buffer events will generate interrupt : - * Receive buffer not empty (RXNE) - * Transmit buffer empty (TXE) - * @rmtoll CR2 ITBUFEN LL_I2C_DisableIT_BUF - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableIT_BUF(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITBUFEN); -} - -/** - * @brief Check if Buffer interrupts are enabled or disabled. - * @rmtoll CR2 ITBUFEN LL_I2C_IsEnabledIT_BUF - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_BUF(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_ITBUFEN) == (I2C_CR2_ITBUFEN)); -} - -/** - * @brief Enable Error interrupts. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note Any of these errors will generate interrupt : - * Bus Error detection (BERR) - * Arbitration Loss (ARLO) - * Acknowledge Failure(AF) - * Overrun/Underrun (OVR) - * SMBus Timeout detection (TIMEOUT) - * SMBus PEC error detection (PECERR) - * SMBus Alert pin event detection (SMBALERT) - * @rmtoll CR2 ITERREN LL_I2C_EnableIT_ERR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableIT_ERR(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_ITERREN); -} - -/** - * @brief Disable Error interrupts. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note Any of these errors will generate interrupt : - * Bus Error detection (BERR) - * Arbitration Loss (ARLO) - * Acknowledge Failure(AF) - * Overrun/Underrun (OVR) - * SMBus Timeout detection (TIMEOUT) - * SMBus PEC error detection (PECERR) - * SMBus Alert pin event detection (SMBALERT) - * @rmtoll CR2 ITERREN LL_I2C_DisableIT_ERR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableIT_ERR(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITERREN); -} - -/** - * @brief Check if Error interrupts are enabled or disabled. - * @rmtoll CR2 ITERREN LL_I2C_IsEnabledIT_ERR - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_ERR(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_ITERREN) == (I2C_CR2_ITERREN)); -} - -/** - * @} - */ - -/** @defgroup I2C_LL_EF_FLAG_management FLAG_management - * @{ - */ - -/** - * @brief Indicate the status of Transmit data register empty flag. - * @note RESET: When next data is written in Transmit data register. - * SET: When Transmit data register is empty. - * @rmtoll SR1 TXE LL_I2C_IsActiveFlag_TXE - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_TXE(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_TXE) == (I2C_SR1_TXE)); -} - -/** - * @brief Indicate the status of Byte Transfer Finished flag. - * RESET: When Data byte transfer not done. - * SET: When Data byte transfer succeeded. - * @rmtoll SR1 BTF LL_I2C_IsActiveFlag_BTF - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_BTF(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_BTF) == (I2C_SR1_BTF)); -} - -/** - * @brief Indicate the status of Receive data register not empty flag. - * @note RESET: When Receive data register is read. - * SET: When the received data is copied in Receive data register. - * @rmtoll SR1 RXNE LL_I2C_IsActiveFlag_RXNE - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_RXNE(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_RXNE) == (I2C_SR1_RXNE)); -} - -/** - * @brief Indicate the status of Start Bit (master mode). - * @note RESET: When No Start condition. - * SET: When Start condition is generated. - * @rmtoll SR1 SB LL_I2C_IsActiveFlag_SB - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_SB(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_SB) == (I2C_SR1_SB)); -} - -/** - * @brief Indicate the status of Address sent (master mode) or Address matched flag (slave mode). - * @note RESET: Clear default value. - * SET: When the address is fully sent (master mode) or when the received slave address matched with one of the enabled slave address (slave mode). - * @rmtoll SR1 ADDR LL_I2C_IsActiveFlag_ADDR - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_ADDR(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_ADDR) == (I2C_SR1_ADDR)); -} - -/** - * @brief Indicate the status of 10-bit header sent (master mode). - * @note RESET: When no ADD10 event occurred. - * SET: When the master has sent the first address byte (header). - * @rmtoll SR1 ADD10 LL_I2C_IsActiveFlag_ADD10 - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_ADD10(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_ADD10) == (I2C_SR1_ADD10)); -} - -/** - * @brief Indicate the status of Acknowledge failure flag. - * @note RESET: No acknowledge failure. - * SET: When an acknowledge failure is received after a byte transmission. - * @rmtoll SR1 AF LL_I2C_IsActiveFlag_AF - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_AF(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_AF) == (I2C_SR1_AF)); -} - -/** - * @brief Indicate the status of Stop detection flag (slave mode). - * @note RESET: Clear default value. - * SET: When a Stop condition is detected. - * @rmtoll SR1 STOPF LL_I2C_IsActiveFlag_STOP - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_STOP(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_STOPF) == (I2C_SR1_STOPF)); -} - -/** - * @brief Indicate the status of Bus error flag. - * @note RESET: Clear default value. - * SET: When a misplaced Start or Stop condition is detected. - * @rmtoll SR1 BERR LL_I2C_IsActiveFlag_BERR - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_BERR(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_BERR) == (I2C_SR1_BERR)); -} - -/** - * @brief Indicate the status of Arbitration lost flag. - * @note RESET: Clear default value. - * SET: When arbitration lost. - * @rmtoll SR1 ARLO LL_I2C_IsActiveFlag_ARLO - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_ARLO(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_ARLO) == (I2C_SR1_ARLO)); -} - -/** - * @brief Indicate the status of Overrun/Underrun flag. - * @note RESET: Clear default value. - * SET: When an overrun/underrun error occurs (Clock Stretching Disabled). - * @rmtoll SR1 OVR LL_I2C_IsActiveFlag_OVR - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_OVR(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_OVR) == (I2C_SR1_OVR)); -} - -/** - * @brief Indicate the status of SMBus PEC error flag in reception. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR1 PECERR LL_I2C_IsActiveSMBusFlag_PECERR - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_PECERR(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_PECERR) == (I2C_SR1_PECERR)); -} - -/** - * @brief Indicate the status of SMBus Timeout detection flag. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR1 TIMEOUT LL_I2C_IsActiveSMBusFlag_TIMEOUT - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_TIMEOUT(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_TIMEOUT) == (I2C_SR1_TIMEOUT)); -} - -/** - * @brief Indicate the status of SMBus alert flag. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR1 SMBALERT LL_I2C_IsActiveSMBusFlag_ALERT - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_ALERT(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR1, I2C_SR1_SMBALERT) == (I2C_SR1_SMBALERT)); -} - -/** - * @brief Indicate the status of Bus Busy flag. - * @note RESET: Clear default value. - * SET: When a Start condition is detected. - * @rmtoll SR2 BUSY LL_I2C_IsActiveFlag_BUSY - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_BUSY(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_BUSY) == (I2C_SR2_BUSY)); -} - -/** - * @brief Indicate the status of Dual flag. - * @note RESET: Received address matched with OAR1. - * SET: Received address matched with OAR2. - * @rmtoll SR2 DUALF LL_I2C_IsActiveFlag_DUAL - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_DUAL(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_DUALF) == (I2C_SR2_DUALF)); -} - -/** - * @brief Indicate the status of SMBus Host address reception (Slave mode). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note RESET: No SMBus Host address - * SET: SMBus Host address received. - * @note This status is cleared by hardware after a STOP condition or repeated START condition. - * @rmtoll SR2 SMBHOST LL_I2C_IsActiveSMBusFlag_SMBHOST - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_SMBHOST(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_SMBHOST) == (I2C_SR2_SMBHOST)); -} - -/** - * @brief Indicate the status of SMBus Device default address reception (Slave mode). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note RESET: No SMBus Device default address - * SET: SMBus Device default address received. - * @note This status is cleared by hardware after a STOP condition or repeated START condition. - * @rmtoll SR2 SMBDEFAULT LL_I2C_IsActiveSMBusFlag_SMBDEFAULT - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_SMBDEFAULT(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_SMBDEFAULT) == (I2C_SR2_SMBDEFAULT)); -} - -/** - * @brief Indicate the status of General call address reception (Slave mode). - * @note RESET: No General call address - * SET: General call address received. - * @note This status is cleared by hardware after a STOP condition or repeated START condition. - * @rmtoll SR2 GENCALL LL_I2C_IsActiveFlag_GENCALL - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_GENCALL(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_GENCALL) == (I2C_SR2_GENCALL)); -} - -/** - * @brief Indicate the status of Master/Slave flag. - * @note RESET: Slave Mode. - * SET: Master Mode. - * @rmtoll SR2 MSL LL_I2C_IsActiveFlag_MSL - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_MSL(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->SR2, I2C_SR2_MSL) == (I2C_SR2_MSL)); -} - -/** - * @brief Clear Address Matched flag. - * @note Clearing this flag is done by a read access to the I2Cx_SR1 - * register followed by a read access to the I2Cx_SR2 register. - * @rmtoll SR1 ADDR LL_I2C_ClearFlag_ADDR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_ADDR(I2C_TypeDef *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = I2Cx->SR1; - (void) tmpreg; - tmpreg = I2Cx->SR2; - (void) tmpreg; -} - -/** - * @brief Clear Acknowledge failure flag. - * @rmtoll SR1 AF LL_I2C_ClearFlag_AF - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_AF(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_AF); -} - -/** - * @brief Clear Stop detection flag. - * @note Clearing this flag is done by a read access to the I2Cx_SR1 - * register followed by a write access to I2Cx_CR1 register. - * @rmtoll SR1 STOPF LL_I2C_ClearFlag_STOP\n - * CR1 PE LL_I2C_ClearFlag_STOP - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_STOP(I2C_TypeDef *I2Cx) -{ - __IO uint32_t tmpreg; - tmpreg = I2Cx->SR1; - (void) tmpreg; - SET_BIT(I2Cx->CR1, I2C_CR1_PE); -} - -/** - * @brief Clear Bus error flag. - * @rmtoll SR1 BERR LL_I2C_ClearFlag_BERR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_BERR(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_BERR); -} - -/** - * @brief Clear Arbitration lost flag. - * @rmtoll SR1 ARLO LL_I2C_ClearFlag_ARLO - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_ARLO(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_ARLO); -} - -/** - * @brief Clear Overrun/Underrun flag. - * @rmtoll SR1 OVR LL_I2C_ClearFlag_OVR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearFlag_OVR(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_OVR); -} - -/** - * @brief Clear SMBus PEC error flag. - * @rmtoll SR1 PECERR LL_I2C_ClearSMBusFlag_PECERR - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearSMBusFlag_PECERR(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_PECERR); -} - -/** - * @brief Clear SMBus Timeout detection flag. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR1 TIMEOUT LL_I2C_ClearSMBusFlag_TIMEOUT - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearSMBusFlag_TIMEOUT(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_TIMEOUT); -} - -/** - * @brief Clear SMBus Alert flag. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR1 SMBALERT LL_I2C_ClearSMBusFlag_ALERT - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_ClearSMBusFlag_ALERT(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->SR1, I2C_SR1_SMBALERT); -} - -/** - * @} - */ - -/** @defgroup I2C_LL_EF_Data_Management Data_Management - * @{ - */ - -/** - * @brief Enable Reset of I2C peripheral. - * @rmtoll CR1 SWRST LL_I2C_EnableReset - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableReset(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_SWRST); -} - -/** - * @brief Disable Reset of I2C peripheral. - * @rmtoll CR1 SWRST LL_I2C_DisableReset - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableReset(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_SWRST); -} - -/** - * @brief Check if the I2C peripheral is under reset state or not. - * @rmtoll CR1 SWRST LL_I2C_IsResetEnabled - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsResetEnabled(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_SWRST) == (I2C_CR1_SWRST)); -} - -/** - * @brief Prepare the generation of a ACKnowledge or Non ACKnowledge condition after the address receive match code or next received byte. - * @note Usage in Slave or Master mode. - * @rmtoll CR1 ACK LL_I2C_AcknowledgeNextData - * @param I2Cx I2C Instance. - * @param TypeAcknowledge This parameter can be one of the following values: - * @arg @ref LL_I2C_ACK - * @arg @ref LL_I2C_NACK - * @retval None - */ -__STATIC_INLINE void LL_I2C_AcknowledgeNextData(I2C_TypeDef *I2Cx, uint32_t TypeAcknowledge) -{ - MODIFY_REG(I2Cx->CR1, I2C_CR1_ACK, TypeAcknowledge); -} - -/** - * @brief Generate a START or RESTART condition - * @note The START bit can be set even if bus is BUSY or I2C is in slave mode. - * This action has no effect when RELOAD is set. - * @rmtoll CR1 START LL_I2C_GenerateStartCondition - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_GenerateStartCondition(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_START); -} - -/** - * @brief Generate a STOP condition after the current byte transfer (master mode). - * @rmtoll CR1 STOP LL_I2C_GenerateStopCondition - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_GenerateStopCondition(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_STOP); -} - -/** - * @brief Enable bit POS (master/host mode). - * @note In that case, the ACK bit controls the (N)ACK of the next byte received or the PEC bit indicates that the next byte in shift register is a PEC. - * @rmtoll CR1 POS LL_I2C_EnableBitPOS - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableBitPOS(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_POS); -} - -/** - * @brief Disable bit POS (master/host mode). - * @note In that case, the ACK bit controls the (N)ACK of the current byte received or the PEC bit indicates that the current byte in shift register is a PEC. - * @rmtoll CR1 POS LL_I2C_DisableBitPOS - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableBitPOS(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_POS); -} - -/** - * @brief Check if bit POS is enabled or disabled. - * @rmtoll CR1 POS LL_I2C_IsEnabledBitPOS - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledBitPOS(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_POS) == (I2C_CR1_POS)); -} - -/** - * @brief Indicate the value of transfer direction. - * @note RESET: Bus is in read transfer (peripheral point of view). - * SET: Bus is in write transfer (peripheral point of view). - * @rmtoll SR2 TRA LL_I2C_GetTransferDirection - * @param I2Cx I2C Instance. - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2C_DIRECTION_WRITE - * @arg @ref LL_I2C_DIRECTION_READ - */ -__STATIC_INLINE uint32_t LL_I2C_GetTransferDirection(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->SR2, I2C_SR2_TRA)); -} - -/** - * @brief Enable DMA last transfer. - * @note This action mean that next DMA EOT is the last transfer. - * @rmtoll CR2 LAST LL_I2C_EnableLastDMA - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableLastDMA(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR2, I2C_CR2_LAST); -} - -/** - * @brief Disable DMA last transfer. - * @note This action mean that next DMA EOT is not the last transfer. - * @rmtoll CR2 LAST LL_I2C_DisableLastDMA - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableLastDMA(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR2, I2C_CR2_LAST); -} - -/** - * @brief Check if DMA last transfer is enabled or disabled. - * @rmtoll CR2 LAST LL_I2C_IsEnabledLastDMA - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledLastDMA(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR2, I2C_CR2_LAST) == (I2C_CR2_LAST)); -} - -/** - * @brief Enable transfer or internal comparison of the SMBus Packet Error byte (transmission or reception mode). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @note This feature is cleared by hardware when the PEC byte is transferred or compared, - * or by a START or STOP condition, it is also cleared by software. - * @rmtoll CR1 PEC LL_I2C_EnableSMBusPECCompare - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_EnableSMBusPECCompare(I2C_TypeDef *I2Cx) -{ - SET_BIT(I2Cx->CR1, I2C_CR1_PEC); -} - -/** - * @brief Disable transfer or internal comparison of the SMBus Packet Error byte (transmission or reception mode). - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 PEC LL_I2C_DisableSMBusPECCompare - * @param I2Cx I2C Instance. - * @retval None - */ -__STATIC_INLINE void LL_I2C_DisableSMBusPECCompare(I2C_TypeDef *I2Cx) -{ - CLEAR_BIT(I2Cx->CR1, I2C_CR1_PEC); -} - -/** - * @brief Check if the SMBus Packet Error byte transfer or internal comparison is requested or not. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll CR1 PEC LL_I2C_IsEnabledSMBusPECCompare - * @param I2Cx I2C Instance. - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusPECCompare(I2C_TypeDef *I2Cx) -{ - return (READ_BIT(I2Cx->CR1, I2C_CR1_PEC) == (I2C_CR1_PEC)); -} - -/** - * @brief Get the SMBus Packet Error byte calculated. - * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not - * SMBus feature is supported by the I2Cx Instance. - * @rmtoll SR2 PEC LL_I2C_GetSMBusPEC - * @param I2Cx I2C Instance. - * @retval Value between Min_Data=0x00 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_I2C_GetSMBusPEC(I2C_TypeDef *I2Cx) -{ - return (uint32_t)(READ_BIT(I2Cx->SR2, I2C_SR2_PEC) >> I2C_SR2_PEC_Pos); -} - -/** - * @brief Read Receive Data register. - * @rmtoll DR DR LL_I2C_ReceiveData8 - * @param I2Cx I2C Instance. - * @retval Value between Min_Data=0x0 and Max_Data=0xFF - */ -__STATIC_INLINE uint8_t LL_I2C_ReceiveData8(I2C_TypeDef *I2Cx) -{ - return (uint8_t)(READ_BIT(I2Cx->DR, I2C_DR_DR)); -} - -/** - * @brief Write in Transmit Data Register . - * @rmtoll DR DR LL_I2C_TransmitData8 - * @param I2Cx I2C Instance. - * @param Data Value between Min_Data=0x0 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_I2C_TransmitData8(I2C_TypeDef *I2Cx, uint8_t Data) -{ - MODIFY_REG(I2Cx->DR, I2C_DR_DR, Data); -} - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup I2C_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -uint32_t LL_I2C_Init(I2C_TypeDef *I2Cx, LL_I2C_InitTypeDef *I2C_InitStruct); -uint32_t LL_I2C_DeInit(I2C_TypeDef *I2Cx); -void LL_I2C_StructInit(LL_I2C_InitTypeDef *I2C_InitStruct); - - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* I2C1 || I2C2 || I2C3 */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_I2C_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h deleted file mode 100644 index ea23dc5..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h +++ /dev/null @@ -1,985 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_pwr.h - * @author MCD Application Team - * @brief Header file of PWR LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_PWR_H -#define __STM32F4xx_LL_PWR_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_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 */ -#define LL_PWR_CSR_PVDO PWR_CSR_PVDO /*!< Power voltage detector output flag */ -#define LL_PWR_CSR_VOS PWR_CSR_VOSRDY /*!< Voltage scaling select flag */ -#if defined(PWR_CSR_EWUP) -#define LL_PWR_CSR_EWUP1 PWR_CSR_EWUP /*!< Enable WKUP pin */ -#elif defined(PWR_CSR_EWUP1) -#define LL_PWR_CSR_EWUP1 PWR_CSR_EWUP1 /*!< Enable WKUP pin 1 */ -#endif /* PWR_CSR_EWUP */ -#if defined(PWR_CSR_EWUP2) -#define LL_PWR_CSR_EWUP2 PWR_CSR_EWUP2 /*!< Enable WKUP pin 2 */ -#endif /* PWR_CSR_EWUP2 */ -#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 - * @{ - */ -#if defined(PWR_CR_VOS_0) -#define LL_PWR_REGU_VOLTAGE_SCALE3 (PWR_CR_VOS_0) -#define LL_PWR_REGU_VOLTAGE_SCALE2 (PWR_CR_VOS_1) -#define LL_PWR_REGU_VOLTAGE_SCALE1 (PWR_CR_VOS_0 | PWR_CR_VOS_1) /* The SCALE1 is not available for STM32F401xx devices */ -#else -#define LL_PWR_REGU_VOLTAGE_SCALE1 (PWR_CR_VOS) -#define LL_PWR_REGU_VOLTAGE_SCALE2 0x00000000U -#endif /* PWR_CR_VOS_0 */ -/** - * @} - */ - -/** @defgroup PWR_LL_EC_MODE_PWR Mode Power - * @{ - */ -#define LL_PWR_MODE_STOP_MAINREGU 0x00000000U /*!< Enter Stop mode when the CPU enters deepsleep */ -#define LL_PWR_MODE_STOP_LPREGU (PWR_CR_LPDS) /*!< Enter Stop mode (with low power Regulator ON) when the CPU enters deepsleep */ -#if defined(PWR_CR_MRUDS) && defined(PWR_CR_LPUDS) && defined(PWR_CR_FPDS) -#define LL_PWR_MODE_STOP_MAINREGU_UNDERDRIVE (PWR_CR_MRUDS | PWR_CR_FPDS) /*!< Enter Stop mode (with main Regulator in under-drive mode) when the CPU enters deepsleep */ -#define LL_PWR_MODE_STOP_LPREGU_UNDERDRIVE (PWR_CR_LPDS | PWR_CR_LPUDS | PWR_CR_FPDS) /*!< Enter Stop mode (with low power Regulator in under-drive mode) when the CPU enters deepsleep */ -#endif /* PWR_CR_MRUDS && PWR_CR_LPUDS && PWR_CR_FPDS */ -#if defined(PWR_CR_MRLVDS) && defined(PWR_CR_LPLVDS) && defined(PWR_CR_FPDS) -#define LL_PWR_MODE_STOP_MAINREGU_DEEPSLEEP (PWR_CR_MRLVDS | PWR_CR_FPDS) /*!< Enter Stop mode (with main Regulator in Deep Sleep mode) when the CPU enters deepsleep */ -#define LL_PWR_MODE_STOP_LPREGU_DEEPSLEEP (PWR_CR_LPDS | PWR_CR_LPLVDS | PWR_CR_FPDS) /*!< Enter Stop mode (with low power Regulator in Deep Sleep mode) when the CPU enters deepsleep */ -#endif /* PWR_CR_MRLVDS && PWR_CR_LPLVDS && PWR_CR_FPDS */ -#define LL_PWR_MODE_STANDBY (PWR_CR_PDDS) /*!< Enter Standby mode when the CPU enters deepsleep */ -/** - * @} - */ - -/** @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 */ -#define LL_PWR_REGU_DSMODE_LOW_POWER (PWR_CR_LPDS) /*!< Voltage Regulator in low-power mode during deepsleep mode */ -/** - * @} - */ - -/** @defgroup PWR_LL_EC_PVDLEVEL Power Voltage Detector Level - * @{ - */ -#define LL_PWR_PVDLEVEL_0 (PWR_CR_PLS_LEV0) /*!< Voltage threshold detected by PVD 2.2 V */ -#define LL_PWR_PVDLEVEL_1 (PWR_CR_PLS_LEV1) /*!< Voltage threshold detected by PVD 2.3 V */ -#define LL_PWR_PVDLEVEL_2 (PWR_CR_PLS_LEV2) /*!< Voltage threshold detected by PVD 2.4 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.6 V */ -#define LL_PWR_PVDLEVEL_5 (PWR_CR_PLS_LEV5) /*!< Voltage threshold detected by PVD 2.7 V */ -#define LL_PWR_PVDLEVEL_6 (PWR_CR_PLS_LEV6) /*!< Voltage threshold detected by PVD 2.8 V */ -#define LL_PWR_PVDLEVEL_7 (PWR_CR_PLS_LEV7) /*!< Voltage threshold detected by PVD 2.9 V */ -/** - * @} - */ -/** @defgroup PWR_LL_EC_WAKEUP_PIN Wakeup Pins - * @{ - */ -#if defined(PWR_CSR_EWUP) -#define LL_PWR_WAKEUP_PIN1 (PWR_CSR_EWUP) /*!< WKUP pin : PA0 */ -#endif /* PWR_CSR_EWUP */ -#if defined(PWR_CSR_EWUP1) -#define LL_PWR_WAKEUP_PIN1 (PWR_CSR_EWUP1) /*!< WKUP pin 1 : PA0 */ -#endif /* PWR_CSR_EWUP1 */ -#if defined(PWR_CSR_EWUP2) -#define LL_PWR_WAKEUP_PIN2 (PWR_CSR_EWUP2) /*!< WKUP pin 2 : PC0 or PC13 according to device */ -#endif /* PWR_CSR_EWUP2 */ -#if defined(PWR_CSR_EWUP3) -#define LL_PWR_WAKEUP_PIN3 (PWR_CSR_EWUP3) /*!< WKUP pin 3 : PC1 */ -#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 - * @{ - */ -#if defined(PWR_CR_FISSR) -/** - * @brief Enable FLASH interface STOP while system Run is ON - * @rmtoll CR FISSR LL_PWR_EnableFLASHInterfaceSTOP - * @note This mode is enabled only with STOP low power mode. - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableFLASHInterfaceSTOP(void) -{ - SET_BIT(PWR->CR, PWR_CR_FISSR); -} - -/** - * @brief Disable FLASH Interface STOP while system Run is ON - * @rmtoll CR FISSR LL_PWR_DisableFLASHInterfaceSTOP - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableFLASHInterfaceSTOP(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_FISSR); -} - -/** - * @brief Check if FLASH Interface STOP while system Run feature is enabled - * @rmtoll CR FISSR LL_PWR_IsEnabledFLASHInterfaceSTOP - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledFLASHInterfaceSTOP(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_FISSR) == (PWR_CR_FISSR)); -} -#endif /* PWR_CR_FISSR */ - -#if defined(PWR_CR_FMSSR) -/** - * @brief Enable FLASH Memory STOP while system Run is ON - * @rmtoll CR FMSSR LL_PWR_EnableFLASHMemorySTOP - * @note This mode is enabled only with STOP low power mode. - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableFLASHMemorySTOP(void) -{ - SET_BIT(PWR->CR, PWR_CR_FMSSR); -} - -/** - * @brief Disable FLASH Memory STOP while system Run is ON - * @rmtoll CR FMSSR LL_PWR_DisableFLASHMemorySTOP - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableFLASHMemorySTOP(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_FMSSR); -} - -/** - * @brief Check if FLASH Memory STOP while system Run feature is enabled - * @rmtoll CR FMSSR LL_PWR_IsEnabledFLASHMemorySTOP - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledFLASHMemorySTOP(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_FMSSR) == (PWR_CR_FMSSR)); -} -#endif /* PWR_CR_FMSSR */ -#if defined(PWR_CR_UDEN) -/** - * @brief Enable Under Drive Mode - * @rmtoll CR UDEN LL_PWR_EnableUnderDriveMode - * @note This mode is enabled only with STOP low power mode. - * In this mode, the 1.2V domain is preserved in reduced leakage mode. This - * mode is only available when the main Regulator or the low power Regulator - * is in low voltage mode. - * @note If the Under-drive mode was enabled, it is automatically disabled after - * exiting Stop mode. - * When the voltage Regulator operates in Under-drive mode, an additional - * startup delay is induced when waking up from Stop mode. - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableUnderDriveMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_UDEN); -} - -/** - * @brief Disable Under Drive Mode - * @rmtoll CR UDEN LL_PWR_DisableUnderDriveMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableUnderDriveMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_UDEN); -} - -/** - * @brief Check if Under Drive Mode is enabled - * @rmtoll CR UDEN LL_PWR_IsEnabledUnderDriveMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledUnderDriveMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_UDEN) == (PWR_CR_UDEN)); -} -#endif /* PWR_CR_UDEN */ - -#if defined(PWR_CR_ODSWEN) -/** - * @brief Enable Over drive switching - * @rmtoll CR ODSWEN LL_PWR_EnableOverDriveSwitching - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableOverDriveSwitching(void) -{ - SET_BIT(PWR->CR, PWR_CR_ODSWEN); -} - -/** - * @brief Disable Over drive switching - * @rmtoll CR ODSWEN LL_PWR_DisableOverDriveSwitching - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableOverDriveSwitching(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_ODSWEN); -} - -/** - * @brief Check if Over drive switching is enabled - * @rmtoll CR ODSWEN LL_PWR_IsEnabledOverDriveSwitching - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledOverDriveSwitching(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_ODSWEN) == (PWR_CR_ODSWEN)); -} -#endif /* PWR_CR_ODSWEN */ -#if defined(PWR_CR_ODEN) -/** - * @brief Enable Over drive Mode - * @rmtoll CR ODEN LL_PWR_EnableOverDriveMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableOverDriveMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_ODEN); -} - -/** - * @brief Disable Over drive Mode - * @rmtoll CR ODEN LL_PWR_DisableOverDriveMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableOverDriveMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_ODEN); -} - -/** - * @brief Check if Over drive switching is enabled - * @rmtoll CR ODEN LL_PWR_IsEnabledOverDriveMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledOverDriveMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_ODEN) == (PWR_CR_ODEN)); -} -#endif /* PWR_CR_ODEN */ -#if defined(PWR_CR_MRUDS) -/** - * @brief Enable Main Regulator in deepsleep under-drive Mode - * @rmtoll CR MRUDS LL_PWR_EnableMainRegulatorDeepSleepUDMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableMainRegulatorDeepSleepUDMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_MRUDS); -} - -/** - * @brief Disable Main Regulator in deepsleep under-drive Mode - * @rmtoll CR MRUDS LL_PWR_DisableMainRegulatorDeepSleepUDMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableMainRegulatorDeepSleepUDMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_MRUDS); -} - -/** - * @brief Check if Main Regulator in deepsleep under-drive Mode is enabled - * @rmtoll CR MRUDS LL_PWR_IsEnabledMainRegulatorDeepSleepUDMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledMainRegulatorDeepSleepUDMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_MRUDS) == (PWR_CR_MRUDS)); -} -#endif /* PWR_CR_MRUDS */ - -#if defined(PWR_CR_LPUDS) -/** - * @brief Enable Low Power Regulator in deepsleep under-drive Mode - * @rmtoll CR LPUDS LL_PWR_EnableLowPowerRegulatorDeepSleepUDMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableLowPowerRegulatorDeepSleepUDMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_LPUDS); -} - -/** - * @brief Disable Low Power Regulator in deepsleep under-drive Mode - * @rmtoll CR LPUDS LL_PWR_DisableLowPowerRegulatorDeepSleepUDMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableLowPowerRegulatorDeepSleepUDMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_LPUDS); -} - -/** - * @brief Check if Low Power Regulator in deepsleep under-drive Mode is enabled - * @rmtoll CR LPUDS LL_PWR_IsEnabledLowPowerRegulatorDeepSleepUDMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledLowPowerRegulatorDeepSleepUDMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_LPUDS) == (PWR_CR_LPUDS)); -} -#endif /* PWR_CR_LPUDS */ - -#if defined(PWR_CR_MRLVDS) -/** - * @brief Enable Main Regulator low voltage Mode - * @rmtoll CR MRLVDS LL_PWR_EnableMainRegulatorLowVoltageMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableMainRegulatorLowVoltageMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_MRLVDS); -} - -/** - * @brief Disable Main Regulator low voltage Mode - * @rmtoll CR MRLVDS LL_PWR_DisableMainRegulatorLowVoltageMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableMainRegulatorLowVoltageMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_MRLVDS); -} - -/** - * @brief Check if Main Regulator low voltage Mode is enabled - * @rmtoll CR MRLVDS LL_PWR_IsEnabledMainRegulatorLowVoltageMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledMainRegulatorLowVoltageMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_MRLVDS) == (PWR_CR_MRLVDS)); -} -#endif /* PWR_CR_MRLVDS */ - -#if defined(PWR_CR_LPLVDS) -/** - * @brief Enable Low Power Regulator low voltage Mode - * @rmtoll CR LPLVDS LL_PWR_EnableLowPowerRegulatorLowVoltageMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableLowPowerRegulatorLowVoltageMode(void) -{ - SET_BIT(PWR->CR, PWR_CR_LPLVDS); -} - -/** - * @brief Disable Low Power Regulator low voltage Mode - * @rmtoll CR LPLVDS LL_PWR_DisableLowPowerRegulatorLowVoltageMode - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableLowPowerRegulatorLowVoltageMode(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_LPLVDS); -} - -/** - * @brief Check if Low Power Regulator low voltage Mode is enabled - * @rmtoll CR LPLVDS LL_PWR_IsEnabledLowPowerRegulatorLowVoltageMode - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledLowPowerRegulatorLowVoltageMode(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_LPLVDS) == (PWR_CR_LPLVDS)); -} -#endif /* PWR_CR_LPLVDS */ -/** - * @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 - * (*) LL_PWR_REGU_VOLTAGE_SCALE1 is not available for STM32F401xx devices - * @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 - * (*) LL_PWR_REGU_VOLTAGE_SCALE1 is not available for STM32F401xx devices - */ -__STATIC_INLINE uint32_t LL_PWR_GetRegulVoltageScaling(void) -{ - return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_VOS)); -} -/** - * @brief Enable the Flash Power Down in Stop Mode - * @rmtoll CR FPDS LL_PWR_EnableFlashPowerDown - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableFlashPowerDown(void) -{ - SET_BIT(PWR->CR, PWR_CR_FPDS); -} - -/** - * @brief Disable the Flash Power Down in Stop Mode - * @rmtoll CR FPDS LL_PWR_DisableFlashPowerDown - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableFlashPowerDown(void) -{ - CLEAR_BIT(PWR->CR, PWR_CR_FPDS); -} - -/** - * @brief Check if the Flash Power Down in Stop Mode is enabled - * @rmtoll CR FPDS LL_PWR_IsEnabledFlashPowerDown - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledFlashPowerDown(void) -{ - return (READ_BIT(PWR->CR, PWR_CR_FPDS) == (PWR_CR_FPDS)); -} - -/** - * @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 Enable the backup Regulator - * @rmtoll CSR BRE LL_PWR_EnableBkUpRegulator - * @note The BRE bit of the PWR_CSR register is protected against parasitic write access. - * The LL_PWR_EnableBkUpAccess() must be called before using this API. - * @retval None - */ -__STATIC_INLINE void LL_PWR_EnableBkUpRegulator(void) -{ - SET_BIT(PWR->CSR, PWR_CSR_BRE); -} - -/** - * @brief Disable the backup Regulator - * @rmtoll CSR BRE LL_PWR_DisableBkUpRegulator - * @note The BRE bit of the PWR_CSR register is protected against parasitic write access. - * The LL_PWR_EnableBkUpAccess() must be called before using this API. - * @retval None - */ -__STATIC_INLINE void LL_PWR_DisableBkUpRegulator(void) -{ - CLEAR_BIT(PWR->CSR, PWR_CSR_BRE); -} - -/** - * @brief Check if the backup Regulator is enabled - * @rmtoll CSR BRE LL_PWR_IsEnabledBkUpRegulator - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsEnabledBkUpRegulator(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_BRE) == (PWR_CSR_BRE)); -} - -/** - * @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)); -} - -/** - * @brief Set Power Down mode when CPU enters deepsleep - * @rmtoll CR PDDS LL_PWR_SetPowerMode\n - * @rmtoll CR MRUDS LL_PWR_SetPowerMode\n - * @rmtoll CR LPUDS LL_PWR_SetPowerMode\n - * @rmtoll CR FPDS LL_PWR_SetPowerMode\n - * @rmtoll CR MRLVDS LL_PWR_SetPowerMode\n - * @rmtoll CR LPlVDS LL_PWR_SetPowerMode\n - * @rmtoll CR FPDS LL_PWR_SetPowerMode\n - * @rmtoll CR LPDS LL_PWR_SetPowerMode - * @param PDMode This parameter can be one of the following values: - * @arg @ref LL_PWR_MODE_STOP_MAINREGU - * @arg @ref LL_PWR_MODE_STOP_LPREGU - * @arg @ref LL_PWR_MODE_STOP_MAINREGU_UNDERDRIVE (*) - * @arg @ref LL_PWR_MODE_STOP_LPREGU_UNDERDRIVE (*) - * @arg @ref LL_PWR_MODE_STOP_MAINREGU_DEEPSLEEP (*) - * @arg @ref LL_PWR_MODE_STOP_LPREGU_DEEPSLEEP (*) - * - * (*) not available on all devices - * @arg @ref LL_PWR_MODE_STANDBY - * @retval None - */ -__STATIC_INLINE void LL_PWR_SetPowerMode(uint32_t PDMode) -{ -#if defined(PWR_CR_MRUDS) && defined(PWR_CR_LPUDS) && defined(PWR_CR_FPDS) - MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPUDS | PWR_CR_MRUDS), PDMode); -#elif defined(PWR_CR_MRLVDS) && defined(PWR_CR_LPLVDS) && defined(PWR_CR_FPDS) - MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPLVDS | PWR_CR_MRLVDS), PDMode); -#else - MODIFY_REG(PWR->CR, (PWR_CR_PDDS| PWR_CR_LPDS), PDMode); -#endif /* PWR_CR_MRUDS && PWR_CR_LPUDS && PWR_CR_FPDS */ -} - -/** - * @brief Get Power Down mode when CPU enters deepsleep - * @rmtoll CR PDDS LL_PWR_GetPowerMode\n - * @rmtoll CR MRUDS LL_PWR_GetPowerMode\n - * @rmtoll CR LPUDS LL_PWR_GetPowerMode\n - * @rmtoll CR FPDS LL_PWR_GetPowerMode\n - * @rmtoll CR MRLVDS LL_PWR_GetPowerMode\n - * @rmtoll CR LPLVDS LL_PWR_GetPowerMode\n - * @rmtoll CR FPDS LL_PWR_GetPowerMode\n - * @rmtoll CR LPDS LL_PWR_GetPowerMode - * @retval Returned value can be one of the following values: - * @arg @ref LL_PWR_MODE_STOP_MAINREGU - * @arg @ref LL_PWR_MODE_STOP_LPREGU - * @arg @ref LL_PWR_MODE_STOP_MAINREGU_UNDERDRIVE (*) - * @arg @ref LL_PWR_MODE_STOP_LPREGU_UNDERDRIVE (*) - * @arg @ref LL_PWR_MODE_STOP_MAINREGU_DEEPSLEEP (*) - * @arg @ref LL_PWR_MODE_STOP_LPREGU_DEEPSLEEP (*) - * - * (*) not available on all devices - * @arg @ref LL_PWR_MODE_STANDBY - */ -__STATIC_INLINE uint32_t LL_PWR_GetPowerMode(void) -{ -#if defined(PWR_CR_MRUDS) && defined(PWR_CR_LPUDS) && defined(PWR_CR_FPDS) - return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPUDS | PWR_CR_MRUDS))); -#elif defined(PWR_CR_MRLVDS) && defined(PWR_CR_LPLVDS) && defined(PWR_CR_FPDS) - return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPLVDS | PWR_CR_MRLVDS))); -#else - return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS| PWR_CR_LPDS))); -#endif /* PWR_CR_MRUDS && PWR_CR_LPUDS && PWR_CR_FPDS */ -} - -/** - * @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)); -} - -/** - * @brief Enable the WakeUp PINx functionality - * @rmtoll CSR EWUP LL_PWR_EnableWakeUpPin\n - * @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 EWUP LL_PWR_DisableWakeUpPin\n - * @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 EWUP LL_PWR_IsEnabledWakeUpPin\n - * @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)); -} - - -/** - * @} - */ - -/** @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)); -} - -/** - * @brief Get Backup Regulator ready Flag - * @rmtoll CSR BRR LL_PWR_IsActiveFlag_BRR - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_BRR(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_BRR) == (PWR_CSR_BRR)); -} -/** - * @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)); -} - -/** - * @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 VOS 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)); -} -#if defined(PWR_CR_ODEN) -/** - * @brief Indicate whether the Over-Drive mode is ready or not - * @rmtoll CSR ODRDY LL_PWR_IsActiveFlag_OD - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_OD(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_ODRDY) == (PWR_CSR_ODRDY)); -} -#endif /* PWR_CR_ODEN */ - -#if defined(PWR_CR_ODSWEN) -/** - * @brief Indicate whether the Over-Drive mode switching is ready or not - * @rmtoll CSR ODSWRDY LL_PWR_IsActiveFlag_ODSW - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_ODSW(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_ODSWRDY) == (PWR_CSR_ODSWRDY)); -} -#endif /* PWR_CR_ODSWEN */ - -#if defined(PWR_CR_UDEN) -/** - * @brief Indicate whether the Under-Drive mode is ready or not - * @rmtoll CSR UDRDY LL_PWR_IsActiveFlag_UD - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_UD(void) -{ - return (READ_BIT(PWR->CSR, PWR_CSR_UDRDY) == (PWR_CSR_UDRDY)); -} -#endif /* PWR_CR_UDEN */ -/** - * @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(PWR_CSR_UDRDY) -/** - * @brief Clear Under-Drive ready Flag - * @rmtoll CSR UDRDY LL_PWR_ClearFlag_UD - * @retval None - */ -__STATIC_INLINE void LL_PWR_ClearFlag_UD(void) -{ - WRITE_REG(PWR->CSR, PWR_CSR_UDRDY); -} -#endif /* PWR_CSR_UDRDY */ - -/** - * @} - */ - -#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 /* __STM32F4xx_LL_PWR_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h deleted file mode 100644 index 0a6a5b9..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h +++ /dev/null @@ -1,7101 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_rcc.h - * @author MCD Application Team - * @brief Header file of RCC LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_RCC_H -#define __STM32F4xx_LL_RCC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined(RCC) - -/** @defgroup RCC_LL RCC - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup RCC_LL_Private_Variables RCC Private Variables - * @{ - */ - -#if defined(RCC_PLLSAI_SUPPORT) && defined(LTDC) -static const uint8_t aRCC_PLLSAIDIVRPrescTable[4] = {2, 4, 8, 16}; -#endif /* RCC_PLLSAI_SUPPORT && LTDC */ - -/** - * @} - */ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup RCC_LL_Private_Macros RCC Private Macros - * @{ - */ -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup RCC_LL_Exported_Types RCC Exported Types - * @{ - */ - -/** @defgroup LL_ES_CLOCK_FREQ Clocks Frequency Structure - * @{ - */ - -/** - * @brief RCC Clocks Frequency Structure - */ -typedef struct -{ - uint32_t SYSCLK_Frequency; /*!< SYSCLK clock frequency */ - uint32_t HCLK_Frequency; /*!< HCLK clock frequency */ - uint32_t PCLK1_Frequency; /*!< PCLK1 clock frequency */ - uint32_t PCLK2_Frequency; /*!< PCLK2 clock frequency */ -} LL_RCC_ClocksTypeDef; - -/** - * @} - */ - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup RCC_LL_Exported_Constants RCC Exported Constants - * @{ - */ - -/** @defgroup RCC_LL_EC_OSC_VALUES Oscillator Values adaptation - * @brief Defines used to adapt values of different oscillators - * @note These values could be modified in the user environment according to - * HW set-up. - * @{ - */ -#if !defined (HSE_VALUE) -#define HSE_VALUE 25000000U /*!< Value of the HSE oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) -#define HSI_VALUE 16000000U /*!< Value of the HSI oscillator in Hz */ -#endif /* HSI_VALUE */ - -#if !defined (LSE_VALUE) -#define LSE_VALUE 32768U /*!< Value of the LSE oscillator in Hz */ -#endif /* LSE_VALUE */ - -#if !defined (LSI_VALUE) -#define LSI_VALUE 32000U /*!< Value of the LSI oscillator in Hz */ -#endif /* LSI_VALUE */ - -#if !defined (EXTERNAL_CLOCK_VALUE) -#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the I2S_CKIN external oscillator in Hz */ -#endif /* EXTERNAL_CLOCK_VALUE */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_CLEAR_FLAG Clear Flags Defines - * @brief Flags defines which can be used with LL_RCC_WriteReg function - * @{ - */ -#define LL_RCC_CIR_LSIRDYC RCC_CIR_LSIRDYC /*!< LSI Ready Interrupt Clear */ -#define LL_RCC_CIR_LSERDYC RCC_CIR_LSERDYC /*!< LSE Ready Interrupt Clear */ -#define LL_RCC_CIR_HSIRDYC RCC_CIR_HSIRDYC /*!< HSI Ready Interrupt Clear */ -#define LL_RCC_CIR_HSERDYC RCC_CIR_HSERDYC /*!< HSE Ready Interrupt Clear */ -#define LL_RCC_CIR_PLLRDYC RCC_CIR_PLLRDYC /*!< PLL Ready Interrupt Clear */ -#if defined(RCC_PLLI2S_SUPPORT) -#define LL_RCC_CIR_PLLI2SRDYC RCC_CIR_PLLI2SRDYC /*!< PLLI2S Ready Interrupt Clear */ -#endif /* RCC_PLLI2S_SUPPORT */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_CIR_PLLSAIRDYC RCC_CIR_PLLSAIRDYC /*!< PLLSAI Ready Interrupt Clear */ -#endif /* RCC_PLLSAI_SUPPORT */ -#define LL_RCC_CIR_CSSC RCC_CIR_CSSC /*!< Clock Security System Interrupt Clear */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_RCC_ReadReg function - * @{ - */ -#define LL_RCC_CIR_LSIRDYF RCC_CIR_LSIRDYF /*!< LSI Ready Interrupt flag */ -#define LL_RCC_CIR_LSERDYF RCC_CIR_LSERDYF /*!< LSE Ready Interrupt flag */ -#define LL_RCC_CIR_HSIRDYF RCC_CIR_HSIRDYF /*!< HSI Ready Interrupt flag */ -#define LL_RCC_CIR_HSERDYF RCC_CIR_HSERDYF /*!< HSE Ready Interrupt flag */ -#define LL_RCC_CIR_PLLRDYF RCC_CIR_PLLRDYF /*!< PLL Ready Interrupt flag */ -#if defined(RCC_PLLI2S_SUPPORT) -#define LL_RCC_CIR_PLLI2SRDYF RCC_CIR_PLLI2SRDYF /*!< PLLI2S Ready Interrupt flag */ -#endif /* RCC_PLLI2S_SUPPORT */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_CIR_PLLSAIRDYF RCC_CIR_PLLSAIRDYF /*!< PLLSAI Ready Interrupt flag */ -#endif /* RCC_PLLSAI_SUPPORT */ -#define LL_RCC_CIR_CSSF RCC_CIR_CSSF /*!< Clock Security System Interrupt flag */ -#define LL_RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF /*!< Low-Power reset flag */ -#define LL_RCC_CSR_PINRSTF RCC_CSR_PINRSTF /*!< PIN reset flag */ -#define LL_RCC_CSR_PORRSTF RCC_CSR_PORRSTF /*!< POR/PDR reset flag */ -#define LL_RCC_CSR_SFTRSTF RCC_CSR_SFTRSTF /*!< Software Reset flag */ -#define LL_RCC_CSR_IWDGRSTF RCC_CSR_IWDGRSTF /*!< Independent Watchdog reset flag */ -#define LL_RCC_CSR_WWDGRSTF RCC_CSR_WWDGRSTF /*!< Window watchdog reset flag */ -#if defined(RCC_CSR_BORRSTF) -#define LL_RCC_CSR_BORRSTF RCC_CSR_BORRSTF /*!< BOR reset flag */ -#endif /* RCC_CSR_BORRSTF */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_RCC_ReadReg and LL_RCC_WriteReg functions - * @{ - */ -#define LL_RCC_CIR_LSIRDYIE RCC_CIR_LSIRDYIE /*!< LSI Ready Interrupt Enable */ -#define LL_RCC_CIR_LSERDYIE RCC_CIR_LSERDYIE /*!< LSE Ready Interrupt Enable */ -#define LL_RCC_CIR_HSIRDYIE RCC_CIR_HSIRDYIE /*!< HSI Ready Interrupt Enable */ -#define LL_RCC_CIR_HSERDYIE RCC_CIR_HSERDYIE /*!< HSE Ready Interrupt Enable */ -#define LL_RCC_CIR_PLLRDYIE RCC_CIR_PLLRDYIE /*!< PLL Ready Interrupt Enable */ -#if defined(RCC_PLLI2S_SUPPORT) -#define LL_RCC_CIR_PLLI2SRDYIE RCC_CIR_PLLI2SRDYIE /*!< PLLI2S Ready Interrupt Enable */ -#endif /* RCC_PLLI2S_SUPPORT */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_CIR_PLLSAIRDYIE RCC_CIR_PLLSAIRDYIE /*!< PLLSAI Ready Interrupt Enable */ -#endif /* RCC_PLLSAI_SUPPORT */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_SYS_CLKSOURCE System clock switch - * @{ - */ -#define LL_RCC_SYS_CLKSOURCE_HSI RCC_CFGR_SW_HSI /*!< HSI selection as system clock */ -#define LL_RCC_SYS_CLKSOURCE_HSE RCC_CFGR_SW_HSE /*!< HSE selection as system clock */ -#define LL_RCC_SYS_CLKSOURCE_PLL RCC_CFGR_SW_PLL /*!< PLL selection as system clock */ -#if defined(RCC_CFGR_SW_PLLR) -#define LL_RCC_SYS_CLKSOURCE_PLLR RCC_CFGR_SW_PLLR /*!< PLLR selection as system clock */ -#endif /* RCC_CFGR_SW_PLLR */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_SYS_CLKSOURCE_STATUS System clock switch status - * @{ - */ -#define LL_RCC_SYS_CLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ -#define LL_RCC_SYS_CLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ -#define LL_RCC_SYS_CLKSOURCE_STATUS_PLL RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ -#if defined(RCC_PLLR_SYSCLK_SUPPORT) -#define LL_RCC_SYS_CLKSOURCE_STATUS_PLLR RCC_CFGR_SWS_PLLR /*!< PLLR used as system clock */ -#endif /* RCC_PLLR_SYSCLK_SUPPORT */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_SYSCLK_DIV AHB prescaler - * @{ - */ -#define LL_RCC_SYSCLK_DIV_1 RCC_CFGR_HPRE_DIV1 /*!< SYSCLK not divided */ -#define LL_RCC_SYSCLK_DIV_2 RCC_CFGR_HPRE_DIV2 /*!< SYSCLK divided by 2 */ -#define LL_RCC_SYSCLK_DIV_4 RCC_CFGR_HPRE_DIV4 /*!< SYSCLK divided by 4 */ -#define LL_RCC_SYSCLK_DIV_8 RCC_CFGR_HPRE_DIV8 /*!< SYSCLK divided by 8 */ -#define LL_RCC_SYSCLK_DIV_16 RCC_CFGR_HPRE_DIV16 /*!< SYSCLK divided by 16 */ -#define LL_RCC_SYSCLK_DIV_64 RCC_CFGR_HPRE_DIV64 /*!< SYSCLK divided by 64 */ -#define LL_RCC_SYSCLK_DIV_128 RCC_CFGR_HPRE_DIV128 /*!< SYSCLK divided by 128 */ -#define LL_RCC_SYSCLK_DIV_256 RCC_CFGR_HPRE_DIV256 /*!< SYSCLK divided by 256 */ -#define LL_RCC_SYSCLK_DIV_512 RCC_CFGR_HPRE_DIV512 /*!< SYSCLK divided by 512 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_APB1_DIV APB low-speed prescaler (APB1) - * @{ - */ -#define LL_RCC_APB1_DIV_1 RCC_CFGR_PPRE1_DIV1 /*!< HCLK not divided */ -#define LL_RCC_APB1_DIV_2 RCC_CFGR_PPRE1_DIV2 /*!< HCLK divided by 2 */ -#define LL_RCC_APB1_DIV_4 RCC_CFGR_PPRE1_DIV4 /*!< HCLK divided by 4 */ -#define LL_RCC_APB1_DIV_8 RCC_CFGR_PPRE1_DIV8 /*!< HCLK divided by 8 */ -#define LL_RCC_APB1_DIV_16 RCC_CFGR_PPRE1_DIV16 /*!< HCLK divided by 16 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_APB2_DIV APB high-speed prescaler (APB2) - * @{ - */ -#define LL_RCC_APB2_DIV_1 RCC_CFGR_PPRE2_DIV1 /*!< HCLK not divided */ -#define LL_RCC_APB2_DIV_2 RCC_CFGR_PPRE2_DIV2 /*!< HCLK divided by 2 */ -#define LL_RCC_APB2_DIV_4 RCC_CFGR_PPRE2_DIV4 /*!< HCLK divided by 4 */ -#define LL_RCC_APB2_DIV_8 RCC_CFGR_PPRE2_DIV8 /*!< HCLK divided by 8 */ -#define LL_RCC_APB2_DIV_16 RCC_CFGR_PPRE2_DIV16 /*!< HCLK divided by 16 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_MCOxSOURCE MCO source selection - * @{ - */ -#define LL_RCC_MCO1SOURCE_HSI (uint32_t)(RCC_CFGR_MCO1|0x00000000U) /*!< HSI selection as MCO1 source */ -#define LL_RCC_MCO1SOURCE_LSE (uint32_t)(RCC_CFGR_MCO1|(RCC_CFGR_MCO1_0 >> 16U)) /*!< LSE selection as MCO1 source */ -#define LL_RCC_MCO1SOURCE_HSE (uint32_t)(RCC_CFGR_MCO1|(RCC_CFGR_MCO1_1 >> 16U)) /*!< HSE selection as MCO1 source */ -#define LL_RCC_MCO1SOURCE_PLLCLK (uint32_t)(RCC_CFGR_MCO1|((RCC_CFGR_MCO1_1|RCC_CFGR_MCO1_0) >> 16U)) /*!< PLLCLK selection as MCO1 source */ -#if defined(RCC_CFGR_MCO2) -#define LL_RCC_MCO2SOURCE_SYSCLK (uint32_t)(RCC_CFGR_MCO2|0x00000000U) /*!< SYSCLK selection as MCO2 source */ -#define LL_RCC_MCO2SOURCE_PLLI2S (uint32_t)(RCC_CFGR_MCO2|(RCC_CFGR_MCO2_0 >> 16U)) /*!< PLLI2S selection as MCO2 source */ -#define LL_RCC_MCO2SOURCE_HSE (uint32_t)(RCC_CFGR_MCO2|(RCC_CFGR_MCO2_1 >> 16U)) /*!< HSE selection as MCO2 source */ -#define LL_RCC_MCO2SOURCE_PLLCLK (uint32_t)(RCC_CFGR_MCO2|((RCC_CFGR_MCO2_1|RCC_CFGR_MCO2_0) >> 16U)) /*!< PLLCLK selection as MCO2 source */ -#endif /* RCC_CFGR_MCO2 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_MCOx_DIV MCO prescaler - * @{ - */ -#define LL_RCC_MCO1_DIV_1 (uint32_t)(RCC_CFGR_MCO1PRE|0x00000000U) /*!< MCO1 not divided */ -#define LL_RCC_MCO1_DIV_2 (uint32_t)(RCC_CFGR_MCO1PRE|(RCC_CFGR_MCO1PRE_2 >> 16U)) /*!< MCO1 divided by 2 */ -#define LL_RCC_MCO1_DIV_3 (uint32_t)(RCC_CFGR_MCO1PRE|((RCC_CFGR_MCO1PRE_2|RCC_CFGR_MCO1PRE_0) >> 16U)) /*!< MCO1 divided by 3 */ -#define LL_RCC_MCO1_DIV_4 (uint32_t)(RCC_CFGR_MCO1PRE|((RCC_CFGR_MCO1PRE_2|RCC_CFGR_MCO1PRE_1) >> 16U)) /*!< MCO1 divided by 4 */ -#define LL_RCC_MCO1_DIV_5 (uint32_t)(RCC_CFGR_MCO1PRE|(RCC_CFGR_MCO1PRE >> 16U)) /*!< MCO1 divided by 5 */ -#if defined(RCC_CFGR_MCO2PRE) -#define LL_RCC_MCO2_DIV_1 (uint32_t)(RCC_CFGR_MCO2PRE|0x00000000U) /*!< MCO2 not divided */ -#define LL_RCC_MCO2_DIV_2 (uint32_t)(RCC_CFGR_MCO2PRE|(RCC_CFGR_MCO2PRE_2 >> 16U)) /*!< MCO2 divided by 2 */ -#define LL_RCC_MCO2_DIV_3 (uint32_t)(RCC_CFGR_MCO2PRE|((RCC_CFGR_MCO2PRE_2|RCC_CFGR_MCO2PRE_0) >> 16U)) /*!< MCO2 divided by 3 */ -#define LL_RCC_MCO2_DIV_4 (uint32_t)(RCC_CFGR_MCO2PRE|((RCC_CFGR_MCO2PRE_2|RCC_CFGR_MCO2PRE_1) >> 16U)) /*!< MCO2 divided by 4 */ -#define LL_RCC_MCO2_DIV_5 (uint32_t)(RCC_CFGR_MCO2PRE|(RCC_CFGR_MCO2PRE >> 16U)) /*!< MCO2 divided by 5 */ -#endif /* RCC_CFGR_MCO2PRE */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_RTC_HSEDIV HSE prescaler for RTC clock - * @{ - */ -#define LL_RCC_RTC_NOCLOCK 0x00000000U /*!< HSE not divided */ -#define LL_RCC_RTC_HSE_DIV_2 RCC_CFGR_RTCPRE_1 /*!< HSE clock divided by 2 */ -#define LL_RCC_RTC_HSE_DIV_3 (RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 3 */ -#define LL_RCC_RTC_HSE_DIV_4 RCC_CFGR_RTCPRE_2 /*!< HSE clock divided by 4 */ -#define LL_RCC_RTC_HSE_DIV_5 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 5 */ -#define LL_RCC_RTC_HSE_DIV_6 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 6 */ -#define LL_RCC_RTC_HSE_DIV_7 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 7 */ -#define LL_RCC_RTC_HSE_DIV_8 RCC_CFGR_RTCPRE_3 /*!< HSE clock divided by 8 */ -#define LL_RCC_RTC_HSE_DIV_9 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 9 */ -#define LL_RCC_RTC_HSE_DIV_10 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 10 */ -#define LL_RCC_RTC_HSE_DIV_11 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 11 */ -#define LL_RCC_RTC_HSE_DIV_12 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 12 */ -#define LL_RCC_RTC_HSE_DIV_13 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 13 */ -#define LL_RCC_RTC_HSE_DIV_14 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 14 */ -#define LL_RCC_RTC_HSE_DIV_15 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 15 */ -#define LL_RCC_RTC_HSE_DIV_16 RCC_CFGR_RTCPRE_4 /*!< HSE clock divided by 16 */ -#define LL_RCC_RTC_HSE_DIV_17 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 17 */ -#define LL_RCC_RTC_HSE_DIV_18 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 18 */ -#define LL_RCC_RTC_HSE_DIV_19 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 19 */ -#define LL_RCC_RTC_HSE_DIV_20 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 20 */ -#define LL_RCC_RTC_HSE_DIV_21 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 21 */ -#define LL_RCC_RTC_HSE_DIV_22 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 22 */ -#define LL_RCC_RTC_HSE_DIV_23 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 23 */ -#define LL_RCC_RTC_HSE_DIV_24 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3) /*!< HSE clock divided by 24 */ -#define LL_RCC_RTC_HSE_DIV_25 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 25 */ -#define LL_RCC_RTC_HSE_DIV_26 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 26 */ -#define LL_RCC_RTC_HSE_DIV_27 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 27 */ -#define LL_RCC_RTC_HSE_DIV_28 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 28 */ -#define LL_RCC_RTC_HSE_DIV_29 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 29 */ -#define LL_RCC_RTC_HSE_DIV_30 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 30 */ -#define LL_RCC_RTC_HSE_DIV_31 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 31 */ -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup RCC_LL_EC_PERIPH_FREQUENCY Peripheral clock frequency - * @{ - */ -#define LL_RCC_PERIPH_FREQUENCY_NO 0x00000000U /*!< No clock enabled for the peripheral */ -#define LL_RCC_PERIPH_FREQUENCY_NA 0xFFFFFFFFU /*!< Frequency cannot be provided as external clock */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -#if defined(FMPI2C1) -/** @defgroup RCC_LL_EC_FMPI2C1_CLKSOURCE Peripheral FMPI2C clock source selection - * @{ - */ -#define LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 0x00000000U /*!< PCLK1 clock used as FMPI2C1 clock source */ -#define LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK RCC_DCKCFGR2_FMPI2C1SEL_0 /*!< SYSCLK clock used as FMPI2C1 clock source */ -#define LL_RCC_FMPI2C1_CLKSOURCE_HSI RCC_DCKCFGR2_FMPI2C1SEL_1 /*!< HSI clock used as FMPI2C1 clock source */ -/** - * @} - */ -#endif /* FMPI2C1 */ - -#if defined(LPTIM1) -/** @defgroup RCC_LL_EC_LPTIM1_CLKSOURCE Peripheral LPTIM clock source selection - * @{ - */ -#define LL_RCC_LPTIM1_CLKSOURCE_PCLK1 0x00000000U /*!< PCLK1 clock used as LPTIM1 clock */ -#define LL_RCC_LPTIM1_CLKSOURCE_HSI RCC_DCKCFGR2_LPTIM1SEL_0 /*!< LSI oscillator clock used as LPTIM1 clock */ -#define LL_RCC_LPTIM1_CLKSOURCE_LSI RCC_DCKCFGR2_LPTIM1SEL_1 /*!< HSI oscillator clock used as LPTIM1 clock */ -#define LL_RCC_LPTIM1_CLKSOURCE_LSE (uint32_t)(RCC_DCKCFGR2_LPTIM1SEL_1 | RCC_DCKCFGR2_LPTIM1SEL_0) /*!< LSE oscillator clock used as LPTIM1 clock */ -/** - * @} - */ -#endif /* LPTIM1 */ - -#if defined(SAI1) -/** @defgroup RCC_LL_EC_SAIx_CLKSOURCE Peripheral SAI clock source selection - * @{ - */ -#if defined(RCC_DCKCFGR_SAI1SRC) -#define LL_RCC_SAI1_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1SRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 clock source */ -#define LL_RCC_SAI1_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 clock source */ -#define LL_RCC_SAI1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC_1 >> 16)) /*!< PLL clock used as SAI1 clock source */ -#define LL_RCC_SAI1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC >> 16)) /*!< External pin clock used as SAI1 clock source */ -#endif /* RCC_DCKCFGR_SAI1SRC */ -#if defined(RCC_DCKCFGR_SAI2SRC) -#define LL_RCC_SAI2_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI2SRC | 0x00000000U) /*!< PLLSAI clock used as SAI2 clock source */ -#define LL_RCC_SAI2_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC_0 >> 16)) /*!< PLLI2S clock used as SAI2 clock source */ -#define LL_RCC_SAI2_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC_1 >> 16)) /*!< PLL clock used as SAI2 clock source */ -#define LL_RCC_SAI2_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC >> 16)) /*!< PLL Main clock used as SAI2 clock source */ -#endif /* RCC_DCKCFGR_SAI2SRC */ -#if defined(RCC_DCKCFGR_SAI1ASRC) -#if defined(RCC_SAI1A_PLLSOURCE_SUPPORT) -#define LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1ASRC | 0x00000000U) /*!< PLLI2S clock used as SAI1 block A clock source */ -#define LL_RCC_SAI1_A_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_0 >> 16)) /*!< External pin used as SAI1 block A clock source */ -#define LL_RCC_SAI1_A_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_1 >> 16)) /*!< PLL clock used as SAI1 block A clock source */ -#define LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC >> 16)) /*!< PLL Main clock used as SAI1 block A clock source */ -#else -#define LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1ASRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 block A clock source */ -#define LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 block A clock source */ -#define LL_RCC_SAI1_A_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_1 >> 16)) /*!< External pin clock used as SAI1 block A clock source */ -#endif /* RCC_SAI1A_PLLSOURCE_SUPPORT */ -#endif /* RCC_DCKCFGR_SAI1ASRC */ -#if defined(RCC_DCKCFGR_SAI1BSRC) -#if defined(RCC_SAI1B_PLLSOURCE_SUPPORT) -#define LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1BSRC | 0x00000000U) /*!< PLLI2S clock used as SAI1 block B clock source */ -#define LL_RCC_SAI1_B_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_0 >> 16)) /*!< External pin used as SAI1 block B clock source */ -#define LL_RCC_SAI1_B_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_1 >> 16)) /*!< PLL clock used as SAI1 block B clock source */ -#define LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC >> 16)) /*!< PLL Main clock used as SAI1 block B clock source */ -#else -#define LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1BSRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 block B clock source */ -#define LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 block B clock source */ -#define LL_RCC_SAI1_B_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_1 >> 16)) /*!< External pin clock used as SAI1 block B clock source */ -#endif /* RCC_SAI1B_PLLSOURCE_SUPPORT */ -#endif /* RCC_DCKCFGR_SAI1BSRC */ -/** - * @} - */ -#endif /* SAI1 */ - -#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) -/** @defgroup RCC_LL_EC_SDIOx_CLKSOURCE Peripheral SDIO clock source selection - * @{ - */ -#define LL_RCC_SDIO_CLKSOURCE_PLL48CLK 0x00000000U /*!< PLL 48M domain clock used as SDIO clock */ -#if defined(RCC_DCKCFGR_SDIOSEL) -#define LL_RCC_SDIO_CLKSOURCE_SYSCLK RCC_DCKCFGR_SDIOSEL /*!< System clock clock used as SDIO clock */ -#else -#define LL_RCC_SDIO_CLKSOURCE_SYSCLK RCC_DCKCFGR2_SDIOSEL /*!< System clock clock used as SDIO clock */ -#endif /* RCC_DCKCFGR_SDIOSEL */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ - -#if defined(DSI) -/** @defgroup RCC_LL_EC_DSI_CLKSOURCE Peripheral DSI clock source selection - * @{ - */ -#define LL_RCC_DSI_CLKSOURCE_PHY 0x00000000U /*!< DSI-PHY clock used as DSI byte lane clock source */ -#define LL_RCC_DSI_CLKSOURCE_PLL RCC_DCKCFGR_DSISEL /*!< PLL clock used as DSI byte lane clock source */ -/** - * @} - */ -#endif /* DSI */ - -#if defined(CEC) -/** @defgroup RCC_LL_EC_CEC_CLKSOURCE Peripheral CEC clock source selection - * @{ - */ -#define LL_RCC_CEC_CLKSOURCE_HSI_DIV488 0x00000000U /*!< HSI oscillator clock divided by 488 used as CEC clock */ -#define LL_RCC_CEC_CLKSOURCE_LSE RCC_DCKCFGR2_CECSEL /*!< LSE oscillator clock used as CEC clock */ -/** - * @} - */ -#endif /* CEC */ - -/** @defgroup RCC_LL_EC_I2S1_CLKSOURCE Peripheral I2S clock source selection - * @{ - */ -#if defined(RCC_CFGR_I2SSRC) -#define LL_RCC_I2S1_CLKSOURCE_PLLI2S 0x00000000U /*!< I2S oscillator clock used as I2S1 clock */ -#define LL_RCC_I2S1_CLKSOURCE_PIN RCC_CFGR_I2SSRC /*!< External pin clock used as I2S1 clock */ -#endif /* RCC_CFGR_I2SSRC */ -#if defined(RCC_DCKCFGR_I2SSRC) -#define LL_RCC_I2S1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2SSRC | 0x00000000U) /*!< PLL clock used as I2S1 clock source */ -#define LL_RCC_I2S1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2SSRC | (RCC_DCKCFGR_I2SSRC_0 >> 16)) /*!< External pin used as I2S1 clock source */ -#define LL_RCC_I2S1_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2SSRC | (RCC_DCKCFGR_I2SSRC_1 >> 16)) /*!< PLL Main clock used as I2S1 clock source */ -#endif /* RCC_DCKCFGR_I2SSRC */ -#if defined(RCC_DCKCFGR_I2S1SRC) -#define LL_RCC_I2S1_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_I2S1SRC | 0x00000000U) /*!< PLLI2S clock used as I2S1 clock source */ -#define LL_RCC_I2S1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC_0 >> 16)) /*!< External pin used as I2S1 clock source */ -#define LL_RCC_I2S1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC_1 >> 16)) /*!< PLL clock used as I2S1 clock source */ -#define LL_RCC_I2S1_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC >> 16)) /*!< PLL Main clock used as I2S1 clock source */ -#endif /* RCC_DCKCFGR_I2S1SRC */ -#if defined(RCC_DCKCFGR_I2S2SRC) -#define LL_RCC_I2S2_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_I2S2SRC | 0x00000000U) /*!< PLLI2S clock used as I2S2 clock source */ -#define LL_RCC_I2S2_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC_0 >> 16)) /*!< External pin used as I2S2 clock source */ -#define LL_RCC_I2S2_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC_1 >> 16)) /*!< PLL clock used as I2S2 clock source */ -#define LL_RCC_I2S2_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC >> 16)) /*!< PLL Main clock used as I2S2 clock source */ -#endif /* RCC_DCKCFGR_I2S2SRC */ -/** - * @} - */ - -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -/** @defgroup RCC_LL_EC_CK48M_CLKSOURCE Peripheral 48Mhz domain clock source selection - * @{ - */ -#if defined(RCC_DCKCFGR_CK48MSEL) -#define LL_RCC_CK48M_CLKSOURCE_PLL 0x00000000U /*!< PLL oscillator clock used as 48Mhz domain clock */ -#define LL_RCC_CK48M_CLKSOURCE_PLLSAI RCC_DCKCFGR_CK48MSEL /*!< PLLSAI oscillator clock used as 48Mhz domain clock */ -#endif /* RCC_DCKCFGR_CK48MSEL */ -#if defined(RCC_DCKCFGR2_CK48MSEL) -#define LL_RCC_CK48M_CLKSOURCE_PLL 0x00000000U /*!< PLL oscillator clock used as 48Mhz domain clock */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_CK48M_CLKSOURCE_PLLSAI RCC_DCKCFGR2_CK48MSEL /*!< PLLSAI oscillator clock used as 48Mhz domain clock */ -#endif /* RCC_PLLSAI_SUPPORT */ -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) -#define LL_RCC_CK48M_CLKSOURCE_PLLI2S RCC_DCKCFGR2_CK48MSEL /*!< PLLI2S oscillator clock used as 48Mhz domain clock */ -#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ -#endif /* RCC_DCKCFGR2_CK48MSEL */ -/** - * @} - */ - -#if defined(RNG) -/** @defgroup RCC_LL_EC_RNG_CLKSOURCE Peripheral RNG clock source selection - * @{ - */ -#define LL_RCC_RNG_CLKSOURCE_PLL LL_RCC_CK48M_CLKSOURCE_PLL /*!< PLL clock used as RNG clock source */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_RNG_CLKSOURCE_PLLSAI LL_RCC_CK48M_CLKSOURCE_PLLSAI /*!< PLLSAI clock used as RNG clock source */ -#endif /* RCC_PLLSAI_SUPPORT */ -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) -#define LL_RCC_RNG_CLKSOURCE_PLLI2S LL_RCC_CK48M_CLKSOURCE_PLLI2S /*!< PLLI2S clock used as RNG clock source */ -#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ -/** - * @} - */ -#endif /* RNG */ - -#if defined(USB_OTG_FS) || defined(USB_OTG_HS) -/** @defgroup RCC_LL_EC_USB_CLKSOURCE Peripheral USB clock source selection - * @{ - */ -#define LL_RCC_USB_CLKSOURCE_PLL LL_RCC_CK48M_CLKSOURCE_PLL /*!< PLL clock used as USB clock source */ -#if defined(RCC_PLLSAI_SUPPORT) -#define LL_RCC_USB_CLKSOURCE_PLLSAI LL_RCC_CK48M_CLKSOURCE_PLLSAI /*!< PLLSAI clock used as USB clock source */ -#endif /* RCC_PLLSAI_SUPPORT */ -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) -#define LL_RCC_USB_CLKSOURCE_PLLI2S LL_RCC_CK48M_CLKSOURCE_PLLI2S /*!< PLLI2S clock used as USB clock source */ -#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ -/** - * @} - */ -#endif /* USB_OTG_FS || USB_OTG_HS */ - -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ - -#if defined(DFSDM1_Channel0) || defined(DFSDM2_Channel0) -/** @defgroup RCC_LL_EC_DFSDM1_AUDIO_CLKSOURCE Peripheral DFSDM Audio clock source selection - * @{ - */ -#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 (uint32_t)(RCC_DCKCFGR_CKDFSDM1ASEL | 0x00000000U) /*!< I2S1 clock used as DFSDM1 Audio clock source */ -#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 (uint32_t)(RCC_DCKCFGR_CKDFSDM1ASEL | (RCC_DCKCFGR_CKDFSDM1ASEL << 16)) /*!< I2S2 clock used as DFSDM1 Audio clock source */ -#if defined(DFSDM2_Channel0) -#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (uint32_t)(RCC_DCKCFGR_CKDFSDM2ASEL | 0x00000000U) /*!< I2S1 clock used as DFSDM2 Audio clock source */ -#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (uint32_t)(RCC_DCKCFGR_CKDFSDM2ASEL | (RCC_DCKCFGR_CKDFSDM2ASEL << 16)) /*!< I2S2 clock used as DFSDM2 Audio clock source */ -#endif /* DFSDM2_Channel0 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_DFSDM1_CLKSOURCE Peripheral DFSDM clock source selection - * @{ - */ -#define LL_RCC_DFSDM1_CLKSOURCE_PCLK2 0x00000000U /*!< PCLK2 clock used as DFSDM1 clock */ -#define LL_RCC_DFSDM1_CLKSOURCE_SYSCLK RCC_DCKCFGR_CKDFSDM1SEL /*!< System clock used as DFSDM1 clock */ -#if defined(DFSDM2_Channel0) -#define LL_RCC_DFSDM2_CLKSOURCE_PCLK2 0x00000000U /*!< PCLK2 clock used as DFSDM2 clock */ -#define LL_RCC_DFSDM2_CLKSOURCE_SYSCLK RCC_DCKCFGR_CKDFSDM1SEL /*!< System clock used as DFSDM2 clock */ -#endif /* DFSDM2_Channel0 */ -/** - * @} - */ -#endif /* DFSDM1_Channel0 || DFSDM2_Channel0 */ - -#if defined(FMPI2C1) -/** @defgroup RCC_LL_EC_FMPI2C1 Peripheral FMPI2C get clock source - * @{ - */ -#define LL_RCC_FMPI2C1_CLKSOURCE RCC_DCKCFGR2_FMPI2C1SEL /*!< FMPI2C1 Clock source selection */ -/** - * @} - */ -#endif /* FMPI2C1 */ - -#if defined(SPDIFRX) -/** @defgroup RCC_LL_EC_SPDIFRX_CLKSOURCE Peripheral SPDIFRX clock source selection - * @{ - */ -#define LL_RCC_SPDIFRX1_CLKSOURCE_PLL 0x00000000U /*!< PLL clock used as SPDIFRX clock source */ -#define LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S RCC_DCKCFGR2_SPDIFRXSEL /*!< PLLI2S clock used as SPDIFRX clock source */ -/** - * @} - */ -#endif /* SPDIFRX */ - -#if defined(LPTIM1) -/** @defgroup RCC_LL_EC_LPTIM1 Peripheral LPTIM get clock source - * @{ - */ -#define LL_RCC_LPTIM1_CLKSOURCE RCC_DCKCFGR2_LPTIM1SEL /*!< LPTIM1 Clock source selection */ -/** - * @} - */ -#endif /* LPTIM1 */ - -#if defined(SAI1) -/** @defgroup RCC_LL_EC_SAIx Peripheral SAI get clock source - * @{ - */ -#if defined(RCC_DCKCFGR_SAI1ASRC) -#define LL_RCC_SAI1_A_CLKSOURCE RCC_DCKCFGR_SAI1ASRC /*!< SAI1 block A Clock source selection */ -#endif /* RCC_DCKCFGR_SAI1ASRC */ -#if defined(RCC_DCKCFGR_SAI1BSRC) -#define LL_RCC_SAI1_B_CLKSOURCE RCC_DCKCFGR_SAI1BSRC /*!< SAI1 block B Clock source selection */ -#endif /* RCC_DCKCFGR_SAI1BSRC */ -#if defined(RCC_DCKCFGR_SAI1SRC) -#define LL_RCC_SAI1_CLKSOURCE RCC_DCKCFGR_SAI1SRC /*!< SAI1 Clock source selection */ -#endif /* RCC_DCKCFGR_SAI1SRC */ -#if defined(RCC_DCKCFGR_SAI2SRC) -#define LL_RCC_SAI2_CLKSOURCE RCC_DCKCFGR_SAI2SRC /*!< SAI2 Clock source selection */ -#endif /* RCC_DCKCFGR_SAI2SRC */ -/** - * @} - */ -#endif /* SAI1 */ - -#if defined(SDIO) -/** @defgroup RCC_LL_EC_SDIOx Peripheral SDIO get clock source - * @{ - */ -#if defined(RCC_DCKCFGR_SDIOSEL) -#define LL_RCC_SDIO_CLKSOURCE RCC_DCKCFGR_SDIOSEL /*!< SDIO Clock source selection */ -#elif defined(RCC_DCKCFGR2_SDIOSEL) -#define LL_RCC_SDIO_CLKSOURCE RCC_DCKCFGR2_SDIOSEL /*!< SDIO Clock source selection */ -#else -#define LL_RCC_SDIO_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< SDIO Clock source selection */ -#endif /* RCC_DCKCFGR_SDIOSEL */ -/** - * @} - */ -#endif /* SDIO */ - -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -/** @defgroup RCC_LL_EC_CK48M Peripheral CK48M get clock source - * @{ - */ -#if defined(RCC_DCKCFGR_CK48MSEL) -#define LL_RCC_CK48M_CLKSOURCE RCC_DCKCFGR_CK48MSEL /*!< CK48M Domain clock source selection */ -#endif /* RCC_DCKCFGR_CK48MSEL */ -#if defined(RCC_DCKCFGR2_CK48MSEL) -#define LL_RCC_CK48M_CLKSOURCE RCC_DCKCFGR2_CK48MSEL /*!< CK48M Domain clock source selection */ -#endif /* RCC_DCKCFGR_CK48MSEL */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ - -#if defined(RNG) -/** @defgroup RCC_LL_EC_RNG Peripheral RNG get clock source - * @{ - */ -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -#define LL_RCC_RNG_CLKSOURCE LL_RCC_CK48M_CLKSOURCE /*!< RNG Clock source selection */ -#else -#define LL_RCC_RNG_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< RNG Clock source selection */ -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ -/** - * @} - */ -#endif /* RNG */ - -#if defined(USB_OTG_FS) || defined(USB_OTG_HS) -/** @defgroup RCC_LL_EC_USB Peripheral USB get clock source - * @{ - */ -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -#define LL_RCC_USB_CLKSOURCE LL_RCC_CK48M_CLKSOURCE /*!< USB Clock source selection */ -#else -#define LL_RCC_USB_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< USB Clock source selection */ -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ -/** - * @} - */ -#endif /* USB_OTG_FS || USB_OTG_HS */ - -#if defined(CEC) -/** @defgroup RCC_LL_EC_CEC Peripheral CEC get clock source - * @{ - */ -#define LL_RCC_CEC_CLKSOURCE RCC_DCKCFGR2_CECSEL /*!< CEC Clock source selection */ -/** - * @} - */ -#endif /* CEC */ - -/** @defgroup RCC_LL_EC_I2S1 Peripheral I2S get clock source - * @{ - */ -#if defined(RCC_CFGR_I2SSRC) -#define LL_RCC_I2S1_CLKSOURCE RCC_CFGR_I2SSRC /*!< I2S1 Clock source selection */ -#endif /* RCC_CFGR_I2SSRC */ -#if defined(RCC_DCKCFGR_I2SSRC) -#define LL_RCC_I2S1_CLKSOURCE RCC_DCKCFGR_I2SSRC /*!< I2S1 Clock source selection */ -#endif /* RCC_DCKCFGR_I2SSRC */ -#if defined(RCC_DCKCFGR_I2S1SRC) -#define LL_RCC_I2S1_CLKSOURCE RCC_DCKCFGR_I2S1SRC /*!< I2S1 Clock source selection */ -#endif /* RCC_DCKCFGR_I2S1SRC */ -#if defined(RCC_DCKCFGR_I2S2SRC) -#define LL_RCC_I2S2_CLKSOURCE RCC_DCKCFGR_I2S2SRC /*!< I2S2 Clock source selection */ -#endif /* RCC_DCKCFGR_I2S2SRC */ -/** - * @} - */ - -#if defined(DFSDM1_Channel0) || defined(DFSDM2_Channel0) -/** @defgroup RCC_LL_EC_DFSDM_AUDIO Peripheral DFSDM Audio get clock source - * @{ - */ -#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE RCC_DCKCFGR_CKDFSDM1ASEL /*!< DFSDM1 Audio Clock source selection */ -#if defined(DFSDM2_Channel0) -#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE RCC_DCKCFGR_CKDFSDM2ASEL /*!< DFSDM2 Audio Clock source selection */ -#endif /* DFSDM2_Channel0 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_DFSDM Peripheral DFSDM get clock source - * @{ - */ -#define LL_RCC_DFSDM1_CLKSOURCE RCC_DCKCFGR_CKDFSDM1SEL /*!< DFSDM1 Clock source selection */ -#if defined(DFSDM2_Channel0) -#define LL_RCC_DFSDM2_CLKSOURCE RCC_DCKCFGR_CKDFSDM1SEL /*!< DFSDM2 Clock source selection */ -#endif /* DFSDM2_Channel0 */ -/** - * @} - */ -#endif /* DFSDM1_Channel0 || DFSDM2_Channel0 */ - -#if defined(SPDIFRX) -/** @defgroup RCC_LL_EC_SPDIFRX Peripheral SPDIFRX get clock source - * @{ - */ -#define LL_RCC_SPDIFRX1_CLKSOURCE RCC_DCKCFGR2_SPDIFRXSEL /*!< SPDIFRX Clock source selection */ -/** - * @} - */ -#endif /* SPDIFRX */ - -#if defined(DSI) -/** @defgroup RCC_LL_EC_DSI Peripheral DSI get clock source - * @{ - */ -#define LL_RCC_DSI_CLKSOURCE RCC_DCKCFGR_DSISEL /*!< DSI Clock source selection */ -/** - * @} - */ -#endif /* DSI */ - -#if defined(LTDC) -/** @defgroup RCC_LL_EC_LTDC Peripheral LTDC get clock source - * @{ - */ -#define LL_RCC_LTDC_CLKSOURCE RCC_DCKCFGR_PLLSAIDIVR /*!< LTDC Clock source selection */ -/** - * @} - */ -#endif /* LTDC */ - - -/** @defgroup RCC_LL_EC_RTC_CLKSOURCE RTC clock source selection - * @{ - */ -#define LL_RCC_RTC_CLKSOURCE_NONE 0x00000000U /*!< No clock used as RTC clock */ -#define LL_RCC_RTC_CLKSOURCE_LSE RCC_BDCR_RTCSEL_0 /*!< LSE oscillator clock used as RTC clock */ -#define LL_RCC_RTC_CLKSOURCE_LSI RCC_BDCR_RTCSEL_1 /*!< LSI oscillator clock used as RTC clock */ -#define LL_RCC_RTC_CLKSOURCE_HSE RCC_BDCR_RTCSEL /*!< HSE oscillator clock divided by HSE prescaler used as RTC clock */ -/** - * @} - */ - -#if defined(RCC_DCKCFGR_TIMPRE) -/** @defgroup RCC_LL_EC_TIM_CLKPRESCALER Timers clocks prescalers selection - * @{ - */ -#define LL_RCC_TIM_PRESCALER_TWICE 0x00000000U /*!< Timers clock to twice PCLK */ -#define LL_RCC_TIM_PRESCALER_FOUR_TIMES RCC_DCKCFGR_TIMPRE /*!< Timers clock to four time PCLK */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_TIMPRE */ - -/** @defgroup RCC_LL_EC_PLLSOURCE PLL, PLLI2S and PLLSAI entry clock source - * @{ - */ -#define LL_RCC_PLLSOURCE_HSI RCC_PLLCFGR_PLLSRC_HSI /*!< HSI16 clock selected as PLL entry clock source */ -#define LL_RCC_PLLSOURCE_HSE RCC_PLLCFGR_PLLSRC_HSE /*!< HSE clock selected as PLL entry clock source */ -#if defined(RCC_PLLI2SCFGR_PLLI2SSRC) -#define LL_RCC_PLLI2SSOURCE_PIN (RCC_PLLI2SCFGR_PLLI2SSRC | 0x80U) /*!< I2S External pin input clock selected as PLLI2S entry clock source */ -#endif /* RCC_PLLI2SCFGR_PLLI2SSRC */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_PLLM_DIV PLL, PLLI2S and PLLSAI division factor - * @{ - */ -#define LL_RCC_PLLM_DIV_2 (RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 2 */ -#define LL_RCC_PLLM_DIV_3 (RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 3 */ -#define LL_RCC_PLLM_DIV_4 (RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 4 */ -#define LL_RCC_PLLM_DIV_5 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 5 */ -#define LL_RCC_PLLM_DIV_6 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 6 */ -#define LL_RCC_PLLM_DIV_7 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 7 */ -#define LL_RCC_PLLM_DIV_8 (RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 8 */ -#define LL_RCC_PLLM_DIV_9 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 9 */ -#define LL_RCC_PLLM_DIV_10 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 10 */ -#define LL_RCC_PLLM_DIV_11 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 11 */ -#define LL_RCC_PLLM_DIV_12 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 12 */ -#define LL_RCC_PLLM_DIV_13 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 13 */ -#define LL_RCC_PLLM_DIV_14 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 14 */ -#define LL_RCC_PLLM_DIV_15 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 15 */ -#define LL_RCC_PLLM_DIV_16 (RCC_PLLCFGR_PLLM_4) /*!< PLL, PLLI2S and PLLSAI division factor by 16 */ -#define LL_RCC_PLLM_DIV_17 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 17 */ -#define LL_RCC_PLLM_DIV_18 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 18 */ -#define LL_RCC_PLLM_DIV_19 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 19 */ -#define LL_RCC_PLLM_DIV_20 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 20 */ -#define LL_RCC_PLLM_DIV_21 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 21 */ -#define LL_RCC_PLLM_DIV_22 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 22 */ -#define LL_RCC_PLLM_DIV_23 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 23 */ -#define LL_RCC_PLLM_DIV_24 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 24 */ -#define LL_RCC_PLLM_DIV_25 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 25 */ -#define LL_RCC_PLLM_DIV_26 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 26 */ -#define LL_RCC_PLLM_DIV_27 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 27 */ -#define LL_RCC_PLLM_DIV_28 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 28 */ -#define LL_RCC_PLLM_DIV_29 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 29 */ -#define LL_RCC_PLLM_DIV_30 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 30 */ -#define LL_RCC_PLLM_DIV_31 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 31 */ -#define LL_RCC_PLLM_DIV_32 (RCC_PLLCFGR_PLLM_5) /*!< PLL, PLLI2S and PLLSAI division factor by 32 */ -#define LL_RCC_PLLM_DIV_33 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 33 */ -#define LL_RCC_PLLM_DIV_34 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 34 */ -#define LL_RCC_PLLM_DIV_35 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 35 */ -#define LL_RCC_PLLM_DIV_36 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 36 */ -#define LL_RCC_PLLM_DIV_37 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 37 */ -#define LL_RCC_PLLM_DIV_38 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 38 */ -#define LL_RCC_PLLM_DIV_39 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 39 */ -#define LL_RCC_PLLM_DIV_40 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 40 */ -#define LL_RCC_PLLM_DIV_41 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 41 */ -#define LL_RCC_PLLM_DIV_42 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 42 */ -#define LL_RCC_PLLM_DIV_43 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 43 */ -#define LL_RCC_PLLM_DIV_44 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 44 */ -#define LL_RCC_PLLM_DIV_45 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 45 */ -#define LL_RCC_PLLM_DIV_46 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 46 */ -#define LL_RCC_PLLM_DIV_47 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 47 */ -#define LL_RCC_PLLM_DIV_48 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4) /*!< PLL, PLLI2S and PLLSAI division factor by 48 */ -#define LL_RCC_PLLM_DIV_49 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 49 */ -#define LL_RCC_PLLM_DIV_50 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 50 */ -#define LL_RCC_PLLM_DIV_51 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 51 */ -#define LL_RCC_PLLM_DIV_52 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 52 */ -#define LL_RCC_PLLM_DIV_53 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 53 */ -#define LL_RCC_PLLM_DIV_54 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 54 */ -#define LL_RCC_PLLM_DIV_55 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 55 */ -#define LL_RCC_PLLM_DIV_56 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 56 */ -#define LL_RCC_PLLM_DIV_57 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 57 */ -#define LL_RCC_PLLM_DIV_58 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 58 */ -#define LL_RCC_PLLM_DIV_59 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 59 */ -#define LL_RCC_PLLM_DIV_60 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 60 */ -#define LL_RCC_PLLM_DIV_61 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 61 */ -#define LL_RCC_PLLM_DIV_62 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 62 */ -#define LL_RCC_PLLM_DIV_63 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 63 */ -/** - * @} - */ - -#if defined(RCC_PLLCFGR_PLLR) -/** @defgroup RCC_LL_EC_PLLR_DIV PLL division factor (PLLR) - * @{ - */ -#define LL_RCC_PLLR_DIV_2 (RCC_PLLCFGR_PLLR_1) /*!< Main PLL division factor for PLLCLK (system clock) by 2 */ -#define LL_RCC_PLLR_DIV_3 (RCC_PLLCFGR_PLLR_1|RCC_PLLCFGR_PLLR_0) /*!< Main PLL division factor for PLLCLK (system clock) by 3 */ -#define LL_RCC_PLLR_DIV_4 (RCC_PLLCFGR_PLLR_2) /*!< Main PLL division factor for PLLCLK (system clock) by 4 */ -#define LL_RCC_PLLR_DIV_5 (RCC_PLLCFGR_PLLR_2|RCC_PLLCFGR_PLLR_0) /*!< Main PLL division factor for PLLCLK (system clock) by 5 */ -#define LL_RCC_PLLR_DIV_6 (RCC_PLLCFGR_PLLR_2|RCC_PLLCFGR_PLLR_1) /*!< Main PLL division factor for PLLCLK (system clock) by 6 */ -#define LL_RCC_PLLR_DIV_7 (RCC_PLLCFGR_PLLR) /*!< Main PLL division factor for PLLCLK (system clock) by 7 */ -/** - * @} - */ -#endif /* RCC_PLLCFGR_PLLR */ - -#if defined(RCC_DCKCFGR_PLLDIVR) -/** @defgroup RCC_LL_EC_PLLDIVR PLLDIVR division factor (PLLDIVR) - * @{ - */ -#define LL_RCC_PLLDIVR_DIV_1 (RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 1 */ -#define LL_RCC_PLLDIVR_DIV_2 (RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 2 */ -#define LL_RCC_PLLDIVR_DIV_3 (RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 3 */ -#define LL_RCC_PLLDIVR_DIV_4 (RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 4 */ -#define LL_RCC_PLLDIVR_DIV_5 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 5 */ -#define LL_RCC_PLLDIVR_DIV_6 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 6 */ -#define LL_RCC_PLLDIVR_DIV_7 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 7 */ -#define LL_RCC_PLLDIVR_DIV_8 (RCC_DCKCFGR_PLLDIVR_3) /*!< PLL division factor for PLLDIVR output by 8 */ -#define LL_RCC_PLLDIVR_DIV_9 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 9 */ -#define LL_RCC_PLLDIVR_DIV_10 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 10 */ -#define LL_RCC_PLLDIVR_DIV_11 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 11 */ -#define LL_RCC_PLLDIVR_DIV_12 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 12 */ -#define LL_RCC_PLLDIVR_DIV_13 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 13 */ -#define LL_RCC_PLLDIVR_DIV_14 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 14 */ -#define LL_RCC_PLLDIVR_DIV_15 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 15 */ -#define LL_RCC_PLLDIVR_DIV_16 (RCC_DCKCFGR_PLLDIVR_4) /*!< PLL division factor for PLLDIVR output by 16 */ -#define LL_RCC_PLLDIVR_DIV_17 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 17 */ -#define LL_RCC_PLLDIVR_DIV_18 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 18 */ -#define LL_RCC_PLLDIVR_DIV_19 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 19 */ -#define LL_RCC_PLLDIVR_DIV_20 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 20 */ -#define LL_RCC_PLLDIVR_DIV_21 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 21 */ -#define LL_RCC_PLLDIVR_DIV_22 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 22 */ -#define LL_RCC_PLLDIVR_DIV_23 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 23 */ -#define LL_RCC_PLLDIVR_DIV_24 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3) /*!< PLL division factor for PLLDIVR output by 24 */ -#define LL_RCC_PLLDIVR_DIV_25 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 25 */ -#define LL_RCC_PLLDIVR_DIV_26 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 26 */ -#define LL_RCC_PLLDIVR_DIV_27 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 27 */ -#define LL_RCC_PLLDIVR_DIV_28 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 28 */ -#define LL_RCC_PLLDIVR_DIV_29 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 29 */ -#define LL_RCC_PLLDIVR_DIV_30 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 30 */ -#define LL_RCC_PLLDIVR_DIV_31 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 31 */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_PLLDIVR */ - -/** @defgroup RCC_LL_EC_PLLP_DIV PLL division factor (PLLP) - * @{ - */ -#define LL_RCC_PLLP_DIV_2 0x00000000U /*!< Main PLL division factor for PLLP output by 2 */ -#define LL_RCC_PLLP_DIV_4 RCC_PLLCFGR_PLLP_0 /*!< Main PLL division factor for PLLP output by 4 */ -#define LL_RCC_PLLP_DIV_6 RCC_PLLCFGR_PLLP_1 /*!< Main PLL division factor for PLLP output by 6 */ -#define LL_RCC_PLLP_DIV_8 (RCC_PLLCFGR_PLLP_1 | RCC_PLLCFGR_PLLP_0) /*!< Main PLL division factor for PLLP output by 8 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_PLLQ_DIV PLL division factor (PLLQ) - * @{ - */ -#define LL_RCC_PLLQ_DIV_2 RCC_PLLCFGR_PLLQ_1 /*!< Main PLL division factor for PLLQ output by 2 */ -#define LL_RCC_PLLQ_DIV_3 (RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 3 */ -#define LL_RCC_PLLQ_DIV_4 RCC_PLLCFGR_PLLQ_2 /*!< Main PLL division factor for PLLQ output by 4 */ -#define LL_RCC_PLLQ_DIV_5 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 5 */ -#define LL_RCC_PLLQ_DIV_6 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 6 */ -#define LL_RCC_PLLQ_DIV_7 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 7 */ -#define LL_RCC_PLLQ_DIV_8 RCC_PLLCFGR_PLLQ_3 /*!< Main PLL division factor for PLLQ output by 8 */ -#define LL_RCC_PLLQ_DIV_9 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 9 */ -#define LL_RCC_PLLQ_DIV_10 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 10 */ -#define LL_RCC_PLLQ_DIV_11 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 11 */ -#define LL_RCC_PLLQ_DIV_12 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2) /*!< Main PLL division factor for PLLQ output by 12 */ -#define LL_RCC_PLLQ_DIV_13 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 13 */ -#define LL_RCC_PLLQ_DIV_14 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 14 */ -#define LL_RCC_PLLQ_DIV_15 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 15 */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_PLL_SPRE_SEL PLL Spread Spectrum Selection - * @{ - */ -#define LL_RCC_SPREAD_SELECT_CENTER 0x00000000U /*!< PLL center spread spectrum selection */ -#define LL_RCC_SPREAD_SELECT_DOWN RCC_SSCGR_SPREADSEL /*!< PLL down spread spectrum selection */ -/** - * @} - */ - -#if defined(RCC_PLLI2S_SUPPORT) -/** @defgroup RCC_LL_EC_PLLI2SM PLLI2SM division factor (PLLI2SM) - * @{ - */ -#if defined(RCC_PLLI2SCFGR_PLLI2SM) -#define LL_RCC_PLLI2SM_DIV_2 (RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 2 */ -#define LL_RCC_PLLI2SM_DIV_3 (RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 3 */ -#define LL_RCC_PLLI2SM_DIV_4 (RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 4 */ -#define LL_RCC_PLLI2SM_DIV_5 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 5 */ -#define LL_RCC_PLLI2SM_DIV_6 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 6 */ -#define LL_RCC_PLLI2SM_DIV_7 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 7 */ -#define LL_RCC_PLLI2SM_DIV_8 (RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 8 */ -#define LL_RCC_PLLI2SM_DIV_9 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 9 */ -#define LL_RCC_PLLI2SM_DIV_10 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 10 */ -#define LL_RCC_PLLI2SM_DIV_11 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 11 */ -#define LL_RCC_PLLI2SM_DIV_12 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 12 */ -#define LL_RCC_PLLI2SM_DIV_13 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 13 */ -#define LL_RCC_PLLI2SM_DIV_14 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 14 */ -#define LL_RCC_PLLI2SM_DIV_15 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 15 */ -#define LL_RCC_PLLI2SM_DIV_16 (RCC_PLLI2SCFGR_PLLI2SM_4) /*!< PLLI2S division factor for PLLI2SM output by 16 */ -#define LL_RCC_PLLI2SM_DIV_17 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 17 */ -#define LL_RCC_PLLI2SM_DIV_18 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 18 */ -#define LL_RCC_PLLI2SM_DIV_19 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 19 */ -#define LL_RCC_PLLI2SM_DIV_20 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 20 */ -#define LL_RCC_PLLI2SM_DIV_21 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 21 */ -#define LL_RCC_PLLI2SM_DIV_22 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 22 */ -#define LL_RCC_PLLI2SM_DIV_23 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 23 */ -#define LL_RCC_PLLI2SM_DIV_24 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 24 */ -#define LL_RCC_PLLI2SM_DIV_25 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 25 */ -#define LL_RCC_PLLI2SM_DIV_26 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 26 */ -#define LL_RCC_PLLI2SM_DIV_27 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 27 */ -#define LL_RCC_PLLI2SM_DIV_28 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 28 */ -#define LL_RCC_PLLI2SM_DIV_29 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 29 */ -#define LL_RCC_PLLI2SM_DIV_30 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 30 */ -#define LL_RCC_PLLI2SM_DIV_31 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 31 */ -#define LL_RCC_PLLI2SM_DIV_32 (RCC_PLLI2SCFGR_PLLI2SM_5) /*!< PLLI2S division factor for PLLI2SM output by 32 */ -#define LL_RCC_PLLI2SM_DIV_33 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 33 */ -#define LL_RCC_PLLI2SM_DIV_34 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 34 */ -#define LL_RCC_PLLI2SM_DIV_35 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 35 */ -#define LL_RCC_PLLI2SM_DIV_36 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 36 */ -#define LL_RCC_PLLI2SM_DIV_37 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 37 */ -#define LL_RCC_PLLI2SM_DIV_38 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 38 */ -#define LL_RCC_PLLI2SM_DIV_39 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 39 */ -#define LL_RCC_PLLI2SM_DIV_40 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 40 */ -#define LL_RCC_PLLI2SM_DIV_41 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 41 */ -#define LL_RCC_PLLI2SM_DIV_42 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 42 */ -#define LL_RCC_PLLI2SM_DIV_43 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 43 */ -#define LL_RCC_PLLI2SM_DIV_44 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 44 */ -#define LL_RCC_PLLI2SM_DIV_45 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 45 */ -#define LL_RCC_PLLI2SM_DIV_46 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 46 */ -#define LL_RCC_PLLI2SM_DIV_47 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 47 */ -#define LL_RCC_PLLI2SM_DIV_48 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4) /*!< PLLI2S division factor for PLLI2SM output by 48 */ -#define LL_RCC_PLLI2SM_DIV_49 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 49 */ -#define LL_RCC_PLLI2SM_DIV_50 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 50 */ -#define LL_RCC_PLLI2SM_DIV_51 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 51 */ -#define LL_RCC_PLLI2SM_DIV_52 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 52 */ -#define LL_RCC_PLLI2SM_DIV_53 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 53 */ -#define LL_RCC_PLLI2SM_DIV_54 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 54 */ -#define LL_RCC_PLLI2SM_DIV_55 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 55 */ -#define LL_RCC_PLLI2SM_DIV_56 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 56 */ -#define LL_RCC_PLLI2SM_DIV_57 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 57 */ -#define LL_RCC_PLLI2SM_DIV_58 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 58 */ -#define LL_RCC_PLLI2SM_DIV_59 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 59 */ -#define LL_RCC_PLLI2SM_DIV_60 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 60 */ -#define LL_RCC_PLLI2SM_DIV_61 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 61 */ -#define LL_RCC_PLLI2SM_DIV_62 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 62 */ -#define LL_RCC_PLLI2SM_DIV_63 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 63 */ -#else -#define LL_RCC_PLLI2SM_DIV_2 LL_RCC_PLLM_DIV_2 /*!< PLLI2S division factor for PLLI2SM output by 2 */ -#define LL_RCC_PLLI2SM_DIV_3 LL_RCC_PLLM_DIV_3 /*!< PLLI2S division factor for PLLI2SM output by 3 */ -#define LL_RCC_PLLI2SM_DIV_4 LL_RCC_PLLM_DIV_4 /*!< PLLI2S division factor for PLLI2SM output by 4 */ -#define LL_RCC_PLLI2SM_DIV_5 LL_RCC_PLLM_DIV_5 /*!< PLLI2S division factor for PLLI2SM output by 5 */ -#define LL_RCC_PLLI2SM_DIV_6 LL_RCC_PLLM_DIV_6 /*!< PLLI2S division factor for PLLI2SM output by 6 */ -#define LL_RCC_PLLI2SM_DIV_7 LL_RCC_PLLM_DIV_7 /*!< PLLI2S division factor for PLLI2SM output by 7 */ -#define LL_RCC_PLLI2SM_DIV_8 LL_RCC_PLLM_DIV_8 /*!< PLLI2S division factor for PLLI2SM output by 8 */ -#define LL_RCC_PLLI2SM_DIV_9 LL_RCC_PLLM_DIV_9 /*!< PLLI2S division factor for PLLI2SM output by 9 */ -#define LL_RCC_PLLI2SM_DIV_10 LL_RCC_PLLM_DIV_10 /*!< PLLI2S division factor for PLLI2SM output by 10 */ -#define LL_RCC_PLLI2SM_DIV_11 LL_RCC_PLLM_DIV_11 /*!< PLLI2S division factor for PLLI2SM output by 11 */ -#define LL_RCC_PLLI2SM_DIV_12 LL_RCC_PLLM_DIV_12 /*!< PLLI2S division factor for PLLI2SM output by 12 */ -#define LL_RCC_PLLI2SM_DIV_13 LL_RCC_PLLM_DIV_13 /*!< PLLI2S division factor for PLLI2SM output by 13 */ -#define LL_RCC_PLLI2SM_DIV_14 LL_RCC_PLLM_DIV_14 /*!< PLLI2S division factor for PLLI2SM output by 14 */ -#define LL_RCC_PLLI2SM_DIV_15 LL_RCC_PLLM_DIV_15 /*!< PLLI2S division factor for PLLI2SM output by 15 */ -#define LL_RCC_PLLI2SM_DIV_16 LL_RCC_PLLM_DIV_16 /*!< PLLI2S division factor for PLLI2SM output by 16 */ -#define LL_RCC_PLLI2SM_DIV_17 LL_RCC_PLLM_DIV_17 /*!< PLLI2S division factor for PLLI2SM output by 17 */ -#define LL_RCC_PLLI2SM_DIV_18 LL_RCC_PLLM_DIV_18 /*!< PLLI2S division factor for PLLI2SM output by 18 */ -#define LL_RCC_PLLI2SM_DIV_19 LL_RCC_PLLM_DIV_19 /*!< PLLI2S division factor for PLLI2SM output by 19 */ -#define LL_RCC_PLLI2SM_DIV_20 LL_RCC_PLLM_DIV_20 /*!< PLLI2S division factor for PLLI2SM output by 20 */ -#define LL_RCC_PLLI2SM_DIV_21 LL_RCC_PLLM_DIV_21 /*!< PLLI2S division factor for PLLI2SM output by 21 */ -#define LL_RCC_PLLI2SM_DIV_22 LL_RCC_PLLM_DIV_22 /*!< PLLI2S division factor for PLLI2SM output by 22 */ -#define LL_RCC_PLLI2SM_DIV_23 LL_RCC_PLLM_DIV_23 /*!< PLLI2S division factor for PLLI2SM output by 23 */ -#define LL_RCC_PLLI2SM_DIV_24 LL_RCC_PLLM_DIV_24 /*!< PLLI2S division factor for PLLI2SM output by 24 */ -#define LL_RCC_PLLI2SM_DIV_25 LL_RCC_PLLM_DIV_25 /*!< PLLI2S division factor for PLLI2SM output by 25 */ -#define LL_RCC_PLLI2SM_DIV_26 LL_RCC_PLLM_DIV_26 /*!< PLLI2S division factor for PLLI2SM output by 26 */ -#define LL_RCC_PLLI2SM_DIV_27 LL_RCC_PLLM_DIV_27 /*!< PLLI2S division factor for PLLI2SM output by 27 */ -#define LL_RCC_PLLI2SM_DIV_28 LL_RCC_PLLM_DIV_28 /*!< PLLI2S division factor for PLLI2SM output by 28 */ -#define LL_RCC_PLLI2SM_DIV_29 LL_RCC_PLLM_DIV_29 /*!< PLLI2S division factor for PLLI2SM output by 29 */ -#define LL_RCC_PLLI2SM_DIV_30 LL_RCC_PLLM_DIV_30 /*!< PLLI2S division factor for PLLI2SM output by 30 */ -#define LL_RCC_PLLI2SM_DIV_31 LL_RCC_PLLM_DIV_31 /*!< PLLI2S division factor for PLLI2SM output by 31 */ -#define LL_RCC_PLLI2SM_DIV_32 LL_RCC_PLLM_DIV_32 /*!< PLLI2S division factor for PLLI2SM output by 32 */ -#define LL_RCC_PLLI2SM_DIV_33 LL_RCC_PLLM_DIV_33 /*!< PLLI2S division factor for PLLI2SM output by 33 */ -#define LL_RCC_PLLI2SM_DIV_34 LL_RCC_PLLM_DIV_34 /*!< PLLI2S division factor for PLLI2SM output by 34 */ -#define LL_RCC_PLLI2SM_DIV_35 LL_RCC_PLLM_DIV_35 /*!< PLLI2S division factor for PLLI2SM output by 35 */ -#define LL_RCC_PLLI2SM_DIV_36 LL_RCC_PLLM_DIV_36 /*!< PLLI2S division factor for PLLI2SM output by 36 */ -#define LL_RCC_PLLI2SM_DIV_37 LL_RCC_PLLM_DIV_37 /*!< PLLI2S division factor for PLLI2SM output by 37 */ -#define LL_RCC_PLLI2SM_DIV_38 LL_RCC_PLLM_DIV_38 /*!< PLLI2S division factor for PLLI2SM output by 38 */ -#define LL_RCC_PLLI2SM_DIV_39 LL_RCC_PLLM_DIV_39 /*!< PLLI2S division factor for PLLI2SM output by 39 */ -#define LL_RCC_PLLI2SM_DIV_40 LL_RCC_PLLM_DIV_40 /*!< PLLI2S division factor for PLLI2SM output by 40 */ -#define LL_RCC_PLLI2SM_DIV_41 LL_RCC_PLLM_DIV_41 /*!< PLLI2S division factor for PLLI2SM output by 41 */ -#define LL_RCC_PLLI2SM_DIV_42 LL_RCC_PLLM_DIV_42 /*!< PLLI2S division factor for PLLI2SM output by 42 */ -#define LL_RCC_PLLI2SM_DIV_43 LL_RCC_PLLM_DIV_43 /*!< PLLI2S division factor for PLLI2SM output by 43 */ -#define LL_RCC_PLLI2SM_DIV_44 LL_RCC_PLLM_DIV_44 /*!< PLLI2S division factor for PLLI2SM output by 44 */ -#define LL_RCC_PLLI2SM_DIV_45 LL_RCC_PLLM_DIV_45 /*!< PLLI2S division factor for PLLI2SM output by 45 */ -#define LL_RCC_PLLI2SM_DIV_46 LL_RCC_PLLM_DIV_46 /*!< PLLI2S division factor for PLLI2SM output by 46 */ -#define LL_RCC_PLLI2SM_DIV_47 LL_RCC_PLLM_DIV_47 /*!< PLLI2S division factor for PLLI2SM output by 47 */ -#define LL_RCC_PLLI2SM_DIV_48 LL_RCC_PLLM_DIV_48 /*!< PLLI2S division factor for PLLI2SM output by 48 */ -#define LL_RCC_PLLI2SM_DIV_49 LL_RCC_PLLM_DIV_49 /*!< PLLI2S division factor for PLLI2SM output by 49 */ -#define LL_RCC_PLLI2SM_DIV_50 LL_RCC_PLLM_DIV_50 /*!< PLLI2S division factor for PLLI2SM output by 50 */ -#define LL_RCC_PLLI2SM_DIV_51 LL_RCC_PLLM_DIV_51 /*!< PLLI2S division factor for PLLI2SM output by 51 */ -#define LL_RCC_PLLI2SM_DIV_52 LL_RCC_PLLM_DIV_52 /*!< PLLI2S division factor for PLLI2SM output by 52 */ -#define LL_RCC_PLLI2SM_DIV_53 LL_RCC_PLLM_DIV_53 /*!< PLLI2S division factor for PLLI2SM output by 53 */ -#define LL_RCC_PLLI2SM_DIV_54 LL_RCC_PLLM_DIV_54 /*!< PLLI2S division factor for PLLI2SM output by 54 */ -#define LL_RCC_PLLI2SM_DIV_55 LL_RCC_PLLM_DIV_55 /*!< PLLI2S division factor for PLLI2SM output by 55 */ -#define LL_RCC_PLLI2SM_DIV_56 LL_RCC_PLLM_DIV_56 /*!< PLLI2S division factor for PLLI2SM output by 56 */ -#define LL_RCC_PLLI2SM_DIV_57 LL_RCC_PLLM_DIV_57 /*!< PLLI2S division factor for PLLI2SM output by 57 */ -#define LL_RCC_PLLI2SM_DIV_58 LL_RCC_PLLM_DIV_58 /*!< PLLI2S division factor for PLLI2SM output by 58 */ -#define LL_RCC_PLLI2SM_DIV_59 LL_RCC_PLLM_DIV_59 /*!< PLLI2S division factor for PLLI2SM output by 59 */ -#define LL_RCC_PLLI2SM_DIV_60 LL_RCC_PLLM_DIV_60 /*!< PLLI2S division factor for PLLI2SM output by 60 */ -#define LL_RCC_PLLI2SM_DIV_61 LL_RCC_PLLM_DIV_61 /*!< PLLI2S division factor for PLLI2SM output by 61 */ -#define LL_RCC_PLLI2SM_DIV_62 LL_RCC_PLLM_DIV_62 /*!< PLLI2S division factor for PLLI2SM output by 62 */ -#define LL_RCC_PLLI2SM_DIV_63 LL_RCC_PLLM_DIV_63 /*!< PLLI2S division factor for PLLI2SM output by 63 */ -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ -/** - * @} - */ - -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) -/** @defgroup RCC_LL_EC_PLLI2SQ PLLI2SQ division factor (PLLI2SQ) - * @{ - */ -#define LL_RCC_PLLI2SQ_DIV_2 RCC_PLLI2SCFGR_PLLI2SQ_1 /*!< PLLI2S division factor for PLLI2SQ output by 2 */ -#define LL_RCC_PLLI2SQ_DIV_3 (RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 3 */ -#define LL_RCC_PLLI2SQ_DIV_4 RCC_PLLI2SCFGR_PLLI2SQ_2 /*!< PLLI2S division factor for PLLI2SQ output by 4 */ -#define LL_RCC_PLLI2SQ_DIV_5 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 5 */ -#define LL_RCC_PLLI2SQ_DIV_6 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 6 */ -#define LL_RCC_PLLI2SQ_DIV_7 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 7 */ -#define LL_RCC_PLLI2SQ_DIV_8 RCC_PLLI2SCFGR_PLLI2SQ_3 /*!< PLLI2S division factor for PLLI2SQ output by 8 */ -#define LL_RCC_PLLI2SQ_DIV_9 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 9 */ -#define LL_RCC_PLLI2SQ_DIV_10 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 10 */ -#define LL_RCC_PLLI2SQ_DIV_11 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 11 */ -#define LL_RCC_PLLI2SQ_DIV_12 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2) /*!< PLLI2S division factor for PLLI2SQ output by 12 */ -#define LL_RCC_PLLI2SQ_DIV_13 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 13 */ -#define LL_RCC_PLLI2SQ_DIV_14 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 14 */ -#define LL_RCC_PLLI2SQ_DIV_15 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 15 */ -/** - * @} - */ -#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ - -#if defined(RCC_DCKCFGR_PLLI2SDIVQ) -/** @defgroup RCC_LL_EC_PLLI2SDIVQ PLLI2SDIVQ division factor (PLLI2SDIVQ) - * @{ - */ -#define LL_RCC_PLLI2SDIVQ_DIV_1 0x00000000U /*!< PLLI2S division factor for PLLI2SDIVQ output by 1 */ -#define LL_RCC_PLLI2SDIVQ_DIV_2 RCC_DCKCFGR_PLLI2SDIVQ_0 /*!< PLLI2S division factor for PLLI2SDIVQ output by 2 */ -#define LL_RCC_PLLI2SDIVQ_DIV_3 RCC_DCKCFGR_PLLI2SDIVQ_1 /*!< PLLI2S division factor for PLLI2SDIVQ output by 3 */ -#define LL_RCC_PLLI2SDIVQ_DIV_4 (RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 4 */ -#define LL_RCC_PLLI2SDIVQ_DIV_5 RCC_DCKCFGR_PLLI2SDIVQ_2 /*!< PLLI2S division factor for PLLI2SDIVQ output by 5 */ -#define LL_RCC_PLLI2SDIVQ_DIV_6 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 6 */ -#define LL_RCC_PLLI2SDIVQ_DIV_7 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 7 */ -#define LL_RCC_PLLI2SDIVQ_DIV_8 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 8 */ -#define LL_RCC_PLLI2SDIVQ_DIV_9 RCC_DCKCFGR_PLLI2SDIVQ_3 /*!< PLLI2S division factor for PLLI2SDIVQ output by 9 */ -#define LL_RCC_PLLI2SDIVQ_DIV_10 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 10 */ -#define LL_RCC_PLLI2SDIVQ_DIV_11 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 11 */ -#define LL_RCC_PLLI2SDIVQ_DIV_12 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 12 */ -#define LL_RCC_PLLI2SDIVQ_DIV_13 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 13 */ -#define LL_RCC_PLLI2SDIVQ_DIV_14 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 14 */ -#define LL_RCC_PLLI2SDIVQ_DIV_15 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 15 */ -#define LL_RCC_PLLI2SDIVQ_DIV_16 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 16 */ -#define LL_RCC_PLLI2SDIVQ_DIV_17 RCC_DCKCFGR_PLLI2SDIVQ_4 /*!< PLLI2S division factor for PLLI2SDIVQ output by 17 */ -#define LL_RCC_PLLI2SDIVQ_DIV_18 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 18 */ -#define LL_RCC_PLLI2SDIVQ_DIV_19 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 19 */ -#define LL_RCC_PLLI2SDIVQ_DIV_20 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 20 */ -#define LL_RCC_PLLI2SDIVQ_DIV_21 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 21 */ -#define LL_RCC_PLLI2SDIVQ_DIV_22 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 22 */ -#define LL_RCC_PLLI2SDIVQ_DIV_23 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 23 */ -#define LL_RCC_PLLI2SDIVQ_DIV_24 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 24 */ -#define LL_RCC_PLLI2SDIVQ_DIV_25 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3) /*!< PLLI2S division factor for PLLI2SDIVQ output by 25 */ -#define LL_RCC_PLLI2SDIVQ_DIV_26 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 26 */ -#define LL_RCC_PLLI2SDIVQ_DIV_27 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 27 */ -#define LL_RCC_PLLI2SDIVQ_DIV_28 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 28 */ -#define LL_RCC_PLLI2SDIVQ_DIV_29 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 29 */ -#define LL_RCC_PLLI2SDIVQ_DIV_30 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 30 */ -#define LL_RCC_PLLI2SDIVQ_DIV_31 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 31 */ -#define LL_RCC_PLLI2SDIVQ_DIV_32 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 32 */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ - -#if defined(RCC_DCKCFGR_PLLI2SDIVR) -/** @defgroup RCC_LL_EC_PLLI2SDIVR PLLI2SDIVR division factor (PLLI2SDIVR) - * @{ - */ -#define LL_RCC_PLLI2SDIVR_DIV_1 (RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 1 */ -#define LL_RCC_PLLI2SDIVR_DIV_2 (RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 2 */ -#define LL_RCC_PLLI2SDIVR_DIV_3 (RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 3 */ -#define LL_RCC_PLLI2SDIVR_DIV_4 (RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 4 */ -#define LL_RCC_PLLI2SDIVR_DIV_5 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 5 */ -#define LL_RCC_PLLI2SDIVR_DIV_6 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 6 */ -#define LL_RCC_PLLI2SDIVR_DIV_7 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 7 */ -#define LL_RCC_PLLI2SDIVR_DIV_8 (RCC_DCKCFGR_PLLI2SDIVR_3) /*!< PLLI2S division factor for PLLI2SDIVR output by 8 */ -#define LL_RCC_PLLI2SDIVR_DIV_9 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 9 */ -#define LL_RCC_PLLI2SDIVR_DIV_10 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 10 */ -#define LL_RCC_PLLI2SDIVR_DIV_11 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 11 */ -#define LL_RCC_PLLI2SDIVR_DIV_12 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 12 */ -#define LL_RCC_PLLI2SDIVR_DIV_13 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 13 */ -#define LL_RCC_PLLI2SDIVR_DIV_14 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 14 */ -#define LL_RCC_PLLI2SDIVR_DIV_15 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 15 */ -#define LL_RCC_PLLI2SDIVR_DIV_16 (RCC_DCKCFGR_PLLI2SDIVR_4) /*!< PLLI2S division factor for PLLI2SDIVR output by 16 */ -#define LL_RCC_PLLI2SDIVR_DIV_17 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 17 */ -#define LL_RCC_PLLI2SDIVR_DIV_18 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 18 */ -#define LL_RCC_PLLI2SDIVR_DIV_19 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 19 */ -#define LL_RCC_PLLI2SDIVR_DIV_20 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 20 */ -#define LL_RCC_PLLI2SDIVR_DIV_21 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 21 */ -#define LL_RCC_PLLI2SDIVR_DIV_22 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 22 */ -#define LL_RCC_PLLI2SDIVR_DIV_23 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 23 */ -#define LL_RCC_PLLI2SDIVR_DIV_24 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3) /*!< PLLI2S division factor for PLLI2SDIVR output by 24 */ -#define LL_RCC_PLLI2SDIVR_DIV_25 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 25 */ -#define LL_RCC_PLLI2SDIVR_DIV_26 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 26 */ -#define LL_RCC_PLLI2SDIVR_DIV_27 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 27 */ -#define LL_RCC_PLLI2SDIVR_DIV_28 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 28 */ -#define LL_RCC_PLLI2SDIVR_DIV_29 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 29 */ -#define LL_RCC_PLLI2SDIVR_DIV_30 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 30 */ -#define LL_RCC_PLLI2SDIVR_DIV_31 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 31 */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_PLLI2SDIVR */ - -/** @defgroup RCC_LL_EC_PLLI2SR PLLI2SR division factor (PLLI2SR) - * @{ - */ -#define LL_RCC_PLLI2SR_DIV_2 RCC_PLLI2SCFGR_PLLI2SR_1 /*!< PLLI2S division factor for PLLI2SR output by 2 */ -#define LL_RCC_PLLI2SR_DIV_3 (RCC_PLLI2SCFGR_PLLI2SR_1 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 3 */ -#define LL_RCC_PLLI2SR_DIV_4 RCC_PLLI2SCFGR_PLLI2SR_2 /*!< PLLI2S division factor for PLLI2SR output by 4 */ -#define LL_RCC_PLLI2SR_DIV_5 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 5 */ -#define LL_RCC_PLLI2SR_DIV_6 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_1) /*!< PLLI2S division factor for PLLI2SR output by 6 */ -#define LL_RCC_PLLI2SR_DIV_7 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_1 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 7 */ -/** - * @} - */ - -#if defined(RCC_PLLI2SCFGR_PLLI2SP) -/** @defgroup RCC_LL_EC_PLLI2SP PLLI2SP division factor (PLLI2SP) - * @{ - */ -#define LL_RCC_PLLI2SP_DIV_2 0x00000000U /*!< PLLI2S division factor for PLLI2SP output by 2 */ -#define LL_RCC_PLLI2SP_DIV_4 RCC_PLLI2SCFGR_PLLI2SP_0 /*!< PLLI2S division factor for PLLI2SP output by 4 */ -#define LL_RCC_PLLI2SP_DIV_6 RCC_PLLI2SCFGR_PLLI2SP_1 /*!< PLLI2S division factor for PLLI2SP output by 6 */ -#define LL_RCC_PLLI2SP_DIV_8 (RCC_PLLI2SCFGR_PLLI2SP_1 | RCC_PLLI2SCFGR_PLLI2SP_0) /*!< PLLI2S division factor for PLLI2SP output by 8 */ -/** - * @} - */ -#endif /* RCC_PLLI2SCFGR_PLLI2SP */ -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** @defgroup RCC_LL_EC_PLLSAIM PLLSAIM division factor (PLLSAIM or PLLM) - * @{ - */ -#if defined(RCC_PLLSAICFGR_PLLSAIM) -#define LL_RCC_PLLSAIM_DIV_2 (RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 2 */ -#define LL_RCC_PLLSAIM_DIV_3 (RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 3 */ -#define LL_RCC_PLLSAIM_DIV_4 (RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 4 */ -#define LL_RCC_PLLSAIM_DIV_5 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 5 */ -#define LL_RCC_PLLSAIM_DIV_6 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 6 */ -#define LL_RCC_PLLSAIM_DIV_7 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 7 */ -#define LL_RCC_PLLSAIM_DIV_8 (RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 8 */ -#define LL_RCC_PLLSAIM_DIV_9 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 9 */ -#define LL_RCC_PLLSAIM_DIV_10 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 10 */ -#define LL_RCC_PLLSAIM_DIV_11 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 11 */ -#define LL_RCC_PLLSAIM_DIV_12 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 12 */ -#define LL_RCC_PLLSAIM_DIV_13 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 13 */ -#define LL_RCC_PLLSAIM_DIV_14 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 14 */ -#define LL_RCC_PLLSAIM_DIV_15 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 15 */ -#define LL_RCC_PLLSAIM_DIV_16 (RCC_PLLSAICFGR_PLLSAIM_4) /*!< PLLSAI division factor for PLLSAIM output by 16 */ -#define LL_RCC_PLLSAIM_DIV_17 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 17 */ -#define LL_RCC_PLLSAIM_DIV_18 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 18 */ -#define LL_RCC_PLLSAIM_DIV_19 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 19 */ -#define LL_RCC_PLLSAIM_DIV_20 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 20 */ -#define LL_RCC_PLLSAIM_DIV_21 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 21 */ -#define LL_RCC_PLLSAIM_DIV_22 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 22 */ -#define LL_RCC_PLLSAIM_DIV_23 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 23 */ -#define LL_RCC_PLLSAIM_DIV_24 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 24 */ -#define LL_RCC_PLLSAIM_DIV_25 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 25 */ -#define LL_RCC_PLLSAIM_DIV_26 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 26 */ -#define LL_RCC_PLLSAIM_DIV_27 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 27 */ -#define LL_RCC_PLLSAIM_DIV_28 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 28 */ -#define LL_RCC_PLLSAIM_DIV_29 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 29 */ -#define LL_RCC_PLLSAIM_DIV_30 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 30 */ -#define LL_RCC_PLLSAIM_DIV_31 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 31 */ -#define LL_RCC_PLLSAIM_DIV_32 (RCC_PLLSAICFGR_PLLSAIM_5) /*!< PLLSAI division factor for PLLSAIM output by 32 */ -#define LL_RCC_PLLSAIM_DIV_33 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 33 */ -#define LL_RCC_PLLSAIM_DIV_34 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 34 */ -#define LL_RCC_PLLSAIM_DIV_35 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 35 */ -#define LL_RCC_PLLSAIM_DIV_36 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 36 */ -#define LL_RCC_PLLSAIM_DIV_37 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 37 */ -#define LL_RCC_PLLSAIM_DIV_38 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 38 */ -#define LL_RCC_PLLSAIM_DIV_39 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 39 */ -#define LL_RCC_PLLSAIM_DIV_40 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 40 */ -#define LL_RCC_PLLSAIM_DIV_41 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 41 */ -#define LL_RCC_PLLSAIM_DIV_42 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 42 */ -#define LL_RCC_PLLSAIM_DIV_43 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 43 */ -#define LL_RCC_PLLSAIM_DIV_44 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 44 */ -#define LL_RCC_PLLSAIM_DIV_45 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 45 */ -#define LL_RCC_PLLSAIM_DIV_46 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 46 */ -#define LL_RCC_PLLSAIM_DIV_47 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 47 */ -#define LL_RCC_PLLSAIM_DIV_48 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4) /*!< PLLSAI division factor for PLLSAIM output by 48 */ -#define LL_RCC_PLLSAIM_DIV_49 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 49 */ -#define LL_RCC_PLLSAIM_DIV_50 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 50 */ -#define LL_RCC_PLLSAIM_DIV_51 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 51 */ -#define LL_RCC_PLLSAIM_DIV_52 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 52 */ -#define LL_RCC_PLLSAIM_DIV_53 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 53 */ -#define LL_RCC_PLLSAIM_DIV_54 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 54 */ -#define LL_RCC_PLLSAIM_DIV_55 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 55 */ -#define LL_RCC_PLLSAIM_DIV_56 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 56 */ -#define LL_RCC_PLLSAIM_DIV_57 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 57 */ -#define LL_RCC_PLLSAIM_DIV_58 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 58 */ -#define LL_RCC_PLLSAIM_DIV_59 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 59 */ -#define LL_RCC_PLLSAIM_DIV_60 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 60 */ -#define LL_RCC_PLLSAIM_DIV_61 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 61 */ -#define LL_RCC_PLLSAIM_DIV_62 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 62 */ -#define LL_RCC_PLLSAIM_DIV_63 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 63 */ -#else -#define LL_RCC_PLLSAIM_DIV_2 LL_RCC_PLLM_DIV_2 /*!< PLLSAI division factor for PLLSAIM output by 2 */ -#define LL_RCC_PLLSAIM_DIV_3 LL_RCC_PLLM_DIV_3 /*!< PLLSAI division factor for PLLSAIM output by 3 */ -#define LL_RCC_PLLSAIM_DIV_4 LL_RCC_PLLM_DIV_4 /*!< PLLSAI division factor for PLLSAIM output by 4 */ -#define LL_RCC_PLLSAIM_DIV_5 LL_RCC_PLLM_DIV_5 /*!< PLLSAI division factor for PLLSAIM output by 5 */ -#define LL_RCC_PLLSAIM_DIV_6 LL_RCC_PLLM_DIV_6 /*!< PLLSAI division factor for PLLSAIM output by 6 */ -#define LL_RCC_PLLSAIM_DIV_7 LL_RCC_PLLM_DIV_7 /*!< PLLSAI division factor for PLLSAIM output by 7 */ -#define LL_RCC_PLLSAIM_DIV_8 LL_RCC_PLLM_DIV_8 /*!< PLLSAI division factor for PLLSAIM output by 8 */ -#define LL_RCC_PLLSAIM_DIV_9 LL_RCC_PLLM_DIV_9 /*!< PLLSAI division factor for PLLSAIM output by 9 */ -#define LL_RCC_PLLSAIM_DIV_10 LL_RCC_PLLM_DIV_10 /*!< PLLSAI division factor for PLLSAIM output by 10 */ -#define LL_RCC_PLLSAIM_DIV_11 LL_RCC_PLLM_DIV_11 /*!< PLLSAI division factor for PLLSAIM output by 11 */ -#define LL_RCC_PLLSAIM_DIV_12 LL_RCC_PLLM_DIV_12 /*!< PLLSAI division factor for PLLSAIM output by 12 */ -#define LL_RCC_PLLSAIM_DIV_13 LL_RCC_PLLM_DIV_13 /*!< PLLSAI division factor for PLLSAIM output by 13 */ -#define LL_RCC_PLLSAIM_DIV_14 LL_RCC_PLLM_DIV_14 /*!< PLLSAI division factor for PLLSAIM output by 14 */ -#define LL_RCC_PLLSAIM_DIV_15 LL_RCC_PLLM_DIV_15 /*!< PLLSAI division factor for PLLSAIM output by 15 */ -#define LL_RCC_PLLSAIM_DIV_16 LL_RCC_PLLM_DIV_16 /*!< PLLSAI division factor for PLLSAIM output by 16 */ -#define LL_RCC_PLLSAIM_DIV_17 LL_RCC_PLLM_DIV_17 /*!< PLLSAI division factor for PLLSAIM output by 17 */ -#define LL_RCC_PLLSAIM_DIV_18 LL_RCC_PLLM_DIV_18 /*!< PLLSAI division factor for PLLSAIM output by 18 */ -#define LL_RCC_PLLSAIM_DIV_19 LL_RCC_PLLM_DIV_19 /*!< PLLSAI division factor for PLLSAIM output by 19 */ -#define LL_RCC_PLLSAIM_DIV_20 LL_RCC_PLLM_DIV_20 /*!< PLLSAI division factor for PLLSAIM output by 20 */ -#define LL_RCC_PLLSAIM_DIV_21 LL_RCC_PLLM_DIV_21 /*!< PLLSAI division factor for PLLSAIM output by 21 */ -#define LL_RCC_PLLSAIM_DIV_22 LL_RCC_PLLM_DIV_22 /*!< PLLSAI division factor for PLLSAIM output by 22 */ -#define LL_RCC_PLLSAIM_DIV_23 LL_RCC_PLLM_DIV_23 /*!< PLLSAI division factor for PLLSAIM output by 23 */ -#define LL_RCC_PLLSAIM_DIV_24 LL_RCC_PLLM_DIV_24 /*!< PLLSAI division factor for PLLSAIM output by 24 */ -#define LL_RCC_PLLSAIM_DIV_25 LL_RCC_PLLM_DIV_25 /*!< PLLSAI division factor for PLLSAIM output by 25 */ -#define LL_RCC_PLLSAIM_DIV_26 LL_RCC_PLLM_DIV_26 /*!< PLLSAI division factor for PLLSAIM output by 26 */ -#define LL_RCC_PLLSAIM_DIV_27 LL_RCC_PLLM_DIV_27 /*!< PLLSAI division factor for PLLSAIM output by 27 */ -#define LL_RCC_PLLSAIM_DIV_28 LL_RCC_PLLM_DIV_28 /*!< PLLSAI division factor for PLLSAIM output by 28 */ -#define LL_RCC_PLLSAIM_DIV_29 LL_RCC_PLLM_DIV_29 /*!< PLLSAI division factor for PLLSAIM output by 29 */ -#define LL_RCC_PLLSAIM_DIV_30 LL_RCC_PLLM_DIV_30 /*!< PLLSAI division factor for PLLSAIM output by 30 */ -#define LL_RCC_PLLSAIM_DIV_31 LL_RCC_PLLM_DIV_31 /*!< PLLSAI division factor for PLLSAIM output by 31 */ -#define LL_RCC_PLLSAIM_DIV_32 LL_RCC_PLLM_DIV_32 /*!< PLLSAI division factor for PLLSAIM output by 32 */ -#define LL_RCC_PLLSAIM_DIV_33 LL_RCC_PLLM_DIV_33 /*!< PLLSAI division factor for PLLSAIM output by 33 */ -#define LL_RCC_PLLSAIM_DIV_34 LL_RCC_PLLM_DIV_34 /*!< PLLSAI division factor for PLLSAIM output by 34 */ -#define LL_RCC_PLLSAIM_DIV_35 LL_RCC_PLLM_DIV_35 /*!< PLLSAI division factor for PLLSAIM output by 35 */ -#define LL_RCC_PLLSAIM_DIV_36 LL_RCC_PLLM_DIV_36 /*!< PLLSAI division factor for PLLSAIM output by 36 */ -#define LL_RCC_PLLSAIM_DIV_37 LL_RCC_PLLM_DIV_37 /*!< PLLSAI division factor for PLLSAIM output by 37 */ -#define LL_RCC_PLLSAIM_DIV_38 LL_RCC_PLLM_DIV_38 /*!< PLLSAI division factor for PLLSAIM output by 38 */ -#define LL_RCC_PLLSAIM_DIV_39 LL_RCC_PLLM_DIV_39 /*!< PLLSAI division factor for PLLSAIM output by 39 */ -#define LL_RCC_PLLSAIM_DIV_40 LL_RCC_PLLM_DIV_40 /*!< PLLSAI division factor for PLLSAIM output by 40 */ -#define LL_RCC_PLLSAIM_DIV_41 LL_RCC_PLLM_DIV_41 /*!< PLLSAI division factor for PLLSAIM output by 41 */ -#define LL_RCC_PLLSAIM_DIV_42 LL_RCC_PLLM_DIV_42 /*!< PLLSAI division factor for PLLSAIM output by 42 */ -#define LL_RCC_PLLSAIM_DIV_43 LL_RCC_PLLM_DIV_43 /*!< PLLSAI division factor for PLLSAIM output by 43 */ -#define LL_RCC_PLLSAIM_DIV_44 LL_RCC_PLLM_DIV_44 /*!< PLLSAI division factor for PLLSAIM output by 44 */ -#define LL_RCC_PLLSAIM_DIV_45 LL_RCC_PLLM_DIV_45 /*!< PLLSAI division factor for PLLSAIM output by 45 */ -#define LL_RCC_PLLSAIM_DIV_46 LL_RCC_PLLM_DIV_46 /*!< PLLSAI division factor for PLLSAIM output by 46 */ -#define LL_RCC_PLLSAIM_DIV_47 LL_RCC_PLLM_DIV_47 /*!< PLLSAI division factor for PLLSAIM output by 47 */ -#define LL_RCC_PLLSAIM_DIV_48 LL_RCC_PLLM_DIV_48 /*!< PLLSAI division factor for PLLSAIM output by 48 */ -#define LL_RCC_PLLSAIM_DIV_49 LL_RCC_PLLM_DIV_49 /*!< PLLSAI division factor for PLLSAIM output by 49 */ -#define LL_RCC_PLLSAIM_DIV_50 LL_RCC_PLLM_DIV_50 /*!< PLLSAI division factor for PLLSAIM output by 50 */ -#define LL_RCC_PLLSAIM_DIV_51 LL_RCC_PLLM_DIV_51 /*!< PLLSAI division factor for PLLSAIM output by 51 */ -#define LL_RCC_PLLSAIM_DIV_52 LL_RCC_PLLM_DIV_52 /*!< PLLSAI division factor for PLLSAIM output by 52 */ -#define LL_RCC_PLLSAIM_DIV_53 LL_RCC_PLLM_DIV_53 /*!< PLLSAI division factor for PLLSAIM output by 53 */ -#define LL_RCC_PLLSAIM_DIV_54 LL_RCC_PLLM_DIV_54 /*!< PLLSAI division factor for PLLSAIM output by 54 */ -#define LL_RCC_PLLSAIM_DIV_55 LL_RCC_PLLM_DIV_55 /*!< PLLSAI division factor for PLLSAIM output by 55 */ -#define LL_RCC_PLLSAIM_DIV_56 LL_RCC_PLLM_DIV_56 /*!< PLLSAI division factor for PLLSAIM output by 56 */ -#define LL_RCC_PLLSAIM_DIV_57 LL_RCC_PLLM_DIV_57 /*!< PLLSAI division factor for PLLSAIM output by 57 */ -#define LL_RCC_PLLSAIM_DIV_58 LL_RCC_PLLM_DIV_58 /*!< PLLSAI division factor for PLLSAIM output by 58 */ -#define LL_RCC_PLLSAIM_DIV_59 LL_RCC_PLLM_DIV_59 /*!< PLLSAI division factor for PLLSAIM output by 59 */ -#define LL_RCC_PLLSAIM_DIV_60 LL_RCC_PLLM_DIV_60 /*!< PLLSAI division factor for PLLSAIM output by 60 */ -#define LL_RCC_PLLSAIM_DIV_61 LL_RCC_PLLM_DIV_61 /*!< PLLSAI division factor for PLLSAIM output by 61 */ -#define LL_RCC_PLLSAIM_DIV_62 LL_RCC_PLLM_DIV_62 /*!< PLLSAI division factor for PLLSAIM output by 62 */ -#define LL_RCC_PLLSAIM_DIV_63 LL_RCC_PLLM_DIV_63 /*!< PLLSAI division factor for PLLSAIM output by 63 */ -#endif /* RCC_PLLSAICFGR_PLLSAIM */ -/** - * @} - */ - -/** @defgroup RCC_LL_EC_PLLSAIQ PLLSAIQ division factor (PLLSAIQ) - * @{ - */ -#define LL_RCC_PLLSAIQ_DIV_2 RCC_PLLSAICFGR_PLLSAIQ_1 /*!< PLLSAI division factor for PLLSAIQ output by 2 */ -#define LL_RCC_PLLSAIQ_DIV_3 (RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 3 */ -#define LL_RCC_PLLSAIQ_DIV_4 RCC_PLLSAICFGR_PLLSAIQ_2 /*!< PLLSAI division factor for PLLSAIQ output by 4 */ -#define LL_RCC_PLLSAIQ_DIV_5 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 5 */ -#define LL_RCC_PLLSAIQ_DIV_6 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 6 */ -#define LL_RCC_PLLSAIQ_DIV_7 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 7 */ -#define LL_RCC_PLLSAIQ_DIV_8 RCC_PLLSAICFGR_PLLSAIQ_3 /*!< PLLSAI division factor for PLLSAIQ output by 8 */ -#define LL_RCC_PLLSAIQ_DIV_9 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 9 */ -#define LL_RCC_PLLSAIQ_DIV_10 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 10 */ -#define LL_RCC_PLLSAIQ_DIV_11 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 11 */ -#define LL_RCC_PLLSAIQ_DIV_12 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2) /*!< PLLSAI division factor for PLLSAIQ output by 12 */ -#define LL_RCC_PLLSAIQ_DIV_13 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 13 */ -#define LL_RCC_PLLSAIQ_DIV_14 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 14 */ -#define LL_RCC_PLLSAIQ_DIV_15 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 15 */ -/** - * @} - */ - -#if defined(RCC_DCKCFGR_PLLSAIDIVQ) -/** @defgroup RCC_LL_EC_PLLSAIDIVQ PLLSAIDIVQ division factor (PLLSAIDIVQ) - * @{ - */ -#define LL_RCC_PLLSAIDIVQ_DIV_1 0x00000000U /*!< PLLSAI division factor for PLLSAIDIVQ output by 1 */ -#define LL_RCC_PLLSAIDIVQ_DIV_2 RCC_DCKCFGR_PLLSAIDIVQ_0 /*!< PLLSAI division factor for PLLSAIDIVQ output by 2 */ -#define LL_RCC_PLLSAIDIVQ_DIV_3 RCC_DCKCFGR_PLLSAIDIVQ_1 /*!< PLLSAI division factor for PLLSAIDIVQ output by 3 */ -#define LL_RCC_PLLSAIDIVQ_DIV_4 (RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 4 */ -#define LL_RCC_PLLSAIDIVQ_DIV_5 RCC_DCKCFGR_PLLSAIDIVQ_2 /*!< PLLSAI division factor for PLLSAIDIVQ output by 5 */ -#define LL_RCC_PLLSAIDIVQ_DIV_6 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 6 */ -#define LL_RCC_PLLSAIDIVQ_DIV_7 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 7 */ -#define LL_RCC_PLLSAIDIVQ_DIV_8 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 8 */ -#define LL_RCC_PLLSAIDIVQ_DIV_9 RCC_DCKCFGR_PLLSAIDIVQ_3 /*!< PLLSAI division factor for PLLSAIDIVQ output by 9 */ -#define LL_RCC_PLLSAIDIVQ_DIV_10 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 10 */ -#define LL_RCC_PLLSAIDIVQ_DIV_11 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 11 */ -#define LL_RCC_PLLSAIDIVQ_DIV_12 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 12 */ -#define LL_RCC_PLLSAIDIVQ_DIV_13 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 13 */ -#define LL_RCC_PLLSAIDIVQ_DIV_14 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 14 */ -#define LL_RCC_PLLSAIDIVQ_DIV_15 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 15 */ -#define LL_RCC_PLLSAIDIVQ_DIV_16 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 16 */ -#define LL_RCC_PLLSAIDIVQ_DIV_17 RCC_DCKCFGR_PLLSAIDIVQ_4 /*!< PLLSAI division factor for PLLSAIDIVQ output by 17 */ -#define LL_RCC_PLLSAIDIVQ_DIV_18 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 18 */ -#define LL_RCC_PLLSAIDIVQ_DIV_19 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 19 */ -#define LL_RCC_PLLSAIDIVQ_DIV_20 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 20 */ -#define LL_RCC_PLLSAIDIVQ_DIV_21 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 21 */ -#define LL_RCC_PLLSAIDIVQ_DIV_22 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 22 */ -#define LL_RCC_PLLSAIDIVQ_DIV_23 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 23 */ -#define LL_RCC_PLLSAIDIVQ_DIV_24 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 24 */ -#define LL_RCC_PLLSAIDIVQ_DIV_25 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3) /*!< PLLSAI division factor for PLLSAIDIVQ output by 25 */ -#define LL_RCC_PLLSAIDIVQ_DIV_26 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 26 */ -#define LL_RCC_PLLSAIDIVQ_DIV_27 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 27 */ -#define LL_RCC_PLLSAIDIVQ_DIV_28 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 28 */ -#define LL_RCC_PLLSAIDIVQ_DIV_29 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 29 */ -#define LL_RCC_PLLSAIDIVQ_DIV_30 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 30 */ -#define LL_RCC_PLLSAIDIVQ_DIV_31 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 31 */ -#define LL_RCC_PLLSAIDIVQ_DIV_32 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 32 */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_PLLSAIDIVQ */ - -#if defined(RCC_PLLSAICFGR_PLLSAIR) -/** @defgroup RCC_LL_EC_PLLSAIR PLLSAIR division factor (PLLSAIR) - * @{ - */ -#define LL_RCC_PLLSAIR_DIV_2 RCC_PLLSAICFGR_PLLSAIR_1 /*!< PLLSAI division factor for PLLSAIR output by 2 */ -#define LL_RCC_PLLSAIR_DIV_3 (RCC_PLLSAICFGR_PLLSAIR_1 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 3 */ -#define LL_RCC_PLLSAIR_DIV_4 RCC_PLLSAICFGR_PLLSAIR_2 /*!< PLLSAI division factor for PLLSAIR output by 4 */ -#define LL_RCC_PLLSAIR_DIV_5 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 5 */ -#define LL_RCC_PLLSAIR_DIV_6 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_1) /*!< PLLSAI division factor for PLLSAIR output by 6 */ -#define LL_RCC_PLLSAIR_DIV_7 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_1 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 7 */ -/** - * @} - */ -#endif /* RCC_PLLSAICFGR_PLLSAIR */ - -#if defined(RCC_DCKCFGR_PLLSAIDIVR) -/** @defgroup RCC_LL_EC_PLLSAIDIVR PLLSAIDIVR division factor (PLLSAIDIVR) - * @{ - */ -#define LL_RCC_PLLSAIDIVR_DIV_2 0x00000000U /*!< PLLSAI division factor for PLLSAIDIVR output by 2 */ -#define LL_RCC_PLLSAIDIVR_DIV_4 RCC_DCKCFGR_PLLSAIDIVR_0 /*!< PLLSAI division factor for PLLSAIDIVR output by 4 */ -#define LL_RCC_PLLSAIDIVR_DIV_8 RCC_DCKCFGR_PLLSAIDIVR_1 /*!< PLLSAI division factor for PLLSAIDIVR output by 8 */ -#define LL_RCC_PLLSAIDIVR_DIV_16 (RCC_DCKCFGR_PLLSAIDIVR_1 | RCC_DCKCFGR_PLLSAIDIVR_0) /*!< PLLSAI division factor for PLLSAIDIVR output by 16 */ -/** - * @} - */ -#endif /* RCC_DCKCFGR_PLLSAIDIVR */ - -#if defined(RCC_PLLSAICFGR_PLLSAIP) -/** @defgroup RCC_LL_EC_PLLSAIP PLLSAIP division factor (PLLSAIP) - * @{ - */ -#define LL_RCC_PLLSAIP_DIV_2 0x00000000U /*!< PLLSAI division factor for PLLSAIP output by 2 */ -#define LL_RCC_PLLSAIP_DIV_4 RCC_PLLSAICFGR_PLLSAIP_0 /*!< PLLSAI division factor for PLLSAIP output by 4 */ -#define LL_RCC_PLLSAIP_DIV_6 RCC_PLLSAICFGR_PLLSAIP_1 /*!< PLLSAI division factor for PLLSAIP output by 6 */ -#define LL_RCC_PLLSAIP_DIV_8 (RCC_PLLSAICFGR_PLLSAIP_1 | RCC_PLLSAICFGR_PLLSAIP_0) /*!< PLLSAI division factor for PLLSAIP output by 8 */ -/** - * @} - */ -#endif /* RCC_PLLSAICFGR_PLLSAIP */ -#endif /* RCC_PLLSAI_SUPPORT */ -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup RCC_LL_Exported_Macros RCC Exported Macros - * @{ - */ - -/** @defgroup RCC_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in RCC register - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_RCC_WriteReg(__REG__, __VALUE__) WRITE_REG(RCC->__REG__, (__VALUE__)) - -/** - * @brief Read a value in RCC register - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_RCC_ReadReg(__REG__) READ_REG(RCC->__REG__) -/** - * @} - */ - -/** @defgroup RCC_LL_EM_CALC_FREQ Calculate frequencies - * @{ - */ - -/** - * @brief Helper macro to calculate the PLLCLK frequency on system domain - * @note ex: @ref __LL_RCC_CALC_PLLCLK_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetP ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLP__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLP_DIV_2 - * @arg @ref LL_RCC_PLLP_DIV_4 - * @arg @ref LL_RCC_PLLP_DIV_6 - * @arg @ref LL_RCC_PLLP_DIV_8 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLCLK_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLP__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((((__PLLP__) >> RCC_PLLCFGR_PLLP_Pos ) + 1U) * 2U)) - -#if defined(RCC_PLLR_SYSCLK_SUPPORT) -/** - * @brief Helper macro to calculate the PLLRCLK frequency on system domain - * @note ex: @ref __LL_RCC_CALC_PLLRCLK_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50 and 432 - * @param __PLLR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLRCLK_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) - -#endif /* RCC_PLLR_SYSCLK_SUPPORT */ - -/** - * @brief Helper macro to calculate the PLLCLK frequency used on 48M domain - * @note ex: @ref __LL_RCC_CALC_PLLCLK_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetQ ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLQ__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLQ_DIV_2 - * @arg @ref LL_RCC_PLLQ_DIV_3 - * @arg @ref LL_RCC_PLLQ_DIV_4 - * @arg @ref LL_RCC_PLLQ_DIV_5 - * @arg @ref LL_RCC_PLLQ_DIV_6 - * @arg @ref LL_RCC_PLLQ_DIV_7 - * @arg @ref LL_RCC_PLLQ_DIV_8 - * @arg @ref LL_RCC_PLLQ_DIV_9 - * @arg @ref LL_RCC_PLLQ_DIV_10 - * @arg @ref LL_RCC_PLLQ_DIV_11 - * @arg @ref LL_RCC_PLLQ_DIV_12 - * @arg @ref LL_RCC_PLLQ_DIV_13 - * @arg @ref LL_RCC_PLLQ_DIV_14 - * @arg @ref LL_RCC_PLLQ_DIV_15 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLCLK_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLQ__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLQ__) >> RCC_PLLCFGR_PLLQ_Pos )) - -#if defined(DSI) -/** - * @brief Helper macro to calculate the PLLCLK frequency used on DSI - * @note ex: @ref __LL_RCC_CALC_PLLCLK_DSI_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50 and 432 - * @param __PLLR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLCLK_DSI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) -#endif /* DSI */ - -#if defined(RCC_PLLR_I2S_CLKSOURCE_SUPPORT) -/** - * @brief Helper macro to calculate the PLLCLK frequency used on I2S - * @note ex: @ref __LL_RCC_CALC_PLLCLK_I2S_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50 and 432 - * @param __PLLR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLCLK_I2S_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) -#endif /* RCC_PLLR_I2S_CLKSOURCE_SUPPORT */ - -#if defined(SPDIFRX) -/** - * @brief Helper macro to calculate the PLLCLK frequency used on SPDIFRX - * @note ex: @ref __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50 and 432 - * @param __PLLR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval PLL clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) -#endif /* SPDIFRX */ - -#if defined(RCC_PLLCFGR_PLLR) -#if defined(SAI1) -/** - * @brief Helper macro to calculate the PLLCLK frequency used on SAI - * @note ex: @ref __LL_RCC_CALC_PLLCLK_SAI_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), - * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR (), @ref LL_RCC_PLL_GetDIVR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param __PLLN__ Between 50 and 432 - * @param __PLLR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @param __PLLDIVR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLDIVR_DIV_1 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_2 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_3 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_4 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_5 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_6 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_7 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_8 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_9 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_10 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_11 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_12 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_13 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_14 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_15 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_16 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_17 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_18 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_19 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_20 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_21 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_22 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_23 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_24 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_25 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_26 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_27 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_28 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_29 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_30 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_31 (*) - * - * (*) value not defined in all devices. - * @retval PLL clock frequency (in Hz) - */ -#if defined(RCC_DCKCFGR_PLLDIVR) -#define __LL_RCC_CALC_PLLCLK_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__, __PLLDIVR__) (((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) / ((__PLLDIVR__) >> RCC_DCKCFGR_PLLDIVR_Pos )) -#else -#define __LL_RCC_CALC_PLLCLK_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ - ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) -#endif /* RCC_DCKCFGR_PLLDIVR */ -#endif /* SAI1 */ -#endif /* RCC_PLLCFGR_PLLR */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Helper macro to calculate the PLLSAI frequency used for SAI domain - * @note ex: @ref __LL_RCC_CALC_PLLSAI_SAI_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), - * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetQ (), @ref LL_RCC_PLLSAI_GetDIVQ ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param __PLLSAIN__ Between 49/50(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLSAIQ__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIQ_DIV_15 - * @param __PLLSAIDIVQ__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 - * @retval PLLSAI clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLSAI_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIQ__, __PLLSAIDIVQ__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ - (((__PLLSAIQ__) >> RCC_PLLSAICFGR_PLLSAIQ_Pos) * (((__PLLSAIDIVQ__) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos) + 1U))) - -#if defined(RCC_PLLSAICFGR_PLLSAIP) -/** - * @brief Helper macro to calculate the PLLSAI frequency used on 48Mhz domain - * @note ex: @ref __LL_RCC_CALC_PLLSAI_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), - * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetP ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param __PLLSAIN__ Between 50 and 432 - * @param __PLLSAIP__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIP_DIV_2 - * @arg @ref LL_RCC_PLLSAIP_DIV_4 - * @arg @ref LL_RCC_PLLSAIP_DIV_6 - * @arg @ref LL_RCC_PLLSAIP_DIV_8 - * @retval PLLSAI clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLSAI_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIP__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ - ((((__PLLSAIP__) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) * 2U)) -#endif /* RCC_PLLSAICFGR_PLLSAIP */ - -#if defined(LTDC) -/** - * @brief Helper macro to calculate the PLLSAI frequency used for LTDC domain - * @note ex: @ref __LL_RCC_CALC_PLLSAI_LTDC_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), - * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetR (), @ref LL_RCC_PLLSAI_GetDIVR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param __PLLSAIN__ Between 49/50(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLSAIR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIR_DIV_2 - * @arg @ref LL_RCC_PLLSAIR_DIV_3 - * @arg @ref LL_RCC_PLLSAIR_DIV_4 - * @arg @ref LL_RCC_PLLSAIR_DIV_5 - * @arg @ref LL_RCC_PLLSAIR_DIV_6 - * @arg @ref LL_RCC_PLLSAIR_DIV_7 - * @param __PLLSAIDIVR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 - * @retval PLLSAI clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLSAI_LTDC_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIR__, __PLLSAIDIVR__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ - (((__PLLSAIR__) >> RCC_PLLSAICFGR_PLLSAIR_Pos) * (aRCC_PLLSAIDIVRPrescTable[(__PLLSAIDIVR__) >> RCC_DCKCFGR_PLLSAIDIVR_Pos]))) -#endif /* LTDC */ -#endif /* RCC_PLLSAI_SUPPORT */ - -#if defined(RCC_PLLI2S_SUPPORT) -#if defined(RCC_DCKCFGR_PLLI2SDIVQ) || defined(RCC_DCKCFGR_PLLI2SDIVR) -/** - * @brief Helper macro to calculate the PLLI2S frequency used for SAI domain - * @note ex: @ref __LL_RCC_CALC_PLLI2S_SAI_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), - * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetQ (), @ref LL_RCC_PLLI2S_GetDIVQ ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param __PLLI2SN__ Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLI2SQ_R__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SQ_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_7 (*) - * - * (*) value not defined in all devices. - * @param __PLLI2SDIVQ_R__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 (*) - * - * (*) value not defined in all devices. - * @retval PLLI2S clock frequency (in Hz) - */ -#if defined(RCC_DCKCFGR_PLLI2SDIVQ) -#define __LL_RCC_CALC_PLLI2S_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ_R__, __PLLI2SDIVQ_R__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ - (((__PLLI2SQ_R__) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos) * (((__PLLI2SDIVQ_R__) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos) + 1U))) -#else -#define __LL_RCC_CALC_PLLI2S_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ_R__, __PLLI2SDIVQ_R__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ - (((__PLLI2SQ_R__) >> RCC_PLLI2SCFGR_PLLI2SR_Pos) * ((__PLLI2SDIVQ_R__) >> RCC_DCKCFGR_PLLI2SDIVR_Pos))) - -#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ -#endif /* RCC_DCKCFGR_PLLI2SDIVQ || RCC_DCKCFGR_PLLI2SDIVR */ - -#if defined(SPDIFRX) -/** - * @brief Helper macro to calculate the PLLI2S frequency used on SPDIFRX domain - * @note ex: @ref __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), - * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetP ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param __PLLI2SN__ Between 50 and 432 - * @param __PLLI2SP__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SP_DIV_2 - * @arg @ref LL_RCC_PLLI2SP_DIV_4 - * @arg @ref LL_RCC_PLLI2SP_DIV_6 - * @arg @ref LL_RCC_PLLI2SP_DIV_8 - * @retval PLLI2S clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SP__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ - ((((__PLLI2SP__) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) * 2U)) - -#endif /* SPDIFRX */ - -/** - * @brief Helper macro to calculate the PLLI2S frequency used for I2S domain - * @note ex: @ref __LL_RCC_CALC_PLLI2S_I2S_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), - * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetR ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param __PLLI2SN__ Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param __PLLI2SR__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SR_DIV_2 - * @arg @ref LL_RCC_PLLI2SR_DIV_3 - * @arg @ref LL_RCC_PLLI2SR_DIV_4 - * @arg @ref LL_RCC_PLLI2SR_DIV_5 - * @arg @ref LL_RCC_PLLI2SR_DIV_6 - * @arg @ref LL_RCC_PLLI2SR_DIV_7 - * @retval PLLI2S clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLI2S_I2S_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SR__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ - ((__PLLI2SR__) >> RCC_PLLI2SCFGR_PLLI2SR_Pos)) - -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) -/** - * @brief Helper macro to calculate the PLLI2S frequency used for 48Mhz domain - * @note ex: @ref __LL_RCC_CALC_PLLI2S_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), - * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetQ ()); - * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) - * @param __PLLM__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param __PLLI2SN__ Between 50 and 432 - * @param __PLLI2SQ__ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SQ_DIV_2 - * @arg @ref LL_RCC_PLLI2SQ_DIV_3 - * @arg @ref LL_RCC_PLLI2SQ_DIV_4 - * @arg @ref LL_RCC_PLLI2SQ_DIV_5 - * @arg @ref LL_RCC_PLLI2SQ_DIV_6 - * @arg @ref LL_RCC_PLLI2SQ_DIV_7 - * @arg @ref LL_RCC_PLLI2SQ_DIV_8 - * @arg @ref LL_RCC_PLLI2SQ_DIV_9 - * @arg @ref LL_RCC_PLLI2SQ_DIV_10 - * @arg @ref LL_RCC_PLLI2SQ_DIV_11 - * @arg @ref LL_RCC_PLLI2SQ_DIV_12 - * @arg @ref LL_RCC_PLLI2SQ_DIV_13 - * @arg @ref LL_RCC_PLLI2SQ_DIV_14 - * @arg @ref LL_RCC_PLLI2SQ_DIV_15 - * @retval PLLI2S clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PLLI2S_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ - ((__PLLI2SQ__) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos)) - -#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ -#endif /* RCC_PLLI2S_SUPPORT */ - -/** - * @brief Helper macro to calculate the HCLK frequency - * @param __SYSCLKFREQ__ SYSCLK frequency (based on HSE/HSI/PLLCLK) - * @param __AHBPRESCALER__ This parameter can be one of the following values: - * @arg @ref LL_RCC_SYSCLK_DIV_1 - * @arg @ref LL_RCC_SYSCLK_DIV_2 - * @arg @ref LL_RCC_SYSCLK_DIV_4 - * @arg @ref LL_RCC_SYSCLK_DIV_8 - * @arg @ref LL_RCC_SYSCLK_DIV_16 - * @arg @ref LL_RCC_SYSCLK_DIV_64 - * @arg @ref LL_RCC_SYSCLK_DIV_128 - * @arg @ref LL_RCC_SYSCLK_DIV_256 - * @arg @ref LL_RCC_SYSCLK_DIV_512 - * @retval HCLK clock frequency (in Hz) - */ -#define __LL_RCC_CALC_HCLK_FREQ(__SYSCLKFREQ__, __AHBPRESCALER__) ((__SYSCLKFREQ__) >> AHBPrescTable[((__AHBPRESCALER__) &\ - RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]) - -/** - * @brief Helper macro to calculate the PCLK1 frequency (ABP1) - * @param __HCLKFREQ__ HCLK frequency - * @param __APB1PRESCALER__ This parameter can be one of the following values: - * @arg @ref LL_RCC_APB1_DIV_1 - * @arg @ref LL_RCC_APB1_DIV_2 - * @arg @ref LL_RCC_APB1_DIV_4 - * @arg @ref LL_RCC_APB1_DIV_8 - * @arg @ref LL_RCC_APB1_DIV_16 - * @retval PCLK1 clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PCLK1_FREQ(__HCLKFREQ__, __APB1PRESCALER__) ((__HCLKFREQ__) >> APBPrescTable[(__APB1PRESCALER__) >> RCC_CFGR_PPRE1_Pos]) - -/** - * @brief Helper macro to calculate the PCLK2 frequency (ABP2) - * @param __HCLKFREQ__ HCLK frequency - * @param __APB2PRESCALER__ This parameter can be one of the following values: - * @arg @ref LL_RCC_APB2_DIV_1 - * @arg @ref LL_RCC_APB2_DIV_2 - * @arg @ref LL_RCC_APB2_DIV_4 - * @arg @ref LL_RCC_APB2_DIV_8 - * @arg @ref LL_RCC_APB2_DIV_16 - * @retval PCLK2 clock frequency (in Hz) - */ -#define __LL_RCC_CALC_PCLK2_FREQ(__HCLKFREQ__, __APB2PRESCALER__) ((__HCLKFREQ__) >> APBPrescTable[(__APB2PRESCALER__) >> RCC_CFGR_PPRE2_Pos]) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup RCC_LL_Exported_Functions RCC Exported Functions - * @{ - */ - -/** @defgroup RCC_LL_EF_HSE HSE - * @{ - */ - -/** - * @brief Enable the Clock Security System. - * @rmtoll CR CSSON LL_RCC_HSE_EnableCSS - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSE_EnableCSS(void) -{ - SET_BIT(RCC->CR, RCC_CR_CSSON); -} - -/** - * @brief Enable HSE external oscillator (HSE Bypass) - * @rmtoll CR HSEBYP LL_RCC_HSE_EnableBypass - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSE_EnableBypass(void) -{ - SET_BIT(RCC->CR, RCC_CR_HSEBYP); -} - -/** - * @brief Disable HSE external oscillator (HSE Bypass) - * @rmtoll CR HSEBYP LL_RCC_HSE_DisableBypass - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSE_DisableBypass(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); -} - -/** - * @brief Enable HSE crystal oscillator (HSE ON) - * @rmtoll CR HSEON LL_RCC_HSE_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSE_Enable(void) -{ - SET_BIT(RCC->CR, RCC_CR_HSEON); -} - -/** - * @brief Disable HSE crystal oscillator (HSE ON) - * @rmtoll CR HSEON LL_RCC_HSE_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSE_Disable(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_HSEON); -} - -/** - * @brief Check if HSE oscillator Ready - * @rmtoll CR HSERDY LL_RCC_HSE_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_HSE_IsReady(void) -{ - return (READ_BIT(RCC->CR, RCC_CR_HSERDY) == (RCC_CR_HSERDY)); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_HSI HSI - * @{ - */ - -/** - * @brief Enable HSI oscillator - * @rmtoll CR HSION LL_RCC_HSI_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSI_Enable(void) -{ - SET_BIT(RCC->CR, RCC_CR_HSION); -} - -/** - * @brief Disable HSI oscillator - * @rmtoll CR HSION LL_RCC_HSI_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSI_Disable(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_HSION); -} - -/** - * @brief Check if HSI clock is ready - * @rmtoll CR HSIRDY LL_RCC_HSI_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_HSI_IsReady(void) -{ - return (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == (RCC_CR_HSIRDY)); -} - -/** - * @brief Get HSI Calibration value - * @note When HSITRIM is written, HSICAL is updated with the sum of - * HSITRIM and the factory trim value - * @rmtoll CR HSICAL LL_RCC_HSI_GetCalibration - * @retval Between Min_Data = 0x00 and Max_Data = 0xFF - */ -__STATIC_INLINE uint32_t LL_RCC_HSI_GetCalibration(void) -{ - return (uint32_t)(READ_BIT(RCC->CR, RCC_CR_HSICAL) >> RCC_CR_HSICAL_Pos); -} - -/** - * @brief Set HSI Calibration trimming - * @note user-programmable trimming value that is added to the HSICAL - * @note Default value is 16, which, when added to the HSICAL value, - * should trim the HSI to 16 MHz +/- 1 % - * @rmtoll CR HSITRIM LL_RCC_HSI_SetCalibTrimming - * @param Value Between Min_Data = 0 and Max_Data = 31 - * @retval None - */ -__STATIC_INLINE void LL_RCC_HSI_SetCalibTrimming(uint32_t Value) -{ - MODIFY_REG(RCC->CR, RCC_CR_HSITRIM, Value << RCC_CR_HSITRIM_Pos); -} - -/** - * @brief Get HSI Calibration trimming - * @rmtoll CR HSITRIM LL_RCC_HSI_GetCalibTrimming - * @retval Between Min_Data = 0 and Max_Data = 31 - */ -__STATIC_INLINE uint32_t LL_RCC_HSI_GetCalibTrimming(void) -{ - return (uint32_t)(READ_BIT(RCC->CR, RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_LSE LSE - * @{ - */ - -/** - * @brief Enable Low Speed External (LSE) crystal. - * @rmtoll BDCR LSEON LL_RCC_LSE_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_Enable(void) -{ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); -} - -/** - * @brief Disable Low Speed External (LSE) crystal. - * @rmtoll BDCR LSEON LL_RCC_LSE_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_Disable(void) -{ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); -} - -/** - * @brief Enable external clock source (LSE bypass). - * @rmtoll BDCR LSEBYP LL_RCC_LSE_EnableBypass - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_EnableBypass(void) -{ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); -} - -/** - * @brief Disable external clock source (LSE bypass). - * @rmtoll BDCR LSEBYP LL_RCC_LSE_DisableBypass - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_DisableBypass(void) -{ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); -} - -/** - * @brief Check if LSE oscillator Ready - * @rmtoll BDCR LSERDY LL_RCC_LSE_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_LSE_IsReady(void) -{ - return (READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) == (RCC_BDCR_LSERDY)); -} - -#if defined(RCC_BDCR_LSEMOD) -/** - * @brief Enable LSE high drive mode. - * @note LSE high drive mode can be enabled only when the LSE clock is disabled - * @rmtoll BDCR LSEMOD LL_RCC_LSE_EnableHighDriveMode - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_EnableHighDriveMode(void) -{ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); -} - -/** - * @brief Disable LSE high drive mode. - * @note LSE high drive mode can be disabled only when the LSE clock is disabled - * @rmtoll BDCR LSEMOD LL_RCC_LSE_DisableHighDriveMode - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSE_DisableHighDriveMode(void) -{ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); -} -#endif /* RCC_BDCR_LSEMOD */ - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_LSI LSI - * @{ - */ - -/** - * @brief Enable LSI Oscillator - * @rmtoll CSR LSION LL_RCC_LSI_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSI_Enable(void) -{ - SET_BIT(RCC->CSR, RCC_CSR_LSION); -} - -/** - * @brief Disable LSI Oscillator - * @rmtoll CSR LSION LL_RCC_LSI_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_LSI_Disable(void) -{ - CLEAR_BIT(RCC->CSR, RCC_CSR_LSION); -} - -/** - * @brief Check if LSI is Ready - * @rmtoll CSR LSIRDY LL_RCC_LSI_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_LSI_IsReady(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) == (RCC_CSR_LSIRDY)); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_System System - * @{ - */ - -/** - * @brief Configure the system clock source - * @rmtoll CFGR SW LL_RCC_SetSysClkSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_SYS_CLKSOURCE_HSI - * @arg @ref LL_RCC_SYS_CLKSOURCE_HSE - * @arg @ref LL_RCC_SYS_CLKSOURCE_PLL - * @arg @ref LL_RCC_SYS_CLKSOURCE_PLLR (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetSysClkSource(uint32_t Source) -{ - MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, Source); -} - -/** - * @brief Get the system clock source - * @rmtoll CFGR SWS LL_RCC_GetSysClkSource - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_HSI - * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_HSE - * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_PLL - * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_PLLR (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetSysClkSource(void) -{ - return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_SWS)); -} - -/** - * @brief Set AHB prescaler - * @rmtoll CFGR HPRE LL_RCC_SetAHBPrescaler - * @param Prescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_SYSCLK_DIV_1 - * @arg @ref LL_RCC_SYSCLK_DIV_2 - * @arg @ref LL_RCC_SYSCLK_DIV_4 - * @arg @ref LL_RCC_SYSCLK_DIV_8 - * @arg @ref LL_RCC_SYSCLK_DIV_16 - * @arg @ref LL_RCC_SYSCLK_DIV_64 - * @arg @ref LL_RCC_SYSCLK_DIV_128 - * @arg @ref LL_RCC_SYSCLK_DIV_256 - * @arg @ref LL_RCC_SYSCLK_DIV_512 - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetAHBPrescaler(uint32_t Prescaler) -{ - MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, Prescaler); -} - -/** - * @brief Set APB1 prescaler - * @rmtoll CFGR PPRE1 LL_RCC_SetAPB1Prescaler - * @param Prescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_APB1_DIV_1 - * @arg @ref LL_RCC_APB1_DIV_2 - * @arg @ref LL_RCC_APB1_DIV_4 - * @arg @ref LL_RCC_APB1_DIV_8 - * @arg @ref LL_RCC_APB1_DIV_16 - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetAPB1Prescaler(uint32_t Prescaler) -{ - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, Prescaler); -} - -/** - * @brief Set APB2 prescaler - * @rmtoll CFGR PPRE2 LL_RCC_SetAPB2Prescaler - * @param Prescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_APB2_DIV_1 - * @arg @ref LL_RCC_APB2_DIV_2 - * @arg @ref LL_RCC_APB2_DIV_4 - * @arg @ref LL_RCC_APB2_DIV_8 - * @arg @ref LL_RCC_APB2_DIV_16 - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetAPB2Prescaler(uint32_t Prescaler) -{ - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, Prescaler); -} - -/** - * @brief Get AHB prescaler - * @rmtoll CFGR HPRE LL_RCC_GetAHBPrescaler - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SYSCLK_DIV_1 - * @arg @ref LL_RCC_SYSCLK_DIV_2 - * @arg @ref LL_RCC_SYSCLK_DIV_4 - * @arg @ref LL_RCC_SYSCLK_DIV_8 - * @arg @ref LL_RCC_SYSCLK_DIV_16 - * @arg @ref LL_RCC_SYSCLK_DIV_64 - * @arg @ref LL_RCC_SYSCLK_DIV_128 - * @arg @ref LL_RCC_SYSCLK_DIV_256 - * @arg @ref LL_RCC_SYSCLK_DIV_512 - */ -__STATIC_INLINE uint32_t LL_RCC_GetAHBPrescaler(void) -{ - return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_HPRE)); -} - -/** - * @brief Get APB1 prescaler - * @rmtoll CFGR PPRE1 LL_RCC_GetAPB1Prescaler - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_APB1_DIV_1 - * @arg @ref LL_RCC_APB1_DIV_2 - * @arg @ref LL_RCC_APB1_DIV_4 - * @arg @ref LL_RCC_APB1_DIV_8 - * @arg @ref LL_RCC_APB1_DIV_16 - */ -__STATIC_INLINE uint32_t LL_RCC_GetAPB1Prescaler(void) -{ - return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PPRE1)); -} - -/** - * @brief Get APB2 prescaler - * @rmtoll CFGR PPRE2 LL_RCC_GetAPB2Prescaler - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_APB2_DIV_1 - * @arg @ref LL_RCC_APB2_DIV_2 - * @arg @ref LL_RCC_APB2_DIV_4 - * @arg @ref LL_RCC_APB2_DIV_8 - * @arg @ref LL_RCC_APB2_DIV_16 - */ -__STATIC_INLINE uint32_t LL_RCC_GetAPB2Prescaler(void) -{ - return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PPRE2)); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_MCO MCO - * @{ - */ - -#if defined(RCC_CFGR_MCO1EN) -/** - * @brief Enable MCO1 output - * @rmtoll CFGR RCC_CFGR_MCO1EN LL_RCC_MCO1_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_MCO1_Enable(void) -{ - SET_BIT(RCC->CFGR, RCC_CFGR_MCO1EN); -} - -/** - * @brief Disable MCO1 output - * @rmtoll CFGR RCC_CFGR_MCO1EN LL_RCC_MCO1_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_MCO1_Disable(void) -{ - CLEAR_BIT(RCC->CFGR, RCC_CFGR_MCO1EN); -} -#endif /* RCC_CFGR_MCO1EN */ - -#if defined(RCC_CFGR_MCO2EN) -/** - * @brief Enable MCO2 output - * @rmtoll CFGR RCC_CFGR_MCO2EN LL_RCC_MCO2_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_MCO2_Enable(void) -{ - SET_BIT(RCC->CFGR, RCC_CFGR_MCO2EN); -} - -/** - * @brief Disable MCO2 output - * @rmtoll CFGR RCC_CFGR_MCO2EN LL_RCC_MCO2_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_MCO2_Disable(void) -{ - CLEAR_BIT(RCC->CFGR, RCC_CFGR_MCO2EN); -} -#endif /* RCC_CFGR_MCO2EN */ - -/** - * @brief Configure MCOx - * @rmtoll CFGR MCO1 LL_RCC_ConfigMCO\n - * CFGR MCO1PRE LL_RCC_ConfigMCO\n - * CFGR MCO2 LL_RCC_ConfigMCO\n - * CFGR MCO2PRE LL_RCC_ConfigMCO - * @param MCOxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_MCO1SOURCE_HSI - * @arg @ref LL_RCC_MCO1SOURCE_LSE - * @arg @ref LL_RCC_MCO1SOURCE_HSE - * @arg @ref LL_RCC_MCO1SOURCE_PLLCLK - * @arg @ref LL_RCC_MCO2SOURCE_SYSCLK - * @arg @ref LL_RCC_MCO2SOURCE_PLLI2S - * @arg @ref LL_RCC_MCO2SOURCE_HSE - * @arg @ref LL_RCC_MCO2SOURCE_PLLCLK - * @param MCOxPrescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_MCO1_DIV_1 - * @arg @ref LL_RCC_MCO1_DIV_2 - * @arg @ref LL_RCC_MCO1_DIV_3 - * @arg @ref LL_RCC_MCO1_DIV_4 - * @arg @ref LL_RCC_MCO1_DIV_5 - * @arg @ref LL_RCC_MCO2_DIV_1 - * @arg @ref LL_RCC_MCO2_DIV_2 - * @arg @ref LL_RCC_MCO2_DIV_3 - * @arg @ref LL_RCC_MCO2_DIV_4 - * @arg @ref LL_RCC_MCO2_DIV_5 - * @retval None - */ -__STATIC_INLINE void LL_RCC_ConfigMCO(uint32_t MCOxSource, uint32_t MCOxPrescaler) -{ - MODIFY_REG(RCC->CFGR, (MCOxSource & 0xFFFF0000U) | (MCOxPrescaler & 0xFFFF0000U), (MCOxSource << 16U) | (MCOxPrescaler << 16U)); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_Peripheral_Clock_Source Peripheral Clock Source - * @{ - */ -#if defined(FMPI2C1) -/** - * @brief Configure FMPI2C clock source - * @rmtoll DCKCFGR2 FMPI2C1SEL LL_RCC_SetFMPI2CClockSource - * @param FMPI2CxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_HSI - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetFMPI2CClockSource(uint32_t FMPI2CxSource) -{ - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, FMPI2CxSource); -} -#endif /* FMPI2C1 */ - -#if defined(LPTIM1) -/** - * @brief Configure LPTIMx clock source - * @rmtoll DCKCFGR2 LPTIM1SEL LL_RCC_SetLPTIMClockSource - * @param LPTIMxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_PCLK1 - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_HSI - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSI - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSE - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetLPTIMClockSource(uint32_t LPTIMxSource) -{ - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, LPTIMxSource); -} -#endif /* LPTIM1 */ - -#if defined(SAI1) -/** - * @brief Configure SAIx clock source - * @rmtoll DCKCFGR SAI1SRC LL_RCC_SetSAIClockSource\n - * DCKCFGR SAI2SRC LL_RCC_SetSAIClockSource\n - * DCKCFGR SAI1ASRC LL_RCC_SetSAIClockSource\n - * DCKCFGR SAI1BSRC LL_RCC_SetSAIClockSource - * @param SAIxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetSAIClockSource(uint32_t SAIxSource) -{ - MODIFY_REG(RCC->DCKCFGR, (SAIxSource & 0xFFFF0000U), (SAIxSource << 16U)); -} -#endif /* SAI1 */ - -#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) -/** - * @brief Configure SDIO clock source - * @rmtoll DCKCFGR SDIOSEL LL_RCC_SetSDIOClockSource\n - * DCKCFGR2 SDIOSEL LL_RCC_SetSDIOClockSource - * @param SDIOxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_SDIO_CLKSOURCE_PLL48CLK - * @arg @ref LL_RCC_SDIO_CLKSOURCE_SYSCLK - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetSDIOClockSource(uint32_t SDIOxSource) -{ -#if defined(RCC_DCKCFGR_SDIOSEL) - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL, SDIOxSource); -#else - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, SDIOxSource); -#endif /* RCC_DCKCFGR_SDIOSEL */ -} -#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ - -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -/** - * @brief Configure 48Mhz domain clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetCK48MClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_SetCK48MClockSource - * @param CK48MxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLL - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetCK48MClockSource(uint32_t CK48MxSource) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, CK48MxSource); -#else - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, CK48MxSource); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} - -#if defined(RNG) -/** - * @brief Configure RNG clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetRNGClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_SetRNGClockSource - * @param RNGxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLL - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetRNGClockSource(uint32_t RNGxSource) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, RNGxSource); -#else - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, RNGxSource); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} -#endif /* RNG */ - -#if defined(USB_OTG_FS) || defined(USB_OTG_HS) -/** - * @brief Configure USB clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetUSBClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_SetUSBClockSource - * @param USBxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_USB_CLKSOURCE_PLL - * @arg @ref LL_RCC_USB_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_USB_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetUSBClockSource(uint32_t USBxSource) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, USBxSource); -#else - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, USBxSource); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} -#endif /* USB_OTG_FS || USB_OTG_HS */ -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ - -#if defined(CEC) -/** - * @brief Configure CEC clock source - * @rmtoll DCKCFGR2 CECSEL LL_RCC_SetCECClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_CEC_CLKSOURCE_HSI_DIV488 - * @arg @ref LL_RCC_CEC_CLKSOURCE_LSE - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetCECClockSource(uint32_t Source) -{ - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL, Source); -} -#endif /* CEC */ - -/** - * @brief Configure I2S clock source - * @rmtoll CFGR I2SSRC LL_RCC_SetI2SClockSource\n - * DCKCFGR I2SSRC LL_RCC_SetI2SClockSource\n - * DCKCFGR I2S1SRC LL_RCC_SetI2SClockSource\n - * DCKCFGR I2S2SRC LL_RCC_SetI2SClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PIN - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLSRC (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetI2SClockSource(uint32_t Source) -{ -#if defined(RCC_CFGR_I2SSRC) - MODIFY_REG(RCC->CFGR, RCC_CFGR_I2SSRC, Source); -#else - MODIFY_REG(RCC->DCKCFGR, (Source & 0xFFFF0000U), (Source << 16U)); -#endif /* RCC_CFGR_I2SSRC */ -} - -#if defined(DSI) -/** - * @brief Configure DSI clock source - * @rmtoll DCKCFGR DSISEL LL_RCC_SetDSIClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_DSI_CLKSOURCE_PHY - * @arg @ref LL_RCC_DSI_CLKSOURCE_PLL - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetDSIClockSource(uint32_t Source) -{ - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL, Source); -} -#endif /* DSI */ - -#if defined(DFSDM1_Channel0) -/** - * @brief Configure DFSDM Audio clock source - * @rmtoll DCKCFGR CKDFSDM1ASEL LL_RCC_SetDFSDMAudioClockSource\n - * DCKCFGR CKDFSDM2ASEL LL_RCC_SetDFSDMAudioClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 - * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 - * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (*) - * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetDFSDMAudioClockSource(uint32_t Source) -{ - MODIFY_REG(RCC->DCKCFGR, (Source & 0x0000FFFFU), (Source >> 16U)); -} - -/** - * @brief Configure DFSDM Kernel clock source - * @rmtoll DCKCFGR CKDFSDM1SEL LL_RCC_SetDFSDMClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_PCLK2 - * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_SYSCLK - * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_PCLK2 (*) - * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_SYSCLK (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetDFSDMClockSource(uint32_t Source) -{ - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, Source); -} -#endif /* DFSDM1_Channel0 */ - -#if defined(SPDIFRX) -/** - * @brief Configure SPDIFRX clock source - * @rmtoll DCKCFGR2 SPDIFRXSEL LL_RCC_SetSPDIFRXClockSource - * @param SPDIFRXxSource This parameter can be one of the following values: - * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLL - * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetSPDIFRXClockSource(uint32_t SPDIFRXxSource) -{ - MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL, SPDIFRXxSource); -} -#endif /* SPDIFRX */ - -#if defined(FMPI2C1) -/** - * @brief Get FMPI2C clock source - * @rmtoll DCKCFGR2 FMPI2C1SEL LL_RCC_GetFMPI2CClockSource - * @param FMPI2Cx This parameter can be one of the following values: - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK - * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_HSI - */ -__STATIC_INLINE uint32_t LL_RCC_GetFMPI2CClockSource(uint32_t FMPI2Cx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, FMPI2Cx)); -} -#endif /* FMPI2C1 */ - -#if defined(LPTIM1) -/** - * @brief Get LPTIMx clock source - * @rmtoll DCKCFGR2 LPTIM1SEL LL_RCC_GetLPTIMClockSource - * @param LPTIMx This parameter can be one of the following values: - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_PCLK1 - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_HSI - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSI - * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSE - */ -__STATIC_INLINE uint32_t LL_RCC_GetLPTIMClockSource(uint32_t LPTIMx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)); -} -#endif /* LPTIM1 */ - -#if defined(SAI1) -/** - * @brief Get SAIx clock source - * @rmtoll DCKCFGR SAI1SEL LL_RCC_GetSAIClockSource\n - * DCKCFGR SAI2SEL LL_RCC_GetSAIClockSource\n - * DCKCFGR SAI1ASRC LL_RCC_GetSAIClockSource\n - * DCKCFGR SAI1BSRC LL_RCC_GetSAIClockSource - * @param SAIx This parameter can be one of the following values: - * @arg @ref LL_RCC_SAI1_CLKSOURCE (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE (*) - * - * (*) value not defined in all devices. - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetSAIClockSource(uint32_t SAIx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, SAIx) >> 16U | SAIx); -} -#endif /* SAI1 */ - -#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) -/** - * @brief Get SDIOx clock source - * @rmtoll DCKCFGR SDIOSEL LL_RCC_GetSDIOClockSource\n - * DCKCFGR2 SDIOSEL LL_RCC_GetSDIOClockSource - * @param SDIOx This parameter can be one of the following values: - * @arg @ref LL_RCC_SDIO_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SDIO_CLKSOURCE_PLL48CLK - * @arg @ref LL_RCC_SDIO_CLKSOURCE_SYSCLK - */ -__STATIC_INLINE uint32_t LL_RCC_GetSDIOClockSource(uint32_t SDIOx) -{ -#if defined(RCC_DCKCFGR_SDIOSEL) - return (uint32_t)(READ_BIT(RCC->DCKCFGR, SDIOx)); -#else - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, SDIOx)); -#endif /* RCC_DCKCFGR_SDIOSEL */ -} -#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ - -#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) -/** - * @brief Get 48Mhz domain clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetCK48MClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_GetCK48MClockSource - * @param CK48Mx This parameter can be one of the following values: - * @arg @ref LL_RCC_CK48M_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLL - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetCK48MClockSource(uint32_t CK48Mx) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - return (uint32_t)(READ_BIT(RCC->DCKCFGR, CK48Mx)); -#else - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, CK48Mx)); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} - -#if defined(RNG) -/** - * @brief Get RNGx clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetRNGClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_GetRNGClockSource - * @param RNGx This parameter can be one of the following values: - * @arg @ref LL_RCC_RNG_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLL - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetRNGClockSource(uint32_t RNGx) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RNGx)); -#else - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, RNGx)); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} -#endif /* RNG */ - -#if defined(USB_OTG_FS) || defined(USB_OTG_HS) -/** - * @brief Get USBx clock source - * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetUSBClockSource\n - * DCKCFGR2 CK48MSEL LL_RCC_GetUSBClockSource - * @param USBx This parameter can be one of the following values: - * @arg @ref LL_RCC_USB_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_USB_CLKSOURCE_PLL - * @arg @ref LL_RCC_USB_CLKSOURCE_PLLSAI (*) - * @arg @ref LL_RCC_USB_CLKSOURCE_PLLI2S (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetUSBClockSource(uint32_t USBx) -{ -#if defined(RCC_DCKCFGR_CK48MSEL) - return (uint32_t)(READ_BIT(RCC->DCKCFGR, USBx)); -#else - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, USBx)); -#endif /* RCC_DCKCFGR_CK48MSEL */ -} -#endif /* USB_OTG_FS || USB_OTG_HS */ -#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ - -#if defined(CEC) -/** - * @brief Get CEC Clock Source - * @rmtoll DCKCFGR2 CECSEL LL_RCC_GetCECClockSource - * @param CECx This parameter can be one of the following values: - * @arg @ref LL_RCC_CEC_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_CEC_CLKSOURCE_HSI_DIV488 - * @arg @ref LL_RCC_CEC_CLKSOURCE_LSE - */ -__STATIC_INLINE uint32_t LL_RCC_GetCECClockSource(uint32_t CECx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, CECx)); -} -#endif /* CEC */ - -/** - * @brief Get I2S Clock Source - * @rmtoll CFGR I2SSRC LL_RCC_GetI2SClockSource\n - * DCKCFGR I2SSRC LL_RCC_GetI2SClockSource\n - * DCKCFGR I2S1SRC LL_RCC_GetI2SClockSource\n - * DCKCFGR I2S2SRC LL_RCC_GetI2SClockSource - * @param I2Sx This parameter can be one of the following values: - * @arg @ref LL_RCC_I2S1_CLKSOURCE - * @arg @ref LL_RCC_I2S2_CLKSOURCE (*) - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PIN - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLSRC (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLI2S (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PIN (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLL (*) - * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLSRC (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetI2SClockSource(uint32_t I2Sx) -{ -#if defined(RCC_CFGR_I2SSRC) - return (uint32_t)(READ_BIT(RCC->CFGR, I2Sx)); -#else - return (uint32_t)(READ_BIT(RCC->DCKCFGR, I2Sx) >> 16U | I2Sx); -#endif /* RCC_CFGR_I2SSRC */ -} - -#if defined(DFSDM1_Channel0) -/** - * @brief Get DFSDM Audio Clock Source - * @rmtoll DCKCFGR CKDFSDM1ASEL LL_RCC_GetDFSDMAudioClockSource\n - * DCKCFGR CKDFSDM2ASEL LL_RCC_GetDFSDMAudioClockSource - * @param DFSDMx This parameter can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE - * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE (*) - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 - * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 - * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (*) - * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetDFSDMAudioClockSource(uint32_t DFSDMx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, DFSDMx) << 16U | DFSDMx); -} - -/** - * @brief Get DFSDM Audio Clock Source - * @rmtoll DCKCFGR CKDFSDM1SEL LL_RCC_GetDFSDMClockSource - * @param DFSDMx This parameter can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_CLKSOURCE - * @arg @ref LL_RCC_DFSDM2_CLKSOURCE (*) - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_PCLK2 - * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_SYSCLK - * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_PCLK2 (*) - * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_SYSCLK (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetDFSDMClockSource(uint32_t DFSDMx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, DFSDMx)); -} -#endif /* DFSDM1_Channel0 */ - -#if defined(SPDIFRX) -/** - * @brief Get SPDIFRX clock source - * @rmtoll DCKCFGR2 SPDIFRXSEL LL_RCC_GetSPDIFRXClockSource - * @param SPDIFRXx This parameter can be one of the following values: - * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLL - * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_GetSPDIFRXClockSource(uint32_t SPDIFRXx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR2, SPDIFRXx)); -} -#endif /* SPDIFRX */ - -#if defined(DSI) -/** - * @brief Get DSI Clock Source - * @rmtoll DCKCFGR DSISEL LL_RCC_GetDSIClockSource - * @param DSIx This parameter can be one of the following values: - * @arg @ref LL_RCC_DSI_CLKSOURCE - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_DSI_CLKSOURCE_PHY - * @arg @ref LL_RCC_DSI_CLKSOURCE_PLL - */ -__STATIC_INLINE uint32_t LL_RCC_GetDSIClockSource(uint32_t DSIx) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, DSIx)); -} -#endif /* DSI */ - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_RTC RTC - * @{ - */ - -/** - * @brief Set RTC Clock Source - * @note Once the RTC clock source has been selected, it cannot be changed anymore unless - * the Backup domain is reset, or unless a failure is detected on LSE (LSECSSD is - * set). The BDRST bit can be used to reset them. - * @rmtoll BDCR RTCSEL LL_RCC_SetRTCClockSource - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_RTC_CLKSOURCE_NONE - * @arg @ref LL_RCC_RTC_CLKSOURCE_LSE - * @arg @ref LL_RCC_RTC_CLKSOURCE_LSI - * @arg @ref LL_RCC_RTC_CLKSOURCE_HSE - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetRTCClockSource(uint32_t Source) -{ - MODIFY_REG(RCC->BDCR, RCC_BDCR_RTCSEL, Source); -} - -/** - * @brief Get RTC Clock Source - * @rmtoll BDCR RTCSEL LL_RCC_GetRTCClockSource - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_RTC_CLKSOURCE_NONE - * @arg @ref LL_RCC_RTC_CLKSOURCE_LSE - * @arg @ref LL_RCC_RTC_CLKSOURCE_LSI - * @arg @ref LL_RCC_RTC_CLKSOURCE_HSE - */ -__STATIC_INLINE uint32_t LL_RCC_GetRTCClockSource(void) -{ - return (uint32_t)(READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)); -} - -/** - * @brief Enable RTC - * @rmtoll BDCR RTCEN LL_RCC_EnableRTC - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableRTC(void) -{ - SET_BIT(RCC->BDCR, RCC_BDCR_RTCEN); -} - -/** - * @brief Disable RTC - * @rmtoll BDCR RTCEN LL_RCC_DisableRTC - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableRTC(void) -{ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_RTCEN); -} - -/** - * @brief Check if RTC has been enabled or not - * @rmtoll BDCR RTCEN LL_RCC_IsEnabledRTC - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledRTC(void) -{ - return (READ_BIT(RCC->BDCR, RCC_BDCR_RTCEN) == (RCC_BDCR_RTCEN)); -} - -/** - * @brief Force the Backup domain reset - * @rmtoll BDCR BDRST LL_RCC_ForceBackupDomainReset - * @retval None - */ -__STATIC_INLINE void LL_RCC_ForceBackupDomainReset(void) -{ - SET_BIT(RCC->BDCR, RCC_BDCR_BDRST); -} - -/** - * @brief Release the Backup domain reset - * @rmtoll BDCR BDRST LL_RCC_ReleaseBackupDomainReset - * @retval None - */ -__STATIC_INLINE void LL_RCC_ReleaseBackupDomainReset(void) -{ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_BDRST); -} - -/** - * @brief Set HSE Prescalers for RTC Clock - * @rmtoll CFGR RTCPRE LL_RCC_SetRTC_HSEPrescaler - * @param Prescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_RTC_NOCLOCK - * @arg @ref LL_RCC_RTC_HSE_DIV_2 - * @arg @ref LL_RCC_RTC_HSE_DIV_3 - * @arg @ref LL_RCC_RTC_HSE_DIV_4 - * @arg @ref LL_RCC_RTC_HSE_DIV_5 - * @arg @ref LL_RCC_RTC_HSE_DIV_6 - * @arg @ref LL_RCC_RTC_HSE_DIV_7 - * @arg @ref LL_RCC_RTC_HSE_DIV_8 - * @arg @ref LL_RCC_RTC_HSE_DIV_9 - * @arg @ref LL_RCC_RTC_HSE_DIV_10 - * @arg @ref LL_RCC_RTC_HSE_DIV_11 - * @arg @ref LL_RCC_RTC_HSE_DIV_12 - * @arg @ref LL_RCC_RTC_HSE_DIV_13 - * @arg @ref LL_RCC_RTC_HSE_DIV_14 - * @arg @ref LL_RCC_RTC_HSE_DIV_15 - * @arg @ref LL_RCC_RTC_HSE_DIV_16 - * @arg @ref LL_RCC_RTC_HSE_DIV_17 - * @arg @ref LL_RCC_RTC_HSE_DIV_18 - * @arg @ref LL_RCC_RTC_HSE_DIV_19 - * @arg @ref LL_RCC_RTC_HSE_DIV_20 - * @arg @ref LL_RCC_RTC_HSE_DIV_21 - * @arg @ref LL_RCC_RTC_HSE_DIV_22 - * @arg @ref LL_RCC_RTC_HSE_DIV_23 - * @arg @ref LL_RCC_RTC_HSE_DIV_24 - * @arg @ref LL_RCC_RTC_HSE_DIV_25 - * @arg @ref LL_RCC_RTC_HSE_DIV_26 - * @arg @ref LL_RCC_RTC_HSE_DIV_27 - * @arg @ref LL_RCC_RTC_HSE_DIV_28 - * @arg @ref LL_RCC_RTC_HSE_DIV_29 - * @arg @ref LL_RCC_RTC_HSE_DIV_30 - * @arg @ref LL_RCC_RTC_HSE_DIV_31 - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetRTC_HSEPrescaler(uint32_t Prescaler) -{ - MODIFY_REG(RCC->CFGR, RCC_CFGR_RTCPRE, Prescaler); -} - -/** - * @brief Get HSE Prescalers for RTC Clock - * @rmtoll CFGR RTCPRE LL_RCC_GetRTC_HSEPrescaler - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_RTC_NOCLOCK - * @arg @ref LL_RCC_RTC_HSE_DIV_2 - * @arg @ref LL_RCC_RTC_HSE_DIV_3 - * @arg @ref LL_RCC_RTC_HSE_DIV_4 - * @arg @ref LL_RCC_RTC_HSE_DIV_5 - * @arg @ref LL_RCC_RTC_HSE_DIV_6 - * @arg @ref LL_RCC_RTC_HSE_DIV_7 - * @arg @ref LL_RCC_RTC_HSE_DIV_8 - * @arg @ref LL_RCC_RTC_HSE_DIV_9 - * @arg @ref LL_RCC_RTC_HSE_DIV_10 - * @arg @ref LL_RCC_RTC_HSE_DIV_11 - * @arg @ref LL_RCC_RTC_HSE_DIV_12 - * @arg @ref LL_RCC_RTC_HSE_DIV_13 - * @arg @ref LL_RCC_RTC_HSE_DIV_14 - * @arg @ref LL_RCC_RTC_HSE_DIV_15 - * @arg @ref LL_RCC_RTC_HSE_DIV_16 - * @arg @ref LL_RCC_RTC_HSE_DIV_17 - * @arg @ref LL_RCC_RTC_HSE_DIV_18 - * @arg @ref LL_RCC_RTC_HSE_DIV_19 - * @arg @ref LL_RCC_RTC_HSE_DIV_20 - * @arg @ref LL_RCC_RTC_HSE_DIV_21 - * @arg @ref LL_RCC_RTC_HSE_DIV_22 - * @arg @ref LL_RCC_RTC_HSE_DIV_23 - * @arg @ref LL_RCC_RTC_HSE_DIV_24 - * @arg @ref LL_RCC_RTC_HSE_DIV_25 - * @arg @ref LL_RCC_RTC_HSE_DIV_26 - * @arg @ref LL_RCC_RTC_HSE_DIV_27 - * @arg @ref LL_RCC_RTC_HSE_DIV_28 - * @arg @ref LL_RCC_RTC_HSE_DIV_29 - * @arg @ref LL_RCC_RTC_HSE_DIV_30 - * @arg @ref LL_RCC_RTC_HSE_DIV_31 - */ -__STATIC_INLINE uint32_t LL_RCC_GetRTC_HSEPrescaler(void) -{ - return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_RTCPRE)); -} - -/** - * @} - */ - -#if defined(RCC_DCKCFGR_TIMPRE) -/** @defgroup RCC_LL_EF_TIM_CLOCK_PRESCALER TIM - * @{ - */ - -/** - * @brief Set Timers Clock Prescalers - * @rmtoll DCKCFGR TIMPRE LL_RCC_SetTIMPrescaler - * @param Prescaler This parameter can be one of the following values: - * @arg @ref LL_RCC_TIM_PRESCALER_TWICE - * @arg @ref LL_RCC_TIM_PRESCALER_FOUR_TIMES - * @retval None - */ -__STATIC_INLINE void LL_RCC_SetTIMPrescaler(uint32_t Prescaler) -{ - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_TIMPRE, Prescaler); -} - -/** - * @brief Get Timers Clock Prescalers - * @rmtoll DCKCFGR TIMPRE LL_RCC_GetTIMPrescaler - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_TIM_PRESCALER_TWICE - * @arg @ref LL_RCC_TIM_PRESCALER_FOUR_TIMES - */ -__STATIC_INLINE uint32_t LL_RCC_GetTIMPrescaler(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_TIMPRE)); -} - -/** - * @} - */ -#endif /* RCC_DCKCFGR_TIMPRE */ - -/** @defgroup RCC_LL_EF_PLL PLL - * @{ - */ - -/** - * @brief Enable PLL - * @rmtoll CR PLLON LL_RCC_PLL_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_Enable(void) -{ - SET_BIT(RCC->CR, RCC_CR_PLLON); -} - -/** - * @brief Disable PLL - * @note Cannot be disabled if the PLL clock is used as the system clock - * @rmtoll CR PLLON LL_RCC_PLL_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_Disable(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_PLLON); -} - -/** - * @brief Check if PLL Ready - * @rmtoll CR PLLRDY LL_RCC_PLL_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_IsReady(void) -{ - return (READ_BIT(RCC->CR, RCC_CR_PLLRDY) == (RCC_CR_PLLRDY)); -} - -/** - * @brief Configure PLL used for SYSCLK Domain - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLP can be written only when PLL is disabled - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SYS\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SYS\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SYS\n - * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SYS\n - * PLLCFGR PLLP LL_RCC_PLL_ConfigDomain_SYS - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLP_R This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLP_DIV_2 - * @arg @ref LL_RCC_PLLP_DIV_4 - * @arg @ref LL_RCC_PLLP_DIV_6 - * @arg @ref LL_RCC_PLLP_DIV_8 - * @arg @ref LL_RCC_PLLR_DIV_2 (*) - * @arg @ref LL_RCC_PLLR_DIV_3 (*) - * @arg @ref LL_RCC_PLLR_DIV_4 (*) - * @arg @ref LL_RCC_PLLR_DIV_5 (*) - * @arg @ref LL_RCC_PLLR_DIV_6 (*) - * @arg @ref LL_RCC_PLLR_DIV_7 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SYS(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP_R) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos); - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLP, PLLP_R); -#if defined(RCC_PLLR_SYSCLK_SUPPORT) - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLR, PLLP_R); -#endif /* RCC_PLLR_SYSCLK_SUPPORT */ -} - -/** - * @brief Configure PLL used for 48Mhz domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLQ can be written only when PLL is disabled - * @note This can be selected for USB, RNG, SDIO - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_48M\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_48M\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_48M\n - * PLLCFGR PLLQ LL_RCC_PLL_ConfigDomain_48M - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLQ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLQ_DIV_2 - * @arg @ref LL_RCC_PLLQ_DIV_3 - * @arg @ref LL_RCC_PLLQ_DIV_4 - * @arg @ref LL_RCC_PLLQ_DIV_5 - * @arg @ref LL_RCC_PLLQ_DIV_6 - * @arg @ref LL_RCC_PLLQ_DIV_7 - * @arg @ref LL_RCC_PLLQ_DIV_8 - * @arg @ref LL_RCC_PLLQ_DIV_9 - * @arg @ref LL_RCC_PLLQ_DIV_10 - * @arg @ref LL_RCC_PLLQ_DIV_11 - * @arg @ref LL_RCC_PLLQ_DIV_12 - * @arg @ref LL_RCC_PLLQ_DIV_13 - * @arg @ref LL_RCC_PLLQ_DIV_14 - * @arg @ref LL_RCC_PLLQ_DIV_15 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLQ, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLQ); -} - -#if defined(DSI) -/** - * @brief Configure PLL used for DSI clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI are disabled - * @note PLLN/PLLR can be written only when PLL is disabled - * @note This can be selected for DSI - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_DSI\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_DSI\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_DSI\n - * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_DSI - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_DSI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); -} -#endif /* DSI */ - -#if defined(RCC_PLLR_I2S_CLKSOURCE_SUPPORT) -/** - * @brief Configure PLL used for I2S clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI are disabled - * @note PLLN/PLLR can be written only when PLL is disabled - * @note This can be selected for I2S - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_I2S\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_I2S\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_I2S\n - * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_I2S - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_I2S(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); -} -#endif /* RCC_PLLR_I2S_CLKSOURCE_SUPPORT */ - -#if defined(SPDIFRX) -/** - * @brief Configure PLL used for SPDIFRX clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI are disabled - * @note PLLN/PLLR can be written only when PLL is disabled - * @note This can be selected for SPDIFRX - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SPDIFRX\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SPDIFRX\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SPDIFRX\n - * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SPDIFRX - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SPDIFRX(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); -} -#endif /* SPDIFRX */ - -#if defined(RCC_PLLCFGR_PLLR) -#if defined(SAI1) -/** - * @brief Configure PLL used for SAI clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI are disabled - * @note PLLN/PLLR can be written only when PLL is disabled - * @note This can be selected for SAI - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SAI\n - * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SAI\n - * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SAI\n - * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SAI\n - * DCKCFGR PLLDIVR LL_RCC_PLL_ConfigDomain_SAI - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - * @param PLLDIVR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLDIVR_DIV_1 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_2 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_3 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_4 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_5 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_6 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_7 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_8 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_9 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_10 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_11 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_12 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_13 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_14 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_15 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_16 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_17 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_18 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_19 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_20 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_21 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_22 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_23 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_24 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_25 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_26 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_27 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_28 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_29 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_30 (*) - * @arg @ref LL_RCC_PLLDIVR_DIV_31 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -#if defined(RCC_DCKCFGR_PLLDIVR) -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR, - uint32_t PLLDIVR) -#else -__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) -#endif /* RCC_DCKCFGR_PLLDIVR */ -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, - Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); -#if defined(RCC_DCKCFGR_PLLDIVR) - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, PLLDIVR); -#endif /* RCC_DCKCFGR_PLLDIVR */ -} -#endif /* SAI1 */ -#endif /* RCC_PLLCFGR_PLLR */ - -/** - * @brief Configure PLL clock source - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_SetMainSource - * @param PLLSource This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_SetMainSource(uint32_t PLLSource) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, PLLSource); -} - -/** - * @brief Get the oscillator used as PLL clock source. - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_GetMainSource - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetMainSource(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC)); -} - -/** - * @brief Get Main PLL multiplication factor for VCO - * @rmtoll PLLCFGR PLLN LL_RCC_PLL_GetN - * @retval Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetN(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); -} - -/** - * @brief Get Main PLL division factor for PLLP - * @rmtoll PLLCFGR PLLP LL_RCC_PLL_GetP - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLP_DIV_2 - * @arg @ref LL_RCC_PLLP_DIV_4 - * @arg @ref LL_RCC_PLLP_DIV_6 - * @arg @ref LL_RCC_PLLP_DIV_8 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetP(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP)); -} - -/** - * @brief Get Main PLL division factor for PLLQ - * @note used for PLL48MCLK selected for USB, RNG, SDIO (48 MHz clock) - * @rmtoll PLLCFGR PLLQ LL_RCC_PLL_GetQ - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLQ_DIV_2 - * @arg @ref LL_RCC_PLLQ_DIV_3 - * @arg @ref LL_RCC_PLLQ_DIV_4 - * @arg @ref LL_RCC_PLLQ_DIV_5 - * @arg @ref LL_RCC_PLLQ_DIV_6 - * @arg @ref LL_RCC_PLLQ_DIV_7 - * @arg @ref LL_RCC_PLLQ_DIV_8 - * @arg @ref LL_RCC_PLLQ_DIV_9 - * @arg @ref LL_RCC_PLLQ_DIV_10 - * @arg @ref LL_RCC_PLLQ_DIV_11 - * @arg @ref LL_RCC_PLLQ_DIV_12 - * @arg @ref LL_RCC_PLLQ_DIV_13 - * @arg @ref LL_RCC_PLLQ_DIV_14 - * @arg @ref LL_RCC_PLLQ_DIV_15 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetQ(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ)); -} - -#if defined(RCC_PLLCFGR_PLLR) -/** - * @brief Get Main PLL division factor for PLLR - * @note used for PLLCLK (system clock) - * @rmtoll PLLCFGR PLLR LL_RCC_PLL_GetR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLR_DIV_2 - * @arg @ref LL_RCC_PLLR_DIV_3 - * @arg @ref LL_RCC_PLLR_DIV_4 - * @arg @ref LL_RCC_PLLR_DIV_5 - * @arg @ref LL_RCC_PLLR_DIV_6 - * @arg @ref LL_RCC_PLLR_DIV_7 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetR(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR)); -} -#endif /* RCC_PLLCFGR_PLLR */ - -#if defined(RCC_DCKCFGR_PLLDIVR) -/** - * @brief Get Main PLL division factor for PLLDIVR - * @note used for PLLSAICLK (SAI1 and SAI2 clock) - * @rmtoll DCKCFGR PLLDIVR LL_RCC_PLL_GetDIVR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLDIVR_DIV_1 - * @arg @ref LL_RCC_PLLDIVR_DIV_2 - * @arg @ref LL_RCC_PLLDIVR_DIV_3 - * @arg @ref LL_RCC_PLLDIVR_DIV_4 - * @arg @ref LL_RCC_PLLDIVR_DIV_5 - * @arg @ref LL_RCC_PLLDIVR_DIV_6 - * @arg @ref LL_RCC_PLLDIVR_DIV_7 - * @arg @ref LL_RCC_PLLDIVR_DIV_8 - * @arg @ref LL_RCC_PLLDIVR_DIV_9 - * @arg @ref LL_RCC_PLLDIVR_DIV_10 - * @arg @ref LL_RCC_PLLDIVR_DIV_11 - * @arg @ref LL_RCC_PLLDIVR_DIV_12 - * @arg @ref LL_RCC_PLLDIVR_DIV_13 - * @arg @ref LL_RCC_PLLDIVR_DIV_14 - * @arg @ref LL_RCC_PLLDIVR_DIV_15 - * @arg @ref LL_RCC_PLLDIVR_DIV_16 - * @arg @ref LL_RCC_PLLDIVR_DIV_17 - * @arg @ref LL_RCC_PLLDIVR_DIV_18 - * @arg @ref LL_RCC_PLLDIVR_DIV_19 - * @arg @ref LL_RCC_PLLDIVR_DIV_20 - * @arg @ref LL_RCC_PLLDIVR_DIV_21 - * @arg @ref LL_RCC_PLLDIVR_DIV_22 - * @arg @ref LL_RCC_PLLDIVR_DIV_23 - * @arg @ref LL_RCC_PLLDIVR_DIV_24 - * @arg @ref LL_RCC_PLLDIVR_DIV_25 - * @arg @ref LL_RCC_PLLDIVR_DIV_26 - * @arg @ref LL_RCC_PLLDIVR_DIV_27 - * @arg @ref LL_RCC_PLLDIVR_DIV_28 - * @arg @ref LL_RCC_PLLDIVR_DIV_29 - * @arg @ref LL_RCC_PLLDIVR_DIV_30 - * @arg @ref LL_RCC_PLLDIVR_DIV_31 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetDIVR(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR)); -} -#endif /* RCC_DCKCFGR_PLLDIVR */ - -/** - * @brief Get Division factor for the main PLL and other PLL - * @rmtoll PLLCFGR PLLM LL_RCC_PLL_GetDivider - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLM_DIV_2 - * @arg @ref LL_RCC_PLLM_DIV_3 - * @arg @ref LL_RCC_PLLM_DIV_4 - * @arg @ref LL_RCC_PLLM_DIV_5 - * @arg @ref LL_RCC_PLLM_DIV_6 - * @arg @ref LL_RCC_PLLM_DIV_7 - * @arg @ref LL_RCC_PLLM_DIV_8 - * @arg @ref LL_RCC_PLLM_DIV_9 - * @arg @ref LL_RCC_PLLM_DIV_10 - * @arg @ref LL_RCC_PLLM_DIV_11 - * @arg @ref LL_RCC_PLLM_DIV_12 - * @arg @ref LL_RCC_PLLM_DIV_13 - * @arg @ref LL_RCC_PLLM_DIV_14 - * @arg @ref LL_RCC_PLLM_DIV_15 - * @arg @ref LL_RCC_PLLM_DIV_16 - * @arg @ref LL_RCC_PLLM_DIV_17 - * @arg @ref LL_RCC_PLLM_DIV_18 - * @arg @ref LL_RCC_PLLM_DIV_19 - * @arg @ref LL_RCC_PLLM_DIV_20 - * @arg @ref LL_RCC_PLLM_DIV_21 - * @arg @ref LL_RCC_PLLM_DIV_22 - * @arg @ref LL_RCC_PLLM_DIV_23 - * @arg @ref LL_RCC_PLLM_DIV_24 - * @arg @ref LL_RCC_PLLM_DIV_25 - * @arg @ref LL_RCC_PLLM_DIV_26 - * @arg @ref LL_RCC_PLLM_DIV_27 - * @arg @ref LL_RCC_PLLM_DIV_28 - * @arg @ref LL_RCC_PLLM_DIV_29 - * @arg @ref LL_RCC_PLLM_DIV_30 - * @arg @ref LL_RCC_PLLM_DIV_31 - * @arg @ref LL_RCC_PLLM_DIV_32 - * @arg @ref LL_RCC_PLLM_DIV_33 - * @arg @ref LL_RCC_PLLM_DIV_34 - * @arg @ref LL_RCC_PLLM_DIV_35 - * @arg @ref LL_RCC_PLLM_DIV_36 - * @arg @ref LL_RCC_PLLM_DIV_37 - * @arg @ref LL_RCC_PLLM_DIV_38 - * @arg @ref LL_RCC_PLLM_DIV_39 - * @arg @ref LL_RCC_PLLM_DIV_40 - * @arg @ref LL_RCC_PLLM_DIV_41 - * @arg @ref LL_RCC_PLLM_DIV_42 - * @arg @ref LL_RCC_PLLM_DIV_43 - * @arg @ref LL_RCC_PLLM_DIV_44 - * @arg @ref LL_RCC_PLLM_DIV_45 - * @arg @ref LL_RCC_PLLM_DIV_46 - * @arg @ref LL_RCC_PLLM_DIV_47 - * @arg @ref LL_RCC_PLLM_DIV_48 - * @arg @ref LL_RCC_PLLM_DIV_49 - * @arg @ref LL_RCC_PLLM_DIV_50 - * @arg @ref LL_RCC_PLLM_DIV_51 - * @arg @ref LL_RCC_PLLM_DIV_52 - * @arg @ref LL_RCC_PLLM_DIV_53 - * @arg @ref LL_RCC_PLLM_DIV_54 - * @arg @ref LL_RCC_PLLM_DIV_55 - * @arg @ref LL_RCC_PLLM_DIV_56 - * @arg @ref LL_RCC_PLLM_DIV_57 - * @arg @ref LL_RCC_PLLM_DIV_58 - * @arg @ref LL_RCC_PLLM_DIV_59 - * @arg @ref LL_RCC_PLLM_DIV_60 - * @arg @ref LL_RCC_PLLM_DIV_61 - * @arg @ref LL_RCC_PLLM_DIV_62 - * @arg @ref LL_RCC_PLLM_DIV_63 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetDivider(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); -} - -/** - * @brief Configure Spread Spectrum used for PLL - * @note These bits must be written before enabling PLL - * @rmtoll SSCGR MODPER LL_RCC_PLL_ConfigSpreadSpectrum\n - * SSCGR INCSTEP LL_RCC_PLL_ConfigSpreadSpectrum\n - * SSCGR SPREADSEL LL_RCC_PLL_ConfigSpreadSpectrum - * @param Mod Between Min_Data=0 and Max_Data=8191 - * @param Inc Between Min_Data=0 and Max_Data=32767 - * @param Sel This parameter can be one of the following values: - * @arg @ref LL_RCC_SPREAD_SELECT_CENTER - * @arg @ref LL_RCC_SPREAD_SELECT_DOWN - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_ConfigSpreadSpectrum(uint32_t Mod, uint32_t Inc, uint32_t Sel) -{ - MODIFY_REG(RCC->SSCGR, RCC_SSCGR_MODPER | RCC_SSCGR_INCSTEP | RCC_SSCGR_SPREADSEL, Mod | (Inc << RCC_SSCGR_INCSTEP_Pos) | Sel); -} - -/** - * @brief Get Spread Spectrum Modulation Period for PLL - * @rmtoll SSCGR MODPER LL_RCC_PLL_GetPeriodModulation - * @retval Between Min_Data=0 and Max_Data=8191 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetPeriodModulation(void) -{ - return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_MODPER)); -} - -/** - * @brief Get Spread Spectrum Incrementation Step for PLL - * @note Must be written before enabling PLL - * @rmtoll SSCGR INCSTEP LL_RCC_PLL_GetStepIncrementation - * @retval Between Min_Data=0 and Max_Data=32767 - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetStepIncrementation(void) -{ - return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_INCSTEP) >> RCC_SSCGR_INCSTEP_Pos); -} - -/** - * @brief Get Spread Spectrum Selection for PLL - * @note Must be written before enabling PLL - * @rmtoll SSCGR SPREADSEL LL_RCC_PLL_GetSpreadSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_SPREAD_SELECT_CENTER - * @arg @ref LL_RCC_SPREAD_SELECT_DOWN - */ -__STATIC_INLINE uint32_t LL_RCC_PLL_GetSpreadSelection(void) -{ - return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_SPREADSEL)); -} - -/** - * @brief Enable Spread Spectrum for PLL. - * @rmtoll SSCGR SSCGEN LL_RCC_PLL_SpreadSpectrum_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_SpreadSpectrum_Enable(void) -{ - SET_BIT(RCC->SSCGR, RCC_SSCGR_SSCGEN); -} - -/** - * @brief Disable Spread Spectrum for PLL. - * @rmtoll SSCGR SSCGEN LL_RCC_PLL_SpreadSpectrum_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLL_SpreadSpectrum_Disable(void) -{ - CLEAR_BIT(RCC->SSCGR, RCC_SSCGR_SSCGEN); -} - -/** - * @} - */ - -#if defined(RCC_PLLI2S_SUPPORT) -/** @defgroup RCC_LL_EF_PLLI2S PLLI2S - * @{ - */ - -/** - * @brief Enable PLLI2S - * @rmtoll CR PLLI2SON LL_RCC_PLLI2S_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_Enable(void) -{ - SET_BIT(RCC->CR, RCC_CR_PLLI2SON); -} - -/** - * @brief Disable PLLI2S - * @rmtoll CR PLLI2SON LL_RCC_PLLI2S_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_Disable(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_PLLI2SON); -} - -/** - * @brief Check if PLLI2S Ready - * @rmtoll CR PLLI2SRDY LL_RCC_PLLI2S_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_IsReady(void) -{ - return (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) == (RCC_CR_PLLI2SRDY)); -} - -#if (defined(RCC_DCKCFGR_PLLI2SDIVQ) || defined(RCC_DCKCFGR_PLLI2SDIVR)) -/** - * @brief Configure PLLI2S used for SAI domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLQ/PLLR can be written only when PLLI2S is disabled - * @note This can be selected for SAI - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_ConfigDomain_SAI\n - * PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_ConfigDomain_SAI\n - * DCKCFGR PLLI2SDIVQ LL_RCC_PLLI2S_ConfigDomain_SAI\n - * DCKCFGR PLLI2SDIVR LL_RCC_PLLI2S_ConfigDomain_SAI - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) - * - * (*) value not defined in all devices. - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param PLLN Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLQ_R This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SQ_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SQ_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SR_DIV_7 (*) - * - * (*) value not defined in all devices. - * @param PLLDIVQ_R This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 (*) - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 (*) - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ_R, - uint32_t PLLDIVQ_R) -{ - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); - MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos); -#if defined(RCC_DCKCFGR_PLLI2SDIVQ) - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SQ, PLLQ_R); - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, PLLDIVQ_R); -#else - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SR, PLLQ_R); - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, PLLDIVQ_R); -#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ -} -#endif /* RCC_DCKCFGR_PLLI2SDIVQ && RCC_DCKCFGR_PLLI2SDIVR */ - -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) -/** - * @brief Configure PLLI2S used for 48Mhz domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLQ can be written only when PLLI2S is disabled - * @note This can be selected for RNG, USB, SDIO - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_48M\n - * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_48M\n - * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_48M\n - * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_48M\n - * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_48M\n - * PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_ConfigDomain_48M - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) - * - * (*) value not defined in all devices. - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLQ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SQ_DIV_2 - * @arg @ref LL_RCC_PLLI2SQ_DIV_3 - * @arg @ref LL_RCC_PLLI2SQ_DIV_4 - * @arg @ref LL_RCC_PLLI2SQ_DIV_5 - * @arg @ref LL_RCC_PLLI2SQ_DIV_6 - * @arg @ref LL_RCC_PLLI2SQ_DIV_7 - * @arg @ref LL_RCC_PLLI2SQ_DIV_8 - * @arg @ref LL_RCC_PLLI2SQ_DIV_9 - * @arg @ref LL_RCC_PLLI2SQ_DIV_10 - * @arg @ref LL_RCC_PLLI2SQ_DIV_11 - * @arg @ref LL_RCC_PLLI2SQ_DIV_12 - * @arg @ref LL_RCC_PLLI2SQ_DIV_13 - * @arg @ref LL_RCC_PLLI2SQ_DIV_14 - * @arg @ref LL_RCC_PLLI2SQ_DIV_15 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ) -{ - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); - MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SQ, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLQ); -} -#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ - -#if defined(SPDIFRX) -/** - * @brief Configure PLLI2S used for SPDIFRX domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLP can be written only when PLLI2S is disabled - * @note This can be selected for SPDIFRX - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n - * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n - * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n - * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n - * PLLI2SCFGR PLLI2SP LL_RCC_PLLI2S_ConfigDomain_SPDIFRX - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLP This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SP_DIV_2 - * @arg @ref LL_RCC_PLLI2SP_DIV_4 - * @arg @ref LL_RCC_PLLI2SP_DIV_6 - * @arg @ref LL_RCC_PLLI2SP_DIV_8 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_SPDIFRX(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SP, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLP); -} -#endif /* SPDIFRX */ - -/** - * @brief Configure PLLI2S used for I2S1 domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLR can be written only when PLLI2S is disabled - * @note This can be selected for I2S - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_I2S\n - * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_I2S\n - * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_I2S\n - * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_I2S\n - * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_I2S\n - * PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_ConfigDomain_I2S - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) - * - * (*) value not defined in all devices. - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - * @param PLLN Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLI2SR_DIV_2 - * @arg @ref LL_RCC_PLLI2SR_DIV_3 - * @arg @ref LL_RCC_PLLI2SR_DIV_4 - * @arg @ref LL_RCC_PLLI2SR_DIV_5 - * @arg @ref LL_RCC_PLLI2SR_DIV_6 - * @arg @ref LL_RCC_PLLI2SR_DIV_7 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_I2S(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) -{ - __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); - MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ - MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SR, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLR); -} - -/** - * @brief Get I2SPLL multiplication factor for VCO - * @rmtoll PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_GetN - * @retval Between 50/192(*) and 432 - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetN(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); -} - -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) -/** - * @brief Get I2SPLL division factor for PLLI2SQ - * @rmtoll PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_GetQ - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SQ_DIV_2 - * @arg @ref LL_RCC_PLLI2SQ_DIV_3 - * @arg @ref LL_RCC_PLLI2SQ_DIV_4 - * @arg @ref LL_RCC_PLLI2SQ_DIV_5 - * @arg @ref LL_RCC_PLLI2SQ_DIV_6 - * @arg @ref LL_RCC_PLLI2SQ_DIV_7 - * @arg @ref LL_RCC_PLLI2SQ_DIV_8 - * @arg @ref LL_RCC_PLLI2SQ_DIV_9 - * @arg @ref LL_RCC_PLLI2SQ_DIV_10 - * @arg @ref LL_RCC_PLLI2SQ_DIV_11 - * @arg @ref LL_RCC_PLLI2SQ_DIV_12 - * @arg @ref LL_RCC_PLLI2SQ_DIV_13 - * @arg @ref LL_RCC_PLLI2SQ_DIV_14 - * @arg @ref LL_RCC_PLLI2SQ_DIV_15 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetQ(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SQ)); -} -#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ - -/** - * @brief Get I2SPLL division factor for PLLI2SR - * @note used for PLLI2SCLK (I2S clock) - * @rmtoll PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_GetR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SR_DIV_2 - * @arg @ref LL_RCC_PLLI2SR_DIV_3 - * @arg @ref LL_RCC_PLLI2SR_DIV_4 - * @arg @ref LL_RCC_PLLI2SR_DIV_5 - * @arg @ref LL_RCC_PLLI2SR_DIV_6 - * @arg @ref LL_RCC_PLLI2SR_DIV_7 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetR(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SR)); -} - -#if defined(RCC_PLLI2SCFGR_PLLI2SP) -/** - * @brief Get I2SPLL division factor for PLLI2SP - * @note used for PLLSPDIFRXCLK (SPDIFRX clock) - * @rmtoll PLLI2SCFGR PLLI2SP LL_RCC_PLLI2S_GetP - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SP_DIV_2 - * @arg @ref LL_RCC_PLLI2SP_DIV_4 - * @arg @ref LL_RCC_PLLI2SP_DIV_6 - * @arg @ref LL_RCC_PLLI2SP_DIV_8 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetP(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SP)); -} -#endif /* RCC_PLLI2SCFGR_PLLI2SP */ - -#if defined(RCC_DCKCFGR_PLLI2SDIVQ) -/** - * @brief Get I2SPLL division factor for PLLI2SDIVQ - * @note used PLLSAICLK selected (SAI clock) - * @rmtoll DCKCFGR PLLI2SDIVQ LL_RCC_PLLI2S_GetDIVQ - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 - * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDIVQ(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ)); -} -#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ - -#if defined(RCC_DCKCFGR_PLLI2SDIVR) -/** - * @brief Get I2SPLL division factor for PLLI2SDIVR - * @note used PLLSAICLK selected (SAI clock) - * @rmtoll DCKCFGR PLLI2SDIVR LL_RCC_PLLI2S_GetDIVR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 - * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDIVR(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR)); -} -#endif /* RCC_DCKCFGR_PLLI2SDIVR */ - -/** - * @brief Get division factor for PLLI2S input clock - * @rmtoll PLLCFGR PLLM LL_RCC_PLLI2S_GetDivider\n - * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_GetDivider - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLI2SM_DIV_2 - * @arg @ref LL_RCC_PLLI2SM_DIV_3 - * @arg @ref LL_RCC_PLLI2SM_DIV_4 - * @arg @ref LL_RCC_PLLI2SM_DIV_5 - * @arg @ref LL_RCC_PLLI2SM_DIV_6 - * @arg @ref LL_RCC_PLLI2SM_DIV_7 - * @arg @ref LL_RCC_PLLI2SM_DIV_8 - * @arg @ref LL_RCC_PLLI2SM_DIV_9 - * @arg @ref LL_RCC_PLLI2SM_DIV_10 - * @arg @ref LL_RCC_PLLI2SM_DIV_11 - * @arg @ref LL_RCC_PLLI2SM_DIV_12 - * @arg @ref LL_RCC_PLLI2SM_DIV_13 - * @arg @ref LL_RCC_PLLI2SM_DIV_14 - * @arg @ref LL_RCC_PLLI2SM_DIV_15 - * @arg @ref LL_RCC_PLLI2SM_DIV_16 - * @arg @ref LL_RCC_PLLI2SM_DIV_17 - * @arg @ref LL_RCC_PLLI2SM_DIV_18 - * @arg @ref LL_RCC_PLLI2SM_DIV_19 - * @arg @ref LL_RCC_PLLI2SM_DIV_20 - * @arg @ref LL_RCC_PLLI2SM_DIV_21 - * @arg @ref LL_RCC_PLLI2SM_DIV_22 - * @arg @ref LL_RCC_PLLI2SM_DIV_23 - * @arg @ref LL_RCC_PLLI2SM_DIV_24 - * @arg @ref LL_RCC_PLLI2SM_DIV_25 - * @arg @ref LL_RCC_PLLI2SM_DIV_26 - * @arg @ref LL_RCC_PLLI2SM_DIV_27 - * @arg @ref LL_RCC_PLLI2SM_DIV_28 - * @arg @ref LL_RCC_PLLI2SM_DIV_29 - * @arg @ref LL_RCC_PLLI2SM_DIV_30 - * @arg @ref LL_RCC_PLLI2SM_DIV_31 - * @arg @ref LL_RCC_PLLI2SM_DIV_32 - * @arg @ref LL_RCC_PLLI2SM_DIV_33 - * @arg @ref LL_RCC_PLLI2SM_DIV_34 - * @arg @ref LL_RCC_PLLI2SM_DIV_35 - * @arg @ref LL_RCC_PLLI2SM_DIV_36 - * @arg @ref LL_RCC_PLLI2SM_DIV_37 - * @arg @ref LL_RCC_PLLI2SM_DIV_38 - * @arg @ref LL_RCC_PLLI2SM_DIV_39 - * @arg @ref LL_RCC_PLLI2SM_DIV_40 - * @arg @ref LL_RCC_PLLI2SM_DIV_41 - * @arg @ref LL_RCC_PLLI2SM_DIV_42 - * @arg @ref LL_RCC_PLLI2SM_DIV_43 - * @arg @ref LL_RCC_PLLI2SM_DIV_44 - * @arg @ref LL_RCC_PLLI2SM_DIV_45 - * @arg @ref LL_RCC_PLLI2SM_DIV_46 - * @arg @ref LL_RCC_PLLI2SM_DIV_47 - * @arg @ref LL_RCC_PLLI2SM_DIV_48 - * @arg @ref LL_RCC_PLLI2SM_DIV_49 - * @arg @ref LL_RCC_PLLI2SM_DIV_50 - * @arg @ref LL_RCC_PLLI2SM_DIV_51 - * @arg @ref LL_RCC_PLLI2SM_DIV_52 - * @arg @ref LL_RCC_PLLI2SM_DIV_53 - * @arg @ref LL_RCC_PLLI2SM_DIV_54 - * @arg @ref LL_RCC_PLLI2SM_DIV_55 - * @arg @ref LL_RCC_PLLI2SM_DIV_56 - * @arg @ref LL_RCC_PLLI2SM_DIV_57 - * @arg @ref LL_RCC_PLLI2SM_DIV_58 - * @arg @ref LL_RCC_PLLI2SM_DIV_59 - * @arg @ref LL_RCC_PLLI2SM_DIV_60 - * @arg @ref LL_RCC_PLLI2SM_DIV_61 - * @arg @ref LL_RCC_PLLI2SM_DIV_62 - * @arg @ref LL_RCC_PLLI2SM_DIV_63 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDivider(void) -{ -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM)); -#else - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ -} - -/** - * @brief Get the oscillator used as PLL clock source. - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_GetMainSource\n - * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_GetMainSource - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetMainSource(void) -{ -#if defined(RCC_PLLI2SCFGR_PLLI2SSRC) - uint32_t pllsrc = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC); - uint32_t plli2sssrc0 = READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SSRC); - uint32_t plli2sssrc1 = READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SSRC) >> 15U; - return (uint32_t)(pllsrc | plli2sssrc0 | plli2sssrc1); -#else - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC)); -#endif /* RCC_PLLI2SCFGR_PLLI2SSRC */ -} - -/** - * @} - */ -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** @defgroup RCC_LL_EF_PLLSAI PLLSAI - * @{ - */ - -/** - * @brief Enable PLLSAI - * @rmtoll CR PLLSAION LL_RCC_PLLSAI_Enable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLSAI_Enable(void) -{ - SET_BIT(RCC->CR, RCC_CR_PLLSAION); -} - -/** - * @brief Disable PLLSAI - * @rmtoll CR PLLSAION LL_RCC_PLLSAI_Disable - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLSAI_Disable(void) -{ - CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); -} - -/** - * @brief Check if PLLSAI Ready - * @rmtoll CR PLLSAIRDY LL_RCC_PLLSAI_IsReady - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_IsReady(void) -{ - return (READ_BIT(RCC->CR, RCC_CR_PLLSAIRDY) == (RCC_CR_PLLSAIRDY)); -} - -/** - * @brief Configure PLLSAI used for SAI domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLQ can be written only when PLLSAI is disabled - * @note This can be selected for SAI - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_SAI\n - * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_SAI\n - * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_ConfigDomain_SAI\n - * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_SAI\n - * PLLSAICFGR PLLSAIQ LL_RCC_PLLSAI_ConfigDomain_SAI\n - * DCKCFGR PLLSAIDIVQ LL_RCC_PLLSAI_ConfigDomain_SAI - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param PLLN Between 49/50(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLQ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIQ_DIV_15 - * @param PLLDIVQ This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ, - uint32_t PLLDIVQ) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); -#if defined(RCC_PLLSAICFGR_PLLSAIM) - MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLSAICFGR_PLLSAIM */ - MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIQ, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLQ); - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, PLLDIVQ); -} - -#if defined(RCC_PLLSAICFGR_PLLSAIP) -/** - * @brief Configure PLLSAI used for 48Mhz domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLP can be written only when PLLSAI is disabled - * @note This can be selected for USB, RNG, SDIO - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_48M\n - * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_48M\n - * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_ConfigDomain_48M\n - * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_48M\n - * PLLSAICFGR PLLSAIP LL_RCC_PLLSAI_ConfigDomain_48M - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param PLLN Between 50 and 432 - * @param PLLP This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIP_DIV_2 - * @arg @ref LL_RCC_PLLSAIP_DIV_4 - * @arg @ref LL_RCC_PLLSAIP_DIV_6 - * @arg @ref LL_RCC_PLLSAIP_DIV_8 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); -#if defined(RCC_PLLSAICFGR_PLLSAIM) - MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM, PLLM); -#else - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); -#endif /* RCC_PLLSAICFGR_PLLSAIM */ - MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIP, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLP); -} -#endif /* RCC_PLLSAICFGR_PLLSAIP */ - -#if defined(LTDC) -/** - * @brief Configure PLLSAI used for LTDC domain clock - * @note PLL Source and PLLM Divider can be written only when PLL, - * PLLI2S and PLLSAI(*) are disabled - * @note PLLN/PLLR can be written only when PLLSAI is disabled - * @note This can be selected for LTDC - * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_LTDC\n - * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_LTDC\n - * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_LTDC\n - * PLLSAICFGR PLLSAIR LL_RCC_PLLSAI_ConfigDomain_LTDC\n - * DCKCFGR PLLSAIDIVR LL_RCC_PLLSAI_ConfigDomain_LTDC - * @param Source This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSOURCE_HSI - * @arg @ref LL_RCC_PLLSOURCE_HSE - * @param PLLM This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - * @param PLLN Between 49/50(*) and 432 - * - * (*) value not defined in all devices. - * @param PLLR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIR_DIV_2 - * @arg @ref LL_RCC_PLLSAIR_DIV_3 - * @arg @ref LL_RCC_PLLSAIR_DIV_4 - * @arg @ref LL_RCC_PLLSAIR_DIV_5 - * @arg @ref LL_RCC_PLLSAIR_DIV_6 - * @arg @ref LL_RCC_PLLSAIR_DIV_7 - * @param PLLDIVR This parameter can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 - * @retval None - */ -__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_LTDC(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR, - uint32_t PLLDIVR) -{ - MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM, Source | PLLM); - MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIR, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLR); - MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR, PLLDIVR); -} -#endif /* LTDC */ - -/** - * @brief Get division factor for PLLSAI input clock - * @rmtoll PLLCFGR PLLM LL_RCC_PLLSAI_GetDivider\n - * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_GetDivider - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIM_DIV_2 - * @arg @ref LL_RCC_PLLSAIM_DIV_3 - * @arg @ref LL_RCC_PLLSAIM_DIV_4 - * @arg @ref LL_RCC_PLLSAIM_DIV_5 - * @arg @ref LL_RCC_PLLSAIM_DIV_6 - * @arg @ref LL_RCC_PLLSAIM_DIV_7 - * @arg @ref LL_RCC_PLLSAIM_DIV_8 - * @arg @ref LL_RCC_PLLSAIM_DIV_9 - * @arg @ref LL_RCC_PLLSAIM_DIV_10 - * @arg @ref LL_RCC_PLLSAIM_DIV_11 - * @arg @ref LL_RCC_PLLSAIM_DIV_12 - * @arg @ref LL_RCC_PLLSAIM_DIV_13 - * @arg @ref LL_RCC_PLLSAIM_DIV_14 - * @arg @ref LL_RCC_PLLSAIM_DIV_15 - * @arg @ref LL_RCC_PLLSAIM_DIV_16 - * @arg @ref LL_RCC_PLLSAIM_DIV_17 - * @arg @ref LL_RCC_PLLSAIM_DIV_18 - * @arg @ref LL_RCC_PLLSAIM_DIV_19 - * @arg @ref LL_RCC_PLLSAIM_DIV_20 - * @arg @ref LL_RCC_PLLSAIM_DIV_21 - * @arg @ref LL_RCC_PLLSAIM_DIV_22 - * @arg @ref LL_RCC_PLLSAIM_DIV_23 - * @arg @ref LL_RCC_PLLSAIM_DIV_24 - * @arg @ref LL_RCC_PLLSAIM_DIV_25 - * @arg @ref LL_RCC_PLLSAIM_DIV_26 - * @arg @ref LL_RCC_PLLSAIM_DIV_27 - * @arg @ref LL_RCC_PLLSAIM_DIV_28 - * @arg @ref LL_RCC_PLLSAIM_DIV_29 - * @arg @ref LL_RCC_PLLSAIM_DIV_30 - * @arg @ref LL_RCC_PLLSAIM_DIV_31 - * @arg @ref LL_RCC_PLLSAIM_DIV_32 - * @arg @ref LL_RCC_PLLSAIM_DIV_33 - * @arg @ref LL_RCC_PLLSAIM_DIV_34 - * @arg @ref LL_RCC_PLLSAIM_DIV_35 - * @arg @ref LL_RCC_PLLSAIM_DIV_36 - * @arg @ref LL_RCC_PLLSAIM_DIV_37 - * @arg @ref LL_RCC_PLLSAIM_DIV_38 - * @arg @ref LL_RCC_PLLSAIM_DIV_39 - * @arg @ref LL_RCC_PLLSAIM_DIV_40 - * @arg @ref LL_RCC_PLLSAIM_DIV_41 - * @arg @ref LL_RCC_PLLSAIM_DIV_42 - * @arg @ref LL_RCC_PLLSAIM_DIV_43 - * @arg @ref LL_RCC_PLLSAIM_DIV_44 - * @arg @ref LL_RCC_PLLSAIM_DIV_45 - * @arg @ref LL_RCC_PLLSAIM_DIV_46 - * @arg @ref LL_RCC_PLLSAIM_DIV_47 - * @arg @ref LL_RCC_PLLSAIM_DIV_48 - * @arg @ref LL_RCC_PLLSAIM_DIV_49 - * @arg @ref LL_RCC_PLLSAIM_DIV_50 - * @arg @ref LL_RCC_PLLSAIM_DIV_51 - * @arg @ref LL_RCC_PLLSAIM_DIV_52 - * @arg @ref LL_RCC_PLLSAIM_DIV_53 - * @arg @ref LL_RCC_PLLSAIM_DIV_54 - * @arg @ref LL_RCC_PLLSAIM_DIV_55 - * @arg @ref LL_RCC_PLLSAIM_DIV_56 - * @arg @ref LL_RCC_PLLSAIM_DIV_57 - * @arg @ref LL_RCC_PLLSAIM_DIV_58 - * @arg @ref LL_RCC_PLLSAIM_DIV_59 - * @arg @ref LL_RCC_PLLSAIM_DIV_60 - * @arg @ref LL_RCC_PLLSAIM_DIV_61 - * @arg @ref LL_RCC_PLLSAIM_DIV_62 - * @arg @ref LL_RCC_PLLSAIM_DIV_63 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDivider(void) -{ -#if defined(RCC_PLLSAICFGR_PLLSAIM) - return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM)); -#else - return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); -#endif /* RCC_PLLSAICFGR_PLLSAIM */ -} - -/** - * @brief Get SAIPLL multiplication factor for VCO - * @rmtoll PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_GetN - * @retval Between 49/50(*) and 432 - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetN(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); -} - -/** - * @brief Get SAIPLL division factor for PLLSAIQ - * @rmtoll PLLSAICFGR PLLSAIQ LL_RCC_PLLSAI_GetQ - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIQ_DIV_15 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetQ(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIQ)); -} - -#if defined(RCC_PLLSAICFGR_PLLSAIR) -/** - * @brief Get SAIPLL division factor for PLLSAIR - * @note used for PLLSAICLK (SAI clock) - * @rmtoll PLLSAICFGR PLLSAIR LL_RCC_PLLSAI_GetR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIR_DIV_2 - * @arg @ref LL_RCC_PLLSAIR_DIV_3 - * @arg @ref LL_RCC_PLLSAIR_DIV_4 - * @arg @ref LL_RCC_PLLSAIR_DIV_5 - * @arg @ref LL_RCC_PLLSAIR_DIV_6 - * @arg @ref LL_RCC_PLLSAIR_DIV_7 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetR(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIR)); -} -#endif /* RCC_PLLSAICFGR_PLLSAIR */ - -#if defined(RCC_PLLSAICFGR_PLLSAIP) -/** - * @brief Get SAIPLL division factor for PLLSAIP - * @note used for PLL48MCLK (48M domain clock) - * @rmtoll PLLSAICFGR PLLSAIP LL_RCC_PLLSAI_GetP - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIP_DIV_2 - * @arg @ref LL_RCC_PLLSAIP_DIV_4 - * @arg @ref LL_RCC_PLLSAIP_DIV_6 - * @arg @ref LL_RCC_PLLSAIP_DIV_8 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetP(void) -{ - return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIP)); -} -#endif /* RCC_PLLSAICFGR_PLLSAIP */ - -/** - * @brief Get SAIPLL division factor for PLLSAIDIVQ - * @note used PLLSAICLK selected (SAI clock) - * @rmtoll DCKCFGR PLLSAIDIVQ LL_RCC_PLLSAI_GetDIVQ - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 - * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDIVQ(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ)); -} - -#if defined(RCC_DCKCFGR_PLLSAIDIVR) -/** - * @brief Get SAIPLL division factor for PLLSAIDIVR - * @note used for LTDC domain clock - * @rmtoll DCKCFGR PLLSAIDIVR LL_RCC_PLLSAI_GetDIVR - * @retval Returned value can be one of the following values: - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 - * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 - */ -__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDIVR(void) -{ - return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR)); -} -#endif /* RCC_DCKCFGR_PLLSAIDIVR */ - -/** - * @} - */ -#endif /* RCC_PLLSAI_SUPPORT */ - -/** @defgroup RCC_LL_EF_FLAG_Management FLAG Management - * @{ - */ - -/** - * @brief Clear LSI ready interrupt flag - * @rmtoll CIR LSIRDYC LL_RCC_ClearFlag_LSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_LSIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC); -} - -/** - * @brief Clear LSE ready interrupt flag - * @rmtoll CIR LSERDYC LL_RCC_ClearFlag_LSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_LSERDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_LSERDYC); -} - -/** - * @brief Clear HSI ready interrupt flag - * @rmtoll CIR HSIRDYC LL_RCC_ClearFlag_HSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_HSIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_HSIRDYC); -} - -/** - * @brief Clear HSE ready interrupt flag - * @rmtoll CIR HSERDYC LL_RCC_ClearFlag_HSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_HSERDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_HSERDYC); -} - -/** - * @brief Clear PLL ready interrupt flag - * @rmtoll CIR PLLRDYC LL_RCC_ClearFlag_PLLRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_PLLRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLRDYC); -} - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Clear PLLI2S ready interrupt flag - * @rmtoll CIR PLLI2SRDYC LL_RCC_ClearFlag_PLLI2SRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_PLLI2SRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC); -} - -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Clear PLLSAI ready interrupt flag - * @rmtoll CIR PLLSAIRDYC LL_RCC_ClearFlag_PLLSAIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_PLLSAIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC); -} - -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @brief Clear Clock security system interrupt flag - * @rmtoll CIR CSSC LL_RCC_ClearFlag_HSECSS - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearFlag_HSECSS(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_CSSC); -} - -/** - * @brief Check if LSI ready interrupt occurred or not - * @rmtoll CIR LSIRDYF LL_RCC_IsActiveFlag_LSIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LSIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_LSIRDYF) == (RCC_CIR_LSIRDYF)); -} - -/** - * @brief Check if LSE ready interrupt occurred or not - * @rmtoll CIR LSERDYF LL_RCC_IsActiveFlag_LSERDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LSERDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_LSERDYF) == (RCC_CIR_LSERDYF)); -} - -/** - * @brief Check if HSI ready interrupt occurred or not - * @rmtoll CIR HSIRDYF LL_RCC_IsActiveFlag_HSIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_HSIRDYF) == (RCC_CIR_HSIRDYF)); -} - -/** - * @brief Check if HSE ready interrupt occurred or not - * @rmtoll CIR HSERDYF LL_RCC_IsActiveFlag_HSERDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSERDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_HSERDYF) == (RCC_CIR_HSERDYF)); -} - -/** - * @brief Check if PLL ready interrupt occurred or not - * @rmtoll CIR PLLRDYF LL_RCC_IsActiveFlag_PLLRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLRDYF) == (RCC_CIR_PLLRDYF)); -} - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Check if PLLI2S ready interrupt occurred or not - * @rmtoll CIR PLLI2SRDYF LL_RCC_IsActiveFlag_PLLI2SRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLI2SRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYF) == (RCC_CIR_PLLI2SRDYF)); -} -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Check if PLLSAI ready interrupt occurred or not - * @rmtoll CIR PLLSAIRDYF LL_RCC_IsActiveFlag_PLLSAIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLSAIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYF) == (RCC_CIR_PLLSAIRDYF)); -} -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @brief Check if Clock security system interrupt occurred or not - * @rmtoll CIR CSSF LL_RCC_IsActiveFlag_HSECSS - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSECSS(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_CSSF) == (RCC_CIR_CSSF)); -} - -/** - * @brief Check if RCC flag Independent Watchdog reset is set or not. - * @rmtoll CSR IWDGRSTF LL_RCC_IsActiveFlag_IWDGRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_IWDGRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_IWDGRSTF) == (RCC_CSR_IWDGRSTF)); -} - -/** - * @brief Check if RCC flag Low Power reset is set or not. - * @rmtoll CSR LPWRRSTF LL_RCC_IsActiveFlag_LPWRRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LPWRRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_LPWRRSTF) == (RCC_CSR_LPWRRSTF)); -} - -/** - * @brief Check if RCC flag Pin reset is set or not. - * @rmtoll CSR PINRSTF LL_RCC_IsActiveFlag_PINRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PINRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_PINRSTF) == (RCC_CSR_PINRSTF)); -} - -/** - * @brief Check if RCC flag POR/PDR reset is set or not. - * @rmtoll CSR PORRSTF LL_RCC_IsActiveFlag_PORRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PORRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_PORRSTF) == (RCC_CSR_PORRSTF)); -} - -/** - * @brief Check if RCC flag Software reset is set or not. - * @rmtoll CSR SFTRSTF LL_RCC_IsActiveFlag_SFTRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_SFTRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_SFTRSTF) == (RCC_CSR_SFTRSTF)); -} - -/** - * @brief Check if RCC flag Window Watchdog reset is set or not. - * @rmtoll CSR WWDGRSTF LL_RCC_IsActiveFlag_WWDGRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_WWDGRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_WWDGRSTF) == (RCC_CSR_WWDGRSTF)); -} - -#if defined(RCC_CSR_BORRSTF) -/** - * @brief Check if RCC flag BOR reset is set or not. - * @rmtoll CSR BORRSTF LL_RCC_IsActiveFlag_BORRST - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_BORRST(void) -{ - return (READ_BIT(RCC->CSR, RCC_CSR_BORRSTF) == (RCC_CSR_BORRSTF)); -} -#endif /* RCC_CSR_BORRSTF */ - -/** - * @brief Set RMVF bit to clear the reset flags. - * @rmtoll CSR RMVF LL_RCC_ClearResetFlags - * @retval None - */ -__STATIC_INLINE void LL_RCC_ClearResetFlags(void) -{ - SET_BIT(RCC->CSR, RCC_CSR_RMVF); -} - -/** - * @} - */ - -/** @defgroup RCC_LL_EF_IT_Management IT Management - * @{ - */ - -/** - * @brief Enable LSI ready interrupt - * @rmtoll CIR LSIRDYIE LL_RCC_EnableIT_LSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_LSIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_LSIRDYIE); -} - -/** - * @brief Enable LSE ready interrupt - * @rmtoll CIR LSERDYIE LL_RCC_EnableIT_LSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_LSERDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_LSERDYIE); -} - -/** - * @brief Enable HSI ready interrupt - * @rmtoll CIR HSIRDYIE LL_RCC_EnableIT_HSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_HSIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_HSIRDYIE); -} - -/** - * @brief Enable HSE ready interrupt - * @rmtoll CIR HSERDYIE LL_RCC_EnableIT_HSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_HSERDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_HSERDYIE); -} - -/** - * @brief Enable PLL ready interrupt - * @rmtoll CIR PLLRDYIE LL_RCC_EnableIT_PLLRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_PLLRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLRDYIE); -} - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Enable PLLI2S ready interrupt - * @rmtoll CIR PLLI2SRDYIE LL_RCC_EnableIT_PLLI2SRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_PLLI2SRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); -} -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Enable PLLSAI ready interrupt - * @rmtoll CIR PLLSAIRDYIE LL_RCC_EnableIT_PLLSAIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_EnableIT_PLLSAIRDY(void) -{ - SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); -} -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @brief Disable LSI ready interrupt - * @rmtoll CIR LSIRDYIE LL_RCC_DisableIT_LSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_LSIRDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE); -} - -/** - * @brief Disable LSE ready interrupt - * @rmtoll CIR LSERDYIE LL_RCC_DisableIT_LSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_LSERDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_LSERDYIE); -} - -/** - * @brief Disable HSI ready interrupt - * @rmtoll CIR HSIRDYIE LL_RCC_DisableIT_HSIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_HSIRDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_HSIRDYIE); -} - -/** - * @brief Disable HSE ready interrupt - * @rmtoll CIR HSERDYIE LL_RCC_DisableIT_HSERDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_HSERDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_HSERDYIE); -} - -/** - * @brief Disable PLL ready interrupt - * @rmtoll CIR PLLRDYIE LL_RCC_DisableIT_PLLRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_PLLRDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLRDYIE); -} - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Disable PLLI2S ready interrupt - * @rmtoll CIR PLLI2SRDYIE LL_RCC_DisableIT_PLLI2SRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_PLLI2SRDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); -} - -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Disable PLLSAI ready interrupt - * @rmtoll CIR PLLSAIRDYIE LL_RCC_DisableIT_PLLSAIRDY - * @retval None - */ -__STATIC_INLINE void LL_RCC_DisableIT_PLLSAIRDY(void) -{ - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); -} -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @brief Checks if LSI ready interrupt source is enabled or disabled. - * @rmtoll CIR LSIRDYIE LL_RCC_IsEnabledIT_LSIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_LSIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_LSIRDYIE) == (RCC_CIR_LSIRDYIE)); -} - -/** - * @brief Checks if LSE ready interrupt source is enabled or disabled. - * @rmtoll CIR LSERDYIE LL_RCC_IsEnabledIT_LSERDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_LSERDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_LSERDYIE) == (RCC_CIR_LSERDYIE)); -} - -/** - * @brief Checks if HSI ready interrupt source is enabled or disabled. - * @rmtoll CIR HSIRDYIE LL_RCC_IsEnabledIT_HSIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_HSIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_HSIRDYIE) == (RCC_CIR_HSIRDYIE)); -} - -/** - * @brief Checks if HSE ready interrupt source is enabled or disabled. - * @rmtoll CIR HSERDYIE LL_RCC_IsEnabledIT_HSERDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_HSERDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_HSERDYIE) == (RCC_CIR_HSERDYIE)); -} - -/** - * @brief Checks if PLL ready interrupt source is enabled or disabled. - * @rmtoll CIR PLLRDYIE LL_RCC_IsEnabledIT_PLLRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLRDYIE) == (RCC_CIR_PLLRDYIE)); -} - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Checks if PLLI2S ready interrupt source is enabled or disabled. - * @rmtoll CIR PLLI2SRDYIE LL_RCC_IsEnabledIT_PLLI2SRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLI2SRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE) == (RCC_CIR_PLLI2SRDYIE)); -} - -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Checks if PLLSAI ready interrupt source is enabled or disabled. - * @rmtoll CIR PLLSAIRDYIE LL_RCC_IsEnabledIT_PLLSAIRDY - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLSAIRDY(void) -{ - return (READ_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE) == (RCC_CIR_PLLSAIRDYIE)); -} -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup RCC_LL_EF_Init De-initialization function - * @{ - */ -ErrorStatus LL_RCC_DeInit(void); -/** - * @} - */ - -/** @defgroup RCC_LL_EF_Get_Freq Get system and peripherals clocks frequency functions - * @{ - */ -void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks); -#if defined(FMPI2C1) -uint32_t LL_RCC_GetFMPI2CClockFreq(uint32_t FMPI2CxSource); -#endif /* FMPI2C1 */ -#if defined(LPTIM1) -uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource); -#endif /* LPTIM1 */ -#if defined(SAI1) -uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource); -#endif /* SAI1 */ -#if defined(SDIO) -uint32_t LL_RCC_GetSDIOClockFreq(uint32_t SDIOxSource); -#endif /* SDIO */ -#if defined(RNG) -uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource); -#endif /* RNG */ -#if defined(USB_OTG_FS) || defined(USB_OTG_HS) -uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource); -#endif /* USB_OTG_FS || USB_OTG_HS */ -#if defined(DFSDM1_Channel0) -uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource); -uint32_t LL_RCC_GetDFSDMAudioClockFreq(uint32_t DFSDMxSource); -#endif /* DFSDM1_Channel0 */ -uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource); -#if defined(CEC) -uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource); -#endif /* CEC */ -#if defined(LTDC) -uint32_t LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource); -#endif /* LTDC */ -#if defined(SPDIFRX) -uint32_t LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource); -#endif /* SPDIFRX */ -#if defined(DSI) -uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource); -#endif /* DSI */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined(RCC) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_RCC_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h deleted file mode 100644 index 164cbb9..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h +++ /dev/null @@ -1,2042 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_spi.h - * @author MCD Application Team - * @brief Header file of SPI LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_LL_SPI_H -#define STM32F4xx_LL_SPI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (SPI1) || defined (SPI2) || defined (SPI3) || defined (SPI4) || defined (SPI5) || defined(SPI6) - -/** @defgroup SPI_LL SPI - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup SPI_LL_ES_INIT SPI Exported Init structure - * @{ - */ - -/** - * @brief SPI Init structures definition - */ -typedef struct -{ - uint32_t TransferDirection; /*!< Specifies the SPI unidirectional or bidirectional data mode. - This parameter can be a value of @ref SPI_LL_EC_TRANSFER_MODE. - - This feature can be modified afterwards using unitary - function @ref LL_SPI_SetTransferDirection().*/ - - uint32_t Mode; /*!< Specifies the SPI mode (Master/Slave). - This parameter can be a value of @ref SPI_LL_EC_MODE. - - This feature can be modified afterwards using unitary - function @ref LL_SPI_SetMode().*/ - - uint32_t DataWidth; /*!< Specifies the SPI data width. - This parameter can be a value of @ref SPI_LL_EC_DATAWIDTH. - - This feature can be modified afterwards using unitary - function @ref LL_SPI_SetDataWidth().*/ - - uint32_t ClockPolarity; /*!< Specifies the serial clock steady state. - This parameter can be a value of @ref SPI_LL_EC_POLARITY. - - This feature can be modified afterwards using unitary - function @ref LL_SPI_SetClockPolarity().*/ - - uint32_t ClockPhase; /*!< Specifies the clock active edge for the bit capture. - This parameter can be a value of @ref SPI_LL_EC_PHASE. - - This feature can be modified afterwards using unitary - function @ref LL_SPI_SetClockPhase().*/ - - uint32_t NSS; /*!< Specifies whether the NSS signal is managed by hardware (NSS pin) - or by software using the SSI bit. - This parameter can be a value of @ref SPI_LL_EC_NSS_MODE. - - This feature can be modified afterwards using unitary - function @ref LL_SPI_SetNSSMode().*/ - - uint32_t BaudRate; /*!< Specifies the BaudRate prescaler value which will be used - to configure the transmit and receive SCK clock. - This parameter can be a value of @ref SPI_LL_EC_BAUDRATEPRESCALER. - @note The communication clock is derived from the master clock. - The slave clock does not need to be set. - - This feature can be modified afterwards using unitary - function @ref LL_SPI_SetBaudRatePrescaler().*/ - - uint32_t BitOrder; /*!< Specifies whether data transfers start from MSB or LSB bit. - This parameter can be a value of @ref SPI_LL_EC_BIT_ORDER. - - This feature can be modified afterwards using unitary - function @ref LL_SPI_SetTransferBitOrder().*/ - - uint32_t CRCCalculation; /*!< Specifies if the CRC calculation is enabled or not. - This parameter can be a value of @ref SPI_LL_EC_CRC_CALCULATION. - - This feature can be modified afterwards using unitary - functions @ref LL_SPI_EnableCRC() and @ref LL_SPI_DisableCRC().*/ - - uint32_t CRCPoly; /*!< Specifies the polynomial used for the CRC calculation. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFFFF. - - This feature can be modified afterwards using unitary - function @ref LL_SPI_SetCRCPolynomial().*/ - -} LL_SPI_InitTypeDef; - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SPI_LL_Exported_Constants SPI Exported Constants - * @{ - */ - -/** @defgroup SPI_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_SPI_ReadReg function - * @{ - */ -#define LL_SPI_SR_RXNE SPI_SR_RXNE /*!< Rx buffer not empty flag */ -#define LL_SPI_SR_TXE SPI_SR_TXE /*!< Tx buffer empty flag */ -#define LL_SPI_SR_BSY SPI_SR_BSY /*!< Busy flag */ -#define LL_SPI_SR_CRCERR SPI_SR_CRCERR /*!< CRC error flag */ -#define LL_SPI_SR_MODF SPI_SR_MODF /*!< Mode fault flag */ -#define LL_SPI_SR_OVR SPI_SR_OVR /*!< Overrun flag */ -#define LL_SPI_SR_FRE SPI_SR_FRE /*!< TI mode frame format error flag */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_SPI_ReadReg and LL_SPI_WriteReg functions - * @{ - */ -#define LL_SPI_CR2_RXNEIE SPI_CR2_RXNEIE /*!< Rx buffer not empty interrupt enable */ -#define LL_SPI_CR2_TXEIE SPI_CR2_TXEIE /*!< Tx buffer empty interrupt enable */ -#define LL_SPI_CR2_ERRIE SPI_CR2_ERRIE /*!< Error interrupt enable */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_MODE Operation Mode - * @{ - */ -#define LL_SPI_MODE_MASTER (SPI_CR1_MSTR | SPI_CR1_SSI) /*!< Master configuration */ -#define LL_SPI_MODE_SLAVE 0x00000000U /*!< Slave configuration */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_PROTOCOL Serial Protocol - * @{ - */ -#define LL_SPI_PROTOCOL_MOTOROLA 0x00000000U /*!< Motorola mode. Used as default value */ -#define LL_SPI_PROTOCOL_TI (SPI_CR2_FRF) /*!< TI mode */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_PHASE Clock Phase - * @{ - */ -#define LL_SPI_PHASE_1EDGE 0x00000000U /*!< First clock transition is the first data capture edge */ -#define LL_SPI_PHASE_2EDGE (SPI_CR1_CPHA) /*!< Second clock transition is the first data capture edge */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_POLARITY Clock Polarity - * @{ - */ -#define LL_SPI_POLARITY_LOW 0x00000000U /*!< Clock to 0 when idle */ -#define LL_SPI_POLARITY_HIGH (SPI_CR1_CPOL) /*!< Clock to 1 when idle */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_BAUDRATEPRESCALER Baud Rate Prescaler - * @{ - */ -#define LL_SPI_BAUDRATEPRESCALER_DIV2 0x00000000U /*!< BaudRate control equal to fPCLK/2 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV4 (SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/4 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV8 (SPI_CR1_BR_1) /*!< BaudRate control equal to fPCLK/8 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV16 (SPI_CR1_BR_1 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/16 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV32 (SPI_CR1_BR_2) /*!< BaudRate control equal to fPCLK/32 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV64 (SPI_CR1_BR_2 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/64 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV128 (SPI_CR1_BR_2 | SPI_CR1_BR_1) /*!< BaudRate control equal to fPCLK/128 */ -#define LL_SPI_BAUDRATEPRESCALER_DIV256 (SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/256 */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_BIT_ORDER Transmission Bit Order - * @{ - */ -#define LL_SPI_LSB_FIRST (SPI_CR1_LSBFIRST) /*!< Data is transmitted/received with the LSB first */ -#define LL_SPI_MSB_FIRST 0x00000000U /*!< Data is transmitted/received with the MSB first */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_TRANSFER_MODE Transfer Mode - * @{ - */ -#define LL_SPI_FULL_DUPLEX 0x00000000U /*!< Full-Duplex mode. Rx and Tx transfer on 2 lines */ -#define LL_SPI_SIMPLEX_RX (SPI_CR1_RXONLY) /*!< Simplex Rx mode. Rx transfer only on 1 line */ -#define LL_SPI_HALF_DUPLEX_RX (SPI_CR1_BIDIMODE) /*!< Half-Duplex Rx mode. Rx transfer on 1 line */ -#define LL_SPI_HALF_DUPLEX_TX (SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE) /*!< Half-Duplex Tx mode. Tx transfer on 1 line */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_NSS_MODE Slave Select Pin Mode - * @{ - */ -#define LL_SPI_NSS_SOFT (SPI_CR1_SSM) /*!< NSS managed internally. NSS pin not used and free */ -#define LL_SPI_NSS_HARD_INPUT 0x00000000U /*!< NSS pin used in Input. Only used in Master mode */ -#define LL_SPI_NSS_HARD_OUTPUT (((uint32_t)SPI_CR2_SSOE << 16U)) /*!< NSS pin used in Output. Only used in Slave mode as chip select */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_DATAWIDTH Datawidth - * @{ - */ -#define LL_SPI_DATAWIDTH_8BIT 0x00000000U /*!< Data length for SPI transfer: 8 bits */ -#define LL_SPI_DATAWIDTH_16BIT (SPI_CR1_DFF) /*!< Data length for SPI transfer: 16 bits */ -/** - * @} - */ -#if defined(USE_FULL_LL_DRIVER) - -/** @defgroup SPI_LL_EC_CRC_CALCULATION CRC Calculation - * @{ - */ -#define LL_SPI_CRCCALCULATION_DISABLE 0x00000000U /*!< CRC calculation disabled */ -#define LL_SPI_CRCCALCULATION_ENABLE (SPI_CR1_CRCEN) /*!< CRC calculation enabled */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup SPI_LL_Exported_Macros SPI Exported Macros - * @{ - */ - -/** @defgroup SPI_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in SPI register - * @param __INSTANCE__ SPI Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_SPI_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in SPI register - * @param __INSTANCE__ SPI Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_SPI_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup SPI_LL_Exported_Functions SPI Exported Functions - * @{ - */ - -/** @defgroup SPI_LL_EF_Configuration Configuration - * @{ - */ - -/** - * @brief Enable SPI peripheral - * @rmtoll CR1 SPE LL_SPI_Enable - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_Enable(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR1, SPI_CR1_SPE); -} - -/** - * @brief Disable SPI peripheral - * @note When disabling the SPI, follow the procedure described in the Reference Manual. - * @rmtoll CR1 SPE LL_SPI_Disable - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_Disable(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR1, SPI_CR1_SPE); -} - -/** - * @brief Check if SPI peripheral is enabled - * @rmtoll CR1 SPE LL_SPI_IsEnabled - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabled(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR1, SPI_CR1_SPE) == (SPI_CR1_SPE)) ? 1UL : 0UL); -} - -/** - * @brief Set SPI operation mode to Master or Slave - * @note This bit should not be changed when communication is ongoing. - * @rmtoll CR1 MSTR LL_SPI_SetMode\n - * CR1 SSI LL_SPI_SetMode - * @param SPIx SPI Instance - * @param Mode This parameter can be one of the following values: - * @arg @ref LL_SPI_MODE_MASTER - * @arg @ref LL_SPI_MODE_SLAVE - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetMode(SPI_TypeDef *SPIx, uint32_t Mode) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_MSTR | SPI_CR1_SSI, Mode); -} - -/** - * @brief Get SPI operation mode (Master or Slave) - * @rmtoll CR1 MSTR LL_SPI_GetMode\n - * CR1 SSI LL_SPI_GetMode - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_MODE_MASTER - * @arg @ref LL_SPI_MODE_SLAVE - */ -__STATIC_INLINE uint32_t LL_SPI_GetMode(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_MSTR | SPI_CR1_SSI)); -} - -/** - * @brief Set serial protocol used - * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. - * @rmtoll CR2 FRF LL_SPI_SetStandard - * @param SPIx SPI Instance - * @param Standard This parameter can be one of the following values: - * @arg @ref LL_SPI_PROTOCOL_MOTOROLA - * @arg @ref LL_SPI_PROTOCOL_TI - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetStandard(SPI_TypeDef *SPIx, uint32_t Standard) -{ - MODIFY_REG(SPIx->CR2, SPI_CR2_FRF, Standard); -} - -/** - * @brief Get serial protocol used - * @rmtoll CR2 FRF LL_SPI_GetStandard - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_PROTOCOL_MOTOROLA - * @arg @ref LL_SPI_PROTOCOL_TI - */ -__STATIC_INLINE uint32_t LL_SPI_GetStandard(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_FRF)); -} - -/** - * @brief Set clock phase - * @note This bit should not be changed when communication is ongoing. - * This bit is not used in SPI TI mode. - * @rmtoll CR1 CPHA LL_SPI_SetClockPhase - * @param SPIx SPI Instance - * @param ClockPhase This parameter can be one of the following values: - * @arg @ref LL_SPI_PHASE_1EDGE - * @arg @ref LL_SPI_PHASE_2EDGE - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetClockPhase(SPI_TypeDef *SPIx, uint32_t ClockPhase) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_CPHA, ClockPhase); -} - -/** - * @brief Get clock phase - * @rmtoll CR1 CPHA LL_SPI_GetClockPhase - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_PHASE_1EDGE - * @arg @ref LL_SPI_PHASE_2EDGE - */ -__STATIC_INLINE uint32_t LL_SPI_GetClockPhase(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_CPHA)); -} - -/** - * @brief Set clock polarity - * @note This bit should not be changed when communication is ongoing. - * This bit is not used in SPI TI mode. - * @rmtoll CR1 CPOL LL_SPI_SetClockPolarity - * @param SPIx SPI Instance - * @param ClockPolarity This parameter can be one of the following values: - * @arg @ref LL_SPI_POLARITY_LOW - * @arg @ref LL_SPI_POLARITY_HIGH - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetClockPolarity(SPI_TypeDef *SPIx, uint32_t ClockPolarity) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_CPOL, ClockPolarity); -} - -/** - * @brief Get clock polarity - * @rmtoll CR1 CPOL LL_SPI_GetClockPolarity - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_POLARITY_LOW - * @arg @ref LL_SPI_POLARITY_HIGH - */ -__STATIC_INLINE uint32_t LL_SPI_GetClockPolarity(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_CPOL)); -} - -/** - * @brief Set baud rate prescaler - * @note These bits should not be changed when communication is ongoing. SPI BaudRate = fPCLK/Prescaler. - * @rmtoll CR1 BR LL_SPI_SetBaudRatePrescaler - * @param SPIx SPI Instance - * @param BaudRate This parameter can be one of the following values: - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV2 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV4 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV8 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV16 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV32 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV64 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV128 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV256 - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetBaudRatePrescaler(SPI_TypeDef *SPIx, uint32_t BaudRate) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_BR, BaudRate); -} - -/** - * @brief Get baud rate prescaler - * @rmtoll CR1 BR LL_SPI_GetBaudRatePrescaler - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV2 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV4 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV8 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV16 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV32 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV64 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV128 - * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV256 - */ -__STATIC_INLINE uint32_t LL_SPI_GetBaudRatePrescaler(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_BR)); -} - -/** - * @brief Set transfer bit order - * @note This bit should not be changed when communication is ongoing. This bit is not used in SPI TI mode. - * @rmtoll CR1 LSBFIRST LL_SPI_SetTransferBitOrder - * @param SPIx SPI Instance - * @param BitOrder This parameter can be one of the following values: - * @arg @ref LL_SPI_LSB_FIRST - * @arg @ref LL_SPI_MSB_FIRST - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetTransferBitOrder(SPI_TypeDef *SPIx, uint32_t BitOrder) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_LSBFIRST, BitOrder); -} - -/** - * @brief Get transfer bit order - * @rmtoll CR1 LSBFIRST LL_SPI_GetTransferBitOrder - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_LSB_FIRST - * @arg @ref LL_SPI_MSB_FIRST - */ -__STATIC_INLINE uint32_t LL_SPI_GetTransferBitOrder(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_LSBFIRST)); -} - -/** - * @brief Set transfer direction mode - * @note For Half-Duplex mode, Rx Direction is set by default. - * In master mode, the MOSI pin is used and in slave mode, the MISO pin is used for Half-Duplex. - * @rmtoll CR1 RXONLY LL_SPI_SetTransferDirection\n - * CR1 BIDIMODE LL_SPI_SetTransferDirection\n - * CR1 BIDIOE LL_SPI_SetTransferDirection - * @param SPIx SPI Instance - * @param TransferDirection This parameter can be one of the following values: - * @arg @ref LL_SPI_FULL_DUPLEX - * @arg @ref LL_SPI_SIMPLEX_RX - * @arg @ref LL_SPI_HALF_DUPLEX_RX - * @arg @ref LL_SPI_HALF_DUPLEX_TX - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetTransferDirection(SPI_TypeDef *SPIx, uint32_t TransferDirection) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE, TransferDirection); -} - -/** - * @brief Get transfer direction mode - * @rmtoll CR1 RXONLY LL_SPI_GetTransferDirection\n - * CR1 BIDIMODE LL_SPI_GetTransferDirection\n - * CR1 BIDIOE LL_SPI_GetTransferDirection - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_FULL_DUPLEX - * @arg @ref LL_SPI_SIMPLEX_RX - * @arg @ref LL_SPI_HALF_DUPLEX_RX - * @arg @ref LL_SPI_HALF_DUPLEX_TX - */ -__STATIC_INLINE uint32_t LL_SPI_GetTransferDirection(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE)); -} - -/** - * @brief Set frame data width - * @rmtoll CR1 DFF LL_SPI_SetDataWidth - * @param SPIx SPI Instance - * @param DataWidth This parameter can be one of the following values: - * @arg @ref LL_SPI_DATAWIDTH_8BIT - * @arg @ref LL_SPI_DATAWIDTH_16BIT - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetDataWidth(SPI_TypeDef *SPIx, uint32_t DataWidth) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_DFF, DataWidth); -} - -/** - * @brief Get frame data width - * @rmtoll CR1 DFF LL_SPI_GetDataWidth - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_DATAWIDTH_8BIT - * @arg @ref LL_SPI_DATAWIDTH_16BIT - */ -__STATIC_INLINE uint32_t LL_SPI_GetDataWidth(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_DFF)); -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_CRC_Management CRC Management - * @{ - */ - -/** - * @brief Enable CRC - * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. - * @rmtoll CR1 CRCEN LL_SPI_EnableCRC - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableCRC(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR1, SPI_CR1_CRCEN); -} - -/** - * @brief Disable CRC - * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. - * @rmtoll CR1 CRCEN LL_SPI_DisableCRC - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableCRC(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR1, SPI_CR1_CRCEN); -} - -/** - * @brief Check if CRC is enabled - * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. - * @rmtoll CR1 CRCEN LL_SPI_IsEnabledCRC - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledCRC(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR1, SPI_CR1_CRCEN) == (SPI_CR1_CRCEN)) ? 1UL : 0UL); -} - -/** - * @brief Set CRCNext to transfer CRC on the line - * @note This bit has to be written as soon as the last data is written in the SPIx_DR register. - * @rmtoll CR1 CRCNEXT LL_SPI_SetCRCNext - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetCRCNext(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR1, SPI_CR1_CRCNEXT); -} - -/** - * @brief Set polynomial for CRC calculation - * @rmtoll CRCPR CRCPOLY LL_SPI_SetCRCPolynomial - * @param SPIx SPI Instance - * @param CRCPoly This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFFFF - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetCRCPolynomial(SPI_TypeDef *SPIx, uint32_t CRCPoly) -{ - WRITE_REG(SPIx->CRCPR, (uint16_t)CRCPoly); -} - -/** - * @brief Get polynomial for CRC calculation - * @rmtoll CRCPR CRCPOLY LL_SPI_GetCRCPolynomial - * @param SPIx SPI Instance - * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF - */ -__STATIC_INLINE uint32_t LL_SPI_GetCRCPolynomial(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_REG(SPIx->CRCPR)); -} - -/** - * @brief Get Rx CRC - * @rmtoll RXCRCR RXCRC LL_SPI_GetRxCRC - * @param SPIx SPI Instance - * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF - */ -__STATIC_INLINE uint32_t LL_SPI_GetRxCRC(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_REG(SPIx->RXCRCR)); -} - -/** - * @brief Get Tx CRC - * @rmtoll TXCRCR TXCRC LL_SPI_GetTxCRC - * @param SPIx SPI Instance - * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF - */ -__STATIC_INLINE uint32_t LL_SPI_GetTxCRC(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_REG(SPIx->TXCRCR)); -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_NSS_Management Slave Select Pin Management - * @{ - */ - -/** - * @brief Set NSS mode - * @note LL_SPI_NSS_SOFT Mode is not used in SPI TI mode. - * @rmtoll CR1 SSM LL_SPI_SetNSSMode\n - * @rmtoll CR2 SSOE LL_SPI_SetNSSMode - * @param SPIx SPI Instance - * @param NSS This parameter can be one of the following values: - * @arg @ref LL_SPI_NSS_SOFT - * @arg @ref LL_SPI_NSS_HARD_INPUT - * @arg @ref LL_SPI_NSS_HARD_OUTPUT - * @retval None - */ -__STATIC_INLINE void LL_SPI_SetNSSMode(SPI_TypeDef *SPIx, uint32_t NSS) -{ - MODIFY_REG(SPIx->CR1, SPI_CR1_SSM, NSS); - MODIFY_REG(SPIx->CR2, SPI_CR2_SSOE, ((uint32_t)(NSS >> 16U))); -} - -/** - * @brief Get NSS mode - * @rmtoll CR1 SSM LL_SPI_GetNSSMode\n - * @rmtoll CR2 SSOE LL_SPI_GetNSSMode - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_SPI_NSS_SOFT - * @arg @ref LL_SPI_NSS_HARD_INPUT - * @arg @ref LL_SPI_NSS_HARD_OUTPUT - */ -__STATIC_INLINE uint32_t LL_SPI_GetNSSMode(const SPI_TypeDef *SPIx) -{ - uint32_t Ssm = (READ_BIT(SPIx->CR1, SPI_CR1_SSM)); - uint32_t Ssoe = (READ_BIT(SPIx->CR2, SPI_CR2_SSOE) << 16U); - return (Ssm | Ssoe); -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_FLAG_Management FLAG Management - * @{ - */ - -/** - * @brief Check if Rx buffer is not empty - * @rmtoll SR RXNE LL_SPI_IsActiveFlag_RXNE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_RXNE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_RXNE) == (SPI_SR_RXNE)) ? 1UL : 0UL); -} - -/** - * @brief Check if Tx buffer is empty - * @rmtoll SR TXE LL_SPI_IsActiveFlag_TXE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_TXE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_TXE) == (SPI_SR_TXE)) ? 1UL : 0UL); -} - -/** - * @brief Get CRC error flag - * @rmtoll SR CRCERR LL_SPI_IsActiveFlag_CRCERR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_CRCERR(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_CRCERR) == (SPI_SR_CRCERR)) ? 1UL : 0UL); -} - -/** - * @brief Get mode fault error flag - * @rmtoll SR MODF LL_SPI_IsActiveFlag_MODF - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_MODF(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_MODF) == (SPI_SR_MODF)) ? 1UL : 0UL); -} - -/** - * @brief Get overrun error flag - * @rmtoll SR OVR LL_SPI_IsActiveFlag_OVR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_OVR(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_OVR) == (SPI_SR_OVR)) ? 1UL : 0UL); -} - -/** - * @brief Get busy flag - * @note The BSY flag is cleared under any one of the following conditions: - * -When the SPI is correctly disabled - * -When a fault is detected in Master mode (MODF bit set to 1) - * -In Master mode, when it finishes a data transmission and no new data is ready to be - * sent - * -In Slave mode, when the BSY flag is set to '0' for at least one SPI clock cycle between - * each data transfer. - * @rmtoll SR BSY LL_SPI_IsActiveFlag_BSY - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_BSY(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_BSY) == (SPI_SR_BSY)) ? 1UL : 0UL); -} - -/** - * @brief Get frame format error flag - * @rmtoll SR FRE LL_SPI_IsActiveFlag_FRE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_FRE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_FRE) == (SPI_SR_FRE)) ? 1UL : 0UL); -} - -/** - * @brief Clear CRC error flag - * @rmtoll SR CRCERR LL_SPI_ClearFlag_CRCERR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_ClearFlag_CRCERR(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->SR, SPI_SR_CRCERR); -} - -/** - * @brief Clear mode fault error flag - * @note Clearing this flag is done by a read access to the SPIx_SR - * register followed by a write access to the SPIx_CR1 register - * @rmtoll SR MODF LL_SPI_ClearFlag_MODF - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_ClearFlag_MODF(SPI_TypeDef *SPIx) -{ - __IO uint32_t tmpreg_sr; - tmpreg_sr = SPIx->SR; - (void) tmpreg_sr; - CLEAR_BIT(SPIx->CR1, SPI_CR1_SPE); -} - -/** - * @brief Clear overrun error flag - * @note Clearing this flag is done by a read access to the SPIx_DR - * register followed by a read access to the SPIx_SR register - * @rmtoll SR OVR LL_SPI_ClearFlag_OVR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_ClearFlag_OVR(const SPI_TypeDef *SPIx) -{ - __IO uint32_t tmpreg; - tmpreg = SPIx->DR; - (void) tmpreg; - tmpreg = SPIx->SR; - (void) tmpreg; -} - -/** - * @brief Clear frame format error flag - * @note Clearing this flag is done by reading SPIx_SR register - * @rmtoll SR FRE LL_SPI_ClearFlag_FRE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_ClearFlag_FRE(const SPI_TypeDef *SPIx) -{ - __IO uint32_t tmpreg; - tmpreg = SPIx->SR; - (void) tmpreg; -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_IT_Management Interrupt Management - * @{ - */ - -/** - * @brief Enable error interrupt - * @note This bit controls the generation of an interrupt when an error condition - * occurs (CRCERR, OVR, MODF in SPI mode, FRE at TI mode). - * @rmtoll CR2 ERRIE LL_SPI_EnableIT_ERR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableIT_ERR(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR2, SPI_CR2_ERRIE); -} - -/** - * @brief Enable Rx buffer not empty interrupt - * @rmtoll CR2 RXNEIE LL_SPI_EnableIT_RXNE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableIT_RXNE(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR2, SPI_CR2_RXNEIE); -} - -/** - * @brief Enable Tx buffer empty interrupt - * @rmtoll CR2 TXEIE LL_SPI_EnableIT_TXE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableIT_TXE(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR2, SPI_CR2_TXEIE); -} - -/** - * @brief Disable error interrupt - * @note This bit controls the generation of an interrupt when an error condition - * occurs (CRCERR, OVR, MODF in SPI mode, FRE at TI mode). - * @rmtoll CR2 ERRIE LL_SPI_DisableIT_ERR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableIT_ERR(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR2, SPI_CR2_ERRIE); -} - -/** - * @brief Disable Rx buffer not empty interrupt - * @rmtoll CR2 RXNEIE LL_SPI_DisableIT_RXNE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableIT_RXNE(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR2, SPI_CR2_RXNEIE); -} - -/** - * @brief Disable Tx buffer empty interrupt - * @rmtoll CR2 TXEIE LL_SPI_DisableIT_TXE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableIT_TXE(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR2, SPI_CR2_TXEIE); -} - -/** - * @brief Check if error interrupt is enabled - * @rmtoll CR2 ERRIE LL_SPI_IsEnabledIT_ERR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_ERR(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR2, SPI_CR2_ERRIE) == (SPI_CR2_ERRIE)) ? 1UL : 0UL); -} - -/** - * @brief Check if Rx buffer not empty interrupt is enabled - * @rmtoll CR2 RXNEIE LL_SPI_IsEnabledIT_RXNE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_RXNE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR2, SPI_CR2_RXNEIE) == (SPI_CR2_RXNEIE)) ? 1UL : 0UL); -} - -/** - * @brief Check if Tx buffer empty interrupt - * @rmtoll CR2 TXEIE LL_SPI_IsEnabledIT_TXE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_TXE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR2, SPI_CR2_TXEIE) == (SPI_CR2_TXEIE)) ? 1UL : 0UL); -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_DMA_Management DMA Management - * @{ - */ - -/** - * @brief Enable DMA Rx - * @rmtoll CR2 RXDMAEN LL_SPI_EnableDMAReq_RX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableDMAReq_RX(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR2, SPI_CR2_RXDMAEN); -} - -/** - * @brief Disable DMA Rx - * @rmtoll CR2 RXDMAEN LL_SPI_DisableDMAReq_RX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableDMAReq_RX(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR2, SPI_CR2_RXDMAEN); -} - -/** - * @brief Check if DMA Rx is enabled - * @rmtoll CR2 RXDMAEN LL_SPI_IsEnabledDMAReq_RX - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledDMAReq_RX(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR2, SPI_CR2_RXDMAEN) == (SPI_CR2_RXDMAEN)) ? 1UL : 0UL); -} - -/** - * @brief Enable DMA Tx - * @rmtoll CR2 TXDMAEN LL_SPI_EnableDMAReq_TX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_EnableDMAReq_TX(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->CR2, SPI_CR2_TXDMAEN); -} - -/** - * @brief Disable DMA Tx - * @rmtoll CR2 TXDMAEN LL_SPI_DisableDMAReq_TX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_SPI_DisableDMAReq_TX(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->CR2, SPI_CR2_TXDMAEN); -} - -/** - * @brief Check if DMA Tx is enabled - * @rmtoll CR2 TXDMAEN LL_SPI_IsEnabledDMAReq_TX - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SPI_IsEnabledDMAReq_TX(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->CR2, SPI_CR2_TXDMAEN) == (SPI_CR2_TXDMAEN)) ? 1UL : 0UL); -} - -/** - * @brief Get the data register address used for DMA transfer - * @rmtoll DR DR LL_SPI_DMA_GetRegAddr - * @param SPIx SPI Instance - * @retval Address of data register - */ -__STATIC_INLINE uint32_t LL_SPI_DMA_GetRegAddr(const SPI_TypeDef *SPIx) -{ - return (uint32_t) &(SPIx->DR); -} - -/** - * @} - */ - -/** @defgroup SPI_LL_EF_DATA_Management DATA Management - * @{ - */ - -/** - * @brief Read 8-Bits in the data register - * @rmtoll DR DR LL_SPI_ReceiveData8 - * @param SPIx SPI Instance - * @retval RxData Value between Min_Data=0x00 and Max_Data=0xFF - */ -__STATIC_INLINE uint8_t LL_SPI_ReceiveData8(SPI_TypeDef *SPIx) -{ - return (*((__IO uint8_t *)&SPIx->DR)); -} - -/** - * @brief Read 16-Bits in the data register - * @rmtoll DR DR LL_SPI_ReceiveData16 - * @param SPIx SPI Instance - * @retval RxData Value between Min_Data=0x00 and Max_Data=0xFFFF - */ -__STATIC_INLINE uint16_t LL_SPI_ReceiveData16(SPI_TypeDef *SPIx) -{ - return (uint16_t)(READ_REG(SPIx->DR)); -} - -/** - * @brief Write 8-Bits in the data register - * @rmtoll DR DR LL_SPI_TransmitData8 - * @param SPIx SPI Instance - * @param TxData Value between Min_Data=0x00 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_SPI_TransmitData8(SPI_TypeDef *SPIx, uint8_t TxData) -{ -#if defined (__GNUC__) - __IO uint8_t *spidr = ((__IO uint8_t *)&SPIx->DR); - *spidr = TxData; -#else - *((__IO uint8_t *)&SPIx->DR) = TxData; -#endif /* __GNUC__ */ -} - -/** - * @brief Write 16-Bits in the data register - * @rmtoll DR DR LL_SPI_TransmitData16 - * @param SPIx SPI Instance - * @param TxData Value between Min_Data=0x00 and Max_Data=0xFFFF - * @retval None - */ -__STATIC_INLINE void LL_SPI_TransmitData16(SPI_TypeDef *SPIx, uint16_t TxData) -{ -#if defined (__GNUC__) - __IO uint16_t *spidr = ((__IO uint16_t *)&SPIx->DR); - *spidr = TxData; -#else - SPIx->DR = TxData; -#endif /* __GNUC__ */ -} - -/** - * @} - */ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup SPI_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -ErrorStatus LL_SPI_DeInit(const SPI_TypeDef *SPIx); -ErrorStatus LL_SPI_Init(SPI_TypeDef *SPIx, LL_SPI_InitTypeDef *SPI_InitStruct); -void LL_SPI_StructInit(LL_SPI_InitTypeDef *SPI_InitStruct); - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup I2S_LL I2S - * @{ - */ - -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup I2S_LL_ES_INIT I2S Exported Init structure - * @{ - */ - -/** - * @brief I2S Init structure definition - */ - -typedef struct -{ - uint32_t Mode; /*!< Specifies the I2S operating mode. - This parameter can be a value of @ref I2S_LL_EC_MODE - - This feature can be modified afterwards using unitary function @ref LL_I2S_SetTransferMode().*/ - - uint32_t Standard; /*!< Specifies the standard used for the I2S communication. - This parameter can be a value of @ref I2S_LL_EC_STANDARD - - This feature can be modified afterwards using unitary function @ref LL_I2S_SetStandard().*/ - - - uint32_t DataFormat; /*!< Specifies the data format for the I2S communication. - This parameter can be a value of @ref I2S_LL_EC_DATA_FORMAT - - This feature can be modified afterwards using unitary function @ref LL_I2S_SetDataFormat().*/ - - - uint32_t MCLKOutput; /*!< Specifies whether the I2S MCLK output is enabled or not. - This parameter can be a value of @ref I2S_LL_EC_MCLK_OUTPUT - - This feature can be modified afterwards using unitary functions @ref LL_I2S_EnableMasterClock() or @ref LL_I2S_DisableMasterClock.*/ - - - uint32_t AudioFreq; /*!< Specifies the frequency selected for the I2S communication. - This parameter can be a value of @ref I2S_LL_EC_AUDIO_FREQ - - Audio Frequency can be modified afterwards using Reference manual formulas to calculate Prescaler Linear, Parity - and unitary functions @ref LL_I2S_SetPrescalerLinear() and @ref LL_I2S_SetPrescalerParity() to set it.*/ - - - uint32_t ClockPolarity; /*!< Specifies the idle state of the I2S clock. - This parameter can be a value of @ref I2S_LL_EC_POLARITY - - This feature can be modified afterwards using unitary function @ref LL_I2S_SetClockPolarity().*/ - -} LL_I2S_InitTypeDef; - -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup I2S_LL_Exported_Constants I2S Exported Constants - * @{ - */ - -/** @defgroup I2S_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_I2S_ReadReg function - * @{ - */ -#define LL_I2S_SR_RXNE LL_SPI_SR_RXNE /*!< Rx buffer not empty flag */ -#define LL_I2S_SR_TXE LL_SPI_SR_TXE /*!< Tx buffer empty flag */ -#define LL_I2S_SR_BSY LL_SPI_SR_BSY /*!< Busy flag */ -#define LL_I2S_SR_UDR SPI_SR_UDR /*!< Underrun flag */ -#define LL_I2S_SR_OVR LL_SPI_SR_OVR /*!< Overrun flag */ -#define LL_I2S_SR_FRE LL_SPI_SR_FRE /*!< TI mode frame format error flag */ -/** - * @} - */ - -/** @defgroup SPI_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_SPI_ReadReg and LL_SPI_WriteReg functions - * @{ - */ -#define LL_I2S_CR2_RXNEIE LL_SPI_CR2_RXNEIE /*!< Rx buffer not empty interrupt enable */ -#define LL_I2S_CR2_TXEIE LL_SPI_CR2_TXEIE /*!< Tx buffer empty interrupt enable */ -#define LL_I2S_CR2_ERRIE LL_SPI_CR2_ERRIE /*!< Error interrupt enable */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_DATA_FORMAT Data format - * @{ - */ -#define LL_I2S_DATAFORMAT_16B 0x00000000U /*!< Data length 16 bits, Channel length 16bit */ -#define LL_I2S_DATAFORMAT_16B_EXTENDED (SPI_I2SCFGR_CHLEN) /*!< Data length 16 bits, Channel length 32bit */ -#define LL_I2S_DATAFORMAT_24B (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN_0) /*!< Data length 24 bits, Channel length 32bit */ -#define LL_I2S_DATAFORMAT_32B (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN_1) /*!< Data length 16 bits, Channel length 32bit */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_POLARITY Clock Polarity - * @{ - */ -#define LL_I2S_POLARITY_LOW 0x00000000U /*!< Clock steady state is low level */ -#define LL_I2S_POLARITY_HIGH (SPI_I2SCFGR_CKPOL) /*!< Clock steady state is high level */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_STANDARD I2s Standard - * @{ - */ -#define LL_I2S_STANDARD_PHILIPS 0x00000000U /*!< I2S standard philips */ -#define LL_I2S_STANDARD_MSB (SPI_I2SCFGR_I2SSTD_0) /*!< MSB justified standard (left justified) */ -#define LL_I2S_STANDARD_LSB (SPI_I2SCFGR_I2SSTD_1) /*!< LSB justified standard (right justified) */ -#define LL_I2S_STANDARD_PCM_SHORT (SPI_I2SCFGR_I2SSTD_0 | SPI_I2SCFGR_I2SSTD_1) /*!< PCM standard, short frame synchronization */ -#define LL_I2S_STANDARD_PCM_LONG (SPI_I2SCFGR_I2SSTD_0 | SPI_I2SCFGR_I2SSTD_1 | SPI_I2SCFGR_PCMSYNC) /*!< PCM standard, long frame synchronization */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_MODE Operation Mode - * @{ - */ -#define LL_I2S_MODE_SLAVE_TX 0x00000000U /*!< Slave Tx configuration */ -#define LL_I2S_MODE_SLAVE_RX (SPI_I2SCFGR_I2SCFG_0) /*!< Slave Rx configuration */ -#define LL_I2S_MODE_MASTER_TX (SPI_I2SCFGR_I2SCFG_1) /*!< Master Tx configuration */ -#define LL_I2S_MODE_MASTER_RX (SPI_I2SCFGR_I2SCFG_0 | SPI_I2SCFGR_I2SCFG_1) /*!< Master Rx configuration */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_PRESCALER_FACTOR Prescaler Factor - * @{ - */ -#define LL_I2S_PRESCALER_PARITY_EVEN 0x00000000U /*!< Odd factor: Real divider value is = I2SDIV * 2 */ -#define LL_I2S_PRESCALER_PARITY_ODD (SPI_I2SPR_ODD >> 8U) /*!< Odd factor: Real divider value is = (I2SDIV * 2)+1 */ -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) - -/** @defgroup I2S_LL_EC_MCLK_OUTPUT MCLK Output - * @{ - */ -#define LL_I2S_MCLK_OUTPUT_DISABLE 0x00000000U /*!< Master clock output is disabled */ -#define LL_I2S_MCLK_OUTPUT_ENABLE (SPI_I2SPR_MCKOE) /*!< Master clock output is enabled */ -/** - * @} - */ - -/** @defgroup I2S_LL_EC_AUDIO_FREQ Audio Frequency - * @{ - */ - -#define LL_I2S_AUDIOFREQ_192K 192000U /*!< Audio Frequency configuration 192000 Hz */ -#define LL_I2S_AUDIOFREQ_96K 96000U /*!< Audio Frequency configuration 96000 Hz */ -#define LL_I2S_AUDIOFREQ_48K 48000U /*!< Audio Frequency configuration 48000 Hz */ -#define LL_I2S_AUDIOFREQ_44K 44100U /*!< Audio Frequency configuration 44100 Hz */ -#define LL_I2S_AUDIOFREQ_32K 32000U /*!< Audio Frequency configuration 32000 Hz */ -#define LL_I2S_AUDIOFREQ_22K 22050U /*!< Audio Frequency configuration 22050 Hz */ -#define LL_I2S_AUDIOFREQ_16K 16000U /*!< Audio Frequency configuration 16000 Hz */ -#define LL_I2S_AUDIOFREQ_11K 11025U /*!< Audio Frequency configuration 11025 Hz */ -#define LL_I2S_AUDIOFREQ_8K 8000U /*!< Audio Frequency configuration 8000 Hz */ -#define LL_I2S_AUDIOFREQ_DEFAULT 2U /*!< Audio Freq not specified. Register I2SDIV = 2 */ -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup I2S_LL_Exported_Macros I2S Exported Macros - * @{ - */ - -/** @defgroup I2S_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in I2S register - * @param __INSTANCE__ I2S Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_I2S_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in I2S register - * @param __INSTANCE__ I2S Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_I2S_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** - * @} - */ - - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup I2S_LL_Exported_Functions I2S Exported Functions - * @{ - */ - -/** @defgroup I2S_LL_EF_Configuration Configuration - * @{ - */ - -/** - * @brief Select I2S mode and Enable I2S peripheral - * @rmtoll I2SCFGR I2SMOD LL_I2S_Enable\n - * I2SCFGR I2SE LL_I2S_Enable - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_Enable(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SMOD | SPI_I2SCFGR_I2SE); -} - -/** - * @brief Disable I2S peripheral - * @rmtoll I2SCFGR I2SE LL_I2S_Disable - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_Disable(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SMOD | SPI_I2SCFGR_I2SE); -} - -/** - * @brief Check if I2S peripheral is enabled - * @rmtoll I2SCFGR I2SE LL_I2S_IsEnabled - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabled(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SE) == (SPI_I2SCFGR_I2SE)) ? 1UL : 0UL); -} - -/** - * @brief Set I2S data frame length - * @rmtoll I2SCFGR DATLEN LL_I2S_SetDataFormat\n - * I2SCFGR CHLEN LL_I2S_SetDataFormat - * @param SPIx SPI Instance - * @param DataFormat This parameter can be one of the following values: - * @arg @ref LL_I2S_DATAFORMAT_16B - * @arg @ref LL_I2S_DATAFORMAT_16B_EXTENDED - * @arg @ref LL_I2S_DATAFORMAT_24B - * @arg @ref LL_I2S_DATAFORMAT_32B - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetDataFormat(SPI_TypeDef *SPIx, uint32_t DataFormat) -{ - MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN, DataFormat); -} - -/** - * @brief Get I2S data frame length - * @rmtoll I2SCFGR DATLEN LL_I2S_GetDataFormat\n - * I2SCFGR CHLEN LL_I2S_GetDataFormat - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2S_DATAFORMAT_16B - * @arg @ref LL_I2S_DATAFORMAT_16B_EXTENDED - * @arg @ref LL_I2S_DATAFORMAT_24B - * @arg @ref LL_I2S_DATAFORMAT_32B - */ -__STATIC_INLINE uint32_t LL_I2S_GetDataFormat(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)); -} - -/** - * @brief Set I2S clock polarity - * @rmtoll I2SCFGR CKPOL LL_I2S_SetClockPolarity - * @param SPIx SPI Instance - * @param ClockPolarity This parameter can be one of the following values: - * @arg @ref LL_I2S_POLARITY_LOW - * @arg @ref LL_I2S_POLARITY_HIGH - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetClockPolarity(SPI_TypeDef *SPIx, uint32_t ClockPolarity) -{ - SET_BIT(SPIx->I2SCFGR, ClockPolarity); -} - -/** - * @brief Get I2S clock polarity - * @rmtoll I2SCFGR CKPOL LL_I2S_GetClockPolarity - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2S_POLARITY_LOW - * @arg @ref LL_I2S_POLARITY_HIGH - */ -__STATIC_INLINE uint32_t LL_I2S_GetClockPolarity(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_CKPOL)); -} - -/** - * @brief Set I2S standard protocol - * @rmtoll I2SCFGR I2SSTD LL_I2S_SetStandard\n - * I2SCFGR PCMSYNC LL_I2S_SetStandard - * @param SPIx SPI Instance - * @param Standard This parameter can be one of the following values: - * @arg @ref LL_I2S_STANDARD_PHILIPS - * @arg @ref LL_I2S_STANDARD_MSB - * @arg @ref LL_I2S_STANDARD_LSB - * @arg @ref LL_I2S_STANDARD_PCM_SHORT - * @arg @ref LL_I2S_STANDARD_PCM_LONG - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetStandard(SPI_TypeDef *SPIx, uint32_t Standard) -{ - MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC, Standard); -} - -/** - * @brief Get I2S standard protocol - * @rmtoll I2SCFGR I2SSTD LL_I2S_GetStandard\n - * I2SCFGR PCMSYNC LL_I2S_GetStandard - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2S_STANDARD_PHILIPS - * @arg @ref LL_I2S_STANDARD_MSB - * @arg @ref LL_I2S_STANDARD_LSB - * @arg @ref LL_I2S_STANDARD_PCM_SHORT - * @arg @ref LL_I2S_STANDARD_PCM_LONG - */ -__STATIC_INLINE uint32_t LL_I2S_GetStandard(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC)); -} - -/** - * @brief Set I2S transfer mode - * @rmtoll I2SCFGR I2SCFG LL_I2S_SetTransferMode - * @param SPIx SPI Instance - * @param Mode This parameter can be one of the following values: - * @arg @ref LL_I2S_MODE_SLAVE_TX - * @arg @ref LL_I2S_MODE_SLAVE_RX - * @arg @ref LL_I2S_MODE_MASTER_TX - * @arg @ref LL_I2S_MODE_MASTER_RX - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetTransferMode(SPI_TypeDef *SPIx, uint32_t Mode) -{ - MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_I2SCFG, Mode); -} - -/** - * @brief Get I2S transfer mode - * @rmtoll I2SCFGR I2SCFG LL_I2S_GetTransferMode - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2S_MODE_SLAVE_TX - * @arg @ref LL_I2S_MODE_SLAVE_RX - * @arg @ref LL_I2S_MODE_MASTER_TX - * @arg @ref LL_I2S_MODE_MASTER_RX - */ -__STATIC_INLINE uint32_t LL_I2S_GetTransferMode(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SCFG)); -} - -/** - * @brief Set I2S linear prescaler - * @rmtoll I2SPR I2SDIV LL_I2S_SetPrescalerLinear - * @param SPIx SPI Instance - * @param PrescalerLinear Value between Min_Data=0x02 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetPrescalerLinear(SPI_TypeDef *SPIx, uint8_t PrescalerLinear) -{ - MODIFY_REG(SPIx->I2SPR, SPI_I2SPR_I2SDIV, PrescalerLinear); -} - -/** - * @brief Get I2S linear prescaler - * @rmtoll I2SPR I2SDIV LL_I2S_GetPrescalerLinear - * @param SPIx SPI Instance - * @retval PrescalerLinear Value between Min_Data=0x02 and Max_Data=0xFF - */ -__STATIC_INLINE uint32_t LL_I2S_GetPrescalerLinear(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SPR, SPI_I2SPR_I2SDIV)); -} - -/** - * @brief Set I2S parity prescaler - * @rmtoll I2SPR ODD LL_I2S_SetPrescalerParity - * @param SPIx SPI Instance - * @param PrescalerParity This parameter can be one of the following values: - * @arg @ref LL_I2S_PRESCALER_PARITY_EVEN - * @arg @ref LL_I2S_PRESCALER_PARITY_ODD - * @retval None - */ -__STATIC_INLINE void LL_I2S_SetPrescalerParity(SPI_TypeDef *SPIx, uint32_t PrescalerParity) -{ - MODIFY_REG(SPIx->I2SPR, SPI_I2SPR_ODD, PrescalerParity << 8U); -} - -/** - * @brief Get I2S parity prescaler - * @rmtoll I2SPR ODD LL_I2S_GetPrescalerParity - * @param SPIx SPI Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_I2S_PRESCALER_PARITY_EVEN - * @arg @ref LL_I2S_PRESCALER_PARITY_ODD - */ -__STATIC_INLINE uint32_t LL_I2S_GetPrescalerParity(const SPI_TypeDef *SPIx) -{ - return (uint32_t)(READ_BIT(SPIx->I2SPR, SPI_I2SPR_ODD) >> 8U); -} - -/** - * @brief Enable the master clock output (Pin MCK) - * @rmtoll I2SPR MCKOE LL_I2S_EnableMasterClock - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableMasterClock(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE); -} - -/** - * @brief Disable the master clock output (Pin MCK) - * @rmtoll I2SPR MCKOE LL_I2S_DisableMasterClock - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableMasterClock(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE); -} - -/** - * @brief Check if the master clock output (Pin MCK) is enabled - * @rmtoll I2SPR MCKOE LL_I2S_IsEnabledMasterClock - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledMasterClock(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE) == (SPI_I2SPR_MCKOE)) ? 1UL : 0UL); -} - -#if defined(SPI_I2SCFGR_ASTRTEN) -/** - * @brief Enable asynchronous start - * @rmtoll I2SCFGR ASTRTEN LL_I2S_EnableAsyncStart - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableAsyncStart(SPI_TypeDef *SPIx) -{ - SET_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_ASTRTEN); -} - -/** - * @brief Disable asynchronous start - * @rmtoll I2SCFGR ASTRTEN LL_I2S_DisableAsyncStart - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableAsyncStart(SPI_TypeDef *SPIx) -{ - CLEAR_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_ASTRTEN); -} - -/** - * @brief Check if asynchronous start is enabled - * @rmtoll I2SCFGR ASTRTEN LL_I2S_IsEnabledAsyncStart - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledAsyncStart(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_ASTRTEN) == (SPI_I2SCFGR_ASTRTEN)) ? 1UL : 0UL); -} -#endif /* SPI_I2SCFGR_ASTRTEN */ - -/** - * @} - */ - -/** @defgroup I2S_LL_EF_FLAG FLAG Management - * @{ - */ - -/** - * @brief Check if Rx buffer is not empty - * @rmtoll SR RXNE LL_I2S_IsActiveFlag_RXNE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_RXNE(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsActiveFlag_RXNE(SPIx); -} - -/** - * @brief Check if Tx buffer is empty - * @rmtoll SR TXE LL_I2S_IsActiveFlag_TXE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_TXE(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsActiveFlag_TXE(SPIx); -} - -/** - * @brief Get busy flag - * @rmtoll SR BSY LL_I2S_IsActiveFlag_BSY - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_BSY(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsActiveFlag_BSY(SPIx); -} - -/** - * @brief Get overrun error flag - * @rmtoll SR OVR LL_I2S_IsActiveFlag_OVR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_OVR(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsActiveFlag_OVR(SPIx); -} - -/** - * @brief Get underrun error flag - * @rmtoll SR UDR LL_I2S_IsActiveFlag_UDR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_UDR(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_UDR) == (SPI_SR_UDR)) ? 1UL : 0UL); -} - -/** - * @brief Get frame format error flag - * @rmtoll SR FRE LL_I2S_IsActiveFlag_FRE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_FRE(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsActiveFlag_FRE(SPIx); -} - -/** - * @brief Get channel side flag. - * @note 0: Channel Left has to be transmitted or has been received\n - * 1: Channel Right has to be transmitted or has been received\n - * It has no significance in PCM mode. - * @rmtoll SR CHSIDE LL_I2S_IsActiveFlag_CHSIDE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_CHSIDE(const SPI_TypeDef *SPIx) -{ - return ((READ_BIT(SPIx->SR, SPI_SR_CHSIDE) == (SPI_SR_CHSIDE)) ? 1UL : 0UL); -} - -/** - * @brief Clear overrun error flag - * @rmtoll SR OVR LL_I2S_ClearFlag_OVR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_ClearFlag_OVR(SPI_TypeDef *SPIx) -{ - LL_SPI_ClearFlag_OVR(SPIx); -} - -/** - * @brief Clear underrun error flag - * @rmtoll SR UDR LL_I2S_ClearFlag_UDR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_ClearFlag_UDR(const SPI_TypeDef *SPIx) -{ - __IO uint32_t tmpreg; - tmpreg = SPIx->SR; - (void)tmpreg; -} - -/** - * @brief Clear frame format error flag - * @rmtoll SR FRE LL_I2S_ClearFlag_FRE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_ClearFlag_FRE(const SPI_TypeDef *SPIx) -{ - LL_SPI_ClearFlag_FRE(SPIx); -} - -/** - * @} - */ - -/** @defgroup I2S_LL_EF_IT Interrupt Management - * @{ - */ - -/** - * @brief Enable error IT - * @note This bit controls the generation of an interrupt when an error condition occurs (OVR, UDR and FRE in I2S mode). - * @rmtoll CR2 ERRIE LL_I2S_EnableIT_ERR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableIT_ERR(SPI_TypeDef *SPIx) -{ - LL_SPI_EnableIT_ERR(SPIx); -} - -/** - * @brief Enable Rx buffer not empty IT - * @rmtoll CR2 RXNEIE LL_I2S_EnableIT_RXNE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableIT_RXNE(SPI_TypeDef *SPIx) -{ - LL_SPI_EnableIT_RXNE(SPIx); -} - -/** - * @brief Enable Tx buffer empty IT - * @rmtoll CR2 TXEIE LL_I2S_EnableIT_TXE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableIT_TXE(SPI_TypeDef *SPIx) -{ - LL_SPI_EnableIT_TXE(SPIx); -} - -/** - * @brief Disable error IT - * @note This bit controls the generation of an interrupt when an error condition occurs (OVR, UDR and FRE in I2S mode). - * @rmtoll CR2 ERRIE LL_I2S_DisableIT_ERR - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableIT_ERR(SPI_TypeDef *SPIx) -{ - LL_SPI_DisableIT_ERR(SPIx); -} - -/** - * @brief Disable Rx buffer not empty IT - * @rmtoll CR2 RXNEIE LL_I2S_DisableIT_RXNE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableIT_RXNE(SPI_TypeDef *SPIx) -{ - LL_SPI_DisableIT_RXNE(SPIx); -} - -/** - * @brief Disable Tx buffer empty IT - * @rmtoll CR2 TXEIE LL_I2S_DisableIT_TXE - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableIT_TXE(SPI_TypeDef *SPIx) -{ - LL_SPI_DisableIT_TXE(SPIx); -} - -/** - * @brief Check if ERR IT is enabled - * @rmtoll CR2 ERRIE LL_I2S_IsEnabledIT_ERR - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_ERR(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsEnabledIT_ERR(SPIx); -} - -/** - * @brief Check if RXNE IT is enabled - * @rmtoll CR2 RXNEIE LL_I2S_IsEnabledIT_RXNE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_RXNE(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsEnabledIT_RXNE(SPIx); -} - -/** - * @brief Check if TXE IT is enabled - * @rmtoll CR2 TXEIE LL_I2S_IsEnabledIT_TXE - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_TXE(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsEnabledIT_TXE(SPIx); -} - -/** - * @} - */ - -/** @defgroup I2S_LL_EF_DMA DMA Management - * @{ - */ - -/** - * @brief Enable DMA Rx - * @rmtoll CR2 RXDMAEN LL_I2S_EnableDMAReq_RX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableDMAReq_RX(SPI_TypeDef *SPIx) -{ - LL_SPI_EnableDMAReq_RX(SPIx); -} - -/** - * @brief Disable DMA Rx - * @rmtoll CR2 RXDMAEN LL_I2S_DisableDMAReq_RX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableDMAReq_RX(SPI_TypeDef *SPIx) -{ - LL_SPI_DisableDMAReq_RX(SPIx); -} - -/** - * @brief Check if DMA Rx is enabled - * @rmtoll CR2 RXDMAEN LL_I2S_IsEnabledDMAReq_RX - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledDMAReq_RX(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsEnabledDMAReq_RX(SPIx); -} - -/** - * @brief Enable DMA Tx - * @rmtoll CR2 TXDMAEN LL_I2S_EnableDMAReq_TX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_EnableDMAReq_TX(SPI_TypeDef *SPIx) -{ - LL_SPI_EnableDMAReq_TX(SPIx); -} - -/** - * @brief Disable DMA Tx - * @rmtoll CR2 TXDMAEN LL_I2S_DisableDMAReq_TX - * @param SPIx SPI Instance - * @retval None - */ -__STATIC_INLINE void LL_I2S_DisableDMAReq_TX(SPI_TypeDef *SPIx) -{ - LL_SPI_DisableDMAReq_TX(SPIx); -} - -/** - * @brief Check if DMA Tx is enabled - * @rmtoll CR2 TXDMAEN LL_I2S_IsEnabledDMAReq_TX - * @param SPIx SPI Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_I2S_IsEnabledDMAReq_TX(const SPI_TypeDef *SPIx) -{ - return LL_SPI_IsEnabledDMAReq_TX(SPIx); -} - -/** - * @} - */ - -/** @defgroup I2S_LL_EF_DATA DATA Management - * @{ - */ - -/** - * @brief Read 16-Bits in data register - * @rmtoll DR DR LL_I2S_ReceiveData16 - * @param SPIx SPI Instance - * @retval RxData Value between Min_Data=0x0000 and Max_Data=0xFFFF - */ -__STATIC_INLINE uint16_t LL_I2S_ReceiveData16(SPI_TypeDef *SPIx) -{ - return LL_SPI_ReceiveData16(SPIx); -} - -/** - * @brief Write 16-Bits in data register - * @rmtoll DR DR LL_I2S_TransmitData16 - * @param SPIx SPI Instance - * @param TxData Value between Min_Data=0x0000 and Max_Data=0xFFFF - * @retval None - */ -__STATIC_INLINE void LL_I2S_TransmitData16(SPI_TypeDef *SPIx, uint16_t TxData) -{ - LL_SPI_TransmitData16(SPIx, TxData); -} - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup I2S_LL_EF_Init Initialization and de-initialization functions - * @{ - */ - -ErrorStatus LL_I2S_DeInit(const SPI_TypeDef *SPIx); -ErrorStatus LL_I2S_Init(SPI_TypeDef *SPIx, LL_I2S_InitTypeDef *I2S_InitStruct); -void LL_I2S_StructInit(LL_I2S_InitTypeDef *I2S_InitStruct); -void LL_I2S_ConfigPrescaler(SPI_TypeDef *SPIx, uint32_t PrescalerLinear, uint32_t PrescalerParity); -#if defined (SPI_I2S_FULLDUPLEX_SUPPORT) -ErrorStatus LL_I2S_InitFullDuplex(SPI_TypeDef *I2Sxext, LL_I2S_InitTypeDef *I2S_InitStruct); -#endif /* SPI_I2S_FULLDUPLEX_SUPPORT */ - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined (SPI1) || defined (SPI2) || defined (SPI3) || defined (SPI4) || defined (SPI5) || defined(SPI6) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_LL_SPI_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h deleted file mode 100644 index 84ea5c4..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h +++ /dev/null @@ -1,1711 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_system.h - * @author MCD Application Team - * @brief Header file of SYSTEM LL module. - * - ****************************************************************************** - * @attention - * - *Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The LL SYSTEM driver contains a set of generic APIs that can be - used by user: - (+) Some of the FLASH features need to be handled in the SYSTEM file. - (+) Access to DBGCMU registers - (+) Access to SYSCFG registers - - @endverbatim - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_SYSTEM_H -#define __STM32F4xx_LL_SYSTEM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (FLASH) || defined (SYSCFG) || defined (DBGMCU) - -/** @defgroup SYSTEM_LL SYSTEM - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup SYSTEM_LL_Private_Constants SYSTEM Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SYSTEM_LL_Exported_Constants SYSTEM Exported Constants - * @{ - */ - -/** @defgroup SYSTEM_LL_EC_REMAP SYSCFG REMAP -* @{ -*/ -#define LL_SYSCFG_REMAP_FLASH (uint32_t)0x00000000 /*!< Main Flash memory mapped at 0x00000000 */ -#define LL_SYSCFG_REMAP_SYSTEMFLASH SYSCFG_MEMRMP_MEM_MODE_0 /*!< System Flash memory mapped at 0x00000000 */ -#if defined(FSMC_Bank1) -#define LL_SYSCFG_REMAP_FSMC SYSCFG_MEMRMP_MEM_MODE_1 /*!< FSMC(NOR/PSRAM 1 and 2) mapped at 0x00000000 */ -#endif /* FSMC_Bank1 */ -#if defined(FMC_Bank1) -#define LL_SYSCFG_REMAP_FMC SYSCFG_MEMRMP_MEM_MODE_1 /*!< FMC(NOR/PSRAM 1 and 2) mapped at 0x00000000 */ -#define LL_SYSCFG_REMAP_SDRAM SYSCFG_MEMRMP_MEM_MODE_2 /*!< FMC/SDRAM mapped at 0x00000000 */ -#endif /* FMC_Bank1 */ -#define LL_SYSCFG_REMAP_SRAM (SYSCFG_MEMRMP_MEM_MODE_1 | SYSCFG_MEMRMP_MEM_MODE_0) /*!< SRAM1 mapped at 0x00000000 */ - -/** - * @} - */ - -#if defined(SYSCFG_PMC_MII_RMII_SEL) - /** @defgroup SYSTEM_LL_EC_PMC SYSCFG PMC -* @{ -*/ -#define LL_SYSCFG_PMC_ETHMII (uint32_t)0x00000000 /*!< ETH Media MII interface */ -#define LL_SYSCFG_PMC_ETHRMII (uint32_t)SYSCFG_PMC_MII_RMII_SEL /*!< ETH Media RMII interface */ - -/** - * @} - */ -#endif /* SYSCFG_PMC_MII_RMII_SEL */ - - - -#if defined(SYSCFG_MEMRMP_UFB_MODE) -/** @defgroup SYSTEM_LL_EC_BANKMODE SYSCFG BANK MODE - * @{ - */ -#define LL_SYSCFG_BANKMODE_BANK1 (uint32_t)0x00000000 /*!< Flash Bank 1 base address mapped at 0x0800 0000 (AXI) and 0x0020 0000 (TCM) - and Flash Bank 2 base address mapped at 0x0810 0000 (AXI) and 0x0030 0000 (TCM)*/ -#define LL_SYSCFG_BANKMODE_BANK2 SYSCFG_MEMRMP_UFB_MODE /*!< Flash Bank 2 base address mapped at 0x0800 0000 (AXI) and 0x0020 0000(TCM) - and Flash Bank 1 base address mapped at 0x0810 0000 (AXI) and 0x0030 0000(TCM) */ -/** - * @} - */ -#endif /* SYSCFG_MEMRMP_UFB_MODE */ -/** @defgroup SYSTEM_LL_EC_I2C_FASTMODEPLUS SYSCFG I2C FASTMODEPLUS - * @{ - */ -#if defined(SYSCFG_CFGR_FMPI2C1_SCL) -#define LL_SYSCFG_I2C_FASTMODEPLUS_SCL SYSCFG_CFGR_FMPI2C1_SCL /*!< Enable Fast Mode Plus on FMPI2C_SCL pin */ -#define LL_SYSCFG_I2C_FASTMODEPLUS_SDA SYSCFG_CFGR_FMPI2C1_SDA /*!< Enable Fast Mode Plus on FMPI2C_SDA pin*/ -#endif /* SYSCFG_CFGR_FMPI2C1_SCL */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_EXTI_PORT SYSCFG EXTI PORT - * @{ - */ -#define LL_SYSCFG_EXTI_PORTA (uint32_t)0 /*!< EXTI PORT A */ -#define LL_SYSCFG_EXTI_PORTB (uint32_t)1 /*!< EXTI PORT B */ -#define LL_SYSCFG_EXTI_PORTC (uint32_t)2 /*!< EXTI PORT C */ -#define LL_SYSCFG_EXTI_PORTD (uint32_t)3 /*!< EXTI PORT D */ -#define LL_SYSCFG_EXTI_PORTE (uint32_t)4 /*!< EXTI PORT E */ -#if defined(GPIOF) -#define LL_SYSCFG_EXTI_PORTF (uint32_t)5 /*!< EXTI PORT F */ -#endif /* GPIOF */ -#if defined(GPIOG) -#define LL_SYSCFG_EXTI_PORTG (uint32_t)6 /*!< EXTI PORT G */ -#endif /* GPIOG */ -#define LL_SYSCFG_EXTI_PORTH (uint32_t)7 /*!< EXTI PORT H */ -#if defined(GPIOI) -#define LL_SYSCFG_EXTI_PORTI (uint32_t)8 /*!< EXTI PORT I */ -#endif /* GPIOI */ -#if defined(GPIOJ) -#define LL_SYSCFG_EXTI_PORTJ (uint32_t)9 /*!< EXTI PORT J */ -#endif /* GPIOJ */ -#if defined(GPIOK) -#define LL_SYSCFG_EXTI_PORTK (uint32_t)10 /*!< EXTI PORT k */ -#endif /* GPIOK */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_EXTI_LINE SYSCFG EXTI LINE - * @{ - */ -#define LL_SYSCFG_EXTI_LINE0 (uint32_t)(0x000FU << 16 | 0) /*!< EXTI_POSITION_0 | EXTICR[0] */ -#define LL_SYSCFG_EXTI_LINE1 (uint32_t)(0x00F0U << 16 | 0) /*!< EXTI_POSITION_4 | EXTICR[0] */ -#define LL_SYSCFG_EXTI_LINE2 (uint32_t)(0x0F00U << 16 | 0) /*!< EXTI_POSITION_8 | EXTICR[0] */ -#define LL_SYSCFG_EXTI_LINE3 (uint32_t)(0xF000U << 16 | 0) /*!< EXTI_POSITION_12 | EXTICR[0] */ -#define LL_SYSCFG_EXTI_LINE4 (uint32_t)(0x000FU << 16 | 1) /*!< EXTI_POSITION_0 | EXTICR[1] */ -#define LL_SYSCFG_EXTI_LINE5 (uint32_t)(0x00F0U << 16 | 1) /*!< EXTI_POSITION_4 | EXTICR[1] */ -#define LL_SYSCFG_EXTI_LINE6 (uint32_t)(0x0F00U << 16 | 1) /*!< EXTI_POSITION_8 | EXTICR[1] */ -#define LL_SYSCFG_EXTI_LINE7 (uint32_t)(0xF000U << 16 | 1) /*!< EXTI_POSITION_12 | EXTICR[1] */ -#define LL_SYSCFG_EXTI_LINE8 (uint32_t)(0x000FU << 16 | 2) /*!< EXTI_POSITION_0 | EXTICR[2] */ -#define LL_SYSCFG_EXTI_LINE9 (uint32_t)(0x00F0U << 16 | 2) /*!< EXTI_POSITION_4 | EXTICR[2] */ -#define LL_SYSCFG_EXTI_LINE10 (uint32_t)(0x0F00U << 16 | 2) /*!< EXTI_POSITION_8 | EXTICR[2] */ -#define LL_SYSCFG_EXTI_LINE11 (uint32_t)(0xF000U << 16 | 2) /*!< EXTI_POSITION_12 | EXTICR[2] */ -#define LL_SYSCFG_EXTI_LINE12 (uint32_t)(0x000FU << 16 | 3) /*!< EXTI_POSITION_0 | EXTICR[3] */ -#define LL_SYSCFG_EXTI_LINE13 (uint32_t)(0x00F0U << 16 | 3) /*!< EXTI_POSITION_4 | EXTICR[3] */ -#define LL_SYSCFG_EXTI_LINE14 (uint32_t)(0x0F00U << 16 | 3) /*!< EXTI_POSITION_8 | EXTICR[3] */ -#define LL_SYSCFG_EXTI_LINE15 (uint32_t)(0xF000U << 16 | 3) /*!< EXTI_POSITION_12 | EXTICR[3] */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_TIMBREAK SYSCFG TIMER BREAK - * @{ - */ -#if defined(SYSCFG_CFGR2_LOCKUP_LOCK) -#define LL_SYSCFG_TIMBREAK_LOCKUP SYSCFG_CFGR2_LOCKUP_LOCK /*!< Enables and locks the LOCKUP output of CortexM4 - with Break Input of TIM1/8 */ -#define LL_SYSCFG_TIMBREAK_PVD SYSCFG_CFGR2_PVD_LOCK /*!< Enables and locks the PVD connection with TIM1/8 Break Input - and also the PVDE and PLS bits of the Power Control Interface */ -#endif /* SYSCFG_CFGR2_CLL */ -/** - * @} - */ - -#if defined(SYSCFG_MCHDLYCR_BSCKSEL) -/** @defgroup SYSTEM_LL_DFSDM_BitStream_ClockSource SYSCFG MCHDLY BCKKSEL - * @{ - */ -#define LL_SYSCFG_BITSTREAM_CLOCK_TIM2OC1 (uint32_t)0x00000000 -#define LL_SYSCFG_BITSTREAM_CLOCK_DFSDM2 SYSCFG_MCHDLYCR_BSCKSEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM_MCHDLYEN SYSCFG MCHDLY MCHDLYEN - * @{ - */ -#define LL_SYSCFG_DFSDM1_MCHDLYEN SYSCFG_MCHDLYCR_MCHDLY1EN -#define LL_SYSCFG_DFSDM2_MCHDLYEN SYSCFG_MCHDLYCR_MCHDLY2EN -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM_DataIn0_Source SYSCFG MCHDLY DFSDMD0SEL - * @{ - */ -#define LL_SYSCFG_DFSDM1_DataIn0 SYSCFG_MCHDLYCR_DFSDM1D0SEL -#define LL_SYSCFG_DFSDM2_DataIn0 SYSCFG_MCHDLYCR_DFSDM2D0SEL - -#define LL_SYSCFG_DFSDM1_DataIn0_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D0SEL << 16) | 0x00000000) -#define LL_SYSCFG_DFSDM1_DataIn0_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D0SEL << 16) | SYSCFG_MCHDLYCR_DFSDM1D0SEL) -#define LL_SYSCFG_DFSDM2_DataIn0_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D0SEL << 16) | 0x00000000) -#define LL_SYSCFG_DFSDM2_DataIn0_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D0SEL << 16) | SYSCFG_MCHDLYCR_DFSDM2D0SEL) -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM_DataIn2_Source SYSCFG MCHDLY DFSDMD2SEL - * @{ - */ -#define LL_SYSCFG_DFSDM1_DataIn2 SYSCFG_MCHDLYCR_DFSDM1D2SEL -#define LL_SYSCFG_DFSDM2_DataIn2 SYSCFG_MCHDLYCR_DFSDM2D2SEL - -#define LL_SYSCFG_DFSDM1_DataIn2_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D2SEL << 16) | 0x00000000) -#define LL_SYSCFG_DFSDM1_DataIn2_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D2SEL << 16) | SYSCFG_MCHDLYCR_DFSDM1D2SEL) -#define LL_SYSCFG_DFSDM2_DataIn2_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D2SEL << 16) | 0x00000000) -#define LL_SYSCFG_DFSDM2_DataIn2_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D2SEL << 16) | SYSCFG_MCHDLYCR_DFSDM2D2SEL) -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM1_TIM4OC2_BitstreamDistribution SYSCFG MCHDLY DFSDM1CK02SEL - * @{ - */ -#define LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN0 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN2 SYSCFG_MCHDLYCR_DFSDM1CK02SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM1_TIM4OC1_BitstreamDistribution SYSCFG MCHDLY DFSDM1CK13SEL - * @{ - */ -#define LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN1 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN3 SYSCFG_MCHDLYCR_DFSDM1CK13SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM1_CLKIN_SourceSelection SYSCFG MCHDLY DFSDMCFG - * @{ - */ -#define LL_SYSCFG_DFSDM1_CKIN_PAD (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM1_CKIN_DM SYSCFG_MCHDLYCR_DFSDM1CFG -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM1_CLKOUT_SourceSelection SYSCFG MCHDLY DFSDM1CKOSEL - * @{ - */ -#define LL_SYSCFG_DFSDM1_CKOUT (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM1_CKOUT_M27 SYSCFG_MCHDLYCR_DFSDM1CKOSEL -/** - * @} - */ - -/** @defgroup SYSTEM_LL_DFSDM2_DataIn4_SourceSelection SYSCFG MCHDLY DFSDM2D4SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_DataIn4_PAD (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_DataIn4_DM SYSCFG_MCHDLYCR_DFSDM2D4SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_DataIn6_SourceSelection SYSCFG MCHDLY DFSDM2D6SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_DataIn6_PAD (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_DataIn6_DM SYSCFG_MCHDLYCR_DFSDM2D6SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC4_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK04SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN0 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN4 SYSCFG_MCHDLYCR_DFSDM2CK04SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC3_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK15SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN1 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN5 SYSCFG_MCHDLYCR_DFSDM2CK15SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC2_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK26SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN2 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN6 SYSCFG_MCHDLYCR_DFSDM2CK26SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC1_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK37SEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN3 (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN7 SYSCFG_MCHDLYCR_DFSDM2CK37SEL -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_CLKIN_SourceSelection SYSCFG MCHDLY DFSDM2CFG - * @{ - */ -#define LL_SYSCFG_DFSDM2_CKIN_PAD (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_CKIN_DM SYSCFG_MCHDLYCR_DFSDM2CFG -/** - * @} - */ -/** @defgroup SYSTEM_LL_DFSDM2_CLKOUT_SourceSelection SYSCFG MCHDLY DFSDM2CKOSEL - * @{ - */ -#define LL_SYSCFG_DFSDM2_CKOUT (uint32_t)0x00000000 -#define LL_SYSCFG_DFSDM2_CKOUT_M27 SYSCFG_MCHDLYCR_DFSDM2CKOSEL -/** - * @} - */ -#endif /* SYSCFG_MCHDLYCR_BSCKSEL */ - -/** @defgroup SYSTEM_LL_EC_TRACE DBGMCU TRACE Pin Assignment - * @{ - */ -#define LL_DBGMCU_TRACE_NONE 0x00000000U /*!< TRACE pins not assigned (default state) */ -#define LL_DBGMCU_TRACE_ASYNCH DBGMCU_CR_TRACE_IOEN /*!< TRACE pin assignment for Asynchronous Mode */ -#define LL_DBGMCU_TRACE_SYNCH_SIZE1 (DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE_0) /*!< TRACE pin assignment for Synchronous Mode with a TRACEDATA size of 1 */ -#define LL_DBGMCU_TRACE_SYNCH_SIZE2 (DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE_1) /*!< TRACE pin assignment for Synchronous Mode with a TRACEDATA size of 2 */ -#define LL_DBGMCU_TRACE_SYNCH_SIZE4 (DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE) /*!< TRACE pin assignment for Synchronous Mode with a TRACEDATA size of 4 */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_APB1_GRP1_STOP_IP DBGMCU APB1 GRP1 STOP IP - * @{ - */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM2_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM2_STOP DBGMCU_APB1_FZ_DBG_TIM2_STOP /*!< TIM2 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM2_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM3_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM3_STOP DBGMCU_APB1_FZ_DBG_TIM3_STOP /*!< TIM3 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM3_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM4_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM4_STOP DBGMCU_APB1_FZ_DBG_TIM4_STOP /*!< TIM4 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM4_STOP */ -#define LL_DBGMCU_APB1_GRP1_TIM5_STOP DBGMCU_APB1_FZ_DBG_TIM5_STOP /*!< TIM5 counter stopped when core is halted */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM6_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM6_STOP DBGMCU_APB1_FZ_DBG_TIM6_STOP /*!< TIM6 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM6_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM7_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM7_STOP DBGMCU_APB1_FZ_DBG_TIM7_STOP /*!< TIM7 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM7_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM12_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM12_STOP DBGMCU_APB1_FZ_DBG_TIM12_STOP /*!< TIM12 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM12_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM13_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM13_STOP DBGMCU_APB1_FZ_DBG_TIM13_STOP /*!< TIM13 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM13_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_TIM14_STOP) -#define LL_DBGMCU_APB1_GRP1_TIM14_STOP DBGMCU_APB1_FZ_DBG_TIM14_STOP /*!< TIM14 counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_TIM14_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_LPTIM_STOP) -#define LL_DBGMCU_APB1_GRP1_LPTIM_STOP DBGMCU_APB1_FZ_DBG_LPTIM_STOP /*!< LPTIM counter stopped when core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_LPTIM_STOP */ -#define LL_DBGMCU_APB1_GRP1_RTC_STOP DBGMCU_APB1_FZ_DBG_RTC_STOP /*!< RTC counter stopped when core is halted */ -#define LL_DBGMCU_APB1_GRP1_WWDG_STOP DBGMCU_APB1_FZ_DBG_WWDG_STOP /*!< Debug Window Watchdog stopped when Core is halted */ -#define LL_DBGMCU_APB1_GRP1_IWDG_STOP DBGMCU_APB1_FZ_DBG_IWDG_STOP /*!< Debug Independent Watchdog stopped when Core is halted */ -#define LL_DBGMCU_APB1_GRP1_I2C1_STOP DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT /*!< I2C1 SMBUS timeout mode stopped when Core is halted */ -#define LL_DBGMCU_APB1_GRP1_I2C2_STOP DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT /*!< I2C2 SMBUS timeout mode stopped when Core is halted */ -#if defined(DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT) -#define LL_DBGMCU_APB1_GRP1_I2C3_STOP DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT /*!< I2C3 SMBUS timeout mode stopped when Core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT */ -#if defined(DBGMCU_APB1_FZ_DBG_I2C4_SMBUS_TIMEOUT) -#define LL_DBGMCU_APB1_GRP1_I2C4_STOP DBGMCU_APB1_FZ_DBG_I2C4_SMBUS_TIMEOUT /*!< I2C4 SMBUS timeout mode stopped when Core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_I2C4_SMBUS_TIMEOUT */ -#if defined(DBGMCU_APB1_FZ_DBG_CAN1_STOP) -#define LL_DBGMCU_APB1_GRP1_CAN1_STOP DBGMCU_APB1_FZ_DBG_CAN1_STOP /*!< CAN1 debug stopped when Core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_CAN1_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_CAN2_STOP) -#define LL_DBGMCU_APB1_GRP1_CAN2_STOP DBGMCU_APB1_FZ_DBG_CAN2_STOP /*!< CAN2 debug stopped when Core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_CAN2_STOP */ -#if defined(DBGMCU_APB1_FZ_DBG_CAN3_STOP) -#define LL_DBGMCU_APB1_GRP1_CAN3_STOP DBGMCU_APB1_FZ_DBG_CAN3_STOP /*!< CAN3 debug stopped when Core is halted */ -#endif /* DBGMCU_APB1_FZ_DBG_CAN3_STOP */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_APB2_GRP1_STOP_IP DBGMCU APB2 GRP1 STOP IP - * @{ - */ -#define LL_DBGMCU_APB2_GRP1_TIM1_STOP DBGMCU_APB2_FZ_DBG_TIM1_STOP /*!< TIM1 counter stopped when core is halted */ -#if defined(DBGMCU_APB2_FZ_DBG_TIM8_STOP) -#define LL_DBGMCU_APB2_GRP1_TIM8_STOP DBGMCU_APB2_FZ_DBG_TIM8_STOP /*!< TIM8 counter stopped when core is halted */ -#endif /* DBGMCU_APB2_FZ_DBG_TIM8_STOP */ -#define LL_DBGMCU_APB2_GRP1_TIM9_STOP DBGMCU_APB2_FZ_DBG_TIM9_STOP /*!< TIM9 counter stopped when core is halted */ -#if defined(DBGMCU_APB2_FZ_DBG_TIM10_STOP) -#define LL_DBGMCU_APB2_GRP1_TIM10_STOP DBGMCU_APB2_FZ_DBG_TIM10_STOP /*!< TIM10 counter stopped when core is halted */ -#endif /* DBGMCU_APB2_FZ_DBG_TIM10_STOP */ -#define LL_DBGMCU_APB2_GRP1_TIM11_STOP DBGMCU_APB2_FZ_DBG_TIM11_STOP /*!< TIM11 counter stopped when core is halted */ -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EC_LATENCY FLASH LATENCY - * @{ - */ -#define LL_FLASH_LATENCY_0 FLASH_ACR_LATENCY_0WS /*!< FLASH Zero wait state */ -#define LL_FLASH_LATENCY_1 FLASH_ACR_LATENCY_1WS /*!< FLASH One wait state */ -#define LL_FLASH_LATENCY_2 FLASH_ACR_LATENCY_2WS /*!< FLASH Two wait states */ -#define LL_FLASH_LATENCY_3 FLASH_ACR_LATENCY_3WS /*!< FLASH Three wait states */ -#define LL_FLASH_LATENCY_4 FLASH_ACR_LATENCY_4WS /*!< FLASH Four wait states */ -#define LL_FLASH_LATENCY_5 FLASH_ACR_LATENCY_5WS /*!< FLASH five wait state */ -#define LL_FLASH_LATENCY_6 FLASH_ACR_LATENCY_6WS /*!< FLASH six wait state */ -#define LL_FLASH_LATENCY_7 FLASH_ACR_LATENCY_7WS /*!< FLASH seven wait states */ -#define LL_FLASH_LATENCY_8 FLASH_ACR_LATENCY_8WS /*!< FLASH eight wait states */ -#define LL_FLASH_LATENCY_9 FLASH_ACR_LATENCY_9WS /*!< FLASH nine wait states */ -#define LL_FLASH_LATENCY_10 FLASH_ACR_LATENCY_10WS /*!< FLASH ten wait states */ -#define LL_FLASH_LATENCY_11 FLASH_ACR_LATENCY_11WS /*!< FLASH eleven wait states */ -#define LL_FLASH_LATENCY_12 FLASH_ACR_LATENCY_12WS /*!< FLASH twelve wait states */ -#define LL_FLASH_LATENCY_13 FLASH_ACR_LATENCY_13WS /*!< FLASH thirteen wait states */ -#define LL_FLASH_LATENCY_14 FLASH_ACR_LATENCY_14WS /*!< FLASH fourteen wait states */ -#define LL_FLASH_LATENCY_15 FLASH_ACR_LATENCY_15WS /*!< FLASH fifteen wait states */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup SYSTEM_LL_Exported_Functions SYSTEM Exported Functions - * @{ - */ - -/** @defgroup SYSTEM_LL_EF_SYSCFG SYSCFG - * @{ - */ -/** - * @brief Set memory mapping at address 0x00000000 - * @rmtoll SYSCFG_MEMRMP MEM_MODE LL_SYSCFG_SetRemapMemory - * @param Memory This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_REMAP_FLASH - * @arg @ref LL_SYSCFG_REMAP_SYSTEMFLASH - * @arg @ref LL_SYSCFG_REMAP_SRAM - * @arg @ref LL_SYSCFG_REMAP_FSMC (*) - * @arg @ref LL_SYSCFG_REMAP_FMC (*) - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_SetRemapMemory(uint32_t Memory) -{ - MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE, Memory); -} - -/** - * @brief Get memory mapping at address 0x00000000 - * @rmtoll SYSCFG_MEMRMP MEM_MODE LL_SYSCFG_GetRemapMemory - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_REMAP_FLASH - * @arg @ref LL_SYSCFG_REMAP_SYSTEMFLASH - * @arg @ref LL_SYSCFG_REMAP_SRAM - * @arg @ref LL_SYSCFG_REMAP_FSMC (*) - * @arg @ref LL_SYSCFG_REMAP_FMC (*) - */ -__STATIC_INLINE uint32_t LL_SYSCFG_GetRemapMemory(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE)); -} - -#if defined(SYSCFG_MEMRMP_SWP_FMC) -/** - * @brief Enables the FMC Memory Mapping Swapping - * @rmtoll SYSCFG_MEMRMP SWP_FMC LL_SYSCFG_EnableFMCMemorySwapping - * @note SDRAM is accessible at 0x60000000 and NOR/RAM - * is accessible at 0xC0000000 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_EnableFMCMemorySwapping(void) -{ - SET_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FMC_0); -} - -/** - * @brief Disables the FMC Memory Mapping Swapping - * @rmtoll SYSCFG_MEMRMP SWP_FMC LL_SYSCFG_DisableFMCMemorySwapping - * @note SDRAM is accessible at 0xC0000000 (default mapping) - * and NOR/RAM is accessible at 0x60000000 (default mapping) - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DisableFMCMemorySwapping(void) -{ - CLEAR_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FMC); -} - -#endif /* SYSCFG_MEMRMP_SWP_FMC */ -/** - * @brief Enables the Compensation cell Power Down - * @rmtoll SYSCFG_CMPCR CMP_PD LL_SYSCFG_EnableCompensationCell - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_EnableCompensationCell(void) -{ - SET_BIT(SYSCFG->CMPCR, SYSCFG_CMPCR_CMP_PD); -} - -/** - * @brief Disables the Compensation cell Power Down - * @rmtoll SYSCFG_CMPCR CMP_PD LL_SYSCFG_DisableCompensationCell - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DisableCompensationCell(void) -{ - CLEAR_BIT(SYSCFG->CMPCR, SYSCFG_CMPCR_CMP_PD); -} - -/** - * @brief Get Compensation Cell ready Flag - * @rmtoll SYSCFG_CMPCR READY LL_SYSCFG_IsActiveFlag_CMPCR - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_SYSCFG_IsActiveFlag_CMPCR(void) -{ - return (READ_BIT(SYSCFG->CMPCR, SYSCFG_CMPCR_READY) == (SYSCFG_CMPCR_READY)); -} - -#if defined(SYSCFG_PMC_MII_RMII_SEL) -/** - * @brief Select Ethernet PHY interface - * @rmtoll SYSCFG_PMC MII_RMII_SEL LL_SYSCFG_SetPHYInterface - * @param Interface This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_PMC_ETHMII - * @arg @ref LL_SYSCFG_PMC_ETHRMII - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_SetPHYInterface(uint32_t Interface) -{ - MODIFY_REG(SYSCFG->PMC, SYSCFG_PMC_MII_RMII_SEL, Interface); -} - -/** - * @brief Get Ethernet PHY interface - * @rmtoll SYSCFG_PMC MII_RMII_SEL LL_SYSCFG_GetPHYInterface - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_PMC_ETHMII - * @arg @ref LL_SYSCFG_PMC_ETHRMII - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_GetPHYInterface(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->PMC, SYSCFG_PMC_MII_RMII_SEL)); -} -#endif /* SYSCFG_PMC_MII_RMII_SEL */ - - - -#if defined(SYSCFG_MEMRMP_UFB_MODE) -/** - * @brief Select Flash bank mode (Bank flashed at 0x08000000) - * @rmtoll SYSCFG_MEMRMP UFB_MODE LL_SYSCFG_SetFlashBankMode - * @param Bank This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_BANKMODE_BANK1 - * @arg @ref LL_SYSCFG_BANKMODE_BANK2 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_SetFlashBankMode(uint32_t Bank) -{ - MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_UFB_MODE, Bank); -} - -/** - * @brief Get Flash bank mode (Bank flashed at 0x08000000) - * @rmtoll SYSCFG_MEMRMP UFB_MODE LL_SYSCFG_GetFlashBankMode - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_BANKMODE_BANK1 - * @arg @ref LL_SYSCFG_BANKMODE_BANK2 - */ -__STATIC_INLINE uint32_t LL_SYSCFG_GetFlashBankMode(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_UFB_MODE)); -} -#endif /* SYSCFG_MEMRMP_UFB_MODE */ - -#if defined(SYSCFG_CFGR_FMPI2C1_SCL) -/** - * @brief Enable the I2C fast mode plus driving capability. - * @rmtoll SYSCFG_CFGR FMPI2C1_SCL LL_SYSCFG_EnableFastModePlus\n - * SYSCFG_CFGR FMPI2C1_SDA LL_SYSCFG_EnableFastModePlus - * @param ConfigFastModePlus This parameter can be a combination of the following values: - * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SCL - * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SDA - * (*) value not defined in all devices - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_EnableFastModePlus(uint32_t ConfigFastModePlus) -{ - SET_BIT(SYSCFG->CFGR, ConfigFastModePlus); -} - -/** - * @brief Disable the I2C fast mode plus driving capability. - * @rmtoll SYSCFG_CFGR FMPI2C1_SCL LL_SYSCFG_DisableFastModePlus\n - * SYSCFG_CFGR FMPI2C1_SDA LL_SYSCFG_DisableFastModePlus\n - * @param ConfigFastModePlus This parameter can be a combination of the following values: - * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SCL - * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SDA - * (*) value not defined in all devices - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DisableFastModePlus(uint32_t ConfigFastModePlus) -{ - CLEAR_BIT(SYSCFG->CFGR, ConfigFastModePlus); -} -#endif /* SYSCFG_CFGR_FMPI2C1_SCL */ - -/** - * @brief Configure source input for the EXTI external interrupt. - * @rmtoll SYSCFG_EXTICR1 EXTIx LL_SYSCFG_SetEXTISource\n - * SYSCFG_EXTICR2 EXTIx LL_SYSCFG_SetEXTISource\n - * SYSCFG_EXTICR3 EXTIx LL_SYSCFG_SetEXTISource\n - * SYSCFG_EXTICR4 EXTIx LL_SYSCFG_SetEXTISource - * @param Port This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_EXTI_PORTA - * @arg @ref LL_SYSCFG_EXTI_PORTB - * @arg @ref LL_SYSCFG_EXTI_PORTC - * @arg @ref LL_SYSCFG_EXTI_PORTD - * @arg @ref LL_SYSCFG_EXTI_PORTE - * @arg @ref LL_SYSCFG_EXTI_PORTF (*) - * @arg @ref LL_SYSCFG_EXTI_PORTG (*) - * @arg @ref LL_SYSCFG_EXTI_PORTH - * - * (*) value not defined in all devices - * @param Line This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_EXTI_LINE0 - * @arg @ref LL_SYSCFG_EXTI_LINE1 - * @arg @ref LL_SYSCFG_EXTI_LINE2 - * @arg @ref LL_SYSCFG_EXTI_LINE3 - * @arg @ref LL_SYSCFG_EXTI_LINE4 - * @arg @ref LL_SYSCFG_EXTI_LINE5 - * @arg @ref LL_SYSCFG_EXTI_LINE6 - * @arg @ref LL_SYSCFG_EXTI_LINE7 - * @arg @ref LL_SYSCFG_EXTI_LINE8 - * @arg @ref LL_SYSCFG_EXTI_LINE9 - * @arg @ref LL_SYSCFG_EXTI_LINE10 - * @arg @ref LL_SYSCFG_EXTI_LINE11 - * @arg @ref LL_SYSCFG_EXTI_LINE12 - * @arg @ref LL_SYSCFG_EXTI_LINE13 - * @arg @ref LL_SYSCFG_EXTI_LINE14 - * @arg @ref LL_SYSCFG_EXTI_LINE15 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_SetEXTISource(uint32_t Port, uint32_t Line) -{ - MODIFY_REG(SYSCFG->EXTICR[Line & 0xFF], (Line >> 16), Port << POSITION_VAL((Line >> 16))); -} - -/** - * @brief Get the configured defined for specific EXTI Line - * @rmtoll SYSCFG_EXTICR1 EXTIx LL_SYSCFG_GetEXTISource\n - * SYSCFG_EXTICR2 EXTIx LL_SYSCFG_GetEXTISource\n - * SYSCFG_EXTICR3 EXTIx LL_SYSCFG_GetEXTISource\n - * SYSCFG_EXTICR4 EXTIx LL_SYSCFG_GetEXTISource - * @param Line This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_EXTI_LINE0 - * @arg @ref LL_SYSCFG_EXTI_LINE1 - * @arg @ref LL_SYSCFG_EXTI_LINE2 - * @arg @ref LL_SYSCFG_EXTI_LINE3 - * @arg @ref LL_SYSCFG_EXTI_LINE4 - * @arg @ref LL_SYSCFG_EXTI_LINE5 - * @arg @ref LL_SYSCFG_EXTI_LINE6 - * @arg @ref LL_SYSCFG_EXTI_LINE7 - * @arg @ref LL_SYSCFG_EXTI_LINE8 - * @arg @ref LL_SYSCFG_EXTI_LINE9 - * @arg @ref LL_SYSCFG_EXTI_LINE10 - * @arg @ref LL_SYSCFG_EXTI_LINE11 - * @arg @ref LL_SYSCFG_EXTI_LINE12 - * @arg @ref LL_SYSCFG_EXTI_LINE13 - * @arg @ref LL_SYSCFG_EXTI_LINE14 - * @arg @ref LL_SYSCFG_EXTI_LINE15 - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_EXTI_PORTA - * @arg @ref LL_SYSCFG_EXTI_PORTB - * @arg @ref LL_SYSCFG_EXTI_PORTC - * @arg @ref LL_SYSCFG_EXTI_PORTD - * @arg @ref LL_SYSCFG_EXTI_PORTE - * @arg @ref LL_SYSCFG_EXTI_PORTF (*) - * @arg @ref LL_SYSCFG_EXTI_PORTG (*) - * @arg @ref LL_SYSCFG_EXTI_PORTH - * (*) value not defined in all devices - */ -__STATIC_INLINE uint32_t LL_SYSCFG_GetEXTISource(uint32_t Line) -{ - return (uint32_t)(READ_BIT(SYSCFG->EXTICR[Line & 0xFF], (Line >> 16)) >> POSITION_VAL(Line >> 16)); -} - -#if defined(SYSCFG_CFGR2_LOCKUP_LOCK) -/** - * @brief Set connections to TIM1/8 break inputs - * @rmtoll SYSCFG_CFGR2 LockUp Lock LL_SYSCFG_SetTIMBreakInputs \n - * SYSCFG_CFGR2 PVD Lock LL_SYSCFG_SetTIMBreakInputs - * @param Break This parameter can be a combination of the following values: - * @arg @ref LL_SYSCFG_TIMBREAK_LOCKUP - * @arg @ref LL_SYSCFG_TIMBREAK_PVD - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_SetTIMBreakInputs(uint32_t Break) -{ - MODIFY_REG(SYSCFG->CFGR2, SYSCFG_CFGR2_LOCKUP_LOCK | SYSCFG_CFGR2_PVD_LOCK, Break); -} - -/** - * @brief Get connections to TIM1/8 Break inputs - * @rmtoll SYSCFG_CFGR2 LockUp Lock LL_SYSCFG_SetTIMBreakInputs \n - * SYSCFG_CFGR2 PVD Lock LL_SYSCFG_SetTIMBreakInputs - * @retval Returned value can be can be a combination of the following values: - * @arg @ref LL_SYSCFG_TIMBREAK_LOCKUP - * @arg @ref LL_SYSCFG_TIMBREAK_PVD - */ -__STATIC_INLINE uint32_t LL_SYSCFG_GetTIMBreakInputs(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->CFGR2, SYSCFG_CFGR2_LOCKUP_LOCK | SYSCFG_CFGR2_PVD_LOCK)); -} -#endif /* SYSCFG_CFGR2_LOCKUP_LOCK */ -#if defined(SYSCFG_MCHDLYCR_BSCKSEL) -/** - * @brief Select the DFSDM2 or TIM2_OC1 as clock source for the bitstream clock. - * @rmtoll SYSCFG_MCHDLYCR BSCKSEL LL_SYSCFG_DFSDM_SetBitstreamClockSourceSelection - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_DFSDM2 - * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_TIM2OC1 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM_SetBitstreamClockSourceSelection(uint32_t ClockSource) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_BSCKSEL, ClockSource); -} -/** - * @brief Get the DFSDM2 or TIM2_OC1 as clock source for the bitstream clock. - * @rmtoll SYSCFG_MCHDLYCR BSCKSEL LL_SYSCFG_DFSDM_GetBitstreamClockSourceSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_DFSDM2 - * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_TIM2OC1 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM_GetBitstreamClockSourceSelection(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_BSCKSEL)); -} -/** - * @brief Enables the DFSDM1 or DFSDM2 Delay clock - * @rmtoll SYSCFG_MCHDLYCR MCHDLYEN LL_SYSCFG_DFSDM_EnableDelayClock - * @param MCHDLY This parameter can be one of the following values - * @arg @ref LL_SYSCFG_DFSDM1_MCHDLYEN - * @arg @ref LL_SYSCFG_DFSDM2_MCHDLYEN - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM_EnableDelayClock(uint32_t MCHDLY) -{ - SET_BIT(SYSCFG->MCHDLYCR, MCHDLY); -} - -/** - * @brief Disables the DFSDM1 or the DFSDM2 Delay clock - * @rmtoll SYSCFG_MCHDLYCR MCHDLY1EN LL_SYSCFG_DFSDM1_DisableDelayClock - * @param MCHDLY This parameter can be one of the following values - * @arg @ref LL_SYSCFG_DFSDM1_MCHDLYEN - * @arg @ref LL_SYSCFG_DFSDM2_MCHDLYEN - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM_DisableDelayClock(uint32_t MCHDLY) -{ - CLEAR_BIT(SYSCFG->MCHDLYCR, MCHDLY); -} - -/** - * @brief Select the source for DFSDM1 or DFSDM2 DatIn0 - * @rmtoll SYSCFG_MCHDLYCR DFSDMD0SEL LL_SYSCFG_DFSDM_SetDataIn0Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_DM - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM_SetDataIn0Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, (Source >> 16), (Source & 0x0000FFFF)); -} -/** - * @brief Get the source for DFSDM1 or DFSDM2 DatIn0. - * @rmtoll SYSCFG_MCHDLYCR DFSDMD0SEL LL_SYSCFG_DFSDM_GetDataIn0Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn0 - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0 - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_DM - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM_GetDataIn0Source(uint32_t Source) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, Source)); -} -/** - * @brief Select the source for DFSDM1 or DFSDM2 DatIn2 - * @rmtoll SYSCFG_MCHDLYCR DFSDMD2SEL LL_SYSCFG_DFSDM_SetDataIn2Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_DM - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM_SetDataIn2Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, (Source >> 16), (Source & 0x0000FFFF)); -} -/** - * @brief Get the source for DFSDM1 or DFSDM2 DatIn2. - * @rmtoll SYSCFG_MCHDLYCR DFSDMD2SEL LL_SYSCFG_DFSDM_GetDataIn2Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn2 - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2 - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_DM - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM_GetDataIn2Source(uint32_t Source) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, Source)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM4 OC2 - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CK02SEL LL_SYSCFG_DFSDM1_SetTIM4OC2BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN0 - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN2 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetTIM4OC2BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK02SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM4 OC2 - * @rmtoll SYSCFG_MCHDLYCR DFSDM1D2SEL LL_SYSCFG_DFSDM1_GetTIM4OC2BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN0 - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN2 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetTIM4OC2BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK02SEL)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM4 OC1 - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CK13SEL LL_SYSCFG_DFSDM1_SetTIM4OC1BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN1 - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN3 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetTIM4OC1BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK13SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM4 OC1 - * @rmtoll SYSCFG_MCHDLYCR DFSDM1D2SEL LL_SYSCFG_DFSDM1_GetTIM4OC1BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN1 - * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN3 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetTIM4OC1BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK13SEL)); -} - -/** - * @brief Select the DFSDM1 Clock In - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CFG LL_SYSCFG_DFSDM1_SetClockInSourceSelection - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_CKIN_PAD - * @arg @ref LL_SYSCFG_DFSDM1_CKIN_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetClockInSourceSelection(uint32_t ClockSource) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CFG, ClockSource); -} -/** - * @brief GET the DFSDM1 Clock In - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CFG LL_SYSCFG_DFSDM1_GetClockInSourceSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_CKIN_PAD - * @arg @ref LL_SYSCFG_DFSDM1_CKIN_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetClockInSourceSelection(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CFG)); -} - -/** - * @brief Select the DFSDM1 Clock Out - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CKOSEL LL_SYSCFG_DFSDM1_SetClockOutSourceSelection - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_CKOUT - * @arg @ref LL_SYSCFG_DFSDM1_CKOUT_M27 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetClockOutSourceSelection(uint32_t ClockSource) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CKOSEL, ClockSource); -} -/** - * @brief GET the DFSDM1 Clock Out - * @rmtoll SYSCFG_MCHDLYCR DFSDM1CKOSEL LL_SYSCFG_DFSDM1_GetClockOutSourceSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM1_CKOUT - * @arg @ref LL_SYSCFG_DFSDM1_CKOUT_M27 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetClockOutSourceSelection(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CKOSEL)); -} - -/** - * @brief Enables the DFSDM2 Delay clock - * @rmtoll SYSCFG_MCHDLYCR MCHDLY2EN LL_SYSCFG_DFSDM2_EnableDelayClock - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_EnableDelayClock(void) -{ - SET_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_MCHDLY2EN); -} - -/** - * @brief Disables the DFSDM2 Delay clock - * @rmtoll SYSCFG_MCHDLYCR MCHDLY2EN LL_SYSCFG_DFSDM2_DisableDelayClock - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_DisableDelayClock(void) -{ - CLEAR_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_MCHDLY2EN); -} -/** - * @brief Select the source for DFSDM2 DatIn0 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D0SEL LL_SYSCFG_DFSDM2_SetDataIn0Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn0Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D0SEL, Source); -} -/** - * @brief Get the source for DFSDM2 DatIn0. - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D0SEL LL_SYSCFG_DFSDM2_GetDataIn0Source - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn0Source(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D0SEL)); -} - -/** - * @brief Select the source for DFSDM2 DatIn2 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D2SEL LL_SYSCFG_DFSDM2_SetDataIn2Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn2Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D2SEL, Source); -} -/** - * @brief Get the source for DFSDM2 DatIn2. - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D2SEL LL_SYSCFG_DFSDM2_GetDataIn2Source - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn2Source(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D2SEL)); -} - -/** - * @brief Select the source for DFSDM2 DatIn4 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D4SEL LL_SYSCFG_DFSDM2_SetDataIn4Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn4Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D4SEL, Source); -} -/** - * @brief Get the source for DFSDM2 DatIn4. - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D4SEL LL_SYSCFG_DFSDM2_GetDataIn4Source - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn4Source(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D4SEL)); -} - -/** - * @brief Select the source for DFSDM2 DatIn6 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D6SEL LL_SYSCFG_DFSDM2_SetDataIn6Source - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn6Source(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D6SEL, Source); -} -/** - * @brief Get the source for DFSDM2 DatIn6. - * @rmtoll SYSCFG_MCHDLYCR DFSDM2D6SEL LL_SYSCFG_DFSDM2_GetDataIn6Source - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_PAD - * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn6Source(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D6SEL)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM3 OC4 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_SetTIM3OC4BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN0 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN4 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC4BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK04SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM3 OC4 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_GetTIM3OC4BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN0 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN4 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC4BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK04SEL)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM3 OC3 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK15SEL LL_SYSCFG_DFSDM2_SetTIM3OC3BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN1 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN5 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC3BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK15SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM3 OC4 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_GetTIM3OC3BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN1 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN5 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC3BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK15SEL)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM3 OC2 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK26SEL LL_SYSCFG_DFSDM2_SetTIM3OC2BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN2 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN6 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC2BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK26SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM3 OC2 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_GetTIM3OC2BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN2 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN6 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC2BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK26SEL)); -} - -/** - * @brief Select the distribution of the bitsream lock gated by TIM3 OC1 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK37SEL LL_SYSCFG_DFSDM2_SetTIM3OC1BitStreamDistribution - * @param Source This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN3 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN7 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC1BitStreamDistribution(uint32_t Source) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK37SEL, Source); -} -/** - * @brief Get the distribution of the bitsream lock gated by TIM3 OC1 - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK37SEL LL_SYSCFG_DFSDM2_GetTIM3OC1BitStreamDistribution - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN3 - * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN7 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC1BitStreamDistribution(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK37SEL)); -} - -/** - * @brief Select the DFSDM2 Clock In - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CFG LL_SYSCFG_DFSDM2_SetClockInSourceSelection - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_CKIN_PAD - * @arg @ref LL_SYSCFG_DFSDM2_CKIN_DM - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetClockInSourceSelection(uint32_t ClockSource) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CFG, ClockSource); -} -/** - * @brief GET the DFSDM2 Clock In - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CFG LL_SYSCFG_DFSDM2_GetClockInSourceSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_CKIN_PAD - * @arg @ref LL_SYSCFG_DFSDM2_CKIN_DM - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetClockInSourceSelection(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CFG)); -} - -/** - * @brief Select the DFSDM2 Clock Out - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CKOSEL LL_SYSCFG_DFSDM2_SetClockOutSourceSelection - * @param ClockSource This parameter can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_CKOUT - * @arg @ref LL_SYSCFG_DFSDM2_CKOUT_M27 - * @retval None - */ -__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetClockOutSourceSelection(uint32_t ClockSource) -{ - MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CKOSEL, ClockSource); -} -/** - * @brief GET the DFSDM2 Clock Out - * @rmtoll SYSCFG_MCHDLYCR DFSDM2CKOSEL LL_SYSCFG_DFSDM2_GetClockOutSourceSelection - * @retval Returned value can be one of the following values: - * @arg @ref LL_SYSCFG_DFSDM2_CKOUT - * @arg @ref LL_SYSCFG_DFSDM2_CKOUT_M27 - * @retval None - */ -__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetClockOutSourceSelection(void) -{ - return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CKOSEL)); -} - -#endif /* SYSCFG_MCHDLYCR_BSCKSEL */ -/** - * @} - */ - - -/** @defgroup SYSTEM_LL_EF_DBGMCU DBGMCU - * @{ - */ - -/** - * @brief Return the device identifier - * @note For STM32F405/407xx and STM32F415/417xx devices, the device ID is 0x413 - * @note For STM32F42xxx and STM32F43xxx devices, the device ID is 0x419 - * @note For STM32F401xx devices, the device ID is 0x423 - * @note For STM32F401xx devices, the device ID is 0x433 - * @note For STM32F411xx devices, the device ID is 0x431 - * @note For STM32F410xx devices, the device ID is 0x458 - * @note For STM32F412xx devices, the device ID is 0x441 - * @note For STM32F413xx and STM32423xx devices, the device ID is 0x463 - * @note For STM32F446xx devices, the device ID is 0x421 - * @note For STM32F469xx and STM32F479xx devices, the device ID is 0x434 - * @rmtoll DBGMCU_IDCODE DEV_ID LL_DBGMCU_GetDeviceID - * @retval Values between Min_Data=0x00 and Max_Data=0xFFF - */ -__STATIC_INLINE uint32_t LL_DBGMCU_GetDeviceID(void) -{ - return (uint32_t)(READ_BIT(DBGMCU->IDCODE, DBGMCU_IDCODE_DEV_ID)); -} - -/** - * @brief Return the device revision identifier - * @note This field indicates the revision of the device. - For example, it is read as RevA -> 0x1000, Cat 2 revZ -> 0x1001, rev1 -> 0x1003, rev2 ->0x1007, revY -> 0x100F for STM32F405/407xx and STM32F415/417xx devices - For example, it is read as RevA -> 0x1000, Cat 2 revY -> 0x1003, rev1 -> 0x1007, rev3 ->0x2001 for STM32F42xxx and STM32F43xxx devices - For example, it is read as RevZ -> 0x1000, Cat 2 revA -> 0x1001 for STM32F401xB/C devices - For example, it is read as RevA -> 0x1000, Cat 2 revZ -> 0x1001 for STM32F401xD/E devices - For example, it is read as RevA -> 0x1000 for STM32F411xx,STM32F413/423xx,STM32F469/423xx, STM32F446xx and STM32F410xx devices - For example, it is read as RevZ -> 0x1001, Cat 2 revB -> 0x2000, revC -> 0x3000 for STM32F412xx devices - * @rmtoll DBGMCU_IDCODE REV_ID LL_DBGMCU_GetRevisionID - * @retval Values between Min_Data=0x00 and Max_Data=0xFFFF - */ -__STATIC_INLINE uint32_t LL_DBGMCU_GetRevisionID(void) -{ - return (uint32_t)(READ_BIT(DBGMCU->IDCODE, DBGMCU_IDCODE_REV_ID) >> DBGMCU_IDCODE_REV_ID_Pos); -} - -/** - * @brief Enable the Debug Module during SLEEP mode - * @rmtoll DBGMCU_CR DBG_SLEEP LL_DBGMCU_EnableDBGSleepMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_EnableDBGSleepMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Disable the Debug Module during SLEEP mode - * @rmtoll DBGMCU_CR DBG_SLEEP LL_DBGMCU_DisableDBGSleepMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_DisableDBGSleepMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Enable the Debug Module during STOP mode - * @rmtoll DBGMCU_CR DBG_STOP LL_DBGMCU_EnableDBGStopMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_EnableDBGStopMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Disable the Debug Module during STOP mode - * @rmtoll DBGMCU_CR DBG_STOP LL_DBGMCU_DisableDBGStopMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_DisableDBGStopMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Enable the Debug Module during STANDBY mode - * @rmtoll DBGMCU_CR DBG_STANDBY LL_DBGMCU_EnableDBGStandbyMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_EnableDBGStandbyMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Disable the Debug Module during STANDBY mode - * @rmtoll DBGMCU_CR DBG_STANDBY LL_DBGMCU_DisableDBGStandbyMode - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_DisableDBGStandbyMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Set Trace pin assignment control - * @rmtoll DBGMCU_CR TRACE_IOEN LL_DBGMCU_SetTracePinAssignment\n - * DBGMCU_CR TRACE_MODE LL_DBGMCU_SetTracePinAssignment - * @param PinAssignment This parameter can be one of the following values: - * @arg @ref LL_DBGMCU_TRACE_NONE - * @arg @ref LL_DBGMCU_TRACE_ASYNCH - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE1 - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE2 - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE4 - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_SetTracePinAssignment(uint32_t PinAssignment) -{ - MODIFY_REG(DBGMCU->CR, DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE, PinAssignment); -} - -/** - * @brief Get Trace pin assignment control - * @rmtoll DBGMCU_CR TRACE_IOEN LL_DBGMCU_GetTracePinAssignment\n - * DBGMCU_CR TRACE_MODE LL_DBGMCU_GetTracePinAssignment - * @retval Returned value can be one of the following values: - * @arg @ref LL_DBGMCU_TRACE_NONE - * @arg @ref LL_DBGMCU_TRACE_ASYNCH - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE1 - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE2 - * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE4 - */ -__STATIC_INLINE uint32_t LL_DBGMCU_GetTracePinAssignment(void) -{ - return (uint32_t)(READ_BIT(DBGMCU->CR, DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE)); -} - -/** - * @brief Freeze APB1 peripherals (group1 peripherals) - * @rmtoll DBGMCU_APB1_FZ DBG_TIM2_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM3_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM4_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM5_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM6_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM7_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM12_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM13_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM14_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_LPTIM_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_RTC_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_WWDG_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_IWDG_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C1_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C2_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C3_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C4_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN1_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN2_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN3_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM2_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM3_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM4_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM5_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM6_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM7_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM12_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM13_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM14_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_LPTIM_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_RTC_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_WWDG_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_IWDG_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C1_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C2_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C3_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C4_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN1_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN2_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN3_STOP (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_APB1_GRP1_FreezePeriph(uint32_t Periphs) -{ - SET_BIT(DBGMCU->APB1FZ, Periphs); -} - -/** - * @brief Unfreeze APB1 peripherals (group1 peripherals) - * @rmtoll DBGMCU_APB1_FZ DBG_TIM2_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM3_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM4_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM5_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM6_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM7_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM12_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM13_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_TIM14_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_LPTIM_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_RTC_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_WWDG_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_IWDG_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C1_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C2_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C3_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_I2C4_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN1_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN2_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n - * DBGMCU_APB1_FZ DBG_CAN3_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM2_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM3_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM4_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM5_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM6_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM7_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM12_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM13_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_TIM14_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_LPTIM_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_RTC_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_WWDG_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_IWDG_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C1_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C2_STOP - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C3_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_I2C4_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN1_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN2_STOP (*) - * @arg @ref LL_DBGMCU_APB1_GRP1_CAN3_STOP (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_APB1_GRP1_UnFreezePeriph(uint32_t Periphs) -{ - CLEAR_BIT(DBGMCU->APB1FZ, Periphs); -} - -/** - * @brief Freeze APB2 peripherals - * @rmtoll DBGMCU_APB2_FZ DBG_TIM1_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM8_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM9_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM10_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM11_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM1_STOP - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM8_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM9_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM10_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM11_STOP (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_APB2_GRP1_FreezePeriph(uint32_t Periphs) -{ - SET_BIT(DBGMCU->APB2FZ, Periphs); -} - -/** - * @brief Unfreeze APB2 peripherals - * @rmtoll DBGMCU_APB2_FZ DBG_TIM1_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM8_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM9_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM10_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n - * DBGMCU_APB2_FZ DBG_TIM11_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph - * @param Periphs This parameter can be a combination of the following values: - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM1_STOP - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM8_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM9_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM10_STOP (*) - * @arg @ref LL_DBGMCU_APB2_GRP1_TIM11_STOP (*) - * - * (*) value not defined in all devices. - * @retval None - */ -__STATIC_INLINE void LL_DBGMCU_APB2_GRP1_UnFreezePeriph(uint32_t Periphs) -{ - CLEAR_BIT(DBGMCU->APB2FZ, Periphs); -} -/** - * @} - */ - -/** @defgroup SYSTEM_LL_EF_FLASH FLASH - * @{ - */ - -/** - * @brief Set FLASH Latency - * @rmtoll FLASH_ACR LATENCY LL_FLASH_SetLatency - * @param Latency This parameter can be one of the following values: - * @arg @ref LL_FLASH_LATENCY_0 - * @arg @ref LL_FLASH_LATENCY_1 - * @arg @ref LL_FLASH_LATENCY_2 - * @arg @ref LL_FLASH_LATENCY_3 - * @arg @ref LL_FLASH_LATENCY_4 - * @arg @ref LL_FLASH_LATENCY_5 - * @arg @ref LL_FLASH_LATENCY_6 - * @arg @ref LL_FLASH_LATENCY_7 - * @arg @ref LL_FLASH_LATENCY_8 - * @arg @ref LL_FLASH_LATENCY_9 - * @arg @ref LL_FLASH_LATENCY_10 - * @arg @ref LL_FLASH_LATENCY_11 - * @arg @ref LL_FLASH_LATENCY_12 - * @arg @ref LL_FLASH_LATENCY_13 - * @arg @ref LL_FLASH_LATENCY_14 - * @arg @ref LL_FLASH_LATENCY_15 - * @retval None - */ -__STATIC_INLINE void LL_FLASH_SetLatency(uint32_t Latency) -{ - MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, Latency); -} - -/** - * @brief Get FLASH Latency - * @rmtoll FLASH_ACR LATENCY LL_FLASH_GetLatency - * @retval Returned value can be one of the following values: - * @arg @ref LL_FLASH_LATENCY_0 - * @arg @ref LL_FLASH_LATENCY_1 - * @arg @ref LL_FLASH_LATENCY_2 - * @arg @ref LL_FLASH_LATENCY_3 - * @arg @ref LL_FLASH_LATENCY_4 - * @arg @ref LL_FLASH_LATENCY_5 - * @arg @ref LL_FLASH_LATENCY_6 - * @arg @ref LL_FLASH_LATENCY_7 - * @arg @ref LL_FLASH_LATENCY_8 - * @arg @ref LL_FLASH_LATENCY_9 - * @arg @ref LL_FLASH_LATENCY_10 - * @arg @ref LL_FLASH_LATENCY_11 - * @arg @ref LL_FLASH_LATENCY_12 - * @arg @ref LL_FLASH_LATENCY_13 - * @arg @ref LL_FLASH_LATENCY_14 - * @arg @ref LL_FLASH_LATENCY_15 - */ -__STATIC_INLINE uint32_t LL_FLASH_GetLatency(void) -{ - return (uint32_t)(READ_BIT(FLASH->ACR, FLASH_ACR_LATENCY)); -} - -/** - * @brief Enable Prefetch - * @rmtoll FLASH_ACR PRFTEN LL_FLASH_EnablePrefetch - * @retval None - */ -__STATIC_INLINE void LL_FLASH_EnablePrefetch(void) -{ - SET_BIT(FLASH->ACR, FLASH_ACR_PRFTEN); -} - -/** - * @brief Disable Prefetch - * @rmtoll FLASH_ACR PRFTEN LL_FLASH_DisablePrefetch - * @retval None - */ -__STATIC_INLINE void LL_FLASH_DisablePrefetch(void) -{ - CLEAR_BIT(FLASH->ACR, FLASH_ACR_PRFTEN); -} - -/** - * @brief Check if Prefetch buffer is enabled - * @rmtoll FLASH_ACR PRFTEN LL_FLASH_IsPrefetchEnabled - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_FLASH_IsPrefetchEnabled(void) -{ - return (READ_BIT(FLASH->ACR, FLASH_ACR_PRFTEN) == (FLASH_ACR_PRFTEN)); -} - -/** - * @brief Enable Instruction cache - * @rmtoll FLASH_ACR ICEN LL_FLASH_EnableInstCache - * @retval None - */ -__STATIC_INLINE void LL_FLASH_EnableInstCache(void) -{ - SET_BIT(FLASH->ACR, FLASH_ACR_ICEN); -} - -/** - * @brief Disable Instruction cache - * @rmtoll FLASH_ACR ICEN LL_FLASH_DisableInstCache - * @retval None - */ -__STATIC_INLINE void LL_FLASH_DisableInstCache(void) -{ - CLEAR_BIT(FLASH->ACR, FLASH_ACR_ICEN); -} - -/** - * @brief Enable Data cache - * @rmtoll FLASH_ACR DCEN LL_FLASH_EnableDataCache - * @retval None - */ -__STATIC_INLINE void LL_FLASH_EnableDataCache(void) -{ - SET_BIT(FLASH->ACR, FLASH_ACR_DCEN); -} - -/** - * @brief Disable Data cache - * @rmtoll FLASH_ACR DCEN LL_FLASH_DisableDataCache - * @retval None - */ -__STATIC_INLINE void LL_FLASH_DisableDataCache(void) -{ - CLEAR_BIT(FLASH->ACR, FLASH_ACR_DCEN); -} - -/** - * @brief Enable Instruction cache reset - * @note bit can be written only when the instruction cache is disabled - * @rmtoll FLASH_ACR ICRST LL_FLASH_EnableInstCacheReset - * @retval None - */ -__STATIC_INLINE void LL_FLASH_EnableInstCacheReset(void) -{ - SET_BIT(FLASH->ACR, FLASH_ACR_ICRST); -} - -/** - * @brief Disable Instruction cache reset - * @rmtoll FLASH_ACR ICRST LL_FLASH_DisableInstCacheReset - * @retval None - */ -__STATIC_INLINE void LL_FLASH_DisableInstCacheReset(void) -{ - CLEAR_BIT(FLASH->ACR, FLASH_ACR_ICRST); -} - -/** - * @brief Enable Data cache reset - * @note bit can be written only when the data cache is disabled - * @rmtoll FLASH_ACR DCRST LL_FLASH_EnableDataCacheReset - * @retval None - */ -__STATIC_INLINE void LL_FLASH_EnableDataCacheReset(void) -{ - SET_BIT(FLASH->ACR, FLASH_ACR_DCRST); -} - -/** - * @brief Disable Data cache reset - * @rmtoll FLASH_ACR DCRST LL_FLASH_DisableDataCacheReset - * @retval None - */ -__STATIC_INLINE void LL_FLASH_DisableDataCacheReset(void) -{ - CLEAR_BIT(FLASH->ACR, FLASH_ACR_DCRST); -} - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* defined (FLASH) || defined (SYSCFG) || defined (DBGMCU) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_SYSTEM_H */ - - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h deleted file mode 100644 index ed83b6c..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h +++ /dev/null @@ -1,2521 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_usart.h - * @author MCD Application Team - * @brief Header file of USART LL module. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_USART_H -#define __STM32F4xx_LL_USART_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_LL_Driver - * @{ - */ - -#if defined (USART1) || defined (USART2) || defined (USART3) || defined (USART6) || defined (UART4) || defined (UART5) || defined (UART7) || defined (UART8) || defined (UART9) || defined (UART10) - -/** @defgroup USART_LL USART - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup USART_LL_Private_Constants USART Private Constants - * @{ - */ - -/* Defines used for the bit position in the register and perform offsets*/ -#define USART_POSITION_GTPR_GT USART_GTPR_GT_Pos -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup USART_LL_Private_Macros USART Private Macros - * @{ - */ -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/* Exported types ------------------------------------------------------------*/ -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup USART_LL_ES_INIT USART Exported Init structures - * @{ - */ - -/** - * @brief LL USART Init Structure definition - */ -typedef struct -{ - uint32_t BaudRate; /*!< This field defines expected Usart communication baud rate. - - This feature can be modified afterwards using unitary function @ref LL_USART_SetBaudRate().*/ - - uint32_t DataWidth; /*!< Specifies the number of data bits transmitted or received in a frame. - This parameter can be a value of @ref USART_LL_EC_DATAWIDTH. - - This feature can be modified afterwards using unitary function @ref LL_USART_SetDataWidth().*/ - - uint32_t StopBits; /*!< Specifies the number of stop bits transmitted. - This parameter can be a value of @ref USART_LL_EC_STOPBITS. - - This feature can be modified afterwards using unitary function @ref LL_USART_SetStopBitsLength().*/ - - uint32_t Parity; /*!< Specifies the parity mode. - This parameter can be a value of @ref USART_LL_EC_PARITY. - - This feature can be modified afterwards using unitary function @ref LL_USART_SetParity().*/ - - uint32_t TransferDirection; /*!< Specifies whether the Receive and/or Transmit mode is enabled or disabled. - This parameter can be a value of @ref USART_LL_EC_DIRECTION. - - This feature can be modified afterwards using unitary function @ref LL_USART_SetTransferDirection().*/ - - uint32_t HardwareFlowControl; /*!< Specifies whether the hardware flow control mode is enabled or disabled. - This parameter can be a value of @ref USART_LL_EC_HWCONTROL. - - This feature can be modified afterwards using unitary function @ref LL_USART_SetHWFlowCtrl().*/ - - uint32_t OverSampling; /*!< Specifies whether USART oversampling mode is 16 or 8. - This parameter can be a value of @ref USART_LL_EC_OVERSAMPLING. - - This feature can be modified afterwards using unitary function @ref LL_USART_SetOverSampling().*/ - -} LL_USART_InitTypeDef; - -/** - * @brief LL USART Clock Init Structure definition - */ -typedef struct -{ - uint32_t ClockOutput; /*!< Specifies whether the USART clock is enabled or disabled. - This parameter can be a value of @ref USART_LL_EC_CLOCK. - - USART HW configuration can be modified afterwards using unitary functions - @ref LL_USART_EnableSCLKOutput() or @ref LL_USART_DisableSCLKOutput(). - For more details, refer to description of this function. */ - - uint32_t ClockPolarity; /*!< Specifies the steady state of the serial clock. - This parameter can be a value of @ref USART_LL_EC_POLARITY. - - USART HW configuration can be modified afterwards using unitary functions @ref LL_USART_SetClockPolarity(). - For more details, refer to description of this function. */ - - uint32_t ClockPhase; /*!< Specifies the clock transition on which the bit capture is made. - This parameter can be a value of @ref USART_LL_EC_PHASE. - - USART HW configuration can be modified afterwards using unitary functions @ref LL_USART_SetClockPhase(). - For more details, refer to description of this function. */ - - uint32_t LastBitClockPulse; /*!< Specifies whether the clock pulse corresponding to the last transmitted - data bit (MSB) has to be output on the SCLK pin in synchronous mode. - This parameter can be a value of @ref USART_LL_EC_LASTCLKPULSE. - - USART HW configuration can be modified afterwards using unitary functions @ref LL_USART_SetLastClkPulseOutput(). - For more details, refer to description of this function. */ - -} LL_USART_ClockInitTypeDef; - -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup USART_LL_Exported_Constants USART Exported Constants - * @{ - */ - -/** @defgroup USART_LL_EC_GET_FLAG Get Flags Defines - * @brief Flags defines which can be used with LL_USART_ReadReg function - * @{ - */ -#define LL_USART_SR_PE USART_SR_PE /*!< Parity error flag */ -#define LL_USART_SR_FE USART_SR_FE /*!< Framing error flag */ -#define LL_USART_SR_NE USART_SR_NE /*!< Noise detected flag */ -#define LL_USART_SR_ORE USART_SR_ORE /*!< Overrun error flag */ -#define LL_USART_SR_IDLE USART_SR_IDLE /*!< Idle line detected flag */ -#define LL_USART_SR_RXNE USART_SR_RXNE /*!< Read data register not empty flag */ -#define LL_USART_SR_TC USART_SR_TC /*!< Transmission complete flag */ -#define LL_USART_SR_TXE USART_SR_TXE /*!< Transmit data register empty flag */ -#define LL_USART_SR_LBD USART_SR_LBD /*!< LIN break detection flag */ -#define LL_USART_SR_CTS USART_SR_CTS /*!< CTS flag */ -/** - * @} - */ - -/** @defgroup USART_LL_EC_IT IT Defines - * @brief IT defines which can be used with LL_USART_ReadReg and LL_USART_WriteReg functions - * @{ - */ -#define LL_USART_CR1_IDLEIE USART_CR1_IDLEIE /*!< IDLE interrupt enable */ -#define LL_USART_CR1_RXNEIE USART_CR1_RXNEIE /*!< Read data register not empty interrupt enable */ -#define LL_USART_CR1_TCIE USART_CR1_TCIE /*!< Transmission complete interrupt enable */ -#define LL_USART_CR1_TXEIE USART_CR1_TXEIE /*!< Transmit data register empty interrupt enable */ -#define LL_USART_CR1_PEIE USART_CR1_PEIE /*!< Parity error */ -#define LL_USART_CR2_LBDIE USART_CR2_LBDIE /*!< LIN break detection interrupt enable */ -#define LL_USART_CR3_EIE USART_CR3_EIE /*!< Error interrupt enable */ -#define LL_USART_CR3_CTSIE USART_CR3_CTSIE /*!< CTS interrupt enable */ -/** - * @} - */ - -/** @defgroup USART_LL_EC_DIRECTION Communication Direction - * @{ - */ -#define LL_USART_DIRECTION_NONE 0x00000000U /*!< Transmitter and Receiver are disabled */ -#define LL_USART_DIRECTION_RX USART_CR1_RE /*!< Transmitter is disabled and Receiver is enabled */ -#define LL_USART_DIRECTION_TX USART_CR1_TE /*!< Transmitter is enabled and Receiver is disabled */ -#define LL_USART_DIRECTION_TX_RX (USART_CR1_TE |USART_CR1_RE) /*!< Transmitter and Receiver are enabled */ -/** - * @} - */ - -/** @defgroup USART_LL_EC_PARITY Parity Control - * @{ - */ -#define LL_USART_PARITY_NONE 0x00000000U /*!< Parity control disabled */ -#define LL_USART_PARITY_EVEN USART_CR1_PCE /*!< Parity control enabled and Even Parity is selected */ -#define LL_USART_PARITY_ODD (USART_CR1_PCE | USART_CR1_PS) /*!< Parity control enabled and Odd Parity is selected */ -/** - * @} - */ - -/** @defgroup USART_LL_EC_WAKEUP Wakeup - * @{ - */ -#define LL_USART_WAKEUP_IDLELINE 0x00000000U /*!< USART wake up from Mute mode on Idle Line */ -#define LL_USART_WAKEUP_ADDRESSMARK USART_CR1_WAKE /*!< USART wake up from Mute mode on Address Mark */ -/** - * @} - */ - -/** @defgroup USART_LL_EC_DATAWIDTH Datawidth - * @{ - */ -#define LL_USART_DATAWIDTH_8B 0x00000000U /*!< 8 bits word length : Start bit, 8 data bits, n stop bits */ -#define LL_USART_DATAWIDTH_9B USART_CR1_M /*!< 9 bits word length : Start bit, 9 data bits, n stop bits */ -/** - * @} - */ - -/** @defgroup USART_LL_EC_OVERSAMPLING Oversampling - * @{ - */ -#define LL_USART_OVERSAMPLING_16 0x00000000U /*!< Oversampling by 16 */ -#define LL_USART_OVERSAMPLING_8 USART_CR1_OVER8 /*!< Oversampling by 8 */ -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup USART_LL_EC_CLOCK Clock Signal - * @{ - */ - -#define LL_USART_CLOCK_DISABLE 0x00000000U /*!< Clock signal not provided */ -#define LL_USART_CLOCK_ENABLE USART_CR2_CLKEN /*!< Clock signal provided */ -/** - * @} - */ -#endif /*USE_FULL_LL_DRIVER*/ - -/** @defgroup USART_LL_EC_LASTCLKPULSE Last Clock Pulse - * @{ - */ -#define LL_USART_LASTCLKPULSE_NO_OUTPUT 0x00000000U /*!< The clock pulse of the last data bit is not output to the SCLK pin */ -#define LL_USART_LASTCLKPULSE_OUTPUT USART_CR2_LBCL /*!< The clock pulse of the last data bit is output to the SCLK pin */ -/** - * @} - */ - -/** @defgroup USART_LL_EC_PHASE Clock Phase - * @{ - */ -#define LL_USART_PHASE_1EDGE 0x00000000U /*!< The first clock transition is the first data capture edge */ -#define LL_USART_PHASE_2EDGE USART_CR2_CPHA /*!< The second clock transition is the first data capture edge */ -/** - * @} - */ - -/** @defgroup USART_LL_EC_POLARITY Clock Polarity - * @{ - */ -#define LL_USART_POLARITY_LOW 0x00000000U /*!< Steady low value on SCLK pin outside transmission window*/ -#define LL_USART_POLARITY_HIGH USART_CR2_CPOL /*!< Steady high value on SCLK pin outside transmission window */ -/** - * @} - */ - -/** @defgroup USART_LL_EC_STOPBITS Stop Bits - * @{ - */ -#define LL_USART_STOPBITS_0_5 USART_CR2_STOP_0 /*!< 0.5 stop bit */ -#define LL_USART_STOPBITS_1 0x00000000U /*!< 1 stop bit */ -#define LL_USART_STOPBITS_1_5 (USART_CR2_STOP_0 | USART_CR2_STOP_1) /*!< 1.5 stop bits */ -#define LL_USART_STOPBITS_2 USART_CR2_STOP_1 /*!< 2 stop bits */ -/** - * @} - */ - -/** @defgroup USART_LL_EC_HWCONTROL Hardware Control - * @{ - */ -#define LL_USART_HWCONTROL_NONE 0x00000000U /*!< CTS and RTS hardware flow control disabled */ -#define LL_USART_HWCONTROL_RTS USART_CR3_RTSE /*!< RTS output enabled, data is only requested when there is space in the receive buffer */ -#define LL_USART_HWCONTROL_CTS USART_CR3_CTSE /*!< CTS mode enabled, data is only transmitted when the nCTS input is asserted (tied to 0) */ -#define LL_USART_HWCONTROL_RTS_CTS (USART_CR3_RTSE | USART_CR3_CTSE) /*!< CTS and RTS hardware flow control enabled */ -/** - * @} - */ - -/** @defgroup USART_LL_EC_IRDA_POWER IrDA Power - * @{ - */ -#define LL_USART_IRDA_POWER_NORMAL 0x00000000U /*!< IrDA normal power mode */ -#define LL_USART_IRDA_POWER_LOW USART_CR3_IRLP /*!< IrDA low power mode */ -/** - * @} - */ - -/** @defgroup USART_LL_EC_LINBREAK_DETECT LIN Break Detection Length - * @{ - */ -#define LL_USART_LINBREAK_DETECT_10B 0x00000000U /*!< 10-bit break detection method selected */ -#define LL_USART_LINBREAK_DETECT_11B USART_CR2_LBDL /*!< 11-bit break detection method selected */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup USART_LL_Exported_Macros USART Exported Macros - * @{ - */ - -/** @defgroup USART_LL_EM_WRITE_READ Common Write and read registers Macros - * @{ - */ - -/** - * @brief Write a value in USART register - * @param __INSTANCE__ USART Instance - * @param __REG__ Register to be written - * @param __VALUE__ Value to be written in the register - * @retval None - */ -#define LL_USART_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) - -/** - * @brief Read a value in USART register - * @param __INSTANCE__ USART Instance - * @param __REG__ Register to be read - * @retval Register value - */ -#define LL_USART_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) -/** - * @} - */ - -/** @defgroup USART_LL_EM_Exported_Macros_Helper Exported Macros Helper - * @{ - */ - -/** - * @brief Compute USARTDIV value according to Peripheral Clock and - * expected Baud Rate in 8 bits sampling mode (32 bits value of USARTDIV is returned) - * @param __PERIPHCLK__ Peripheral Clock frequency used for USART instance - * @param __BAUDRATE__ Baud rate value to achieve - * @retval USARTDIV value to be used for BRR register filling in OverSampling_8 case - */ -#define __LL_USART_DIV_SAMPLING8_100(__PERIPHCLK__, __BAUDRATE__) ((uint32_t)((((uint64_t)(__PERIPHCLK__))*25)/(2*((uint64_t)(__BAUDRATE__))))) -#define __LL_USART_DIVMANT_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) (__LL_USART_DIV_SAMPLING8_100((__PERIPHCLK__), (__BAUDRATE__))/100) -#define __LL_USART_DIVFRAQ_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) ((((__LL_USART_DIV_SAMPLING8_100((__PERIPHCLK__), (__BAUDRATE__)) - (__LL_USART_DIVMANT_SAMPLING8((__PERIPHCLK__), (__BAUDRATE__)) * 100)) * 8)\ - + 50) / 100) -/* UART BRR = mantissa + overflow + fraction - = (UART DIVMANT << 4) + ((UART DIVFRAQ & 0xF8) << 1) + (UART DIVFRAQ & 0x07) */ -#define __LL_USART_DIV_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) (((__LL_USART_DIVMANT_SAMPLING8((__PERIPHCLK__), (__BAUDRATE__)) << 4) + \ - ((__LL_USART_DIVFRAQ_SAMPLING8((__PERIPHCLK__), (__BAUDRATE__)) & 0xF8) << 1)) + \ - (__LL_USART_DIVFRAQ_SAMPLING8((__PERIPHCLK__), (__BAUDRATE__)) & 0x07)) - -/** - * @brief Compute USARTDIV value according to Peripheral Clock and - * expected Baud Rate in 16 bits sampling mode (32 bits value of USARTDIV is returned) - * @param __PERIPHCLK__ Peripheral Clock frequency used for USART instance - * @param __BAUDRATE__ Baud rate value to achieve - * @retval USARTDIV value to be used for BRR register filling in OverSampling_16 case - */ -#define __LL_USART_DIV_SAMPLING16_100(__PERIPHCLK__, __BAUDRATE__) ((uint32_t)((((uint64_t)(__PERIPHCLK__))*25)/(4*((uint64_t)(__BAUDRATE__))))) -#define __LL_USART_DIVMANT_SAMPLING16(__PERIPHCLK__, __BAUDRATE__) (__LL_USART_DIV_SAMPLING16_100((__PERIPHCLK__), (__BAUDRATE__))/100) -#define __LL_USART_DIVFRAQ_SAMPLING16(__PERIPHCLK__, __BAUDRATE__) ((((__LL_USART_DIV_SAMPLING16_100((__PERIPHCLK__), (__BAUDRATE__)) - (__LL_USART_DIVMANT_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) * 100)) * 16)\ - + 50) / 100) -/* USART BRR = mantissa + overflow + fraction - = (USART DIVMANT << 4) + (USART DIVFRAQ & 0xF0) + (USART DIVFRAQ & 0x0F) */ -#define __LL_USART_DIV_SAMPLING16(__PERIPHCLK__, __BAUDRATE__) (((__LL_USART_DIVMANT_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) << 4) + \ - (__LL_USART_DIVFRAQ_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) & 0xF0)) + \ - (__LL_USART_DIVFRAQ_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) & 0x0F)) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup USART_LL_Exported_Functions USART Exported Functions - * @{ - */ - -/** @defgroup USART_LL_EF_Configuration Configuration functions - * @{ - */ - -/** - * @brief USART Enable - * @rmtoll CR1 UE LL_USART_Enable - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_Enable(USART_TypeDef *USARTx) -{ - SET_BIT(USARTx->CR1, USART_CR1_UE); -} - -/** - * @brief USART Disable (all USART prescalers and outputs are disabled) - * @note When USART is disabled, USART prescalers and outputs are stopped immediately, - * and current operations are discarded. The configuration of the USART is kept, but all the status - * flags, in the USARTx_SR are set to their default values. - * @rmtoll CR1 UE LL_USART_Disable - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_Disable(USART_TypeDef *USARTx) -{ - CLEAR_BIT(USARTx->CR1, USART_CR1_UE); -} - -/** - * @brief Indicate if USART is enabled - * @rmtoll CR1 UE LL_USART_IsEnabled - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabled(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR1, USART_CR1_UE) == (USART_CR1_UE)); -} - -/** - * @brief Receiver Enable (Receiver is enabled and begins searching for a start bit) - * @rmtoll CR1 RE LL_USART_EnableDirectionRx - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableDirectionRx(USART_TypeDef *USARTx) -{ - ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_RE); -} - -/** - * @brief Receiver Disable - * @rmtoll CR1 RE LL_USART_DisableDirectionRx - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableDirectionRx(USART_TypeDef *USARTx) -{ - ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_RE); -} - -/** - * @brief Transmitter Enable - * @rmtoll CR1 TE LL_USART_EnableDirectionTx - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableDirectionTx(USART_TypeDef *USARTx) -{ - ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_TE); -} - -/** - * @brief Transmitter Disable - * @rmtoll CR1 TE LL_USART_DisableDirectionTx - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableDirectionTx(USART_TypeDef *USARTx) -{ - ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_TE); -} - -/** - * @brief Configure simultaneously enabled/disabled states - * of Transmitter and Receiver - * @rmtoll CR1 RE LL_USART_SetTransferDirection\n - * CR1 TE LL_USART_SetTransferDirection - * @param USARTx USART Instance - * @param TransferDirection This parameter can be one of the following values: - * @arg @ref LL_USART_DIRECTION_NONE - * @arg @ref LL_USART_DIRECTION_RX - * @arg @ref LL_USART_DIRECTION_TX - * @arg @ref LL_USART_DIRECTION_TX_RX - * @retval None - */ -__STATIC_INLINE void LL_USART_SetTransferDirection(USART_TypeDef *USARTx, uint32_t TransferDirection) -{ - ATOMIC_MODIFY_REG(USARTx->CR1, USART_CR1_RE | USART_CR1_TE, TransferDirection); -} - -/** - * @brief Return enabled/disabled states of Transmitter and Receiver - * @rmtoll CR1 RE LL_USART_GetTransferDirection\n - * CR1 TE LL_USART_GetTransferDirection - * @param USARTx USART Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_USART_DIRECTION_NONE - * @arg @ref LL_USART_DIRECTION_RX - * @arg @ref LL_USART_DIRECTION_TX - * @arg @ref LL_USART_DIRECTION_TX_RX - */ -__STATIC_INLINE uint32_t LL_USART_GetTransferDirection(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_RE | USART_CR1_TE)); -} - -/** - * @brief Configure Parity (enabled/disabled and parity mode if enabled). - * @note This function selects if hardware parity control (generation and detection) is enabled or disabled. - * When the parity control is enabled (Odd or Even), computed parity bit is inserted at the MSB position - * (9th or 8th bit depending on data width) and parity is checked on the received data. - * @rmtoll CR1 PS LL_USART_SetParity\n - * CR1 PCE LL_USART_SetParity - * @param USARTx USART Instance - * @param Parity This parameter can be one of the following values: - * @arg @ref LL_USART_PARITY_NONE - * @arg @ref LL_USART_PARITY_EVEN - * @arg @ref LL_USART_PARITY_ODD - * @retval None - */ -__STATIC_INLINE void LL_USART_SetParity(USART_TypeDef *USARTx, uint32_t Parity) -{ - MODIFY_REG(USARTx->CR1, USART_CR1_PS | USART_CR1_PCE, Parity); -} - -/** - * @brief Return Parity configuration (enabled/disabled and parity mode if enabled) - * @rmtoll CR1 PS LL_USART_GetParity\n - * CR1 PCE LL_USART_GetParity - * @param USARTx USART Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_USART_PARITY_NONE - * @arg @ref LL_USART_PARITY_EVEN - * @arg @ref LL_USART_PARITY_ODD - */ -__STATIC_INLINE uint32_t LL_USART_GetParity(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_PS | USART_CR1_PCE)); -} - -/** - * @brief Set Receiver Wake Up method from Mute mode. - * @rmtoll CR1 WAKE LL_USART_SetWakeUpMethod - * @param USARTx USART Instance - * @param Method This parameter can be one of the following values: - * @arg @ref LL_USART_WAKEUP_IDLELINE - * @arg @ref LL_USART_WAKEUP_ADDRESSMARK - * @retval None - */ -__STATIC_INLINE void LL_USART_SetWakeUpMethod(USART_TypeDef *USARTx, uint32_t Method) -{ - MODIFY_REG(USARTx->CR1, USART_CR1_WAKE, Method); -} - -/** - * @brief Return Receiver Wake Up method from Mute mode - * @rmtoll CR1 WAKE LL_USART_GetWakeUpMethod - * @param USARTx USART Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_USART_WAKEUP_IDLELINE - * @arg @ref LL_USART_WAKEUP_ADDRESSMARK - */ -__STATIC_INLINE uint32_t LL_USART_GetWakeUpMethod(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_WAKE)); -} - -/** - * @brief Set Word length (i.e. nb of data bits, excluding start and stop bits) - * @rmtoll CR1 M LL_USART_SetDataWidth - * @param USARTx USART Instance - * @param DataWidth This parameter can be one of the following values: - * @arg @ref LL_USART_DATAWIDTH_8B - * @arg @ref LL_USART_DATAWIDTH_9B - * @retval None - */ -__STATIC_INLINE void LL_USART_SetDataWidth(USART_TypeDef *USARTx, uint32_t DataWidth) -{ - MODIFY_REG(USARTx->CR1, USART_CR1_M, DataWidth); -} - -/** - * @brief Return Word length (i.e. nb of data bits, excluding start and stop bits) - * @rmtoll CR1 M LL_USART_GetDataWidth - * @param USARTx USART Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_USART_DATAWIDTH_8B - * @arg @ref LL_USART_DATAWIDTH_9B - */ -__STATIC_INLINE uint32_t LL_USART_GetDataWidth(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_M)); -} - -/** - * @brief Set Oversampling to 8-bit or 16-bit mode - * @rmtoll CR1 OVER8 LL_USART_SetOverSampling - * @param USARTx USART Instance - * @param OverSampling This parameter can be one of the following values: - * @arg @ref LL_USART_OVERSAMPLING_16 - * @arg @ref LL_USART_OVERSAMPLING_8 - * @retval None - */ -__STATIC_INLINE void LL_USART_SetOverSampling(USART_TypeDef *USARTx, uint32_t OverSampling) -{ - MODIFY_REG(USARTx->CR1, USART_CR1_OVER8, OverSampling); -} - -/** - * @brief Return Oversampling mode - * @rmtoll CR1 OVER8 LL_USART_GetOverSampling - * @param USARTx USART Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_USART_OVERSAMPLING_16 - * @arg @ref LL_USART_OVERSAMPLING_8 - */ -__STATIC_INLINE uint32_t LL_USART_GetOverSampling(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_OVER8)); -} - -/** - * @brief Configure if Clock pulse of the last data bit is output to the SCLK pin or not - * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not - * Synchronous mode is supported by the USARTx instance. - * @rmtoll CR2 LBCL LL_USART_SetLastClkPulseOutput - * @param USARTx USART Instance - * @param LastBitClockPulse This parameter can be one of the following values: - * @arg @ref LL_USART_LASTCLKPULSE_NO_OUTPUT - * @arg @ref LL_USART_LASTCLKPULSE_OUTPUT - * @retval None - */ -__STATIC_INLINE void LL_USART_SetLastClkPulseOutput(USART_TypeDef *USARTx, uint32_t LastBitClockPulse) -{ - MODIFY_REG(USARTx->CR2, USART_CR2_LBCL, LastBitClockPulse); -} - -/** - * @brief Retrieve Clock pulse of the last data bit output configuration - * (Last bit Clock pulse output to the SCLK pin or not) - * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not - * Synchronous mode is supported by the USARTx instance. - * @rmtoll CR2 LBCL LL_USART_GetLastClkPulseOutput - * @param USARTx USART Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_USART_LASTCLKPULSE_NO_OUTPUT - * @arg @ref LL_USART_LASTCLKPULSE_OUTPUT - */ -__STATIC_INLINE uint32_t LL_USART_GetLastClkPulseOutput(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_LBCL)); -} - -/** - * @brief Select the phase of the clock output on the SCLK pin in synchronous mode - * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not - * Synchronous mode is supported by the USARTx instance. - * @rmtoll CR2 CPHA LL_USART_SetClockPhase - * @param USARTx USART Instance - * @param ClockPhase This parameter can be one of the following values: - * @arg @ref LL_USART_PHASE_1EDGE - * @arg @ref LL_USART_PHASE_2EDGE - * @retval None - */ -__STATIC_INLINE void LL_USART_SetClockPhase(USART_TypeDef *USARTx, uint32_t ClockPhase) -{ - MODIFY_REG(USARTx->CR2, USART_CR2_CPHA, ClockPhase); -} - -/** - * @brief Return phase of the clock output on the SCLK pin in synchronous mode - * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not - * Synchronous mode is supported by the USARTx instance. - * @rmtoll CR2 CPHA LL_USART_GetClockPhase - * @param USARTx USART Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_USART_PHASE_1EDGE - * @arg @ref LL_USART_PHASE_2EDGE - */ -__STATIC_INLINE uint32_t LL_USART_GetClockPhase(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_CPHA)); -} - -/** - * @brief Select the polarity of the clock output on the SCLK pin in synchronous mode - * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not - * Synchronous mode is supported by the USARTx instance. - * @rmtoll CR2 CPOL LL_USART_SetClockPolarity - * @param USARTx USART Instance - * @param ClockPolarity This parameter can be one of the following values: - * @arg @ref LL_USART_POLARITY_LOW - * @arg @ref LL_USART_POLARITY_HIGH - * @retval None - */ -__STATIC_INLINE void LL_USART_SetClockPolarity(USART_TypeDef *USARTx, uint32_t ClockPolarity) -{ - MODIFY_REG(USARTx->CR2, USART_CR2_CPOL, ClockPolarity); -} - -/** - * @brief Return polarity of the clock output on the SCLK pin in synchronous mode - * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not - * Synchronous mode is supported by the USARTx instance. - * @rmtoll CR2 CPOL LL_USART_GetClockPolarity - * @param USARTx USART Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_USART_POLARITY_LOW - * @arg @ref LL_USART_POLARITY_HIGH - */ -__STATIC_INLINE uint32_t LL_USART_GetClockPolarity(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_CPOL)); -} - -/** - * @brief Configure Clock signal format (Phase Polarity and choice about output of last bit clock pulse) - * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not - * Synchronous mode is supported by the USARTx instance. - * @note Call of this function is equivalent to following function call sequence : - * - Clock Phase configuration using @ref LL_USART_SetClockPhase() function - * - Clock Polarity configuration using @ref LL_USART_SetClockPolarity() function - * - Output of Last bit Clock pulse configuration using @ref LL_USART_SetLastClkPulseOutput() function - * @rmtoll CR2 CPHA LL_USART_ConfigClock\n - * CR2 CPOL LL_USART_ConfigClock\n - * CR2 LBCL LL_USART_ConfigClock - * @param USARTx USART Instance - * @param Phase This parameter can be one of the following values: - * @arg @ref LL_USART_PHASE_1EDGE - * @arg @ref LL_USART_PHASE_2EDGE - * @param Polarity This parameter can be one of the following values: - * @arg @ref LL_USART_POLARITY_LOW - * @arg @ref LL_USART_POLARITY_HIGH - * @param LBCPOutput This parameter can be one of the following values: - * @arg @ref LL_USART_LASTCLKPULSE_NO_OUTPUT - * @arg @ref LL_USART_LASTCLKPULSE_OUTPUT - * @retval None - */ -__STATIC_INLINE void LL_USART_ConfigClock(USART_TypeDef *USARTx, uint32_t Phase, uint32_t Polarity, uint32_t LBCPOutput) -{ - MODIFY_REG(USARTx->CR2, USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_LBCL, Phase | Polarity | LBCPOutput); -} - -/** - * @brief Enable Clock output on SCLK pin - * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not - * Synchronous mode is supported by the USARTx instance. - * @rmtoll CR2 CLKEN LL_USART_EnableSCLKOutput - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableSCLKOutput(USART_TypeDef *USARTx) -{ - SET_BIT(USARTx->CR2, USART_CR2_CLKEN); -} - -/** - * @brief Disable Clock output on SCLK pin - * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not - * Synchronous mode is supported by the USARTx instance. - * @rmtoll CR2 CLKEN LL_USART_DisableSCLKOutput - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableSCLKOutput(USART_TypeDef *USARTx) -{ - CLEAR_BIT(USARTx->CR2, USART_CR2_CLKEN); -} - -/** - * @brief Indicate if Clock output on SCLK pin is enabled - * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not - * Synchronous mode is supported by the USARTx instance. - * @rmtoll CR2 CLKEN LL_USART_IsEnabledSCLKOutput - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledSCLKOutput(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR2, USART_CR2_CLKEN) == (USART_CR2_CLKEN)); -} - -/** - * @brief Set the length of the stop bits - * @rmtoll CR2 STOP LL_USART_SetStopBitsLength - * @param USARTx USART Instance - * @param StopBits This parameter can be one of the following values: - * @arg @ref LL_USART_STOPBITS_0_5 - * @arg @ref LL_USART_STOPBITS_1 - * @arg @ref LL_USART_STOPBITS_1_5 - * @arg @ref LL_USART_STOPBITS_2 - * @retval None - */ -__STATIC_INLINE void LL_USART_SetStopBitsLength(USART_TypeDef *USARTx, uint32_t StopBits) -{ - MODIFY_REG(USARTx->CR2, USART_CR2_STOP, StopBits); -} - -/** - * @brief Retrieve the length of the stop bits - * @rmtoll CR2 STOP LL_USART_GetStopBitsLength - * @param USARTx USART Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_USART_STOPBITS_0_5 - * @arg @ref LL_USART_STOPBITS_1 - * @arg @ref LL_USART_STOPBITS_1_5 - * @arg @ref LL_USART_STOPBITS_2 - */ -__STATIC_INLINE uint32_t LL_USART_GetStopBitsLength(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_STOP)); -} - -/** - * @brief Configure Character frame format (Datawidth, Parity control, Stop Bits) - * @note Call of this function is equivalent to following function call sequence : - * - Data Width configuration using @ref LL_USART_SetDataWidth() function - * - Parity Control and mode configuration using @ref LL_USART_SetParity() function - * - Stop bits configuration using @ref LL_USART_SetStopBitsLength() function - * @rmtoll CR1 PS LL_USART_ConfigCharacter\n - * CR1 PCE LL_USART_ConfigCharacter\n - * CR1 M LL_USART_ConfigCharacter\n - * CR2 STOP LL_USART_ConfigCharacter - * @param USARTx USART Instance - * @param DataWidth This parameter can be one of the following values: - * @arg @ref LL_USART_DATAWIDTH_8B - * @arg @ref LL_USART_DATAWIDTH_9B - * @param Parity This parameter can be one of the following values: - * @arg @ref LL_USART_PARITY_NONE - * @arg @ref LL_USART_PARITY_EVEN - * @arg @ref LL_USART_PARITY_ODD - * @param StopBits This parameter can be one of the following values: - * @arg @ref LL_USART_STOPBITS_0_5 - * @arg @ref LL_USART_STOPBITS_1 - * @arg @ref LL_USART_STOPBITS_1_5 - * @arg @ref LL_USART_STOPBITS_2 - * @retval None - */ -__STATIC_INLINE void LL_USART_ConfigCharacter(USART_TypeDef *USARTx, uint32_t DataWidth, uint32_t Parity, - uint32_t StopBits) -{ - MODIFY_REG(USARTx->CR1, USART_CR1_PS | USART_CR1_PCE | USART_CR1_M, Parity | DataWidth); - MODIFY_REG(USARTx->CR2, USART_CR2_STOP, StopBits); -} - -/** - * @brief Set Address of the USART node. - * @note This is used in multiprocessor communication during Mute mode or Stop mode, - * for wake up with address mark detection. - * @rmtoll CR2 ADD LL_USART_SetNodeAddress - * @param USARTx USART Instance - * @param NodeAddress 4 bit Address of the USART node. - * @retval None - */ -__STATIC_INLINE void LL_USART_SetNodeAddress(USART_TypeDef *USARTx, uint32_t NodeAddress) -{ - MODIFY_REG(USARTx->CR2, USART_CR2_ADD, (NodeAddress & USART_CR2_ADD)); -} - -/** - * @brief Return 4 bit Address of the USART node as set in ADD field of CR2. - * @note only 4bits (b3-b0) of returned value are relevant (b31-b4 are not relevant) - * @rmtoll CR2 ADD LL_USART_GetNodeAddress - * @param USARTx USART Instance - * @retval Address of the USART node (Value between Min_Data=0 and Max_Data=255) - */ -__STATIC_INLINE uint32_t LL_USART_GetNodeAddress(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_ADD)); -} - -/** - * @brief Enable RTS HW Flow Control - * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not - * Hardware Flow control feature is supported by the USARTx instance. - * @rmtoll CR3 RTSE LL_USART_EnableRTSHWFlowCtrl - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableRTSHWFlowCtrl(USART_TypeDef *USARTx) -{ - SET_BIT(USARTx->CR3, USART_CR3_RTSE); -} - -/** - * @brief Disable RTS HW Flow Control - * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not - * Hardware Flow control feature is supported by the USARTx instance. - * @rmtoll CR3 RTSE LL_USART_DisableRTSHWFlowCtrl - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableRTSHWFlowCtrl(USART_TypeDef *USARTx) -{ - CLEAR_BIT(USARTx->CR3, USART_CR3_RTSE); -} - -/** - * @brief Enable CTS HW Flow Control - * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not - * Hardware Flow control feature is supported by the USARTx instance. - * @rmtoll CR3 CTSE LL_USART_EnableCTSHWFlowCtrl - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableCTSHWFlowCtrl(USART_TypeDef *USARTx) -{ - SET_BIT(USARTx->CR3, USART_CR3_CTSE); -} - -/** - * @brief Disable CTS HW Flow Control - * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not - * Hardware Flow control feature is supported by the USARTx instance. - * @rmtoll CR3 CTSE LL_USART_DisableCTSHWFlowCtrl - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableCTSHWFlowCtrl(USART_TypeDef *USARTx) -{ - CLEAR_BIT(USARTx->CR3, USART_CR3_CTSE); -} - -/** - * @brief Configure HW Flow Control mode (both CTS and RTS) - * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not - * Hardware Flow control feature is supported by the USARTx instance. - * @rmtoll CR3 RTSE LL_USART_SetHWFlowCtrl\n - * CR3 CTSE LL_USART_SetHWFlowCtrl - * @param USARTx USART Instance - * @param HardwareFlowControl This parameter can be one of the following values: - * @arg @ref LL_USART_HWCONTROL_NONE - * @arg @ref LL_USART_HWCONTROL_RTS - * @arg @ref LL_USART_HWCONTROL_CTS - * @arg @ref LL_USART_HWCONTROL_RTS_CTS - * @retval None - */ -__STATIC_INLINE void LL_USART_SetHWFlowCtrl(USART_TypeDef *USARTx, uint32_t HardwareFlowControl) -{ - MODIFY_REG(USARTx->CR3, USART_CR3_RTSE | USART_CR3_CTSE, HardwareFlowControl); -} - -/** - * @brief Return HW Flow Control configuration (both CTS and RTS) - * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not - * Hardware Flow control feature is supported by the USARTx instance. - * @rmtoll CR3 RTSE LL_USART_GetHWFlowCtrl\n - * CR3 CTSE LL_USART_GetHWFlowCtrl - * @param USARTx USART Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_USART_HWCONTROL_NONE - * @arg @ref LL_USART_HWCONTROL_RTS - * @arg @ref LL_USART_HWCONTROL_CTS - * @arg @ref LL_USART_HWCONTROL_RTS_CTS - */ -__STATIC_INLINE uint32_t LL_USART_GetHWFlowCtrl(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->CR3, USART_CR3_RTSE | USART_CR3_CTSE)); -} - -/** - * @brief Enable One bit sampling method - * @rmtoll CR3 ONEBIT LL_USART_EnableOneBitSamp - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableOneBitSamp(USART_TypeDef *USARTx) -{ - SET_BIT(USARTx->CR3, USART_CR3_ONEBIT); -} - -/** - * @brief Disable One bit sampling method - * @rmtoll CR3 ONEBIT LL_USART_DisableOneBitSamp - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableOneBitSamp(USART_TypeDef *USARTx) -{ - CLEAR_BIT(USARTx->CR3, USART_CR3_ONEBIT); -} - -/** - * @brief Indicate if One bit sampling method is enabled - * @rmtoll CR3 ONEBIT LL_USART_IsEnabledOneBitSamp - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledOneBitSamp(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR3, USART_CR3_ONEBIT) == (USART_CR3_ONEBIT)); -} - -/** - * @brief Configure USART BRR register for achieving expected Baud Rate value. - * @note Compute and set USARTDIV value in BRR Register (full BRR content) - * according to used Peripheral Clock, Oversampling mode, and expected Baud Rate values - * @note Peripheral clock and Baud rate values provided as function parameters should be valid - * (Baud rate value != 0) - * @rmtoll BRR BRR LL_USART_SetBaudRate - * @param USARTx USART Instance - * @param PeriphClk Peripheral Clock - * @param OverSampling This parameter can be one of the following values: - * @arg @ref LL_USART_OVERSAMPLING_16 - * @arg @ref LL_USART_OVERSAMPLING_8 - * @param BaudRate Baud Rate - * @retval None - */ -__STATIC_INLINE void LL_USART_SetBaudRate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t OverSampling, - uint32_t BaudRate) -{ - if (OverSampling == LL_USART_OVERSAMPLING_8) - { - USARTx->BRR = (uint16_t)(__LL_USART_DIV_SAMPLING8(PeriphClk, BaudRate)); - } - else - { - USARTx->BRR = (uint16_t)(__LL_USART_DIV_SAMPLING16(PeriphClk, BaudRate)); - } -} - -/** - * @brief Return current Baud Rate value, according to USARTDIV present in BRR register - * (full BRR content), and to used Peripheral Clock and Oversampling mode values - * @note In case of non-initialized or invalid value stored in BRR register, value 0 will be returned. - * @rmtoll BRR BRR LL_USART_GetBaudRate - * @param USARTx USART Instance - * @param PeriphClk Peripheral Clock - * @param OverSampling This parameter can be one of the following values: - * @arg @ref LL_USART_OVERSAMPLING_16 - * @arg @ref LL_USART_OVERSAMPLING_8 - * @retval Baud Rate - */ -__STATIC_INLINE uint32_t LL_USART_GetBaudRate(const USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t OverSampling) -{ - uint32_t usartdiv = 0x0U; - uint32_t brrresult = 0x0U; - - usartdiv = USARTx->BRR; - - if (OverSampling == LL_USART_OVERSAMPLING_8) - { - if ((usartdiv & 0xFFF7U) != 0U) - { - usartdiv = (uint16_t)((usartdiv & 0xFFF0U) | ((usartdiv & 0x0007U) << 1U)) ; - brrresult = (PeriphClk * 2U) / usartdiv; - } - } - else - { - if ((usartdiv & 0xFFFFU) != 0U) - { - brrresult = PeriphClk / usartdiv; - } - } - return (brrresult); -} - -/** - * @} - */ - -/** @defgroup USART_LL_EF_Configuration_IRDA Configuration functions related to Irda feature - * @{ - */ - -/** - * @brief Enable IrDA mode - * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not - * IrDA feature is supported by the USARTx instance. - * @rmtoll CR3 IREN LL_USART_EnableIrda - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableIrda(USART_TypeDef *USARTx) -{ - SET_BIT(USARTx->CR3, USART_CR3_IREN); -} - -/** - * @brief Disable IrDA mode - * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not - * IrDA feature is supported by the USARTx instance. - * @rmtoll CR3 IREN LL_USART_DisableIrda - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableIrda(USART_TypeDef *USARTx) -{ - CLEAR_BIT(USARTx->CR3, USART_CR3_IREN); -} - -/** - * @brief Indicate if IrDA mode is enabled - * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not - * IrDA feature is supported by the USARTx instance. - * @rmtoll CR3 IREN LL_USART_IsEnabledIrda - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledIrda(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR3, USART_CR3_IREN) == (USART_CR3_IREN)); -} - -/** - * @brief Configure IrDA Power Mode (Normal or Low Power) - * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not - * IrDA feature is supported by the USARTx instance. - * @rmtoll CR3 IRLP LL_USART_SetIrdaPowerMode - * @param USARTx USART Instance - * @param PowerMode This parameter can be one of the following values: - * @arg @ref LL_USART_IRDA_POWER_NORMAL - * @arg @ref LL_USART_IRDA_POWER_LOW - * @retval None - */ -__STATIC_INLINE void LL_USART_SetIrdaPowerMode(USART_TypeDef *USARTx, uint32_t PowerMode) -{ - MODIFY_REG(USARTx->CR3, USART_CR3_IRLP, PowerMode); -} - -/** - * @brief Retrieve IrDA Power Mode configuration (Normal or Low Power) - * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not - * IrDA feature is supported by the USARTx instance. - * @rmtoll CR3 IRLP LL_USART_GetIrdaPowerMode - * @param USARTx USART Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_USART_IRDA_POWER_NORMAL - * @arg @ref LL_USART_PHASE_2EDGE - */ -__STATIC_INLINE uint32_t LL_USART_GetIrdaPowerMode(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->CR3, USART_CR3_IRLP)); -} - -/** - * @brief Set Irda prescaler value, used for dividing the USART clock source - * to achieve the Irda Low Power frequency (8 bits value) - * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not - * IrDA feature is supported by the USARTx instance. - * @rmtoll GTPR PSC LL_USART_SetIrdaPrescaler - * @param USARTx USART Instance - * @param PrescalerValue Value between Min_Data=0x00 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_USART_SetIrdaPrescaler(USART_TypeDef *USARTx, uint32_t PrescalerValue) -{ - MODIFY_REG(USARTx->GTPR, USART_GTPR_PSC, PrescalerValue); -} - -/** - * @brief Return Irda prescaler value, used for dividing the USART clock source - * to achieve the Irda Low Power frequency (8 bits value) - * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not - * IrDA feature is supported by the USARTx instance. - * @rmtoll GTPR PSC LL_USART_GetIrdaPrescaler - * @param USARTx USART Instance - * @retval Irda prescaler value (Value between Min_Data=0x00 and Max_Data=0xFF) - */ -__STATIC_INLINE uint32_t LL_USART_GetIrdaPrescaler(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->GTPR, USART_GTPR_PSC)); -} - -/** - * @} - */ - -/** @defgroup USART_LL_EF_Configuration_Smartcard Configuration functions related to Smartcard feature - * @{ - */ - -/** - * @brief Enable Smartcard NACK transmission - * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not - * Smartcard feature is supported by the USARTx instance. - * @rmtoll CR3 NACK LL_USART_EnableSmartcardNACK - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableSmartcardNACK(USART_TypeDef *USARTx) -{ - SET_BIT(USARTx->CR3, USART_CR3_NACK); -} - -/** - * @brief Disable Smartcard NACK transmission - * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not - * Smartcard feature is supported by the USARTx instance. - * @rmtoll CR3 NACK LL_USART_DisableSmartcardNACK - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableSmartcardNACK(USART_TypeDef *USARTx) -{ - CLEAR_BIT(USARTx->CR3, USART_CR3_NACK); -} - -/** - * @brief Indicate if Smartcard NACK transmission is enabled - * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not - * Smartcard feature is supported by the USARTx instance. - * @rmtoll CR3 NACK LL_USART_IsEnabledSmartcardNACK - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledSmartcardNACK(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR3, USART_CR3_NACK) == (USART_CR3_NACK)); -} - -/** - * @brief Enable Smartcard mode - * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not - * Smartcard feature is supported by the USARTx instance. - * @rmtoll CR3 SCEN LL_USART_EnableSmartcard - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableSmartcard(USART_TypeDef *USARTx) -{ - SET_BIT(USARTx->CR3, USART_CR3_SCEN); -} - -/** - * @brief Disable Smartcard mode - * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not - * Smartcard feature is supported by the USARTx instance. - * @rmtoll CR3 SCEN LL_USART_DisableSmartcard - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableSmartcard(USART_TypeDef *USARTx) -{ - CLEAR_BIT(USARTx->CR3, USART_CR3_SCEN); -} - -/** - * @brief Indicate if Smartcard mode is enabled - * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not - * Smartcard feature is supported by the USARTx instance. - * @rmtoll CR3 SCEN LL_USART_IsEnabledSmartcard - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledSmartcard(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR3, USART_CR3_SCEN) == (USART_CR3_SCEN)); -} - -/** - * @brief Set Smartcard prescaler value, used for dividing the USART clock - * source to provide the SMARTCARD Clock (5 bits value) - * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not - * Smartcard feature is supported by the USARTx instance. - * @rmtoll GTPR PSC LL_USART_SetSmartcardPrescaler - * @param USARTx USART Instance - * @param PrescalerValue Value between Min_Data=0 and Max_Data=31 - * @retval None - */ -__STATIC_INLINE void LL_USART_SetSmartcardPrescaler(USART_TypeDef *USARTx, uint32_t PrescalerValue) -{ - MODIFY_REG(USARTx->GTPR, USART_GTPR_PSC, PrescalerValue); -} - -/** - * @brief Return Smartcard prescaler value, used for dividing the USART clock - * source to provide the SMARTCARD Clock (5 bits value) - * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not - * Smartcard feature is supported by the USARTx instance. - * @rmtoll GTPR PSC LL_USART_GetSmartcardPrescaler - * @param USARTx USART Instance - * @retval Smartcard prescaler value (Value between Min_Data=0 and Max_Data=31) - */ -__STATIC_INLINE uint32_t LL_USART_GetSmartcardPrescaler(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->GTPR, USART_GTPR_PSC)); -} - -/** - * @brief Set Smartcard Guard time value, expressed in nb of baud clocks periods - * (GT[7:0] bits : Guard time value) - * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not - * Smartcard feature is supported by the USARTx instance. - * @rmtoll GTPR GT LL_USART_SetSmartcardGuardTime - * @param USARTx USART Instance - * @param GuardTime Value between Min_Data=0x00 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_USART_SetSmartcardGuardTime(USART_TypeDef *USARTx, uint32_t GuardTime) -{ - MODIFY_REG(USARTx->GTPR, USART_GTPR_GT, GuardTime << USART_POSITION_GTPR_GT); -} - -/** - * @brief Return Smartcard Guard time value, expressed in nb of baud clocks periods - * (GT[7:0] bits : Guard time value) - * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not - * Smartcard feature is supported by the USARTx instance. - * @rmtoll GTPR GT LL_USART_GetSmartcardGuardTime - * @param USARTx USART Instance - * @retval Smartcard Guard time value (Value between Min_Data=0x00 and Max_Data=0xFF) - */ -__STATIC_INLINE uint32_t LL_USART_GetSmartcardGuardTime(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->GTPR, USART_GTPR_GT) >> USART_POSITION_GTPR_GT); -} - -/** - * @} - */ - -/** @defgroup USART_LL_EF_Configuration_HalfDuplex Configuration functions related to Half Duplex feature - * @{ - */ - -/** - * @brief Enable Single Wire Half-Duplex mode - * @note Macro IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not - * Half-Duplex mode is supported by the USARTx instance. - * @rmtoll CR3 HDSEL LL_USART_EnableHalfDuplex - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableHalfDuplex(USART_TypeDef *USARTx) -{ - SET_BIT(USARTx->CR3, USART_CR3_HDSEL); -} - -/** - * @brief Disable Single Wire Half-Duplex mode - * @note Macro IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not - * Half-Duplex mode is supported by the USARTx instance. - * @rmtoll CR3 HDSEL LL_USART_DisableHalfDuplex - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableHalfDuplex(USART_TypeDef *USARTx) -{ - CLEAR_BIT(USARTx->CR3, USART_CR3_HDSEL); -} - -/** - * @brief Indicate if Single Wire Half-Duplex mode is enabled - * @note Macro IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not - * Half-Duplex mode is supported by the USARTx instance. - * @rmtoll CR3 HDSEL LL_USART_IsEnabledHalfDuplex - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledHalfDuplex(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR3, USART_CR3_HDSEL) == (USART_CR3_HDSEL)); -} - -/** - * @} - */ - -/** @defgroup USART_LL_EF_Configuration_LIN Configuration functions related to LIN feature - * @{ - */ - -/** - * @brief Set LIN Break Detection Length - * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not - * LIN feature is supported by the USARTx instance. - * @rmtoll CR2 LBDL LL_USART_SetLINBrkDetectionLen - * @param USARTx USART Instance - * @param LINBDLength This parameter can be one of the following values: - * @arg @ref LL_USART_LINBREAK_DETECT_10B - * @arg @ref LL_USART_LINBREAK_DETECT_11B - * @retval None - */ -__STATIC_INLINE void LL_USART_SetLINBrkDetectionLen(USART_TypeDef *USARTx, uint32_t LINBDLength) -{ - MODIFY_REG(USARTx->CR2, USART_CR2_LBDL, LINBDLength); -} - -/** - * @brief Return LIN Break Detection Length - * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not - * LIN feature is supported by the USARTx instance. - * @rmtoll CR2 LBDL LL_USART_GetLINBrkDetectionLen - * @param USARTx USART Instance - * @retval Returned value can be one of the following values: - * @arg @ref LL_USART_LINBREAK_DETECT_10B - * @arg @ref LL_USART_LINBREAK_DETECT_11B - */ -__STATIC_INLINE uint32_t LL_USART_GetLINBrkDetectionLen(const USART_TypeDef *USARTx) -{ - return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_LBDL)); -} - -/** - * @brief Enable LIN mode - * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not - * LIN feature is supported by the USARTx instance. - * @rmtoll CR2 LINEN LL_USART_EnableLIN - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableLIN(USART_TypeDef *USARTx) -{ - SET_BIT(USARTx->CR2, USART_CR2_LINEN); -} - -/** - * @brief Disable LIN mode - * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not - * LIN feature is supported by the USARTx instance. - * @rmtoll CR2 LINEN LL_USART_DisableLIN - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableLIN(USART_TypeDef *USARTx) -{ - CLEAR_BIT(USARTx->CR2, USART_CR2_LINEN); -} - -/** - * @brief Indicate if LIN mode is enabled - * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not - * LIN feature is supported by the USARTx instance. - * @rmtoll CR2 LINEN LL_USART_IsEnabledLIN - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledLIN(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR2, USART_CR2_LINEN) == (USART_CR2_LINEN)); -} - -/** - * @} - */ - -/** @defgroup USART_LL_EF_AdvancedConfiguration Advanced Configurations services - * @{ - */ - -/** - * @brief Perform basic configuration of USART for enabling use in Asynchronous Mode (UART) - * @note In UART mode, the following bits must be kept cleared: - * - LINEN bit in the USART_CR2 register, - * - CLKEN bit in the USART_CR2 register, - * - SCEN bit in the USART_CR3 register, - * - IREN bit in the USART_CR3 register, - * - HDSEL bit in the USART_CR3 register. - * @note Call of this function is equivalent to following function call sequence : - * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function - * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function - * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function - * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function - * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function - * @note Other remaining configurations items related to Asynchronous Mode - * (as Baud Rate, Word length, Parity, ...) should be set using - * dedicated functions - * @rmtoll CR2 LINEN LL_USART_ConfigAsyncMode\n - * CR2 CLKEN LL_USART_ConfigAsyncMode\n - * CR3 SCEN LL_USART_ConfigAsyncMode\n - * CR3 IREN LL_USART_ConfigAsyncMode\n - * CR3 HDSEL LL_USART_ConfigAsyncMode - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ConfigAsyncMode(USART_TypeDef *USARTx) -{ - /* In Asynchronous mode, the following bits must be kept cleared: - - LINEN, CLKEN bits in the USART_CR2 register, - - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ - CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); - CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); -} - -/** - * @brief Perform basic configuration of USART for enabling use in Synchronous Mode - * @note In Synchronous mode, the following bits must be kept cleared: - * - LINEN bit in the USART_CR2 register, - * - SCEN bit in the USART_CR3 register, - * - IREN bit in the USART_CR3 register, - * - HDSEL bit in the USART_CR3 register. - * This function also sets the USART in Synchronous mode. - * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not - * Synchronous mode is supported by the USARTx instance. - * @note Call of this function is equivalent to following function call sequence : - * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function - * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function - * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function - * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function - * - Set CLKEN in CR2 using @ref LL_USART_EnableSCLKOutput() function - * @note Other remaining configurations items related to Synchronous Mode - * (as Baud Rate, Word length, Parity, Clock Polarity, ...) should be set using - * dedicated functions - * @rmtoll CR2 LINEN LL_USART_ConfigSyncMode\n - * CR2 CLKEN LL_USART_ConfigSyncMode\n - * CR3 SCEN LL_USART_ConfigSyncMode\n - * CR3 IREN LL_USART_ConfigSyncMode\n - * CR3 HDSEL LL_USART_ConfigSyncMode - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ConfigSyncMode(USART_TypeDef *USARTx) -{ - /* In Synchronous mode, the following bits must be kept cleared: - - LINEN bit in the USART_CR2 register, - - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ - CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); - CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); - /* set the UART/USART in Synchronous mode */ - SET_BIT(USARTx->CR2, USART_CR2_CLKEN); -} - -/** - * @brief Perform basic configuration of USART for enabling use in LIN Mode - * @note In LIN mode, the following bits must be kept cleared: - * - STOP and CLKEN bits in the USART_CR2 register, - * - SCEN bit in the USART_CR3 register, - * - IREN bit in the USART_CR3 register, - * - HDSEL bit in the USART_CR3 register. - * This function also set the UART/USART in LIN mode. - * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not - * LIN feature is supported by the USARTx instance. - * @note Call of this function is equivalent to following function call sequence : - * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function - * - Clear STOP in CR2 using @ref LL_USART_SetStopBitsLength() function - * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function - * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function - * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function - * - Set LINEN in CR2 using @ref LL_USART_EnableLIN() function - * @note Other remaining configurations items related to LIN Mode - * (as Baud Rate, Word length, LIN Break Detection Length, ...) should be set using - * dedicated functions - * @rmtoll CR2 CLKEN LL_USART_ConfigLINMode\n - * CR2 STOP LL_USART_ConfigLINMode\n - * CR2 LINEN LL_USART_ConfigLINMode\n - * CR3 IREN LL_USART_ConfigLINMode\n - * CR3 SCEN LL_USART_ConfigLINMode\n - * CR3 HDSEL LL_USART_ConfigLINMode - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ConfigLINMode(USART_TypeDef *USARTx) -{ - /* In LIN mode, the following bits must be kept cleared: - - STOP and CLKEN bits in the USART_CR2 register, - - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ - CLEAR_BIT(USARTx->CR2, (USART_CR2_CLKEN | USART_CR2_STOP)); - CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_SCEN | USART_CR3_HDSEL)); - /* Set the UART/USART in LIN mode */ - SET_BIT(USARTx->CR2, USART_CR2_LINEN); -} - -/** - * @brief Perform basic configuration of USART for enabling use in Half Duplex Mode - * @note In Half Duplex mode, the following bits must be kept cleared: - * - LINEN bit in the USART_CR2 register, - * - CLKEN bit in the USART_CR2 register, - * - SCEN bit in the USART_CR3 register, - * - IREN bit in the USART_CR3 register, - * This function also sets the UART/USART in Half Duplex mode. - * @note Macro IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not - * Half-Duplex mode is supported by the USARTx instance. - * @note Call of this function is equivalent to following function call sequence : - * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function - * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function - * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function - * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function - * - Set HDSEL in CR3 using @ref LL_USART_EnableHalfDuplex() function - * @note Other remaining configurations items related to Half Duplex Mode - * (as Baud Rate, Word length, Parity, ...) should be set using - * dedicated functions - * @rmtoll CR2 LINEN LL_USART_ConfigHalfDuplexMode\n - * CR2 CLKEN LL_USART_ConfigHalfDuplexMode\n - * CR3 HDSEL LL_USART_ConfigHalfDuplexMode\n - * CR3 SCEN LL_USART_ConfigHalfDuplexMode\n - * CR3 IREN LL_USART_ConfigHalfDuplexMode - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ConfigHalfDuplexMode(USART_TypeDef *USARTx) -{ - /* In Half Duplex mode, the following bits must be kept cleared: - - LINEN and CLKEN bits in the USART_CR2 register, - - SCEN and IREN bits in the USART_CR3 register.*/ - CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); - CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN)); - /* set the UART/USART in Half Duplex mode */ - SET_BIT(USARTx->CR3, USART_CR3_HDSEL); -} - -/** - * @brief Perform basic configuration of USART for enabling use in Smartcard Mode - * @note In Smartcard mode, the following bits must be kept cleared: - * - LINEN bit in the USART_CR2 register, - * - IREN bit in the USART_CR3 register, - * - HDSEL bit in the USART_CR3 register. - * This function also configures Stop bits to 1.5 bits and - * sets the USART in Smartcard mode (SCEN bit). - * Clock Output is also enabled (CLKEN). - * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not - * Smartcard feature is supported by the USARTx instance. - * @note Call of this function is equivalent to following function call sequence : - * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function - * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function - * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function - * - Configure STOP in CR2 using @ref LL_USART_SetStopBitsLength() function - * - Set CLKEN in CR2 using @ref LL_USART_EnableSCLKOutput() function - * - Set SCEN in CR3 using @ref LL_USART_EnableSmartcard() function - * @note Other remaining configurations items related to Smartcard Mode - * (as Baud Rate, Word length, Parity, ...) should be set using - * dedicated functions - * @rmtoll CR2 LINEN LL_USART_ConfigSmartcardMode\n - * CR2 STOP LL_USART_ConfigSmartcardMode\n - * CR2 CLKEN LL_USART_ConfigSmartcardMode\n - * CR3 HDSEL LL_USART_ConfigSmartcardMode\n - * CR3 SCEN LL_USART_ConfigSmartcardMode - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ConfigSmartcardMode(USART_TypeDef *USARTx) -{ - /* In Smartcard mode, the following bits must be kept cleared: - - LINEN bit in the USART_CR2 register, - - IREN and HDSEL bits in the USART_CR3 register.*/ - CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); - CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_HDSEL)); - /* Configure Stop bits to 1.5 bits */ - /* Synchronous mode is activated by default */ - SET_BIT(USARTx->CR2, (USART_CR2_STOP_0 | USART_CR2_STOP_1 | USART_CR2_CLKEN)); - /* set the UART/USART in Smartcard mode */ - SET_BIT(USARTx->CR3, USART_CR3_SCEN); -} - -/** - * @brief Perform basic configuration of USART for enabling use in Irda Mode - * @note In IRDA mode, the following bits must be kept cleared: - * - LINEN bit in the USART_CR2 register, - * - STOP and CLKEN bits in the USART_CR2 register, - * - SCEN bit in the USART_CR3 register, - * - HDSEL bit in the USART_CR3 register. - * This function also sets the UART/USART in IRDA mode (IREN bit). - * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not - * IrDA feature is supported by the USARTx instance. - * @note Call of this function is equivalent to following function call sequence : - * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function - * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function - * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function - * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function - * - Configure STOP in CR2 using @ref LL_USART_SetStopBitsLength() function - * - Set IREN in CR3 using @ref LL_USART_EnableIrda() function - * @note Other remaining configurations items related to Irda Mode - * (as Baud Rate, Word length, Power mode, ...) should be set using - * dedicated functions - * @rmtoll CR2 LINEN LL_USART_ConfigIrdaMode\n - * CR2 CLKEN LL_USART_ConfigIrdaMode\n - * CR2 STOP LL_USART_ConfigIrdaMode\n - * CR3 SCEN LL_USART_ConfigIrdaMode\n - * CR3 HDSEL LL_USART_ConfigIrdaMode\n - * CR3 IREN LL_USART_ConfigIrdaMode - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ConfigIrdaMode(USART_TypeDef *USARTx) -{ - /* In IRDA mode, the following bits must be kept cleared: - - LINEN, STOP and CLKEN bits in the USART_CR2 register, - - SCEN and HDSEL bits in the USART_CR3 register.*/ - CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN | USART_CR2_STOP)); - CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL)); - /* set the UART/USART in IRDA mode */ - SET_BIT(USARTx->CR3, USART_CR3_IREN); -} - -/** - * @brief Perform basic configuration of USART for enabling use in Multi processor Mode - * (several USARTs connected in a network, one of the USARTs can be the master, - * its TX output connected to the RX inputs of the other slaves USARTs). - * @note In MultiProcessor mode, the following bits must be kept cleared: - * - LINEN bit in the USART_CR2 register, - * - CLKEN bit in the USART_CR2 register, - * - SCEN bit in the USART_CR3 register, - * - IREN bit in the USART_CR3 register, - * - HDSEL bit in the USART_CR3 register. - * @note Call of this function is equivalent to following function call sequence : - * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function - * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function - * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function - * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function - * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function - * @note Other remaining configurations items related to Multi processor Mode - * (as Baud Rate, Wake Up Method, Node address, ...) should be set using - * dedicated functions - * @rmtoll CR2 LINEN LL_USART_ConfigMultiProcessMode\n - * CR2 CLKEN LL_USART_ConfigMultiProcessMode\n - * CR3 SCEN LL_USART_ConfigMultiProcessMode\n - * CR3 HDSEL LL_USART_ConfigMultiProcessMode\n - * CR3 IREN LL_USART_ConfigMultiProcessMode - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ConfigMultiProcessMode(USART_TypeDef *USARTx) -{ - /* In Multi Processor mode, the following bits must be kept cleared: - - LINEN and CLKEN bits in the USART_CR2 register, - - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ - CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); - CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); -} - -/** - * @} - */ - -/** @defgroup USART_LL_EF_FLAG_Management FLAG_Management - * @{ - */ - -/** - * @brief Check if the USART Parity Error Flag is set or not - * @rmtoll SR PE LL_USART_IsActiveFlag_PE - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_PE(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->SR, USART_SR_PE) == (USART_SR_PE)); -} - -/** - * @brief Check if the USART Framing Error Flag is set or not - * @rmtoll SR FE LL_USART_IsActiveFlag_FE - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_FE(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->SR, USART_SR_FE) == (USART_SR_FE)); -} - -/** - * @brief Check if the USART Noise error detected Flag is set or not - * @rmtoll SR NF LL_USART_IsActiveFlag_NE - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_NE(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->SR, USART_SR_NE) == (USART_SR_NE)); -} - -/** - * @brief Check if the USART OverRun Error Flag is set or not - * @rmtoll SR ORE LL_USART_IsActiveFlag_ORE - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_ORE(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->SR, USART_SR_ORE) == (USART_SR_ORE)); -} - -/** - * @brief Check if the USART IDLE line detected Flag is set or not - * @rmtoll SR IDLE LL_USART_IsActiveFlag_IDLE - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_IDLE(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->SR, USART_SR_IDLE) == (USART_SR_IDLE)); -} - -/** - * @brief Check if the USART Read Data Register Not Empty Flag is set or not - * @rmtoll SR RXNE LL_USART_IsActiveFlag_RXNE - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_RXNE(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->SR, USART_SR_RXNE) == (USART_SR_RXNE)); -} - -/** - * @brief Check if the USART Transmission Complete Flag is set or not - * @rmtoll SR TC LL_USART_IsActiveFlag_TC - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TC(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->SR, USART_SR_TC) == (USART_SR_TC)); -} - -/** - * @brief Check if the USART Transmit Data Register Empty Flag is set or not - * @rmtoll SR TXE LL_USART_IsActiveFlag_TXE - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TXE(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->SR, USART_SR_TXE) == (USART_SR_TXE)); -} - -/** - * @brief Check if the USART LIN Break Detection Flag is set or not - * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not - * LIN feature is supported by the USARTx instance. - * @rmtoll SR LBD LL_USART_IsActiveFlag_LBD - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_LBD(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->SR, USART_SR_LBD) == (USART_SR_LBD)); -} - -/** - * @brief Check if the USART CTS Flag is set or not - * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not - * Hardware Flow control feature is supported by the USARTx instance. - * @rmtoll SR CTS LL_USART_IsActiveFlag_nCTS - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_nCTS(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->SR, USART_SR_CTS) == (USART_SR_CTS)); -} - -/** - * @brief Check if the USART Send Break Flag is set or not - * @rmtoll CR1 SBK LL_USART_IsActiveFlag_SBK - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_SBK(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR1, USART_CR1_SBK) == (USART_CR1_SBK)); -} - -/** - * @brief Check if the USART Receive Wake Up from mute mode Flag is set or not - * @rmtoll CR1 RWU LL_USART_IsActiveFlag_RWU - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_RWU(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR1, USART_CR1_RWU) == (USART_CR1_RWU)); -} - -/** - * @brief Clear Parity Error Flag - * @note Clearing this flag is done by a read access to the USARTx_SR - * register followed by a read access to the USARTx_DR register. - * @note Please also consider that when clearing this flag, other flags as - * NE, FE, ORE, IDLE would also be cleared. - * @rmtoll SR PE LL_USART_ClearFlag_PE - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ClearFlag_PE(USART_TypeDef *USARTx) -{ - __IO uint32_t tmpreg; - tmpreg = USARTx->SR; - (void) tmpreg; - tmpreg = USARTx->DR; - (void) tmpreg; -} - -/** - * @brief Clear Framing Error Flag - * @note Clearing this flag is done by a read access to the USARTx_SR - * register followed by a read access to the USARTx_DR register. - * @note Please also consider that when clearing this flag, other flags as - * PE, NE, ORE, IDLE would also be cleared. - * @rmtoll SR FE LL_USART_ClearFlag_FE - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ClearFlag_FE(USART_TypeDef *USARTx) -{ - __IO uint32_t tmpreg; - tmpreg = USARTx->SR; - (void) tmpreg; - tmpreg = USARTx->DR; - (void) tmpreg; -} - -/** - * @brief Clear Noise detected Flag - * @note Clearing this flag is done by a read access to the USARTx_SR - * register followed by a read access to the USARTx_DR register. - * @note Please also consider that when clearing this flag, other flags as - * PE, FE, ORE, IDLE would also be cleared. - * @rmtoll SR NF LL_USART_ClearFlag_NE - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ClearFlag_NE(USART_TypeDef *USARTx) -{ - __IO uint32_t tmpreg; - tmpreg = USARTx->SR; - (void) tmpreg; - tmpreg = USARTx->DR; - (void) tmpreg; -} - -/** - * @brief Clear OverRun Error Flag - * @note Clearing this flag is done by a read access to the USARTx_SR - * register followed by a read access to the USARTx_DR register. - * @note Please also consider that when clearing this flag, other flags as - * PE, NE, FE, IDLE would also be cleared. - * @rmtoll SR ORE LL_USART_ClearFlag_ORE - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ClearFlag_ORE(USART_TypeDef *USARTx) -{ - __IO uint32_t tmpreg; - tmpreg = USARTx->SR; - (void) tmpreg; - tmpreg = USARTx->DR; - (void) tmpreg; -} - -/** - * @brief Clear IDLE line detected Flag - * @note Clearing this flag is done by a read access to the USARTx_SR - * register followed by a read access to the USARTx_DR register. - * @note Please also consider that when clearing this flag, other flags as - * PE, NE, FE, ORE would also be cleared. - * @rmtoll SR IDLE LL_USART_ClearFlag_IDLE - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ClearFlag_IDLE(USART_TypeDef *USARTx) -{ - __IO uint32_t tmpreg; - tmpreg = USARTx->SR; - (void) tmpreg; - tmpreg = USARTx->DR; - (void) tmpreg; -} - -/** - * @brief Clear Transmission Complete Flag - * @rmtoll SR TC LL_USART_ClearFlag_TC - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ClearFlag_TC(USART_TypeDef *USARTx) -{ - WRITE_REG(USARTx->SR, ~(USART_SR_TC)); -} - -/** - * @brief Clear RX Not Empty Flag - * @rmtoll SR RXNE LL_USART_ClearFlag_RXNE - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ClearFlag_RXNE(USART_TypeDef *USARTx) -{ - WRITE_REG(USARTx->SR, ~(USART_SR_RXNE)); -} - -/** - * @brief Clear LIN Break Detection Flag - * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not - * LIN feature is supported by the USARTx instance. - * @rmtoll SR LBD LL_USART_ClearFlag_LBD - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ClearFlag_LBD(USART_TypeDef *USARTx) -{ - WRITE_REG(USARTx->SR, ~(USART_SR_LBD)); -} - -/** - * @brief Clear CTS Interrupt Flag - * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not - * Hardware Flow control feature is supported by the USARTx instance. - * @rmtoll SR CTS LL_USART_ClearFlag_nCTS - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_ClearFlag_nCTS(USART_TypeDef *USARTx) -{ - WRITE_REG(USARTx->SR, ~(USART_SR_CTS)); -} - -/** - * @} - */ - -/** @defgroup USART_LL_EF_IT_Management IT_Management - * @{ - */ - -/** - * @brief Enable IDLE Interrupt - * @rmtoll CR1 IDLEIE LL_USART_EnableIT_IDLE - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableIT_IDLE(USART_TypeDef *USARTx) -{ - ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_IDLEIE); -} - -/** - * @brief Enable RX Not Empty Interrupt - * @rmtoll CR1 RXNEIE LL_USART_EnableIT_RXNE - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableIT_RXNE(USART_TypeDef *USARTx) -{ - ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_RXNEIE); -} - -/** - * @brief Enable Transmission Complete Interrupt - * @rmtoll CR1 TCIE LL_USART_EnableIT_TC - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableIT_TC(USART_TypeDef *USARTx) -{ - ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_TCIE); -} - -/** - * @brief Enable TX Empty Interrupt - * @rmtoll CR1 TXEIE LL_USART_EnableIT_TXE - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableIT_TXE(USART_TypeDef *USARTx) -{ - ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_TXEIE); -} - -/** - * @brief Enable Parity Error Interrupt - * @rmtoll CR1 PEIE LL_USART_EnableIT_PE - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableIT_PE(USART_TypeDef *USARTx) -{ - ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_PEIE); -} - -/** - * @brief Enable LIN Break Detection Interrupt - * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not - * LIN feature is supported by the USARTx instance. - * @rmtoll CR2 LBDIE LL_USART_EnableIT_LBD - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableIT_LBD(USART_TypeDef *USARTx) -{ - SET_BIT(USARTx->CR2, USART_CR2_LBDIE); -} - -/** - * @brief Enable Error Interrupt - * @note When set, Error Interrupt Enable Bit is enabling interrupt generation in case of a framing - * error, overrun error or noise flag (FE=1 or ORE=1 or NF=1 in the USARTx_SR register). - * 0: Interrupt is inhibited - * 1: An interrupt is generated when FE=1 or ORE=1 or NF=1 in the USARTx_SR register. - * @rmtoll CR3 EIE LL_USART_EnableIT_ERROR - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableIT_ERROR(USART_TypeDef *USARTx) -{ - ATOMIC_SET_BIT(USARTx->CR3, USART_CR3_EIE); -} - -/** - * @brief Enable CTS Interrupt - * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not - * Hardware Flow control feature is supported by the USARTx instance. - * @rmtoll CR3 CTSIE LL_USART_EnableIT_CTS - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableIT_CTS(USART_TypeDef *USARTx) -{ - ATOMIC_SET_BIT(USARTx->CR3, USART_CR3_CTSIE); -} - -/** - * @brief Disable IDLE Interrupt - * @rmtoll CR1 IDLEIE LL_USART_DisableIT_IDLE - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableIT_IDLE(USART_TypeDef *USARTx) -{ - ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_IDLEIE); -} - -/** - * @brief Disable RX Not Empty Interrupt - * @rmtoll CR1 RXNEIE LL_USART_DisableIT_RXNE - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableIT_RXNE(USART_TypeDef *USARTx) -{ - ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_RXNEIE); -} - -/** - * @brief Disable Transmission Complete Interrupt - * @rmtoll CR1 TCIE LL_USART_DisableIT_TC - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableIT_TC(USART_TypeDef *USARTx) -{ - ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_TCIE); -} - -/** - * @brief Disable TX Empty Interrupt - * @rmtoll CR1 TXEIE LL_USART_DisableIT_TXE - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableIT_TXE(USART_TypeDef *USARTx) -{ - ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_TXEIE); -} - -/** - * @brief Disable Parity Error Interrupt - * @rmtoll CR1 PEIE LL_USART_DisableIT_PE - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableIT_PE(USART_TypeDef *USARTx) -{ - ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_PEIE); -} - -/** - * @brief Disable LIN Break Detection Interrupt - * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not - * LIN feature is supported by the USARTx instance. - * @rmtoll CR2 LBDIE LL_USART_DisableIT_LBD - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableIT_LBD(USART_TypeDef *USARTx) -{ - CLEAR_BIT(USARTx->CR2, USART_CR2_LBDIE); -} - -/** - * @brief Disable Error Interrupt - * @note When set, Error Interrupt Enable Bit is enabling interrupt generation in case of a framing - * error, overrun error or noise flag (FE=1 or ORE=1 or NF=1 in the USARTx_SR register). - * 0: Interrupt is inhibited - * 1: An interrupt is generated when FE=1 or ORE=1 or NF=1 in the USARTx_SR register. - * @rmtoll CR3 EIE LL_USART_DisableIT_ERROR - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableIT_ERROR(USART_TypeDef *USARTx) -{ - ATOMIC_CLEAR_BIT(USARTx->CR3, USART_CR3_EIE); -} - -/** - * @brief Disable CTS Interrupt - * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not - * Hardware Flow control feature is supported by the USARTx instance. - * @rmtoll CR3 CTSIE LL_USART_DisableIT_CTS - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableIT_CTS(USART_TypeDef *USARTx) -{ - ATOMIC_CLEAR_BIT(USARTx->CR3, USART_CR3_CTSIE); -} - -/** - * @brief Check if the USART IDLE Interrupt source is enabled or disabled. - * @rmtoll CR1 IDLEIE LL_USART_IsEnabledIT_IDLE - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_IDLE(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR1, USART_CR1_IDLEIE) == (USART_CR1_IDLEIE)); -} - -/** - * @brief Check if the USART RX Not Empty Interrupt is enabled or disabled. - * @rmtoll CR1 RXNEIE LL_USART_IsEnabledIT_RXNE - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_RXNE(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR1, USART_CR1_RXNEIE) == (USART_CR1_RXNEIE)); -} - -/** - * @brief Check if the USART Transmission Complete Interrupt is enabled or disabled. - * @rmtoll CR1 TCIE LL_USART_IsEnabledIT_TC - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_TC(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR1, USART_CR1_TCIE) == (USART_CR1_TCIE)); -} - -/** - * @brief Check if the USART TX Empty Interrupt is enabled or disabled. - * @rmtoll CR1 TXEIE LL_USART_IsEnabledIT_TXE - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_TXE(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR1, USART_CR1_TXEIE) == (USART_CR1_TXEIE)); -} - -/** - * @brief Check if the USART Parity Error Interrupt is enabled or disabled. - * @rmtoll CR1 PEIE LL_USART_IsEnabledIT_PE - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_PE(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR1, USART_CR1_PEIE) == (USART_CR1_PEIE)); -} - -/** - * @brief Check if the USART LIN Break Detection Interrupt is enabled or disabled. - * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not - * LIN feature is supported by the USARTx instance. - * @rmtoll CR2 LBDIE LL_USART_IsEnabledIT_LBD - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_LBD(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR2, USART_CR2_LBDIE) == (USART_CR2_LBDIE)); -} - -/** - * @brief Check if the USART Error Interrupt is enabled or disabled. - * @rmtoll CR3 EIE LL_USART_IsEnabledIT_ERROR - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_ERROR(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR3, USART_CR3_EIE) == (USART_CR3_EIE)); -} - -/** - * @brief Check if the USART CTS Interrupt is enabled or disabled. - * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not - * Hardware Flow control feature is supported by the USARTx instance. - * @rmtoll CR3 CTSIE LL_USART_IsEnabledIT_CTS - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_CTS(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR3, USART_CR3_CTSIE) == (USART_CR3_CTSIE)); -} - -/** - * @} - */ - -/** @defgroup USART_LL_EF_DMA_Management DMA_Management - * @{ - */ - -/** - * @brief Enable DMA Mode for reception - * @rmtoll CR3 DMAR LL_USART_EnableDMAReq_RX - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableDMAReq_RX(USART_TypeDef *USARTx) -{ - ATOMIC_SET_BIT(USARTx->CR3, USART_CR3_DMAR); -} - -/** - * @brief Disable DMA Mode for reception - * @rmtoll CR3 DMAR LL_USART_DisableDMAReq_RX - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableDMAReq_RX(USART_TypeDef *USARTx) -{ - ATOMIC_CLEAR_BIT(USARTx->CR3, USART_CR3_DMAR); -} - -/** - * @brief Check if DMA Mode is enabled for reception - * @rmtoll CR3 DMAR LL_USART_IsEnabledDMAReq_RX - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledDMAReq_RX(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR3, USART_CR3_DMAR) == (USART_CR3_DMAR)); -} - -/** - * @brief Enable DMA Mode for transmission - * @rmtoll CR3 DMAT LL_USART_EnableDMAReq_TX - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_EnableDMAReq_TX(USART_TypeDef *USARTx) -{ - ATOMIC_SET_BIT(USARTx->CR3, USART_CR3_DMAT); -} - -/** - * @brief Disable DMA Mode for transmission - * @rmtoll CR3 DMAT LL_USART_DisableDMAReq_TX - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_DisableDMAReq_TX(USART_TypeDef *USARTx) -{ - ATOMIC_CLEAR_BIT(USARTx->CR3, USART_CR3_DMAT); -} - -/** - * @brief Check if DMA Mode is enabled for transmission - * @rmtoll CR3 DMAT LL_USART_IsEnabledDMAReq_TX - * @param USARTx USART Instance - * @retval State of bit (1 or 0). - */ -__STATIC_INLINE uint32_t LL_USART_IsEnabledDMAReq_TX(const USART_TypeDef *USARTx) -{ - return (READ_BIT(USARTx->CR3, USART_CR3_DMAT) == (USART_CR3_DMAT)); -} - -/** - * @brief Get the data register address used for DMA transfer - * @rmtoll DR DR LL_USART_DMA_GetRegAddr - * @note Address of Data Register is valid for both Transmit and Receive transfers. - * @param USARTx USART Instance - * @retval Address of data register - */ -__STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(const USART_TypeDef *USARTx) -{ - /* return address of DR register */ - return ((uint32_t) &(USARTx->DR)); -} - -/** - * @} - */ - -/** @defgroup USART_LL_EF_Data_Management Data_Management - * @{ - */ - -/** - * @brief Read Receiver Data register (Receive Data value, 8 bits) - * @rmtoll DR DR LL_USART_ReceiveData8 - * @param USARTx USART Instance - * @retval Value between Min_Data=0x00 and Max_Data=0xFF - */ -__STATIC_INLINE uint8_t LL_USART_ReceiveData8(const USART_TypeDef *USARTx) -{ - return (uint8_t)(READ_BIT(USARTx->DR, USART_DR_DR)); -} - -/** - * @brief Read Receiver Data register (Receive Data value, 9 bits) - * @rmtoll DR DR LL_USART_ReceiveData9 - * @param USARTx USART Instance - * @retval Value between Min_Data=0x00 and Max_Data=0x1FF - */ -__STATIC_INLINE uint16_t LL_USART_ReceiveData9(const USART_TypeDef *USARTx) -{ - return (uint16_t)(READ_BIT(USARTx->DR, USART_DR_DR)); -} - -/** - * @brief Write in Transmitter Data Register (Transmit Data value, 8 bits) - * @rmtoll DR DR LL_USART_TransmitData8 - * @param USARTx USART Instance - * @param Value between Min_Data=0x00 and Max_Data=0xFF - * @retval None - */ -__STATIC_INLINE void LL_USART_TransmitData8(USART_TypeDef *USARTx, uint8_t Value) -{ - USARTx->DR = Value; -} - -/** - * @brief Write in Transmitter Data Register (Transmit Data value, 9 bits) - * @rmtoll DR DR LL_USART_TransmitData9 - * @param USARTx USART Instance - * @param Value between Min_Data=0x00 and Max_Data=0x1FF - * @retval None - */ -__STATIC_INLINE void LL_USART_TransmitData9(USART_TypeDef *USARTx, uint16_t Value) -{ - USARTx->DR = Value & 0x1FFU; -} - -/** - * @} - */ - -/** @defgroup USART_LL_EF_Execution Execution - * @{ - */ - -/** - * @brief Request Break sending - * @rmtoll CR1 SBK LL_USART_RequestBreakSending - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_RequestBreakSending(USART_TypeDef *USARTx) -{ - SET_BIT(USARTx->CR1, USART_CR1_SBK); -} - -/** - * @brief Put USART in Mute mode - * @rmtoll CR1 RWU LL_USART_RequestEnterMuteMode - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_RequestEnterMuteMode(USART_TypeDef *USARTx) -{ - SET_BIT(USARTx->CR1, USART_CR1_RWU); -} - -/** - * @brief Put USART in Active mode - * @rmtoll CR1 RWU LL_USART_RequestExitMuteMode - * @param USARTx USART Instance - * @retval None - */ -__STATIC_INLINE void LL_USART_RequestExitMuteMode(USART_TypeDef *USARTx) -{ - CLEAR_BIT(USARTx->CR1, USART_CR1_RWU); -} - -/** - * @} - */ - -#if defined(USE_FULL_LL_DRIVER) -/** @defgroup USART_LL_EF_Init Initialization and de-initialization functions - * @{ - */ -ErrorStatus LL_USART_DeInit(const USART_TypeDef *USARTx); -ErrorStatus LL_USART_Init(USART_TypeDef *USARTx, const LL_USART_InitTypeDef *USART_InitStruct); -void LL_USART_StructInit(LL_USART_InitTypeDef *USART_InitStruct); -ErrorStatus LL_USART_ClockInit(USART_TypeDef *USARTx, const LL_USART_ClockInitTypeDef *USART_ClockInitStruct); -void LL_USART_ClockStructInit(LL_USART_ClockInitTypeDef *USART_ClockInitStruct); -/** - * @} - */ -#endif /* USE_FULL_LL_DRIVER */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* USART1 || USART2 || USART3 || USART6 || UART4 || UART5 || UART7 || UART8 || UART9 || UART10 */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_LL_USART_H */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h deleted file mode 100644 index accdac7..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h +++ /dev/null @@ -1,307 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_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 - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_LL_UTILS_H -#define __STM32F4xx_LL_UTILS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_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 - -/** - * @brief Package data register base address - */ -#define PACKAGE_BASE_ADDRESS PACKAGE_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 PLLM; /*!< Division factor for PLL VCO input clock. - This parameter can be a value of @ref RCC_LL_EC_PLLM_DIV - - This feature can be modified afterwards using unitary function - @ref LL_RCC_PLL_ConfigDomain_SYS(). */ - - uint32_t PLLN; /*!< Multiplication factor for PLL VCO output clock. - This parameter must be a number between Min_Data = @ref RCC_PLLN_MIN_VALUE - and Max_Data = @ref RCC_PLLN_MIN_VALUE - - This feature can be modified afterwards using unitary function - @ref LL_RCC_PLL_ConfigDomain_SYS(). */ - - uint32_t PLLP; /*!< Division for the main system clock. - This parameter can be a value of @ref RCC_LL_EC_PLLP_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 */ -/** - * @} - */ - -/** @defgroup UTILS_EC_PACKAGETYPE PACKAGE TYPE - * @{ - */ -#define LL_UTILS_PACKAGETYPE_WLCSP36_UFQFPN48_LQFP64 0x00000000U /*!< WLCSP36 or UFQFPN48 or LQFP64 package type */ -#define LL_UTILS_PACKAGETYPE_WLCSP168_FBGA169_LQFP100_LQFP64_UFQFPN48 0x00000100U /*!< WLCSP168 or FBGA169 or LQFP100 or LQFP64 or UFQFPN48 package type */ -#define LL_UTILS_PACKAGETYPE_WLCSP64_WLCSP81_LQFP176_UFBGA176 0x00000200U /*!< WLCSP64 or WLCSP81 or LQFP176 or UFBGA176 package type */ -#define LL_UTILS_PACKAGETYPE_LQFP144_UFBGA144_UFBGA144_UFBGA100 0x00000300U /*!< LQFP144 or UFBGA144 or UFBGA144 or UFBGA100 package type */ -#define LL_UTILS_PACKAGETYPE_LQFP100_LQFP208_TFBGA216 0x00000400U /*!< LQFP100 or LQFP208 or TFBGA216 package type */ -#define LL_UTILS_PACKAGETYPE_LQFP208_TFBGA216 0x00000500U /*!< LQFP208 or TFBGA216 package type */ -#define LL_UTILS_PACKAGETYPE_TQFP64_UFBGA144_LQFP144 0x00000700U /*!< TQFP64 or UFBGA144 or LQFP144 package type */ -/** - * @} - */ - -/** - * @} - */ - -/* 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 + 4U)))); -} - -/** - * @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 + 8U)))); -} - -/** - * @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); -} - -/** - * @brief Get Package type - * @retval Returned value can be one of the following values: - * @arg @ref LL_UTILS_PACKAGETYPE_WLCSP36_UFQFPN48_LQFP64 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_WLCSP168_FBGA169_LQFP100_LQFP64_UFQFPN48 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_WLCSP64_WLCSP81_LQFP176_UFBGA176 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_LQFP144_UFBGA144_UFBGA144_UFBGA100 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_LQFP100_LQFP208_TFBGA216 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_LQFP208_TFBGA216 (*) - * @arg @ref LL_UTILS_PACKAGETYPE_TQFP64_UFBGA144_LQFP144 (*) - * - * (*) value not defined in all devices. - */ -__STATIC_INLINE uint32_t LL_GetPackageType(void) -{ - return (uint32_t)(READ_REG(*((uint32_t *)PACKAGE_BASE_ADDRESS)) & 0x0700U); -} - -/** - * @} - */ - -/** @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 Frequency of Ticks (Hz) - * @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 HCLK_Frequency); -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 /* __STM32F4xx_LL_UTILS_H */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt deleted file mode 100644 index 3edc4d1..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt +++ /dev/null @@ -1,6 +0,0 @@ -This software component is provided to you as part of a software package and -applicable license terms are in the Package_license file. If you received this -software component outside of a package or without applicable license terms, -the terms of the BSD-3-Clause license shall apply. -You may obtain a copy of the BSD-3-Clause at: -https://opensource.org/licenses/BSD-3-Clause diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c deleted file mode 100644 index 862ec73..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c +++ /dev/null @@ -1,616 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal.c - * @author MCD Application Team - * @brief HAL module driver. - * This is the common part of the HAL initialization - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The common HAL driver contains a set of generic and common APIs that can be - used by the PPP peripheral drivers and the user to start using the HAL. - [..] - The HAL contains two APIs' categories: - (+) Common HAL APIs - (+) Services HAL APIs - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup HAL HAL - * @brief HAL module driver. - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup HAL_Private_Constants - * @{ - */ -/** - * @brief STM32F4xx HAL Driver version number V1.8.5 - */ -#define __STM32F4xx_HAL_VERSION_MAIN (0x01U) /*!< [31:24] main version */ -#define __STM32F4xx_HAL_VERSION_SUB1 (0x08U) /*!< [23:16] sub1 version */ -#define __STM32F4xx_HAL_VERSION_SUB2 (0x05U) /*!< [15:8] sub2 version */ -#define __STM32F4xx_HAL_VERSION_RC (0x00U) /*!< [7:0] release candidate */ -#define __STM32F4xx_HAL_VERSION ((__STM32F4xx_HAL_VERSION_MAIN << 24U)\ - |(__STM32F4xx_HAL_VERSION_SUB1 << 16U)\ - |(__STM32F4xx_HAL_VERSION_SUB2 << 8U )\ - |(__STM32F4xx_HAL_VERSION_RC)) - -#define IDCODE_DEVID_MASK 0x00000FFFU - -/* ------------ RCC registers bit address in the alias region ----------- */ -#define SYSCFG_OFFSET (SYSCFG_BASE - PERIPH_BASE) -/* --- MEMRMP Register ---*/ -/* Alias word address of UFB_MODE bit */ -#define MEMRMP_OFFSET SYSCFG_OFFSET -#define UFB_MODE_BIT_NUMBER SYSCFG_MEMRMP_UFB_MODE_Pos -#define UFB_MODE_BB (uint32_t)(PERIPH_BB_BASE + (MEMRMP_OFFSET * 32U) + (UFB_MODE_BIT_NUMBER * 4U)) - -/* --- CMPCR Register ---*/ -/* Alias word address of CMP_PD bit */ -#define CMPCR_OFFSET (SYSCFG_OFFSET + 0x20U) -#define CMP_PD_BIT_NUMBER SYSCFG_CMPCR_CMP_PD_Pos -#define CMPCR_CMP_PD_BB (uint32_t)(PERIPH_BB_BASE + (CMPCR_OFFSET * 32U) + (CMP_PD_BIT_NUMBER * 4U)) - -/* --- MCHDLYCR Register ---*/ -/* Alias word address of BSCKSEL bit */ -#define MCHDLYCR_OFFSET (SYSCFG_OFFSET + 0x30U) -#define BSCKSEL_BIT_NUMBER SYSCFG_MCHDLYCR_BSCKSEL_Pos -#define MCHDLYCR_BSCKSEL_BB (uint32_t)(PERIPH_BB_BASE + (MCHDLYCR_OFFSET * 32U) + (BSCKSEL_BIT_NUMBER * 4U)) -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup HAL_Private_Variables - * @{ - */ -__IO uint32_t uwTick; -uint32_t uwTickPrio = (1UL << __NVIC_PRIO_BITS); /* Invalid PRIO */ -HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */ -/** - * @} - */ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup HAL_Exported_Functions HAL Exported Functions - * @{ - */ - -/** @defgroup HAL_Exported_Functions_Group1 Initialization and de-initialization Functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initializes the Flash interface the NVIC allocation and initial clock - configuration. It initializes the systick also when timeout is needed - and the backup domain when enabled. - (+) De-Initializes common part of the HAL. - (+) Configure the time base source to have 1ms time base with a dedicated - Tick interrupt priority. - (++) SysTick timer is used by default as source of time base, but user - can eventually implement his proper time base source (a general purpose - timer for example or other time source), keeping in mind that Time base - duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and - handled in milliseconds basis. - (++) Time base configuration function (HAL_InitTick ()) is called automatically - at the beginning of the program after reset by HAL_Init() or at any time - when clock is configured, by HAL_RCC_ClockConfig(). - (++) Source of time base is configured to generate interrupts at regular - time intervals. Care must be taken if HAL_Delay() is called from a - peripheral ISR process, the Tick interrupt line must have higher priority - (numerically lower) than the peripheral interrupt. Otherwise the caller - ISR process will be blocked. - (++) functions affecting time base configurations are declared as __weak - to make override possible in case of other implementations in user file. -@endverbatim - * @{ - */ - -/** - * @brief This function is used to initialize the HAL Library; it must be the first - * instruction to be executed in the main program (before to call any other - * HAL function), it performs the following: - * Configure the Flash prefetch, instruction and Data caches. - * Configures the SysTick to generate an interrupt each 1 millisecond, - * which is clocked by the HSI (at this stage, the clock is not yet - * configured and thus the system is running from the internal HSI at 16 MHz). - * Set NVIC Group Priority to 4. - * Calls the HAL_MspInit() callback function defined in user file - * "stm32f4xx_hal_msp.c" to do the global low level hardware initialization - * - * @note SysTick is used as time base for the HAL_Delay() function, the application - * need to ensure that the SysTick time base is always set to 1 millisecond - * to have correct HAL operation. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_Init(void) -{ - /* Configure Flash prefetch, Instruction cache, Data cache */ -#if (INSTRUCTION_CACHE_ENABLE != 0U) - __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); -#endif /* INSTRUCTION_CACHE_ENABLE */ - -#if (DATA_CACHE_ENABLE != 0U) - __HAL_FLASH_DATA_CACHE_ENABLE(); -#endif /* DATA_CACHE_ENABLE */ - -#if (PREFETCH_ENABLE != 0U) - __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); -#endif /* PREFETCH_ENABLE */ - - /* Set Interrupt Group Priority */ - HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); - - /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */ - HAL_InitTick(TICK_INT_PRIORITY); - - /* Init the low level hardware */ - HAL_MspInit(); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief This function de-Initializes common part of the HAL and stops the systick. - * This function is optional. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DeInit(void) -{ - /* Reset of all peripherals */ - __HAL_RCC_APB1_FORCE_RESET(); - __HAL_RCC_APB1_RELEASE_RESET(); - - __HAL_RCC_APB2_FORCE_RESET(); - __HAL_RCC_APB2_RELEASE_RESET(); - - __HAL_RCC_AHB1_FORCE_RESET(); - __HAL_RCC_AHB1_RELEASE_RESET(); - - __HAL_RCC_AHB2_FORCE_RESET(); - __HAL_RCC_AHB2_RELEASE_RESET(); - - __HAL_RCC_AHB3_FORCE_RESET(); - __HAL_RCC_AHB3_RELEASE_RESET(); - - /* De-Init the low level hardware */ - HAL_MspDeInit(); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initialize the MSP. - * @retval None - */ -__weak void HAL_MspInit(void) -{ - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes the MSP. - * @retval None - */ -__weak void HAL_MspDeInit(void) -{ - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief This function configures the source of the time base. - * The time source is configured to have 1ms time base with a dedicated - * Tick interrupt priority. - * @note This function is called automatically at the beginning of program after - * reset by HAL_Init() or at any time when clock is reconfigured by HAL_RCC_ClockConfig(). - * @note In the default implementation, SysTick timer is the source of time base. - * It is used to generate interrupts at regular time intervals. - * Care must be taken if HAL_Delay() is called from a peripheral ISR process, - * The SysTick interrupt must have higher priority (numerically lower) - * than the peripheral interrupt. Otherwise the caller ISR process will be blocked. - * The function is declared as __weak to be overwritten in case of other - * implementation in user file. - * @param TickPriority Tick interrupt priority. - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) -{ - /* Configure the SysTick to have interrupt in 1ms time basis*/ - if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) - { - return HAL_ERROR; - } - - /* Configure the SysTick IRQ priority */ - if (TickPriority < (1UL << __NVIC_PRIO_BITS)) - { - HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); - uwTickPrio = TickPriority; - } - else - { - return HAL_ERROR; - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup HAL_Exported_Functions_Group2 HAL Control functions - * @brief HAL Control functions - * -@verbatim - =============================================================================== - ##### HAL Control functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Provide a tick value in millisecond - (+) Provide a blocking delay in millisecond - (+) Suspend the time base source interrupt - (+) Resume the time base source interrupt - (+) Get the HAL API driver version - (+) Get the device identifier - (+) Get the device revision identifier - (+) Enable/Disable Debug module during SLEEP mode - (+) Enable/Disable Debug module during STOP mode - (+) Enable/Disable Debug module during STANDBY mode - -@endverbatim - * @{ - */ - -/** - * @brief This function is called to increment a global variable "uwTick" - * used as application time base. - * @note In the default implementation, this variable is incremented each 1ms - * in SysTick ISR. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval None - */ -__weak void HAL_IncTick(void) -{ - uwTick += uwTickFreq; -} - -/** - * @brief Provides a tick value in millisecond. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval tick value - */ -__weak uint32_t HAL_GetTick(void) -{ - return uwTick; -} - -/** - * @brief This function returns a tick priority. - * @retval tick priority - */ -uint32_t HAL_GetTickPrio(void) -{ - return uwTickPrio; -} - -/** - * @brief Set new tick Freq. - * @retval Status - */ -HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) -{ - HAL_StatusTypeDef status = HAL_OK; - HAL_TickFreqTypeDef prevTickFreq; - - assert_param(IS_TICKFREQ(Freq)); - - if (uwTickFreq != Freq) - { - /* Back up uwTickFreq frequency */ - prevTickFreq = uwTickFreq; - - /* Update uwTickFreq global variable used by HAL_InitTick() */ - uwTickFreq = Freq; - - /* Apply the new tick Freq */ - status = HAL_InitTick(uwTickPrio); - - if (status != HAL_OK) - { - /* Restore previous tick frequency */ - uwTickFreq = prevTickFreq; - } - } - - return status; -} - -/** - * @brief Return tick frequency. - * @retval Tick frequency. - * Value of @ref HAL_TickFreqTypeDef. - */ -HAL_TickFreqTypeDef HAL_GetTickFreq(void) -{ - return uwTickFreq; -} - -/** - * @brief This function provides minimum delay (in milliseconds) based - * on variable incremented. - * @note In the default implementation , SysTick timer is the source of time base. - * It is used to generate interrupts at regular time intervals where uwTick - * is incremented. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @param Delay specifies the delay time length, in milliseconds. - * @retval None - */ -__weak void HAL_Delay(uint32_t Delay) -{ - uint32_t tickstart = HAL_GetTick(); - uint32_t wait = Delay; - - /* Add a freq to guarantee minimum wait */ - if (wait < HAL_MAX_DELAY) - { - wait += (uint32_t)(uwTickFreq); - } - - while((HAL_GetTick() - tickstart) < wait) - { - } -} - -/** - * @brief Suspend Tick increment. - * @note In the default implementation , SysTick timer is the source of time base. It is - * used to generate interrupts at regular time intervals. Once HAL_SuspendTick() - * is called, the SysTick interrupt will be disabled and so Tick increment - * is suspended. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval None - */ -__weak void HAL_SuspendTick(void) -{ - /* Disable SysTick Interrupt */ - SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; -} - -/** - * @brief Resume Tick increment. - * @note In the default implementation , SysTick timer is the source of time base. It is - * used to generate interrupts at regular time intervals. Once HAL_ResumeTick() - * is called, the SysTick interrupt will be enabled and so Tick increment - * is resumed. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval None - */ -__weak void HAL_ResumeTick(void) -{ - /* Enable SysTick Interrupt */ - SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; -} - -/** - * @brief Returns the HAL revision - * @retval version : 0xXYZR (8bits for each decimal, R for RC) - */ -uint32_t HAL_GetHalVersion(void) -{ - return __STM32F4xx_HAL_VERSION; -} - -/** - * @brief Returns the device revision identifier. - * @retval Device revision identifier - */ -uint32_t HAL_GetREVID(void) -{ - return((DBGMCU->IDCODE) >> 16U); -} - -/** - * @brief Returns the device identifier. - * @retval Device identifier - */ -uint32_t HAL_GetDEVID(void) -{ - return((DBGMCU->IDCODE) & IDCODE_DEVID_MASK); -} - -/** - * @brief Enable the Debug Module during SLEEP mode - * @retval None - */ -void HAL_DBGMCU_EnableDBGSleepMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Disable the Debug Module during SLEEP mode - * @retval None - */ -void HAL_DBGMCU_DisableDBGSleepMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Enable the Debug Module during STOP mode - * @retval None - */ -void HAL_DBGMCU_EnableDBGStopMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Disable the Debug Module during STOP mode - * @retval None - */ -void HAL_DBGMCU_DisableDBGStopMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Enable the Debug Module during STANDBY mode - * @retval None - */ -void HAL_DBGMCU_EnableDBGStandbyMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Disable the Debug Module during STANDBY mode - * @retval None - */ -void HAL_DBGMCU_DisableDBGStandbyMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Enables the I/O Compensation Cell. - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V. - * @retval None - */ -void HAL_EnableCompensationCell(void) -{ - *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)ENABLE; -} - -/** - * @brief Power-down the I/O Compensation Cell. - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V. - * @retval None - */ -void HAL_DisableCompensationCell(void) -{ - *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)DISABLE; -} - -/** - * @brief Returns first word of the unique device identifier (UID based on 96 bits) - * @retval Device identifier - */ -uint32_t HAL_GetUIDw0(void) -{ - return (READ_REG(*((uint32_t *)UID_BASE))); -} - -/** - * @brief Returns second word of the unique device identifier (UID based on 96 bits) - * @retval Device identifier - */ -uint32_t HAL_GetUIDw1(void) -{ - return (READ_REG(*((uint32_t *)(UID_BASE + 4U)))); -} - -/** - * @brief Returns third word of the unique device identifier (UID based on 96 bits) - * @retval Device identifier - */ -uint32_t HAL_GetUIDw2(void) -{ - return (READ_REG(*((uint32_t *)(UID_BASE + 8U)))); -} - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Enables the Internal FLASH Bank Swapping. - * - * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. - * - * @note Flash Bank2 mapped at 0x08000000 (and aliased @0x00000000) - * and Flash Bank1 mapped at 0x08100000 (and aliased at 0x00100000) - * - * @retval None - */ -void HAL_EnableMemorySwappingBank(void) -{ - *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Internal FLASH Bank Swapping. - * - * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. - * - * @note The default state : Flash Bank1 mapped at 0x08000000 (and aliased @0x00000000) - * and Flash Bank2 mapped at 0x08100000 (and aliased at 0x00100000) - * - * @retval None - */ -void HAL_DisableMemorySwappingBank(void) -{ - *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)DISABLE; -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c deleted file mode 100644 index c3d2ba8..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c +++ /dev/null @@ -1,538 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_cortex.c - * @author MCD Application Team - * @brief CORTEX HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the CORTEX: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - - [..] - *** How to configure Interrupts using CORTEX HAL driver *** - =========================================================== - [..] - This section provides functions allowing to configure the NVIC interrupts (IRQ). - The Cortex-M4 exceptions are managed by CMSIS functions. - - (#) Configure the NVIC Priority Grouping using HAL_NVIC_SetPriorityGrouping() - function according to the following table. - (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority(). - (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ(). - (#) please refer to programming manual for details in how to configure priority. - - -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ preemption is no more possible. - The pending IRQ priority will be managed only by the sub priority. - - -@- IRQ priority order (sorted by highest to lowest priority): - (+@) Lowest preemption priority - (+@) Lowest sub priority - (+@) Lowest hardware priority (IRQ number) - - [..] - *** How to configure Systick using CORTEX HAL driver *** - ======================================================== - [..] - Setup SysTick Timer for time base. - - (+) The HAL_SYSTICK_Config() function calls the SysTick_Config() function which - is a CMSIS function that: - (++) Configures the SysTick Reload register with value passed as function parameter. - (++) Configures the SysTick IRQ priority to the lowest value 0x0F. - (++) Resets the SysTick Counter register. - (++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK). - (++) Enables the SysTick Interrupt. - (++) Starts the SysTick Counter. - - (+) You can change the SysTick Clock source to be HCLK_Div8 by calling the macro - __HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the - HAL_SYSTICK_Config() function call. The __HAL_CORTEX_SYSTICKCLK_CONFIG() macro is defined - inside the stm32f4xx_hal_cortex.h file. - - (+) You can change the SysTick IRQ priority by calling the - HAL_NVIC_SetPriority(SysTick_IRQn,...) function just after the HAL_SYSTICK_Config() function - call. The HAL_NVIC_SetPriority() call the NVIC_SetPriority() function which is a CMSIS function. - - (+) To adjust the SysTick time base, use the following formula: - - Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) - (++) Reload Value is the parameter to be passed for HAL_SYSTICK_Config() function - (++) Reload Value should not exceed 0xFFFFFF - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup CORTEX CORTEX - * @brief CORTEX HAL module driver - * @{ - */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions - * @{ - */ - - -/** @defgroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - ============================================================================== - ##### Initialization and de-initialization functions ##### - ============================================================================== - [..] - This section provides the CORTEX HAL driver functions allowing to configure Interrupts - Systick functionalities - -@endverbatim - * @{ - */ - - -/** - * @brief Sets the priority grouping field (preemption priority and subpriority) - * using the required unlock sequence. - * @param PriorityGroup The priority grouping bits length. - * This parameter can be one of the following values: - * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority - * 4 bits for subpriority - * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority - * 3 bits for subpriority - * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority - * 2 bits for subpriority - * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority - * 1 bits for subpriority - * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority - * 0 bits for subpriority - * @note When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible. - * The pending IRQ priority will be managed only by the subpriority. - * @retval None - */ -void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - /* Check the parameters */ - assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); - - /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ - NVIC_SetPriorityGrouping(PriorityGroup); -} - -/** - * @brief Sets the priority of an interrupt. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @param PreemptPriority The preemption priority for the IRQn channel. - * This parameter can be a value between 0 and 15 - * A lower priority value indicates a higher priority - * @param SubPriority the subpriority level for the IRQ channel. - * This parameter can be a value between 0 and 15 - * A lower priority value indicates a higher priority. - * @retval None - */ -void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t prioritygroup = 0x00U; - - /* Check the parameters */ - assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); - assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); - - prioritygroup = NVIC_GetPriorityGrouping(); - - NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); -} - -/** - * @brief Enables a device specific interrupt in the NVIC interrupt controller. - * @note To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() - * function should be called before. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Enable interrupt */ - NVIC_EnableIRQ(IRQn); -} - -/** - * @brief Disables a device specific interrupt in the NVIC interrupt controller. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_DisableIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Disable interrupt */ - NVIC_DisableIRQ(IRQn); -} - -/** - * @brief Initiates a system reset request to reset the MCU. - * @retval None - */ -void HAL_NVIC_SystemReset(void) -{ - /* System Reset */ - NVIC_SystemReset(); -} - -/** - * @brief Initializes the System Timer and its interrupt, and starts the System Tick Timer. - * Counter is in free running mode to generate periodic interrupts. - * @param TicksNumb Specifies the ticks Number of ticks between two interrupts. - * @retval status: - 0 Function succeeded. - * - 1 Function failed. - */ -uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) -{ - return SysTick_Config(TicksNumb); -} -/** - * @} - */ - -/** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions - * @brief Cortex control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control the CORTEX - (NVIC, SYSTICK, MPU) functionalities. - - -@endverbatim - * @{ - */ - -#if (__MPU_PRESENT == 1U) -/** - * @brief Disables the MPU - * @retval None - */ -void HAL_MPU_Disable(void) -{ - /* Make sure outstanding transfers are done */ - __DMB(); - - /* Disable fault exceptions */ - SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; - - /* Disable the MPU and clear the control register*/ - MPU->CTRL = 0U; -} - -/** - * @brief Enable the MPU. - * @param MPU_Control Specifies the control mode of the MPU during hard fault, - * NMI, FAULTMASK and privileged access to the default memory - * This parameter can be one of the following values: - * @arg MPU_HFNMI_PRIVDEF_NONE - * @arg MPU_HARDFAULT_NMI - * @arg MPU_PRIVILEGED_DEFAULT - * @arg MPU_HFNMI_PRIVDEF - * @retval None - */ -void HAL_MPU_Enable(uint32_t MPU_Control) -{ - /* Enable the MPU */ - MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; - - /* Enable fault exceptions */ - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - /* Ensure MPU setting take effects */ - __DSB(); - __ISB(); -} - -/** - * @brief Enables the MPU Region. - * @retval None - */ -void HAL_MPU_EnableRegion(uint32_t RegionNumber) -{ - /* Check the parameters */ - assert_param(IS_MPU_REGION_NUMBER(RegionNumber)); - - /* Set the Region number */ - MPU->RNR = RegionNumber; - - /* Enable the Region */ - SET_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); -} - -/** - * @brief Disables the MPU Region. - * @retval None - */ -void HAL_MPU_DisableRegion(uint32_t RegionNumber) -{ - /* Check the parameters */ - assert_param(IS_MPU_REGION_NUMBER(RegionNumber)); - - /* Set the Region number */ - MPU->RNR = RegionNumber; - - /* Disable the Region */ - CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); -} - -/** - * @brief Initializes and configures the Region and the memory to be protected. - * @param MPU_Init Pointer to a MPU_Region_InitTypeDef structure that contains - * the initialization and configuration information. - * @retval None - */ -void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init) -{ - /* Check the parameters */ - assert_param(IS_MPU_REGION_NUMBER(MPU_Init->Number)); - assert_param(IS_MPU_REGION_ENABLE(MPU_Init->Enable)); - assert_param(IS_MPU_INSTRUCTION_ACCESS(MPU_Init->DisableExec)); - assert_param(IS_MPU_REGION_PERMISSION_ATTRIBUTE(MPU_Init->AccessPermission)); - assert_param(IS_MPU_TEX_LEVEL(MPU_Init->TypeExtField)); - assert_param(IS_MPU_ACCESS_SHAREABLE(MPU_Init->IsShareable)); - assert_param(IS_MPU_ACCESS_CACHEABLE(MPU_Init->IsCacheable)); - assert_param(IS_MPU_ACCESS_BUFFERABLE(MPU_Init->IsBufferable)); - assert_param(IS_MPU_SUB_REGION_DISABLE(MPU_Init->SubRegionDisable)); - assert_param(IS_MPU_REGION_SIZE(MPU_Init->Size)); - - /* Set the Region number */ - MPU->RNR = MPU_Init->Number; - - /* Disable the Region */ - CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); - - /* Apply configuration */ - MPU->RBAR = MPU_Init->BaseAddress; - MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) | - ((uint32_t)MPU_Init->AccessPermission << MPU_RASR_AP_Pos) | - ((uint32_t)MPU_Init->TypeExtField << MPU_RASR_TEX_Pos) | - ((uint32_t)MPU_Init->IsShareable << MPU_RASR_S_Pos) | - ((uint32_t)MPU_Init->IsCacheable << MPU_RASR_C_Pos) | - ((uint32_t)MPU_Init->IsBufferable << MPU_RASR_B_Pos) | - ((uint32_t)MPU_Init->SubRegionDisable << MPU_RASR_SRD_Pos) | - ((uint32_t)MPU_Init->Size << MPU_RASR_SIZE_Pos) | - ((uint32_t)MPU_Init->Enable << MPU_RASR_ENABLE_Pos); -} -#endif /* __MPU_PRESENT */ - -/** - * @brief Clear pending events. - * @retval None - */ -void HAL_CORTEX_ClearEvent(void) -{ - __SEV(); - __WFE(); -} - -/** - * @brief Gets the priority grouping field from the NVIC Interrupt Controller. - * @retval Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field) - */ -uint32_t HAL_NVIC_GetPriorityGrouping(void) -{ - /* Get the PRIGROUP[10:8] field value */ - return NVIC_GetPriorityGrouping(); -} - -/** - * @brief Gets the priority of an interrupt. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @param PriorityGroup the priority grouping bits length. - * This parameter can be one of the following values: - * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority - * 4 bits for subpriority - * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority - * 3 bits for subpriority - * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority - * 2 bits for subpriority - * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority - * 1 bits for subpriority - * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority - * 0 bits for subpriority - * @param pPreemptPriority Pointer on the Preemptive priority value (starting from 0). - * @param pSubPriority Pointer on the Subpriority value (starting from 0). - * @retval None - */ -void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority) -{ - /* Check the parameters */ - assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); - /* Get priority for Cortex-M system or device specific interrupts */ - NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority); -} - -/** - * @brief Sets Pending bit of an external interrupt. - * @param IRQn External interrupt number - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Set interrupt pending */ - NVIC_SetPendingIRQ(IRQn); -} - -/** - * @brief Gets Pending Interrupt (reads the pending register in the NVIC - * and returns the pending bit for the specified interrupt). - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval status: - 0 Interrupt status is not pending. - * - 1 Interrupt status is pending. - */ -uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Return 1 if pending else 0 */ - return NVIC_GetPendingIRQ(IRQn); -} - -/** - * @brief Clears the pending bit of an external interrupt. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Clear pending interrupt */ - NVIC_ClearPendingIRQ(IRQn); -} - -/** - * @brief Gets active interrupt ( reads the active register in NVIC and returns the active bit). - * @param IRQn External interrupt number - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval status: - 0 Interrupt status is not pending. - * - 1 Interrupt status is pending. - */ -uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Return 1 if active else 0 */ - return NVIC_GetActive(IRQn); -} - -/** - * @brief Configures the SysTick clock source. - * @param CLKSource specifies the SysTick clock source. - * This parameter can be one of the following values: - * @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. - * @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. - * @retval None - */ -void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource) -{ - /* Check the parameters */ - assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource)); - if (CLKSource == SYSTICK_CLKSOURCE_HCLK) - { - SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; - } - else - { - SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK; - } -} - -/** - * @brief This function handles SYSTICK interrupt request. - * @retval None - */ -void HAL_SYSTICK_IRQHandler(void) -{ - HAL_SYSTICK_Callback(); -} - -/** - * @brief SYSTICK callback. - * @retval None - */ -__weak void HAL_SYSTICK_Callback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SYSTICK_Callback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_CORTEX_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c deleted file mode 100644 index 3dbb477..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c +++ /dev/null @@ -1,1305 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma.c - * @author MCD Application Team - * @brief DMA HAL module driver. - * - * This file provides firmware functions to manage the following - * functionalities of the Direct Memory Access (DMA) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral State and errors functions - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Enable and configure the peripheral to be connected to the DMA Stream - (except for internal SRAM/FLASH memories: no initialization is - necessary) please refer to Reference manual for connection between peripherals - and DMA requests. - - (#) For a given Stream, program the required configuration through the following parameters: - Transfer Direction, Source and Destination data formats, - Circular, Normal or peripheral flow control mode, Stream Priority level, - Source and Destination Increment mode, FIFO mode and its Threshold (if needed), - Burst mode for Source and/or Destination (if needed) using HAL_DMA_Init() function. - - -@- Prior to HAL_DMA_Init() the clock must be enabled for DMA through the following macros: - __HAL_RCC_DMA1_CLK_ENABLE() or __HAL_RCC_DMA2_CLK_ENABLE(). - - *** Polling mode IO operation *** - ================================= - [..] - (+) Use HAL_DMA_Start() to start DMA transfer after the configuration of Source - address and destination address and the Length of data to be transferred. - (+) Use HAL_DMA_PollForTransfer() to poll for the end of current transfer, in this - case a fixed Timeout can be configured by User depending from his application. - (+) Use HAL_DMA_Abort() function to abort the current transfer. - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Configure the DMA interrupt priority using HAL_NVIC_SetPriority() - (+) Enable the DMA IRQ handler using HAL_NVIC_EnableIRQ() - (+) Use HAL_DMA_Start_IT() to start DMA transfer after the configuration of - Source address and destination address and the Length of data to be transferred. In this - case the DMA interrupt is configured - (+) Use HAL_DMA_IRQHandler() called under DMA_IRQHandler() Interrupt subroutine - (+) At the end of data transfer HAL_DMA_IRQHandler() function is executed and user can - add his own function by customization of function pointer XferCpltCallback and - XferErrorCallback (i.e a member of DMA handle structure). - [..] - (#) Use HAL_DMA_GetState() function to return the DMA state and HAL_DMA_GetError() in case of error - detection. - - (#) Use HAL_DMA_Abort_IT() function to abort the current transfer - - -@- In Memory-to-Memory transfer mode, Circular mode is not allowed. - - -@- The FIFO is used mainly to reduce bus usage and to allow data packing/unpacking: it is - possible to set different Data Sizes for the Peripheral and the Memory (ie. you can set - Half-Word data size for the peripheral to access its data register and set Word data size - for the Memory to gain in access time. Each two half words will be packed and written in - a single access to a Word in the Memory). - - -@- When FIFO is disabled, it is not allowed to configure different Data Sizes for Source - and Destination. In this case the Peripheral Data Size will be applied to both Source - and Destination. - - *** DMA HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in DMA HAL driver. - - (+) __HAL_DMA_ENABLE: Enable the specified DMA Stream. - (+) __HAL_DMA_DISABLE: Disable the specified DMA Stream. - (+) __HAL_DMA_GET_IT_SOURCE: Check whether the specified DMA Stream interrupt has occurred or not. - - [..] - (@) You can refer to the DMA HAL driver header file for more useful macros - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup DMA DMA - * @brief DMA HAL module driver - * @{ - */ - -#ifdef HAL_DMA_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -typedef struct -{ - __IO uint32_t ISR; /*!< DMA interrupt status register */ - __IO uint32_t Reserved0; - __IO uint32_t IFCR; /*!< DMA interrupt flag clear register */ -} DMA_Base_Registers; - -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @addtogroup DMA_Private_Constants - * @{ - */ - #define HAL_TIMEOUT_DMA_ABORT 5U /* 5 ms */ -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup DMA_Private_Functions - * @{ - */ -static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma); - -/** - * @} - */ - -/* Exported functions ---------------------------------------------------------*/ -/** @addtogroup DMA_Exported_Functions - * @{ - */ - -/** @addtogroup DMA_Exported_Functions_Group1 - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to initialize the DMA Stream source - and destination addresses, incrementation and data sizes, transfer direction, - circular/normal mode selection, memory-to-memory mode selection and Stream priority value. - [..] - The HAL_DMA_Init() function follows the DMA configuration procedures as described in - reference manual. - -@endverbatim - * @{ - */ - -/** - * @brief Initialize the DMA according to the specified - * parameters in the DMA_InitTypeDef and create the associated handle. - * @param hdma Pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma) -{ - uint32_t tmp = 0U; - uint32_t tickstart = HAL_GetTick(); - DMA_Base_Registers *regs; - - /* Check the DMA peripheral state */ - if(hdma == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); - assert_param(IS_DMA_CHANNEL(hdma->Init.Channel)); - assert_param(IS_DMA_DIRECTION(hdma->Init.Direction)); - assert_param(IS_DMA_PERIPHERAL_INC_STATE(hdma->Init.PeriphInc)); - assert_param(IS_DMA_MEMORY_INC_STATE(hdma->Init.MemInc)); - assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->Init.PeriphDataAlignment)); - assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->Init.MemDataAlignment)); - assert_param(IS_DMA_MODE(hdma->Init.Mode)); - assert_param(IS_DMA_PRIORITY(hdma->Init.Priority)); - assert_param(IS_DMA_FIFO_MODE_STATE(hdma->Init.FIFOMode)); - /* Check the memory burst, peripheral burst and FIFO threshold parameters only - when FIFO mode is enabled */ - if(hdma->Init.FIFOMode != DMA_FIFOMODE_DISABLE) - { - assert_param(IS_DMA_FIFO_THRESHOLD(hdma->Init.FIFOThreshold)); - assert_param(IS_DMA_MEMORY_BURST(hdma->Init.MemBurst)); - assert_param(IS_DMA_PERIPHERAL_BURST(hdma->Init.PeriphBurst)); - } - - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Allocate lock resource */ - __HAL_UNLOCK(hdma); - - /* Disable the peripheral */ - __HAL_DMA_DISABLE(hdma); - - /* Check if the DMA Stream is effectively disabled */ - while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) - { - /* Check for the Timeout */ - if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_TIMEOUT; - - return HAL_TIMEOUT; - } - } - - /* Get the CR register value */ - tmp = hdma->Instance->CR; - - /* Clear CHSEL, MBURST, PBURST, PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR, CT and DBM bits */ - tmp &= ((uint32_t)~(DMA_SxCR_CHSEL | DMA_SxCR_MBURST | DMA_SxCR_PBURST | \ - DMA_SxCR_PL | DMA_SxCR_MSIZE | DMA_SxCR_PSIZE | \ - DMA_SxCR_MINC | DMA_SxCR_PINC | DMA_SxCR_CIRC | \ - DMA_SxCR_DIR | DMA_SxCR_CT | DMA_SxCR_DBM)); - - /* Prepare the DMA Stream configuration */ - tmp |= hdma->Init.Channel | hdma->Init.Direction | - hdma->Init.PeriphInc | hdma->Init.MemInc | - hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment | - hdma->Init.Mode | hdma->Init.Priority; - - /* the Memory burst and peripheral burst are not used when the FIFO is disabled */ - if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) - { - /* Get memory burst and peripheral burst */ - tmp |= hdma->Init.MemBurst | hdma->Init.PeriphBurst; - } - - /* Write to DMA Stream CR register */ - hdma->Instance->CR = tmp; - - /* Get the FCR register value */ - tmp = hdma->Instance->FCR; - - /* Clear Direct mode and FIFO threshold bits */ - tmp &= (uint32_t)~(DMA_SxFCR_DMDIS | DMA_SxFCR_FTH); - - /* Prepare the DMA Stream FIFO configuration */ - tmp |= hdma->Init.FIFOMode; - - /* The FIFO threshold is not used when the FIFO mode is disabled */ - if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) - { - /* Get the FIFO threshold */ - tmp |= hdma->Init.FIFOThreshold; - - /* Check compatibility between FIFO threshold level and size of the memory burst */ - /* for INCR4, INCR8, INCR16 bursts */ - if (hdma->Init.MemBurst != DMA_MBURST_SINGLE) - { - if (DMA_CheckFifoParam(hdma) != HAL_OK) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_PARAM; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - return HAL_ERROR; - } - } - } - - /* Write to DMA Stream FCR */ - hdma->Instance->FCR = tmp; - - /* Initialize StreamBaseAddress and StreamIndex parameters to be used to calculate - DMA steam Base Address needed by HAL_DMA_IRQHandler() and HAL_DMA_PollForTransfer() */ - regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); - - /* Clear all interrupt flags */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Initialize the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the DMA peripheral - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma) -{ - DMA_Base_Registers *regs; - - /* Check the DMA peripheral state */ - if(hdma == NULL) - { - return HAL_ERROR; - } - - /* Check the DMA peripheral state */ - if(hdma->State == HAL_DMA_STATE_BUSY) - { - /* Return error status */ - return HAL_BUSY; - } - - /* Check the parameters */ - assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); - - /* Disable the selected DMA Streamx */ - __HAL_DMA_DISABLE(hdma); - - /* Reset DMA Streamx control register */ - hdma->Instance->CR = 0U; - - /* Reset DMA Streamx number of data to transfer register */ - hdma->Instance->NDTR = 0U; - - /* Reset DMA Streamx peripheral address register */ - hdma->Instance->PAR = 0U; - - /* Reset DMA Streamx memory 0 address register */ - hdma->Instance->M0AR = 0U; - - /* Reset DMA Streamx memory 1 address register */ - hdma->Instance->M1AR = 0U; - - /* Reset DMA Streamx FIFO control register */ - hdma->Instance->FCR = 0x00000021U; - - /* Get DMA steam Base Address */ - regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); - - /* Clean all callbacks */ - hdma->XferCpltCallback = NULL; - hdma->XferHalfCpltCallback = NULL; - hdma->XferM1CpltCallback = NULL; - hdma->XferM1HalfCpltCallback = NULL; - hdma->XferErrorCallback = NULL; - hdma->XferAbortCallback = NULL; - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Reset the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Reset the DMA state */ - hdma->State = HAL_DMA_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hdma); - - return HAL_OK; -} - -/** - * @} - */ - -/** @addtogroup DMA_Exported_Functions_Group2 - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure the source, destination address and data length and Start DMA transfer - (+) Configure the source, destination address and data length and - Start DMA transfer with interrupt - (+) Abort DMA transfer - (+) Poll for transfer complete - (+) Handle DMA interrupt request - -@endverbatim - * @{ - */ - -/** - * @brief Starts the DMA Transfer. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Configure the source, destination address and the data length */ - DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Enable the Peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdma); - - /* Return error status */ - status = HAL_BUSY; - } - return status; -} - -/** - * @brief Start the DMA Transfer with interrupt enabled. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Configure the source, destination address and the data length */ - DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Enable Common interrupts*/ - hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; - - if(hdma->XferHalfCpltCallback != NULL) - { - hdma->Instance->CR |= DMA_IT_HT; - } - - /* Enable the Peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdma); - - /* Return error status */ - status = HAL_BUSY; - } - - return status; -} - -/** - * @brief Aborts the DMA Transfer. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * - * @note After disabling a DMA Stream, a check for wait until the DMA Stream is - * effectively disabled is added. If a Stream is disabled - * while a data transfer is ongoing, the current data will be transferred - * and the Stream will be effectively disabled only after the transfer of - * this single data is finished. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma) -{ - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - - uint32_t tickstart = HAL_GetTick(); - - if(hdma->State != HAL_DMA_STATE_BUSY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - return HAL_ERROR; - } - else - { - /* Disable all the transfer interrupts */ - hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); - hdma->Instance->FCR &= ~(DMA_IT_FE); - - if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) - { - hdma->Instance->CR &= ~(DMA_IT_HT); - } - - /* Disable the stream */ - __HAL_DMA_DISABLE(hdma); - - /* Check if the DMA Stream is effectively disabled */ - while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) - { - /* Check for the Timeout */ - if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - return HAL_TIMEOUT; - } - } - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Change the DMA state*/ - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - } - return HAL_OK; -} - -/** - * @brief Aborts the DMA Transfer in Interrupt mode. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma) -{ - if(hdma->State != HAL_DMA_STATE_BUSY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; - return HAL_ERROR; - } - else - { - /* Set Abort State */ - hdma->State = HAL_DMA_STATE_ABORT; - - /* Disable the stream */ - __HAL_DMA_DISABLE(hdma); - } - - return HAL_OK; -} - -/** - * @brief Polling for transfer complete. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param CompleteLevel Specifies the DMA level complete. - * @note The polling mode is kept in this version for legacy. it is recommended to use the IT model instead. - * This model could be used for debug purpose. - * @note The HAL_DMA_PollForTransfer API cannot be used in circular and double buffering mode (automatic circular mode). - * @param Timeout Timeout duration. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t mask_cpltlevel; - uint32_t tickstart = HAL_GetTick(); - uint32_t tmpisr; - - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs; - - if(HAL_DMA_STATE_BUSY != hdma->State) - { - /* No transfer ongoing */ - hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; - __HAL_UNLOCK(hdma); - return HAL_ERROR; - } - - /* Polling mode not supported in circular mode and double buffering mode */ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) != RESET) - { - hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; - return HAL_ERROR; - } - - /* Get the level transfer complete flag */ - if(CompleteLevel == HAL_DMA_FULL_TRANSFER) - { - /* Transfer Complete flag */ - mask_cpltlevel = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; - } - else - { - /* Half Transfer Complete flag */ - mask_cpltlevel = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; - } - - regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - tmpisr = regs->ISR; - - while(((tmpisr & mask_cpltlevel) == RESET) && ((hdma->ErrorCode & HAL_DMA_ERROR_TE) == RESET)) - { - /* Check for the Timeout (Not applicable in circular mode)*/ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - return HAL_TIMEOUT; - } - } - - /* Get the ISR register value */ - tmpisr = regs->ISR; - - if((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) - { - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_TE; - - /* Clear the transfer error flag */ - regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; - } - - if((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) - { - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_FE; - - /* Clear the FIFO error flag */ - regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; - } - - if((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) - { - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_DME; - - /* Clear the Direct Mode error flag */ - regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; - } - } - - if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) - { - if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) - { - HAL_DMA_Abort(hdma); - - /* Clear the half transfer and transfer complete flags */ - regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; - - /* Change the DMA state */ - hdma->State= HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - return HAL_ERROR; - } - } - - /* Get the level transfer complete flag */ - if(CompleteLevel == HAL_DMA_FULL_TRANSFER) - { - /* Clear the half transfer and transfer complete flags */ - regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; - - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - } - else - { - /* Clear the half transfer and transfer complete flags */ - regs->IFCR = (DMA_FLAG_HTIF0_4) << hdma->StreamIndex; - } - - return status; -} - -/** - * @brief Handles DMA interrupt request. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval None - */ -void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) -{ - uint32_t tmpisr; - __IO uint32_t count = 0U; - uint32_t timeout = SystemCoreClock / 9600U; - - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - - tmpisr = regs->ISR; - - /* Transfer Error Interrupt management ***************************************/ - if ((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TE) != RESET) - { - /* Disable the transfer error interrupt */ - hdma->Instance->CR &= ~(DMA_IT_TE); - - /* Clear the transfer error flag */ - regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; - - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_TE; - } - } - /* FIFO Error Interrupt management ******************************************/ - if ((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_FE) != RESET) - { - /* Clear the FIFO error flag */ - regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; - - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_FE; - } - } - /* Direct Mode Error Interrupt management ***********************************/ - if ((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_DME) != RESET) - { - /* Clear the direct mode error flag */ - regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; - - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_DME; - } - } - /* Half Transfer Complete Interrupt management ******************************/ - if ((tmpisr & (DMA_FLAG_HTIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_HT) != RESET) - { - /* Clear the half transfer complete flag */ - regs->IFCR = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; - - /* Multi_Buffering mode enabled */ - if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) - { - /* Current memory buffer used is Memory 0 */ - if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) - { - if(hdma->XferHalfCpltCallback != NULL) - { - /* Half transfer callback */ - hdma->XferHalfCpltCallback(hdma); - } - } - /* Current memory buffer used is Memory 1 */ - else - { - if(hdma->XferM1HalfCpltCallback != NULL) - { - /* Half transfer callback */ - hdma->XferM1HalfCpltCallback(hdma); - } - } - } - else - { - /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */ - if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) - { - /* Disable the half transfer interrupt */ - hdma->Instance->CR &= ~(DMA_IT_HT); - } - - if(hdma->XferHalfCpltCallback != NULL) - { - /* Half transfer callback */ - hdma->XferHalfCpltCallback(hdma); - } - } - } - } - /* Transfer Complete Interrupt management ***********************************/ - if ((tmpisr & (DMA_FLAG_TCIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TC) != RESET) - { - /* Clear the transfer complete flag */ - regs->IFCR = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; - - if(HAL_DMA_STATE_ABORT == hdma->State) - { - /* Disable all the transfer interrupts */ - hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); - hdma->Instance->FCR &= ~(DMA_IT_FE); - - if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) - { - hdma->Instance->CR &= ~(DMA_IT_HT); - } - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - if(hdma->XferAbortCallback != NULL) - { - hdma->XferAbortCallback(hdma); - } - return; - } - - if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) - { - /* Current memory buffer used is Memory 0 */ - if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) - { - if(hdma->XferM1CpltCallback != NULL) - { - /* Transfer complete Callback for memory1 */ - hdma->XferM1CpltCallback(hdma); - } - } - /* Current memory buffer used is Memory 1 */ - else - { - if(hdma->XferCpltCallback != NULL) - { - /* Transfer complete Callback for memory0 */ - hdma->XferCpltCallback(hdma); - } - } - } - /* Disable the transfer complete interrupt if the DMA mode is not CIRCULAR */ - else - { - if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) - { - /* Disable the transfer complete interrupt */ - hdma->Instance->CR &= ~(DMA_IT_TC); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - } - - if(hdma->XferCpltCallback != NULL) - { - /* Transfer complete callback */ - hdma->XferCpltCallback(hdma); - } - } - } - } - - /* manage error case */ - if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) - { - if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) - { - hdma->State = HAL_DMA_STATE_ABORT; - - /* Disable the stream */ - __HAL_DMA_DISABLE(hdma); - - do - { - if (++count > timeout) - { - break; - } - } - while((hdma->Instance->CR & DMA_SxCR_EN) != RESET); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - } - - if(hdma->XferErrorCallback != NULL) - { - /* Transfer error callback */ - hdma->XferErrorCallback(hdma); - } - } -} - -/** - * @brief Register callbacks - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param CallbackID User Callback identifier - * a DMA_HandleTypeDef structure as parameter. - * @param pCallback pointer to private callback function which has pointer to - * a DMA_HandleTypeDef structure as parameter. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)) -{ - - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - switch (CallbackID) - { - case HAL_DMA_XFER_CPLT_CB_ID: - hdma->XferCpltCallback = pCallback; - break; - - case HAL_DMA_XFER_HALFCPLT_CB_ID: - hdma->XferHalfCpltCallback = pCallback; - break; - - case HAL_DMA_XFER_M1CPLT_CB_ID: - hdma->XferM1CpltCallback = pCallback; - break; - - case HAL_DMA_XFER_M1HALFCPLT_CB_ID: - hdma->XferM1HalfCpltCallback = pCallback; - break; - - case HAL_DMA_XFER_ERROR_CB_ID: - hdma->XferErrorCallback = pCallback; - break; - - case HAL_DMA_XFER_ABORT_CB_ID: - hdma->XferAbortCallback = pCallback; - break; - - default: - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hdma); - - return status; -} - -/** - * @brief UnRegister callbacks - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param CallbackID User Callback identifier - * a HAL_DMA_CallbackIDTypeDef ENUM as parameter. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - switch (CallbackID) - { - case HAL_DMA_XFER_CPLT_CB_ID: - hdma->XferCpltCallback = NULL; - break; - - case HAL_DMA_XFER_HALFCPLT_CB_ID: - hdma->XferHalfCpltCallback = NULL; - break; - - case HAL_DMA_XFER_M1CPLT_CB_ID: - hdma->XferM1CpltCallback = NULL; - break; - - case HAL_DMA_XFER_M1HALFCPLT_CB_ID: - hdma->XferM1HalfCpltCallback = NULL; - break; - - case HAL_DMA_XFER_ERROR_CB_ID: - hdma->XferErrorCallback = NULL; - break; - - case HAL_DMA_XFER_ABORT_CB_ID: - hdma->XferAbortCallback = NULL; - break; - - case HAL_DMA_XFER_ALL_CB_ID: - hdma->XferCpltCallback = NULL; - hdma->XferHalfCpltCallback = NULL; - hdma->XferM1CpltCallback = NULL; - hdma->XferM1HalfCpltCallback = NULL; - hdma->XferErrorCallback = NULL; - hdma->XferAbortCallback = NULL; - break; - - default: - status = HAL_ERROR; - break; - } - } - else - { - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hdma); - - return status; -} - -/** - * @} - */ - -/** @addtogroup DMA_Exported_Functions_Group3 - * -@verbatim - =============================================================================== - ##### State and Errors functions ##### - =============================================================================== - [..] - This subsection provides functions allowing to - (+) Check the DMA state - (+) Get error code - -@endverbatim - * @{ - */ - -/** - * @brief Returns the DMA state. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL state - */ -HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma) -{ - return hdma->State; -} - -/** - * @brief Return the DMA error code - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval DMA Error Code - */ -uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma) -{ - return hdma->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup DMA_Private_Functions - * @{ - */ - -/** - * @brief Sets the DMA Transfer parameter. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - /* Clear DBM bit */ - hdma->Instance->CR &= (uint32_t)(~DMA_SxCR_DBM); - - /* Configure DMA Stream data length */ - hdma->Instance->NDTR = DataLength; - - /* Memory to Peripheral */ - if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) - { - /* Configure DMA Stream destination address */ - hdma->Instance->PAR = DstAddress; - - /* Configure DMA Stream source address */ - hdma->Instance->M0AR = SrcAddress; - } - /* Peripheral to Memory */ - else - { - /* Configure DMA Stream source address */ - hdma->Instance->PAR = SrcAddress; - - /* Configure DMA Stream destination address */ - hdma->Instance->M0AR = DstAddress; - } -} - -/** - * @brief Returns the DMA Stream base address depending on stream number - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval Stream base address - */ -static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma) -{ - uint32_t stream_number = (((uint32_t)hdma->Instance & 0xFFU) - 16U) / 24U; - - /* lookup table for necessary bitshift of flags within status registers */ - static const uint8_t flagBitshiftOffset[8U] = {0U, 6U, 16U, 22U, 0U, 6U, 16U, 22U}; - hdma->StreamIndex = flagBitshiftOffset[stream_number]; - - if (stream_number > 3U) - { - /* return pointer to HISR and HIFCR */ - hdma->StreamBaseAddress = (((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)) + 4U); - } - else - { - /* return pointer to LISR and LIFCR */ - hdma->StreamBaseAddress = ((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)); - } - - return hdma->StreamBaseAddress; -} - -/** - * @brief Check compatibility between FIFO threshold level and size of the memory burst - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmp = hdma->Init.FIFOThreshold; - - /* Memory Data size equal to Byte */ - if(hdma->Init.MemDataAlignment == DMA_MDATAALIGN_BYTE) - { - switch (tmp) - { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_HALFFULL: - if (hdma->Init.MemBurst == DMA_MBURST_INC16) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_FULL: - break; - default: - break; - } - } - - /* Memory Data size equal to Half-Word */ - else if (hdma->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) - { - switch (tmp) - { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - status = HAL_ERROR; - break; - case DMA_FIFO_THRESHOLD_HALFFULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_FULL: - if (hdma->Init.MemBurst == DMA_MBURST_INC16) - { - status = HAL_ERROR; - } - break; - default: - break; - } - } - - /* Memory Data size equal to Word */ - else - { - switch (tmp) - { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_HALFFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - status = HAL_ERROR; - break; - case DMA_FIFO_THRESHOLD_FULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - default: - break; - } - } - - return status; -} - -/** - * @} - */ - -#endif /* HAL_DMA_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c deleted file mode 100644 index f5b1845..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c +++ /dev/null @@ -1,2127 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma2d.c - * @author MCD Application Team - * @brief DMA2D HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the DMA2D peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State and Errors functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Program the required configuration through the following parameters: - the transfer mode, the output color mode and the output offset using - HAL_DMA2D_Init() function. - - (#) Program the required configuration through the following parameters: - the input color mode, the input color, the input alpha value, the alpha mode, - the red/blue swap mode, the inverted alpha mode and the input offset using - HAL_DMA2D_ConfigLayer() function for foreground or/and background layer. - - *** Polling mode IO operation *** - ================================= - [..] - (#) Configure pdata parameter (explained hereafter), destination and data length - and enable the transfer using HAL_DMA2D_Start(). - (#) Wait for end of transfer using HAL_DMA2D_PollForTransfer(), at this stage - user can specify the value of timeout according to his end application. - - *** Interrupt mode IO operation *** - =================================== - [..] - (#) Configure pdata parameter, destination and data length and enable - the transfer using HAL_DMA2D_Start_IT(). - (#) Use HAL_DMA2D_IRQHandler() called under DMA2D_IRQHandler() interrupt subroutine. - (#) At the end of data transfer HAL_DMA2D_IRQHandler() function is executed and user can - add his own function by customization of function pointer XferCpltCallback (member - of DMA2D handle structure). - (#) In case of error, the HAL_DMA2D_IRQHandler() function calls the callback - XferErrorCallback. - - -@- In Register-to-Memory transfer mode, pdata parameter is the register - color, in Memory-to-memory or Memory-to-Memory with pixel format - conversion pdata is the source address. - - -@- Configure the foreground source address, the background source address, - the destination and data length then Enable the transfer using - HAL_DMA2D_BlendingStart() in polling mode and HAL_DMA2D_BlendingStart_IT() - in interrupt mode. - - -@- HAL_DMA2D_BlendingStart() and HAL_DMA2D_BlendingStart_IT() functions - are used if the memory to memory with blending transfer mode is selected. - - (#) Optionally, configure and enable the CLUT using HAL_DMA2D_CLUTLoad() in polling - mode or HAL_DMA2D_CLUTLoad_IT() in interrupt mode. - - (#) Optionally, configure the line watermark in using the API HAL_DMA2D_ProgramLineEvent(). - - (#) Optionally, configure the dead time value in the AHB clock cycle inserted between two - consecutive accesses on the AHB master port in using the API HAL_DMA2D_ConfigDeadTime() - and enable/disable the functionality with the APIs HAL_DMA2D_EnableDeadTime() or - HAL_DMA2D_DisableDeadTime(). - - (#) The transfer can be suspended, resumed and aborted using the following - functions: HAL_DMA2D_Suspend(), HAL_DMA2D_Resume(), HAL_DMA2D_Abort(). - - (#) The CLUT loading can be suspended, resumed and aborted using the following - functions: HAL_DMA2D_CLUTLoading_Suspend(), HAL_DMA2D_CLUTLoading_Resume(), - HAL_DMA2D_CLUTLoading_Abort(). - - (#) To control the DMA2D state, use the following function: HAL_DMA2D_GetState(). - - (#) To read the DMA2D error code, use the following function: HAL_DMA2D_GetError(). - - *** DMA2D HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in DMA2D HAL driver : - - (+) __HAL_DMA2D_ENABLE: Enable the DMA2D peripheral. - (+) __HAL_DMA2D_GET_FLAG: Get the DMA2D pending flags. - (+) __HAL_DMA2D_CLEAR_FLAG: Clear the DMA2D pending flags. - (+) __HAL_DMA2D_ENABLE_IT: Enable the specified DMA2D interrupts. - (+) __HAL_DMA2D_DISABLE_IT: Disable the specified DMA2D interrupts. - (+) __HAL_DMA2D_GET_IT_SOURCE: Check whether the specified DMA2D interrupt is enabled or not. - - *** Callback registration *** - =================================== - [..] - (#) The compilation define USE_HAL_DMA2D_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - Use function @ref HAL_DMA2D_RegisterCallback() to register a user callback. - - (#) Function @ref HAL_DMA2D_RegisterCallback() allows to register following callbacks: - (+) XferCpltCallback : callback for transfer complete. - (+) XferErrorCallback : callback for transfer error. - (+) LineEventCallback : callback for line event. - (+) CLUTLoadingCpltCallback : callback for CLUT loading completion. - (+) MspInitCallback : DMA2D MspInit. - (+) MspDeInitCallback : DMA2D MspDeInit. - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - - (#) Use function @ref HAL_DMA2D_UnRegisterCallback() to reset a callback to the default - weak (overridden) function. - @ref HAL_DMA2D_UnRegisterCallback() takes as parameters the HAL peripheral handle, - and the Callback ID. - This function allows to reset following callbacks: - (+) XferCpltCallback : callback for transfer complete. - (+) XferErrorCallback : callback for transfer error. - (+) LineEventCallback : callback for line event. - (+) CLUTLoadingCpltCallback : callback for CLUT loading completion. - (+) MspInitCallback : DMA2D MspInit. - (+) MspDeInitCallback : DMA2D MspDeInit. - - (#) By default, after the @ref HAL_DMA2D_Init and if the state is HAL_DMA2D_STATE_RESET - all callbacks are reset to the corresponding legacy weak (overridden) functions: - examples @ref HAL_DMA2D_LineEventCallback(), @ref HAL_DMA2D_CLUTLoadingCpltCallback() - Exception done for MspInit and MspDeInit callbacks that are respectively - reset to the legacy weak (overridden) functions in the @ref HAL_DMA2D_Init - and @ref HAL_DMA2D_DeInit only when these callbacks are null (not registered beforehand) - If not, MspInit or MspDeInit are not null, the @ref HAL_DMA2D_Init and @ref HAL_DMA2D_DeInit - keep and use the user MspInit/MspDeInit callbacks (registered beforehand). - - Exception as well for Transfer Completion and Transfer Error callbacks that are not defined - as weak (overridden) functions. They must be defined by the user to be resorted to. - - Callbacks can be registered/unregistered in READY state only. - Exception done for MspInit/MspDeInit callbacks that can be registered/unregistered - in READY or RESET state, thus registered (user) MspInit/DeInit callbacks can be used - during the Init/DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using @ref HAL_DMA2D_RegisterCallback before calling @ref HAL_DMA2D_DeInit - or @ref HAL_DMA2D_Init function. - - When The compilation define USE_HAL_DMA2D_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registering feature is not available - and weak (overridden) callbacks are used. - - [..] - (@) You can refer to the DMA2D HAL driver header file for more useful macros - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -#ifdef HAL_DMA2D_MODULE_ENABLED -#if defined (DMA2D) - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup DMA2D DMA2D - * @brief DMA2D HAL module driver - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @defgroup DMA2D_Private_Constants DMA2D Private Constants - * @{ - */ - -/** @defgroup DMA2D_TimeOut DMA2D Time Out - * @{ - */ -#define DMA2D_TIMEOUT_ABORT (1000U) /*!< 1s */ -#define DMA2D_TIMEOUT_SUSPEND (1000U) /*!< 1s */ -/** - * @} - */ - -/** - * @} - */ - -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup DMA2D_Private_Functions DMA2D Private Functions - * @{ - */ -static void DMA2D_SetConfig(DMA2D_HandleTypeDef *hdma2d, uint32_t pdata, uint32_t DstAddress, uint32_t Width, - uint32_t Height); -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup DMA2D_Exported_Functions DMA2D Exported Functions - * @{ - */ - -/** @defgroup DMA2D_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initialize and configure the DMA2D - (+) De-initialize the DMA2D - -@endverbatim - * @{ - */ - -/** - * @brief Initialize the DMA2D according to the specified - * parameters in the DMA2D_InitTypeDef and create the associated handle. - * @param hdma2d pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_Init(DMA2D_HandleTypeDef *hdma2d) -{ - /* Check the DMA2D peripheral state */ - if (hdma2d == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_DMA2D_ALL_INSTANCE(hdma2d->Instance)); - assert_param(IS_DMA2D_MODE(hdma2d->Init.Mode)); - assert_param(IS_DMA2D_CMODE(hdma2d->Init.ColorMode)); - assert_param(IS_DMA2D_OFFSET(hdma2d->Init.OutputOffset)); - -#if (USE_HAL_DMA2D_REGISTER_CALLBACKS == 1) - if (hdma2d->State == HAL_DMA2D_STATE_RESET) - { - /* Reset Callback pointers in HAL_DMA2D_STATE_RESET only */ - hdma2d->LineEventCallback = HAL_DMA2D_LineEventCallback; - hdma2d->CLUTLoadingCpltCallback = HAL_DMA2D_CLUTLoadingCpltCallback; - if (hdma2d->MspInitCallback == NULL) - { - hdma2d->MspInitCallback = HAL_DMA2D_MspInit; - } - - /* Init the low level hardware */ - hdma2d->MspInitCallback(hdma2d); - } -#else - if (hdma2d->State == HAL_DMA2D_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hdma2d->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_DMA2D_MspInit(hdma2d); - } -#endif /* (USE_HAL_DMA2D_REGISTER_CALLBACKS) */ - - /* Change DMA2D peripheral state */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - /* DMA2D CR register configuration -------------------------------------------*/ - MODIFY_REG(hdma2d->Instance->CR, DMA2D_CR_MODE, hdma2d->Init.Mode); - - /* DMA2D OPFCCR register configuration ---------------------------------------*/ - MODIFY_REG(hdma2d->Instance->OPFCCR, DMA2D_OPFCCR_CM, hdma2d->Init.ColorMode); - - /* DMA2D OOR register configuration ------------------------------------------*/ - MODIFY_REG(hdma2d->Instance->OOR, DMA2D_OOR_LO, hdma2d->Init.OutputOffset); - - - /* Update error code */ - hdma2d->ErrorCode = HAL_DMA2D_ERROR_NONE; - - /* Initialize the DMA2D state*/ - hdma2d->State = HAL_DMA2D_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Deinitializes the DMA2D peripheral registers to their default reset - * values. - * @param hdma2d pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @retval None - */ - -HAL_StatusTypeDef HAL_DMA2D_DeInit(DMA2D_HandleTypeDef *hdma2d) -{ - - /* Check the DMA2D peripheral state */ - if (hdma2d == NULL) - { - return HAL_ERROR; - } - - /* Before aborting any DMA2D transfer or CLUT loading, check - first whether or not DMA2D clock is enabled */ - if (__HAL_RCC_DMA2D_IS_CLK_ENABLED() == 1U) - { - /* Abort DMA2D transfer if any */ - if ((hdma2d->Instance->CR & DMA2D_CR_START) == DMA2D_CR_START) - { - if (HAL_DMA2D_Abort(hdma2d) != HAL_OK) - { - /* Issue when aborting DMA2D transfer */ - return HAL_ERROR; - } - } - else - { - /* Abort background CLUT loading if any */ - if ((hdma2d->Instance->BGPFCCR & DMA2D_BGPFCCR_START) == DMA2D_BGPFCCR_START) - { - if (HAL_DMA2D_CLUTLoading_Abort(hdma2d, 0U) != HAL_OK) - { - /* Issue when aborting background CLUT loading */ - return HAL_ERROR; - } - } - else - { - /* Abort foreground CLUT loading if any */ - if ((hdma2d->Instance->FGPFCCR & DMA2D_FGPFCCR_START) == DMA2D_FGPFCCR_START) - { - if (HAL_DMA2D_CLUTLoading_Abort(hdma2d, 1U) != HAL_OK) - { - /* Issue when aborting foreground CLUT loading */ - return HAL_ERROR; - } - } - } - } - } - - /* Reset DMA2D control registers*/ - hdma2d->Instance->CR = 0U; - hdma2d->Instance->IFCR = 0x3FU; - hdma2d->Instance->FGOR = 0U; - hdma2d->Instance->BGOR = 0U; - hdma2d->Instance->FGPFCCR = 0U; - hdma2d->Instance->BGPFCCR = 0U; - hdma2d->Instance->OPFCCR = 0U; - -#if (USE_HAL_DMA2D_REGISTER_CALLBACKS == 1) - - if (hdma2d->MspDeInitCallback == NULL) - { - hdma2d->MspDeInitCallback = HAL_DMA2D_MspDeInit; - } - - /* DeInit the low level hardware */ - hdma2d->MspDeInitCallback(hdma2d); - -#else - /* Carry on with de-initialization of low level hardware */ - HAL_DMA2D_MspDeInit(hdma2d); -#endif /* (USE_HAL_DMA2D_REGISTER_CALLBACKS) */ - - /* Update error code */ - hdma2d->ErrorCode = HAL_DMA2D_ERROR_NONE; - - /* Initialize the DMA2D state*/ - hdma2d->State = HAL_DMA2D_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hdma2d); - - return HAL_OK; -} - -/** - * @brief Initializes the DMA2D MSP. - * @param hdma2d pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @retval None - */ -__weak void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hdma2d); - - /* NOTE : This function should not be modified; when the callback is needed, - the HAL_DMA2D_MspInit can be implemented in the user file. - */ -} - -/** - * @brief DeInitializes the DMA2D MSP. - * @param hdma2d pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @retval None - */ -__weak void HAL_DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hdma2d); - - /* NOTE : This function should not be modified; when the callback is needed, - the HAL_DMA2D_MspDeInit can be implemented in the user file. - */ -} - -#if (USE_HAL_DMA2D_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User DMA2D Callback - * To be used instead of the weak (overridden) predefined callback - * @param hdma2d DMA2D handle - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_DMA2D_TRANSFERCOMPLETE_CB_ID DMA2D transfer complete Callback ID - * @arg @ref HAL_DMA2D_TRANSFERERROR_CB_ID DMA2D transfer error Callback ID - * @arg @ref HAL_DMA2D_LINEEVENT_CB_ID DMA2D line event Callback ID - * @arg @ref HAL_DMA2D_CLUTLOADINGCPLT_CB_ID DMA2D CLUT loading completion Callback ID - * @arg @ref HAL_DMA2D_MSPINIT_CB_ID DMA2D MspInit callback ID - * @arg @ref HAL_DMA2D_MSPDEINIT_CB_ID DMA2D MspDeInit callback ID - * @param pCallback pointer to the Callback function - * @note No weak predefined callbacks are defined for HAL_DMA2D_TRANSFERCOMPLETE_CB_ID or HAL_DMA2D_TRANSFERERROR_CB_ID - * @retval status - */ -HAL_StatusTypeDef HAL_DMA2D_RegisterCallback(DMA2D_HandleTypeDef *hdma2d, HAL_DMA2D_CallbackIDTypeDef CallbackID, - pDMA2D_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_INVALID_CALLBACK; - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(hdma2d); - - if (HAL_DMA2D_STATE_READY == hdma2d->State) - { - switch (CallbackID) - { - case HAL_DMA2D_TRANSFERCOMPLETE_CB_ID : - hdma2d->XferCpltCallback = pCallback; - break; - - case HAL_DMA2D_TRANSFERERROR_CB_ID : - hdma2d->XferErrorCallback = pCallback; - break; - - case HAL_DMA2D_LINEEVENT_CB_ID : - hdma2d->LineEventCallback = pCallback; - break; - - case HAL_DMA2D_CLUTLOADINGCPLT_CB_ID : - hdma2d->CLUTLoadingCpltCallback = pCallback; - break; - - case HAL_DMA2D_MSPINIT_CB_ID : - hdma2d->MspInitCallback = pCallback; - break; - - case HAL_DMA2D_MSPDEINIT_CB_ID : - hdma2d->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_INVALID_CALLBACK; - /* update return status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_DMA2D_STATE_RESET == hdma2d->State) - { - switch (CallbackID) - { - case HAL_DMA2D_MSPINIT_CB_ID : - hdma2d->MspInitCallback = pCallback; - break; - - case HAL_DMA2D_MSPDEINIT_CB_ID : - hdma2d->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_INVALID_CALLBACK; - /* update return status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_INVALID_CALLBACK; - /* update return status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hdma2d); - return status; -} - -/** - * @brief Unregister a DMA2D Callback - * DMA2D Callback is redirected to the weak (overridden) predefined callback - * @param hdma2d DMA2D handle - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_DMA2D_TRANSFERCOMPLETE_CB_ID DMA2D transfer complete Callback ID - * @arg @ref HAL_DMA2D_TRANSFERERROR_CB_ID DMA2D transfer error Callback ID - * @arg @ref HAL_DMA2D_LINEEVENT_CB_ID DMA2D line event Callback ID - * @arg @ref HAL_DMA2D_CLUTLOADINGCPLT_CB_ID DMA2D CLUT loading completion Callback ID - * @arg @ref HAL_DMA2D_MSPINIT_CB_ID DMA2D MspInit callback ID - * @arg @ref HAL_DMA2D_MSPDEINIT_CB_ID DMA2D MspDeInit callback ID - * @note No weak predefined callbacks are defined for HAL_DMA2D_TRANSFERCOMPLETE_CB_ID or HAL_DMA2D_TRANSFERERROR_CB_ID - * @retval status - */ -HAL_StatusTypeDef HAL_DMA2D_UnRegisterCallback(DMA2D_HandleTypeDef *hdma2d, HAL_DMA2D_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hdma2d); - - if (HAL_DMA2D_STATE_READY == hdma2d->State) - { - switch (CallbackID) - { - case HAL_DMA2D_TRANSFERCOMPLETE_CB_ID : - hdma2d->XferCpltCallback = NULL; - break; - - case HAL_DMA2D_TRANSFERERROR_CB_ID : - hdma2d->XferErrorCallback = NULL; - break; - - case HAL_DMA2D_LINEEVENT_CB_ID : - hdma2d->LineEventCallback = HAL_DMA2D_LineEventCallback; - break; - - case HAL_DMA2D_CLUTLOADINGCPLT_CB_ID : - hdma2d->CLUTLoadingCpltCallback = HAL_DMA2D_CLUTLoadingCpltCallback; - break; - - case HAL_DMA2D_MSPINIT_CB_ID : - hdma2d->MspInitCallback = HAL_DMA2D_MspInit; /* Legacy weak (overridden) Msp Init */ - break; - - case HAL_DMA2D_MSPDEINIT_CB_ID : - hdma2d->MspDeInitCallback = HAL_DMA2D_MspDeInit; /* Legacy weak (overridden) Msp DeInit */ - break; - - default : - /* Update the error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_INVALID_CALLBACK; - /* update return status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_DMA2D_STATE_RESET == hdma2d->State) - { - switch (CallbackID) - { - case HAL_DMA2D_MSPINIT_CB_ID : - hdma2d->MspInitCallback = HAL_DMA2D_MspInit; /* Legacy weak (overridden) Msp Init */ - break; - - case HAL_DMA2D_MSPDEINIT_CB_ID : - hdma2d->MspDeInitCallback = HAL_DMA2D_MspDeInit; /* Legacy weak (overridden) Msp DeInit */ - break; - - default : - /* Update the error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_INVALID_CALLBACK; - /* update return status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_INVALID_CALLBACK; - /* update return status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hdma2d); - return status; -} -#endif /* USE_HAL_DMA2D_REGISTER_CALLBACKS */ - -/** - * @} - */ - - -/** @defgroup DMA2D_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure the pdata, destination address and data size then - start the DMA2D transfer. - (+) Configure the source for foreground and background, destination address - and data size then start a MultiBuffer DMA2D transfer. - (+) Configure the pdata, destination address and data size then - start the DMA2D transfer with interrupt. - (+) Configure the source for foreground and background, destination address - and data size then start a MultiBuffer DMA2D transfer with interrupt. - (+) Abort DMA2D transfer. - (+) Suspend DMA2D transfer. - (+) Resume DMA2D transfer. - (+) Enable CLUT transfer. - (+) Configure CLUT loading then start transfer in polling mode. - (+) Configure CLUT loading then start transfer in interrupt mode. - (+) Abort DMA2D CLUT loading. - (+) Suspend DMA2D CLUT loading. - (+) Resume DMA2D CLUT loading. - (+) Poll for transfer complete. - (+) handle DMA2D interrupt request. - (+) Transfer watermark callback. - (+) CLUT Transfer Complete callback. - - -@endverbatim - * @{ - */ - -/** - * @brief Start the DMA2D Transfer. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param pdata Configure the source memory Buffer address if - * Memory-to-Memory or Memory-to-Memory with pixel format - * conversion mode is selected, or configure - * the color value if Register-to-Memory mode is selected. - * @param DstAddress The destination memory Buffer address. - * @param Width The width of data to be transferred from source - * to destination (expressed in number of pixels per line). - * @param Height The height of data to be transferred from source to destination (expressed in number of lines). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_Start(DMA2D_HandleTypeDef *hdma2d, uint32_t pdata, uint32_t DstAddress, uint32_t Width, - uint32_t Height) -{ - /* Check the parameters */ - assert_param(IS_DMA2D_LINE(Height)); - assert_param(IS_DMA2D_PIXEL(Width)); - - /* Process locked */ - __HAL_LOCK(hdma2d); - - /* Change DMA2D peripheral state */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - /* Configure the source, destination address and the data size */ - DMA2D_SetConfig(hdma2d, pdata, DstAddress, Width, Height); - - /* Enable the Peripheral */ - __HAL_DMA2D_ENABLE(hdma2d); - - return HAL_OK; -} - -/** - * @brief Start the DMA2D Transfer with interrupt enabled. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param pdata Configure the source memory Buffer address if - * the Memory-to-Memory or Memory-to-Memory with pixel format - * conversion mode is selected, or configure - * the color value if Register-to-Memory mode is selected. - * @param DstAddress The destination memory Buffer address. - * @param Width The width of data to be transferred from source - * to destination (expressed in number of pixels per line). - * @param Height The height of data to be transferred from source to destination (expressed in number of lines). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_Start_IT(DMA2D_HandleTypeDef *hdma2d, uint32_t pdata, uint32_t DstAddress, uint32_t Width, - uint32_t Height) -{ - /* Check the parameters */ - assert_param(IS_DMA2D_LINE(Height)); - assert_param(IS_DMA2D_PIXEL(Width)); - - /* Process locked */ - __HAL_LOCK(hdma2d); - - /* Change DMA2D peripheral state */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - /* Configure the source, destination address and the data size */ - DMA2D_SetConfig(hdma2d, pdata, DstAddress, Width, Height); - - /* Enable the transfer complete, transfer error and configuration error interrupts */ - __HAL_DMA2D_ENABLE_IT(hdma2d, DMA2D_IT_TC | DMA2D_IT_TE | DMA2D_IT_CE); - - /* Enable the Peripheral */ - __HAL_DMA2D_ENABLE(hdma2d); - - return HAL_OK; -} - -/** - * @brief Start the multi-source DMA2D Transfer. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param SrcAddress1 The source memory Buffer address for the foreground layer. - * @param SrcAddress2 The source memory Buffer address for the background layer. - * @param DstAddress The destination memory Buffer address. - * @param Width The width of data to be transferred from source - * to destination (expressed in number of pixels per line). - * @param Height The height of data to be transferred from source to destination (expressed in number of lines). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_BlendingStart(DMA2D_HandleTypeDef *hdma2d, uint32_t SrcAddress1, uint32_t SrcAddress2, - uint32_t DstAddress, uint32_t Width, uint32_t Height) -{ - /* Check the parameters */ - assert_param(IS_DMA2D_LINE(Height)); - assert_param(IS_DMA2D_PIXEL(Width)); - - /* Process locked */ - __HAL_LOCK(hdma2d); - - /* Change DMA2D peripheral state */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - /* Configure DMA2D Stream source2 address */ - WRITE_REG(hdma2d->Instance->BGMAR, SrcAddress2); - - /* Configure the source, destination address and the data size */ - DMA2D_SetConfig(hdma2d, SrcAddress1, DstAddress, Width, Height); - - /* Enable the Peripheral */ - __HAL_DMA2D_ENABLE(hdma2d); - - return HAL_OK; -} - -/** - * @brief Start the multi-source DMA2D Transfer with interrupt enabled. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param SrcAddress1 The source memory Buffer address for the foreground layer. - * @param SrcAddress2 The source memory Buffer address for the background layer. - * @param DstAddress The destination memory Buffer address. - * @param Width The width of data to be transferred from source - * to destination (expressed in number of pixels per line). - * @param Height The height of data to be transferred from source to destination (expressed in number of lines). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_BlendingStart_IT(DMA2D_HandleTypeDef *hdma2d, uint32_t SrcAddress1, uint32_t SrcAddress2, - uint32_t DstAddress, uint32_t Width, uint32_t Height) -{ - /* Check the parameters */ - assert_param(IS_DMA2D_LINE(Height)); - assert_param(IS_DMA2D_PIXEL(Width)); - - /* Process locked */ - __HAL_LOCK(hdma2d); - - /* Change DMA2D peripheral state */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - /* Configure DMA2D Stream source2 address */ - WRITE_REG(hdma2d->Instance->BGMAR, SrcAddress2); - - /* Configure the source, destination address and the data size */ - DMA2D_SetConfig(hdma2d, SrcAddress1, DstAddress, Width, Height); - - /* Enable the transfer complete, transfer error and configuration error interrupts */ - __HAL_DMA2D_ENABLE_IT(hdma2d, DMA2D_IT_TC | DMA2D_IT_TE | DMA2D_IT_CE); - - /* Enable the Peripheral */ - __HAL_DMA2D_ENABLE(hdma2d); - - return HAL_OK; -} - -/** - * @brief Abort the DMA2D Transfer. - * @param hdma2d pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_Abort(DMA2D_HandleTypeDef *hdma2d) -{ - uint32_t tickstart; - - /* Abort the DMA2D transfer */ - /* START bit is reset to make sure not to set it again, in the event the HW clears it - between the register read and the register write by the CPU (writing 0 has no - effect on START bitvalue) */ - MODIFY_REG(hdma2d->Instance->CR, DMA2D_CR_ABORT | DMA2D_CR_START, DMA2D_CR_ABORT); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Check if the DMA2D is effectively disabled */ - while ((hdma2d->Instance->CR & DMA2D_CR_START) != 0U) - { - if ((HAL_GetTick() - tickstart) > DMA2D_TIMEOUT_ABORT) - { - /* Update error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT; - - /* Change the DMA2D state */ - hdma2d->State = HAL_DMA2D_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma2d); - - return HAL_TIMEOUT; - } - } - - /* Disable the Transfer Complete, Transfer Error and Configuration Error interrupts */ - __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_TC | DMA2D_IT_TE | DMA2D_IT_CE); - - /* Change the DMA2D state*/ - hdma2d->State = HAL_DMA2D_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma2d); - - return HAL_OK; -} - -/** - * @brief Suspend the DMA2D Transfer. - * @param hdma2d pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_Suspend(DMA2D_HandleTypeDef *hdma2d) -{ - uint32_t tickstart; - - /* Suspend the DMA2D transfer */ - /* START bit is reset to make sure not to set it again, in the event the HW clears it - between the register read and the register write by the CPU (writing 0 has no - effect on START bitvalue). */ - MODIFY_REG(hdma2d->Instance->CR, DMA2D_CR_SUSP | DMA2D_CR_START, DMA2D_CR_SUSP); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Check if the DMA2D is effectively suspended */ - while ((hdma2d->Instance->CR & (DMA2D_CR_SUSP | DMA2D_CR_START)) == DMA2D_CR_START) - { - if ((HAL_GetTick() - tickstart) > DMA2D_TIMEOUT_SUSPEND) - { - /* Update error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT; - - /* Change the DMA2D state */ - hdma2d->State = HAL_DMA2D_STATE_TIMEOUT; - - return HAL_TIMEOUT; - } - } - - /* Check whether or not a transfer is actually suspended and change the DMA2D state accordingly */ - if ((hdma2d->Instance->CR & DMA2D_CR_START) != 0U) - { - hdma2d->State = HAL_DMA2D_STATE_SUSPEND; - } - else - { - /* Make sure SUSP bit is cleared since it is meaningless - when no transfer is on-going */ - CLEAR_BIT(hdma2d->Instance->CR, DMA2D_CR_SUSP); - } - - return HAL_OK; -} - -/** - * @brief Resume the DMA2D Transfer. - * @param hdma2d pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_Resume(DMA2D_HandleTypeDef *hdma2d) -{ - /* Check the SUSP and START bits */ - if ((hdma2d->Instance->CR & (DMA2D_CR_SUSP | DMA2D_CR_START)) == (DMA2D_CR_SUSP | DMA2D_CR_START)) - { - /* Ongoing transfer is suspended: change the DMA2D state before resuming */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - } - - /* Resume the DMA2D transfer */ - /* START bit is reset to make sure not to set it again, in the event the HW clears it - between the register read and the register write by the CPU (writing 0 has no - effect on START bitvalue). */ - CLEAR_BIT(hdma2d->Instance->CR, (DMA2D_CR_SUSP | DMA2D_CR_START)); - - return HAL_OK; -} - - -/** - * @brief Enable the DMA2D CLUT Transfer. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param LayerIdx DMA2D Layer index. - * This parameter can be one of the following values: - * DMA2D_BACKGROUND_LAYER(0) / DMA2D_FOREGROUND_LAYER(1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_EnableCLUT(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_DMA2D_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hdma2d); - - /* Change DMA2D peripheral state */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - if (LayerIdx == DMA2D_BACKGROUND_LAYER) - { - /* Enable the background CLUT loading */ - SET_BIT(hdma2d->Instance->BGPFCCR, DMA2D_BGPFCCR_START); - } - else - { - /* Enable the foreground CLUT loading */ - SET_BIT(hdma2d->Instance->FGPFCCR, DMA2D_FGPFCCR_START); - } - - return HAL_OK; -} - -/** - * @brief Start DMA2D CLUT Loading. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param CLUTCfg Pointer to a DMA2D_CLUTCfgTypeDef structure that contains - * the configuration information for the color look up table. - * @param LayerIdx DMA2D Layer index. - * This parameter can be one of the following values: - * DMA2D_BACKGROUND_LAYER(0) / DMA2D_FOREGROUND_LAYER(1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_CLUTStartLoad(DMA2D_HandleTypeDef *hdma2d, const DMA2D_CLUTCfgTypeDef *CLUTCfg, - uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_DMA2D_LAYER(LayerIdx)); - assert_param(IS_DMA2D_CLUT_CM(CLUTCfg->CLUTColorMode)); - assert_param(IS_DMA2D_CLUT_SIZE(CLUTCfg->Size)); - - /* Process locked */ - __HAL_LOCK(hdma2d); - - /* Change DMA2D peripheral state */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - /* Configure the CLUT of the background DMA2D layer */ - if (LayerIdx == DMA2D_BACKGROUND_LAYER) - { - /* Write background CLUT memory address */ - WRITE_REG(hdma2d->Instance->BGCMAR, (uint32_t)CLUTCfg->pCLUT); - - /* Write background CLUT size and CLUT color mode */ - MODIFY_REG(hdma2d->Instance->BGPFCCR, (DMA2D_BGPFCCR_CS | DMA2D_BGPFCCR_CCM), - ((CLUTCfg->Size << DMA2D_BGPFCCR_CS_Pos) | (CLUTCfg->CLUTColorMode << DMA2D_BGPFCCR_CCM_Pos))); - - /* Enable the CLUT loading for the background */ - SET_BIT(hdma2d->Instance->BGPFCCR, DMA2D_BGPFCCR_START); - } - /* Configure the CLUT of the foreground DMA2D layer */ - else - { - /* Write foreground CLUT memory address */ - WRITE_REG(hdma2d->Instance->FGCMAR, (uint32_t)CLUTCfg->pCLUT); - - /* Write foreground CLUT size and CLUT color mode */ - MODIFY_REG(hdma2d->Instance->FGPFCCR, (DMA2D_FGPFCCR_CS | DMA2D_FGPFCCR_CCM), - ((CLUTCfg->Size << DMA2D_FGPFCCR_CS_Pos) | (CLUTCfg->CLUTColorMode << DMA2D_FGPFCCR_CCM_Pos))); - - /* Enable the CLUT loading for the foreground */ - SET_BIT(hdma2d->Instance->FGPFCCR, DMA2D_FGPFCCR_START); - } - - return HAL_OK; -} - -/** - * @brief Start DMA2D CLUT Loading with interrupt enabled. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param CLUTCfg Pointer to a DMA2D_CLUTCfgTypeDef structure that contains - * the configuration information for the color look up table. - * @param LayerIdx DMA2D Layer index. - * This parameter can be one of the following values: - * DMA2D_BACKGROUND_LAYER(0) / DMA2D_FOREGROUND_LAYER(1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_CLUTStartLoad_IT(DMA2D_HandleTypeDef *hdma2d, const DMA2D_CLUTCfgTypeDef *CLUTCfg, - uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_DMA2D_LAYER(LayerIdx)); - assert_param(IS_DMA2D_CLUT_CM(CLUTCfg->CLUTColorMode)); - assert_param(IS_DMA2D_CLUT_SIZE(CLUTCfg->Size)); - - /* Process locked */ - __HAL_LOCK(hdma2d); - - /* Change DMA2D peripheral state */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - /* Configure the CLUT of the background DMA2D layer */ - if (LayerIdx == DMA2D_BACKGROUND_LAYER) - { - /* Write background CLUT memory address */ - WRITE_REG(hdma2d->Instance->BGCMAR, (uint32_t)CLUTCfg->pCLUT); - - /* Write background CLUT size and CLUT color mode */ - MODIFY_REG(hdma2d->Instance->BGPFCCR, (DMA2D_BGPFCCR_CS | DMA2D_BGPFCCR_CCM), - ((CLUTCfg->Size << DMA2D_BGPFCCR_CS_Pos) | (CLUTCfg->CLUTColorMode << DMA2D_BGPFCCR_CCM_Pos))); - - /* Enable the CLUT Transfer Complete, transfer Error, configuration Error and CLUT Access Error interrupts */ - __HAL_DMA2D_ENABLE_IT(hdma2d, DMA2D_IT_CTC | DMA2D_IT_TE | DMA2D_IT_CE | DMA2D_IT_CAE); - - /* Enable the CLUT loading for the background */ - SET_BIT(hdma2d->Instance->BGPFCCR, DMA2D_BGPFCCR_START); - } - /* Configure the CLUT of the foreground DMA2D layer */ - else - { - /* Write foreground CLUT memory address */ - WRITE_REG(hdma2d->Instance->FGCMAR, (uint32_t)CLUTCfg->pCLUT); - - /* Write foreground CLUT size and CLUT color mode */ - MODIFY_REG(hdma2d->Instance->FGPFCCR, (DMA2D_FGPFCCR_CS | DMA2D_FGPFCCR_CCM), - ((CLUTCfg->Size << DMA2D_FGPFCCR_CS_Pos) | (CLUTCfg->CLUTColorMode << DMA2D_FGPFCCR_CCM_Pos))); - - /* Enable the CLUT Transfer Complete, transfer Error, configuration Error and CLUT Access Error interrupts */ - __HAL_DMA2D_ENABLE_IT(hdma2d, DMA2D_IT_CTC | DMA2D_IT_TE | DMA2D_IT_CE | DMA2D_IT_CAE); - - /* Enable the CLUT loading for the foreground */ - SET_BIT(hdma2d->Instance->FGPFCCR, DMA2D_FGPFCCR_START); - } - - return HAL_OK; -} - -/** - * @brief Start DMA2D CLUT Loading. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param CLUTCfg Pointer to a DMA2D_CLUTCfgTypeDef structure that contains - * the configuration information for the color look up table. - * @param LayerIdx DMA2D Layer index. - * This parameter can be one of the following values: - * DMA2D_BACKGROUND_LAYER(0) / DMA2D_FOREGROUND_LAYER(1) - * @note API obsolete and maintained for compatibility with legacy. User is - * invited to resort to HAL_DMA2D_CLUTStartLoad() instead to benefit from - * code compactness, code size and improved heap usage. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_CLUTLoad(DMA2D_HandleTypeDef *hdma2d, DMA2D_CLUTCfgTypeDef CLUTCfg, uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_DMA2D_LAYER(LayerIdx)); - assert_param(IS_DMA2D_CLUT_CM(CLUTCfg.CLUTColorMode)); - assert_param(IS_DMA2D_CLUT_SIZE(CLUTCfg.Size)); - - /* Process locked */ - __HAL_LOCK(hdma2d); - - /* Change DMA2D peripheral state */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - /* Configure the CLUT of the background DMA2D layer */ - if (LayerIdx == DMA2D_BACKGROUND_LAYER) - { - /* Write background CLUT memory address */ - WRITE_REG(hdma2d->Instance->BGCMAR, (uint32_t)CLUTCfg.pCLUT); - - /* Write background CLUT size and CLUT color mode */ - MODIFY_REG(hdma2d->Instance->BGPFCCR, (DMA2D_BGPFCCR_CS | DMA2D_BGPFCCR_CCM), - ((CLUTCfg.Size << DMA2D_BGPFCCR_CS_Pos) | (CLUTCfg.CLUTColorMode << DMA2D_BGPFCCR_CCM_Pos))); - - /* Enable the CLUT loading for the background */ - SET_BIT(hdma2d->Instance->BGPFCCR, DMA2D_BGPFCCR_START); - } - /* Configure the CLUT of the foreground DMA2D layer */ - else - { - /* Write foreground CLUT memory address */ - WRITE_REG(hdma2d->Instance->FGCMAR, (uint32_t)CLUTCfg.pCLUT); - - /* Write foreground CLUT size and CLUT color mode */ - MODIFY_REG(hdma2d->Instance->FGPFCCR, (DMA2D_FGPFCCR_CS | DMA2D_FGPFCCR_CCM), - ((CLUTCfg.Size << DMA2D_FGPFCCR_CS_Pos) | (CLUTCfg.CLUTColorMode << DMA2D_FGPFCCR_CCM_Pos))); - - /* Enable the CLUT loading for the foreground */ - SET_BIT(hdma2d->Instance->FGPFCCR, DMA2D_FGPFCCR_START); - } - - return HAL_OK; -} - -/** - * @brief Start DMA2D CLUT Loading with interrupt enabled. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param CLUTCfg Pointer to a DMA2D_CLUTCfgTypeDef structure that contains - * the configuration information for the color look up table. - * @param LayerIdx DMA2D Layer index. - * This parameter can be one of the following values: - * DMA2D_BACKGROUND_LAYER(0) / DMA2D_FOREGROUND_LAYER(1) - * @note API obsolete and maintained for compatibility with legacy. User is - * invited to resort to HAL_DMA2D_CLUTStartLoad_IT() instead to benefit - * from code compactness, code size and improved heap usage. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_CLUTLoad_IT(DMA2D_HandleTypeDef *hdma2d, DMA2D_CLUTCfgTypeDef CLUTCfg, uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_DMA2D_LAYER(LayerIdx)); - assert_param(IS_DMA2D_CLUT_CM(CLUTCfg.CLUTColorMode)); - assert_param(IS_DMA2D_CLUT_SIZE(CLUTCfg.Size)); - - /* Process locked */ - __HAL_LOCK(hdma2d); - - /* Change DMA2D peripheral state */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - /* Configure the CLUT of the background DMA2D layer */ - if (LayerIdx == DMA2D_BACKGROUND_LAYER) - { - /* Write background CLUT memory address */ - WRITE_REG(hdma2d->Instance->BGCMAR, (uint32_t)CLUTCfg.pCLUT); - - /* Write background CLUT size and CLUT color mode */ - MODIFY_REG(hdma2d->Instance->BGPFCCR, (DMA2D_BGPFCCR_CS | DMA2D_BGPFCCR_CCM), - ((CLUTCfg.Size << DMA2D_BGPFCCR_CS_Pos) | (CLUTCfg.CLUTColorMode << DMA2D_BGPFCCR_CCM_Pos))); - - /* Enable the CLUT Transfer Complete, transfer Error, configuration Error and CLUT Access Error interrupts */ - __HAL_DMA2D_ENABLE_IT(hdma2d, DMA2D_IT_CTC | DMA2D_IT_TE | DMA2D_IT_CE | DMA2D_IT_CAE); - - /* Enable the CLUT loading for the background */ - SET_BIT(hdma2d->Instance->BGPFCCR, DMA2D_BGPFCCR_START); - } - /* Configure the CLUT of the foreground DMA2D layer */ - else - { - /* Write foreground CLUT memory address */ - WRITE_REG(hdma2d->Instance->FGCMAR, (uint32_t)CLUTCfg.pCLUT); - - /* Write foreground CLUT size and CLUT color mode */ - MODIFY_REG(hdma2d->Instance->FGPFCCR, (DMA2D_FGPFCCR_CS | DMA2D_FGPFCCR_CCM), - ((CLUTCfg.Size << DMA2D_FGPFCCR_CS_Pos) | (CLUTCfg.CLUTColorMode << DMA2D_FGPFCCR_CCM_Pos))); - - /* Enable the CLUT Transfer Complete, transfer Error, configuration Error and CLUT Access Error interrupts */ - __HAL_DMA2D_ENABLE_IT(hdma2d, DMA2D_IT_CTC | DMA2D_IT_TE | DMA2D_IT_CE | DMA2D_IT_CAE); - - /* Enable the CLUT loading for the foreground */ - SET_BIT(hdma2d->Instance->FGPFCCR, DMA2D_FGPFCCR_START); - } - - return HAL_OK; -} - -/** - * @brief Abort the DMA2D CLUT loading. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param LayerIdx DMA2D Layer index. - * This parameter can be one of the following values: - * DMA2D_BACKGROUND_LAYER(0) / DMA2D_FOREGROUND_LAYER(1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_CLUTLoading_Abort(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx) -{ - uint32_t tickstart; - const __IO uint32_t *reg = &(hdma2d->Instance->BGPFCCR); /* by default, point at background register */ - - /* Abort the CLUT loading */ - SET_BIT(hdma2d->Instance->CR, DMA2D_CR_ABORT); - - /* If foreground CLUT loading is considered, update local variables */ - if (LayerIdx == DMA2D_FOREGROUND_LAYER) - { - reg = &(hdma2d->Instance->FGPFCCR); - } - - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Check if the CLUT loading is aborted */ - while ((*reg & DMA2D_BGPFCCR_START) != 0U) - { - if ((HAL_GetTick() - tickstart) > DMA2D_TIMEOUT_ABORT) - { - /* Update error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT; - - /* Change the DMA2D state */ - hdma2d->State = HAL_DMA2D_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma2d); - - return HAL_TIMEOUT; - } - } - - /* Disable the CLUT Transfer Complete, Transfer Error, Configuration Error and CLUT Access Error interrupts */ - __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_CTC | DMA2D_IT_TE | DMA2D_IT_CE | DMA2D_IT_CAE); - - /* Change the DMA2D state*/ - hdma2d->State = HAL_DMA2D_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma2d); - - return HAL_OK; -} - -/** - * @brief Suspend the DMA2D CLUT loading. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param LayerIdx DMA2D Layer index. - * This parameter can be one of the following values: - * DMA2D_BACKGROUND_LAYER(0) / DMA2D_FOREGROUND_LAYER(1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_CLUTLoading_Suspend(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx) -{ - uint32_t tickstart; - uint32_t loadsuspended; - const __IO uint32_t *reg = &(hdma2d->Instance->BGPFCCR); /* by default, point at background register */ - - /* Suspend the CLUT loading */ - SET_BIT(hdma2d->Instance->CR, DMA2D_CR_SUSP); - - /* If foreground CLUT loading is considered, update local variables */ - if (LayerIdx == DMA2D_FOREGROUND_LAYER) - { - reg = &(hdma2d->Instance->FGPFCCR); - } - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Check if the CLUT loading is suspended */ - /* 1st condition: Suspend Check */ - loadsuspended = ((hdma2d->Instance->CR & DMA2D_CR_SUSP) == DMA2D_CR_SUSP) ? 1UL : 0UL; - /* 2nd condition: Not Start Check */ - loadsuspended |= ((*reg & DMA2D_BGPFCCR_START) != DMA2D_BGPFCCR_START) ? 1UL : 0UL; - while (loadsuspended == 0UL) - { - if ((HAL_GetTick() - tickstart) > DMA2D_TIMEOUT_SUSPEND) - { - /* Update error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT; - - /* Change the DMA2D state */ - hdma2d->State = HAL_DMA2D_STATE_TIMEOUT; - - return HAL_TIMEOUT; - } - /* 1st condition: Suspend Check */ - loadsuspended = ((hdma2d->Instance->CR & DMA2D_CR_SUSP) == DMA2D_CR_SUSP) ? 1UL : 0UL; - /* 2nd condition: Not Start Check */ - loadsuspended |= ((*reg & DMA2D_BGPFCCR_START) != DMA2D_BGPFCCR_START) ? 1UL : 0UL; - } - - /* Check whether or not a transfer is actually suspended and change the DMA2D state accordingly */ - if ((*reg & DMA2D_BGPFCCR_START) != 0U) - { - hdma2d->State = HAL_DMA2D_STATE_SUSPEND; - } - else - { - /* Make sure SUSP bit is cleared since it is meaningless - when no transfer is on-going */ - CLEAR_BIT(hdma2d->Instance->CR, DMA2D_CR_SUSP); - } - - return HAL_OK; -} - -/** - * @brief Resume the DMA2D CLUT loading. - * @param hdma2d pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param LayerIdx DMA2D Layer index. - * This parameter can be one of the following values: - * DMA2D_BACKGROUND_LAYER(0) / DMA2D_FOREGROUND_LAYER(1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_CLUTLoading_Resume(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx) -{ - /* Check the SUSP and START bits for background or foreground CLUT loading */ - if (LayerIdx == DMA2D_BACKGROUND_LAYER) - { - /* Background CLUT loading suspension check */ - if ((hdma2d->Instance->CR & DMA2D_CR_SUSP) == DMA2D_CR_SUSP) - { - if ((hdma2d->Instance->BGPFCCR & DMA2D_BGPFCCR_START) == DMA2D_BGPFCCR_START) - { - /* Ongoing CLUT loading is suspended: change the DMA2D state before resuming */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - } - } - } - else - { - /* Foreground CLUT loading suspension check */ - if ((hdma2d->Instance->CR & DMA2D_CR_SUSP) == DMA2D_CR_SUSP) - { - if ((hdma2d->Instance->FGPFCCR & DMA2D_FGPFCCR_START) == DMA2D_FGPFCCR_START) - { - /* Ongoing CLUT loading is suspended: change the DMA2D state before resuming */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - } - } - } - - /* Resume the CLUT loading */ - CLEAR_BIT(hdma2d->Instance->CR, DMA2D_CR_SUSP); - - return HAL_OK; -} - - -/** - - * @brief Polling for transfer complete or CLUT loading. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_PollForTransfer(DMA2D_HandleTypeDef *hdma2d, uint32_t Timeout) -{ - uint32_t tickstart; - uint32_t layer_start; - __IO uint32_t isrflags = 0x0U; - - /* Polling for DMA2D transfer */ - if ((hdma2d->Instance->CR & DMA2D_CR_START) != 0U) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - while (__HAL_DMA2D_GET_FLAG(hdma2d, DMA2D_FLAG_TC) == 0U) - { - isrflags = READ_REG(hdma2d->Instance->ISR); - if ((isrflags & (DMA2D_FLAG_CE | DMA2D_FLAG_TE)) != 0U) - { - if ((isrflags & DMA2D_FLAG_CE) != 0U) - { - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_CE; - } - if ((isrflags & DMA2D_FLAG_TE) != 0U) - { - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TE; - } - /* Clear the transfer and configuration error flags */ - __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_CE | DMA2D_FLAG_TE); - - /* Change DMA2D state */ - hdma2d->State = HAL_DMA2D_STATE_ERROR; - - /* Process unlocked */ - __HAL_UNLOCK(hdma2d); - - return HAL_ERROR; - } - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) - { - /* Update error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT; - - /* Change the DMA2D state */ - hdma2d->State = HAL_DMA2D_STATE_TIMEOUT; - - /* Process unlocked */ - __HAL_UNLOCK(hdma2d); - - return HAL_TIMEOUT; - } - } - } - } - /* Polling for CLUT loading (foreground or background) */ - layer_start = hdma2d->Instance->FGPFCCR & DMA2D_FGPFCCR_START; - layer_start |= hdma2d->Instance->BGPFCCR & DMA2D_BGPFCCR_START; - if (layer_start != 0U) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - while (__HAL_DMA2D_GET_FLAG(hdma2d, DMA2D_FLAG_CTC) == 0U) - { - isrflags = READ_REG(hdma2d->Instance->ISR); - if ((isrflags & (DMA2D_FLAG_CAE | DMA2D_FLAG_CE | DMA2D_FLAG_TE)) != 0U) - { - if ((isrflags & DMA2D_FLAG_CAE) != 0U) - { - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_CAE; - } - if ((isrflags & DMA2D_FLAG_CE) != 0U) - { - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_CE; - } - if ((isrflags & DMA2D_FLAG_TE) != 0U) - { - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TE; - } - /* Clear the CLUT Access Error, Configuration Error and Transfer Error flags */ - __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_CAE | DMA2D_FLAG_CE | DMA2D_FLAG_TE); - - /* Change DMA2D state */ - hdma2d->State = HAL_DMA2D_STATE_ERROR; - - /* Process unlocked */ - __HAL_UNLOCK(hdma2d); - - return HAL_ERROR; - } - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) - { - /* Update error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT; - - /* Change the DMA2D state */ - hdma2d->State = HAL_DMA2D_STATE_TIMEOUT; - - /* Process unlocked */ - __HAL_UNLOCK(hdma2d); - - return HAL_TIMEOUT; - } - } - } - } - - /* Clear the transfer complete and CLUT loading flags */ - __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_TC | DMA2D_FLAG_CTC); - - /* Change DMA2D state */ - hdma2d->State = HAL_DMA2D_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hdma2d); - - return HAL_OK; -} -/** - * @brief Handle DMA2D interrupt request. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @retval HAL status - */ -void HAL_DMA2D_IRQHandler(DMA2D_HandleTypeDef *hdma2d) -{ - uint32_t isrflags = READ_REG(hdma2d->Instance->ISR); - uint32_t crflags = READ_REG(hdma2d->Instance->CR); - - /* Transfer Error Interrupt management ***************************************/ - if ((isrflags & DMA2D_FLAG_TE) != 0U) - { - if ((crflags & DMA2D_IT_TE) != 0U) - { - /* Disable the transfer Error interrupt */ - __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_TE); - - /* Update error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TE; - - /* Clear the transfer error flag */ - __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_TE); - - /* Change DMA2D state */ - hdma2d->State = HAL_DMA2D_STATE_ERROR; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma2d); - - if (hdma2d->XferErrorCallback != NULL) - { - /* Transfer error Callback */ - hdma2d->XferErrorCallback(hdma2d); - } - } - } - /* Configuration Error Interrupt management **********************************/ - if ((isrflags & DMA2D_FLAG_CE) != 0U) - { - if ((crflags & DMA2D_IT_CE) != 0U) - { - /* Disable the Configuration Error interrupt */ - __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_CE); - - /* Clear the Configuration error flag */ - __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_CE); - - /* Update error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_CE; - - /* Change DMA2D state */ - hdma2d->State = HAL_DMA2D_STATE_ERROR; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma2d); - - if (hdma2d->XferErrorCallback != NULL) - { - /* Transfer error Callback */ - hdma2d->XferErrorCallback(hdma2d); - } - } - } - /* CLUT access Error Interrupt management ***********************************/ - if ((isrflags & DMA2D_FLAG_CAE) != 0U) - { - if ((crflags & DMA2D_IT_CAE) != 0U) - { - /* Disable the CLUT access error interrupt */ - __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_CAE); - - /* Clear the CLUT access error flag */ - __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_CAE); - - /* Update error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_CAE; - - /* Change DMA2D state */ - hdma2d->State = HAL_DMA2D_STATE_ERROR; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma2d); - - if (hdma2d->XferErrorCallback != NULL) - { - /* Transfer error Callback */ - hdma2d->XferErrorCallback(hdma2d); - } - } - } - /* Transfer watermark Interrupt management **********************************/ - if ((isrflags & DMA2D_FLAG_TW) != 0U) - { - if ((crflags & DMA2D_IT_TW) != 0U) - { - /* Disable the transfer watermark interrupt */ - __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_TW); - - /* Clear the transfer watermark flag */ - __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_TW); - - /* Transfer watermark Callback */ -#if (USE_HAL_DMA2D_REGISTER_CALLBACKS == 1) - hdma2d->LineEventCallback(hdma2d); -#else - HAL_DMA2D_LineEventCallback(hdma2d); -#endif /* USE_HAL_DMA2D_REGISTER_CALLBACKS */ - - } - } - /* Transfer Complete Interrupt management ************************************/ - if ((isrflags & DMA2D_FLAG_TC) != 0U) - { - if ((crflags & DMA2D_IT_TC) != 0U) - { - /* Disable the transfer complete interrupt */ - __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_TC); - - /* Clear the transfer complete flag */ - __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_TC); - - /* Update error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_NONE; - - /* Change DMA2D state */ - hdma2d->State = HAL_DMA2D_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma2d); - - if (hdma2d->XferCpltCallback != NULL) - { - /* Transfer complete Callback */ - hdma2d->XferCpltCallback(hdma2d); - } - } - } - /* CLUT Transfer Complete Interrupt management ******************************/ - if ((isrflags & DMA2D_FLAG_CTC) != 0U) - { - if ((crflags & DMA2D_IT_CTC) != 0U) - { - /* Disable the CLUT transfer complete interrupt */ - __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_CTC); - - /* Clear the CLUT transfer complete flag */ - __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_CTC); - - /* Update error code */ - hdma2d->ErrorCode |= HAL_DMA2D_ERROR_NONE; - - /* Change DMA2D state */ - hdma2d->State = HAL_DMA2D_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma2d); - - /* CLUT Transfer complete Callback */ -#if (USE_HAL_DMA2D_REGISTER_CALLBACKS == 1) - hdma2d->CLUTLoadingCpltCallback(hdma2d); -#else - HAL_DMA2D_CLUTLoadingCpltCallback(hdma2d); -#endif /* USE_HAL_DMA2D_REGISTER_CALLBACKS */ - } - } - -} - -/** - * @brief Transfer watermark callback. - * @param hdma2d pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @retval None - */ -__weak void HAL_DMA2D_LineEventCallback(DMA2D_HandleTypeDef *hdma2d) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hdma2d); - - /* NOTE : This function should not be modified; when the callback is needed, - the HAL_DMA2D_LineEventCallback can be implemented in the user file. - */ -} - -/** - * @brief CLUT Transfer Complete callback. - * @param hdma2d pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @retval None - */ -__weak void HAL_DMA2D_CLUTLoadingCpltCallback(DMA2D_HandleTypeDef *hdma2d) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hdma2d); - - /* NOTE : This function should not be modified; when the callback is needed, - the HAL_DMA2D_CLUTLoadingCpltCallback can be implemented in the user file. - */ -} - -/** - * @} - */ - -/** @defgroup DMA2D_Exported_Functions_Group3 Peripheral Control functions - * @brief Peripheral Control functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure the DMA2D foreground or background layer parameters. - (+) Configure the DMA2D CLUT transfer. - (+) Configure the line watermark - (+) Configure the dead time value. - (+) Enable or disable the dead time value functionality. - - -@endverbatim - * @{ - */ - -/** - * @brief Configure the DMA2D Layer according to the specified - * parameters in the DMA2D_HandleTypeDef. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param LayerIdx DMA2D Layer index. - * This parameter can be one of the following values: - * DMA2D_BACKGROUND_LAYER(0) / DMA2D_FOREGROUND_LAYER(1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_ConfigLayer(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx) -{ - const DMA2D_LayerCfgTypeDef *pLayerCfg; - uint32_t regMask; - uint32_t regValue; - - /* Check the parameters */ - assert_param(IS_DMA2D_LAYER(LayerIdx)); - assert_param(IS_DMA2D_OFFSET(hdma2d->LayerCfg[LayerIdx].InputOffset)); - if (hdma2d->Init.Mode != DMA2D_R2M) - { - assert_param(IS_DMA2D_INPUT_COLOR_MODE(hdma2d->LayerCfg[LayerIdx].InputColorMode)); - if (hdma2d->Init.Mode != DMA2D_M2M) - { - assert_param(IS_DMA2D_ALPHA_MODE(hdma2d->LayerCfg[LayerIdx].AlphaMode)); - } - } - - /* Process locked */ - __HAL_LOCK(hdma2d); - - /* Change DMA2D peripheral state */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - pLayerCfg = &hdma2d->LayerCfg[LayerIdx]; - - /* Prepare the value to be written to the BGPFCCR or FGPFCCR register */ - regValue = pLayerCfg->InputColorMode | (pLayerCfg->AlphaMode << DMA2D_BGPFCCR_AM_Pos); - regMask = DMA2D_BGPFCCR_CM | DMA2D_BGPFCCR_AM | DMA2D_BGPFCCR_ALPHA; - - - if ((pLayerCfg->InputColorMode == DMA2D_INPUT_A4) || (pLayerCfg->InputColorMode == DMA2D_INPUT_A8)) - { - regValue |= (pLayerCfg->InputAlpha & DMA2D_BGPFCCR_ALPHA); - } - else - { - regValue |= (pLayerCfg->InputAlpha << DMA2D_BGPFCCR_ALPHA_Pos); - } - - /* Configure the background DMA2D layer */ - if (LayerIdx == DMA2D_BACKGROUND_LAYER) - { - /* Write DMA2D BGPFCCR register */ - MODIFY_REG(hdma2d->Instance->BGPFCCR, regMask, regValue); - - /* DMA2D BGOR register configuration -------------------------------------*/ - WRITE_REG(hdma2d->Instance->BGOR, pLayerCfg->InputOffset); - - /* DMA2D BGCOLR register configuration -------------------------------------*/ - if ((pLayerCfg->InputColorMode == DMA2D_INPUT_A4) || (pLayerCfg->InputColorMode == DMA2D_INPUT_A8)) - { - WRITE_REG(hdma2d->Instance->BGCOLR, pLayerCfg->InputAlpha & (DMA2D_BGCOLR_BLUE | DMA2D_BGCOLR_GREEN | \ - DMA2D_BGCOLR_RED)); - } - } - /* Configure the foreground DMA2D layer */ - else - { - - - /* Write DMA2D FGPFCCR register */ - MODIFY_REG(hdma2d->Instance->FGPFCCR, regMask, regValue); - - /* DMA2D FGOR register configuration -------------------------------------*/ - WRITE_REG(hdma2d->Instance->FGOR, pLayerCfg->InputOffset); - - /* DMA2D FGCOLR register configuration -------------------------------------*/ - if ((pLayerCfg->InputColorMode == DMA2D_INPUT_A4) || (pLayerCfg->InputColorMode == DMA2D_INPUT_A8)) - { - WRITE_REG(hdma2d->Instance->FGCOLR, pLayerCfg->InputAlpha & (DMA2D_FGCOLR_BLUE | DMA2D_FGCOLR_GREEN | \ - DMA2D_FGCOLR_RED)); - } - } - /* Initialize the DMA2D state*/ - hdma2d->State = HAL_DMA2D_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hdma2d); - - return HAL_OK; -} - -/** - * @brief Configure the DMA2D CLUT Transfer. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param CLUTCfg Pointer to a DMA2D_CLUTCfgTypeDef structure that contains - * the configuration information for the color look up table. - * @param LayerIdx DMA2D Layer index. - * This parameter can be one of the following values: - * DMA2D_BACKGROUND_LAYER(0) / DMA2D_FOREGROUND_LAYER(1) - * @note API obsolete and maintained for compatibility with legacy. User is invited - * to resort to HAL_DMA2D_CLUTStartLoad() instead to benefit from code compactness, - * code size and improved heap usage. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_ConfigCLUT(DMA2D_HandleTypeDef *hdma2d, DMA2D_CLUTCfgTypeDef CLUTCfg, uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_DMA2D_LAYER(LayerIdx)); - assert_param(IS_DMA2D_CLUT_CM(CLUTCfg.CLUTColorMode)); - assert_param(IS_DMA2D_CLUT_SIZE(CLUTCfg.Size)); - - /* Process locked */ - __HAL_LOCK(hdma2d); - - /* Change DMA2D peripheral state */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - /* Configure the CLUT of the background DMA2D layer */ - if (LayerIdx == DMA2D_BACKGROUND_LAYER) - { - /* Write background CLUT memory address */ - WRITE_REG(hdma2d->Instance->BGCMAR, (uint32_t)CLUTCfg.pCLUT); - - /* Write background CLUT size and CLUT color mode */ - MODIFY_REG(hdma2d->Instance->BGPFCCR, (DMA2D_BGPFCCR_CS | DMA2D_BGPFCCR_CCM), - ((CLUTCfg.Size << DMA2D_BGPFCCR_CS_Pos) | (CLUTCfg.CLUTColorMode << DMA2D_BGPFCCR_CCM_Pos))); - } - /* Configure the CLUT of the foreground DMA2D layer */ - else - { - /* Write foreground CLUT memory address */ - WRITE_REG(hdma2d->Instance->FGCMAR, (uint32_t)CLUTCfg.pCLUT); - - /* Write foreground CLUT size and CLUT color mode */ - MODIFY_REG(hdma2d->Instance->FGPFCCR, (DMA2D_FGPFCCR_CS | DMA2D_FGPFCCR_CCM), - ((CLUTCfg.Size << DMA2D_FGPFCCR_CS_Pos) | (CLUTCfg.CLUTColorMode << DMA2D_FGPFCCR_CCM_Pos))); - } - - /* Set the DMA2D state to Ready*/ - hdma2d->State = HAL_DMA2D_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hdma2d); - - return HAL_OK; -} - - -/** - * @brief Configure the line watermark. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @param Line Line Watermark configuration (maximum 16-bit long value expected). - * @note HAL_DMA2D_ProgramLineEvent() API enables the transfer watermark interrupt. - * @note The transfer watermark interrupt is disabled once it has occurred. - * @retval HAL status - */ - -HAL_StatusTypeDef HAL_DMA2D_ProgramLineEvent(DMA2D_HandleTypeDef *hdma2d, uint32_t Line) -{ - /* Check the parameters */ - if (Line > DMA2D_LWR_LW) - { - return HAL_ERROR; - } - else - { - /* Process locked */ - __HAL_LOCK(hdma2d); - - /* Change DMA2D peripheral state */ - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - /* Sets the Line watermark configuration */ - WRITE_REG(hdma2d->Instance->LWR, Line); - - /* Enable the Line interrupt */ - __HAL_DMA2D_ENABLE_IT(hdma2d, DMA2D_IT_TW); - - /* Initialize the DMA2D state*/ - hdma2d->State = HAL_DMA2D_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hdma2d); - - return HAL_OK; - } -} - -/** - * @brief Enable DMA2D dead time feature. - * @param hdma2d DMA2D handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_EnableDeadTime(DMA2D_HandleTypeDef *hdma2d) -{ - /* Process Locked */ - __HAL_LOCK(hdma2d); - - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - /* Set DMA2D_AMTCR EN bit */ - SET_BIT(hdma2d->Instance->AMTCR, DMA2D_AMTCR_EN); - - hdma2d->State = HAL_DMA2D_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma2d); - - return HAL_OK; -} - -/** - * @brief Disable DMA2D dead time feature. - * @param hdma2d DMA2D handle. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_DisableDeadTime(DMA2D_HandleTypeDef *hdma2d) -{ - /* Process Locked */ - __HAL_LOCK(hdma2d); - - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - /* Clear DMA2D_AMTCR EN bit */ - CLEAR_BIT(hdma2d->Instance->AMTCR, DMA2D_AMTCR_EN); - - hdma2d->State = HAL_DMA2D_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma2d); - - return HAL_OK; -} - -/** - * @brief Configure dead time. - * @note The dead time value represents the guaranteed minimum number of cycles between - * two consecutive transactions on the AHB bus. - * @param hdma2d DMA2D handle. - * @param DeadTime dead time value. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA2D_ConfigDeadTime(DMA2D_HandleTypeDef *hdma2d, uint8_t DeadTime) -{ - /* Process Locked */ - __HAL_LOCK(hdma2d); - - hdma2d->State = HAL_DMA2D_STATE_BUSY; - - /* Set DMA2D_AMTCR DT field */ - MODIFY_REG(hdma2d->Instance->AMTCR, DMA2D_AMTCR_DT, (((uint32_t) DeadTime) << DMA2D_AMTCR_DT_Pos)); - - hdma2d->State = HAL_DMA2D_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma2d); - - return HAL_OK; -} - -/** - * @} - */ - - -/** @defgroup DMA2D_Exported_Functions_Group4 Peripheral State and Error functions - * @brief Peripheral State functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides functions allowing to: - (+) Get the DMA2D state - (+) Get the DMA2D error code - -@endverbatim - * @{ - */ - -/** - * @brief Return the DMA2D state - * @param hdma2d pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the DMA2D. - * @retval HAL state - */ -HAL_DMA2D_StateTypeDef HAL_DMA2D_GetState(const DMA2D_HandleTypeDef *hdma2d) -{ - return hdma2d->State; -} - -/** - * @brief Return the DMA2D error code - * @param hdma2d pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for DMA2D. - * @retval DMA2D Error Code - */ -uint32_t HAL_DMA2D_GetError(const DMA2D_HandleTypeDef *hdma2d) -{ - return hdma2d->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - - -/** @defgroup DMA2D_Private_Functions DMA2D Private Functions - * @{ - */ - -/** - * @brief Set the DMA2D transfer parameters. - * @param hdma2d Pointer to a DMA2D_HandleTypeDef structure that contains - * the configuration information for the specified DMA2D. - * @param pdata The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param Width The width of data to be transferred from source to destination. - * @param Height The height of data to be transferred from source to destination. - * @retval HAL status - */ -static void DMA2D_SetConfig(DMA2D_HandleTypeDef *hdma2d, uint32_t pdata, uint32_t DstAddress, uint32_t Width, - uint32_t Height) -{ - uint32_t tmp; - uint32_t tmp1; - uint32_t tmp2; - uint32_t tmp3; - uint32_t tmp4; - - /* Configure DMA2D data size */ - MODIFY_REG(hdma2d->Instance->NLR, (DMA2D_NLR_NL | DMA2D_NLR_PL), (Height | (Width << DMA2D_NLR_PL_Pos))); - - /* Configure DMA2D destination address */ - WRITE_REG(hdma2d->Instance->OMAR, DstAddress); - - /* Register to memory DMA2D mode selected */ - if (hdma2d->Init.Mode == DMA2D_R2M) - { - tmp1 = pdata & DMA2D_OCOLR_ALPHA_1; - tmp2 = pdata & DMA2D_OCOLR_RED_1; - tmp3 = pdata & DMA2D_OCOLR_GREEN_1; - tmp4 = pdata & DMA2D_OCOLR_BLUE_1; - - /* Prepare the value to be written to the OCOLR register according to the color mode */ - if (hdma2d->Init.ColorMode == DMA2D_OUTPUT_ARGB8888) - { - tmp = (tmp3 | tmp2 | tmp1 | tmp4); - } - else if (hdma2d->Init.ColorMode == DMA2D_OUTPUT_RGB888) - { - tmp = (tmp3 | tmp2 | tmp4); - } - else if (hdma2d->Init.ColorMode == DMA2D_OUTPUT_RGB565) - { - tmp2 = (tmp2 >> 19U); - tmp3 = (tmp3 >> 10U); - tmp4 = (tmp4 >> 3U); - tmp = ((tmp3 << 5U) | (tmp2 << 11U) | tmp4); - } - else if (hdma2d->Init.ColorMode == DMA2D_OUTPUT_ARGB1555) - { - tmp1 = (tmp1 >> 31U); - tmp2 = (tmp2 >> 19U); - tmp3 = (tmp3 >> 11U); - tmp4 = (tmp4 >> 3U); - tmp = ((tmp3 << 5U) | (tmp2 << 10U) | (tmp1 << 15U) | tmp4); - } - else /* Dhdma2d->Init.ColorMode = DMA2D_OUTPUT_ARGB4444 */ - { - tmp1 = (tmp1 >> 28U); - tmp2 = (tmp2 >> 20U); - tmp3 = (tmp3 >> 12U); - tmp4 = (tmp4 >> 4U); - tmp = ((tmp3 << 4U) | (tmp2 << 8U) | (tmp1 << 12U) | tmp4); - } - /* Write to DMA2D OCOLR register */ - WRITE_REG(hdma2d->Instance->OCOLR, tmp); - } - else /* M2M, M2M_PFC or M2M_Blending DMA2D Mode */ - { - /* Configure DMA2D source address */ - WRITE_REG(hdma2d->Instance->FGMAR, pdata); - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#endif /* DMA2D */ -#endif /* HAL_DMA2D_MODULE_ENABLED */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c deleted file mode 100644 index 7167e77..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c +++ /dev/null @@ -1,313 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma_ex.c - * @author MCD Application Team - * @brief DMA Extension HAL module driver - * This file provides firmware functions to manage the following - * functionalities of the DMA Extension peripheral: - * + Extended features functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The DMA Extension HAL driver can be used as follows: - (#) Start a multi buffer transfer using the HAL_DMA_MultiBufferStart() function - for polling mode or HAL_DMA_MultiBufferStart_IT() for interrupt mode. - - -@- In Memory-to-Memory transfer mode, Multi (Double) Buffer mode is not allowed. - -@- When Multi (Double) Buffer mode is enabled the, transfer is circular by default. - -@- In Multi (Double) buffer mode, it is possible to update the base address for - the AHB memory port on the fly (DMA_SxM0AR or DMA_SxM1AR) when the stream is enabled. - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup DMAEx DMAEx - * @brief DMA Extended HAL module driver - * @{ - */ - -#ifdef HAL_DMA_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private Constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup DMAEx_Private_Functions - * @{ - */ -static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -/** - * @} - */ - -/* Exported functions ---------------------------------------------------------*/ - -/** @addtogroup DMAEx_Exported_Functions - * @{ - */ - - -/** @addtogroup DMAEx_Exported_Functions_Group1 - * -@verbatim - =============================================================================== - ##### Extended features functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure the source, destination address and data length and - Start MultiBuffer DMA transfer - (+) Configure the source, destination address and data length and - Start MultiBuffer DMA transfer with interrupt - (+) Change on the fly the memory0 or memory1 address. - -@endverbatim - * @{ - */ - - -/** - * @brief Starts the multi_buffer DMA Transfer. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Memory-to-memory transfer not supported in double buffering mode */ - if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; - status = HAL_ERROR; - } - else - { - /* Process Locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Enable the double buffer mode */ - hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; - - /* Configure DMA Stream destination address */ - hdma->Instance->M1AR = SecondMemAddress; - - /* Configure the source, destination address and the data length */ - DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Enable the peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Return error status */ - status = HAL_BUSY; - } - } - return status; -} - -/** - * @brief Starts the multi_buffer DMA Transfer with interrupt enabled. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Memory-to-memory transfer not supported in double buffering mode */ - if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; - return HAL_ERROR; - } - - /* Check callback functions */ - if ((NULL == hdma->XferCpltCallback) || (NULL == hdma->XferM1CpltCallback) || (NULL == hdma->XferErrorCallback)) - { - hdma->ErrorCode = HAL_DMA_ERROR_PARAM; - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Enable the Double buffer mode */ - hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; - - /* Configure DMA Stream destination address */ - hdma->Instance->M1AR = SecondMemAddress; - - /* Configure the source, destination address and the data length */ - DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Clear all flags */ - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TE_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_DME_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_FE_FLAG_INDEX(hdma)); - - /* Enable Common interrupts*/ - hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; - hdma->Instance->FCR |= DMA_IT_FE; - - if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) - { - hdma->Instance->CR |= DMA_IT_HT; - } - - /* Enable the peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdma); - - /* Return error status */ - status = HAL_BUSY; - } - return status; -} - -/** - * @brief Change the memory0 or memory1 address on the fly. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param Address The new address - * @param memory the memory to be changed, This parameter can be one of - * the following values: - * MEMORY0 / - * MEMORY1 - * @note The MEMORY0 address can be changed only when the current transfer use - * MEMORY1 and the MEMORY1 address can be changed only when the current - * transfer use MEMORY0. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory) -{ - if(memory == MEMORY0) - { - /* change the memory0 address */ - hdma->Instance->M0AR = Address; - } - else - { - /* change the memory1 address */ - hdma->Instance->M1AR = Address; - } - - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup DMAEx_Private_Functions - * @{ - */ - -/** - * @brief Set the DMA Transfer parameter. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - /* Configure DMA Stream data length */ - hdma->Instance->NDTR = DataLength; - - /* Peripheral to Memory */ - if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) - { - /* Configure DMA Stream destination address */ - hdma->Instance->PAR = DstAddress; - - /* Configure DMA Stream source address */ - hdma->Instance->M0AR = SrcAddress; - } - /* Memory to Peripheral */ - else - { - /* Configure DMA Stream source address */ - hdma->Instance->PAR = SrcAddress; - - /* Configure DMA Stream destination address */ - hdma->Instance->M0AR = DstAddress; - } -} - -/** - * @} - */ - -#endif /* HAL_DMA_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.c deleted file mode 100644 index 3fb5836..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.c +++ /dev/null @@ -1,3172 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dsi.c - * @author MCD Application Team - * @brief DSI HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the DSI peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State and Errors functions - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The DSI HAL driver can be used as follows: - - (#) Declare a DSI_HandleTypeDef handle structure, for example: DSI_HandleTypeDef hdsi; - - (#) Initialize the DSI low level resources by implementing the HAL_DSI_MspInit() API: - (##) Enable the DSI interface clock - (##) NVIC configuration if you need to use interrupt process - (+++) Configure the DSI interrupt priority - (+++) Enable the NVIC DSI IRQ Channel - - (#) Initialize the DSI Host peripheral, the required PLL parameters, number of lances and - TX Escape clock divider by calling the HAL_DSI_Init() API which calls HAL_DSI_MspInit(). - - *** Configuration *** - ========================= - [..] - (#) Use HAL_DSI_ConfigAdaptedCommandMode() function to configure the DSI host in adapted - command mode. - - (#) When operating in video mode , use HAL_DSI_ConfigVideoMode() to configure the DSI host. - - (#) Function HAL_DSI_ConfigCommand() is used to configure the DSI commands behavior in low power mode. - - (#) To configure the DSI PHY timings parameters, use function HAL_DSI_ConfigPhyTimer(). - - (#) The DSI Host can be started/stopped using respectively functions HAL_DSI_Start() and HAL_DSI_Stop(). - Functions HAL_DSI_ShortWrite(), HAL_DSI_LongWrite() and HAL_DSI_Read() allows respectively - to write DSI short packets, long packets and to read DSI packets. - - (#) The DSI Host Offers two Low power modes : - (++) Low Power Mode on data lanes only: Only DSI data lanes are shut down. - It is possible to enter/exit from this mode using respectively functions HAL_DSI_EnterULPMData() - and HAL_DSI_ExitULPMData() - - (++) Low Power Mode on data and clock lanes : All DSI lanes are shut down including data and clock lanes. - It is possible to enter/exit from this mode using respectively functions HAL_DSI_EnterULPM() - and HAL_DSI_ExitULPM() - - (#) To control DSI state you can use the following function: HAL_DSI_GetState() - - *** Error management *** - ======================== - [..] - (#) User can select the DSI errors to be reported/monitored using function HAL_DSI_ConfigErrorMonitor() - When an error occurs, the callback HAL_DSI_ErrorCallback() is asserted and then user can retrieve - the error code by calling function HAL_DSI_GetError() - - *** DSI HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in DSI HAL driver. - - (+) __HAL_DSI_ENABLE: Enable the DSI Host. - (+) __HAL_DSI_DISABLE: Disable the DSI Host. - (+) __HAL_DSI_WRAPPER_ENABLE: Enables the DSI wrapper. - (+) __HAL_DSI_WRAPPER_DISABLE: Disable the DSI wrapper. - (+) __HAL_DSI_PLL_ENABLE: Enables the DSI PLL. - (+) __HAL_DSI_PLL_DISABLE: Disables the DSI PLL. - (+) __HAL_DSI_REG_ENABLE: Enables the DSI regulator. - (+) __HAL_DSI_REG_DISABLE: Disables the DSI regulator. - (+) __HAL_DSI_GET_FLAG: Get the DSI pending flags. - (+) __HAL_DSI_CLEAR_FLAG: Clears the DSI pending flags. - (+) __HAL_DSI_ENABLE_IT: Enables the specified DSI interrupts. - (+) __HAL_DSI_DISABLE_IT: Disables the specified DSI interrupts. - (+) __HAL_DSI_GET_IT_SOURCE: Checks whether the specified DSI interrupt source is enabled or not. - - [..] - (@) You can refer to the DSI HAL driver header file for more useful macros - - *** Callback registration *** - ============================================= - [..] - The compilation define USE_HAL_DSI_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - Use Function HAL_DSI_RegisterCallback() to register a callback. - - [..] - Function HAL_DSI_RegisterCallback() allows to register following callbacks: - (+) TearingEffectCallback : DSI Tearing Effect Callback. - (+) EndOfRefreshCallback : DSI End Of Refresh Callback. - (+) ErrorCallback : DSI Error Callback - (+) MspInitCallback : DSI MspInit. - (+) MspDeInitCallback : DSI MspDeInit. - [..] - This function takes as parameters the HAL peripheral handle, the callback ID - and a pointer to the user callback function. - - [..] - Use function HAL_DSI_UnRegisterCallback() to reset a callback to the default - weak function. - HAL_DSI_UnRegisterCallback takes as parameters the HAL peripheral handle, - and the callback ID. - [..] - This function allows to reset following callbacks: - (+) TearingEffectCallback : DSI Tearing Effect Callback. - (+) EndOfRefreshCallback : DSI End Of Refresh Callback. - (+) ErrorCallback : DSI Error Callback - (+) MspInitCallback : DSI MspInit. - (+) MspDeInitCallback : DSI MspDeInit. - - [..] - By default, after the HAL_DSI_Init and when the state is HAL_DSI_STATE_RESET - all callbacks are set to the corresponding weak functions: - examples HAL_DSI_TearingEffectCallback(), HAL_DSI_EndOfRefreshCallback(). - Exception done for MspInit and MspDeInit functions that are respectively - reset to the legacy weak (overridden) functions in the HAL_DSI_Init() - and HAL_DSI_DeInit() only when these callbacks are null (not registered beforehand). - If not, MspInit or MspDeInit are not null, the HAL_DSI_Init() and HAL_DSI_DeInit() - keep and use the user MspInit/MspDeInit callbacks (registered beforehand). - - [..] - Callbacks can be registered/unregistered in HAL_DSI_STATE_READY state only. - Exception done MspInit/MspDeInit that can be registered/unregistered - in HAL_DSI_STATE_READY or HAL_DSI_STATE_RESET state, - thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using HAL_DSI_RegisterCallback() before calling HAL_DSI_DeInit() - or HAL_DSI_Init() function. - - [..] - When The compilation define USE_HAL_DSI_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registration feature is not available and all callbacks - are set to the corresponding weak functions. - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -#ifdef HAL_DSI_MODULE_ENABLED - -#if defined(DSI) - -/** @addtogroup DSI - * @{ - */ - -/* Private types -------------------------------------------------------------*/ -/* Private defines -----------------------------------------------------------*/ -/** @addtogroup DSI_Private_Constants - * @{ - */ -#define DSI_TIMEOUT_VALUE ((uint32_t)1000U) /* 1s */ - -#define DSI_ERROR_ACK_MASK (DSI_ISR0_AE0 | DSI_ISR0_AE1 | DSI_ISR0_AE2 | DSI_ISR0_AE3 | \ - DSI_ISR0_AE4 | DSI_ISR0_AE5 | DSI_ISR0_AE6 | DSI_ISR0_AE7 | \ - DSI_ISR0_AE8 | DSI_ISR0_AE9 | DSI_ISR0_AE10 | DSI_ISR0_AE11 | \ - DSI_ISR0_AE12 | DSI_ISR0_AE13 | DSI_ISR0_AE14 | DSI_ISR0_AE15) -#define DSI_ERROR_PHY_MASK (DSI_ISR0_PE0 | DSI_ISR0_PE1 | DSI_ISR0_PE2 | DSI_ISR0_PE3 | DSI_ISR0_PE4) -#define DSI_ERROR_TX_MASK DSI_ISR1_TOHSTX -#define DSI_ERROR_RX_MASK DSI_ISR1_TOLPRX -#define DSI_ERROR_ECC_MASK (DSI_ISR1_ECCSE | DSI_ISR1_ECCME) -#define DSI_ERROR_CRC_MASK DSI_ISR1_CRCE -#define DSI_ERROR_PSE_MASK DSI_ISR1_PSE -#define DSI_ERROR_EOT_MASK DSI_ISR1_EOTPE -#define DSI_ERROR_OVF_MASK DSI_ISR1_LPWRE -#define DSI_ERROR_GEN_MASK (DSI_ISR1_GCWRE | DSI_ISR1_GPWRE | DSI_ISR1_GPTXE | DSI_ISR1_GPRDE | DSI_ISR1_GPRXE) -/** - * @} - */ - -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static void DSI_ConfigPacketHeader(DSI_TypeDef *DSIx, uint32_t ChannelID, uint32_t DataType, uint32_t Data0, - uint32_t Data1); - -static HAL_StatusTypeDef DSI_ShortWrite(DSI_HandleTypeDef *hdsi, - uint32_t ChannelID, - uint32_t Mode, - uint32_t Param1, - uint32_t Param2); -/* Private functions ---------------------------------------------------------*/ -/** @defgroup DSI_Private_Functions DSI Private Functions - * @{ - */ -/** - * @brief Generic DSI packet header configuration - * @param DSIx Pointer to DSI register base - * @param ChannelID Virtual channel ID of the header packet - * @param DataType Packet data type of the header packet - * This parameter can be any value of : - * @arg DSI_SHORT_WRITE_PKT_Data_Type - * @arg DSI_LONG_WRITE_PKT_Data_Type - * @arg DSI_SHORT_READ_PKT_Data_Type - * @arg DSI_MAX_RETURN_PKT_SIZE - * @param Data0 Word count LSB - * @param Data1 Word count MSB - * @retval None - */ -static void DSI_ConfigPacketHeader(DSI_TypeDef *DSIx, - uint32_t ChannelID, - uint32_t DataType, - uint32_t Data0, - uint32_t Data1) -{ - /* Update the DSI packet header with new information */ - DSIx->GHCR = (DataType | (ChannelID << 6U) | (Data0 << 8U) | (Data1 << 16U)); -} - -/** - * @brief write short DCS or short Generic command - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param ChannelID Virtual channel ID. - * @param Mode DSI short packet data type. - * This parameter can be any value of @arg DSI_SHORT_WRITE_PKT_Data_Type. - * @param Param1 DSC command or first generic parameter. - * This parameter can be any value of @arg DSI_DCS_Command or a - * generic command code. - * @param Param2 DSC parameter or second generic parameter. - * @retval HAL status - */ -static HAL_StatusTypeDef DSI_ShortWrite(DSI_HandleTypeDef *hdsi, - uint32_t ChannelID, - uint32_t Mode, - uint32_t Param1, - uint32_t Param2) -{ - uint32_t tickstart; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait for Command FIFO Empty */ - while ((hdsi->Instance->GPSR & DSI_GPSR_CMDFE) == 0U) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Configure the packet to send a short DCS command with 0 or 1 parameter */ - /* Update the DSI packet header with new information */ - hdsi->Instance->GHCR = (Mode | (ChannelID << 6U) | (Param1 << 8U) | (Param2 << 16U)); - - return HAL_OK; -} - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup DSI_Exported_Functions - * @{ - */ - -/** @defgroup DSI_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initialize and configure the DSI - (+) De-initialize the DSI - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the DSI according to the specified - * parameters in the DSI_InitTypeDef and create the associated handle. - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param PLLInit pointer to a DSI_PLLInitTypeDef structure that contains - * the PLL Clock structure definition for the DSI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_Init(DSI_HandleTypeDef *hdsi, DSI_PLLInitTypeDef *PLLInit) -{ - uint32_t tickstart; - uint32_t unitIntervalx4; - uint32_t tempIDF; - - /* Check the DSI handle allocation */ - if (hdsi == NULL) - { - return HAL_ERROR; - } - - /* Check function parameters */ - assert_param(IS_DSI_PLL_NDIV(PLLInit->PLLNDIV)); - assert_param(IS_DSI_PLL_IDF(PLLInit->PLLIDF)); - assert_param(IS_DSI_PLL_ODF(PLLInit->PLLODF)); - assert_param(IS_DSI_AUTO_CLKLANE_CONTROL(hdsi->Init.AutomaticClockLaneControl)); - assert_param(IS_DSI_NUMBER_OF_LANES(hdsi->Init.NumberOfLanes)); - -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) - if (hdsi->State == HAL_DSI_STATE_RESET) - { - /* Reset the DSI callback to the legacy weak callbacks */ - hdsi->TearingEffectCallback = HAL_DSI_TearingEffectCallback; /* Legacy weak TearingEffectCallback */ - hdsi->EndOfRefreshCallback = HAL_DSI_EndOfRefreshCallback; /* Legacy weak EndOfRefreshCallback */ - hdsi->ErrorCallback = HAL_DSI_ErrorCallback; /* Legacy weak ErrorCallback */ - - if (hdsi->MspInitCallback == NULL) - { - hdsi->MspInitCallback = HAL_DSI_MspInit; - } - /* Initialize the low level hardware */ - hdsi->MspInitCallback(hdsi); - } -#else - if (hdsi->State == HAL_DSI_STATE_RESET) - { - /* Initialize the low level hardware */ - HAL_DSI_MspInit(hdsi); - } -#endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ - - /* Change DSI peripheral state */ - hdsi->State = HAL_DSI_STATE_BUSY; - - /**************** Turn on the regulator and enable the DSI PLL ****************/ - - /* Enable the regulator */ - __HAL_DSI_REG_ENABLE(hdsi); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait until the regulator is ready */ - while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_RRS) == 0U) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Set the PLL division factors */ - hdsi->Instance->WRPCR &= ~(DSI_WRPCR_PLL_NDIV | DSI_WRPCR_PLL_IDF | DSI_WRPCR_PLL_ODF); - hdsi->Instance->WRPCR |= (((PLLInit->PLLNDIV) << DSI_WRPCR_PLL_NDIV_Pos) | \ - ((PLLInit->PLLIDF) << DSI_WRPCR_PLL_IDF_Pos) | \ - ((PLLInit->PLLODF) << DSI_WRPCR_PLL_ODF_Pos)); - - /* Enable the DSI PLL */ - __HAL_DSI_PLL_ENABLE(hdsi); - - /* Requires min of 400us delay before reading the PLLLS flag */ - /* 1ms delay is inserted that is the minimum HAL delay granularity */ - HAL_Delay(1); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait for the lock of the PLL */ - while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - __HAL_DSI_ENABLE(hdsi); - - /************************ Set the DSI clock parameters ************************/ - /* Set the TX escape clock division factor */ - hdsi->Instance->CCR &= ~DSI_CCR_TXECKDIV; - hdsi->Instance->CCR |= hdsi->Init.TXEscapeCkdiv; - - /*************************** Set the PHY parameters ***************************/ - /* D-PHY clock and digital enable*/ - hdsi->Instance->PCTLR |= DSI_PCTLR_DEN; - - hdsi->Instance->PCTLR |= DSI_PCTLR_CKE; - - - /* Configure the number of active data lanes */ - hdsi->Instance->PCONFR &= ~DSI_PCONFR_NL; - hdsi->Instance->PCONFR |= hdsi->Init.NumberOfLanes; - - /* Get tick */ - tickstart = HAL_GetTick(); - if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE) - { - while ((hdsi->Instance->PSR & (DSI_PSR_PSS0 | DSI_PSR_PSSC)) != (DSI_PSR_PSS0 | DSI_PSR_PSSC)) - { - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - } - else - { - while ((hdsi->Instance->PSR & (DSI_PSR_PSS0 | DSI_PSR_PSS1 | DSI_PSR_PSSC)) != (DSI_PSR_PSS0 | \ - DSI_PSR_PSS1 | DSI_PSR_PSSC)) - { - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - } - - /* Calculate the bit period in high-speed mode in unit of 0.25 ns (UIX4) */ - /* The equation is : UIX4 = IntegerPart( (1000/F_PHY_Mhz) * 4 ) */ - /* Where : F_PHY_Mhz = (NDIV * HSE_Mhz) / (IDF * ODF) */ - tempIDF = (PLLInit->PLLIDF > 0U) ? PLLInit->PLLIDF : 1U; - unitIntervalx4 = (4000000U * tempIDF * ((1UL << (0x3U & PLLInit->PLLODF)))) / ((HSE_VALUE / 1000U) * PLLInit->PLLNDIV); - - /* Set the bit period in high-speed mode */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_UIX4; - hdsi->Instance->WPCR[0U] |= unitIntervalx4; - - /****************************** Error management *****************************/ - - /* Disable all error interrupts and reset the Error Mask */ - hdsi->Instance->IER[0U] = 0U; - hdsi->Instance->IER[1U] = 0U; - hdsi->ErrorMsk = 0U; - - __HAL_DSI_DISABLE(hdsi); - - /* Clock lane configuration */ - hdsi->Instance->CLCR &= ~(DSI_CLCR_DPCC | DSI_CLCR_ACR); - hdsi->Instance->CLCR |= (DSI_CLCR_DPCC | hdsi->Init.AutomaticClockLaneControl); - - /* Initialize the error code */ - hdsi->ErrorCode = HAL_DSI_ERROR_NONE; - - /* Initialize the DSI state*/ - hdsi->State = HAL_DSI_STATE_READY; - - return HAL_OK; -} - -/** - * @brief De-initializes the DSI peripheral registers to their default reset - * values. - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_DeInit(DSI_HandleTypeDef *hdsi) -{ - /* Check the DSI handle allocation */ - if (hdsi == NULL) - { - return HAL_ERROR; - } - - /* Change DSI peripheral state */ - hdsi->State = HAL_DSI_STATE_BUSY; - - /* Disable the DSI wrapper */ - __HAL_DSI_WRAPPER_DISABLE(hdsi); - - /* Disable the DSI host */ - __HAL_DSI_DISABLE(hdsi); - - /* D-PHY clock and digital disable */ - hdsi->Instance->PCTLR &= ~(DSI_PCTLR_CKE | DSI_PCTLR_DEN); - - /* Turn off the DSI PLL */ - __HAL_DSI_PLL_DISABLE(hdsi); - - /* Disable the regulator */ - __HAL_DSI_REG_DISABLE(hdsi); - -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) - if (hdsi->MspDeInitCallback == NULL) - { - hdsi->MspDeInitCallback = HAL_DSI_MspDeInit; - } - /* DeInit the low level hardware */ - hdsi->MspDeInitCallback(hdsi); -#else - /* DeInit the low level hardware */ - HAL_DSI_MspDeInit(hdsi); -#endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ - - /* Initialize the error code */ - hdsi->ErrorCode = HAL_DSI_ERROR_NONE; - - /* Initialize the DSI state*/ - hdsi->State = HAL_DSI_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Enable the error monitor flags - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param ActiveErrors indicates which error interrupts will be enabled. - * This parameter can be any combination of @arg DSI_Error_Data_Type. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_ConfigErrorMonitor(DSI_HandleTypeDef *hdsi, uint32_t ActiveErrors) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - hdsi->Instance->IER[0U] = 0U; - hdsi->Instance->IER[1U] = 0U; - - /* Store active errors to the handle */ - hdsi->ErrorMsk = ActiveErrors; - - if ((ActiveErrors & HAL_DSI_ERROR_ACK) != 0U) - { - /* Enable the interrupt generation on selected errors */ - hdsi->Instance->IER[0U] |= DSI_ERROR_ACK_MASK; - } - - if ((ActiveErrors & HAL_DSI_ERROR_PHY) != 0U) - { - /* Enable the interrupt generation on selected errors */ - hdsi->Instance->IER[0U] |= DSI_ERROR_PHY_MASK; - } - - if ((ActiveErrors & HAL_DSI_ERROR_TX) != 0U) - { - /* Enable the interrupt generation on selected errors */ - hdsi->Instance->IER[1U] |= DSI_ERROR_TX_MASK; - } - - if ((ActiveErrors & HAL_DSI_ERROR_RX) != 0U) - { - /* Enable the interrupt generation on selected errors */ - hdsi->Instance->IER[1U] |= DSI_ERROR_RX_MASK; - } - - if ((ActiveErrors & HAL_DSI_ERROR_ECC) != 0U) - { - /* Enable the interrupt generation on selected errors */ - hdsi->Instance->IER[1U] |= DSI_ERROR_ECC_MASK; - } - - if ((ActiveErrors & HAL_DSI_ERROR_CRC) != 0U) - { - /* Enable the interrupt generation on selected errors */ - hdsi->Instance->IER[1U] |= DSI_ERROR_CRC_MASK; - } - - if ((ActiveErrors & HAL_DSI_ERROR_PSE) != 0U) - { - /* Enable the interrupt generation on selected errors */ - hdsi->Instance->IER[1U] |= DSI_ERROR_PSE_MASK; - } - - if ((ActiveErrors & HAL_DSI_ERROR_EOT) != 0U) - { - /* Enable the interrupt generation on selected errors */ - hdsi->Instance->IER[1U] |= DSI_ERROR_EOT_MASK; - } - - if ((ActiveErrors & HAL_DSI_ERROR_OVF) != 0U) - { - /* Enable the interrupt generation on selected errors */ - hdsi->Instance->IER[1U] |= DSI_ERROR_OVF_MASK; - } - - if ((ActiveErrors & HAL_DSI_ERROR_GEN) != 0U) - { - /* Enable the interrupt generation on selected errors */ - hdsi->Instance->IER[1U] |= DSI_ERROR_GEN_MASK; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Initializes the DSI MSP. - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval None - */ -__weak void HAL_DSI_MspInit(DSI_HandleTypeDef *hdsi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hdsi); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DSI_MspInit could be implemented in the user file - */ -} - -/** - * @brief De-initializes the DSI MSP. - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval None - */ -__weak void HAL_DSI_MspDeInit(DSI_HandleTypeDef *hdsi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hdsi); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DSI_MspDeInit could be implemented in the user file - */ -} - -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User DSI Callback - * To be used instead of the weak predefined callback - * @param hdsi dsi handle - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg HAL_DSI_TEARING_EFFECT_CB_ID Tearing Effect Callback ID - * @arg HAL_DSI_ENDOF_REFRESH_CB_ID End Of Refresh Callback ID - * @arg HAL_DSI_ERROR_CB_ID Error Callback ID - * @arg HAL_DSI_MSPINIT_CB_ID MspInit callback ID - * @arg HAL_DSI_MSPDEINIT_CB_ID MspDeInit callback ID - * @param pCallback pointer to the Callback function - * @retval status - */ -HAL_StatusTypeDef HAL_DSI_RegisterCallback(DSI_HandleTypeDef *hdsi, HAL_DSI_CallbackIDTypeDef CallbackID, - pDSI_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(hdsi); - - if (hdsi->State == HAL_DSI_STATE_READY) - { - switch (CallbackID) - { - case HAL_DSI_TEARING_EFFECT_CB_ID : - hdsi->TearingEffectCallback = pCallback; - break; - - case HAL_DSI_ENDOF_REFRESH_CB_ID : - hdsi->EndOfRefreshCallback = pCallback; - break; - - case HAL_DSI_ERROR_CB_ID : - hdsi->ErrorCallback = pCallback; - break; - - case HAL_DSI_MSPINIT_CB_ID : - hdsi->MspInitCallback = pCallback; - break; - - case HAL_DSI_MSPDEINIT_CB_ID : - hdsi->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (hdsi->State == HAL_DSI_STATE_RESET) - { - switch (CallbackID) - { - case HAL_DSI_MSPINIT_CB_ID : - hdsi->MspInitCallback = pCallback; - break; - - case HAL_DSI_MSPDEINIT_CB_ID : - hdsi->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hdsi); - - return status; -} - -/** - * @brief Unregister a DSI Callback - * DSI callback is redirected to the weak predefined callback - * @param hdsi dsi handle - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg HAL_DSI_TEARING_EFFECT_CB_ID Tearing Effect Callback ID - * @arg HAL_DSI_ENDOF_REFRESH_CB_ID End Of Refresh Callback ID - * @arg HAL_DSI_ERROR_CB_ID Error Callback ID - * @arg HAL_DSI_MSPINIT_CB_ID MspInit callback ID - * @arg HAL_DSI_MSPDEINIT_CB_ID MspDeInit callback ID - * @retval status - */ -HAL_StatusTypeDef HAL_DSI_UnRegisterCallback(DSI_HandleTypeDef *hdsi, HAL_DSI_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hdsi); - - if (hdsi->State == HAL_DSI_STATE_READY) - { - switch (CallbackID) - { - case HAL_DSI_TEARING_EFFECT_CB_ID : - hdsi->TearingEffectCallback = HAL_DSI_TearingEffectCallback; /* Legacy weak TearingEffectCallback */ - break; - - case HAL_DSI_ENDOF_REFRESH_CB_ID : - hdsi->EndOfRefreshCallback = HAL_DSI_EndOfRefreshCallback; /* Legacy weak EndOfRefreshCallback */ - break; - - case HAL_DSI_ERROR_CB_ID : - hdsi->ErrorCallback = HAL_DSI_ErrorCallback; /* Legacy weak ErrorCallback */ - break; - - case HAL_DSI_MSPINIT_CB_ID : - hdsi->MspInitCallback = HAL_DSI_MspInit; /* Legacy weak MspInit Callback */ - break; - - case HAL_DSI_MSPDEINIT_CB_ID : - hdsi->MspDeInitCallback = HAL_DSI_MspDeInit; /* Legacy weak MspDeInit Callback */ - break; - - default : - /* Update the error code */ - hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (hdsi->State == HAL_DSI_STATE_RESET) - { - switch (CallbackID) - { - case HAL_DSI_MSPINIT_CB_ID : - hdsi->MspInitCallback = HAL_DSI_MspInit; /* Legacy weak MspInit Callback */ - break; - - case HAL_DSI_MSPDEINIT_CB_ID : - hdsi->MspDeInitCallback = HAL_DSI_MspDeInit; /* Legacy weak MspDeInit Callback */ - break; - - default : - /* Update the error code */ - hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hdsi); - - return status; -} -#endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup DSI_Group2 IO operation functions - * @brief IO operation functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] This section provides function allowing to: - (+) Handle DSI interrupt request - -@endverbatim - * @{ - */ -/** - * @brief Handles DSI interrupt request. - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval HAL status - */ -void HAL_DSI_IRQHandler(DSI_HandleTypeDef *hdsi) -{ - uint32_t ErrorStatus0; - uint32_t ErrorStatus1; - - /* Tearing Effect Interrupt management ***************************************/ - if (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_TE) != 0U) - { - if (__HAL_DSI_GET_IT_SOURCE(hdsi, DSI_IT_TE) != 0U) - { - /* Clear the Tearing Effect Interrupt Flag */ - __HAL_DSI_CLEAR_FLAG(hdsi, DSI_FLAG_TE); - - /* Tearing Effect Callback */ -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) - /*Call registered Tearing Effect callback */ - hdsi->TearingEffectCallback(hdsi); -#else - /*Call legacy Tearing Effect callback*/ - HAL_DSI_TearingEffectCallback(hdsi); -#endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ - } - } - - /* End of Refresh Interrupt management ***************************************/ - if (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_ER) != 0U) - { - if (__HAL_DSI_GET_IT_SOURCE(hdsi, DSI_IT_ER) != 0U) - { - /* Clear the End of Refresh Interrupt Flag */ - __HAL_DSI_CLEAR_FLAG(hdsi, DSI_FLAG_ER); - - /* End of Refresh Callback */ -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) - /*Call registered End of refresh callback */ - hdsi->EndOfRefreshCallback(hdsi); -#else - /*Call Legacy End of refresh callback */ - HAL_DSI_EndOfRefreshCallback(hdsi); -#endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ - } - } - - /* Error Interrupts management ***********************************************/ - if (hdsi->ErrorMsk != 0U) - { - ErrorStatus0 = hdsi->Instance->ISR[0U]; - ErrorStatus0 &= hdsi->Instance->IER[0U]; - ErrorStatus1 = hdsi->Instance->ISR[1U]; - ErrorStatus1 &= hdsi->Instance->IER[1U]; - - if ((ErrorStatus0 & DSI_ERROR_ACK_MASK) != 0U) - { - hdsi->ErrorCode |= HAL_DSI_ERROR_ACK; - } - - if ((ErrorStatus0 & DSI_ERROR_PHY_MASK) != 0U) - { - hdsi->ErrorCode |= HAL_DSI_ERROR_PHY; - } - - if ((ErrorStatus1 & DSI_ERROR_TX_MASK) != 0U) - { - hdsi->ErrorCode |= HAL_DSI_ERROR_TX; - } - - if ((ErrorStatus1 & DSI_ERROR_RX_MASK) != 0U) - { - hdsi->ErrorCode |= HAL_DSI_ERROR_RX; - } - - if ((ErrorStatus1 & DSI_ERROR_ECC_MASK) != 0U) - { - hdsi->ErrorCode |= HAL_DSI_ERROR_ECC; - } - - if ((ErrorStatus1 & DSI_ERROR_CRC_MASK) != 0U) - { - hdsi->ErrorCode |= HAL_DSI_ERROR_CRC; - } - - if ((ErrorStatus1 & DSI_ERROR_PSE_MASK) != 0U) - { - hdsi->ErrorCode |= HAL_DSI_ERROR_PSE; - } - - if ((ErrorStatus1 & DSI_ERROR_EOT_MASK) != 0U) - { - hdsi->ErrorCode |= HAL_DSI_ERROR_EOT; - } - - if ((ErrorStatus1 & DSI_ERROR_OVF_MASK) != 0U) - { - hdsi->ErrorCode |= HAL_DSI_ERROR_OVF; - } - - if ((ErrorStatus1 & DSI_ERROR_GEN_MASK) != 0U) - { - hdsi->ErrorCode |= HAL_DSI_ERROR_GEN; - } - - /* Check only selected errors */ - if (hdsi->ErrorCode != HAL_DSI_ERROR_NONE) - { - /* DSI error interrupt callback */ -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) - /*Call registered Error callback */ - hdsi->ErrorCallback(hdsi); -#else - /*Call Legacy Error callback */ - HAL_DSI_ErrorCallback(hdsi); -#endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ - } - } -} - -/** - * @brief Tearing Effect DSI callback. - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval None - */ -__weak void HAL_DSI_TearingEffectCallback(DSI_HandleTypeDef *hdsi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hdsi); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DSI_TearingEffectCallback could be implemented in the user file - */ -} - -/** - * @brief End of Refresh DSI callback. - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval None - */ -__weak void HAL_DSI_EndOfRefreshCallback(DSI_HandleTypeDef *hdsi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hdsi); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DSI_EndOfRefreshCallback could be implemented in the user file - */ -} - -/** - * @brief Operation Error DSI callback. - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval None - */ -__weak void HAL_DSI_ErrorCallback(DSI_HandleTypeDef *hdsi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hdsi); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DSI_ErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup DSI_Group3 Peripheral Control functions - * @brief Peripheral Control functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure the Generic interface read-back Virtual Channel ID - (+) Select video mode and configure the corresponding parameters - (+) Configure command transmission mode: High-speed or Low-power - (+) Configure the flow control - (+) Configure the DSI PHY timer - (+) Configure the DSI HOST timeout - (+) Configure the DSI HOST timeout - (+) Start/Stop the DSI module - (+) Refresh the display in command mode - (+) Controls the display color mode in Video mode - (+) Control the display shutdown in Video mode - (+) write short DCS or short Generic command - (+) write long DCS or long Generic command - (+) Read command (DCS or generic) - (+) Enter/Exit the Ultra Low Power Mode on data only (D-PHY PLL running) - (+) Enter/Exit the Ultra Low Power Mode on data only and clock (D-PHY PLL turned off) - (+) Start/Stop test pattern generation - (+) Slew-Rate And Delay Tuning - (+) Low-Power Reception Filter Tuning - (+) Activate an additional current path on all lanes to meet the SDDTx parameter - (+) Custom lane pins configuration - (+) Set custom timing for the PHY - (+) Force the Clock/Data Lane in TX Stop Mode - (+) Force LP Receiver in Low-Power Mode - (+) Force Data Lanes in RX Mode after a BTA - (+) Enable a pull-down on the lanes to prevent from floating states when unused - (+) Switch off the contention detection on data lanes - -@endverbatim - * @{ - */ - -/** - * @brief Configure the Generic interface read-back Virtual Channel ID. - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param VirtualChannelID Virtual channel ID - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_SetGenericVCID(DSI_HandleTypeDef *hdsi, uint32_t VirtualChannelID) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Update the GVCID register */ - hdsi->Instance->GVCIDR &= ~DSI_GVCIDR_VCID; - hdsi->Instance->GVCIDR |= VirtualChannelID; - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Select video mode and configure the corresponding parameters - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param VidCfg pointer to a DSI_VidCfgTypeDef structure that contains - * the DSI video mode configuration parameters - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_ConfigVideoMode(DSI_HandleTypeDef *hdsi, DSI_VidCfgTypeDef *VidCfg) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check the parameters */ - assert_param(IS_DSI_COLOR_CODING(VidCfg->ColorCoding)); - assert_param(IS_DSI_VIDEO_MODE_TYPE(VidCfg->Mode)); - assert_param(IS_DSI_LP_COMMAND(VidCfg->LPCommandEnable)); - assert_param(IS_DSI_LP_HFP(VidCfg->LPHorizontalFrontPorchEnable)); - assert_param(IS_DSI_LP_HBP(VidCfg->LPHorizontalBackPorchEnable)); - assert_param(IS_DSI_LP_VACTIVE(VidCfg->LPVerticalActiveEnable)); - assert_param(IS_DSI_LP_VFP(VidCfg->LPVerticalFrontPorchEnable)); - assert_param(IS_DSI_LP_VBP(VidCfg->LPVerticalBackPorchEnable)); - assert_param(IS_DSI_LP_VSYNC(VidCfg->LPVerticalSyncActiveEnable)); - assert_param(IS_DSI_FBTAA(VidCfg->FrameBTAAcknowledgeEnable)); - assert_param(IS_DSI_DE_POLARITY(VidCfg->DEPolarity)); - assert_param(IS_DSI_VSYNC_POLARITY(VidCfg->VSPolarity)); - assert_param(IS_DSI_HSYNC_POLARITY(VidCfg->HSPolarity)); - /* Check the LooselyPacked variant only in 18-bit mode */ - if (VidCfg->ColorCoding == DSI_RGB666) - { - assert_param(IS_DSI_LOOSELY_PACKED(VidCfg->LooselyPacked)); - } - - /* Select video mode by resetting CMDM and DSIM bits */ - hdsi->Instance->MCR &= ~DSI_MCR_CMDM; - hdsi->Instance->WCFGR &= ~DSI_WCFGR_DSIM; - - /* Configure the video mode transmission type */ - hdsi->Instance->VMCR &= ~DSI_VMCR_VMT; - hdsi->Instance->VMCR |= VidCfg->Mode; - - /* Configure the video packet size */ - hdsi->Instance->VPCR &= ~DSI_VPCR_VPSIZE; - hdsi->Instance->VPCR |= VidCfg->PacketSize; - - /* Set the chunks number to be transmitted through the DSI link */ - hdsi->Instance->VCCR &= ~DSI_VCCR_NUMC; - hdsi->Instance->VCCR |= VidCfg->NumberOfChunks; - - /* Set the size of the null packet */ - hdsi->Instance->VNPCR &= ~DSI_VNPCR_NPSIZE; - hdsi->Instance->VNPCR |= VidCfg->NullPacketSize; - - /* Select the virtual channel for the LTDC interface traffic */ - hdsi->Instance->LVCIDR &= ~DSI_LVCIDR_VCID; - hdsi->Instance->LVCIDR |= VidCfg->VirtualChannelID; - - /* Configure the polarity of control signals */ - hdsi->Instance->LPCR &= ~(DSI_LPCR_DEP | DSI_LPCR_VSP | DSI_LPCR_HSP); - hdsi->Instance->LPCR |= (VidCfg->DEPolarity | VidCfg->VSPolarity | VidCfg->HSPolarity); - - /* Select the color coding for the host */ - hdsi->Instance->LCOLCR &= ~DSI_LCOLCR_COLC; - hdsi->Instance->LCOLCR |= VidCfg->ColorCoding; - - /* Select the color coding for the wrapper */ - hdsi->Instance->WCFGR &= ~DSI_WCFGR_COLMUX; - hdsi->Instance->WCFGR |= ((VidCfg->ColorCoding) << 1U); - - /* Enable/disable the loosely packed variant to 18-bit configuration */ - if (VidCfg->ColorCoding == DSI_RGB666) - { - hdsi->Instance->LCOLCR &= ~DSI_LCOLCR_LPE; - hdsi->Instance->LCOLCR |= VidCfg->LooselyPacked; - } - - /* Set the Horizontal Synchronization Active (HSA) in lane byte clock cycles */ - hdsi->Instance->VHSACR &= ~DSI_VHSACR_HSA; - hdsi->Instance->VHSACR |= VidCfg->HorizontalSyncActive; - - /* Set the Horizontal Back Porch (HBP) in lane byte clock cycles */ - hdsi->Instance->VHBPCR &= ~DSI_VHBPCR_HBP; - hdsi->Instance->VHBPCR |= VidCfg->HorizontalBackPorch; - - /* Set the total line time (HLINE=HSA+HBP+HACT+HFP) in lane byte clock cycles */ - hdsi->Instance->VLCR &= ~DSI_VLCR_HLINE; - hdsi->Instance->VLCR |= VidCfg->HorizontalLine; - - /* Set the Vertical Synchronization Active (VSA) */ - hdsi->Instance->VVSACR &= ~DSI_VVSACR_VSA; - hdsi->Instance->VVSACR |= VidCfg->VerticalSyncActive; - - /* Set the Vertical Back Porch (VBP)*/ - hdsi->Instance->VVBPCR &= ~DSI_VVBPCR_VBP; - hdsi->Instance->VVBPCR |= VidCfg->VerticalBackPorch; - - /* Set the Vertical Front Porch (VFP)*/ - hdsi->Instance->VVFPCR &= ~DSI_VVFPCR_VFP; - hdsi->Instance->VVFPCR |= VidCfg->VerticalFrontPorch; - - /* Set the Vertical Active period*/ - hdsi->Instance->VVACR &= ~DSI_VVACR_VA; - hdsi->Instance->VVACR |= VidCfg->VerticalActive; - - /* Configure the command transmission mode */ - hdsi->Instance->VMCR &= ~DSI_VMCR_LPCE; - hdsi->Instance->VMCR |= VidCfg->LPCommandEnable; - - /* Low power largest packet size */ - hdsi->Instance->LPMCR &= ~DSI_LPMCR_LPSIZE; - hdsi->Instance->LPMCR |= ((VidCfg->LPLargestPacketSize) << 16U); - - /* Low power VACT largest packet size */ - hdsi->Instance->LPMCR &= ~DSI_LPMCR_VLPSIZE; - hdsi->Instance->LPMCR |= VidCfg->LPVACTLargestPacketSize; - - /* Enable LP transition in HFP period */ - hdsi->Instance->VMCR &= ~DSI_VMCR_LPHFPE; - hdsi->Instance->VMCR |= VidCfg->LPHorizontalFrontPorchEnable; - - /* Enable LP transition in HBP period */ - hdsi->Instance->VMCR &= ~DSI_VMCR_LPHBPE; - hdsi->Instance->VMCR |= VidCfg->LPHorizontalBackPorchEnable; - - /* Enable LP transition in VACT period */ - hdsi->Instance->VMCR &= ~DSI_VMCR_LPVAE; - hdsi->Instance->VMCR |= VidCfg->LPVerticalActiveEnable; - - /* Enable LP transition in VFP period */ - hdsi->Instance->VMCR &= ~DSI_VMCR_LPVFPE; - hdsi->Instance->VMCR |= VidCfg->LPVerticalFrontPorchEnable; - - /* Enable LP transition in VBP period */ - hdsi->Instance->VMCR &= ~DSI_VMCR_LPVBPE; - hdsi->Instance->VMCR |= VidCfg->LPVerticalBackPorchEnable; - - /* Enable LP transition in vertical sync period */ - hdsi->Instance->VMCR &= ~DSI_VMCR_LPVSAE; - hdsi->Instance->VMCR |= VidCfg->LPVerticalSyncActiveEnable; - - /* Enable the request for an acknowledge response at the end of a frame */ - hdsi->Instance->VMCR &= ~DSI_VMCR_FBTAAE; - hdsi->Instance->VMCR |= VidCfg->FrameBTAAcknowledgeEnable; - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Select adapted command mode and configure the corresponding parameters - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param CmdCfg pointer to a DSI_CmdCfgTypeDef structure that contains - * the DSI command mode configuration parameters - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_ConfigAdaptedCommandMode(DSI_HandleTypeDef *hdsi, DSI_CmdCfgTypeDef *CmdCfg) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check the parameters */ - assert_param(IS_DSI_COLOR_CODING(CmdCfg->ColorCoding)); - assert_param(IS_DSI_TE_SOURCE(CmdCfg->TearingEffectSource)); - assert_param(IS_DSI_TE_POLARITY(CmdCfg->TearingEffectPolarity)); - assert_param(IS_DSI_AUTOMATIC_REFRESH(CmdCfg->AutomaticRefresh)); - assert_param(IS_DSI_VS_POLARITY(CmdCfg->VSyncPol)); - assert_param(IS_DSI_TE_ACK_REQUEST(CmdCfg->TEAcknowledgeRequest)); - assert_param(IS_DSI_DE_POLARITY(CmdCfg->DEPolarity)); - assert_param(IS_DSI_VSYNC_POLARITY(CmdCfg->VSPolarity)); - assert_param(IS_DSI_HSYNC_POLARITY(CmdCfg->HSPolarity)); - - /* Select command mode by setting CMDM and DSIM bits */ - hdsi->Instance->MCR |= DSI_MCR_CMDM; - hdsi->Instance->WCFGR &= ~DSI_WCFGR_DSIM; - hdsi->Instance->WCFGR |= DSI_WCFGR_DSIM; - - /* Select the virtual channel for the LTDC interface traffic */ - hdsi->Instance->LVCIDR &= ~DSI_LVCIDR_VCID; - hdsi->Instance->LVCIDR |= CmdCfg->VirtualChannelID; - - /* Configure the polarity of control signals */ - hdsi->Instance->LPCR &= ~(DSI_LPCR_DEP | DSI_LPCR_VSP | DSI_LPCR_HSP); - hdsi->Instance->LPCR |= (CmdCfg->DEPolarity | CmdCfg->VSPolarity | CmdCfg->HSPolarity); - - /* Select the color coding for the host */ - hdsi->Instance->LCOLCR &= ~DSI_LCOLCR_COLC; - hdsi->Instance->LCOLCR |= CmdCfg->ColorCoding; - - /* Select the color coding for the wrapper */ - hdsi->Instance->WCFGR &= ~DSI_WCFGR_COLMUX; - hdsi->Instance->WCFGR |= ((CmdCfg->ColorCoding) << 1U); - - /* Configure the maximum allowed size for write memory command */ - hdsi->Instance->LCCR &= ~DSI_LCCR_CMDSIZE; - hdsi->Instance->LCCR |= CmdCfg->CommandSize; - - /* Configure the tearing effect source and polarity and select the refresh mode */ - hdsi->Instance->WCFGR &= ~(DSI_WCFGR_TESRC | DSI_WCFGR_TEPOL | DSI_WCFGR_AR | DSI_WCFGR_VSPOL); - hdsi->Instance->WCFGR |= (CmdCfg->TearingEffectSource | CmdCfg->TearingEffectPolarity | CmdCfg->AutomaticRefresh | - CmdCfg->VSyncPol); - - /* Configure the tearing effect acknowledge request */ - hdsi->Instance->CMCR &= ~DSI_CMCR_TEARE; - hdsi->Instance->CMCR |= CmdCfg->TEAcknowledgeRequest; - - /* Enable the Tearing Effect interrupt */ - __HAL_DSI_ENABLE_IT(hdsi, DSI_IT_TE); - - /* Enable the End of Refresh interrupt */ - __HAL_DSI_ENABLE_IT(hdsi, DSI_IT_ER); - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Configure command transmission mode: High-speed or Low-power - * and enable/disable acknowledge request after packet transmission - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param LPCmd pointer to a DSI_LPCmdTypeDef structure that contains - * the DSI command transmission mode configuration parameters - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_ConfigCommand(DSI_HandleTypeDef *hdsi, DSI_LPCmdTypeDef *LPCmd) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - assert_param(IS_DSI_LP_GSW0P(LPCmd->LPGenShortWriteNoP)); - assert_param(IS_DSI_LP_GSW1P(LPCmd->LPGenShortWriteOneP)); - assert_param(IS_DSI_LP_GSW2P(LPCmd->LPGenShortWriteTwoP)); - assert_param(IS_DSI_LP_GSR0P(LPCmd->LPGenShortReadNoP)); - assert_param(IS_DSI_LP_GSR1P(LPCmd->LPGenShortReadOneP)); - assert_param(IS_DSI_LP_GSR2P(LPCmd->LPGenShortReadTwoP)); - assert_param(IS_DSI_LP_GLW(LPCmd->LPGenLongWrite)); - assert_param(IS_DSI_LP_DSW0P(LPCmd->LPDcsShortWriteNoP)); - assert_param(IS_DSI_LP_DSW1P(LPCmd->LPDcsShortWriteOneP)); - assert_param(IS_DSI_LP_DSR0P(LPCmd->LPDcsShortReadNoP)); - assert_param(IS_DSI_LP_DLW(LPCmd->LPDcsLongWrite)); - assert_param(IS_DSI_LP_MRDP(LPCmd->LPMaxReadPacket)); - assert_param(IS_DSI_ACK_REQUEST(LPCmd->AcknowledgeRequest)); - - /* Select High-speed or Low-power for command transmission */ - hdsi->Instance->CMCR &= ~(DSI_CMCR_GSW0TX | \ - DSI_CMCR_GSW1TX | \ - DSI_CMCR_GSW2TX | \ - DSI_CMCR_GSR0TX | \ - DSI_CMCR_GSR1TX | \ - DSI_CMCR_GSR2TX | \ - DSI_CMCR_GLWTX | \ - DSI_CMCR_DSW0TX | \ - DSI_CMCR_DSW1TX | \ - DSI_CMCR_DSR0TX | \ - DSI_CMCR_DLWTX | \ - DSI_CMCR_MRDPS); - hdsi->Instance->CMCR |= (LPCmd->LPGenShortWriteNoP | \ - LPCmd->LPGenShortWriteOneP | \ - LPCmd->LPGenShortWriteTwoP | \ - LPCmd->LPGenShortReadNoP | \ - LPCmd->LPGenShortReadOneP | \ - LPCmd->LPGenShortReadTwoP | \ - LPCmd->LPGenLongWrite | \ - LPCmd->LPDcsShortWriteNoP | \ - LPCmd->LPDcsShortWriteOneP | \ - LPCmd->LPDcsShortReadNoP | \ - LPCmd->LPDcsLongWrite | \ - LPCmd->LPMaxReadPacket); - - /* Configure the acknowledge request after each packet transmission */ - hdsi->Instance->CMCR &= ~DSI_CMCR_ARE; - hdsi->Instance->CMCR |= LPCmd->AcknowledgeRequest; - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Configure the flow control parameters - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param FlowControl flow control feature(s) to be enabled. - * This parameter can be any combination of @arg DSI_FlowControl. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_ConfigFlowControl(DSI_HandleTypeDef *hdsi, uint32_t FlowControl) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check the parameters */ - assert_param(IS_DSI_FLOW_CONTROL(FlowControl)); - - /* Set the DSI Host Protocol Configuration Register */ - hdsi->Instance->PCR &= ~DSI_FLOW_CONTROL_ALL; - hdsi->Instance->PCR |= FlowControl; - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Configure the DSI PHY timer parameters - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param PhyTimers DSI_PHY_TimerTypeDef structure that contains - * the DSI PHY timing parameters - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_ConfigPhyTimer(DSI_HandleTypeDef *hdsi, DSI_PHY_TimerTypeDef *PhyTimers) -{ - uint32_t maxTime; - /* Process locked */ - __HAL_LOCK(hdsi); - - maxTime = (PhyTimers->ClockLaneLP2HSTime > PhyTimers->ClockLaneHS2LPTime) ? PhyTimers->ClockLaneLP2HSTime : - PhyTimers->ClockLaneHS2LPTime; - - /* Clock lane timer configuration */ - - /* In Automatic Clock Lane control mode, the DSI Host can turn off the clock lane between two - High-Speed transmission. - To do so, the DSI Host calculates the time required for the clock lane to change from HighSpeed - to Low-Power and from Low-Power to High-Speed. - This timings are configured by the HS2LP_TIME and LP2HS_TIME in the DSI Host Clock Lane Timer Configuration - Register (DSI_CLTCR). - But the DSI Host is not calculating LP2HS_TIME + HS2LP_TIME but 2 x HS2LP_TIME. - - Workaround : Configure HS2LP_TIME and LP2HS_TIME with the same value being the max of HS2LP_TIME or LP2HS_TIME. - */ - hdsi->Instance->CLTCR &= ~(DSI_CLTCR_LP2HS_TIME | DSI_CLTCR_HS2LP_TIME); - hdsi->Instance->CLTCR |= (maxTime | ((maxTime) << 16U)); - - /* Data lane timer configuration */ - hdsi->Instance->DLTCR &= ~(DSI_DLTCR_MRD_TIME | DSI_DLTCR_LP2HS_TIME | DSI_DLTCR_HS2LP_TIME); - hdsi->Instance->DLTCR |= (PhyTimers->DataLaneMaxReadTime | ((PhyTimers->DataLaneLP2HSTime) << 16U) | (( - PhyTimers->DataLaneHS2LPTime) << 24U)); - - /* Configure the wait period to request HS transmission after a stop state */ - hdsi->Instance->PCONFR &= ~DSI_PCONFR_SW_TIME; - hdsi->Instance->PCONFR |= ((PhyTimers->StopWaitTime) << 8U); - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Configure the DSI HOST timeout parameters - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param HostTimeouts DSI_HOST_TimeoutTypeDef structure that contains - * the DSI host timeout parameters - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_ConfigHostTimeouts(DSI_HandleTypeDef *hdsi, DSI_HOST_TimeoutTypeDef *HostTimeouts) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Set the timeout clock division factor */ - hdsi->Instance->CCR &= ~DSI_CCR_TOCKDIV; - hdsi->Instance->CCR |= ((HostTimeouts->TimeoutCkdiv) << 8U); - - /* High-speed transmission timeout */ - hdsi->Instance->TCCR[0U] &= ~DSI_TCCR0_HSTX_TOCNT; - hdsi->Instance->TCCR[0U] |= ((HostTimeouts->HighSpeedTransmissionTimeout) << 16U); - - /* Low-power reception timeout */ - hdsi->Instance->TCCR[0U] &= ~DSI_TCCR0_LPRX_TOCNT; - hdsi->Instance->TCCR[0U] |= HostTimeouts->LowPowerReceptionTimeout; - - /* High-speed read timeout */ - hdsi->Instance->TCCR[1U] &= ~DSI_TCCR1_HSRD_TOCNT; - hdsi->Instance->TCCR[1U] |= HostTimeouts->HighSpeedReadTimeout; - - /* Low-power read timeout */ - hdsi->Instance->TCCR[2U] &= ~DSI_TCCR2_LPRD_TOCNT; - hdsi->Instance->TCCR[2U] |= HostTimeouts->LowPowerReadTimeout; - - /* High-speed write timeout */ - hdsi->Instance->TCCR[3U] &= ~DSI_TCCR3_HSWR_TOCNT; - hdsi->Instance->TCCR[3U] |= HostTimeouts->HighSpeedWriteTimeout; - - /* High-speed write presp mode */ - hdsi->Instance->TCCR[3U] &= ~DSI_TCCR3_PM; - hdsi->Instance->TCCR[3U] |= HostTimeouts->HighSpeedWritePrespMode; - - /* Low-speed write timeout */ - hdsi->Instance->TCCR[4U] &= ~DSI_TCCR4_LPWR_TOCNT; - hdsi->Instance->TCCR[4U] |= HostTimeouts->LowPowerWriteTimeout; - - /* BTA timeout */ - hdsi->Instance->TCCR[5U] &= ~DSI_TCCR5_BTA_TOCNT; - hdsi->Instance->TCCR[5U] |= HostTimeouts->BTATimeout; - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Start the DSI module - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_Start(DSI_HandleTypeDef *hdsi) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Enable the DSI host */ - __HAL_DSI_ENABLE(hdsi); - - /* Enable the DSI wrapper */ - __HAL_DSI_WRAPPER_ENABLE(hdsi); - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Stop the DSI module - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_Stop(DSI_HandleTypeDef *hdsi) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Disable the DSI host */ - __HAL_DSI_DISABLE(hdsi); - - /* Disable the DSI wrapper */ - __HAL_DSI_WRAPPER_DISABLE(hdsi); - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Refresh the display in command mode - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_Refresh(DSI_HandleTypeDef *hdsi) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Update the display */ - hdsi->Instance->WCR |= DSI_WCR_LTDCEN; - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Controls the display color mode in Video mode - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param ColorMode Color mode (full or 8-colors). - * This parameter can be any value of @arg DSI_Color_Mode - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_ColorMode(DSI_HandleTypeDef *hdsi, uint32_t ColorMode) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check the parameters */ - assert_param(IS_DSI_COLOR_MODE(ColorMode)); - - /* Update the display color mode */ - hdsi->Instance->WCR &= ~DSI_WCR_COLM; - hdsi->Instance->WCR |= ColorMode; - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Control the display shutdown in Video mode - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param Shutdown Shut-down (Display-ON or Display-OFF). - * This parameter can be any value of @arg DSI_ShutDown - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_Shutdown(DSI_HandleTypeDef *hdsi, uint32_t Shutdown) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check the parameters */ - assert_param(IS_DSI_SHUT_DOWN(Shutdown)); - - /* Update the display Shutdown */ - hdsi->Instance->WCR &= ~DSI_WCR_SHTDN; - hdsi->Instance->WCR |= Shutdown; - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief write short DCS or short Generic command - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param ChannelID Virtual channel ID. - * @param Mode DSI short packet data type. - * This parameter can be any value of @arg DSI_SHORT_WRITE_PKT_Data_Type. - * @param Param1 DSC command or first generic parameter. - * This parameter can be any value of @arg DSI_DCS_Command or a - * generic command code. - * @param Param2 DSC parameter or second generic parameter. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_ShortWrite(DSI_HandleTypeDef *hdsi, - uint32_t ChannelID, - uint32_t Mode, - uint32_t Param1, - uint32_t Param2) -{ - HAL_StatusTypeDef status; - /* Check the parameters */ - assert_param(IS_DSI_SHORT_WRITE_PACKET_TYPE(Mode)); - - /* Process locked */ - __HAL_LOCK(hdsi); - - status = DSI_ShortWrite(hdsi, ChannelID, Mode, Param1, Param2); - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return status; -} - -/** - * @brief write long DCS or long Generic command - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param ChannelID Virtual channel ID. - * @param Mode DSI long packet data type. - * This parameter can be any value of @arg DSI_LONG_WRITE_PKT_Data_Type. - * @param NbParams Number of parameters. - * @param Param1 DSC command or first generic parameter. - * This parameter can be any value of @arg DSI_DCS_Command or a - * generic command code - * @param ParametersTable Pointer to parameter values table. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_LongWrite(DSI_HandleTypeDef *hdsi, - uint32_t ChannelID, - uint32_t Mode, - uint32_t NbParams, - uint32_t Param1, - const uint8_t *ParametersTable) -{ - uint32_t uicounter; - uint32_t nbBytes; - uint32_t count; - uint32_t tickstart; - uint32_t fifoword; - const uint8_t *pparams = ParametersTable; - - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check the parameters */ - assert_param(IS_DSI_LONG_WRITE_PACKET_TYPE(Mode)); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait for Command FIFO Empty */ - while ((hdsi->Instance->GPSR & DSI_GPSR_CMDFE) == 0U) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - - /* Set the DCS code on payload byte 1, and the other parameters on the write FIFO command*/ - fifoword = Param1; - nbBytes = (NbParams < 3U) ? NbParams : 3U; - - for (count = 0U; count < nbBytes; count++) - { - fifoword |= (((uint32_t)(*(pparams + count))) << (8U + (8U * count))); - } - hdsi->Instance->GPDR = fifoword; - - uicounter = NbParams - nbBytes; - pparams += nbBytes; - /* Set the Next parameters on the write FIFO command*/ - while (uicounter != 0U) - { - nbBytes = (uicounter < 4U) ? uicounter : 4U; - fifoword = 0U; - for (count = 0U; count < nbBytes; count++) - { - fifoword |= (((uint32_t)(*(pparams + count))) << (8U * count)); - } - hdsi->Instance->GPDR = fifoword; - - uicounter -= nbBytes; - pparams += nbBytes; - } - - /* Configure the packet to send a long DCS command */ - DSI_ConfigPacketHeader(hdsi->Instance, - ChannelID, - Mode, - ((NbParams + 1U) & 0x00FFU), - (((NbParams + 1U) & 0xFF00U) >> 8U)); - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Read command (DCS or generic) - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param ChannelNbr Virtual channel ID - * @param Array pointer to a buffer to store the payload of a read back operation. - * @param Size Data size to be read (in byte). - * @param Mode DSI read packet data type. - * This parameter can be any value of @arg DSI_SHORT_READ_PKT_Data_Type. - * @param DCSCmd DCS get/read command. - * @param ParametersTable Pointer to parameter values table. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_Read(DSI_HandleTypeDef *hdsi, - uint32_t ChannelNbr, - uint8_t *Array, - uint32_t Size, - uint32_t Mode, - uint32_t DCSCmd, - uint8_t *ParametersTable) -{ - uint32_t tickstart; - uint8_t *pdata = Array; - uint32_t datasize = Size; - uint32_t fifoword; - uint32_t nbbytes; - uint32_t count; - - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check the parameters */ - assert_param(IS_DSI_READ_PACKET_TYPE(Mode)); - - if (datasize > 2U) - { - /* set max return packet size */ - if (DSI_ShortWrite(hdsi, ChannelNbr, DSI_MAX_RETURN_PKT_SIZE, ((datasize) & 0xFFU), - (((datasize) >> 8U) & 0xFFU)) != HAL_OK) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - } - - /* Configure the packet to read command */ - if (Mode == DSI_DCS_SHORT_PKT_READ) - { - DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, DCSCmd, 0U); - } - else if (Mode == DSI_GEN_SHORT_PKT_READ_P0) - { - DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, 0U, 0U); - } - else if (Mode == DSI_GEN_SHORT_PKT_READ_P1) - { - DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, ParametersTable[0U], 0U); - } - else if (Mode == DSI_GEN_SHORT_PKT_READ_P2) - { - DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, ParametersTable[0U], ParametersTable[1U]); - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* If DSI fifo is not empty, read requested bytes */ - while (((int32_t)(datasize)) > 0) - { - if ((hdsi->Instance->GPSR & DSI_GPSR_PRDFE) == 0U) - { - fifoword = hdsi->Instance->GPDR; - nbbytes = (datasize < 4U) ? datasize : 4U; - - for (count = 0U; count < nbbytes; count++) - { - *pdata = (uint8_t)(fifoword >> (8U * count)); - pdata++; - datasize--; - } - } - - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - - /* Software workaround to avoid HAL_TIMEOUT when a DSI read command is */ - /* issued to the panel and the read data is not captured by the DSI Host */ - /* which returns Packet Size Error. */ - /* Need to ensure that the Read command has finished before checking PSE */ - if ((hdsi->Instance->GPSR & DSI_GPSR_RCB) == 0U) - { - if ((hdsi->Instance->ISR[1U] & DSI_ISR1_PSE) == DSI_ISR1_PSE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - } - } - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Enter the ULPM (Ultra Low Power Mode) with the D-PHY PLL running - * (only data lanes are in ULPM) - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_EnterULPMData(DSI_HandleTypeDef *hdsi) -{ - uint32_t tickstart; - - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Verify the initial status of the DSI Host */ - - /* Verify that the clock lane and the digital section of the D-PHY are enabled */ - if ((hdsi->Instance->PCTLR & (DSI_PCTLR_CKE | DSI_PCTLR_DEN)) != (DSI_PCTLR_CKE | DSI_PCTLR_DEN)) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - - /* Verify that the D-PHY PLL and the reference bias are enabled */ - if ((hdsi->Instance->WRPCR & DSI_WRPCR_PLLEN) != DSI_WRPCR_PLLEN) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - else if ((hdsi->Instance->WRPCR & DSI_WRPCR_REGEN) != DSI_WRPCR_REGEN) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - else - { - /* Nothing to do */ - } - - /* Verify that there are no ULPS exit or request on data lanes */ - if ((hdsi->Instance->PUCR & (DSI_PUCR_UEDL | DSI_PUCR_URDL)) != 0U) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - - /* Verify that there are no Transmission trigger */ - if ((hdsi->Instance->PTTCR & DSI_PTTCR_TX_TRIG) != 0U) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - - /* Requires min of 400us delay before reading the PLLLS flag */ - /* 1ms delay is inserted that is the minimum HAL delay granularity */ - HAL_Delay(1); - - /* Verify that D-PHY PLL is locked */ - tickstart = HAL_GetTick(); - - while ((__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U)) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - - /* Verify that all active lanes are in Stop state */ - if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE) - { - if ((hdsi->Instance->PSR & DSI_PSR_UAN0) != DSI_PSR_UAN0) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - } - else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES) - { - if ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != (DSI_PSR_UAN0 | DSI_PSR_UAN1)) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - - /* ULPS Request on Data Lanes */ - hdsi->Instance->PUCR |= DSI_PUCR_URDL; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait until the D-PHY active lanes enter into ULPM */ - if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE) - { - while ((hdsi->Instance->PSR & DSI_PSR_UAN0) != 0U) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - } - else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES) - { - while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != 0U) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Exit the ULPM (Ultra Low Power Mode) with the D-PHY PLL running - * (only data lanes are in ULPM) - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_ExitULPMData(DSI_HandleTypeDef *hdsi) -{ - uint32_t tickstart; - - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Verify that all active lanes are in ULPM */ - if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE) - { - if ((hdsi->Instance->PSR & DSI_PSR_UAN0) != 0U) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - } - else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES) - { - if ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != 0U) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - - /* Turn on the DSI PLL */ - __HAL_DSI_PLL_ENABLE(hdsi); - - /* Requires min of 400us delay before reading the PLLLS flag */ - /* 1ms delay is inserted that is the minimum HAL delay granularity */ - HAL_Delay(1); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait for the lock of the PLL */ - while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - - /* Exit ULPS on Data Lanes */ - hdsi->Instance->PUCR |= DSI_PUCR_UEDL; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait until all active lanes exit ULPM */ - if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE) - { - while ((hdsi->Instance->PSR & DSI_PSR_UAN0) != DSI_PSR_UAN0) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - } - else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES) - { - while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != (DSI_PSR_UAN0 | DSI_PSR_UAN1)) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - - /* wait for 1 ms*/ - HAL_Delay(1U); - - /* De-assert the ULPM requests and the ULPM exit bits */ - hdsi->Instance->PUCR = 0U; - - /* Verify that D-PHY PLL is enabled */ - if ((hdsi->Instance->WRPCR & DSI_WRPCR_PLLEN) != DSI_WRPCR_PLLEN) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - - /* Verify that all active lanes are in Stop state */ - if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE) - { - if ((hdsi->Instance->PSR & DSI_PSR_UAN0) != DSI_PSR_UAN0) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - } - else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES) - { - if ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != (DSI_PSR_UAN0 | DSI_PSR_UAN1)) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - - /* Verify that D-PHY PLL is locked */ - /* Requires min of 400us delay before reading the PLLLS flag */ - /* 1ms delay is inserted that is the minimum HAL delay granularity */ - HAL_Delay(1); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait for the lock of the PLL */ - while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Enter the ULPM (Ultra Low Power Mode) with the D-PHY PLL turned off - * (both data and clock lanes are in ULPM) - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_EnterULPM(DSI_HandleTypeDef *hdsi) -{ - uint32_t tickstart; - - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Verify the initial status of the DSI Host */ - - /* Verify that the clock lane and the digital section of the D-PHY are enabled */ - if ((hdsi->Instance->PCTLR & (DSI_PCTLR_CKE | DSI_PCTLR_DEN)) != (DSI_PCTLR_CKE | DSI_PCTLR_DEN)) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - - /* Verify that the D-PHY PLL and the reference bias are enabled */ - if ((hdsi->Instance->WRPCR & DSI_WRPCR_PLLEN) != DSI_WRPCR_PLLEN) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - else if ((hdsi->Instance->WRPCR & DSI_WRPCR_REGEN) != DSI_WRPCR_REGEN) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - else - { - /* Nothing to do */ - } - - /* Verify that there are no ULPS exit or request on both data and clock lanes */ - if ((hdsi->Instance->PUCR & (DSI_PUCR_UEDL | DSI_PUCR_URDL | DSI_PUCR_UECL | DSI_PUCR_URCL)) != 0U) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - - /* Verify that there are no Transmission trigger */ - if ((hdsi->Instance->PTTCR & DSI_PTTCR_TX_TRIG) != 0U) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - - /* Requires min of 400us delay before reading the PLLLS flag */ - /* 1ms delay is inserted that is the minimum HAL delay granularity */ - HAL_Delay(1); - - /* Verify that D-PHY PLL is locked */ - tickstart = HAL_GetTick(); - - while ((__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U)) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - - /* Verify that all active lanes are in Stop state */ - if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE) - { - if ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_PSS0)) != (DSI_PSR_UAN0 | DSI_PSR_PSS0)) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - } - else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES) - { - if ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_PSS0 | DSI_PSR_PSS1 | \ - DSI_PSR_UAN1)) != (DSI_PSR_UAN0 | DSI_PSR_PSS0 | DSI_PSR_PSS1 | DSI_PSR_UAN1)) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - - /* Clock lane configuration: no more HS request */ - hdsi->Instance->CLCR &= ~DSI_CLCR_DPCC; - - /* Use system PLL as byte lane clock source before stopping DSIPHY clock source */ - __HAL_RCC_DSI_CONFIG(RCC_DSICLKSOURCE_PLLR); - - /* ULPS Request on Clock and Data Lanes */ - hdsi->Instance->PUCR |= (DSI_PUCR_URCL | DSI_PUCR_URDL); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait until all active lanes enter ULPM */ - if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE) - { - while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UANC)) != 0U) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - } - else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES) - { - while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1 | DSI_PSR_UANC)) != 0U) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - - /* Turn off the DSI PLL */ - __HAL_DSI_PLL_DISABLE(hdsi); - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Exit the ULPM (Ultra Low Power Mode) with the D-PHY PLL turned off - * (both data and clock lanes are in ULPM) - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_ExitULPM(DSI_HandleTypeDef *hdsi) -{ - uint32_t tickstart; - - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Verify that all active lanes are in ULPM */ - if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE) - { - if ((hdsi->Instance->PSR & (DSI_PSR_RUE0 | DSI_PSR_UAN0 | DSI_PSR_PSS0 | \ - DSI_PSR_UANC | DSI_PSR_PSSC | DSI_PSR_PD)) != 0U) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - } - else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES) - { - if ((hdsi->Instance->PSR & (DSI_PSR_RUE0 | DSI_PSR_UAN0 | DSI_PSR_PSS0 | DSI_PSR_UAN1 | \ - DSI_PSR_PSS1 | DSI_PSR_UANC | DSI_PSR_PSSC | DSI_PSR_PD)) != 0U) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - - /* Turn on the DSI PLL */ - __HAL_DSI_PLL_ENABLE(hdsi); - - /* Requires min of 400us delay before reading the PLLLS flag */ - /* 1ms delay is inserted that is the minimum HAL delay granularity */ - HAL_Delay(1); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait for the lock of the PLL */ - while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - - /* Exit ULPS on Clock and Data Lanes */ - hdsi->Instance->PUCR |= (DSI_PUCR_UECL | DSI_PUCR_UEDL); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait until all active lanes exit ULPM */ - if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE) - { - while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UANC)) != (DSI_PSR_UAN0 | DSI_PSR_UANC)) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - } - else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES) - { - while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1 | DSI_PSR_UANC)) != (DSI_PSR_UAN0 | DSI_PSR_UAN1 | - DSI_PSR_UANC)) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - - /* wait for 1 ms */ - HAL_Delay(1U); - - /* De-assert the ULPM requests and the ULPM exit bits */ - hdsi->Instance->PUCR = 0U; - - /* Switch the lane byte clock source in the RCC from system PLL to D-PHY */ - __HAL_RCC_DSI_CONFIG(RCC_DSICLKSOURCE_DSIPHY); - - /* Restore clock lane configuration to HS */ - hdsi->Instance->CLCR |= DSI_CLCR_DPCC; - - /* Verify that D-PHY PLL is enabled */ - if ((hdsi->Instance->WRPCR & DSI_WRPCR_PLLEN) != DSI_WRPCR_PLLEN) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - - /* Verify that all active lanes are in Stop state */ - if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE) - { - if ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_PSS0)) != (DSI_PSR_UAN0 | DSI_PSR_PSS0)) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - } - else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES) - { - if ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_PSS0 | DSI_PSR_PSS1 | \ - DSI_PSR_UAN1)) != (DSI_PSR_UAN0 | DSI_PSR_PSS0 | DSI_PSR_PSS1 | DSI_PSR_UAN1)) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - return HAL_ERROR; - } - - /* Verify that D-PHY PLL is locked */ - /* Requires min of 400us delay before reading the PLLLS flag */ - /* 1ms delay is inserted that is the minimum HAL delay granularity */ - HAL_Delay(1); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait for the lock of the PLL */ - while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_TIMEOUT; - } - } - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Start test pattern generation - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param Mode Pattern generator mode - * This parameter can be one of the following values: - * 0 : Color bars (horizontal or vertical) - * 1 : BER pattern (vertical only) - * @param Orientation Pattern generator orientation - * This parameter can be one of the following values: - * 0 : Vertical color bars - * 1 : Horizontal color bars - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_PatternGeneratorStart(DSI_HandleTypeDef *hdsi, uint32_t Mode, uint32_t Orientation) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Configure pattern generator mode and orientation */ - hdsi->Instance->VMCR &= ~(DSI_VMCR_PGM | DSI_VMCR_PGO); - hdsi->Instance->VMCR |= ((Mode << 20U) | (Orientation << 24U)); - - /* Enable pattern generator by setting PGE bit */ - hdsi->Instance->VMCR |= DSI_VMCR_PGE; - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Stop test pattern generation - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_PatternGeneratorStop(DSI_HandleTypeDef *hdsi) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Disable pattern generator by clearing PGE bit */ - hdsi->Instance->VMCR &= ~DSI_VMCR_PGE; - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Set Slew-Rate And Delay Tuning - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param CommDelay Communication delay to be adjusted. - * This parameter can be any value of @arg DSI_Communication_Delay - * @param Lane select between clock or data lanes. - * This parameter can be any value of @arg DSI_Lane_Group - * @param Value Custom value of the slew-rate or delay - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_SetSlewRateAndDelayTuning(DSI_HandleTypeDef *hdsi, uint32_t CommDelay, uint32_t Lane, - uint32_t Value) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check function parameters */ - assert_param(IS_DSI_COMMUNICATION_DELAY(CommDelay)); - assert_param(IS_DSI_LANE_GROUP(Lane)); - - switch (CommDelay) - { - case DSI_SLEW_RATE_HSTX: - if (Lane == DSI_CLOCK_LANE) - { - /* High-Speed Transmission Slew Rate Control on Clock Lane */ - hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXSRCCL; - hdsi->Instance->WPCR[1U] |= Value << 16U; - } - else if (Lane == DSI_DATA_LANES) - { - /* High-Speed Transmission Slew Rate Control on Data Lanes */ - hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXSRCDL; - hdsi->Instance->WPCR[1U] |= Value << 18U; - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - break; - case DSI_SLEW_RATE_LPTX: - if (Lane == DSI_CLOCK_LANE) - { - /* Low-Power transmission Slew Rate Compensation on Clock Lane */ - hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_LPSRCCL; - hdsi->Instance->WPCR[1U] |= Value << 6U; - } - else if (Lane == DSI_DATA_LANES) - { - /* Low-Power transmission Slew Rate Compensation on Data Lanes */ - hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_LPSRCDL; - hdsi->Instance->WPCR[1U] |= Value << 8U; - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - break; - case DSI_HS_DELAY: - if (Lane == DSI_CLOCK_LANE) - { - /* High-Speed Transmission Delay on Clock Lane */ - hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXDCL; - hdsi->Instance->WPCR[1U] |= Value; - } - else if (Lane == DSI_DATA_LANES) - { - /* High-Speed Transmission Delay on Data Lanes */ - hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXDDL; - hdsi->Instance->WPCR[1U] |= Value << 2U; - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - break; - default: - break; - } - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Low-Power Reception Filter Tuning - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param Frequency cutoff frequency of low-pass filter at the input of LPRX - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_SetLowPowerRXFilter(DSI_HandleTypeDef *hdsi, uint32_t Frequency) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Low-Power RX low-pass Filtering Tuning */ - hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_LPRXFT; - hdsi->Instance->WPCR[1U] |= Frequency << 25U; - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Activate an additional current path on all lanes to meet the SDDTx parameter - * defined in the MIPI D-PHY specification - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param State ENABLE or DISABLE - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_SetSDD(DSI_HandleTypeDef *hdsi, FunctionalState State) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check function parameters */ - assert_param(IS_FUNCTIONAL_STATE(State)); - - /* Activate/Disactivate additional current path on all lanes */ - hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_SDDC; - hdsi->Instance->WPCR[1U] |= ((uint32_t)State << 12U); - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Custom lane pins configuration - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param CustomLane Function to be applied on selected lane. - * This parameter can be any value of @arg DSI_CustomLane - * @param Lane select between clock or data lane 0 or data lane 1. - * This parameter can be any value of @arg DSI_Lane_Select - * @param State ENABLE or DISABLE - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_SetLanePinsConfiguration(DSI_HandleTypeDef *hdsi, uint32_t CustomLane, uint32_t Lane, - FunctionalState State) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check function parameters */ - assert_param(IS_DSI_CUSTOM_LANE(CustomLane)); - assert_param(IS_DSI_LANE(Lane)); - assert_param(IS_FUNCTIONAL_STATE(State)); - - switch (CustomLane) - { - case DSI_SWAP_LANE_PINS: - if (Lane == DSI_CLK_LANE) - { - /* Swap pins on clock lane */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_SWCL; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 6U); - } - else if (Lane == DSI_DATA_LANE0) - { - /* Swap pins on data lane 0 */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_SWDL0; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 7U); - } - else if (Lane == DSI_DATA_LANE1) - { - /* Swap pins on data lane 1 */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_SWDL1; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 8U); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - break; - case DSI_INVERT_HS_SIGNAL: - if (Lane == DSI_CLK_LANE) - { - /* Invert HS signal on clock lane */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_HSICL; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 9U); - } - else if (Lane == DSI_DATA_LANE0) - { - /* Invert HS signal on data lane 0 */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_HSIDL0; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 10U); - } - else if (Lane == DSI_DATA_LANE1) - { - /* Invert HS signal on data lane 1 */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_HSIDL1; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 11U); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - break; - default: - break; - } - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Set custom timing for the PHY - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param Timing PHY timing to be adjusted. - * This parameter can be any value of @arg DSI_PHY_Timing - * @param State ENABLE or DISABLE - * @param Value Custom value of the timing - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_SetPHYTimings(DSI_HandleTypeDef *hdsi, uint32_t Timing, FunctionalState State, uint32_t Value) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check function parameters */ - assert_param(IS_DSI_PHY_TIMING(Timing)); - assert_param(IS_FUNCTIONAL_STATE(State)); - - switch (Timing) - { - case DSI_TCLK_POST: - /* Enable/Disable custom timing setting */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TCLKPOSTEN; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 27U); - - if (State != DISABLE) - { - /* Set custom value */ - hdsi->Instance->WPCR[4U] &= ~DSI_WPCR4_TCLKPOST; - hdsi->Instance->WPCR[4U] |= Value & DSI_WPCR4_TCLKPOST; - } - - break; - case DSI_TLPX_CLK: - /* Enable/Disable custom timing setting */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TLPXCEN; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 26U); - - if (State != DISABLE) - { - /* Set custom value */ - hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_TLPXC; - hdsi->Instance->WPCR[3U] |= (Value << 24U) & DSI_WPCR3_TLPXC; - } - - break; - case DSI_THS_EXIT: - /* Enable/Disable custom timing setting */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSEXITEN; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 25U); - - if (State != DISABLE) - { - /* Set custom value */ - hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_THSEXIT; - hdsi->Instance->WPCR[3U] |= (Value << 16U) & DSI_WPCR3_THSEXIT; - } - - break; - case DSI_TLPX_DATA: - /* Enable/Disable custom timing setting */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TLPXDEN; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 24U); - - if (State != DISABLE) - { - /* Set custom value */ - hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_TLPXD; - hdsi->Instance->WPCR[3U] |= (Value << 8U) & DSI_WPCR3_TLPXD; - } - - break; - case DSI_THS_ZERO: - /* Enable/Disable custom timing setting */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSZEROEN; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 23U); - - if (State != DISABLE) - { - /* Set custom value */ - hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_THSZERO; - hdsi->Instance->WPCR[3U] |= Value & DSI_WPCR3_THSZERO; - } - - break; - case DSI_THS_TRAIL: - /* Enable/Disable custom timing setting */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSTRAILEN; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 22U); - - if (State != DISABLE) - { - /* Set custom value */ - hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_THSTRAIL; - hdsi->Instance->WPCR[2U] |= (Value << 24U) & DSI_WPCR2_THSTRAIL; - } - - break; - case DSI_THS_PREPARE: - /* Enable/Disable custom timing setting */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSPREPEN; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 21U); - - if (State != DISABLE) - { - /* Set custom value */ - hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_THSPREP; - hdsi->Instance->WPCR[2U] |= (Value << 16U) & DSI_WPCR2_THSPREP; - } - - break; - case DSI_TCLK_ZERO: - /* Enable/Disable custom timing setting */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TCLKZEROEN; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 20U); - - if (State != DISABLE) - { - /* Set custom value */ - hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_TCLKZERO; - hdsi->Instance->WPCR[2U] |= (Value << 8U) & DSI_WPCR2_TCLKZERO; - } - - break; - case DSI_TCLK_PREPARE: - /* Enable/Disable custom timing setting */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TCLKPREPEN; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 19U); - - if (State != DISABLE) - { - /* Set custom value */ - hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_TCLKPREP; - hdsi->Instance->WPCR[2U] |= Value & DSI_WPCR2_TCLKPREP; - } - - break; - default: - break; - } - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Force the Clock/Data Lane in TX Stop Mode - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param Lane select between clock or data lanes. - * This parameter can be any value of @arg DSI_Lane_Group - * @param State ENABLE or DISABLE - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_ForceTXStopMode(DSI_HandleTypeDef *hdsi, uint32_t Lane, FunctionalState State) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check function parameters */ - assert_param(IS_DSI_LANE_GROUP(Lane)); - assert_param(IS_FUNCTIONAL_STATE(State)); - - if (Lane == DSI_CLOCK_LANE) - { - /* Force/Unforce the Clock Lane in TX Stop Mode */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_FTXSMCL; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 12U); - } - else if (Lane == DSI_DATA_LANES) - { - /* Force/Unforce the Data Lanes in TX Stop Mode */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_FTXSMDL; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 13U); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_ERROR; - } - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Force LP Receiver in Low-Power Mode - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param State ENABLE or DISABLE - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_ForceRXLowPower(DSI_HandleTypeDef *hdsi, FunctionalState State) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check function parameters */ - assert_param(IS_FUNCTIONAL_STATE(State)); - - /* Force/Unforce LP Receiver in Low-Power Mode */ - hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_FLPRXLPM; - hdsi->Instance->WPCR[1U] |= ((uint32_t)State << 22U); - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Force Data Lanes in RX Mode after a BTA - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param State ENABLE or DISABLE - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_ForceDataLanesInRX(DSI_HandleTypeDef *hdsi, FunctionalState State) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check function parameters */ - assert_param(IS_FUNCTIONAL_STATE(State)); - - /* Force Data Lanes in RX Mode */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TDDL; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 16U); - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Enable a pull-down on the lanes to prevent from floating states when unused - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param State ENABLE or DISABLE - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_SetPullDown(DSI_HandleTypeDef *hdsi, FunctionalState State) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check function parameters */ - assert_param(IS_FUNCTIONAL_STATE(State)); - - /* Enable/Disable pull-down on lanes */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_PDEN; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 18U); - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @brief Switch off the contention detection on data lanes - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @param State ENABLE or DISABLE - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DSI_SetContentionDetectionOff(DSI_HandleTypeDef *hdsi, FunctionalState State) -{ - /* Process locked */ - __HAL_LOCK(hdsi); - - /* Check function parameters */ - assert_param(IS_FUNCTIONAL_STATE(State)); - - /* Contention Detection on Data Lanes OFF */ - hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_CDOFFDL; - hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 14U); - - /* Process unlocked */ - __HAL_UNLOCK(hdsi); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup DSI_Group4 Peripheral State and Errors functions - * @brief Peripheral State and Errors functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides functions allowing to - (+) Check the DSI state. - (+) Get error code. - -@endverbatim - * @{ - */ - -/** - * @brief Return the DSI state - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval HAL state - */ -HAL_DSI_StateTypeDef HAL_DSI_GetState(const DSI_HandleTypeDef *hdsi) -{ - return hdsi->State; -} - -/** - * @brief Return the DSI error code - * @param hdsi pointer to a DSI_HandleTypeDef structure that contains - * the configuration information for the DSI. - * @retval DSI Error Code - */ -uint32_t HAL_DSI_GetError(const DSI_HandleTypeDef *hdsi) -{ - /* Get the error code */ - return hdsi->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* DSI */ - -#endif /* HAL_DSI_MODULE_ENABLED */ - -/** - * @} - */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c deleted file mode 100644 index 3e46312..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c +++ /dev/null @@ -1,553 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_exti.c - * @author MCD Application Team - * @brief EXTI HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Extended Interrupts and events controller (EXTI) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2018 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### EXTI Peripheral features ##### - ============================================================================== - [..] - (+) Each Exti line can be configured within this driver. - - (+) Exti line can be configured in 3 different modes - (++) Interrupt - (++) Event - (++) Both of them - - (+) Configurable Exti lines can be configured with 3 different triggers - (++) Rising - (++) Falling - (++) Both of them - - (+) When set in interrupt mode, configurable Exti lines have two different - interrupts pending registers which allow to distinguish which transition - occurs: - (++) Rising edge pending interrupt - (++) Falling - - (+) Exti lines 0 to 15 are linked to gpio pin number 0 to 15. Gpio port can - be selected through multiplexer. - - ##### How to use this driver ##### - ============================================================================== - [..] - - (#) Configure the EXTI line using HAL_EXTI_SetConfigLine(). - (++) Choose the interrupt line number by setting "Line" member from - EXTI_ConfigTypeDef structure. - (++) Configure the interrupt and/or event mode using "Mode" member from - EXTI_ConfigTypeDef structure. - (++) For configurable lines, configure rising and/or falling trigger - "Trigger" member from EXTI_ConfigTypeDef structure. - (++) For Exti lines linked to gpio, choose gpio port using "GPIOSel" - member from GPIO_InitTypeDef structure. - - (#) Get current Exti configuration of a dedicated line using - HAL_EXTI_GetConfigLine(). - (++) Provide exiting handle as parameter. - (++) Provide pointer on EXTI_ConfigTypeDef structure as second parameter. - - (#) Clear Exti configuration of a dedicated line using HAL_EXTI_ClearConfigLine(). - (++) Provide exiting handle as parameter. - - (#) Register callback to treat Exti interrupts using HAL_EXTI_RegisterCallback(). - (++) Provide exiting handle as first parameter. - (++) Provide which callback will be registered using one value from - EXTI_CallbackIDTypeDef. - (++) Provide callback function pointer. - - (#) Get interrupt pending bit using HAL_EXTI_GetPending(). - - (#) Clear interrupt pending bit using HAL_EXTI_ClearPending(). - - (#) Generate software interrupt using HAL_EXTI_GenerateSWI(). - - @endverbatim - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup EXTI - * @{ - */ -/** MISRA C:2012 deviation rule has been granted for following rule: - * Rule-18.1_b - Medium: Array `EXTICR' 1st subscript interval [0,7] may be out - * of bounds [0,3] in following API : - * HAL_EXTI_SetConfigLine - * HAL_EXTI_GetConfigLine - * HAL_EXTI_ClearConfigLine - */ - -#ifdef HAL_EXTI_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private defines -----------------------------------------------------------*/ -/** @defgroup EXTI_Private_Constants EXTI Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @addtogroup EXTI_Exported_Functions - * @{ - */ - -/** @addtogroup EXTI_Exported_Functions_Group1 - * @brief Configuration functions - * -@verbatim - =============================================================================== - ##### Configuration functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Set configuration of a dedicated Exti line. - * @param hexti Exti handle. - * @param pExtiConfig Pointer on EXTI configuration to be set. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check null pointer */ - if ((hexti == NULL) || (pExtiConfig == NULL)) - { - return HAL_ERROR; - } - - /* Check parameters */ - assert_param(IS_EXTI_LINE(pExtiConfig->Line)); - assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); - - /* Assign line number to handle */ - hexti->Line = pExtiConfig->Line; - - /* Compute line mask */ - linepos = (pExtiConfig->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* Configure triggers for configurable lines */ - if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) - { - assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); - - /* Configure rising trigger */ - /* Mask or set line */ - if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) - { - EXTI->RTSR |= maskline; - } - else - { - EXTI->RTSR &= ~maskline; - } - - /* Configure falling trigger */ - /* Mask or set line */ - if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) - { - EXTI->FTSR |= maskline; - } - else - { - EXTI->FTSR &= ~maskline; - } - - - /* Configure gpio port selection in case of gpio exti line */ - if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) - { - assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); - assert_param(IS_EXTI_GPIO_PIN(linepos)); - - regval = SYSCFG->EXTICR[linepos >> 2u]; - regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); - regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); - SYSCFG->EXTICR[linepos >> 2u] = regval; - } - } - - /* Configure interrupt mode : read current mode */ - /* Mask or set line */ - if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) - { - EXTI->IMR |= maskline; - } - else - { - EXTI->IMR &= ~maskline; - } - - /* Configure event mode : read current mode */ - /* Mask or set line */ - if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) - { - EXTI->EMR |= maskline; - } - else - { - EXTI->EMR &= ~maskline; - } - - return HAL_OK; -} - -/** - * @brief Get configuration of a dedicated Exti line. - * @param hexti Exti handle. - * @param pExtiConfig Pointer on structure to store Exti configuration. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check null pointer */ - if ((hexti == NULL) || (pExtiConfig == NULL)) - { - return HAL_ERROR; - } - - /* Check the parameter */ - assert_param(IS_EXTI_LINE(hexti->Line)); - - /* Store handle line number to configuration structure */ - pExtiConfig->Line = hexti->Line; - - /* Compute line mask */ - linepos = (pExtiConfig->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* 1] Get core mode : interrupt */ - - /* Check if selected line is enable */ - if ((EXTI->IMR & maskline) != 0x00u) - { - pExtiConfig->Mode = EXTI_MODE_INTERRUPT; - } - else - { - pExtiConfig->Mode = EXTI_MODE_NONE; - } - - /* Get event mode */ - /* Check if selected line is enable */ - if ((EXTI->EMR & maskline) != 0x00u) - { - pExtiConfig->Mode |= EXTI_MODE_EVENT; - } - - /* Get default Trigger and GPIOSel configuration */ - pExtiConfig->Trigger = EXTI_TRIGGER_NONE; - pExtiConfig->GPIOSel = 0x00u; - - /* 2] Get trigger for configurable lines : rising */ - if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) - { - /* Check if configuration of selected line is enable */ - if ((EXTI->RTSR & maskline) != 0x00u) - { - pExtiConfig->Trigger = EXTI_TRIGGER_RISING; - } - - /* Get falling configuration */ - /* Check if configuration of selected line is enable */ - if ((EXTI->FTSR & maskline) != 0x00u) - { - pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; - } - - /* Get Gpio port selection for gpio lines */ - if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) - { - assert_param(IS_EXTI_GPIO_PIN(linepos)); - - regval = SYSCFG->EXTICR[linepos >> 2u]; - pExtiConfig->GPIOSel = (regval >> (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))) & SYSCFG_EXTICR1_EXTI0; - } - } - - return HAL_OK; -} - -/** - * @brief Clear whole configuration of a dedicated Exti line. - * @param hexti Exti handle. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check null pointer */ - if (hexti == NULL) - { - return HAL_ERROR; - } - - /* Check the parameter */ - assert_param(IS_EXTI_LINE(hexti->Line)); - - /* compute line mask */ - linepos = (hexti->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* 1] Clear interrupt mode */ - EXTI->IMR = (EXTI->IMR & ~maskline); - - /* 2] Clear event mode */ - EXTI->EMR = (EXTI->EMR & ~maskline); - - /* 3] Clear triggers in case of configurable lines */ - if ((hexti->Line & EXTI_CONFIG) != 0x00u) - { - EXTI->RTSR = (EXTI->RTSR & ~maskline); - EXTI->FTSR = (EXTI->FTSR & ~maskline); - - /* Get Gpio port selection for gpio lines */ - if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) - { - assert_param(IS_EXTI_GPIO_PIN(linepos)); - - regval = SYSCFG->EXTICR[linepos >> 2u]; - regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); - SYSCFG->EXTICR[linepos >> 2u] = regval; - } - } - - return HAL_OK; -} - -/** - * @brief Register callback for a dedicated Exti line. - * @param hexti Exti handle. - * @param CallbackID User callback identifier. - * This parameter can be one of @arg @ref EXTI_CallbackIDTypeDef values. - * @param pPendingCbfn function pointer to be stored as callback. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)) -{ - HAL_StatusTypeDef status = HAL_OK; - - switch (CallbackID) - { - case HAL_EXTI_COMMON_CB_ID: - hexti->PendingCallback = pPendingCbfn; - break; - - default: - status = HAL_ERROR; - break; - } - - return status; -} - -/** - * @brief Store line number as handle private field. - * @param hexti Exti handle. - * @param ExtiLine Exti line number. - * This parameter can be from 0 to @ref EXTI_LINE_NB. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine) -{ - /* Check the parameters */ - assert_param(IS_EXTI_LINE(ExtiLine)); - - /* Check null pointer */ - if (hexti == NULL) - { - return HAL_ERROR; - } - else - { - /* Store line number as handle private field */ - hexti->Line = ExtiLine; - - return HAL_OK; - } -} - -/** - * @} - */ - -/** @addtogroup EXTI_Exported_Functions_Group2 - * @brief EXTI IO functions. - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Handle EXTI interrupt request. - * @param hexti Exti handle. - * @retval none. - */ -void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) -{ - uint32_t regval; - uint32_t maskline; - - /* Compute line mask */ - maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); - - /* Get pending bit */ - regval = (EXTI->PR & maskline); - if (regval != 0x00u) - { - /* Clear pending bit */ - EXTI->PR = maskline; - - /* Call callback */ - if (hexti->PendingCallback != NULL) - { - hexti->PendingCallback(); - } - } -} - -/** - * @brief Get interrupt pending bit of a dedicated line. - * @param hexti Exti handle. - * @param Edge Specify which pending edge as to be checked. - * This parameter can be one of the following values: - * @arg @ref EXTI_TRIGGER_RISING_FALLING - * This parameter is kept for compatibility with other series. - * @retval 1 if interrupt is pending else 0. - */ -uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Prevent unused argument(s) compilation warning */ - UNUSED(Edge); - - /* Check parameters */ - assert_param(IS_EXTI_LINE(hexti->Line)); - assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - assert_param(IS_EXTI_PENDING_EDGE(Edge)); - - /* Compute line mask */ - linepos = (hexti->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* return 1 if bit is set else 0 */ - regval = ((EXTI->PR & maskline) >> linepos); - return regval; -} - -/** - * @brief Clear interrupt pending bit of a dedicated line. - * @param hexti Exti handle. - * @param Edge Specify which pending edge as to be clear. - * This parameter can be one of the following values: - * @arg @ref EXTI_TRIGGER_RISING_FALLING - * This parameter is kept for compatibility with other series. - * @retval None. - */ -void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) -{ - uint32_t maskline; - - /* Prevent unused argument(s) compilation warning */ - UNUSED(Edge); - - /* Check parameters */ - assert_param(IS_EXTI_LINE(hexti->Line)); - assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - assert_param(IS_EXTI_PENDING_EDGE(Edge)); - - /* Compute line mask */ - maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); - - /* Clear Pending bit */ - EXTI->PR = maskline; -} - -/** - * @brief Generate a software interrupt for a dedicated line. - * @param hexti Exti handle. - * @retval None. - */ -void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) -{ - uint32_t maskline; - - /* Check parameters */ - assert_param(IS_EXTI_LINE(hexti->Line)); - assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - - /* Compute line mask */ - maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); - - /* Generate Software interrupt */ - EXTI->SWIER = maskline; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_EXTI_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c deleted file mode 100644 index 808949e..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c +++ /dev/null @@ -1,776 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash.c - * @author MCD Application Team - * @brief FLASH HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the internal FLASH memory: - * + Program operations functions - * + Memory Control functions - * + Peripheral Errors functions - * - @verbatim - ============================================================================== - ##### FLASH peripheral features ##### - ============================================================================== - - [..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses - to the Flash memory. It implements the erase and program Flash memory operations - and the read and write protection mechanisms. - - [..] The Flash memory interface accelerates code execution with a system of instruction - prefetch and cache lines. - - [..] The FLASH main features are: - (+) Flash memory read operations - (+) Flash memory program/erase operations - (+) Read / write protections - (+) Prefetch on I-Code - (+) 64 cache lines of 128 bits on I-Code - (+) 8 cache lines of 128 bits on D-Code - - - ##### How to use this driver ##### - ============================================================================== - [..] - This driver provides functions and macros to configure and program the FLASH - memory of all STM32F4xx devices. - - (#) FLASH Memory IO Programming functions: - (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and - HAL_FLASH_Lock() functions - (++) Program functions: byte, half word, word and double word - (++) There Two modes of programming : - (+++) Polling mode using HAL_FLASH_Program() function - (+++) Interrupt mode using HAL_FLASH_Program_IT() function - - (#) Interrupts and flags management functions : - (++) Handle FLASH interrupts by calling HAL_FLASH_IRQHandler() - (++) Wait for last FLASH operation according to its status - (++) Get error flag status by calling HAL_SetErrorCode() - - [..] - In addition to these functions, this driver includes a set of macros allowing - to handle the following operations: - (+) Set the latency - (+) Enable/Disable the prefetch buffer - (+) Enable/Disable the Instruction cache and the Data cache - (+) Reset the Instruction cache and the Data cache - (+) Enable/Disable the FLASH interrupts - (+) Monitor the FLASH flags status - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup FLASH FLASH - * @brief FLASH HAL module driver - * @{ - */ - -#ifdef HAL_FLASH_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup FLASH_Private_Constants - * @{ - */ -#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup FLASH_Private_Variables - * @{ - */ -/* Variable used for Erase sectors under interruption */ -FLASH_ProcessTypeDef pFlash = {.ProcedureOnGoing = FLASH_PROC_NONE, - .NbSectorsToErase = 0U, - .VoltageForErase= FLASH_VOLTAGE_RANGE_1, - .Sector = 0U, - .Bank = FLASH_BANK_1, - .Address = 0U, - .Lock = HAL_UNLOCKED, - .ErrorCode = HAL_FLASH_ERROR_NONE}; -/** - * @} - */ - -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup FLASH_Private_Functions - * @{ - */ -/* Program operations */ -static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data); -static void FLASH_Program_Word(uint32_t Address, uint32_t Data); -static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data); -static void FLASH_Program_Byte(uint32_t Address, uint8_t Data); -static void FLASH_SetErrorCode(void); - -HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Functions FLASH Exported Functions - * @{ - */ - -/** @defgroup FLASH_Exported_Functions_Group1 Programming operation functions - * @brief Programming operation functions - * -@verbatim - =============================================================================== - ##### Programming operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the FLASH - program operations. - -@endverbatim - * @{ - */ - -/** - * @brief Program byte, halfword, word or double word at a specified address - * @param TypeProgram Indicate the way to program at a specified address. - * This parameter can be a value of @ref FLASH_Type_Program - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed - * - * @retval HAL_StatusTypeDef HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) -{ - HAL_StatusTypeDef status; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - if (TypeProgram == FLASH_TYPEPROGRAM_BYTE) - { - /*Program byte (8-bit) at a specified address.*/ - FLASH_Program_Byte(Address, (uint8_t) Data); - } - else if (TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) - { - /*Program halfword (16-bit) at a specified address.*/ - FLASH_Program_HalfWord(Address, (uint16_t) Data); - } - else if (TypeProgram == FLASH_TYPEPROGRAM_WORD) - { - /*Program word (32-bit) at a specified address.*/ - FLASH_Program_Word(Address, (uint32_t) Data); - } - else - { - /*Program double word (64-bit) at a specified address.*/ - FLASH_Program_DoubleWord(Address, Data); - } - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - /* If the program operation is completed, disable the PG Bit */ - FLASH->CR &= (~FLASH_CR_PG); - } - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - - return status; -} - -/** - * @brief Program byte, halfword, word or double word at a specified address with interrupt enabled. - * @param TypeProgram Indicate the way to program at a specified address. - * This parameter can be a value of @ref FLASH_Type_Program - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); - - /* Enable End of FLASH Operation interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); - - /* Enable Error source interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); - - pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM; - pFlash.Address = Address; - - if (TypeProgram == FLASH_TYPEPROGRAM_BYTE) - { - /*Program byte (8-bit) at a specified address.*/ - FLASH_Program_Byte(Address, (uint8_t) Data); - } - else if (TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) - { - /*Program halfword (16-bit) at a specified address.*/ - FLASH_Program_HalfWord(Address, (uint16_t) Data); - } - else if (TypeProgram == FLASH_TYPEPROGRAM_WORD) - { - /*Program word (32-bit) at a specified address.*/ - FLASH_Program_Word(Address, (uint32_t) Data); - } - else - { - /*Program double word (64-bit) at a specified address.*/ - FLASH_Program_DoubleWord(Address, Data); - } - - return status; -} - -/** - * @brief This function handles FLASH interrupt request. - * @retval None - */ -void HAL_FLASH_IRQHandler(void) -{ - uint32_t addresstmp = 0U; - - /* Check FLASH operation error flags */ -#if defined(FLASH_SR_RDERR) - if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) -#else - if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) -#endif /* FLASH_SR_RDERR */ - { - if (pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) - { - /*return the faulty sector*/ - addresstmp = pFlash.Sector; - pFlash.Sector = 0xFFFFFFFFU; - } - else if (pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) - { - /*return the faulty bank*/ - addresstmp = pFlash.Bank; - } - else - { - /*return the faulty address*/ - addresstmp = pFlash.Address; - } - - /*Save the Error code*/ - FLASH_SetErrorCode(); - - /* FLASH error interrupt user callback */ - HAL_FLASH_OperationErrorCallback(addresstmp); - - /*Stop the procedure ongoing*/ - pFlash.ProcedureOnGoing = FLASH_PROC_NONE; - } - - /* Check FLASH End of Operation flag */ - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) - { - /* Clear FLASH End of Operation pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); - - if (pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) - { - /*Nb of sector to erased can be decreased*/ - pFlash.NbSectorsToErase--; - - /* Check if there are still sectors to erase*/ - if (pFlash.NbSectorsToErase != 0U) - { - addresstmp = pFlash.Sector; - /*Indicate user which sector has been erased*/ - HAL_FLASH_EndOfOperationCallback(addresstmp); - - /*Increment sector number*/ - pFlash.Sector++; - addresstmp = pFlash.Sector; - FLASH_Erase_Sector(addresstmp, pFlash.VoltageForErase); - } - else - { - /*No more sectors to Erase, user callback can be called.*/ - /*Reset Sector and stop Erase sectors procedure*/ - pFlash.Sector = addresstmp = 0xFFFFFFFFU; - pFlash.ProcedureOnGoing = FLASH_PROC_NONE; - - /* Flush the caches to be sure of the data consistency */ - FLASH_FlushCaches(); - - /* FLASH EOP interrupt user callback */ - HAL_FLASH_EndOfOperationCallback(addresstmp); - } - } - else - { - if (pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) - { - /* MassErase ended. Return the selected bank */ - /* Flush the caches to be sure of the data consistency */ - FLASH_FlushCaches(); - - /* FLASH EOP interrupt user callback */ - HAL_FLASH_EndOfOperationCallback(pFlash.Bank); - } - else - { - /*Program ended. Return the selected address*/ - /* FLASH EOP interrupt user callback */ - HAL_FLASH_EndOfOperationCallback(pFlash.Address); - } - pFlash.ProcedureOnGoing = FLASH_PROC_NONE; - } - } - - if (pFlash.ProcedureOnGoing == FLASH_PROC_NONE) - { - /* Operation is completed, disable the PG, SER, SNB and MER Bits */ - CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_SER | FLASH_CR_SNB | FLASH_MER_BIT)); - - /* Disable End of FLASH Operation interrupt */ - __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP); - - /* Disable Error source interrupt */ - __HAL_FLASH_DISABLE_IT(FLASH_IT_ERR); - } -} - -/** - * @brief FLASH end of operation interrupt callback - * @param ReturnValue The value saved in this parameter depends on the ongoing procedure - * Mass Erase: Bank number which has been requested to erase - * Sectors Erase: Sector which has been erased - * (if 0xFFFFFFFFU, it means that all the selected sectors have been erased) - * Program: Address which was selected for data program - * @retval None - */ -__weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(ReturnValue); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_FLASH_EndOfOperationCallback could be implemented in the user file - */ -} - -/** - * @brief FLASH operation error interrupt callback - * @param ReturnValue The value saved in this parameter depends on the ongoing procedure - * Mass Erase: Bank number which has been requested to erase - * Sectors Erase: Sector number which returned an error - * Program: Address which was selected for data program - * @retval None - */ -__weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(ReturnValue); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_FLASH_OperationErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup FLASH_Exported_Functions_Group2 Peripheral Control functions - * @brief management functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the FLASH - memory operations. - -@endverbatim - * @{ - */ - -/** - * @brief Unlock the FLASH control register access - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Unlock(void) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) - { - /* Authorize the FLASH Registers access */ - WRITE_REG(FLASH->KEYR, FLASH_KEY1); - WRITE_REG(FLASH->KEYR, FLASH_KEY2); - - /* Verify Flash is unlocked */ - if (READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) - { - status = HAL_ERROR; - } - } - - return status; -} - -/** - * @brief Locks the FLASH control register access - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Lock(void) -{ - /* Set the LOCK Bit to lock the FLASH Registers access */ - FLASH->CR |= FLASH_CR_LOCK; - - return HAL_OK; -} - -/** - * @brief Unlock the FLASH Option Control Registers access. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void) -{ - if ((FLASH->OPTCR & FLASH_OPTCR_OPTLOCK) != RESET) - { - /* Authorizes the Option Byte register programming */ - FLASH->OPTKEYR = FLASH_OPT_KEY1; - FLASH->OPTKEYR = FLASH_OPT_KEY2; - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Lock the FLASH Option Control Registers access. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_OB_Lock(void) -{ - /* Set the OPTLOCK Bit to lock the FLASH Option Byte Registers access */ - FLASH->OPTCR |= FLASH_OPTCR_OPTLOCK; - - return HAL_OK; -} - -/** - * @brief Launch the option byte loading. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_OB_Launch(void) -{ - /* Set the OPTSTRT bit in OPTCR register */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT; - - /* Wait for last operation to be completed */ - return (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE)); -} - -/** - * @} - */ - -/** @defgroup FLASH_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief Peripheral Errors functions - * -@verbatim - =============================================================================== - ##### Peripheral Errors functions ##### - =============================================================================== - [..] - This subsection permits to get in run-time Errors of the FLASH peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief Get the specific FLASH error flag. - * @retval FLASH_ErrorCode: The returned value can be a combination of: - * @arg HAL_FLASH_ERROR_RD: FLASH Read Protection error flag (PCROP) - * @arg HAL_FLASH_ERROR_PGS: FLASH Programming Sequence error flag - * @arg HAL_FLASH_ERROR_PGP: FLASH Programming Parallelism error flag - * @arg HAL_FLASH_ERROR_PGA: FLASH Programming Alignment error flag - * @arg HAL_FLASH_ERROR_WRP: FLASH Write protected error flag - * @arg HAL_FLASH_ERROR_OPERATION: FLASH operation Error flag - */ -uint32_t HAL_FLASH_GetError(void) -{ - return pFlash.ErrorCode; -} - -/** - * @} - */ - -/** - * @brief Wait for a FLASH operation to complete. - * @param Timeout maximum flash operationtimeout - * @retval HAL Status - */ -HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) -{ - uint32_t tickstart = 0U; - - /* Clear Error Code */ - pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; - - /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. - Even if the FLASH operation fails, the BUSY flag will be reset and an error - flag will be set */ - /* Get tick */ - tickstart = HAL_GetTick(); - - while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET) - { - if (Timeout != HAL_MAX_DELAY) - { - if ((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout)) - { - return HAL_TIMEOUT; - } - } - } - - /* Check FLASH End of Operation flag */ - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) - { - /* Clear FLASH End of Operation pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); - } -#if defined(FLASH_SR_RDERR) - if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) -#else - if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) -#endif /* FLASH_SR_RDERR */ - { - /*Save the error code*/ - FLASH_SetErrorCode(); - return HAL_ERROR; - } - - /* If there is no error flag set */ - return HAL_OK; - -} - -/** - * @brief Program a double word (64-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.7V to 3.6V and Vpp in the range 7V to 9V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_DOUBLE_WORD; - FLASH->CR |= FLASH_CR_PG; - - /* Program first word */ - *(__IO uint32_t *)Address = (uint32_t)Data; - - /* Barrier to ensure programming is performed in 2 steps, in right order - (independently of compiler optimization behavior) */ - __ISB(); - - /* Program second word */ - *(__IO uint32_t *)(Address + 4) = (uint32_t)(Data >> 32); -} - - -/** - * @brief Program word (32-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.7V to 3.6V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_Word(uint32_t Address, uint32_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_WORD; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint32_t *)Address = Data; -} - -/** - * @brief Program a half-word (16-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.1V to 3.6V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_HALF_WORD; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint16_t *)Address = Data; -} - -/** - * @brief Program byte (8-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 1.8V to 3.6V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_Byte(uint32_t Address, uint8_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_BYTE; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint8_t *)Address = Data; -} - -/** - * @brief Set the specific FLASH error flag. - * @retval None - */ -static void FLASH_SetErrorCode(void) -{ - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP; - - /* Clear FLASH write protection error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR); - } - - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_PGA; - - /* Clear FLASH Programming alignment error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR); - } - - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGPERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_PGP; - - /* Clear FLASH Programming parallelism error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR); - } - - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_PGS; - - /* Clear FLASH Programming sequence error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR); - } -#if defined(FLASH_SR_RDERR) - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_RD; - - /* Clear FLASH Proprietary readout protection error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_RDERR); - } -#endif /* FLASH_SR_RDERR */ - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_OPERATION; - - /* Clear FLASH Operation error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR); - } -} - -/** - * @} - */ - -#endif /* HAL_FLASH_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c deleted file mode 100644 index 839c91b..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c +++ /dev/null @@ -1,1344 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ex.c - * @author MCD Application Team - * @brief Extended FLASH HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the FLASH extension peripheral: - * + Extended programming operations functions - * - @verbatim - ============================================================================== - ##### Flash Extension features ##### - ============================================================================== - - [..] Comparing to other previous devices, the FLASH interface for STM32F427xx/437xx and - STM32F429xx/439xx devices contains the following additional features - - (+) Capacity up to 2 Mbyte with dual bank architecture supporting read-while-write - capability (RWW) - (+) Dual bank memory organization - (+) PCROP protection for all banks - - ##### How to use this driver ##### - ============================================================================== - [..] This driver provides functions to configure and program the FLASH memory - of all STM32F427xx/437xx, STM32F429xx/439xx, STM32F469xx/479xx and STM32F446xx - devices. It includes - (#) FLASH Memory Erase functions: - (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and - HAL_FLASH_Lock() functions - (++) Erase function: Erase sector, erase all sectors - (++) There are two modes of erase : - (+++) Polling Mode using HAL_FLASHEx_Erase() - (+++) Interrupt Mode using HAL_FLASHEx_Erase_IT() - - (#) Option Bytes Programming functions: Use HAL_FLASHEx_OBProgram() to : - (++) Set/Reset the write protection - (++) Set the Read protection Level - (++) Set the BOR level - (++) Program the user Option Bytes - (#) Advanced Option Bytes Programming functions: Use HAL_FLASHEx_AdvOBProgram() to : - (++) Extended space (bank 2) erase function - (++) Full FLASH space (2 Mo) erase (bank 1 and bank 2) - (++) Dual Boot activation - (++) Write protection configuration for bank 2 - (++) PCROP protection configuration and control for both banks - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup FLASHEx FLASHEx - * @brief FLASH HAL Extension module driver - * @{ - */ - -#ifdef HAL_FLASH_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup FLASHEx_Private_Constants - * @{ - */ -#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup FLASHEx_Private_Variables - * @{ - */ -extern FLASH_ProcessTypeDef pFlash; -/** - * @} - */ - -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup FLASHEx_Private_Functions - * @{ - */ -/* Option bytes control */ -static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level); -static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby); -static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level); -static uint8_t FLASH_OB_GetUser(void); -static uint16_t FLASH_OB_GetWRP(void); -static uint8_t FLASH_OB_GetRDP(void); -static uint8_t FLASH_OB_GetBOR(void); - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ - defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector); -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector); -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx - STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -extern HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions - * @{ - */ - -/** @defgroup FLASHEx_Exported_Functions_Group1 Extended IO operation functions - * @brief Extended IO operation functions - * -@verbatim - =============================================================================== - ##### Extended programming operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the Extension FLASH - programming operations. - -@endverbatim - * @{ - */ -/** - * @brief Perform a mass erase or erase the specified FLASH memory sectors - * @param[in] pEraseInit pointer to an FLASH_EraseInitTypeDef structure that - * contains the configuration information for the erasing. - * - * @param[out] SectorError pointer to variable that - * contains the configuration information on faulty sector in case of error - * (0xFFFFFFFFU means that all the sectors have been correctly erased) - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError) -{ - HAL_StatusTypeDef status; - uint32_t index = 0U; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - /*Initialization of SectorError variable*/ - *SectorError = 0xFFFFFFFFU; - - if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) - { - /*Mass erase to be done*/ - FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - /* if the erase operation is completed, disable the MER Bit */ - FLASH->CR &= (~FLASH_MER_BIT); - } - else - { - /* Check the parameters */ - assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); - - /* Erase by sector by sector to be done*/ - for (index = pEraseInit->Sector; index < (pEraseInit->NbSectors + pEraseInit->Sector); index++) - { - FLASH_Erase_Sector(index, (uint8_t) pEraseInit->VoltageRange); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - /* If the erase operation is completed, disable the SER and SNB Bits */ - CLEAR_BIT(FLASH->CR, (FLASH_CR_SER | FLASH_CR_SNB)); - - if (status != HAL_OK) - { - /* In case of error, stop erase procedure and return the faulty sector*/ - *SectorError = index; - break; - } - } - } - /* Flush the caches to be sure of the data consistency */ - FLASH_FlushCaches(); - } - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - - return status; -} - -/** - * @brief Perform a mass erase or erase the specified FLASH memory sectors with interrupt enabled - * @param pEraseInit pointer to an FLASH_EraseInitTypeDef structure that - * contains the configuration information for the erasing. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); - - /* Enable End of FLASH Operation interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); - - /* Enable Error source interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); - - /* Clear pending flags (if any) */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | \ - FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); - - if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) - { - /*Mass erase to be done*/ - pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE; - pFlash.Bank = pEraseInit->Banks; - FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); - } - else - { - /* Erase by sector to be done*/ - - /* Check the parameters */ - assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); - - pFlash.ProcedureOnGoing = FLASH_PROC_SECTERASE; - pFlash.NbSectorsToErase = pEraseInit->NbSectors; - pFlash.Sector = pEraseInit->Sector; - pFlash.VoltageForErase = (uint8_t)pEraseInit->VoltageRange; - - /*Erase 1st sector and wait for IT*/ - FLASH_Erase_Sector(pEraseInit->Sector, pEraseInit->VoltageRange); - } - - return status; -} - -/** - * @brief Program option bytes - * @param pOBInit pointer to an FLASH_OBInitStruct structure that - * contains the configuration information for the programming. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit) -{ - HAL_StatusTypeDef status = HAL_ERROR; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_OPTIONBYTE(pOBInit->OptionType)); - - /*Write protection configuration*/ - if ((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP) - { - assert_param(IS_WRPSTATE(pOBInit->WRPState)); - if (pOBInit->WRPState == OB_WRPSTATE_ENABLE) - { - /*Enable of Write protection on the selected Sector*/ - status = FLASH_OB_EnableWRP(pOBInit->WRPSector, pOBInit->Banks); - } - else - { - /*Disable of Write protection on the selected Sector*/ - status = FLASH_OB_DisableWRP(pOBInit->WRPSector, pOBInit->Banks); - } - } - - /*Read protection configuration*/ - if ((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP) - { - status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel); - } - - /*USER configuration*/ - if ((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER) - { - status = FLASH_OB_UserConfig(pOBInit->USERConfig & OB_IWDG_SW, - pOBInit->USERConfig & OB_STOP_NO_RST, - pOBInit->USERConfig & OB_STDBY_NO_RST); - } - - /*BOR Level configuration*/ - if ((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR) - { - status = FLASH_OB_BOR_LevelConfig(pOBInit->BORLevel); - } - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - - return status; -} - -/** - * @brief Get the Option byte configuration - * @param pOBInit pointer to an FLASH_OBInitStruct structure that - * contains the configuration information for the programming. - * - * @retval None - */ -void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit) -{ - pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_BOR; - - /*Get WRP*/ - pOBInit->WRPSector = (uint32_t)FLASH_OB_GetWRP(); - - /*Get RDP Level*/ - pOBInit->RDPLevel = (uint32_t)FLASH_OB_GetRDP(); - - /*Get USER*/ - pOBInit->USERConfig = (uint8_t)FLASH_OB_GetUser(); - - /*Get BOR Level*/ - pOBInit->BORLevel = (uint32_t)FLASH_OB_GetBOR(); -} - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Program option bytes - * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that - * contains the configuration information for the programming. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_AdvOBProgram(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) -{ - HAL_StatusTypeDef status = HAL_ERROR; - - /* Check the parameters */ - assert_param(IS_OBEX(pAdvOBInit->OptionType)); - - /*Program PCROP option byte*/ - if (((pAdvOBInit->OptionType) & OPTIONBYTE_PCROP) == OPTIONBYTE_PCROP) - { - /* Check the parameters */ - assert_param(IS_PCROPSTATE(pAdvOBInit->PCROPState)); - if ((pAdvOBInit->PCROPState) == OB_PCROP_STATE_ENABLE) - { - /*Enable of Write protection on the selected Sector*/ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - status = FLASH_OB_EnablePCROP(pAdvOBInit->Sectors); -#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - status = FLASH_OB_EnablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - } - else - { - /*Disable of Write protection on the selected Sector*/ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - status = FLASH_OB_DisablePCROP(pAdvOBInit->Sectors); -#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - status = FLASH_OB_DisablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - } - } - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - /*Program BOOT config option byte*/ - if (((pAdvOBInit->OptionType) & OPTIONBYTE_BOOTCONFIG) == OPTIONBYTE_BOOTCONFIG) - { - status = FLASH_OB_BootConfig(pAdvOBInit->BootConfig); - } -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - - return status; -} - -/** - * @brief Get the OBEX byte configuration - * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that - * contains the configuration information for the programming. - * - * @retval None - */ -void HAL_FLASHEx_AdvOBGetConfig(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) -{ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - /*Get Sector*/ - pAdvOBInit->Sectors = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); -#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - /*Get Sector for Bank1*/ - pAdvOBInit->SectorsBank1 = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); - - /*Get Sector for Bank2*/ - pAdvOBInit->SectorsBank2 = (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); - - /*Get Boot config OB*/ - pAdvOBInit->BootConfig = *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS; -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ -} - -/** - * @brief Select the Protection Mode - * - * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted - * Global Read Out Protection modification (from level1 to level0) - * @note Once SPRMOD bit is active unprotection of a protected sector is not possible - * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag - * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ - * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_OB_SelectPCROP(void) -{ - uint8_t optiontmp; - - /* Mask SPRMOD bit */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); - - /* Update Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_SELECTED | optiontmp); - - return HAL_OK; -} - -/** - * @brief Deselect the Protection Mode - * - * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted - * Global Read Out Protection modification (from level1 to level0) - * @note Once SPRMOD bit is active unprotection of a protected sector is not possible - * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag - * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ - * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_OB_DeSelectPCROP(void) -{ - uint8_t optiontmp; - - /* Mask SPRMOD bit */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); - - /* Update Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_DESELECTED | optiontmp); - - return HAL_OK; -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx ||\ - STM32F411xE || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Returns the FLASH Write Protection Option Bytes value for Bank 2 - * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx devices. - * @retval The FLASH Write Protection Option Bytes value - */ -uint16_t HAL_FLASHEx_OB_GetBank2WRP(void) -{ - /* Return the FLASH write protection Register value */ - return (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -/** - * @} - */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Full erase of FLASH memory sectors - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @param Banks Banks to be erased - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: Bank1 to be erased - * @arg FLASH_BANK_2: Bank2 to be erased - * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased - * - * @retval HAL Status - */ -static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) -{ - /* Check the parameters */ - assert_param(IS_VOLTAGERANGE(VoltageRange)); - assert_param(IS_FLASH_BANK(Banks)); - - /* if the previous operation is completed, proceed to erase all sectors */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - - if (Banks == FLASH_BANK_BOTH) - { - /* bank1 & bank2 will be erased*/ - FLASH->CR |= FLASH_MER_BIT; - } - else if (Banks == FLASH_BANK_1) - { - /*Only bank1 will be erased*/ - FLASH->CR |= FLASH_CR_MER1; - } - else - { - /*Only bank2 will be erased*/ - FLASH->CR |= FLASH_CR_MER2; - } - FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange << 8U); -} - -/** - * @brief Erase the specified FLASH memory sector - * @param Sector FLASH sector to erase - * The value of this parameter depend on device used within the same series - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @retval None - */ -void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) -{ - uint32_t tmp_psize = 0U; - - /* Check the parameters */ - assert_param(IS_FLASH_SECTOR(Sector)); - assert_param(IS_VOLTAGERANGE(VoltageRange)); - - if (VoltageRange == FLASH_VOLTAGE_RANGE_1) - { - tmp_psize = FLASH_PSIZE_BYTE; - } - else if (VoltageRange == FLASH_VOLTAGE_RANGE_2) - { - tmp_psize = FLASH_PSIZE_HALF_WORD; - } - else if (VoltageRange == FLASH_VOLTAGE_RANGE_3) - { - tmp_psize = FLASH_PSIZE_WORD; - } - else - { - tmp_psize = FLASH_PSIZE_DOUBLE_WORD; - } - - /* Need to add offset of 4 when sector higher than FLASH_SECTOR_11 */ - if (Sector > FLASH_SECTOR_11) - { - Sector += 4U; - } - /* If the previous operation is completed, proceed to erase the sector */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= tmp_psize; - CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); - FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); - FLASH->CR |= FLASH_CR_STRT; -} - -/** - * @brief Enable the write protection of the desired bank1 or bank 2 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * This parameter can be one of the following values: - * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 - * @arg OB_WRP_SECTOR_All - * @note BANK2 starts from OB_WRP_SECTOR_12 - * - * @param Banks Enable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * @arg FLASH_BANK_2: WRP on all sectors of bank2 - * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 - * - * @retval HAL FLASH State - */ -static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - if (((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || - (WRPSector < OB_WRP_SECTOR_12)) - { - if (WRPSector == OB_WRP_SECTOR_All) - { - /*Write protection on all sector of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~(WRPSector >> 12)); - } - else - { - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~WRPSector); - } - } - else - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector >> 12)); - } - - /*Write protection on all sector of BANK2*/ - if ((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) - { - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector >> 12)); - } - } - - } - return status; -} - -/** - * @brief Disable the write protection of the desired bank1 or bank 2 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * This parameter can be one of the following values: - * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 - * @arg OB_WRP_Sector_All - * @note BANK2 starts from OB_WRP_SECTOR_12 - * - * @param Banks Disable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: Bank1 to be erased - * @arg FLASH_BANK_2: Bank2 to be erased - * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - if (((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || - (WRPSector < OB_WRP_SECTOR_12)) - { - if (WRPSector == OB_WRP_SECTOR_All) - { - /*Write protection on all sector of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)(WRPSector >> 12); - } - else - { - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; - } - } - else - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector >> 12); - } - - /*Write protection on all sector of BANK2*/ - if ((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) - { - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector >> 12); - } - } - - } - - return status; -} - -/** - * @brief Configure the Dual Bank Boot. - * - * @note This function can be used only for STM32F42xxx/43xxx devices. - * - * @param BootConfig specifies the Dual Bank Boot Option byte. - * This parameter can be one of the following values: - * @arg OB_Dual_BootEnabled: Dual Bank Boot Enable - * @arg OB_Dual_BootDisabled: Dual Bank Boot Disabled - * @retval None - */ -static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_BOOT(BootConfig)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - /* Set Dual Bank Boot */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BFB2); - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= BootConfig; - } - - return status; -} - -/** - * @brief Enable the read/write protection (PCROP) of the desired - * sectors of Bank 1 and/or Bank 2. - * @note This function can be used only for STM32F42xxx/43xxx devices. - * @param SectorBank1 Specifies the sector(s) to be read/write protected or unprotected for bank1. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 - * @arg OB_PCROP_SECTOR__All - * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 - * @arg OB_PCROP_SECTOR__All - * @param Banks Enable PCROP protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * @arg FLASH_BANK_2: WRP on all sectors of bank2 - * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - if ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) - { - assert_param(IS_OB_PCROP(SectorBank1)); - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)SectorBank1; - } - else - { - assert_param(IS_OB_PCROP(SectorBank2)); - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; - } - - /*Write protection on all sector of BANK2*/ - if (Banks == FLASH_BANK_BOTH) - { - assert_param(IS_OB_PCROP(SectorBank2)); - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; - } - } - - } - - return status; -} - - -/** - * @brief Disable the read/write protection (PCROP) of the desired - * sectors of Bank 1 and/or Bank 2. - * @note This function can be used only for STM32F42xxx/43xxx devices. - * @param SectorBank1 specifies the sector(s) to be read/write protected or unprotected for bank1. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 - * @arg OB_PCROP_SECTOR__All - * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 - * @arg OB_PCROP_SECTOR__All - * @param Banks Disable PCROP protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * @arg FLASH_BANK_2: WRP on all sectors of bank2 - * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - if ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) - { - assert_param(IS_OB_PCROP(SectorBank1)); - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~SectorBank1); - } - else - { - /*Write protection done on sectors of BANK2*/ - assert_param(IS_OB_PCROP(SectorBank2)); - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); - } - - /*Write protection on all sector of BANK2*/ - if (Banks == FLASH_BANK_BOTH) - { - assert_param(IS_OB_PCROP(SectorBank2)); - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); - } - } - - } - - return status; - -} - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -/** - * @brief Mass erase of FLASH memory - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @param Banks Banks to be erased - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: Bank1 to be erased - * - * @retval None - */ -static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) -{ - /* Check the parameters */ - assert_param(IS_VOLTAGERANGE(VoltageRange)); - assert_param(IS_FLASH_BANK(Banks)); - - /* If the previous operation is completed, proceed to erase all sectors */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_CR_MER; - FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange << 8U); -} - -/** - * @brief Erase the specified FLASH memory sector - * @param Sector FLASH sector to erase - * The value of this parameter depend on device used within the same series - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @retval None - */ -void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) -{ - uint32_t tmp_psize = 0U; - - /* Check the parameters */ - assert_param(IS_FLASH_SECTOR(Sector)); - assert_param(IS_VOLTAGERANGE(VoltageRange)); - - if (VoltageRange == FLASH_VOLTAGE_RANGE_1) - { - tmp_psize = FLASH_PSIZE_BYTE; - } - else if (VoltageRange == FLASH_VOLTAGE_RANGE_2) - { - tmp_psize = FLASH_PSIZE_HALF_WORD; - } - else if (VoltageRange == FLASH_VOLTAGE_RANGE_3) - { - tmp_psize = FLASH_PSIZE_WORD; - } - else - { - tmp_psize = FLASH_PSIZE_DOUBLE_WORD; - } - - /* If the previous operation is completed, proceed to erase the sector */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= tmp_psize; - CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); - FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); - FLASH->CR |= FLASH_CR_STRT; -} - -/** - * @brief Enable the write protection of the desired bank 1 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * The value of this parameter depend on device used within the same series - * - * @param Banks Enable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~WRPSector); - } - - return status; -} - -/** - * @brief Disable the write protection of the desired bank 1 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * The value of this parameter depend on device used within the same series - * - * @param Banks Enable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; - } - - return status; -} -#endif /* STM32F40xxx || STM32F41xxx || STM32F401xx || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx - STM32F413xx || STM32F423xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Enable the read/write protection (PCROP) of the desired sectors. - * @note This function can be used only for STM32F401xx devices. - * @param Sector specifies the sector(s) to be read/write protected or unprotected. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 - * @arg OB_PCROP_Sector_All - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_PCROP(Sector)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)Sector; - } - - return status; -} - - -/** - * @brief Disable the read/write protection (PCROP) of the desired sectors. - * @note This function can be used only for STM32F401xx devices. - * @param Sector specifies the sector(s) to be read/write protected or unprotected. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 - * @arg OB_PCROP_Sector_All - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_PCROP(Sector)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~Sector); - } - - return status; - -} -#endif /* STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx - STM32F413xx || STM32F423xx */ - -/** - * @brief Set the read protection level. - * @param Level specifies the read protection level. - * This parameter can be one of the following values: - * @arg OB_RDP_LEVEL_0: No protection - * @arg OB_RDP_LEVEL_1: Read protection of the memory - * @arg OB_RDP_LEVEL_2: Full chip protection - * - * @note WARNING: When enabling OB_RDP level 2 it's no more possible to go back to level 1 or 0 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_RDP_LEVEL(Level)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - *(__IO uint8_t *)OPTCR_BYTE1_ADDRESS = Level; - } - - return status; -} - -/** - * @brief Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. - * @param Iwdg Selects the IWDG mode - * This parameter can be one of the following values: - * @arg OB_IWDG_SW: Software IWDG selected - * @arg OB_IWDG_HW: Hardware IWDG selected - * @param Stop Reset event when entering STOP mode. - * This parameter can be one of the following values: - * @arg OB_STOP_NO_RST: No reset generated when entering in STOP - * @arg OB_STOP_RST: Reset generated when entering in STOP - * @param Stdby Reset event when entering Standby mode. - * This parameter can be one of the following values: - * @arg OB_STDBY_NO_RST: No reset generated when entering in STANDBY - * @arg OB_STDBY_RST: Reset generated when entering in STANDBY - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby) -{ - uint8_t optiontmp; - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_IWDG_SOURCE(Iwdg)); - assert_param(IS_OB_STOP_SOURCE(Stop)); - assert_param(IS_OB_STDBY_SOURCE(Stdby)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if (status == HAL_OK) - { - /* Mask OPTLOCK, OPTSTRT, BOR_LEV and BFB2 bits */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS) & (uint8_t)0x1F); - - /* Update User Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS = Iwdg | (uint8_t)(Stdby | (uint8_t)(Stop | ((uint8_t)optiontmp))); - } - - return status; -} - -/** - * @brief Set the BOR Level. - * @param Level specifies the Option Bytes BOR Reset Level. - * This parameter can be one of the following values: - * @arg OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V - * @arg OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V - * @arg OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V - * @arg OB_BOR_OFF: Supply voltage ranges from 1.62 to 2.1 V - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level) -{ - /* Check the parameters */ - assert_param(IS_OB_BOR_LEVEL(Level)); - - /* Set the BOR Level */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BOR_LEV); - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= Level; - - return HAL_OK; - -} - -/** - * @brief Return the FLASH User Option Byte value. - * @retval uint8_t FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1) - * and RST_STDBY(Bit2). - */ -static uint8_t FLASH_OB_GetUser(void) -{ - /* Return the User Option Byte */ - return ((uint8_t)(FLASH->OPTCR & 0xE0)); -} - -/** - * @brief Return the FLASH Write Protection Option Bytes value. - * @retval uint16_t FLASH Write Protection Option Bytes value - */ -static uint16_t FLASH_OB_GetWRP(void) -{ - /* Return the FLASH write protection Register value */ - return (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); -} - -/** - * @brief Returns the FLASH Read Protection level. - * @retval FLASH ReadOut Protection Status: - * This parameter can be one of the following values: - * @arg OB_RDP_LEVEL_0: No protection - * @arg OB_RDP_LEVEL_1: Read protection of the memory - * @arg OB_RDP_LEVEL_2: Full chip protection - */ -static uint8_t FLASH_OB_GetRDP(void) -{ - uint8_t readstatus = OB_RDP_LEVEL_0; - - if (*(__IO uint8_t *)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_2) - { - readstatus = OB_RDP_LEVEL_2; - } - else if (*(__IO uint8_t *)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_0) - { - readstatus = OB_RDP_LEVEL_0; - } - else - { - readstatus = OB_RDP_LEVEL_1; - } - - return readstatus; -} - -/** - * @brief Returns the FLASH BOR level. - * @retval uint8_t The FLASH BOR level: - * - OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V - * - OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V - * - OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V - * - OB_BOR_OFF : Supply voltage ranges from 1.62 to 2.1 V - */ -static uint8_t FLASH_OB_GetBOR(void) -{ - /* Return the FLASH BOR level */ - return (uint8_t)(*(__IO uint8_t *)(OPTCR_BYTE0_ADDRESS) & (uint8_t)0x0C); -} - -/** - * @brief Flush the instruction and data caches - * @retval None - */ -void FLASH_FlushCaches(void) -{ - /* Flush instruction cache */ - if (READ_BIT(FLASH->ACR, FLASH_ACR_ICEN) != RESET) - { - /* Disable instruction cache */ - __HAL_FLASH_INSTRUCTION_CACHE_DISABLE(); - /* Reset instruction cache */ - __HAL_FLASH_INSTRUCTION_CACHE_RESET(); - /* Enable instruction cache */ - __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); - } - - /* Flush data cache */ - if (READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != RESET) - { - /* Disable data cache */ - __HAL_FLASH_DATA_CACHE_DISABLE(); - /* Reset data cache */ - __HAL_FLASH_DATA_CACHE_RESET(); - /* Enable data cache */ - __HAL_FLASH_DATA_CACHE_ENABLE(); - } -} - -/** - * @} - */ - -#endif /* HAL_FLASH_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c deleted file mode 100644 index e6ab3ac..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c +++ /dev/null @@ -1,172 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ramfunc.c - * @author MCD Application Team - * @brief FLASH RAMFUNC module driver. - * This file provides a FLASH firmware functions which should be - * executed from internal SRAM - * + Stop/Start the flash interface while System Run - * + Enable/Disable the flash sleep while System Run - @verbatim - ============================================================================== - ##### APIs executed from Internal RAM ##### - ============================================================================== - [..] - *** ARM Compiler *** - -------------------- - [..] RAM functions are defined using the toolchain options. - Functions that are be executed in RAM should reside in a separate - source module. Using the 'Options for File' dialog you can simply change - the 'Code / Const' area of a module to a memory space in physical RAM. - Available memory areas are declared in the 'Target' tab of the - Options for Target' dialog. - - *** ICCARM Compiler *** - ----------------------- - [..] RAM functions are defined using a specific toolchain keyword "__ramfunc". - - *** GNU Compiler *** - -------------------- - [..] RAM functions are defined using a specific toolchain attribute - "__attribute__((section(".RamFunc")))". - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup FLASH_RAMFUNC FLASH RAMFUNC - * @brief FLASH functions executed from RAM - * @{ - */ -#ifdef HAL_FLASH_MODULE_ENABLED -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup FLASH_RAMFUNC_Exported_Functions FLASH RAMFUNC Exported Functions - * @{ - */ - -/** @defgroup FLASH_RAMFUNC_Exported_Functions_Group1 Peripheral features functions executed from internal RAM - * @brief Peripheral Extended features functions - * -@verbatim - - =============================================================================== - ##### ramfunc functions ##### - =============================================================================== - [..] - This subsection provides a set of functions that should be executed from RAM - transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Stop the flash interface while System Run - * @note This mode is only available for STM32F41xxx/STM32F446xx devices. - * @note This mode couldn't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Stop the flash interface while System Run */ - SET_BIT(PWR->CR, PWR_CR_FISSR); - - return HAL_OK; -} - -/** - * @brief Start the flash interface while System Run - * @note This mode is only available for STM32F411xx/STM32F446xx devices. - * @note This mode couldn't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Start the flash interface while System Run */ - CLEAR_BIT(PWR->CR, PWR_CR_FISSR); - - return HAL_OK; -} - -/** - * @brief Enable the flash sleep while System Run - * @note This mode is only available for STM32F41xxx/STM32F446xx devices. - * @note This mode could n't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Enable the flash sleep while System Run */ - SET_BIT(PWR->CR, PWR_CR_FMSSR); - - return HAL_OK; -} - -/** - * @brief Disable the flash sleep while System Run - * @note This mode is only available for STM32F41xxx/STM32F446xx devices. - * @note This mode couldn't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Disable the flash sleep while System Run */ - CLEAR_BIT(PWR->CR, PWR_CR_FMSSR); - - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#endif /* HAL_FLASH_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c deleted file mode 100644 index b3ce9bb..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c +++ /dev/null @@ -1,533 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_gpio.c - * @author MCD Application Team - * @brief GPIO HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the General Purpose Input/Output (GPIO) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### GPIO Peripheral features ##### - ============================================================================== - [..] - Subject to the specific hardware characteristics of each I/O port listed in the datasheet, each - port bit of the General Purpose IO (GPIO) Ports, can be individually configured by software - in several modes: - (+) Input mode - (+) Analog mode - (+) Output mode - (+) Alternate function mode - (+) External interrupt/event lines - - [..] - During and just after reset, the alternate functions and external interrupt - lines are not active and the I/O ports are configured in input floating mode. - - [..] - All GPIO pins have weak internal pull-up and pull-down resistors, which can be - activated or not. - - [..] - In Output or Alternate mode, each IO can be configured on open-drain or push-pull - type and the IO speed can be selected depending on the VDD value. - - [..] - All ports have external interrupt/event capability. To use external interrupt - lines, the port must be configured in input mode. All available GPIO pins are - connected to the 16 external interrupt/event lines from EXTI0 to EXTI15. - - [..] - The external interrupt/event controller consists of up to 23 edge detectors - (16 lines are connected to GPIO) for generating event/interrupt requests (each - input line can be independently configured to select the type (interrupt or event) - and the corresponding trigger event (rising or falling or both). Each line can - also be masked independently. - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Enable the GPIO AHB clock using the following function: __HAL_RCC_GPIOx_CLK_ENABLE(). - - (#) Configure the GPIO pin(s) using HAL_GPIO_Init(). - (++) Configure the IO mode using "Mode" member from GPIO_InitTypeDef structure - (++) Activate Pull-up, Pull-down resistor using "Pull" member from GPIO_InitTypeDef - structure. - (++) In case of Output or alternate function mode selection: the speed is - configured through "Speed" member from GPIO_InitTypeDef structure. - (++) In alternate mode is selection, the alternate function connected to the IO - is configured through "Alternate" member from GPIO_InitTypeDef structure. - (++) Analog mode is required when a pin is to be used as ADC channel - or DAC output. - (++) In case of external interrupt/event selection the "Mode" member from - GPIO_InitTypeDef structure select the type (interrupt or event) and - the corresponding trigger event (rising or falling or both). - - (#) In case of external interrupt/event mode selection, configure NVIC IRQ priority - mapped to the EXTI line using HAL_NVIC_SetPriority() and enable it using - HAL_NVIC_EnableIRQ(). - - (#) To get the level of a pin configured in input mode use HAL_GPIO_ReadPin(). - - (#) To set/reset the level of a pin configured in output mode use - HAL_GPIO_WritePin()/HAL_GPIO_TogglePin(). - - (#) To lock pin configuration until next reset use HAL_GPIO_LockPin(). - - - (#) During and just after reset, the alternate functions are not - active and the GPIO pins are configured in input floating mode (except JTAG - pins). - - (#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as general purpose - (PC14 and PC15, respectively) when the LSE oscillator is off. The LSE has - priority over the GPIO function. - - (#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as - general purpose PH0 and PH1, respectively, when the HSE oscillator is off. - The HSE has priority over the GPIO function. - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup GPIO GPIO - * @brief GPIO HAL module driver - * @{ - */ - -#ifdef HAL_GPIO_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup GPIO_Private_Constants GPIO Private Constants - * @{ - */ - -#define GPIO_NUMBER 16U -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Functions GPIO Exported Functions - * @{ - */ - -/** @defgroup GPIO_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to initialize and de-initialize the GPIOs - to be ready for use. - -@endverbatim - * @{ - */ - - -/** - * @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init. - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Init pointer to a GPIO_InitTypeDef structure that contains - * the configuration information for the specified GPIO peripheral. - * @retval None - */ -void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) -{ - uint32_t position; - uint32_t ioposition = 0x00U; - uint32_t iocurrent = 0x00U; - uint32_t temp = 0x00U; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); - assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); - - /* Configure the port pins */ - for(position = 0U; position < GPIO_NUMBER; position++) - { - /* Get the IO position */ - ioposition = 0x01U << position; - /* Get the current IO position */ - iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition; - - if(iocurrent == ioposition) - { - /*--------------------- GPIO Mode Configuration ------------------------*/ - /* In case of Output or Alternate function mode selection */ - if(((GPIO_Init->Mode & GPIO_MODE) == MODE_OUTPUT) || \ - (GPIO_Init->Mode & GPIO_MODE) == MODE_AF) - { - /* Check the Speed parameter */ - assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); - /* Configure the IO Speed */ - temp = GPIOx->OSPEEDR; - temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); - temp |= (GPIO_Init->Speed << (position * 2U)); - GPIOx->OSPEEDR = temp; - - /* Configure the IO Output Type */ - temp = GPIOx->OTYPER; - temp &= ~(GPIO_OTYPER_OT_0 << position) ; - temp |= (((GPIO_Init->Mode & OUTPUT_TYPE) >> OUTPUT_TYPE_Pos) << position); - GPIOx->OTYPER = temp; - } - - if((GPIO_Init->Mode & GPIO_MODE) != MODE_ANALOG) - { - /* Check the parameters */ - assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); - - /* Activate the Pull-up or Pull down resistor for the current IO */ - temp = GPIOx->PUPDR; - temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); - temp |= ((GPIO_Init->Pull) << (position * 2U)); - GPIOx->PUPDR = temp; - } - - /* In case of Alternate function mode selection */ - if((GPIO_Init->Mode & GPIO_MODE) == MODE_AF) - { - /* Check the Alternate function parameter */ - assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); - /* Configure Alternate function mapped with the current IO */ - temp = GPIOx->AFR[position >> 3U]; - temp &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; - temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & 0x07U) * 4U)); - GPIOx->AFR[position >> 3U] = temp; - } - - /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ - temp = GPIOx->MODER; - temp &= ~(GPIO_MODER_MODER0 << (position * 2U)); - temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2U)); - GPIOx->MODER = temp; - - /*--------------------- EXTI Mode Configuration ------------------------*/ - /* Configure the External Interrupt or event for the current IO */ - if((GPIO_Init->Mode & EXTI_MODE) != 0x00U) - { - /* Enable SYSCFG Clock */ - __HAL_RCC_SYSCFG_CLK_ENABLE(); - - temp = SYSCFG->EXTICR[position >> 2U]; - temp &= ~(0x0FU << (4U * (position & 0x03U))); - temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U))); - SYSCFG->EXTICR[position >> 2U] = temp; - - /* Clear Rising Falling edge configuration */ - temp = EXTI->RTSR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & TRIGGER_RISING) != 0x00U) - { - temp |= iocurrent; - } - EXTI->RTSR = temp; - - temp = EXTI->FTSR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & TRIGGER_FALLING) != 0x00U) - { - temp |= iocurrent; - } - EXTI->FTSR = temp; - - temp = EXTI->EMR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & EXTI_EVT) != 0x00U) - { - temp |= iocurrent; - } - EXTI->EMR = temp; - - /* Clear EXTI line configuration */ - temp = EXTI->IMR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & EXTI_IT) != 0x00U) - { - temp |= iocurrent; - } - EXTI->IMR = temp; - } - } - } -} - -/** - * @brief De-initializes the GPIOx peripheral registers to their default reset values. - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin specifies the port bit to be written. - * This parameter can be one of GPIO_PIN_x where x can be (0..15). - * @retval None - */ -void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) -{ - uint32_t position; - uint32_t ioposition = 0x00U; - uint32_t iocurrent = 0x00U; - uint32_t tmp = 0x00U; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - - /* Configure the port pins */ - for(position = 0U; position < GPIO_NUMBER; position++) - { - /* Get the IO position */ - ioposition = 0x01U << position; - /* Get the current IO position */ - iocurrent = (GPIO_Pin) & ioposition; - - if(iocurrent == ioposition) - { - /*------------------------- EXTI Mode Configuration --------------------*/ - tmp = SYSCFG->EXTICR[position >> 2U]; - tmp &= (0x0FU << (4U * (position & 0x03U))); - if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U)))) - { - /* Clear EXTI line configuration */ - EXTI->IMR &= ~((uint32_t)iocurrent); - EXTI->EMR &= ~((uint32_t)iocurrent); - - /* Clear Rising Falling edge configuration */ - EXTI->FTSR &= ~((uint32_t)iocurrent); - EXTI->RTSR &= ~((uint32_t)iocurrent); - - /* Configure the External Interrupt or event for the current IO */ - tmp = 0x0FU << (4U * (position & 0x03U)); - SYSCFG->EXTICR[position >> 2U] &= ~tmp; - } - - /*------------------------- GPIO Mode Configuration --------------------*/ - /* Configure IO Direction in Input Floating Mode */ - GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (position * 2U)); - - /* Configure the default Alternate Function in current IO */ - GPIOx->AFR[position >> 3U] &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; - - /* Deactivate the Pull-up and Pull-down resistor for the current IO */ - GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); - - /* Configure the default value IO Output Type */ - GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; - - /* Configure the default value for IO Speed */ - GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); - } - } -} - -/** - * @} - */ - -/** @defgroup GPIO_Exported_Functions_Group2 IO operation functions - * @brief GPIO Read and Write - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Reads the specified input port pin. - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin specifies the port bit to read. - * This parameter can be GPIO_PIN_x where x can be (0..15). - * @retval The input port pin value. - */ -GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - GPIO_PinState bitstatus; - - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET) - { - bitstatus = GPIO_PIN_SET; - } - else - { - bitstatus = GPIO_PIN_RESET; - } - return bitstatus; -} - -/** - * @brief Sets or clears the selected data port bit. - * - * @note This function uses GPIOx_BSRR register to allow atomic read/modify - * accesses. In this way, there is no risk of an IRQ occurring between - * the read and the modify access. - * - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin specifies the port bit to be written. - * This parameter can be one of GPIO_PIN_x where x can be (0..15). - * @param PinState specifies the value to be written to the selected bit. - * This parameter can be one of the GPIO_PinState enum values: - * @arg GPIO_PIN_RESET: to clear the port pin - * @arg GPIO_PIN_SET: to set the port pin - * @retval None - */ -void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) -{ - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - assert_param(IS_GPIO_PIN_ACTION(PinState)); - - if(PinState != GPIO_PIN_RESET) - { - GPIOx->BSRR = GPIO_Pin; - } - else - { - GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U; - } -} - -/** - * @brief Toggles the specified GPIO pins. - * @param GPIOx Where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin Specifies the pins to be toggled. - * @retval None - */ -void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - uint32_t odr; - - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - /* get current Output Data Register value */ - odr = GPIOx->ODR; - - /* Set selected pins that were at low level, and reset ones that were high */ - GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin); -} - -/** - * @brief Locks GPIO Pins configuration registers. - * @note The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, - * GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH. - * @note The configuration of the locked GPIO pins can no longer be modified - * until the next reset. - * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F4 family - * @param GPIO_Pin specifies the port bit to be locked. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15). - * @retval None - */ -HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - __IO uint32_t tmp = GPIO_LCKR_LCKK; - - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - /* Apply lock key write sequence */ - tmp |= GPIO_Pin; - /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ - GPIOx->LCKR = tmp; - /* Reset LCKx bit(s): LCKK='0' + LCK[15-0] */ - GPIOx->LCKR = GPIO_Pin; - /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ - GPIOx->LCKR = tmp; - /* Read LCKR register. This read is mandatory to complete key lock sequence */ - tmp = GPIOx->LCKR; - - /* Read again in order to confirm lock is active */ - if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) - { - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief This function handles EXTI interrupt request. - * @param GPIO_Pin Specifies the pins connected EXTI line - * @retval None - */ -void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) -{ - /* EXTI line interrupt detected */ - if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) - { - __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); - HAL_GPIO_EXTI_Callback(GPIO_Pin); - } -} - -/** - * @brief EXTI line detection callbacks. - * @param GPIO_Pin Specifies the pins connected EXTI line - * @retval None - */ -__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(GPIO_Pin); - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_GPIO_EXTI_Callback could be implemented in the user file - */ -} - -/** - * @} - */ - - -/** - * @} - */ - -#endif /* HAL_GPIO_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c deleted file mode 100644 index 9ad44f6..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c +++ /dev/null @@ -1,7567 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_i2c.c - * @author MCD Application Team - * @brief I2C HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Inter Integrated Circuit (I2C) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral State, Mode and Error functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The I2C HAL driver can be used as follows: - - (#) Declare a I2C_HandleTypeDef handle structure, for example: - I2C_HandleTypeDef hi2c; - - (#)Initialize the I2C low level resources by implementing the HAL_I2C_MspInit() API: - (##) Enable the I2Cx interface clock - (##) I2C pins configuration - (+++) Enable the clock for the I2C GPIOs - (+++) Configure I2C pins as alternate function open-drain - (##) NVIC configuration if you need to use interrupt process - (+++) Configure the I2Cx interrupt priority - (+++) Enable the NVIC I2C IRQ Channel - (##) DMA Configuration if you need to use DMA process - (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive stream - (+++) Enable the DMAx interface clock using - (+++) Configure the DMA handle parameters - (+++) Configure the DMA Tx or Rx stream - (+++) Associate the initialized DMA handle to the hi2c DMA Tx or Rx handle - (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on - the DMA Tx or Rx stream - - (#) Configure the Communication Speed, Duty cycle, Addressing mode, Own Address1, - Dual Addressing mode, Own Address2, General call and Nostretch mode in the hi2c Init structure. - - (#) Initialize the I2C registers by calling the HAL_I2C_Init(), configures also the low level Hardware - (GPIO, CLOCK, NVIC...etc) by calling the customized HAL_I2C_MspInit() API. - - (#) To check if target device is ready for communication, use the function HAL_I2C_IsDeviceReady() - - (#) For I2C IO and IO MEM operations, three operation modes are available within this driver : - - *** Polling mode IO operation *** - ================================= - [..] - (+) Transmit in master mode an amount of data in blocking mode using HAL_I2C_Master_Transmit() - (+) Receive in master mode an amount of data in blocking mode using HAL_I2C_Master_Receive() - (+) Transmit in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Transmit() - (+) Receive in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Receive() - - *** Polling mode IO MEM operation *** - ===================================== - [..] - (+) Write an amount of data in blocking mode to a specific memory address using HAL_I2C_Mem_Write() - (+) Read an amount of data in blocking mode from a specific memory address using HAL_I2C_Mem_Read() - - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Transmit in master mode an amount of data in non-blocking mode using HAL_I2C_Master_Transmit_IT() - (+) At transmission end of transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback() - (+) Receive in master mode an amount of data in non-blocking mode using HAL_I2C_Master_Receive_IT() - (+) At reception end of transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() - (+) Transmit in slave mode an amount of data in non-blocking mode using HAL_I2C_Slave_Transmit_IT() - (+) At transmission end of transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback() - (+) Receive in slave mode an amount of data in non-blocking mode using HAL_I2C_Slave_Receive_IT() - (+) At reception end of transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback() - (+) Abort a master or memory I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() - (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_AbortCpltCallback() - - *** Interrupt mode or DMA mode IO sequential operation *** - ========================================================== - [..] - (@) These interfaces allow to manage a sequential transfer with a repeated start condition - when a direction change during transfer - [..] - (+) A specific option field manage the different steps of a sequential transfer - (+) Option field values are defined through I2C_XferOptions_definition and are listed below: - (++) I2C_FIRST_AND_LAST_FRAME: No sequential usage, functional is same as associated interfaces in no sequential mode - (++) I2C_FIRST_FRAME: Sequential usage, this option allow to manage a sequence with start condition, address - and data to transfer without a final stop condition - (++) I2C_FIRST_AND_NEXT_FRAME: Sequential usage (Master only), this option allow to manage a sequence with start condition, address - and data to transfer without a final stop condition, an then permit a call the same master sequential interface - several times (like HAL_I2C_Master_Seq_Transmit_IT() then HAL_I2C_Master_Seq_Transmit_IT() - or HAL_I2C_Master_Seq_Transmit_DMA() then HAL_I2C_Master_Seq_Transmit_DMA()) - (++) I2C_NEXT_FRAME: Sequential usage, this option allow to manage a sequence with a restart condition, address - and with new data to transfer if the direction change or manage only the new data to transfer - if no direction change and without a final stop condition in both cases - (++) I2C_LAST_FRAME: Sequential usage, this option allow to manage a sequance with a restart condition, address - and with new data to transfer if the direction change or manage only the new data to transfer - if no direction change and with a final stop condition in both cases - (++) I2C_LAST_FRAME_NO_STOP: Sequential usage (Master only), this option allow to manage a restart condition after several call of the same master sequential - interface several times (link with option I2C_FIRST_AND_NEXT_FRAME). - Usage can, transfer several bytes one by one using HAL_I2C_Master_Seq_Transmit_IT(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME) - or HAL_I2C_Master_Seq_Receive_IT(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME) - or HAL_I2C_Master_Seq_Transmit_DMA(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME) - or HAL_I2C_Master_Seq_Receive_DMA(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME). - Then usage of this option I2C_LAST_FRAME_NO_STOP at the last Transmit or Receive sequence permit to call the opposite interface Receive or Transmit - without stopping the communication and so generate a restart condition. - (++) I2C_OTHER_FRAME: Sequential usage (Master only), this option allow to manage a restart condition after each call of the same master sequential - interface. - Usage can, transfer several bytes one by one with a restart with slave address between each bytes using HAL_I2C_Master_Seq_Transmit_IT(option I2C_FIRST_FRAME then I2C_OTHER_FRAME) - or HAL_I2C_Master_Seq_Receive_IT(option I2C_FIRST_FRAME then I2C_OTHER_FRAME) - or HAL_I2C_Master_Seq_Transmit_DMA(option I2C_FIRST_FRAME then I2C_OTHER_FRAME) - or HAL_I2C_Master_Seq_Receive_DMA(option I2C_FIRST_FRAME then I2C_OTHER_FRAME). - Then usage of this option I2C_OTHER_AND_LAST_FRAME at the last frame to help automatic generation of STOP condition. - - (+) Different sequential I2C interfaces are listed below: - (++) Sequential transmit in master I2C mode an amount of data in non-blocking mode using HAL_I2C_Master_Seq_Transmit_IT() - or using HAL_I2C_Master_Seq_Transmit_DMA() - (+++) At transmission end of current frame transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback() - (++) Sequential receive in master I2C mode an amount of data in non-blocking mode using HAL_I2C_Master_Seq_Receive_IT() - or using HAL_I2C_Master_Seq_Receive_DMA() - (+++) At reception end of current frame transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() - (++) Abort a master or memory IT or DMA I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() - (+++) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_AbortCpltCallback() - (++) Enable/disable the Address listen mode in slave I2C mode using HAL_I2C_EnableListen_IT() HAL_I2C_DisableListen_IT() - (+++) When address slave I2C match, HAL_I2C_AddrCallback() is executed and user can - add his own code to check the Address Match Code and the transmission direction request by master (Write/Read). - (+++) At Listen mode end HAL_I2C_ListenCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_ListenCpltCallback() - (++) Sequential transmit in slave I2C mode an amount of data in non-blocking mode using HAL_I2C_Slave_Seq_Transmit_IT() - or using HAL_I2C_Slave_Seq_Transmit_DMA() - (+++) At transmission end of current frame transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback() - (++) Sequential receive in slave I2C mode an amount of data in non-blocking mode using HAL_I2C_Slave_Seq_Receive_IT() - or using HAL_I2C_Slave_Seq_Receive_DMA() - (+++) At reception end of current frame transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() - (++) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback() - - *** Interrupt mode IO MEM operation *** - ======================================= - [..] - (+) Write an amount of data in non-blocking mode with Interrupt to a specific memory address using - HAL_I2C_Mem_Write_IT() - (+) At Memory end of write transfer, HAL_I2C_MemTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback() - (+) Read an amount of data in non-blocking mode with Interrupt from a specific memory address using - HAL_I2C_Mem_Read_IT() - (+) At Memory end of read transfer, HAL_I2C_MemRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback() - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback() - - *** DMA mode IO operation *** - ============================== - [..] - (+) Transmit in master mode an amount of data in non-blocking mode (DMA) using - HAL_I2C_Master_Transmit_DMA() - (+) At transmission end of transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback() - (+) Receive in master mode an amount of data in non-blocking mode (DMA) using - HAL_I2C_Master_Receive_DMA() - (+) At reception end of transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() - (+) Transmit in slave mode an amount of data in non-blocking mode (DMA) using - HAL_I2C_Slave_Transmit_DMA() - (+) At transmission end of transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback() - (+) Receive in slave mode an amount of data in non-blocking mode (DMA) using - HAL_I2C_Slave_Receive_DMA() - (+) At reception end of transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback() - (+) Abort a master or memory I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() - (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_AbortCpltCallback() - - *** DMA mode IO MEM operation *** - ================================= - [..] - (+) Write an amount of data in non-blocking mode with DMA to a specific memory address using - HAL_I2C_Mem_Write_DMA() - (+) At Memory end of write transfer, HAL_I2C_MemTxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback() - (+) Read an amount of data in non-blocking mode with DMA from a specific memory address using - HAL_I2C_Mem_Read_DMA() - (+) At Memory end of read transfer, HAL_I2C_MemRxCpltCallback() is executed and user can - add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback() - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback() - - - *** I2C HAL driver macros list *** - ================================== - [..] - Below the list of most used macros in I2C HAL driver. - - (+) __HAL_I2C_ENABLE: Enable the I2C peripheral - (+) __HAL_I2C_DISABLE: Disable the I2C peripheral - (+) __HAL_I2C_GET_FLAG: Checks whether the specified I2C flag is set or not - (+) __HAL_I2C_CLEAR_FLAG: Clear the specified I2C pending flag - (+) __HAL_I2C_ENABLE_IT: Enable the specified I2C interrupt - (+) __HAL_I2C_DISABLE_IT: Disable the specified I2C interrupt - - *** Callback registration *** - ============================================= - [..] - The compilation flag USE_HAL_I2C_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - Use Functions HAL_I2C_RegisterCallback() or HAL_I2C_RegisterAddrCallback() - to register an interrupt callback. - [..] - Function HAL_I2C_RegisterCallback() allows to register following callbacks: - (+) MasterTxCpltCallback : callback for Master transmission end of transfer. - (+) MasterRxCpltCallback : callback for Master reception end of transfer. - (+) SlaveTxCpltCallback : callback for Slave transmission end of transfer. - (+) SlaveRxCpltCallback : callback for Slave reception end of transfer. - (+) ListenCpltCallback : callback for end of listen mode. - (+) MemTxCpltCallback : callback for Memory transmission end of transfer. - (+) MemRxCpltCallback : callback for Memory reception end of transfer. - (+) ErrorCallback : callback for error detection. - (+) AbortCpltCallback : callback for abort completion process. - (+) MspInitCallback : callback for Msp Init. - (+) MspDeInitCallback : callback for Msp DeInit. - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - [..] - For specific callback AddrCallback use dedicated register callbacks : HAL_I2C_RegisterAddrCallback(). - [..] - Use function HAL_I2C_UnRegisterCallback to reset a callback to the default - weak function. - HAL_I2C_UnRegisterCallback takes as parameters the HAL peripheral handle, - and the Callback ID. - This function allows to reset following callbacks: - (+) MasterTxCpltCallback : callback for Master transmission end of transfer. - (+) MasterRxCpltCallback : callback for Master reception end of transfer. - (+) SlaveTxCpltCallback : callback for Slave transmission end of transfer. - (+) SlaveRxCpltCallback : callback for Slave reception end of transfer. - (+) ListenCpltCallback : callback for end of listen mode. - (+) MemTxCpltCallback : callback for Memory transmission end of transfer. - (+) MemRxCpltCallback : callback for Memory reception end of transfer. - (+) ErrorCallback : callback for error detection. - (+) AbortCpltCallback : callback for abort completion process. - (+) MspInitCallback : callback for Msp Init. - (+) MspDeInitCallback : callback for Msp DeInit. - [..] - For callback AddrCallback use dedicated register callbacks : HAL_I2C_UnRegisterAddrCallback(). - [..] - By default, after the HAL_I2C_Init() and when the state is HAL_I2C_STATE_RESET - all callbacks are set to the corresponding weak functions: - examples HAL_I2C_MasterTxCpltCallback(), HAL_I2C_MasterRxCpltCallback(). - Exception done for MspInit and MspDeInit functions that are - reset to the legacy weak functions in the HAL_I2C_Init()/ HAL_I2C_DeInit() only when - these callbacks are null (not registered beforehand). - If MspInit or MspDeInit are not null, the HAL_I2C_Init()/ HAL_I2C_DeInit() - keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. - [..] - Callbacks can be registered/unregistered in HAL_I2C_STATE_READY state only. - Exception done MspInit/MspDeInit functions that can be registered/unregistered - in HAL_I2C_STATE_READY or HAL_I2C_STATE_RESET state, - thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. - Then, the user first registers the MspInit/MspDeInit user callbacks - using HAL_I2C_RegisterCallback() before calling HAL_I2C_DeInit() - or HAL_I2C_Init() function. - [..] - When the compilation flag USE_HAL_I2C_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registration feature is not available and all callbacks - are set to the corresponding weak functions. - - - - [..] - (@) You can refer to the I2C HAL driver header file for more useful macros - - @endverbatim - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup I2C I2C - * @brief I2C HAL module driver - * @{ - */ - -#ifdef HAL_I2C_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @defgroup I2C_Private_Define I2C Private Define - * @{ - */ -#define I2C_TIMEOUT_FLAG 35U /*!< Timeout 35 ms */ -#define I2C_TIMEOUT_BUSY_FLAG 25U /*!< Timeout 25 ms */ -#define I2C_TIMEOUT_STOP_FLAG 5U /*!< Timeout 5 ms */ -#define I2C_NO_OPTION_FRAME 0xFFFF0000U /*!< XferOptions default value */ - -/* Private define for @ref PreviousState usage */ -#define I2C_STATE_MSK ((uint32_t)((uint32_t)((uint32_t)HAL_I2C_STATE_BUSY_TX | (uint32_t)HAL_I2C_STATE_BUSY_RX) & (uint32_t)(~((uint32_t)HAL_I2C_STATE_READY)))) /*!< Mask State define, keep only RX and TX bits */ -#define I2C_STATE_NONE ((uint32_t)(HAL_I2C_MODE_NONE)) /*!< Default Value */ -#define I2C_STATE_MASTER_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MASTER)) /*!< Master Busy TX, combinaison of State LSB and Mode enum */ -#define I2C_STATE_MASTER_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MASTER)) /*!< Master Busy RX, combinaison of State LSB and Mode enum */ -#define I2C_STATE_SLAVE_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_SLAVE)) /*!< Slave Busy TX, combinaison of State LSB and Mode enum */ -#define I2C_STATE_SLAVE_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_SLAVE)) /*!< Slave Busy RX, combinaison of State LSB and Mode enum */ - -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/** @addtogroup I2C_Private_Macros - * @{ - */ -/* Macro to get remaining data to transfer on DMA side */ -#define I2C_GET_DMA_REMAIN_DATA(__HANDLE__) __HAL_DMA_GET_COUNTER(__HANDLE__) -/** - * @} - */ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ - -/** @defgroup I2C_Private_Functions I2C Private Functions - * @{ - */ -/* Private functions to handle DMA transfer */ -static void I2C_DMAXferCplt(DMA_HandleTypeDef *hdma); -static void I2C_DMAError(DMA_HandleTypeDef *hdma); -static void I2C_DMAAbort(DMA_HandleTypeDef *hdma); - -static void I2C_ITError(I2C_HandleTypeDef *hi2c); - -static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart); - -/* Private functions to handle flags during polling transfer */ -static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef I2C_WaitOnSTOPRequestThroughIT(I2C_HandleTypeDef *hi2c); -static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c); - -/* Private functions for I2C transfer IRQ handler */ -static void I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c); -static void I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c); -static void I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c); -static void I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c); -static void I2C_Master_SB(I2C_HandleTypeDef *hi2c); -static void I2C_Master_ADD10(I2C_HandleTypeDef *hi2c); -static void I2C_Master_ADDR(I2C_HandleTypeDef *hi2c); - -static void I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c); -static void I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c); -static void I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c); -static void I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c); -static void I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c, uint32_t IT2Flags); -static void I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c); -static void I2C_Slave_AF(I2C_HandleTypeDef *hi2c); - -static void I2C_MemoryTransmit_TXE_BTF(I2C_HandleTypeDef *hi2c); - -/* Private function to Convert Specific options */ -static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c); - -/* Private function to flush DR register */ -static void I2C_Flush_DR(I2C_HandleTypeDef *hi2c); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup I2C_Exported_Functions I2C Exported Functions - * @{ - */ - -/** @defgroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - deinitialize the I2Cx peripheral: - - (+) User must Implement HAL_I2C_MspInit() function in which he configures - all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC). - - (+) Call the function HAL_I2C_Init() to configure the selected device with - the selected configuration: - (++) Communication Speed - (++) Duty cycle - (++) Addressing mode - (++) Own Address 1 - (++) Dual Addressing mode - (++) Own Address 2 - (++) General call mode - (++) Nostretch mode - - (+) Call the function HAL_I2C_DeInit() to restore the default configuration - of the selected I2Cx peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the I2C according to the specified parameters - * in the I2C_InitTypeDef and initialize the associated handle. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c) -{ - uint32_t freqrange; - uint32_t pclk1; - - /* Check the I2C handle allocation */ - if (hi2c == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); - assert_param(IS_I2C_CLOCK_SPEED(hi2c->Init.ClockSpeed)); - assert_param(IS_I2C_DUTY_CYCLE(hi2c->Init.DutyCycle)); - assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1)); - assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode)); - assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode)); - assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2)); - assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode)); - assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode)); - - if (hi2c->State == HAL_I2C_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hi2c->Lock = HAL_UNLOCKED; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - /* Init the I2C Callback settings */ - hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */ - hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */ - hi2c->SlaveTxCpltCallback = HAL_I2C_SlaveTxCpltCallback; /* Legacy weak SlaveTxCpltCallback */ - hi2c->SlaveRxCpltCallback = HAL_I2C_SlaveRxCpltCallback; /* Legacy weak SlaveRxCpltCallback */ - hi2c->ListenCpltCallback = HAL_I2C_ListenCpltCallback; /* Legacy weak ListenCpltCallback */ - hi2c->MemTxCpltCallback = HAL_I2C_MemTxCpltCallback; /* Legacy weak MemTxCpltCallback */ - hi2c->MemRxCpltCallback = HAL_I2C_MemRxCpltCallback; /* Legacy weak MemRxCpltCallback */ - hi2c->ErrorCallback = HAL_I2C_ErrorCallback; /* Legacy weak ErrorCallback */ - hi2c->AbortCpltCallback = HAL_I2C_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - hi2c->AddrCallback = HAL_I2C_AddrCallback; /* Legacy weak AddrCallback */ - - if (hi2c->MspInitCallback == NULL) - { - hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit */ - } - - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - hi2c->MspInitCallback(hi2c); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - HAL_I2C_MspInit(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - - hi2c->State = HAL_I2C_STATE_BUSY; - - /* Disable the selected I2C peripheral */ - __HAL_I2C_DISABLE(hi2c); - - /*Reset I2C*/ - hi2c->Instance->CR1 |= I2C_CR1_SWRST; - hi2c->Instance->CR1 &= ~I2C_CR1_SWRST; - - /* Get PCLK1 frequency */ - pclk1 = HAL_RCC_GetPCLK1Freq(); - - /* Check the minimum allowed PCLK1 frequency */ - if (I2C_MIN_PCLK_FREQ(pclk1, hi2c->Init.ClockSpeed) == 1U) - { - return HAL_ERROR; - } - - /* Calculate frequency range */ - freqrange = I2C_FREQRANGE(pclk1); - - /*---------------------------- I2Cx CR2 Configuration ----------------------*/ - /* Configure I2Cx: Frequency range */ - MODIFY_REG(hi2c->Instance->CR2, I2C_CR2_FREQ, freqrange); - - /*---------------------------- I2Cx TRISE Configuration --------------------*/ - /* Configure I2Cx: Rise Time */ - MODIFY_REG(hi2c->Instance->TRISE, I2C_TRISE_TRISE, I2C_RISE_TIME(freqrange, hi2c->Init.ClockSpeed)); - - /*---------------------------- I2Cx CCR Configuration ----------------------*/ - /* Configure I2Cx: Speed */ - MODIFY_REG(hi2c->Instance->CCR, (I2C_CCR_FS | I2C_CCR_DUTY | I2C_CCR_CCR), I2C_SPEED(pclk1, hi2c->Init.ClockSpeed, hi2c->Init.DutyCycle)); - - /*---------------------------- I2Cx CR1 Configuration ----------------------*/ - /* Configure I2Cx: Generalcall and NoStretch mode */ - MODIFY_REG(hi2c->Instance->CR1, (I2C_CR1_ENGC | I2C_CR1_NOSTRETCH), (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode)); - - /*---------------------------- I2Cx OAR1 Configuration ---------------------*/ - /* Configure I2Cx: Own Address1 and addressing mode */ - MODIFY_REG(hi2c->Instance->OAR1, (I2C_OAR1_ADDMODE | I2C_OAR1_ADD8_9 | I2C_OAR1_ADD1_7 | I2C_OAR1_ADD0), (hi2c->Init.AddressingMode | hi2c->Init.OwnAddress1)); - - /*---------------------------- I2Cx OAR2 Configuration ---------------------*/ - /* Configure I2Cx: Dual mode and Own Address2 */ - MODIFY_REG(hi2c->Instance->OAR2, (I2C_OAR2_ENDUAL | I2C_OAR2_ADD2), (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2)); - - /* Enable the selected I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->Mode = HAL_I2C_MODE_NONE; - - return HAL_OK; -} - -/** - * @brief DeInitialize the I2C peripheral. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c) -{ - /* Check the I2C handle allocation */ - if (hi2c == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); - - hi2c->State = HAL_I2C_STATE_BUSY; - - /* Disable the I2C Peripheral Clock */ - __HAL_I2C_DISABLE(hi2c); - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - if (hi2c->MspDeInitCallback == NULL) - { - hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit */ - } - - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - hi2c->MspDeInitCallback(hi2c); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_I2C_MspDeInit(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - hi2c->State = HAL_I2C_STATE_RESET; - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; -} - -/** - * @brief Initialize the I2C MSP. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitialize the I2C MSP. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MspDeInit could be implemented in the user file - */ -} - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User I2C Callback - * To be used instead of the weak predefined callback - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_I2C_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID - * @arg @ref HAL_I2C_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID - * @arg @ref HAL_I2C_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID - * @arg @ref HAL_I2C_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID - * @arg @ref HAL_I2C_LISTEN_COMPLETE_CB_ID Listen Complete callback ID - * @arg @ref HAL_I2C_MEM_TX_COMPLETE_CB_ID Memory Tx Transfer callback ID - * @arg @ref HAL_I2C_MEM_RX_COMPLETE_CB_ID Memory Rx Transfer completed callback ID - * @arg @ref HAL_I2C_ERROR_CB_ID Error callback ID - * @arg @ref HAL_I2C_ABORT_CB_ID Abort callback ID - * @arg @ref HAL_I2C_MSPINIT_CB_ID MspInit callback ID - * @arg @ref HAL_I2C_MSPDEINIT_CB_ID MspDeInit callback ID - * @param pCallback pointer to the Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(hi2c); - - if (HAL_I2C_STATE_READY == hi2c->State) - { - switch (CallbackID) - { - case HAL_I2C_MASTER_TX_COMPLETE_CB_ID : - hi2c->MasterTxCpltCallback = pCallback; - break; - - case HAL_I2C_MASTER_RX_COMPLETE_CB_ID : - hi2c->MasterRxCpltCallback = pCallback; - break; - - case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID : - hi2c->SlaveTxCpltCallback = pCallback; - break; - - case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID : - hi2c->SlaveRxCpltCallback = pCallback; - break; - - case HAL_I2C_LISTEN_COMPLETE_CB_ID : - hi2c->ListenCpltCallback = pCallback; - break; - - case HAL_I2C_MEM_TX_COMPLETE_CB_ID : - hi2c->MemTxCpltCallback = pCallback; - break; - - case HAL_I2C_MEM_RX_COMPLETE_CB_ID : - hi2c->MemRxCpltCallback = pCallback; - break; - - case HAL_I2C_ERROR_CB_ID : - hi2c->ErrorCallback = pCallback; - break; - - case HAL_I2C_ABORT_CB_ID : - hi2c->AbortCpltCallback = pCallback; - break; - - case HAL_I2C_MSPINIT_CB_ID : - hi2c->MspInitCallback = pCallback; - break; - - case HAL_I2C_MSPDEINIT_CB_ID : - hi2c->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_I2C_STATE_RESET == hi2c->State) - { - switch (CallbackID) - { - case HAL_I2C_MSPINIT_CB_ID : - hi2c->MspInitCallback = pCallback; - break; - - case HAL_I2C_MSPDEINIT_CB_ID : - hi2c->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - return status; -} - -/** - * @brief Unregister an I2C Callback - * I2C callback is redirected to the weak predefined callback - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * This parameter can be one of the following values: - * @arg @ref HAL_I2C_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID - * @arg @ref HAL_I2C_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID - * @arg @ref HAL_I2C_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID - * @arg @ref HAL_I2C_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID - * @arg @ref HAL_I2C_LISTEN_COMPLETE_CB_ID Listen Complete callback ID - * @arg @ref HAL_I2C_MEM_TX_COMPLETE_CB_ID Memory Tx Transfer callback ID - * @arg @ref HAL_I2C_MEM_RX_COMPLETE_CB_ID Memory Rx Transfer completed callback ID - * @arg @ref HAL_I2C_ERROR_CB_ID Error callback ID - * @arg @ref HAL_I2C_ABORT_CB_ID Abort callback ID - * @arg @ref HAL_I2C_MSPINIT_CB_ID MspInit callback ID - * @arg @ref HAL_I2C_MSPDEINIT_CB_ID MspDeInit callback ID - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hi2c); - - if (HAL_I2C_STATE_READY == hi2c->State) - { - switch (CallbackID) - { - case HAL_I2C_MASTER_TX_COMPLETE_CB_ID : - hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */ - break; - - case HAL_I2C_MASTER_RX_COMPLETE_CB_ID : - hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */ - break; - - case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID : - hi2c->SlaveTxCpltCallback = HAL_I2C_SlaveTxCpltCallback; /* Legacy weak SlaveTxCpltCallback */ - break; - - case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID : - hi2c->SlaveRxCpltCallback = HAL_I2C_SlaveRxCpltCallback; /* Legacy weak SlaveRxCpltCallback */ - break; - - case HAL_I2C_LISTEN_COMPLETE_CB_ID : - hi2c->ListenCpltCallback = HAL_I2C_ListenCpltCallback; /* Legacy weak ListenCpltCallback */ - break; - - case HAL_I2C_MEM_TX_COMPLETE_CB_ID : - hi2c->MemTxCpltCallback = HAL_I2C_MemTxCpltCallback; /* Legacy weak MemTxCpltCallback */ - break; - - case HAL_I2C_MEM_RX_COMPLETE_CB_ID : - hi2c->MemRxCpltCallback = HAL_I2C_MemRxCpltCallback; /* Legacy weak MemRxCpltCallback */ - break; - - case HAL_I2C_ERROR_CB_ID : - hi2c->ErrorCallback = HAL_I2C_ErrorCallback; /* Legacy weak ErrorCallback */ - break; - - case HAL_I2C_ABORT_CB_ID : - hi2c->AbortCpltCallback = HAL_I2C_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - break; - - case HAL_I2C_MSPINIT_CB_ID : - hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit */ - break; - - case HAL_I2C_MSPDEINIT_CB_ID : - hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit */ - break; - - default : - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_I2C_STATE_RESET == hi2c->State) - { - switch (CallbackID) - { - case HAL_I2C_MSPINIT_CB_ID : - hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit */ - break; - - case HAL_I2C_MSPDEINIT_CB_ID : - hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit */ - break; - - default : - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - return status; -} - -/** - * @brief Register the Slave Address Match I2C Callback - * To be used instead of the weak HAL_I2C_AddrCallback() predefined callback - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pCallback pointer to the Address Match Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(hi2c); - - if (HAL_I2C_STATE_READY == hi2c->State) - { - hi2c->AddrCallback = pCallback; - } - else - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - return status; -} - -/** - * @brief UnRegister the Slave Address Match I2C Callback - * Info Ready I2C Callback is redirected to the weak HAL_I2C_AddrCallback() predefined callback - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hi2c); - - if (HAL_I2C_STATE_READY == hi2c->State) - { - hi2c->AddrCallback = HAL_I2C_AddrCallback; /* Legacy weak AddrCallback */ - } - else - { - /* Update the error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - return status; -} - -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - -/** - * @brief I2C data register flush process. - * @param hi2c I2C handle. - * @retval None - */ -static void I2C_Flush_DR(I2C_HandleTypeDef *hi2c) -{ - /* Write a dummy data in DR to clear TXE flag */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) != RESET) - { - hi2c->Instance->DR = 0x00U; - } -} - -/** - * @} - */ - -/** @defgroup I2C_Exported_Functions_Group2 Input and Output operation functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the I2C data - transfers. - - (#) There are two modes of transfer: - (++) Blocking mode : The communication is performed in the polling mode. - The status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode : The communication is performed using Interrupts - or DMA. These functions return the status of the transfer startup. - The end of the data processing will be indicated through the - dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - - (#) Blocking mode functions are : - (++) HAL_I2C_Master_Transmit() - (++) HAL_I2C_Master_Receive() - (++) HAL_I2C_Slave_Transmit() - (++) HAL_I2C_Slave_Receive() - (++) HAL_I2C_Mem_Write() - (++) HAL_I2C_Mem_Read() - (++) HAL_I2C_IsDeviceReady() - - (#) No-Blocking mode functions with Interrupt are : - (++) HAL_I2C_Master_Transmit_IT() - (++) HAL_I2C_Master_Receive_IT() - (++) HAL_I2C_Slave_Transmit_IT() - (++) HAL_I2C_Slave_Receive_IT() - (++) HAL_I2C_Mem_Write_IT() - (++) HAL_I2C_Mem_Read_IT() - (++) HAL_I2C_Master_Seq_Transmit_IT() - (++) HAL_I2C_Master_Seq_Receive_IT() - (++) HAL_I2C_Slave_Seq_Transmit_IT() - (++) HAL_I2C_Slave_Seq_Receive_IT() - (++) HAL_I2C_EnableListen_IT() - (++) HAL_I2C_DisableListen_IT() - (++) HAL_I2C_Master_Abort_IT() - - (#) No-Blocking mode functions with DMA are : - (++) HAL_I2C_Master_Transmit_DMA() - (++) HAL_I2C_Master_Receive_DMA() - (++) HAL_I2C_Slave_Transmit_DMA() - (++) HAL_I2C_Slave_Receive_DMA() - (++) HAL_I2C_Mem_Write_DMA() - (++) HAL_I2C_Mem_Read_DMA() - (++) HAL_I2C_Master_Seq_Transmit_DMA() - (++) HAL_I2C_Master_Seq_Receive_DMA() - (++) HAL_I2C_Slave_Seq_Transmit_DMA() - (++) HAL_I2C_Slave_Seq_Receive_DMA() - - (#) A set of Transfer Complete Callbacks are provided in non Blocking mode: - (++) HAL_I2C_MasterTxCpltCallback() - (++) HAL_I2C_MasterRxCpltCallback() - (++) HAL_I2C_SlaveTxCpltCallback() - (++) HAL_I2C_SlaveRxCpltCallback() - (++) HAL_I2C_MemTxCpltCallback() - (++) HAL_I2C_MemRxCpltCallback() - (++) HAL_I2C_AddrCallback() - (++) HAL_I2C_ListenCpltCallback() - (++) HAL_I2C_ErrorCallback() - (++) HAL_I2C_AbortCpltCallback() - -@endverbatim - * @{ - */ - -/** - * @brief Transmits in master mode an amount of data in blocking mode. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Send Slave Address */ - if (I2C_MasterRequestWrite(hi2c, DevAddress, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - while (hi2c->XferSize > 0U) - { - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - hi2c->XferSize--; - - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - hi2c->XferSize--; - } - - /* Wait until BTF flag is set */ - if (I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receives in master mode an amount of data in blocking mode. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Send Slave Address */ - if (I2C_MasterRequestRead(hi2c, DevAddress, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - if (hi2c->XferSize == 0U) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else if (hi2c->XferSize == 1U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else if (hi2c->XferSize == 2U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable Pos */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - while (hi2c->XferSize > 0U) - { - if (hi2c->XferSize <= 3U) - { - /* One byte */ - if (hi2c->XferSize == 1U) - { - /* Wait until RXNE flag is set */ - if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - /* Two bytes */ - else if (hi2c->XferSize == 2U) - { - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - /* 3 Last bytes */ - else - { - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - else - { - /* Wait until RXNE flag is set */ - if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) - { - - if (hi2c->XferSize == 3U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - } - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmits in slave mode an amount of data in blocking mode. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* If 10bit addressing mode is selected */ - if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT) - { - /* Wait until ADDR flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - while (hi2c->XferSize > 0U) - { - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - return HAL_ERROR; - } - - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - hi2c->XferSize--; - - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - hi2c->XferSize--; - } - } - - /* Wait until AF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_AF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in slave mode an amount of data in blocking mode - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == (uint16_t)0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - while (hi2c->XferSize > 0U) - { - /* Wait until RXNE flag is set */ - if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - return HAL_ERROR; - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - - /* Wait until STOP flag is set */ - if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - return HAL_ERROR; - } - - /* Clear STOP flag */ - __HAL_I2C_CLEAR_STOPFLAG(hi2c); - - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in master mode an amount of data in non-blocking mode with Interrupt - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in master mode an amount of data in non-blocking mode with Interrupt - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in slave mode an amount of data in non-blocking mode with Interrupt - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in slave mode an amount of data in non-blocking mode with Interrupt - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in master mode an amount of data in non-blocking mode with DMA - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - HAL_StatusTypeDef dmaxferstatus; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - - if (hi2c->XferSize > 0U) - { - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmatx->XferHalfCpltCallback = NULL; - hi2c->hdmatx->XferM1CpltCallback = NULL; - hi2c->hdmatx->XferM1HalfCpltCallback = NULL; - hi2c->hdmatx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in master mode an amount of data in non-blocking mode with DMA - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - HAL_StatusTypeDef dmaxferstatus; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - - if (hi2c->XferSize > 0U) - { - if (hi2c->hdmarx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmarx->XferHalfCpltCallback = NULL; - hi2c->hdmarx->XferM1CpltCallback = NULL; - hi2c->hdmarx->XferM1HalfCpltCallback = NULL; - hi2c->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in slave mode an amount of data in non-blocking mode with DMA - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - HAL_StatusTypeDef dmaxferstatus; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmatx->XferHalfCpltCallback = NULL; - hi2c->hdmatx->XferM1CpltCallback = NULL; - hi2c->hdmatx->XferM1HalfCpltCallback = NULL; - hi2c->hdmatx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_LISTEN; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Enable DMA Request */ - hi2c->Instance->CR2 |= I2C_CR2_DMAEN; - - return HAL_OK; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in slave mode an amount of data in non-blocking mode with DMA - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - HAL_StatusTypeDef dmaxferstatus; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - if (hi2c->hdmarx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmarx->XferHalfCpltCallback = NULL; - hi2c->hdmarx->XferM1CpltCallback = NULL; - hi2c->hdmarx->XferM1HalfCpltCallback = NULL; - hi2c->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_LISTEN; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - return HAL_OK; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Write an amount of data in blocking mode to a specific memory address - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Send Slave Address and Memory Address */ - if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - while (hi2c->XferSize > 0U) - { - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - - /* Wait until BTF flag is set */ - if (I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Read an amount of data in blocking mode from a specific memory address - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Send Slave Address and Memory Address */ - if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - if (hi2c->XferSize == 0U) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else if (hi2c->XferSize == 1U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else if (hi2c->XferSize == 2U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable Pos */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - while (hi2c->XferSize > 0U) - { - if (hi2c->XferSize <= 3U) - { - /* One byte */ - if (hi2c->XferSize == 1U) - { - /* Wait until RXNE flag is set */ - if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - /* Two bytes */ - else if (hi2c->XferSize == 2U) - { - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - /* 3 Last bytes */ - else - { - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Wait until BTF flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - else - { - /* Wait until RXNE flag is set */ - if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) - { - if (hi2c->XferSize == 3U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferSize--; - hi2c->XferCount--; - } - } - } - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Write an amount of data in non-blocking mode with Interrupt to a specific memory address - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - hi2c->Memaddress = MemAddress; - hi2c->MemaddSize = MemAddSize; - hi2c->EventCount = 0U; - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Read an amount of data in non-blocking mode with Interrupt from a specific memory address - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - hi2c->Memaddress = MemAddress; - hi2c->MemaddSize = MemAddSize; - hi2c->EventCount = 0U; - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - if (hi2c->XferSize > 0U) - { - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - } - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Write an amount of data in non-blocking mode with DMA to a specific memory address - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - __IO uint32_t count = 0U; - HAL_StatusTypeDef dmaxferstatus; - - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - hi2c->Memaddress = MemAddress; - hi2c->MemaddSize = MemAddSize; - hi2c->EventCount = 0U; - - if (hi2c->XferSize > 0U) - { - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmatx->XferHalfCpltCallback = NULL; - hi2c->hdmatx->XferM1CpltCallback = NULL; - hi2c->hdmatx->XferM1HalfCpltCallback = NULL; - hi2c->hdmatx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Send Slave Address and Memory Address */ - if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK) - { - /* Abort the ongoing DMA */ - dmaxferstatus = HAL_DMA_Abort_IT(hi2c->hdmatx); - - /* Prevent unused argument(s) compilation and MISRA warning */ - UNUSED(dmaxferstatus); - - /* Set the unused I2C DMA transfer complete callback to NULL */ - hi2c->hdmatx->XferCpltCallback = NULL; - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->XferSize = 0U; - hi2c->XferCount = 0U; - - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR); - - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - return HAL_OK; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_SIZE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Reads an amount of data in non-blocking mode with DMA from a specific memory address. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param pData Pointer to data buffer - * @param Size Amount of data to be read - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - /* Init tickstart for timeout management*/ - uint32_t tickstart = HAL_GetTick(); - __IO uint32_t count = 0U; - HAL_StatusTypeDef dmaxferstatus; - - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MEM; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->Devaddress = DevAddress; - hi2c->Memaddress = MemAddress; - hi2c->MemaddSize = MemAddSize; - hi2c->EventCount = 0U; - - if (hi2c->XferSize > 0U) - { - if (hi2c->hdmarx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmarx->XferHalfCpltCallback = NULL; - hi2c->hdmarx->XferM1CpltCallback = NULL; - hi2c->hdmarx->XferM1HalfCpltCallback = NULL; - hi2c->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Send Slave Address and Memory Address */ - if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK) - { - /* Abort the ongoing DMA */ - dmaxferstatus = HAL_DMA_Abort_IT(hi2c->hdmarx); - - /* Prevent unused argument(s) compilation and MISRA warning */ - UNUSED(dmaxferstatus); - - /* Set the unused I2C DMA transfer complete callback to NULL */ - hi2c->hdmarx->XferCpltCallback = NULL; - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->XferSize = 0U; - hi2c->XferCount = 0U; - - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - return HAL_ERROR; - } - - if (hi2c->XferSize == 1U) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - else - { - /* Enable Last DMA bit */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR); - - /* Enable DMA Request */ - hi2c->Instance->CR2 |= I2C_CR2_DMAEN; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Send Slave Address and Memory Address */ - if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Checks if target device is ready for communication. - * @note This function is used with Memory devices - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param Trials Number of trials - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout) -{ - /* Get tick */ - uint32_t tickstart = HAL_GetTick(); - uint32_t I2C_Trials = 0U; - FlagStatus tmp1; - FlagStatus tmp2; - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - do - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - - /* Wait until ADDR or AF flag are set */ - /* Get tick */ - tickstart = HAL_GetTick(); - - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR); - tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); - while ((hi2c->State != HAL_I2C_STATE_TIMEOUT) && (tmp1 == RESET) && (tmp2 == RESET)) - { - if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) - { - hi2c->State = HAL_I2C_STATE_TIMEOUT; - } - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR); - tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); - } - - hi2c->State = HAL_I2C_STATE_READY; - - /* Check if the ADDR flag has been set */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Clear ADDR Flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Clear AF Flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Wait until BUSY flag is reset */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) - { - return HAL_ERROR; - } - } - - /* Increment Trials */ - I2C_Trials++; - } - while (I2C_Trials < Trials); - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential transmit in master I2C mode an amount of data in non-blocking mode with Interrupt. - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - __IO uint32_t Prev_State = 0x00U; - __IO uint32_t count = 0x00U; - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Check Busy Flag only if FIRST call of Master interface */ - if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - hi2c->Devaddress = DevAddress; - - Prev_State = hi2c->PreviousState; - - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential transmit in master I2C mode an amount of data in non-blocking mode with DMA. - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - __IO uint32_t Prev_State = 0x00U; - __IO uint32_t count = 0x00U; - HAL_StatusTypeDef dmaxferstatus; - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Check Busy Flag only if FIRST call of Master interface */ - if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - hi2c->Devaddress = DevAddress; - - Prev_State = hi2c->PreviousState; - - if (hi2c->XferSize > 0U) - { - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmatx->XferHalfCpltCallback = NULL; - hi2c->hdmatx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* If XferOptions is not associated to a new frame, mean no start bit is request, enable directly the DMA request */ - /* In other cases, DMA request is enabled after Slave address treatment in IRQHandler */ - if ((XferOptions == I2C_NEXT_FRAME) || (XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)) - { - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - } - - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential receive in master I2C mode an amount of data in non-blocking mode with Interrupt - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - __IO uint32_t Prev_State = 0x00U; - __IO uint32_t count = 0U; - uint32_t enableIT = (I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Check Busy Flag only if FIRST call of Master interface */ - if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - hi2c->Devaddress = DevAddress; - - Prev_State = hi2c->PreviousState; - - if ((hi2c->XferCount == 2U) && ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP))) - { - if (Prev_State == I2C_STATE_MASTER_BUSY_RX) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable Pos */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - /* Remove Enabling of IT_BUF, mean RXNE treatment, treat the 2 bytes through BTF */ - enableIT &= ~I2C_IT_BUF; - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable interrupts */ - __HAL_I2C_ENABLE_IT(hi2c, enableIT); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential receive in master mode an amount of data in non-blocking mode with DMA - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - __IO uint32_t Prev_State = 0x00U; - __IO uint32_t count = 0U; - uint32_t enableIT = (I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - HAL_StatusTypeDef dmaxferstatus; - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - /* Check Busy Flag only if FIRST call of Master interface */ - if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) - { - /* Wait until BUSY flag is reset */ - count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_BUSY; - } - } - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - /* Clear Last DMA bit */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->Mode = HAL_I2C_MODE_MASTER; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - hi2c->Devaddress = DevAddress; - - Prev_State = hi2c->PreviousState; - - if (hi2c->XferSize > 0U) - { - if ((hi2c->XferCount == 2U) && ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP))) - { - if (Prev_State == I2C_STATE_MASTER_BUSY_RX) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable Pos */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - /* Enable Last DMA bit */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - if ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_OTHER_AND_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)) - { - /* Enable Last DMA bit */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - } - } - if (hi2c->hdmarx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmarx->XferHalfCpltCallback = NULL; - hi2c->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - if (dmaxferstatus == HAL_OK) - { - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Update interrupt for only EVT and ERR */ - enableIT = (I2C_IT_EVT | I2C_IT_ERR); - } - else - { - /* Update interrupt for only ERR */ - enableIT = I2C_IT_ERR; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* If XferOptions is not associated to a new frame, mean no start bit is request, enable directly the DMA request */ - /* In other cases, DMA request is enabled after Slave address treatment in IRQHandler */ - if ((XferOptions == I2C_NEXT_FRAME) || (XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)) - { - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - } - - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, enableIT); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable interrupts */ - __HAL_I2C_ENABLE_IT(hi2c, enableIT); - } - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential transmit in slave mode an amount of data in non-blocking mode with Interrupt - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential transmit in slave mode an amount of data in non-blocking mode with DMA - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - HAL_StatusTypeDef dmaxferstatus; - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */ - /* and then toggle the HAL slave RX state to TX state */ - if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN) - { - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - /* Abort DMA Xfer if any */ - if (hi2c->hdmarx != NULL) - { - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA RX */ - if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); - } - } - } - } - else if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) - { - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Abort DMA Xfer if any */ - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA TX */ - if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); - } - } - } - } - else - { - /* Nothing to do */ - } - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmatx->XferHalfCpltCallback = NULL; - hi2c->hdmatx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_LISTEN; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Enable DMA Request */ - hi2c->Instance->CR2 |= I2C_CR2_DMAEN; - - return HAL_OK; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential receive in slave mode an amount of data in non-blocking mode with Interrupt - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sequential receive in slave mode an amount of data in non-blocking mode with DMA - * @note This interface allow to manage repeated start condition when a direction change during transfer - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param pData Pointer to data buffer - * @param Size Amount of data to be sent - * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) -{ - HAL_StatusTypeDef dmaxferstatus; - - /* Check the parameters */ - assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - - if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */ - /* and then toggle the HAL slave RX state to TX state */ - if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN) - { - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - /* Abort DMA Xfer if any */ - if (hi2c->hdmarx != NULL) - { - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA RX */ - if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); - } - } - } - } - else if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) - { - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Abort DMA Xfer if any */ - if (hi2c->hdmatx != NULL) - { - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA TX */ - if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); - } - } - } - } - else - { - /* Nothing to do */ - } - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Disable Pos */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - - hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN; - hi2c->Mode = HAL_I2C_MODE_SLAVE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Prepare transfer parameters */ - hi2c->pBuffPtr = pData; - hi2c->XferCount = Size; - hi2c->XferSize = hi2c->XferCount; - hi2c->XferOptions = XferOptions; - - if (hi2c->hdmarx != NULL) - { - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Set the unused DMA callbacks to NULL */ - hi2c->hdmarx->XferHalfCpltCallback = NULL; - hi2c->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_LISTEN; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - if (dmaxferstatus == HAL_OK) - { - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - return HAL_OK; - } - else - { - /* Update I2C state */ - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Update I2C error code */ - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Enable the Address listen mode with Interrupt. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c) -{ - if (hi2c->State == HAL_I2C_STATE_READY) - { - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Check if the I2C is already enabled */ - if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) - { - /* Enable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - } - - /* Enable Address Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable EVT and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Disable the Address listen mode with Interrupt. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of tmp to prevent undefined behavior of volatile usage */ - uint32_t tmp; - - /* Disable Address listen mode only if a transfer is not ongoing */ - if (hi2c->State == HAL_I2C_STATE_LISTEN) - { - tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK; - hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode); - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Disable Address Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Disable EVT and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Abort a master or memory I2C IT or DMA process communication with Interrupt. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - - /* Prevent unused argument(s) compilation warning */ - UNUSED(DevAddress); - - /* Abort Master transfer during Receive or Transmit process */ - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET) && ((CurrentMode == HAL_I2C_MODE_MASTER) || - (CurrentMode == HAL_I2C_MODE_MEM))) - { - /* Process Locked */ - __HAL_LOCK(hi2c); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_ABORT; - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->XferCount = 0U; - - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Call the corresponding callback to inform upper layer of End of Transfer */ - I2C_ITError(hi2c); - - return HAL_OK; - } - else - { - /* Wrong usage of abort function */ - /* This function should be used only in case of abort monitored by master device */ - /* Or periphal is not in busy state, mean there is no active sequence to be abort */ - return HAL_ERROR; - } -} - -/** - * @} - */ - -/** @defgroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks - * @{ - */ - -/** - * @brief This function handles I2C event interrupt request. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c) -{ - uint32_t sr1itflags; - uint32_t sr2itflags = 0U; - uint32_t itsources = READ_REG(hi2c->Instance->CR2); - uint32_t CurrentXferOptions = hi2c->XferOptions; - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - /* Master or Memory mode selected */ - if ((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM)) - { - sr2itflags = READ_REG(hi2c->Instance->SR2); - sr1itflags = READ_REG(hi2c->Instance->SR1); - - /* Exit IRQ event until Start Bit detected in case of Other frame requested */ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_SB) == RESET) && (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(CurrentXferOptions) == 1U)) - { - return; - } - - /* SB Set ----------------------------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_SB) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - /* Convert OTHER_xxx XferOptions if any */ - I2C_ConvertOtherXferOptions(hi2c); - - I2C_Master_SB(hi2c); - } - /* ADD10 Set -------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADD10) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_Master_ADD10(hi2c); - } - /* ADDR Set --------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_Master_ADDR(hi2c); - } - /* I2C in mode Transmitter -----------------------------------------------*/ - else if (I2C_CHECK_FLAG(sr2itflags, I2C_FLAG_TRA) != RESET) - { - /* Do not check buffer and BTF flag if a Xfer DMA is on going */ - if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN) - { - /* TXE set and BTF reset -----------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_TXE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) - { - I2C_MasterTransmit_TXE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - if (CurrentState == HAL_I2C_STATE_BUSY_TX) - { - I2C_MasterTransmit_BTF(hi2c); - } - else /* HAL_I2C_MODE_MEM */ - { - if (CurrentMode == HAL_I2C_MODE_MEM) - { - I2C_MemoryTransmit_TXE_BTF(hi2c); - } - } - } - else - { - /* Do nothing */ - } - } - } - /* I2C in mode Receiver --------------------------------------------------*/ - else - { - /* Do not check buffer and BTF flag if a Xfer DMA is on going */ - if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN) - { - /* RXNE set and BTF reset -----------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_RXNE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) - { - I2C_MasterReceive_RXNE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_MasterReceive_BTF(hi2c); - } - else - { - /* Do nothing */ - } - } - } - } - /* Slave mode selected */ - else - { - /* If an error is detected, read only SR1 register to prevent */ - /* a clear of ADDR flags by reading SR2 after reading SR1 in Error treatment */ - if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - sr1itflags = READ_REG(hi2c->Instance->SR1); - } - else - { - sr2itflags = READ_REG(hi2c->Instance->SR2); - sr1itflags = READ_REG(hi2c->Instance->SR1); - } - - /* ADDR set --------------------------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - /* Now time to read SR2, this will clear ADDR flag automatically */ - if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - sr2itflags = READ_REG(hi2c->Instance->SR2); - } - I2C_Slave_ADDR(hi2c, sr2itflags); - } - /* STOPF set --------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_Slave_STOPF(hi2c); - } - /* I2C in mode Transmitter -----------------------------------------------*/ - else if ((CurrentState == HAL_I2C_STATE_BUSY_TX) || (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN)) - { - /* TXE set and BTF reset -----------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_TXE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) - { - I2C_SlaveTransmit_TXE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_SlaveTransmit_BTF(hi2c); - } - else - { - /* Do nothing */ - } - } - /* I2C in mode Receiver --------------------------------------------------*/ - else - { - /* RXNE set and BTF reset ----------------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_RXNE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) - { - I2C_SlaveReceive_RXNE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) - { - I2C_SlaveReceive_BTF(hi2c); - } - else - { - /* Do nothing */ - } - } - } -} - -/** - * @brief This function handles I2C error interrupt request. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c) -{ - HAL_I2C_ModeTypeDef tmp1; - uint32_t tmp2; - HAL_I2C_StateTypeDef tmp3; - uint32_t tmp4; - uint32_t sr1itflags = READ_REG(hi2c->Instance->SR1); - uint32_t itsources = READ_REG(hi2c->Instance->CR2); - uint32_t error = HAL_I2C_ERROR_NONE; - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - - /* I2C Bus error interrupt occurred ----------------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BERR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) - { - error |= HAL_I2C_ERROR_BERR; - - /* Clear BERR flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR); - } - - /* I2C Arbitration Lost error interrupt occurred ---------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ARLO) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) - { - error |= HAL_I2C_ERROR_ARLO; - - /* Clear ARLO flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO); - } - - /* I2C Acknowledge failure error interrupt occurred ------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) - { - tmp1 = CurrentMode; - tmp2 = hi2c->XferCount; - tmp3 = hi2c->State; - tmp4 = hi2c->PreviousState; - if ((tmp1 == HAL_I2C_MODE_SLAVE) && (tmp2 == 0U) && \ - ((tmp3 == HAL_I2C_STATE_BUSY_TX) || (tmp3 == HAL_I2C_STATE_BUSY_TX_LISTEN) || \ - ((tmp3 == HAL_I2C_STATE_LISTEN) && (tmp4 == I2C_STATE_SLAVE_BUSY_TX)))) - { - I2C_Slave_AF(hi2c); - } - else - { - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - error |= HAL_I2C_ERROR_AF; - - /* Do not generate a STOP in case of Slave receive non acknowledge during transfer (mean not at the end of transfer) */ - if ((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM)) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - } - } - - /* I2C Over-Run/Under-Run interrupt occurred -------------------------------*/ - if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_OVR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) - { - error |= HAL_I2C_ERROR_OVR; - /* Clear OVR flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR); - } - - /* Call the Error Callback in case of Error detected -----------------------*/ - if (error != HAL_I2C_ERROR_NONE) - { - hi2c->ErrorCode |= error; - I2C_ITError(hi2c); - } -} - -/** - * @brief Master Tx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MasterTxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Master Rx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MasterRxCpltCallback could be implemented in the user file - */ -} - -/** @brief Slave Tx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_SlaveTxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Slave Rx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_SlaveRxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Slave Address Match callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param TransferDirection Master request Transfer Direction (Write/Read), value of @ref I2C_XferDirection_definition - * @param AddrMatchCode Address Match Code - * @retval None - */ -__weak void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - UNUSED(TransferDirection); - UNUSED(AddrMatchCode); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_AddrCallback() could be implemented in the user file - */ -} - -/** - * @brief Listen Complete callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_ListenCpltCallback() could be implemented in the user file - */ -} - -/** - * @brief Memory Tx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MemTxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Memory Rx Transfer completed callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_MemRxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief I2C error callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_ErrorCallback could be implemented in the user file - */ -} - -/** - * @brief I2C abort callback. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval None - */ -__weak void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hi2c); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_I2C_AbortCpltCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions - * @brief Peripheral State, Mode and Error functions - * -@verbatim - =============================================================================== - ##### Peripheral State, Mode and Error functions ##### - =============================================================================== - [..] - This subsection permit to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the I2C handle state. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL state - */ -HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c) -{ - /* Return I2C handle state */ - return hi2c->State; -} - -/** - * @brief Returns the I2C Master, Slave, Memory or no mode. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL mode - */ -HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c) -{ - return hi2c->Mode; -} - -/** - * @brief Return the I2C error code. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval I2C Error Code - */ -uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c) -{ - return hi2c->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup I2C_Private_Functions - * @{ - */ - -/** - * @brief Handle TXE flag for Master - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - uint32_t CurrentXferOptions = hi2c->XferOptions; - - if ((hi2c->XferSize == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX)) - { - /* Call TxCpltCallback() directly if no stop mode is set */ - if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME)) - { - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterTxCpltCallback(hi2c); -#else - HAL_I2C_MasterTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else /* Generate Stop condition then Call TxCpltCallback() */ - { - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - hi2c->Mode = HAL_I2C_MODE_NONE; -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemTxCpltCallback(hi2c); -#else - HAL_I2C_MemTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->Mode = HAL_I2C_MODE_NONE; -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterTxCpltCallback(hi2c); -#else - HAL_I2C_MasterTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - } - else if ((CurrentState == HAL_I2C_STATE_BUSY_TX) || \ - ((CurrentMode == HAL_I2C_MODE_MEM) && (CurrentState == HAL_I2C_STATE_BUSY_RX))) - { - if (hi2c->XferCount == 0U) - { - /* Disable BUF interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - } - else - { - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - I2C_MemoryTransmit_TXE_BTF(hi2c); - } - else - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - } - } - else - { - /* Do nothing */ - } -} - -/** - * @brief Handle BTF flag for Master transmitter - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - uint32_t CurrentXferOptions = hi2c->XferOptions; - - if (hi2c->State == HAL_I2C_STATE_BUSY_TX) - { - if (hi2c->XferCount != 0U) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - else - { - /* Call TxCpltCallback() directly if no stop mode is set */ - if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME)) - { - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterTxCpltCallback(hi2c); -#else - HAL_I2C_MasterTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else /* Generate Stop condition then Call TxCpltCallback() */ - { - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - hi2c->Mode = HAL_I2C_MODE_NONE; -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemTxCpltCallback(hi2c); -#else - HAL_I2C_MemTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->Mode = HAL_I2C_MODE_NONE; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterTxCpltCallback(hi2c); -#else - HAL_I2C_MasterTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - } - } - else - { - /* Do nothing */ - } -} - -/** - * @brief Handle TXE and BTF flag for Memory transmitter - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_MemoryTransmit_TXE_BTF(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - if (hi2c->EventCount == 0U) - { - /* If Memory address size is 8Bit */ - if (hi2c->MemaddSize == I2C_MEMADD_SIZE_8BIT) - { - /* Send Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress); - - hi2c->EventCount += 2U; - } - /* If Memory address size is 16Bit */ - else - { - /* Send MSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_MSB(hi2c->Memaddress); - - hi2c->EventCount++; - } - } - else if (hi2c->EventCount == 1U) - { - /* Send LSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress); - - hi2c->EventCount++; - } - else if (hi2c->EventCount == 2U) - { - if (CurrentState == HAL_I2C_STATE_BUSY_RX) - { - /* Generate Restart */ - hi2c->Instance->CR1 |= I2C_CR1_START; - - hi2c->EventCount++; - } - else if ((hi2c->XferCount > 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX)) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - else if ((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX)) - { - /* Generate Stop condition then Call TxCpltCallback() */ - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemTxCpltCallback(hi2c); -#else - HAL_I2C_MemTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - /* Do nothing */ - } - } - else - { - /* Clear TXE and BTF flags */ - I2C_Flush_DR(hi2c); - } -} - -/** - * @brief Handle RXNE flag for Master - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c) -{ - if (hi2c->State == HAL_I2C_STATE_BUSY_RX) - { - uint32_t tmp; - uint32_t CurrentXferOptions; - - CurrentXferOptions = hi2c->XferOptions; - tmp = hi2c->XferCount; - if (tmp > 3U) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - if (hi2c->XferCount == (uint16_t)3) - { - /* Disable BUF interrupt, this help to treat correctly the last 4 bytes - on BTF subroutine */ - /* Disable BUF interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - } - } - else if ((hi2c->XferOptions != I2C_FIRST_AND_NEXT_FRAME) && ((tmp == 1U) || (tmp == 0U))) - { - if (I2C_WaitOnSTOPRequestThroughIT(hi2c) == HAL_OK) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - hi2c->State = HAL_I2C_STATE_READY; - - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->PreviousState = I2C_STATE_NONE; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemRxCpltCallback(hi2c); -#else - HAL_I2C_MemRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->Mode = HAL_I2C_MODE_NONE; - if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) - { - hi2c->PreviousState = I2C_STATE_NONE; - } - else - { - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; - } - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterRxCpltCallback(hi2c); -#else - HAL_I2C_MasterRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - else - { - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Call user error callback */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ErrorCallback(hi2c); -#else - HAL_I2C_ErrorCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - else - { - /* Disable BUF interrupt, this help to treat correctly the last 2 bytes - on BTF subroutine if there is a reception delay between N-1 and N byte */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - } - } -} - -/** - * @brief Handle BTF flag for Master receiver - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - uint32_t CurrentXferOptions = hi2c->XferOptions; - - if (hi2c->XferCount == 4U) - { - /* Disable BUF interrupt, this help to treat correctly the last 2 bytes - on BTF subroutine if there is a reception delay between N-1 and N byte */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - else if (hi2c->XferCount == 3U) - { - /* Disable BUF interrupt, this help to treat correctly the last 2 bytes - on BTF subroutine if there is a reception delay between N-1 and N byte */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - - if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME)) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - else if (hi2c->XferCount == 2U) - { - /* Prepare next transfer or stop current transfer */ - if ((CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP)) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - else if ((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_NEXT_FRAME)) - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - else - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - /* Disable EVT and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - hi2c->State = HAL_I2C_STATE_READY; - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->PreviousState = I2C_STATE_NONE; -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemRxCpltCallback(hi2c); -#else - HAL_I2C_MemRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->Mode = HAL_I2C_MODE_NONE; - if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) - { - hi2c->PreviousState = I2C_STATE_NONE; - } - else - { - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; - } -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterRxCpltCallback(hi2c); -#else - HAL_I2C_MasterRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - else - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } -} - -/** - * @brief Handle SB flag for Master - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_Master_SB(I2C_HandleTypeDef *hi2c) -{ - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - if (hi2c->EventCount == 0U) - { - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress); - } - else - { - hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress); - } - } - else - { - if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) - { - /* Send slave 7 Bits address */ - if (hi2c->State == HAL_I2C_STATE_BUSY_TX) - { - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress); - } - else - { - hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress); - } - - if (((hi2c->hdmatx != NULL) && (hi2c->hdmatx->XferCpltCallback != NULL)) - || ((hi2c->hdmarx != NULL) && (hi2c->hdmarx->XferCpltCallback != NULL))) - { - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - } - } - else - { - if (hi2c->EventCount == 0U) - { - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(hi2c->Devaddress); - } - else if (hi2c->EventCount == 1U) - { - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_READ(hi2c->Devaddress); - } - else - { - /* Do nothing */ - } - } - } -} - -/** - * @brief Handle ADD10 flag for Master - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_Master_ADD10(I2C_HandleTypeDef *hi2c) -{ - /* Send slave address */ - hi2c->Instance->DR = I2C_10BIT_ADDRESS(hi2c->Devaddress); - - if (((hi2c->hdmatx != NULL) && (hi2c->hdmatx->XferCpltCallback != NULL)) - || ((hi2c->hdmarx != NULL) && (hi2c->hdmarx->XferCpltCallback != NULL))) - { - /* Enable DMA Request */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - } -} - -/** - * @brief Handle ADDR flag for Master - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_Master_ADDR(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - uint32_t CurrentXferOptions = hi2c->XferOptions; - uint32_t Prev_State = hi2c->PreviousState; - - if (hi2c->State == HAL_I2C_STATE_BUSY_RX) - { - if ((hi2c->EventCount == 0U) && (CurrentMode == HAL_I2C_MODE_MEM)) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else if ((hi2c->EventCount == 0U) && (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Restart */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - hi2c->EventCount++; - } - else - { - if (hi2c->XferCount == 0U) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - else if (hi2c->XferCount == 1U) - { - if (CurrentXferOptions == I2C_NO_OPTION_FRAME) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - } - /* Prepare next transfer or stop current transfer */ - else if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) \ - && ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (CurrentXferOptions == I2C_FIRST_FRAME))) - { - if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP)) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - } - else if (hi2c->XferCount == 2U) - { - if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP)) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Enable Pos */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - if (((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) && ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP) || (CurrentXferOptions == I2C_LAST_FRAME))) - { - /* Enable Last DMA bit */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - if (((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) && ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP) || (CurrentXferOptions == I2C_LAST_FRAME))) - { - /* Enable Last DMA bit */ - SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - /* Reset Event counter */ - hi2c->EventCount = 0U; - } - } - else - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } -} - -/** - * @brief Handle TXE flag for Slave - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - if (hi2c->XferCount != 0U) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - if ((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN)) - { - /* Last Byte is received, disable Interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - - /* Set state at HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveTxCpltCallback(hi2c); -#else - HAL_I2C_SlaveTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } -} - -/** - * @brief Handle BTF flag for Slave transmitter - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c) -{ - if (hi2c->XferCount != 0U) - { - /* Write data to DR */ - hi2c->Instance->DR = *hi2c->pBuffPtr; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } -} - -/** - * @brief Handle RXNE flag for Slave - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - if (hi2c->XferCount != 0U) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - - if ((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN)) - { - /* Last Byte is received, disable Interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - - /* Set state at HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveRxCpltCallback(hi2c); -#else - HAL_I2C_SlaveRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } -} - -/** - * @brief Handle BTF flag for Slave receiver - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c) -{ - if (hi2c->XferCount != 0U) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } -} - -/** - * @brief Handle ADD flag for Slave - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param IT2Flags Interrupt2 flags to handle. - * @retval None - */ -static void I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c, uint32_t IT2Flags) -{ - uint8_t TransferDirection = I2C_DIRECTION_RECEIVE; - uint16_t SlaveAddrCode; - - if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - /* Disable BUF interrupt, BUF enabling is manage through slave specific interface */ - __HAL_I2C_DISABLE_IT(hi2c, (I2C_IT_BUF)); - - /* Transfer Direction requested by Master */ - if (I2C_CHECK_FLAG(IT2Flags, I2C_FLAG_TRA) == RESET) - { - TransferDirection = I2C_DIRECTION_TRANSMIT; - } - - if (I2C_CHECK_FLAG(IT2Flags, I2C_FLAG_DUALF) == RESET) - { - SlaveAddrCode = (uint16_t)hi2c->Init.OwnAddress1; - } - else - { - SlaveAddrCode = (uint16_t)hi2c->Init.OwnAddress2; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Call Slave Addr callback */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->AddrCallback(hi2c, TransferDirection, SlaveAddrCode); -#else - HAL_I2C_AddrCallback(hi2c, TransferDirection, SlaveAddrCode); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - } -} - -/** - * @brief Handle STOPF flag for Slave - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Clear STOPF flag */ - __HAL_I2C_CLEAR_STOPFLAG(hi2c); - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* If a DMA is ongoing, Update handle size context */ - if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - if ((CurrentState == HAL_I2C_STATE_BUSY_RX) || (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN)) - { - hi2c->XferCount = (uint16_t)(I2C_GET_DMA_REMAIN_DATA(hi2c->hdmarx)); - - if (hi2c->XferCount != 0U) - { - /* Set ErrorCode corresponding to a Non-Acknowledge */ - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - } - - /* Disable, stop the current DMA */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Abort DMA Xfer if any */ - if (HAL_DMA_GetState(hi2c->hdmarx) != HAL_DMA_STATE_READY) - { - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA RX */ - if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); - } - } - } - else - { - hi2c->XferCount = (uint16_t)(I2C_GET_DMA_REMAIN_DATA(hi2c->hdmatx)); - - if (hi2c->XferCount != 0U) - { - /* Set ErrorCode corresponding to a Non-Acknowledge */ - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - } - - /* Disable, stop the current DMA */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - /* Abort DMA Xfer if any */ - if (HAL_DMA_GetState(hi2c->hdmatx) != HAL_DMA_STATE_READY) - { - /* Set the I2C DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; - - /* Abort DMA TX */ - if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); - } - } - } - } - - /* All data are not transferred, so set error code accordingly */ - if (hi2c->XferCount != 0U) - { - /* Store Last receive data if any */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - - /* Store Last receive data if any */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - - /* Update counter */ - hi2c->XferCount--; - } - - if (hi2c->XferCount != 0U) - { - /* Set ErrorCode corresponding to a Non-Acknowledge */ - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - } - } - - if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - /* Call the corresponding callback to inform upper layer of End of Transfer */ - I2C_ITError(hi2c); - } - else - { - if (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN) - { - /* Set state at HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveRxCpltCallback(hi2c); -#else - HAL_I2C_SlaveRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - - if (hi2c->State == HAL_I2C_STATE_LISTEN) - { - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ListenCpltCallback(hi2c); -#else - HAL_I2C_ListenCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - if ((hi2c->PreviousState == I2C_STATE_SLAVE_BUSY_RX) || (CurrentState == HAL_I2C_STATE_BUSY_RX)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveRxCpltCallback(hi2c); -#else - HAL_I2C_SlaveRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - } -} - -/** - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -static void I2C_Slave_AF(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - uint32_t CurrentXferOptions = hi2c->XferOptions; - - if (((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) && \ - (CurrentState == HAL_I2C_STATE_LISTEN)) - { - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ListenCpltCallback(hi2c); -#else - HAL_I2C_ListenCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else if (CurrentState == HAL_I2C_STATE_BUSY_TX) - { - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Clear TXE flag */ - I2C_Flush_DR(hi2c); - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveTxCpltCallback(hi2c); -#else - HAL_I2C_SlaveTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - /* Clear AF flag only */ - /* State Listen, but XferOptions == FIRST or NEXT */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - } -} - -/** - * @brief I2C interrupts error process - * @param hi2c I2C handle. - * @retval None - */ -static void I2C_ITError(I2C_HandleTypeDef *hi2c) -{ - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - uint32_t CurrentError; - - if (((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM)) && (CurrentState == HAL_I2C_STATE_BUSY_RX)) - { - /* Disable Pos bit in I2C CR1 when error occurred in Master/Mem Receive IT Process */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - } - - if (((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - /* keep HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_LISTEN; - } - else - { - /* If state is an abort treatment on going, don't change state */ - /* This change will be do later */ - if ((READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN) && (CurrentState != HAL_I2C_STATE_ABORT)) - { - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - } - hi2c->PreviousState = I2C_STATE_NONE; - } - - /* Abort DMA transfer */ - if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) == I2C_CR2_DMAEN) - { - hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN; - - if (hi2c->hdmatx->State != HAL_DMA_STATE_READY) - { - /* Set the DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; - - if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) - { - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - hi2c->State = HAL_I2C_STATE_READY; - - /* Call Directly XferAbortCallback function in case of error */ - hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); - } - } - else - { - /* Set the DMA Abort callback : - will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ - hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; - - if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) - { - /* Store Last receive data if any */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - } - - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - hi2c->State = HAL_I2C_STATE_READY; - - /* Call Directly hi2c->hdmarx->XferAbortCallback function in case of error */ - hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); - } - } - } - else if (hi2c->State == HAL_I2C_STATE_ABORT) - { - hi2c->State = HAL_I2C_STATE_READY; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Store Last receive data if any */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - } - - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->AbortCpltCallback(hi2c); -#else - HAL_I2C_AbortCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - /* Store Last receive data if any */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) - { - /* Read data from DR */ - *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; - - /* Increment Buffer pointer */ - hi2c->pBuffPtr++; - } - - /* Call user error callback */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ErrorCallback(hi2c); -#else - HAL_I2C_ErrorCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - - /* STOP Flag is not set after a NACK reception, BusError, ArbitrationLost, OverRun */ - CurrentError = hi2c->ErrorCode; - - if (((CurrentError & HAL_I2C_ERROR_BERR) == HAL_I2C_ERROR_BERR) || \ - ((CurrentError & HAL_I2C_ERROR_ARLO) == HAL_I2C_ERROR_ARLO) || \ - ((CurrentError & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF) || \ - ((CurrentError & HAL_I2C_ERROR_OVR) == HAL_I2C_ERROR_OVR)) - { - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - } - - /* So may inform upper layer that listen phase is stopped */ - /* during NACK error treatment */ - CurrentState = hi2c->State; - if (((hi2c->ErrorCode & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF) && (CurrentState == HAL_I2C_STATE_LISTEN)) - { - hi2c->XferOptions = I2C_NO_OPTION_FRAME; - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ListenCpltCallback(hi2c); -#else - HAL_I2C_ListenCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } -} - -/** - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart) -{ - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - uint32_t CurrentXferOptions = hi2c->XferOptions; - - /* Generate Start condition if first transfer */ - if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - else if (hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) - { - /* Generate ReStart */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - else - { - /* Do nothing */ - } - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) - { - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - } - else - { - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress); - - /* Wait until ADD10 flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress); - } - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Master sends target device address for read request. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart) -{ - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - uint32_t CurrentXferOptions = hi2c->XferOptions; - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start condition if first transfer */ - if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME)) - { - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - else if (hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) - { - /* Generate ReStart */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - } - else - { - /* Do nothing */ - } - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) - { - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress); - } - else - { - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress); - - /* Wait until ADD10 flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Restart */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_READ(DevAddress); - } - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Master sends target device address followed by internal memory address for write request. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart) -{ - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* If Memory address size is 8Bit */ - if (MemAddSize == I2C_MEMADD_SIZE_8BIT) - { - /* Send Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - /* If Memory address size is 16Bit */ - else - { - /* Send MSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress); - - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Send LSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - - return HAL_OK; -} - -/** - * @brief Master sends target device address followed by internal memory address for read request. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress Target device address: The device 7 bits address value - * in datasheet must be shifted to the left before calling the interface - * @param MemAddress Internal memory address - * @param MemAddSize Size of internal memory address - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart) -{ - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* Generate Start */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* If Memory address size is 8Bit */ - if (MemAddSize == I2C_MEMADD_SIZE_8BIT) - { - /* Send Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - /* If Memory address size is 16Bit */ - else - { - /* Send MSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress); - - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Send LSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - - /* Wait until TXE flag is set */ - if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) - { - if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - return HAL_ERROR; - } - - /* Generate Restart */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); - - /* Wait until SB flag is set */ - if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) - { - if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) - { - hi2c->ErrorCode = HAL_I2C_WRONG_START; - } - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress); - - /* Wait until ADDR flag is set */ - if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief DMA I2C process complete callback. - * @param hdma DMA handle - * @retval None - */ -static void I2C_DMAXferCplt(DMA_HandleTypeDef *hdma) -{ - I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */ - - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; - uint32_t CurrentXferOptions = hi2c->XferOptions; - - /* Disable EVT and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Clear Complete callback */ - if (hi2c->hdmatx != NULL) - { - hi2c->hdmatx->XferCpltCallback = NULL; - } - if (hi2c->hdmarx != NULL) - { - hi2c->hdmarx->XferCpltCallback = NULL; - } - - if ((((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_BUSY_TX) == (uint32_t)HAL_I2C_STATE_BUSY_TX) || ((((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_BUSY_RX) == (uint32_t)HAL_I2C_STATE_BUSY_RX) && (CurrentMode == HAL_I2C_MODE_SLAVE))) - { - /* Disable DMA Request */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - hi2c->XferCount = 0U; - - if (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN) - { - /* Set state at HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveTxCpltCallback(hi2c); -#else - HAL_I2C_SlaveTxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else if (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN) - { - /* Set state at HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; - hi2c->State = HAL_I2C_STATE_LISTEN; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->SlaveRxCpltCallback(hi2c); -#else - HAL_I2C_SlaveRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - /* Do nothing */ - } - - /* Enable EVT and ERR interrupt to treat end of transfer in IRQ handler */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - } - /* Check current Mode, in case of treatment DMA handler have been preempted by a prior interrupt */ - else if (hi2c->Mode != HAL_I2C_MODE_NONE) - { - if (hi2c->XferCount == (uint16_t)1) - { - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - } - - /* Disable EVT and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - /* Prepare next transfer or stop current transfer */ - if ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_OTHER_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - } - - /* Disable Last DMA */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); - - /* Disable DMA Request */ - CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); - - hi2c->XferCount = 0U; - - /* Check if Errors has been detected during transfer */ - if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ErrorCallback(hi2c); -#else - HAL_I2C_ErrorCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->State = HAL_I2C_STATE_READY; - - if (hi2c->Mode == HAL_I2C_MODE_MEM) - { - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->PreviousState = I2C_STATE_NONE; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MemRxCpltCallback(hi2c); -#else - HAL_I2C_MemRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - hi2c->Mode = HAL_I2C_MODE_NONE; - if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) - { - hi2c->PreviousState = I2C_STATE_NONE; - } - else - { - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; - } - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->MasterRxCpltCallback(hi2c); -#else - HAL_I2C_MasterRxCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - } - } - else - { - /* Do nothing */ - } -} - -/** - * @brief DMA I2C communication error callback. - * @param hdma DMA handle - * @retval None - */ -static void I2C_DMAError(DMA_HandleTypeDef *hdma) -{ - I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */ - - /* Clear Complete callback */ - if (hi2c->hdmatx != NULL) - { - hi2c->hdmatx->XferCpltCallback = NULL; - } - if (hi2c->hdmarx != NULL) - { - hi2c->hdmarx->XferCpltCallback = NULL; - } - - /* Ignore DMA FIFO error */ - if (HAL_DMA_GetError(hdma) != HAL_DMA_ERROR_FE) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - hi2c->XferCount = 0U; - - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ErrorCallback(hi2c); -#else - HAL_I2C_ErrorCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } -} - -/** - * @brief DMA I2C communication abort callback - * (To be called at end of DMA Abort procedure). - * @param hdma DMA handle. - * @retval None - */ -static void I2C_DMAAbort(DMA_HandleTypeDef *hdma) -{ - __IO uint32_t count = 0U; - I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */ - - /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ - HAL_I2C_StateTypeDef CurrentState = hi2c->State; - - /* During abort treatment, check that there is no pending STOP request */ - /* Wait until STOP flag is reset */ - count = I2C_TIMEOUT_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - if (count == 0U) - { - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - break; - } - count--; - } - while (READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP); - - /* Clear Complete callback */ - if (hi2c->hdmatx != NULL) - { - hi2c->hdmatx->XferCpltCallback = NULL; - } - if (hi2c->hdmarx != NULL) - { - hi2c->hdmarx->XferCpltCallback = NULL; - } - - /* Disable Acknowledge */ - CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - hi2c->XferCount = 0U; - - /* Reset XferAbortCallback */ - if (hi2c->hdmatx != NULL) - { - hi2c->hdmatx->XferAbortCallback = NULL; - } - if (hi2c->hdmarx != NULL) - { - hi2c->hdmarx->XferAbortCallback = NULL; - } - - /* Disable I2C peripheral to prevent dummy data in buffer */ - __HAL_I2C_DISABLE(hi2c); - - /* Check if come from abort from user */ - if (hi2c->State == HAL_I2C_STATE_ABORT) - { - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->AbortCpltCallback(hi2c); -#else - HAL_I2C_AbortCpltCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } - else - { - if (((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) - { - /* Renable I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - - /* Enable Acknowledge */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); - - /* keep HAL_I2C_STATE_LISTEN */ - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_LISTEN; - } - else - { - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - } - - /* Call the corresponding callback to inform upper layer of End of Transfer */ -#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) - hi2c->ErrorCallback(hi2c); -#else - HAL_I2C_ErrorCallback(hi2c); -#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ - } -} - -/** - * @brief This function handles I2C Communication Timeout. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param Flag specifies the I2C flag to check. - * @param Status The new Flag status (SET or RESET). - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart) -{ - /* Wait until flag is set */ - while (__HAL_I2C_GET_FLAG(hi2c, Flag) == Status) - { - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, Flag) == Status)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for Master addressing phase. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param Flag specifies the I2C flag to check. - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart) -{ - while (__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET) - { - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) - { - /* Generate Stop */ - SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); - - /* Clear AF Flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for specific usage of TXE flag. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) -{ - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET) - { - /* Check if a NACK is detected */ - if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK) - { - return HAL_ERROR; - } - - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for specific usage of BTF flag. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) -{ - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == RESET) - { - /* Check if a NACK is detected */ - if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK) - { - return HAL_ERROR; - } - - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == RESET)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for specific usage of STOP flag. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) -{ - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) - { - /* Check if a NACK is detected */ - if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK) - { - return HAL_ERROR; - } - - /* Check for the Timeout */ - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for specific usage of STOP request through Interrupt. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnSTOPRequestThroughIT(I2C_HandleTypeDef *hi2c) -{ - __IO uint32_t count = 0U; - - /* Wait until STOP flag is reset */ - count = I2C_TIMEOUT_STOP_FLAG * (SystemCoreClock / 25U / 1000U); - do - { - count--; - if (count == 0U) - { - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - return HAL_ERROR; - } - } - while (READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP); - - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for specific usage of RXNE flag. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @param Timeout Timeout duration - * @param Tickstart Tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) -{ - - while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET) - { - /* Check if a STOPF is detected */ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET) - { - /* Clear STOP Flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - /* Check for the Timeout */ - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET)) - { - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles Acknowledge failed detection during an I2C Communication. - * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c) -{ - if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) - { - /* Clear NACKF Flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - hi2c->PreviousState = I2C_STATE_NONE; - hi2c->State = HAL_I2C_STATE_READY; - hi2c->Mode = HAL_I2C_MODE_NONE; - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - return HAL_OK; -} - -/** - * @brief Convert I2Cx OTHER_xxx XferOptions to functional XferOptions. - * @param hi2c I2C handle. - * @retval None - */ -static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c) -{ - /* if user set XferOptions to I2C_OTHER_FRAME */ - /* it request implicitly to generate a restart condition */ - /* set XferOptions to I2C_FIRST_FRAME */ - if (hi2c->XferOptions == I2C_OTHER_FRAME) - { - hi2c->XferOptions = I2C_FIRST_FRAME; - } - /* else if user set XferOptions to I2C_OTHER_AND_LAST_FRAME */ - /* it request implicitly to generate a restart condition */ - /* then generate a stop condition at the end of transfer */ - /* set XferOptions to I2C_FIRST_AND_LAST_FRAME */ - else if (hi2c->XferOptions == I2C_OTHER_AND_LAST_FRAME) - { - hi2c->XferOptions = I2C_FIRST_AND_LAST_FRAME; - } - else - { - /* Nothing to do */ - } -} - -/** - * @} - */ - -#endif /* HAL_I2C_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c deleted file mode 100644 index 351f4fd..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c +++ /dev/null @@ -1,182 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_i2c_ex.c - * @author MCD Application Team - * @brief I2C Extension HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of I2C extension peripheral: - * + Extension features functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### I2C peripheral extension features ##### - ============================================================================== - - [..] Comparing to other previous devices, the I2C interface for STM32F427xx/437xx/ - 429xx/439xx devices contains the following additional features : - - (+) Possibility to disable or enable Analog Noise Filter - (+) Use of a configured Digital Noise Filter - - ##### How to use this driver ##### - ============================================================================== - [..] This driver provides functions to configure Noise Filter - (#) Configure I2C Analog noise filter using the function HAL_I2C_AnalogFilter_Config() - (#) Configure I2C Digital noise filter using the function HAL_I2C_DigitalFilter_Config() - - @endverbatim - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup I2CEx I2CEx - * @brief I2C HAL module driver - * @{ - */ - -#ifdef HAL_I2C_MODULE_ENABLED - -#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup I2CEx_Exported_Functions I2C Exported Functions - * @{ - */ - - -/** @defgroup I2CEx_Exported_Functions_Group1 Extension features functions - * @brief Extension features functions - * -@verbatim - =============================================================================== - ##### Extension features functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure Noise Filters - -@endverbatim - * @{ - */ - -/** - * @brief Configures I2C Analog noise filter. - * @param hi2c pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2Cx peripheral. - * @param AnalogFilter new state of the Analog filter. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2CEx_ConfigAnalogFilter(I2C_HandleTypeDef *hi2c, uint32_t AnalogFilter) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); - assert_param(IS_I2C_ANALOG_FILTER(AnalogFilter)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - hi2c->State = HAL_I2C_STATE_BUSY; - - /* Disable the selected I2C peripheral */ - __HAL_I2C_DISABLE(hi2c); - - /* Reset I2Cx ANOFF bit */ - hi2c->Instance->FLTR &= ~(I2C_FLTR_ANOFF); - - /* Disable the analog filter */ - hi2c->Instance->FLTR |= AnalogFilter; - - __HAL_I2C_ENABLE(hi2c); - - hi2c->State = HAL_I2C_STATE_READY; - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Configures I2C Digital noise filter. - * @param hi2c pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2Cx peripheral. - * @param DigitalFilter Coefficient of digital noise filter between 0x00 and 0x0F. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter) -{ - uint16_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); - assert_param(IS_I2C_DIGITAL_FILTER(DigitalFilter)); - - if (hi2c->State == HAL_I2C_STATE_READY) - { - hi2c->State = HAL_I2C_STATE_BUSY; - - /* Disable the selected I2C peripheral */ - __HAL_I2C_DISABLE(hi2c); - - /* Get the old register value */ - tmpreg = hi2c->Instance->FLTR; - - /* Reset I2Cx DNF bit [3:0] */ - tmpreg &= ~(I2C_FLTR_DNF); - - /* Set I2Cx DNF coefficient */ - tmpreg |= DigitalFilter; - - /* Store the new register value */ - hi2c->Instance->FLTR = tmpreg; - - __HAL_I2C_ENABLE(hi2c); - - hi2c->State = HAL_I2C_STATE_READY; - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @} - */ - -/** - * @} - */ -#endif - -#endif /* HAL_I2C_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c deleted file mode 100644 index c5133aa..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c +++ /dev/null @@ -1,2215 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_ltdc.c - * @author MCD Application Team - * @brief LTDC HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the LTDC peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State and Errors functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The LTDC HAL driver can be used as follows: - - (#) Declare a LTDC_HandleTypeDef handle structure, for example: LTDC_HandleTypeDef hltdc; - - (#) Initialize the LTDC low level resources by implementing the HAL_LTDC_MspInit() API: - (##) Enable the LTDC interface clock - (##) NVIC configuration if you need to use interrupt process - (+++) Configure the LTDC interrupt priority - (+++) Enable the NVIC LTDC IRQ Channel - - (#) Initialize the required configuration through the following parameters: - the LTDC timing, the horizontal and vertical polarity, the pixel clock polarity, - Data Enable polarity and the LTDC background color value using HAL_LTDC_Init() function - - *** Configuration *** - ========================= - [..] - (#) Program the required configuration through the following parameters: - the pixel format, the blending factors, input alpha value, the window size - and the image size using HAL_LTDC_ConfigLayer() function for foreground - or/and background layer. - - (#) Optionally, configure and enable the CLUT using HAL_LTDC_ConfigCLUT() and - HAL_LTDC_EnableCLUT functions. - - (#) Optionally, enable the Dither using HAL_LTDC_EnableDither(). - - (#) Optionally, configure and enable the Color keying using HAL_LTDC_ConfigColorKeying() - and HAL_LTDC_EnableColorKeying functions. - - (#) Optionally, configure LineInterrupt using HAL_LTDC_ProgramLineEvent() - function - - (#) If needed, reconfigure and change the pixel format value, the alpha value - value, the window size, the window position and the layer start address - for foreground or/and background layer using respectively the following - functions: HAL_LTDC_SetPixelFormat(), HAL_LTDC_SetAlpha(), HAL_LTDC_SetWindowSize(), - HAL_LTDC_SetWindowPosition() and HAL_LTDC_SetAddress(). - - (#) Variant functions with _NoReload suffix allows to set the LTDC configuration/settings without immediate reload. - This is useful in case when the program requires to modify serval LTDC settings (on one or both layers) - then applying(reload) these settings in one shot by calling the function HAL_LTDC_Reload(). - - After calling the _NoReload functions to set different color/format/layer settings, - the program shall call the function HAL_LTDC_Reload() to apply(reload) these settings. - Function HAL_LTDC_Reload() can be called with the parameter ReloadType set to LTDC_RELOAD_IMMEDIATE if - an immediate reload is required. - Function HAL_LTDC_Reload() can be called with the parameter ReloadType set to LTDC_RELOAD_VERTICAL_BLANKING if - the reload should be done in the next vertical blanking period, - this option allows to avoid display flicker by applying the new settings during the vertical blanking period. - - - (#) To control LTDC state you can use the following function: HAL_LTDC_GetState() - - *** LTDC HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in LTDC HAL driver. - - (+) __HAL_LTDC_ENABLE: Enable the LTDC. - (+) __HAL_LTDC_DISABLE: Disable the LTDC. - (+) __HAL_LTDC_LAYER_ENABLE: Enable an LTDC Layer. - (+) __HAL_LTDC_LAYER_DISABLE: Disable an LTDC Layer. - (+) __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG: Reload Layer Configuration. - (+) __HAL_LTDC_GET_FLAG: Get the LTDC pending flags. - (+) __HAL_LTDC_CLEAR_FLAG: Clear the LTDC pending flags. - (+) __HAL_LTDC_ENABLE_IT: Enable the specified LTDC interrupts. - (+) __HAL_LTDC_DISABLE_IT: Disable the specified LTDC interrupts. - (+) __HAL_LTDC_GET_IT_SOURCE: Check whether the specified LTDC interrupt has occurred or not. - - [..] - (@) You can refer to the LTDC HAL driver header file for more useful macros - - - *** Callback registration *** - ============================================= - [..] - The compilation define USE_HAL_LTDC_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - Use function HAL_LTDC_RegisterCallback() to register a callback. - - [..] - Function HAL_LTDC_RegisterCallback() allows to register following callbacks: - (+) LineEventCallback : LTDC Line Event Callback. - (+) ReloadEventCallback : LTDC Reload Event Callback. - (+) ErrorCallback : LTDC Error Callback - (+) MspInitCallback : LTDC MspInit. - (+) MspDeInitCallback : LTDC MspDeInit. - [..] - This function takes as parameters the HAL peripheral handle, the callback ID - and a pointer to the user callback function. - - [..] - Use function HAL_LTDC_UnRegisterCallback() to reset a callback to the default - weak function. - HAL_LTDC_UnRegisterCallback() takes as parameters the HAL peripheral handle - and the callback ID. - [..] - This function allows to reset following callbacks: - (+) LineEventCallback : LTDC Line Event Callback - (+) ReloadEventCallback : LTDC Reload Event Callback - (+) ErrorCallback : LTDC Error Callback - (+) MspInitCallback : LTDC MspInit - (+) MspDeInitCallback : LTDC MspDeInit. - - [..] - By default, after the HAL_LTDC_Init and when the state is HAL_LTDC_STATE_RESET - all callbacks are set to the corresponding weak functions: - examples HAL_LTDC_LineEventCallback(), HAL_LTDC_ErrorCallback(). - Exception done for MspInit and MspDeInit functions that are - reset to the legacy weak (surcharged) functions in the HAL_LTDC_Init() and HAL_LTDC_DeInit() - only when these callbacks are null (not registered beforehand). - If not, MspInit or MspDeInit are not null, the HAL_LTDC_Init() and HAL_LTDC_DeInit() - keep and use the user MspInit/MspDeInit callbacks (registered beforehand). - - [..] - Callbacks can be registered/unregistered in HAL_LTDC_STATE_READY state only. - Exception done MspInit/MspDeInit that can be registered/unregistered - in HAL_LTDC_STATE_READY or HAL_LTDC_STATE_RESET state, - thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using HAL_LTDC_RegisterCallback() before calling HAL_LTDC_DeInit() - or HAL_LTDC_Init() function. - - [..] - When the compilation define USE_HAL_LTDC_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registration feature is not available and all callbacks - are set to the corresponding weak functions. - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -#ifdef HAL_LTDC_MODULE_ENABLED - -#if defined (LTDC) - -/** @defgroup LTDC LTDC - * @brief LTDC HAL module driver - * @{ - */ - - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @defgroup LTDC_Private_Define LTDC Private Define - * @{ - */ -#define LTDC_TIMEOUT_VALUE ((uint32_t)100U) /* 100ms */ -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static void LTDC_SetConfig(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx); -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup LTDC_Exported_Functions LTDC Exported Functions - * @{ - */ - -/** @defgroup LTDC_Exported_Functions_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initialize and configure the LTDC - (+) De-initialize the LTDC - -@endverbatim - * @{ - */ - -/** - * @brief Initialize the LTDC according to the specified parameters in the LTDC_InitTypeDef. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_Init(LTDC_HandleTypeDef *hltdc) -{ - uint32_t tmp; - uint32_t tmp1; - - /* Check the LTDC peripheral state */ - if (hltdc == NULL) - { - return HAL_ERROR; - } - - /* Check function parameters */ - assert_param(IS_LTDC_ALL_INSTANCE(hltdc->Instance)); - assert_param(IS_LTDC_HSYNC(hltdc->Init.HorizontalSync)); - assert_param(IS_LTDC_VSYNC(hltdc->Init.VerticalSync)); - assert_param(IS_LTDC_AHBP(hltdc->Init.AccumulatedHBP)); - assert_param(IS_LTDC_AVBP(hltdc->Init.AccumulatedVBP)); - assert_param(IS_LTDC_AAH(hltdc->Init.AccumulatedActiveH)); - assert_param(IS_LTDC_AAW(hltdc->Init.AccumulatedActiveW)); - assert_param(IS_LTDC_TOTALH(hltdc->Init.TotalHeigh)); - assert_param(IS_LTDC_TOTALW(hltdc->Init.TotalWidth)); - assert_param(IS_LTDC_HSPOL(hltdc->Init.HSPolarity)); - assert_param(IS_LTDC_VSPOL(hltdc->Init.VSPolarity)); - assert_param(IS_LTDC_DEPOL(hltdc->Init.DEPolarity)); - assert_param(IS_LTDC_PCPOL(hltdc->Init.PCPolarity)); - -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) - if (hltdc->State == HAL_LTDC_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hltdc->Lock = HAL_UNLOCKED; - - /* Reset the LTDC callback to the legacy weak callbacks */ - hltdc->LineEventCallback = HAL_LTDC_LineEventCallback; /* Legacy weak LineEventCallback */ - hltdc->ReloadEventCallback = HAL_LTDC_ReloadEventCallback; /* Legacy weak ReloadEventCallback */ - hltdc->ErrorCallback = HAL_LTDC_ErrorCallback; /* Legacy weak ErrorCallback */ - - if (hltdc->MspInitCallback == NULL) - { - hltdc->MspInitCallback = HAL_LTDC_MspInit; - } - /* Init the low level hardware */ - hltdc->MspInitCallback(hltdc); - } -#else - if (hltdc->State == HAL_LTDC_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hltdc->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_LTDC_MspInit(hltdc); - } -#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */ - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Configure the HS, VS, DE and PC polarity */ - hltdc->Instance->GCR &= ~(LTDC_GCR_HSPOL | LTDC_GCR_VSPOL | LTDC_GCR_DEPOL | LTDC_GCR_PCPOL); - hltdc->Instance->GCR |= (uint32_t)(hltdc->Init.HSPolarity | hltdc->Init.VSPolarity | \ - hltdc->Init.DEPolarity | hltdc->Init.PCPolarity); - - /* Set Synchronization size */ - tmp = (hltdc->Init.HorizontalSync << 16U); - WRITE_REG(hltdc->Instance->SSCR, (tmp | hltdc->Init.VerticalSync)); - - /* Set Accumulated Back porch */ - tmp = (hltdc->Init.AccumulatedHBP << 16U); - WRITE_REG(hltdc->Instance->BPCR, (tmp | hltdc->Init.AccumulatedVBP)); - - /* Set Accumulated Active Width */ - tmp = (hltdc->Init.AccumulatedActiveW << 16U); - WRITE_REG(hltdc->Instance->AWCR, (tmp | hltdc->Init.AccumulatedActiveH)); - - /* Set Total Width */ - tmp = (hltdc->Init.TotalWidth << 16U); - WRITE_REG(hltdc->Instance->TWCR, (tmp | hltdc->Init.TotalHeigh)); - - /* Set the background color value */ - tmp = ((uint32_t)(hltdc->Init.Backcolor.Green) << 8U); - tmp1 = ((uint32_t)(hltdc->Init.Backcolor.Red) << 16U); - hltdc->Instance->BCCR &= ~(LTDC_BCCR_BCBLUE | LTDC_BCCR_BCGREEN | LTDC_BCCR_BCRED); - hltdc->Instance->BCCR |= (tmp1 | tmp | hltdc->Init.Backcolor.Blue); - - /* Enable the Transfer Error and FIFO underrun interrupts */ - __HAL_LTDC_ENABLE_IT(hltdc, LTDC_IT_TE | LTDC_IT_FU); - - /* Enable LTDC by setting LTDCEN bit */ - __HAL_LTDC_ENABLE(hltdc); - - /* Initialize the error code */ - hltdc->ErrorCode = HAL_LTDC_ERROR_NONE; - - /* Initialize the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - return HAL_OK; -} - -/** - * @brief De-initialize the LTDC peripheral. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @retval None - */ - -HAL_StatusTypeDef HAL_LTDC_DeInit(LTDC_HandleTypeDef *hltdc) -{ - uint32_t tickstart; - - /* Check the LTDC peripheral state */ - if (hltdc == NULL) - { - return HAL_ERROR; - } - - /* Check function parameters */ - assert_param(IS_LTDC_ALL_INSTANCE(hltdc->Instance)); - - /* Disable LTDC Layer 1 */ - __HAL_LTDC_LAYER_DISABLE(hltdc, LTDC_LAYER_1); - -#if defined(LTDC_Layer2_BASE) - /* Disable LTDC Layer 2 */ - __HAL_LTDC_LAYER_DISABLE(hltdc, LTDC_LAYER_2); -#endif /* LTDC_Layer2_BASE */ - - /* Reload during vertical blanking period */ - __HAL_LTDC_VERTICAL_BLANKING_RELOAD_CONFIG(hltdc); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait for VSYNC Interrupt */ - while (READ_BIT(hltdc->Instance->CDSR, LTDC_CDSR_VSYNCS) == 0U) - { - /* Check for the Timeout */ - if ((HAL_GetTick() - tickstart) > LTDC_TIMEOUT_VALUE) - { - break; - } - } - - /* Disable LTDC */ - __HAL_LTDC_DISABLE(hltdc); - -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) - if (hltdc->MspDeInitCallback == NULL) - { - hltdc->MspDeInitCallback = HAL_LTDC_MspDeInit; - } - /* DeInit the low level hardware */ - hltdc->MspDeInitCallback(hltdc); -#else - /* DeInit the low level hardware */ - HAL_LTDC_MspDeInit(hltdc); -#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */ - - /* Initialize the error code */ - hltdc->ErrorCode = HAL_LTDC_ERROR_NONE; - - /* Initialize the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Initialize the LTDC MSP. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @retval None - */ -__weak void HAL_LTDC_MspInit(LTDC_HandleTypeDef *hltdc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hltdc); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_LTDC_MspInit could be implemented in the user file - */ -} - -/** - * @brief De-initialize the LTDC MSP. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @retval None - */ -__weak void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hltdc); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_LTDC_MspDeInit could be implemented in the user file - */ -} - -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User LTDC Callback - * To be used instead of the weak predefined callback - * @param hltdc ltdc handle - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_LTDC_LINE_EVENT_CB_ID Line Event Callback ID - * @arg @ref HAL_LTDC_RELOAD_EVENT_CB_ID Reload Event Callback ID - * @arg @ref HAL_LTDC_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_LTDC_MSPINIT_CB_ID MspInit callback ID - * @arg @ref HAL_LTDC_MSPDEINIT_CB_ID MspDeInit callback ID - * @param pCallback pointer to the Callback function - * @retval status - */ -HAL_StatusTypeDef HAL_LTDC_RegisterCallback(LTDC_HandleTypeDef *hltdc, HAL_LTDC_CallbackIDTypeDef CallbackID, - pLTDC_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hltdc->ErrorCode |= HAL_LTDC_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(hltdc); - - if (hltdc->State == HAL_LTDC_STATE_READY) - { - switch (CallbackID) - { - case HAL_LTDC_LINE_EVENT_CB_ID : - hltdc->LineEventCallback = pCallback; - break; - - case HAL_LTDC_RELOAD_EVENT_CB_ID : - hltdc->ReloadEventCallback = pCallback; - break; - - case HAL_LTDC_ERROR_CB_ID : - hltdc->ErrorCallback = pCallback; - break; - - case HAL_LTDC_MSPINIT_CB_ID : - hltdc->MspInitCallback = pCallback; - break; - - case HAL_LTDC_MSPDEINIT_CB_ID : - hltdc->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hltdc->ErrorCode |= HAL_LTDC_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (hltdc->State == HAL_LTDC_STATE_RESET) - { - switch (CallbackID) - { - case HAL_LTDC_MSPINIT_CB_ID : - hltdc->MspInitCallback = pCallback; - break; - - case HAL_LTDC_MSPDEINIT_CB_ID : - hltdc->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - hltdc->ErrorCode |= HAL_LTDC_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hltdc->ErrorCode |= HAL_LTDC_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hltdc); - - return status; -} - -/** - * @brief Unregister an LTDC Callback - * LTDC callback is redirected to the weak predefined callback - * @param hltdc ltdc handle - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_LTDC_LINE_EVENT_CB_ID Line Event Callback ID - * @arg @ref HAL_LTDC_RELOAD_EVENT_CB_ID Reload Event Callback ID - * @arg @ref HAL_LTDC_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_LTDC_MSPINIT_CB_ID MspInit callback ID - * @arg @ref HAL_LTDC_MSPDEINIT_CB_ID MspDeInit callback ID - * @retval status - */ -HAL_StatusTypeDef HAL_LTDC_UnRegisterCallback(LTDC_HandleTypeDef *hltdc, HAL_LTDC_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hltdc); - - if (hltdc->State == HAL_LTDC_STATE_READY) - { - switch (CallbackID) - { - case HAL_LTDC_LINE_EVENT_CB_ID : - hltdc->LineEventCallback = HAL_LTDC_LineEventCallback; /* Legacy weak LineEventCallback */ - break; - - case HAL_LTDC_RELOAD_EVENT_CB_ID : - hltdc->ReloadEventCallback = HAL_LTDC_ReloadEventCallback; /* Legacy weak ReloadEventCallback */ - break; - - case HAL_LTDC_ERROR_CB_ID : - hltdc->ErrorCallback = HAL_LTDC_ErrorCallback; /* Legacy weak ErrorCallback */ - break; - - case HAL_LTDC_MSPINIT_CB_ID : - hltdc->MspInitCallback = HAL_LTDC_MspInit; /* Legcay weak MspInit Callback */ - break; - - case HAL_LTDC_MSPDEINIT_CB_ID : - hltdc->MspDeInitCallback = HAL_LTDC_MspDeInit; /* Legcay weak MspDeInit Callback */ - break; - - default : - /* Update the error code */ - hltdc->ErrorCode |= HAL_LTDC_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (hltdc->State == HAL_LTDC_STATE_RESET) - { - switch (CallbackID) - { - case HAL_LTDC_MSPINIT_CB_ID : - hltdc->MspInitCallback = HAL_LTDC_MspInit; /* Legcay weak MspInit Callback */ - break; - - case HAL_LTDC_MSPDEINIT_CB_ID : - hltdc->MspDeInitCallback = HAL_LTDC_MspDeInit; /* Legcay weak MspDeInit Callback */ - break; - - default : - /* Update the error code */ - hltdc->ErrorCode |= HAL_LTDC_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - hltdc->ErrorCode |= HAL_LTDC_ERROR_INVALID_CALLBACK; - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hltdc); - - return status; -} -#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup LTDC_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] This section provides function allowing to: - (+) Handle LTDC interrupt request - -@endverbatim - * @{ - */ -/** - * @brief Handle LTDC interrupt request. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @retval HAL status - */ -void HAL_LTDC_IRQHandler(LTDC_HandleTypeDef *hltdc) -{ - uint32_t isrflags = READ_REG(hltdc->Instance->ISR); - uint32_t itsources = READ_REG(hltdc->Instance->IER); - - /* Transfer Error Interrupt management ***************************************/ - if (((isrflags & LTDC_ISR_TERRIF) != 0U) && ((itsources & LTDC_IER_TERRIE) != 0U)) - { - /* Disable the transfer Error interrupt */ - __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_TE); - - /* Clear the transfer error flag */ - __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_TE); - - /* Update error code */ - hltdc->ErrorCode |= HAL_LTDC_ERROR_TE; - - /* Change LTDC state */ - hltdc->State = HAL_LTDC_STATE_ERROR; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - /* Transfer error Callback */ -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) - /*Call registered error callback*/ - hltdc->ErrorCallback(hltdc); -#else - /* Call legacy error callback*/ - HAL_LTDC_ErrorCallback(hltdc); -#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */ - } - - /* FIFO underrun Interrupt management ***************************************/ - if (((isrflags & LTDC_ISR_FUIF) != 0U) && ((itsources & LTDC_IER_FUIE) != 0U)) - { - /* Disable the FIFO underrun interrupt */ - __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_FU); - - /* Clear the FIFO underrun flag */ - __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_FU); - - /* Update error code */ - hltdc->ErrorCode |= HAL_LTDC_ERROR_FU; - - /* Change LTDC state */ - hltdc->State = HAL_LTDC_STATE_ERROR; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - /* Transfer error Callback */ -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) - /*Call registered error callback*/ - hltdc->ErrorCallback(hltdc); -#else - /* Call legacy error callback*/ - HAL_LTDC_ErrorCallback(hltdc); -#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */ - } - - /* Line Interrupt management ************************************************/ - if (((isrflags & LTDC_ISR_LIF) != 0U) && ((itsources & LTDC_IER_LIE) != 0U)) - { - /* Disable the Line interrupt */ - __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_LI); - - /* Clear the Line interrupt flag */ - __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_LI); - - /* Change LTDC state */ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - /* Line interrupt Callback */ -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) - /*Call registered Line Event callback */ - hltdc->LineEventCallback(hltdc); -#else - /*Call Legacy Line Event callback */ - HAL_LTDC_LineEventCallback(hltdc); -#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */ - } - - /* Register reload Interrupt management ***************************************/ - if (((isrflags & LTDC_ISR_RRIF) != 0U) && ((itsources & LTDC_IER_RRIE) != 0U)) - { - /* Disable the register reload interrupt */ - __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_RR); - - /* Clear the register reload flag */ - __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_RR); - - /* Change LTDC state */ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - /* Reload interrupt Callback */ -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) - /*Call registered reload Event callback */ - hltdc->ReloadEventCallback(hltdc); -#else - /*Call Legacy Reload Event callback */ - HAL_LTDC_ReloadEventCallback(hltdc); -#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */ - } -} - -/** - * @brief Error LTDC callback. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @retval None - */ -__weak void HAL_LTDC_ErrorCallback(LTDC_HandleTypeDef *hltdc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hltdc); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_LTDC_ErrorCallback could be implemented in the user file - */ -} - -/** - * @brief Line Event callback. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @retval None - */ -__weak void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef *hltdc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hltdc); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_LTDC_LineEventCallback could be implemented in the user file - */ -} - -/** - * @brief Reload Event callback. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @retval None - */ -__weak void HAL_LTDC_ReloadEventCallback(LTDC_HandleTypeDef *hltdc) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hltdc); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_LTDC_ReloadEvenCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup LTDC_Exported_Functions_Group3 Peripheral Control functions - * @brief Peripheral Control functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure the LTDC foreground or/and background parameters. - (+) Set the active layer. - (+) Configure the color keying. - (+) Configure the C-LUT. - (+) Enable / Disable the color keying. - (+) Enable / Disable the C-LUT. - (+) Update the layer position. - (+) Update the layer size. - (+) Update pixel format on the fly. - (+) Update transparency on the fly. - (+) Update address on the fly. - -@endverbatim - * @{ - */ - -/** - * @brief Configure the LTDC Layer according to the specified - * parameters in the LTDC_InitTypeDef and create the associated handle. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param pLayerCfg pointer to a LTDC_LayerCfgTypeDef structure that contains - * the configuration information for the Layer. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - assert_param(IS_LTDC_HCONFIGST(pLayerCfg->WindowX0)); - assert_param(IS_LTDC_HCONFIGSP(pLayerCfg->WindowX1)); - assert_param(IS_LTDC_VCONFIGST(pLayerCfg->WindowY0)); - assert_param(IS_LTDC_VCONFIGSP(pLayerCfg->WindowY1)); - assert_param(IS_LTDC_PIXEL_FORMAT(pLayerCfg->PixelFormat)); - assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha)); - assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha0)); - assert_param(IS_LTDC_BLENDING_FACTOR1(pLayerCfg->BlendingFactor1)); - assert_param(IS_LTDC_BLENDING_FACTOR2(pLayerCfg->BlendingFactor2)); - assert_param(IS_LTDC_CFBLL(pLayerCfg->ImageWidth)); - assert_param(IS_LTDC_CFBLNBR(pLayerCfg->ImageHeight)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Copy new layer configuration into handle structure */ - hltdc->LayerCfg[LayerIdx] = *pLayerCfg; - - /* Configure the LTDC Layer */ - LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - - /* Set the Immediate Reload type */ - hltdc->Instance->SRCR = LTDC_SRCR_IMR; - - /* Initialize the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Configure the color keying. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param RGBValue the color key value - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_ConfigColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t RGBValue, uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Configure the default color values */ - LTDC_LAYER(hltdc, LayerIdx)->CKCR &= ~(LTDC_LxCKCR_CKBLUE | LTDC_LxCKCR_CKGREEN | LTDC_LxCKCR_CKRED); - LTDC_LAYER(hltdc, LayerIdx)->CKCR = RGBValue; - - /* Set the Immediate Reload type */ - hltdc->Instance->SRCR = LTDC_SRCR_IMR; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Load the color lookup table. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param pCLUT pointer to the color lookup table address. - * @param CLUTSize the color lookup table size. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_ConfigCLUT(LTDC_HandleTypeDef *hltdc, const uint32_t *pCLUT, uint32_t CLUTSize, - uint32_t LayerIdx) -{ - uint32_t tmp; - uint32_t counter; - const uint32_t *pcolorlut = pCLUT; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - for (counter = 0U; (counter < CLUTSize); counter++) - { - if (hltdc->LayerCfg[LayerIdx].PixelFormat == LTDC_PIXEL_FORMAT_AL44) - { - tmp = (((counter + (16U * counter)) << 24U) | ((uint32_t)(*pcolorlut) & 0xFFU) | \ - ((uint32_t)(*pcolorlut) & 0xFF00U) | ((uint32_t)(*pcolorlut) & 0xFF0000U)); - } - else - { - tmp = ((counter << 24U) | ((uint32_t)(*pcolorlut) & 0xFFU) | \ - ((uint32_t)(*pcolorlut) & 0xFF00U) | ((uint32_t)(*pcolorlut) & 0xFF0000U)); - } - - pcolorlut++; - - /* Specifies the C-LUT address and RGB value */ - LTDC_LAYER(hltdc, LayerIdx)->CLUTWR = tmp; - } - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Enable the color keying. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_EnableColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Enable LTDC color keying by setting COLKEN bit */ - LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_COLKEN; - - /* Set the Immediate Reload type */ - hltdc->Instance->SRCR = LTDC_SRCR_IMR; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Disable the color keying. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_DisableColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Disable LTDC color keying by setting COLKEN bit */ - LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_COLKEN; - - /* Set the Immediate Reload type */ - hltdc->Instance->SRCR = LTDC_SRCR_IMR; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Enable the color lookup table. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_EnableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Enable LTDC color lookup table by setting CLUTEN bit */ - LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_CLUTEN; - - /* Set the Immediate Reload type */ - hltdc->Instance->SRCR = LTDC_SRCR_IMR; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Disable the color lookup table. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_DisableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Disable LTDC color lookup table by setting CLUTEN bit */ - LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_CLUTEN; - - /* Set the Immediate Reload type */ - hltdc->Instance->SRCR = LTDC_SRCR_IMR; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Enable Dither. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @retval HAL status - */ - -HAL_StatusTypeDef HAL_LTDC_EnableDither(LTDC_HandleTypeDef *hltdc) -{ - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Enable Dither by setting DTEN bit */ - LTDC->GCR |= (uint32_t)LTDC_GCR_DEN; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Disable Dither. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @retval HAL status - */ - -HAL_StatusTypeDef HAL_LTDC_DisableDither(LTDC_HandleTypeDef *hltdc) -{ - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Disable Dither by setting DTEN bit */ - LTDC->GCR &= ~(uint32_t)LTDC_GCR_DEN; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Set the LTDC window size. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param XSize LTDC Pixel per line - * @param YSize LTDC Line number - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_SetWindowSize(LTDC_HandleTypeDef *hltdc, uint32_t XSize, uint32_t YSize, uint32_t LayerIdx) -{ - LTDC_LayerCfgTypeDef *pLayerCfg; - - /* Check the parameters (Layers parameters)*/ - assert_param(IS_LTDC_LAYER(LayerIdx)); - assert_param(IS_LTDC_CFBLL(XSize)); - assert_param(IS_LTDC_CFBLNBR(YSize)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Get layer configuration from handle structure */ - pLayerCfg = &hltdc->LayerCfg[LayerIdx]; - - /* update horizontal stop */ - pLayerCfg->WindowX1 = XSize + pLayerCfg->WindowX0; - - /* update vertical stop */ - pLayerCfg->WindowY1 = YSize + pLayerCfg->WindowY0; - - /* Reconfigures the color frame buffer pitch in byte */ - pLayerCfg->ImageWidth = XSize; - - /* Reconfigures the frame buffer line number */ - pLayerCfg->ImageHeight = YSize; - - /* Set LTDC parameters */ - LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - - /* Set the Immediate Reload type */ - hltdc->Instance->SRCR = LTDC_SRCR_IMR; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Set the LTDC window position. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param X0 LTDC window X offset - * @param Y0 LTDC window Y offset - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_SetWindowPosition(LTDC_HandleTypeDef *hltdc, uint32_t X0, uint32_t Y0, uint32_t LayerIdx) -{ - LTDC_LayerCfgTypeDef *pLayerCfg; - - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - assert_param(IS_LTDC_CFBLL(X0)); - assert_param(IS_LTDC_CFBLNBR(Y0)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Get layer configuration from handle structure */ - pLayerCfg = &hltdc->LayerCfg[LayerIdx]; - - /* update horizontal start/stop */ - pLayerCfg->WindowX0 = X0; - pLayerCfg->WindowX1 = X0 + pLayerCfg->ImageWidth; - - /* update vertical start/stop */ - pLayerCfg->WindowY0 = Y0; - pLayerCfg->WindowY1 = Y0 + pLayerCfg->ImageHeight; - - /* Set LTDC parameters */ - LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - - /* Set the Immediate Reload type */ - hltdc->Instance->SRCR = LTDC_SRCR_IMR; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Reconfigure the pixel format. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param Pixelformat new pixel format value. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_SetPixelFormat(LTDC_HandleTypeDef *hltdc, uint32_t Pixelformat, uint32_t LayerIdx) -{ - LTDC_LayerCfgTypeDef *pLayerCfg; - - /* Check the parameters */ - assert_param(IS_LTDC_PIXEL_FORMAT(Pixelformat)); - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Get layer configuration from handle structure */ - pLayerCfg = &hltdc->LayerCfg[LayerIdx]; - - /* Reconfigure the pixel format */ - pLayerCfg->PixelFormat = Pixelformat; - - /* Set LTDC parameters */ - LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - - /* Set the Immediate Reload type */ - hltdc->Instance->SRCR = LTDC_SRCR_IMR; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Reconfigure the layer alpha value. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param Alpha new alpha value. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_SetAlpha(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, uint32_t LayerIdx) -{ - LTDC_LayerCfgTypeDef *pLayerCfg; - - /* Check the parameters */ - assert_param(IS_LTDC_ALPHA(Alpha)); - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Get layer configuration from handle structure */ - pLayerCfg = &hltdc->LayerCfg[LayerIdx]; - - /* Reconfigure the Alpha value */ - pLayerCfg->Alpha = Alpha; - - /* Set LTDC parameters */ - LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - - /* Set the Immediate Reload type */ - hltdc->Instance->SRCR = LTDC_SRCR_IMR; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} -/** - * @brief Reconfigure the frame buffer Address. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param Address new address value. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_SetAddress(LTDC_HandleTypeDef *hltdc, uint32_t Address, uint32_t LayerIdx) -{ - LTDC_LayerCfgTypeDef *pLayerCfg; - - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Get layer configuration from handle structure */ - pLayerCfg = &hltdc->LayerCfg[LayerIdx]; - - /* Reconfigure the Address */ - pLayerCfg->FBStartAdress = Address; - - /* Set LTDC parameters */ - LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - - /* Set the Immediate Reload type */ - hltdc->Instance->SRCR = LTDC_SRCR_IMR; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Function used to reconfigure the pitch for specific cases where the attached LayerIdx buffer have a width - * that is larger than the one intended to be displayed on screen. Example of a buffer 800x480 attached to - * layer for which we want to read and display on screen only a portion 320x240 taken in the center - * of the buffer. - * The pitch in pixels will be in that case 800 pixels and not 320 pixels as initially configured by previous - * call to HAL_LTDC_ConfigLayer(). - * @note This function should be called only after a previous call to HAL_LTDC_ConfigLayer() to modify the default - * pitch configured by HAL_LTDC_ConfigLayer() when required (refer to example described just above). - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param LinePitchInPixels New line pitch in pixels to configure for LTDC layer 'LayerIdx'. - * @param LayerIdx LTDC layer index concerned by the modification of line pitch. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_SetPitch(LTDC_HandleTypeDef *hltdc, uint32_t LinePitchInPixels, uint32_t LayerIdx) -{ - uint32_t tmp; - uint32_t pitchUpdate; - uint32_t pixelFormat; - - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* get LayerIdx used pixel format */ - pixelFormat = hltdc->LayerCfg[LayerIdx].PixelFormat; - - if (pixelFormat == LTDC_PIXEL_FORMAT_ARGB8888) - { - tmp = 4U; - } - else if (pixelFormat == LTDC_PIXEL_FORMAT_RGB888) - { - tmp = 3U; - } - else if ((pixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \ - (pixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \ - (pixelFormat == LTDC_PIXEL_FORMAT_ARGB1555) || \ - (pixelFormat == LTDC_PIXEL_FORMAT_AL88)) - { - tmp = 2U; - } - else - { - tmp = 1U; - } - - pitchUpdate = ((LinePitchInPixels * tmp) << 16U); - - /* Clear previously set standard pitch */ - LTDC_LAYER(hltdc, LayerIdx)->CFBLR &= ~LTDC_LxCFBLR_CFBP; - - /* Set the Reload type as immediate update of LTDC pitch configured above */ - LTDC->SRCR |= LTDC_SRCR_IMR; - - /* Set new line pitch value */ - LTDC_LAYER(hltdc, LayerIdx)->CFBLR |= pitchUpdate; - - /* Set the Reload type as immediate update of LTDC pitch configured above */ - LTDC->SRCR |= LTDC_SRCR_IMR; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Define the position of the line interrupt. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param Line Line Interrupt Position. - * @note User application may resort to HAL_LTDC_LineEventCallback() at line interrupt generation. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_ProgramLineEvent(LTDC_HandleTypeDef *hltdc, uint32_t Line) -{ - /* Check the parameters */ - assert_param(IS_LTDC_LIPOS(Line)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Disable the Line interrupt */ - __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_LI); - - /* Set the Line Interrupt position */ - LTDC->LIPCR = (uint32_t)Line; - - /* Enable the Line interrupt */ - __HAL_LTDC_ENABLE_IT(hltdc, LTDC_IT_LI); - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Reload LTDC Layers configuration. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param ReloadType This parameter can be one of the following values : - * LTDC_RELOAD_IMMEDIATE : Immediate Reload - * LTDC_RELOAD_VERTICAL_BLANKING : Reload in the next Vertical Blanking - * @note User application may resort to HAL_LTDC_ReloadEventCallback() at reload interrupt generation. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_Reload(LTDC_HandleTypeDef *hltdc, uint32_t ReloadType) -{ - /* Check the parameters */ - assert_param(IS_LTDC_RELOAD(ReloadType)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Enable the Reload interrupt */ - __HAL_LTDC_ENABLE_IT(hltdc, LTDC_IT_RR); - - /* Apply Reload type */ - hltdc->Instance->SRCR = ReloadType; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Configure the LTDC Layer according to the specified without reloading - * parameters in the LTDC_InitTypeDef and create the associated handle. - * Variant of the function HAL_LTDC_ConfigLayer without immediate reload. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param pLayerCfg pointer to a LTDC_LayerCfgTypeDef structure that contains - * the configuration information for the Layer. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_ConfigLayer_NoReload(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, - uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - assert_param(IS_LTDC_HCONFIGST(pLayerCfg->WindowX0)); - assert_param(IS_LTDC_HCONFIGSP(pLayerCfg->WindowX1)); - assert_param(IS_LTDC_VCONFIGST(pLayerCfg->WindowY0)); - assert_param(IS_LTDC_VCONFIGSP(pLayerCfg->WindowY1)); - assert_param(IS_LTDC_PIXEL_FORMAT(pLayerCfg->PixelFormat)); - assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha)); - assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha0)); - assert_param(IS_LTDC_BLENDING_FACTOR1(pLayerCfg->BlendingFactor1)); - assert_param(IS_LTDC_BLENDING_FACTOR2(pLayerCfg->BlendingFactor2)); - assert_param(IS_LTDC_CFBLL(pLayerCfg->ImageWidth)); - assert_param(IS_LTDC_CFBLNBR(pLayerCfg->ImageHeight)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Copy new layer configuration into handle structure */ - hltdc->LayerCfg[LayerIdx] = *pLayerCfg; - - /* Configure the LTDC Layer */ - LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - - /* Initialize the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Set the LTDC window size without reloading. - * Variant of the function HAL_LTDC_SetWindowSize without immediate reload. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param XSize LTDC Pixel per line - * @param YSize LTDC Line number - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_SetWindowSize_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t XSize, uint32_t YSize, - uint32_t LayerIdx) -{ - LTDC_LayerCfgTypeDef *pLayerCfg; - - /* Check the parameters (Layers parameters)*/ - assert_param(IS_LTDC_LAYER(LayerIdx)); - assert_param(IS_LTDC_CFBLL(XSize)); - assert_param(IS_LTDC_CFBLNBR(YSize)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Get layer configuration from handle structure */ - pLayerCfg = &hltdc->LayerCfg[LayerIdx]; - - /* update horizontal stop */ - pLayerCfg->WindowX1 = XSize + pLayerCfg->WindowX0; - - /* update vertical stop */ - pLayerCfg->WindowY1 = YSize + pLayerCfg->WindowY0; - - /* Reconfigures the color frame buffer pitch in byte */ - pLayerCfg->ImageWidth = XSize; - - /* Reconfigures the frame buffer line number */ - pLayerCfg->ImageHeight = YSize; - - /* Set LTDC parameters */ - LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Set the LTDC window position without reloading. - * Variant of the function HAL_LTDC_SetWindowPosition without immediate reload. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param X0 LTDC window X offset - * @param Y0 LTDC window Y offset - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_SetWindowPosition_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t X0, uint32_t Y0, - uint32_t LayerIdx) -{ - LTDC_LayerCfgTypeDef *pLayerCfg; - - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - assert_param(IS_LTDC_CFBLL(X0)); - assert_param(IS_LTDC_CFBLNBR(Y0)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Get layer configuration from handle structure */ - pLayerCfg = &hltdc->LayerCfg[LayerIdx]; - - /* update horizontal start/stop */ - pLayerCfg->WindowX0 = X0; - pLayerCfg->WindowX1 = X0 + pLayerCfg->ImageWidth; - - /* update vertical start/stop */ - pLayerCfg->WindowY0 = Y0; - pLayerCfg->WindowY1 = Y0 + pLayerCfg->ImageHeight; - - /* Set LTDC parameters */ - LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Reconfigure the pixel format without reloading. - * Variant of the function HAL_LTDC_SetPixelFormat without immediate reload. - * @param hltdc pointer to a LTDC_HandleTypeDfef structure that contains - * the configuration information for the LTDC. - * @param Pixelformat new pixel format value. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_SetPixelFormat_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Pixelformat, uint32_t LayerIdx) -{ - LTDC_LayerCfgTypeDef *pLayerCfg; - - /* Check the parameters */ - assert_param(IS_LTDC_PIXEL_FORMAT(Pixelformat)); - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Get layer configuration from handle structure */ - pLayerCfg = &hltdc->LayerCfg[LayerIdx]; - - /* Reconfigure the pixel format */ - pLayerCfg->PixelFormat = Pixelformat; - - /* Set LTDC parameters */ - LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Reconfigure the layer alpha value without reloading. - * Variant of the function HAL_LTDC_SetAlpha without immediate reload. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param Alpha new alpha value. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_SetAlpha_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, uint32_t LayerIdx) -{ - LTDC_LayerCfgTypeDef *pLayerCfg; - - /* Check the parameters */ - assert_param(IS_LTDC_ALPHA(Alpha)); - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Get layer configuration from handle structure */ - pLayerCfg = &hltdc->LayerCfg[LayerIdx]; - - /* Reconfigure the Alpha value */ - pLayerCfg->Alpha = Alpha; - - /* Set LTDC parameters */ - LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Reconfigure the frame buffer Address without reloading. - * Variant of the function HAL_LTDC_SetAddress without immediate reload. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param Address new address value. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_SetAddress_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Address, uint32_t LayerIdx) -{ - LTDC_LayerCfgTypeDef *pLayerCfg; - - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Get layer configuration from handle structure */ - pLayerCfg = &hltdc->LayerCfg[LayerIdx]; - - /* Reconfigure the Address */ - pLayerCfg->FBStartAdress = Address; - - /* Set LTDC parameters */ - LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Function used to reconfigure the pitch for specific cases where the attached LayerIdx buffer have a width - * that is larger than the one intended to be displayed on screen. Example of a buffer 800x480 attached to - * layer for which we want to read and display on screen only a portion 320x240 taken in the center - * of the buffer. - * The pitch in pixels will be in that case 800 pixels and not 320 pixels as initially configured by - * previous call to HAL_LTDC_ConfigLayer(). - * @note This function should be called only after a previous call to HAL_LTDC_ConfigLayer() to modify the default - * pitch configured by HAL_LTDC_ConfigLayer() when required (refer to example described just above). - * Variant of the function HAL_LTDC_SetPitch without immediate reload. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param LinePitchInPixels New line pitch in pixels to configure for LTDC layer 'LayerIdx'. - * @param LayerIdx LTDC layer index concerned by the modification of line pitch. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_SetPitch_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LinePitchInPixels, uint32_t LayerIdx) -{ - uint32_t tmp; - uint32_t pitchUpdate; - uint32_t pixelFormat; - - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* get LayerIdx used pixel format */ - pixelFormat = hltdc->LayerCfg[LayerIdx].PixelFormat; - - if (pixelFormat == LTDC_PIXEL_FORMAT_ARGB8888) - { - tmp = 4U; - } - else if (pixelFormat == LTDC_PIXEL_FORMAT_RGB888) - { - tmp = 3U; - } - else if ((pixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \ - (pixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \ - (pixelFormat == LTDC_PIXEL_FORMAT_ARGB1555) || \ - (pixelFormat == LTDC_PIXEL_FORMAT_AL88)) - { - tmp = 2U; - } - else - { - tmp = 1U; - } - - pitchUpdate = ((LinePitchInPixels * tmp) << 16U); - - /* Clear previously set standard pitch */ - LTDC_LAYER(hltdc, LayerIdx)->CFBLR &= ~LTDC_LxCFBLR_CFBP; - - /* Set new line pitch value */ - LTDC_LAYER(hltdc, LayerIdx)->CFBLR |= pitchUpdate; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - - -/** - * @brief Configure the color keying without reloading. - * Variant of the function HAL_LTDC_ConfigColorKeying without immediate reload. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param RGBValue the color key value - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_ConfigColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t RGBValue, uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Configure the default color values */ - LTDC_LAYER(hltdc, LayerIdx)->CKCR &= ~(LTDC_LxCKCR_CKBLUE | LTDC_LxCKCR_CKGREEN | LTDC_LxCKCR_CKRED); - LTDC_LAYER(hltdc, LayerIdx)->CKCR = RGBValue; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Enable the color keying without reloading. - * Variant of the function HAL_LTDC_EnableColorKeying without immediate reload. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_EnableColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Enable LTDC color keying by setting COLKEN bit */ - LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_COLKEN; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Disable the color keying without reloading. - * Variant of the function HAL_LTDC_DisableColorKeying without immediate reload. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_DisableColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Disable LTDC color keying by setting COLKEN bit */ - LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_COLKEN; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Enable the color lookup table without reloading. - * Variant of the function HAL_LTDC_EnableCLUT without immediate reload. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_EnableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Disable LTDC color lookup table by setting CLUTEN bit */ - LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_CLUTEN; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @brief Disable the color lookup table without reloading. - * Variant of the function HAL_LTDC_DisableCLUT without immediate reload. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: - * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDC_DisableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) -{ - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - - /* Disable LTDC color lookup table by setting CLUTEN bit */ - LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_CLUTEN; - - /* Change the LTDC state*/ - hltdc->State = HAL_LTDC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hltdc); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup LTDC_Exported_Functions_Group4 Peripheral State and Errors functions - * @brief Peripheral State and Errors functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides functions allowing to - (+) Check the LTDC handle state. - (+) Get the LTDC handle error code. - -@endverbatim - * @{ - */ - -/** - * @brief Return the LTDC handle state. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @retval HAL state - */ -HAL_LTDC_StateTypeDef HAL_LTDC_GetState(const LTDC_HandleTypeDef *hltdc) -{ - return hltdc->State; -} - -/** - * @brief Return the LTDC handle error code. - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @retval LTDC Error Code - */ -uint32_t HAL_LTDC_GetError(const LTDC_HandleTypeDef *hltdc) -{ - return hltdc->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup LTDC_Private_Functions LTDC Private Functions - * @{ - */ - -/** - * @brief Configure the LTDC peripheral - * @param hltdc Pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param pLayerCfg Pointer LTDC Layer Configuration structure - * @param LayerIdx LTDC Layer index. - * This parameter can be one of the following values: LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) - * @retval None - */ -static void LTDC_SetConfig(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx) -{ - uint32_t tmp; - uint32_t tmp1; - uint32_t tmp2; - - /* Configure the horizontal start and stop position */ - tmp = ((pLayerCfg->WindowX1 + ((hltdc->Instance->BPCR & LTDC_BPCR_AHBP) >> 16U)) << 16U); - LTDC_LAYER(hltdc, LayerIdx)->WHPCR &= ~(LTDC_LxWHPCR_WHSTPOS | LTDC_LxWHPCR_WHSPPOS); - LTDC_LAYER(hltdc, LayerIdx)->WHPCR = ((pLayerCfg->WindowX0 + \ - ((hltdc->Instance->BPCR & LTDC_BPCR_AHBP) >> 16U) + 1U) | tmp); - - /* Configure the vertical start and stop position */ - tmp = ((pLayerCfg->WindowY1 + (hltdc->Instance->BPCR & LTDC_BPCR_AVBP)) << 16U); - LTDC_LAYER(hltdc, LayerIdx)->WVPCR &= ~(LTDC_LxWVPCR_WVSTPOS | LTDC_LxWVPCR_WVSPPOS); - LTDC_LAYER(hltdc, LayerIdx)->WVPCR = ((pLayerCfg->WindowY0 + (hltdc->Instance->BPCR & LTDC_BPCR_AVBP) + 1U) | tmp); - - /* Specifies the pixel format */ - LTDC_LAYER(hltdc, LayerIdx)->PFCR &= ~(LTDC_LxPFCR_PF); - LTDC_LAYER(hltdc, LayerIdx)->PFCR = (pLayerCfg->PixelFormat); - - /* Configure the default color values */ - tmp = ((uint32_t)(pLayerCfg->Backcolor.Green) << 8U); - tmp1 = ((uint32_t)(pLayerCfg->Backcolor.Red) << 16U); - tmp2 = (pLayerCfg->Alpha0 << 24U); - WRITE_REG(LTDC_LAYER(hltdc, LayerIdx)->DCCR, (pLayerCfg->Backcolor.Blue | tmp | tmp1 | tmp2)); - - /* Specifies the constant alpha value */ - LTDC_LAYER(hltdc, LayerIdx)->CACR &= ~(LTDC_LxCACR_CONSTA); - LTDC_LAYER(hltdc, LayerIdx)->CACR = (pLayerCfg->Alpha); - - /* Specifies the blending factors */ - LTDC_LAYER(hltdc, LayerIdx)->BFCR &= ~(LTDC_LxBFCR_BF2 | LTDC_LxBFCR_BF1); - LTDC_LAYER(hltdc, LayerIdx)->BFCR = (pLayerCfg->BlendingFactor1 | pLayerCfg->BlendingFactor2); - - /* Configure the color frame buffer start address */ - WRITE_REG(LTDC_LAYER(hltdc, LayerIdx)->CFBAR, pLayerCfg->FBStartAdress); - - if (pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888) - { - tmp = 4U; - } - else if (pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_RGB888) - { - tmp = 3U; - } - else if ((pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \ - (pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \ - (pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_ARGB1555) || \ - (pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_AL88)) - { - tmp = 2U; - } - else - { - tmp = 1U; - } - - /* Configure the color frame buffer pitch in byte */ - LTDC_LAYER(hltdc, LayerIdx)->CFBLR &= ~(LTDC_LxCFBLR_CFBLL | LTDC_LxCFBLR_CFBP); - LTDC_LAYER(hltdc, LayerIdx)->CFBLR = (((pLayerCfg->ImageWidth * tmp) << 16U) | \ - (((pLayerCfg->WindowX1 - pLayerCfg->WindowX0) * tmp) + 3U)); - /* Configure the frame buffer line number */ - LTDC_LAYER(hltdc, LayerIdx)->CFBLNR &= ~(LTDC_LxCFBLNR_CFBLNBR); - LTDC_LAYER(hltdc, LayerIdx)->CFBLNR = (pLayerCfg->ImageHeight); - - /* Enable LTDC_Layer by setting LEN bit */ - LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_LEN; -} - -/** - * @} - */ - - -/** - * @} - */ - -#endif /* LTDC */ - -#endif /* HAL_LTDC_MODULE_ENABLED */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.c deleted file mode 100644 index ab2ca72..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.c +++ /dev/null @@ -1,154 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_ltdc_ex.c - * @author MCD Application Team - * @brief LTDC Extension HAL module driver. - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -#if defined(HAL_LTDC_MODULE_ENABLED) && defined(HAL_DSI_MODULE_ENABLED) - -#if defined (LTDC) && defined (DSI) - -/** @defgroup LTDCEx LTDCEx - * @brief LTDC HAL module driver - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup LTDCEx_Exported_Functions LTDC Extended Exported Functions - * @{ - */ - -/** @defgroup LTDCEx_Exported_Functions_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initialize and configure the LTDC - -@endverbatim - * @{ - */ - -/** - * @brief Retrieve common parameters from DSI Video mode configuration structure - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param VidCfg pointer to a DSI_VidCfgTypeDef structure that contains - * the DSI video mode configuration parameters - * @note The implementation of this function is taking into account the LTDC - * polarities inversion as described in the current LTDC specification - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDCEx_StructInitFromVideoConfig(LTDC_HandleTypeDef *hltdc, DSI_VidCfgTypeDef *VidCfg) -{ - /* Retrieve signal polarities from DSI */ - - /* The following polarity is inverted: - LTDC_DEPOLARITY_AL <-> LTDC_DEPOLARITY_AH */ - -#if !defined(POLARITIES_INVERSION_UPDATED) - /* Note 1 : Code in line w/ Current LTDC specification */ - hltdc->Init.DEPolarity = (VidCfg->DEPolarity == \ - DSI_DATA_ENABLE_ACTIVE_HIGH) ? LTDC_DEPOLARITY_AL : LTDC_DEPOLARITY_AH; - hltdc->Init.VSPolarity = (VidCfg->VSPolarity == DSI_VSYNC_ACTIVE_HIGH) ? LTDC_VSPOLARITY_AH : LTDC_VSPOLARITY_AL; - hltdc->Init.HSPolarity = (VidCfg->HSPolarity == DSI_HSYNC_ACTIVE_HIGH) ? LTDC_HSPOLARITY_AH : LTDC_HSPOLARITY_AL; -#else - /* Note 2: Code to be used in case LTDC polarities inversion updated in the specification */ - hltdc->Init.DEPolarity = VidCfg->DEPolarity << 29; - hltdc->Init.VSPolarity = VidCfg->VSPolarity << 29; - hltdc->Init.HSPolarity = VidCfg->HSPolarity << 29; -#endif /* POLARITIES_INVERSION_UPDATED */ - - /* Retrieve vertical timing parameters from DSI */ - hltdc->Init.VerticalSync = VidCfg->VerticalSyncActive - 1U; - hltdc->Init.AccumulatedVBP = VidCfg->VerticalSyncActive + VidCfg->VerticalBackPorch - 1U; - hltdc->Init.AccumulatedActiveH = VidCfg->VerticalSyncActive + VidCfg->VerticalBackPorch + \ - VidCfg->VerticalActive - 1U; - hltdc->Init.TotalHeigh = VidCfg->VerticalSyncActive + VidCfg->VerticalBackPorch + \ - VidCfg->VerticalActive + VidCfg->VerticalFrontPorch - 1U; - - return HAL_OK; -} - -/** - * @brief Retrieve common parameters from DSI Adapted command mode configuration structure - * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param CmdCfg pointer to a DSI_CmdCfgTypeDef structure that contains - * the DSI command mode configuration parameters - * @note The implementation of this function is taking into account the LTDC - * polarities inversion as described in the current LTDC specification - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LTDCEx_StructInitFromAdaptedCommandConfig(LTDC_HandleTypeDef *hltdc, DSI_CmdCfgTypeDef *CmdCfg) -{ - /* Retrieve signal polarities from DSI */ - - /* The following polarities are inverted: - LTDC_DEPOLARITY_AL <-> LTDC_DEPOLARITY_AH - LTDC_VSPOLARITY_AL <-> LTDC_VSPOLARITY_AH - LTDC_HSPOLARITY_AL <-> LTDC_HSPOLARITY_AH)*/ - -#if !defined(POLARITIES_INVERSION_UPDATED) - /* Note 1 : Code in line w/ Current LTDC specification */ - hltdc->Init.DEPolarity = (CmdCfg->DEPolarity == \ - DSI_DATA_ENABLE_ACTIVE_HIGH) ? LTDC_DEPOLARITY_AL : LTDC_DEPOLARITY_AH; - hltdc->Init.VSPolarity = (CmdCfg->VSPolarity == DSI_VSYNC_ACTIVE_HIGH) ? LTDC_VSPOLARITY_AL : LTDC_VSPOLARITY_AH; - hltdc->Init.HSPolarity = (CmdCfg->HSPolarity == DSI_HSYNC_ACTIVE_HIGH) ? LTDC_HSPOLARITY_AL : LTDC_HSPOLARITY_AH; -#else - /* Note 2: Code to be used in case LTDC polarities inversion updated in the specification */ - hltdc->Init.DEPolarity = CmdCfg->DEPolarity << 29; - hltdc->Init.VSPolarity = CmdCfg->VSPolarity << 29; - hltdc->Init.HSPolarity = CmdCfg->HSPolarity << 29; -#endif /* POLARITIES_INVERSION_UPDATED */ - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* LTDC && DSI */ - -#endif /* HAL_LTCD_MODULE_ENABLED && HAL_DSI_MODULE_ENABLED */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c deleted file mode 100644 index df22cad..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c +++ /dev/null @@ -1,2395 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_nand.c - * @author MCD Application Team - * @brief NAND HAL module driver. - * This file provides a generic firmware to drive NAND memories mounted - * as external device. - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - This driver is a generic layered driver which contains a set of APIs used to - control NAND flash memories. It uses the FMC/FSMC layer functions to interface - with NAND devices. This driver is used as follows: - - (+) NAND flash memory configuration sequence using the function HAL_NAND_Init() - with control and timing parameters for both common and attribute spaces. - - (+) Read NAND flash memory maker and device IDs using the function - HAL_NAND_Read_ID(). The read information is stored in the NAND_ID_TypeDef - structure declared by the function caller. - - (+) Access NAND flash memory by read/write operations using the functions - HAL_NAND_Read_Page_8b()/HAL_NAND_Read_SpareArea_8b(), - HAL_NAND_Write_Page_8b()/HAL_NAND_Write_SpareArea_8b(), - HAL_NAND_Read_Page_16b()/HAL_NAND_Read_SpareArea_16b(), - HAL_NAND_Write_Page_16b()/HAL_NAND_Write_SpareArea_16b() - to read/write page(s)/spare area(s). These functions use specific device - information (Block, page size..) predefined by the user in the NAND_DeviceConfigTypeDef - structure. The read/write address information is contained by the Nand_Address_Typedef - structure passed as parameter. - - (+) Perform NAND flash Reset chip operation using the function HAL_NAND_Reset(). - - (+) Perform NAND flash erase block operation using the function HAL_NAND_Erase_Block(). - The erase block address information is contained in the Nand_Address_Typedef - structure passed as parameter. - - (+) Read the NAND flash status operation using the function HAL_NAND_Read_Status(). - - (+) You can also control the NAND device by calling the control APIs HAL_NAND_ECC_Enable()/ - HAL_NAND_ECC_Disable() to respectively enable/disable the ECC code correction - feature or the function HAL_NAND_GetECC() to get the ECC correction code. - - (+) You can monitor the NAND device HAL state by calling the function - HAL_NAND_GetState() - - [..] - (@) This driver is a set of generic APIs which handle standard NAND flash operations. - If a NAND flash device contains different operations and/or implementations, - it should be implemented separately. - - *** Callback registration *** - ============================================= - [..] - The compilation define USE_HAL_NAND_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - - Use Functions HAL_NAND_RegisterCallback() to register a user callback, - it allows to register following callbacks: - (+) MspInitCallback : NAND MspInit. - (+) MspDeInitCallback : NAND MspDeInit. - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - - Use function HAL_NAND_UnRegisterCallback() to reset a callback to the default - weak (overridden) function. It allows to reset following callbacks: - (+) MspInitCallback : NAND MspInit. - (+) MspDeInitCallback : NAND MspDeInit. - This function) takes as parameters the HAL peripheral handle and the Callback ID. - - By default, after the HAL_NAND_Init and if the state is HAL_NAND_STATE_RESET - all callbacks are reset to the corresponding legacy weak (overridden) functions. - Exception done for MspInit and MspDeInit callbacks that are respectively - reset to the legacy weak (overridden) functions in the HAL_NAND_Init - and HAL_NAND_DeInit only when these callbacks are null (not registered beforehand). - If not, MspInit or MspDeInit are not null, the HAL_NAND_Init and HAL_NAND_DeInit - keep and use the user MspInit/MspDeInit callbacks (registered beforehand) - - Callbacks can be registered/unregistered in READY state only. - Exception done for MspInit/MspDeInit callbacks that can be registered/unregistered - in READY or RESET state, thus registered (user) MspInit/DeInit callbacks can be used - during the Init/DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using HAL_NAND_RegisterCallback before calling HAL_NAND_DeInit - or HAL_NAND_Init function. - - When The compilation define USE_HAL_NAND_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registering feature is not available - and weak (overridden) callbacks are used. - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) || defined(FSMC_Bank2_3) - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -#ifdef HAL_NAND_MODULE_ENABLED - -/** @defgroup NAND NAND - * @brief NAND HAL module driver - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private Constants ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions ---------------------------------------------------------*/ - -/** @defgroup NAND_Exported_Functions NAND Exported Functions - * @{ - */ - -/** @defgroup NAND_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * - @verbatim - ============================================================================== - ##### NAND Initialization and de-initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to initialize/de-initialize - the NAND memory - -@endverbatim - * @{ - */ - -/** - * @brief Perform NAND memory Initialization sequence - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param ComSpace_Timing pointer to Common space timing structure - * @param AttSpace_Timing pointer to Attribute space timing structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Init(NAND_HandleTypeDef *hnand, FMC_NAND_PCC_TimingTypeDef *ComSpace_Timing, - FMC_NAND_PCC_TimingTypeDef *AttSpace_Timing) -{ - /* Check the NAND handle state */ - if (hnand == NULL) - { - return HAL_ERROR; - } - - if (hnand->State == HAL_NAND_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hnand->Lock = HAL_UNLOCKED; - -#if (USE_HAL_NAND_REGISTER_CALLBACKS == 1) - if (hnand->MspInitCallback == NULL) - { - hnand->MspInitCallback = HAL_NAND_MspInit; - } - hnand->ItCallback = HAL_NAND_ITCallback; - - /* Init the low level hardware */ - hnand->MspInitCallback(hnand); -#else - /* Initialize the low level hardware (MSP) */ - HAL_NAND_MspInit(hnand); -#endif /* (USE_HAL_NAND_REGISTER_CALLBACKS) */ - } - - /* Initialize NAND control Interface */ - (void)FMC_NAND_Init(hnand->Instance, &(hnand->Init)); - - /* Initialize NAND common space timing Interface */ - (void)FMC_NAND_CommonSpace_Timing_Init(hnand->Instance, ComSpace_Timing, hnand->Init.NandBank); - - /* Initialize NAND attribute space timing Interface */ - (void)FMC_NAND_AttributeSpace_Timing_Init(hnand->Instance, AttSpace_Timing, hnand->Init.NandBank); - - /* Enable the NAND device */ -#if defined(FMC_Bank2_3) || defined(FSMC_Bank2_3) - __FMC_NAND_ENABLE(hnand->Instance, hnand->Init.NandBank); -#else - __FMC_NAND_ENABLE(hnand->Instance); -#endif /* (FMC_Bank2_3) || (FSMC_Bank2_3) */ - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Perform NAND memory De-Initialization sequence - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_DeInit(NAND_HandleTypeDef *hnand) -{ -#if (USE_HAL_NAND_REGISTER_CALLBACKS == 1) - if (hnand->MspDeInitCallback == NULL) - { - hnand->MspDeInitCallback = HAL_NAND_MspDeInit; - } - - /* DeInit the low level hardware */ - hnand->MspDeInitCallback(hnand); -#else - /* Initialize the low level hardware (MSP) */ - HAL_NAND_MspDeInit(hnand); -#endif /* (USE_HAL_NAND_REGISTER_CALLBACKS) */ - - /* Configure the NAND registers with their reset values */ - (void)FMC_NAND_DeInit(hnand->Instance, hnand->Init.NandBank); - - /* Reset the NAND controller state */ - hnand->State = HAL_NAND_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hnand); - - return HAL_OK; -} - -/** - * @brief NAND MSP Init - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval None - */ -__weak void HAL_NAND_MspInit(NAND_HandleTypeDef *hnand) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hnand); - - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_NAND_MspInit could be implemented in the user file - */ -} - -/** - * @brief NAND MSP DeInit - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval None - */ -__weak void HAL_NAND_MspDeInit(NAND_HandleTypeDef *hnand) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hnand); - - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_NAND_MspDeInit could be implemented in the user file - */ -} - - -/** - * @brief This function handles NAND device interrupt request. - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval HAL status - */ -void HAL_NAND_IRQHandler(NAND_HandleTypeDef *hnand) -{ - /* Check NAND interrupt Rising edge flag */ - if (__FMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_RISING_EDGE)) - { - /* NAND interrupt callback*/ -#if (USE_HAL_NAND_REGISTER_CALLBACKS == 1) - hnand->ItCallback(hnand); -#else - HAL_NAND_ITCallback(hnand); -#endif /* (USE_HAL_NAND_REGISTER_CALLBACKS) */ - - /* Clear NAND interrupt Rising edge pending bit */ -#if defined(FMC_Bank2_3) || defined(FSMC_Bank2_3) - __FMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_RISING_EDGE); -#else - __FMC_NAND_CLEAR_FLAG(hnand->Instance, FMC_FLAG_RISING_EDGE); -#endif /* FMC_Bank2_3 || FSMC_Bank2_3 */ - } - - /* Check NAND interrupt Level flag */ - if (__FMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_LEVEL)) - { - /* NAND interrupt callback*/ -#if (USE_HAL_NAND_REGISTER_CALLBACKS == 1) - hnand->ItCallback(hnand); -#else - HAL_NAND_ITCallback(hnand); -#endif /* (USE_HAL_NAND_REGISTER_CALLBACKS) */ - - /* Clear NAND interrupt Level pending bit */ -#if defined(FMC_Bank2_3) || defined(FSMC_Bank2_3) - __FMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_LEVEL); -#else - __FMC_NAND_CLEAR_FLAG(hnand->Instance, FMC_FLAG_LEVEL); -#endif /* FMC_Bank2_3 || FSMC_Bank2_3 */ - } - - /* Check NAND interrupt Falling edge flag */ - if (__FMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_FALLING_EDGE)) - { - /* NAND interrupt callback*/ -#if (USE_HAL_NAND_REGISTER_CALLBACKS == 1) - hnand->ItCallback(hnand); -#else - HAL_NAND_ITCallback(hnand); -#endif /* (USE_HAL_NAND_REGISTER_CALLBACKS) */ - - /* Clear NAND interrupt Falling edge pending bit */ -#if defined(FMC_Bank2_3) || defined(FSMC_Bank2_3) - __FMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_FALLING_EDGE); -#else - __FMC_NAND_CLEAR_FLAG(hnand->Instance, FMC_FLAG_FALLING_EDGE); -#endif /* FMC_Bank2_3 || FSMC_Bank2_3 */ - } - - /* Check NAND interrupt FIFO empty flag */ - if (__FMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_FEMPT)) - { - /* NAND interrupt callback*/ -#if (USE_HAL_NAND_REGISTER_CALLBACKS == 1) - hnand->ItCallback(hnand); -#else - HAL_NAND_ITCallback(hnand); -#endif /* (USE_HAL_NAND_REGISTER_CALLBACKS) */ - - /* Clear NAND interrupt FIFO empty pending bit */ -#if defined(FMC_Bank2_3) || defined(FSMC_Bank2_3) - __FMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_FEMPT); -#else - __FMC_NAND_CLEAR_FLAG(hnand->Instance, FMC_FLAG_FEMPT); -#endif /* FMC_Bank2_3 || FSMC_Bank2_3 */ - } - -} - -/** - * @brief NAND interrupt feature callback - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval None - */ -__weak void HAL_NAND_ITCallback(NAND_HandleTypeDef *hnand) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hnand); - - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_NAND_ITCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup NAND_Exported_Functions_Group2 Input and Output functions - * @brief Input Output and memory control functions - * - @verbatim - ============================================================================== - ##### NAND Input and Output functions ##### - ============================================================================== - [..] - This section provides functions allowing to use and control the NAND - memory - -@endverbatim - * @{ - */ - -/** - * @brief Read the NAND memory electronic signature - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pNAND_ID NAND ID structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Read_ID(NAND_HandleTypeDef *hnand, NAND_IDTypeDef *pNAND_ID) -{ - __IO uint32_t data = 0; - __IO uint32_t data1 = 0; - uint32_t deviceaddress; - - /* Check the NAND controller state */ - if (hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnand->State == HAL_NAND_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Identify the device address */ -#if defined(FMC_Bank2_3) - if (hnand->Init.NandBank == FMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } -#else - deviceaddress = NAND_DEVICE; -#endif /* FMC_Bank2_3 */ - - /* Send Read ID command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_READID; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; - __DSB(); - - /* Read the electronic signature from NAND flash */ -#ifdef FSMC_PCR2_PWID - if (hnand->Init.MemoryDataWidth == FSMC_NAND_PCC_MEM_BUS_WIDTH_8) -#else /* FMC_PCR2_PWID is defined */ - if (hnand->Init.MemoryDataWidth == FMC_NAND_PCC_MEM_BUS_WIDTH_8) -#endif /* FSMC_PCR2_PWID */ - { - data = *(__IO uint32_t *)deviceaddress; - - /* Return the data read */ - pNAND_ID->Maker_Id = ADDR_1ST_CYCLE(data); - pNAND_ID->Device_Id = ADDR_2ND_CYCLE(data); - pNAND_ID->Third_Id = ADDR_3RD_CYCLE(data); - pNAND_ID->Fourth_Id = ADDR_4TH_CYCLE(data); - } - else - { - data = *(__IO uint32_t *)deviceaddress; - data1 = *((__IO uint32_t *)deviceaddress + 4); - - /* Return the data read */ - pNAND_ID->Maker_Id = ADDR_1ST_CYCLE(data); - pNAND_ID->Device_Id = ADDR_3RD_CYCLE(data); - pNAND_ID->Third_Id = ADDR_1ST_CYCLE(data1); - pNAND_ID->Fourth_Id = ADDR_3RD_CYCLE(data1); - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief NAND memory reset - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Reset(NAND_HandleTypeDef *hnand) -{ - uint32_t deviceaddress; - - /* Check the NAND controller state */ - if (hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnand->State == HAL_NAND_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Identify the device address */ -#if defined(FMC_Bank2_3) - if (hnand->Init.NandBank == FMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } -#else - deviceaddress = NAND_DEVICE; -#endif /* FMC_Bank2_3 */ - - /* Send NAND reset command */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = 0xFF; - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; - -} - -/** - * @brief Configure the device: Enter the physical parameters of the device - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pDeviceConfig pointer to NAND_DeviceConfigTypeDef structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_ConfigDevice(NAND_HandleTypeDef *hnand, const NAND_DeviceConfigTypeDef *pDeviceConfig) -{ - hnand->Config.PageSize = pDeviceConfig->PageSize; - hnand->Config.SpareAreaSize = pDeviceConfig->SpareAreaSize; - hnand->Config.BlockSize = pDeviceConfig->BlockSize; - hnand->Config.BlockNbr = pDeviceConfig->BlockNbr; - hnand->Config.PlaneSize = pDeviceConfig->PlaneSize; - hnand->Config.PlaneNbr = pDeviceConfig->PlaneNbr; - hnand->Config.ExtraCommandEnable = pDeviceConfig->ExtraCommandEnable; - - return HAL_OK; -} - -/** - * @brief Read Page(s) from NAND memory block (8-bits addressing) - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress pointer to NAND address structure - * @param pBuffer pointer to destination read buffer - * @param NumPageToRead number of pages to read from block - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Read_Page_8b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - uint8_t *pBuffer, uint32_t NumPageToRead) -{ - uint32_t index; - uint32_t tickstart; - uint32_t deviceaddress; - uint32_t numpagesread = 0U; - uint32_t nandaddress; - uint32_t nbpages = NumPageToRead; - uint8_t *buff = pBuffer; - - /* Check the NAND controller state */ - if (hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnand->State == HAL_NAND_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Identify the device address */ -#if defined(FMC_Bank2_3) - if (hnand->Init.NandBank == FMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } -#else - deviceaddress = NAND_DEVICE; -#endif /* FMC_Bank2_3 */ - - /* NAND raw address calculation */ - nandaddress = ARRAY_ADDRESS(pAddress, hnand); - - /* Page(s) read loop */ - while ((nbpages != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) - { - /* Send read page command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; - __DSB(); - - /* Cards with page size <= 512 bytes */ - if ((hnand->Config.PageSize) <= 512U) - { - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - else /* (hnand->Config.PageSize) > 512 */ - { - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_TRUE1; - __DSB(); - - - if (hnand->Config.ExtraCommandEnable == ENABLE) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Read status until NAND is ready */ - while (HAL_NAND_Read_Status(hnand) != NAND_READY) - { - if ((HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT) - { - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_ERROR; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_TIMEOUT; - } - } - - /* Go back to read mode */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = ((uint8_t)0x00); - __DSB(); - } - - /* Get Data into Buffer */ - for (index = 0U; index < hnand->Config.PageSize; index++) - { - *buff = *(__IO uint8_t *)deviceaddress; - buff++; - } - - /* Increment read pages number */ - numpagesread++; - - /* Decrement pages to read */ - nbpages--; - - /* Increment the NAND address */ - nandaddress = (uint32_t)(nandaddress + 1U); - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Read Page(s) from NAND memory block (16-bits addressing) - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress pointer to NAND address structure - * @param pBuffer pointer to destination read buffer. pBuffer should be 16bits aligned - * @param NumPageToRead number of pages to read from block - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Read_Page_16b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - uint16_t *pBuffer, uint32_t NumPageToRead) -{ - uint32_t index; - uint32_t tickstart; - uint32_t deviceaddress; - uint32_t numpagesread = 0U; - uint32_t nandaddress; - uint32_t nbpages = NumPageToRead; - uint16_t *buff = pBuffer; - - /* Check the NAND controller state */ - if (hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnand->State == HAL_NAND_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Identify the device address */ -#if defined(FMC_Bank2_3) - if (hnand->Init.NandBank == FMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } -#else - deviceaddress = NAND_DEVICE; -#endif /* FMC_Bank2_3 */ - - /* NAND raw address calculation */ - nandaddress = ARRAY_ADDRESS(pAddress, hnand); - - /* Page(s) read loop */ - while ((nbpages != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) - { - /* Send read page command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; - __DSB(); - - /* Cards with page size <= 512 bytes */ - if ((hnand->Config.PageSize) <= 512U) - { - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - else /* (hnand->Config.PageSize) > 512 */ - { - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_TRUE1; - __DSB(); - - if (hnand->Config.ExtraCommandEnable == ENABLE) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Read status until NAND is ready */ - while (HAL_NAND_Read_Status(hnand) != NAND_READY) - { - if ((HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT) - { - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_ERROR; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_TIMEOUT; - } - } - - /* Go back to read mode */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = ((uint8_t)0x00); - __DSB(); - } - - /* Calculate PageSize */ -#if defined(FSMC_PCR2_PWID) - if (hnand->Init.MemoryDataWidth == FSMC_NAND_PCC_MEM_BUS_WIDTH_8) -#else - if (hnand->Init.MemoryDataWidth == FMC_NAND_PCC_MEM_BUS_WIDTH_8) -#endif /* FSMC_PCR2_PWID */ - { - hnand->Config.PageSize = hnand->Config.PageSize / 2U; - } - else - { - /* Do nothing */ - /* Keep the same PageSize for FMC_NAND_MEM_BUS_WIDTH_16*/ - } - - /* Get Data into Buffer */ - for (index = 0U; index < hnand->Config.PageSize; index++) - { - *buff = *(__IO uint16_t *)deviceaddress; - buff++; - } - - /* Increment read pages number */ - numpagesread++; - - /* Decrement pages to read */ - nbpages--; - - /* Increment the NAND address */ - nandaddress = (uint32_t)(nandaddress + 1U); - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Write Page(s) to NAND memory block (8-bits addressing) - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress pointer to NAND address structure - * @param pBuffer pointer to source buffer to write - * @param NumPageToWrite number of pages to write to block - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Write_Page_8b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - const uint8_t *pBuffer, uint32_t NumPageToWrite) -{ - uint32_t index; - uint32_t tickstart; - uint32_t deviceaddress; - uint32_t numpageswritten = 0U; - uint32_t nandaddress; - uint32_t nbpages = NumPageToWrite; - const uint8_t *buff = pBuffer; - - /* Check the NAND controller state */ - if (hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnand->State == HAL_NAND_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Identify the device address */ -#if defined(FMC_Bank2_3) - if (hnand->Init.NandBank == FMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } -#else - deviceaddress = NAND_DEVICE; -#endif /* FMC_Bank2_3 */ - - /* NAND raw address calculation */ - nandaddress = ARRAY_ADDRESS(pAddress, hnand); - - /* Page(s) write loop */ - while ((nbpages != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) - { - /* Send write page command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0; - __DSB(); - - /* Cards with page size <= 512 bytes */ - if ((hnand->Config.PageSize) <= 512U) - { - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - else /* (hnand->Config.PageSize) > 512 */ - { - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - - /* Write data to memory */ - for (index = 0U; index < hnand->Config.PageSize; index++) - { - *(__IO uint8_t *)deviceaddress = *buff; - buff++; - __DSB(); - } - - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE_TRUE1; - __DSB(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Read status until NAND is ready */ - while (HAL_NAND_Read_Status(hnand) != NAND_READY) - { - if ((HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT) - { - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_ERROR; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_TIMEOUT; - } - } - - /* Increment written pages number */ - numpageswritten++; - - /* Decrement pages to write */ - nbpages--; - - /* Increment the NAND address */ - nandaddress = (uint32_t)(nandaddress + 1U); - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Write Page(s) to NAND memory block (16-bits addressing) - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress pointer to NAND address structure - * @param pBuffer pointer to source buffer to write. pBuffer should be 16bits aligned - * @param NumPageToWrite number of pages to write to block - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Write_Page_16b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - const uint16_t *pBuffer, uint32_t NumPageToWrite) -{ - uint32_t index; - uint32_t tickstart; - uint32_t deviceaddress; - uint32_t numpageswritten = 0U; - uint32_t nandaddress; - uint32_t nbpages = NumPageToWrite; - const uint16_t *buff = pBuffer; - - /* Check the NAND controller state */ - if (hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnand->State == HAL_NAND_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Identify the device address */ -#if defined(FMC_Bank2_3) - if (hnand->Init.NandBank == FMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } -#else - deviceaddress = NAND_DEVICE; -#endif /* FMC_Bank2_3 */ - - /* NAND raw address calculation */ - nandaddress = ARRAY_ADDRESS(pAddress, hnand); - - /* Page(s) write loop */ - while ((nbpages != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) - { - /* Send write page command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0; - __DSB(); - - /* Cards with page size <= 512 bytes */ - if ((hnand->Config.PageSize) <= 512U) - { - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - else /* (hnand->Config.PageSize) > 512 */ - { - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - - /* Calculate PageSize */ -#if defined(FSMC_PCR2_PWID) - if (hnand->Init.MemoryDataWidth == FSMC_NAND_PCC_MEM_BUS_WIDTH_8) -#else - if (hnand->Init.MemoryDataWidth == FMC_NAND_PCC_MEM_BUS_WIDTH_8) -#endif /* FSMC_PCR2_PWID */ - { - hnand->Config.PageSize = hnand->Config.PageSize / 2U; - } - else - { - /* Do nothing */ - /* Keep the same PageSize for FMC_NAND_MEM_BUS_WIDTH_16*/ - } - - /* Write data to memory */ - for (index = 0U; index < hnand->Config.PageSize; index++) - { - *(__IO uint16_t *)deviceaddress = *buff; - buff++; - __DSB(); - } - - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE_TRUE1; - __DSB(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Read status until NAND is ready */ - while (HAL_NAND_Read_Status(hnand) != NAND_READY) - { - if ((HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT) - { - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_ERROR; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_TIMEOUT; - } - } - - /* Increment written pages number */ - numpageswritten++; - - /* Decrement pages to write */ - nbpages--; - - /* Increment the NAND address */ - nandaddress = (uint32_t)(nandaddress + 1U); - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Read Spare area(s) from NAND memory (8-bits addressing) - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress pointer to NAND address structure - * @param pBuffer pointer to source buffer to write - * @param NumSpareAreaToRead Number of spare area to read - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Read_SpareArea_8b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - uint8_t *pBuffer, uint32_t NumSpareAreaToRead) -{ - uint32_t index; - uint32_t tickstart; - uint32_t deviceaddress; - uint32_t numsparearearead = 0U; - uint32_t nandaddress; - uint32_t columnaddress; - uint32_t nbspare = NumSpareAreaToRead; - uint8_t *buff = pBuffer; - - /* Check the NAND controller state */ - if (hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnand->State == HAL_NAND_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Identify the device address */ -#if defined(FMC_Bank2_3) - if (hnand->Init.NandBank == FMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } -#else - deviceaddress = NAND_DEVICE; -#endif /* FMC_Bank2_3 */ - - /* NAND raw address calculation */ - nandaddress = ARRAY_ADDRESS(pAddress, hnand); - - /* Column in page address */ - columnaddress = COLUMN_ADDRESS(hnand); - - /* Spare area(s) read loop */ - while ((nbspare != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) - { - /* Cards with page size <= 512 bytes */ - if ((hnand->Config.PageSize) <= 512U) - { - /* Send read spare area command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C; - __DSB(); - - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - else /* (hnand->Config.PageSize) > 512 */ - { - /* Send read spare area command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; - __DSB(); - - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_TRUE1; - __DSB(); - - if (hnand->Config.ExtraCommandEnable == ENABLE) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Read status until NAND is ready */ - while (HAL_NAND_Read_Status(hnand) != NAND_READY) - { - if ((HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT) - { - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_ERROR; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_TIMEOUT; - } - } - - /* Go back to read mode */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = ((uint8_t)0x00); - __DSB(); - } - - /* Get Data into Buffer */ - for (index = 0U; index < hnand->Config.SpareAreaSize; index++) - { - *buff = *(__IO uint8_t *)deviceaddress; - buff++; - } - - /* Increment read spare areas number */ - numsparearearead++; - - /* Decrement spare areas to read */ - nbspare--; - - /* Increment the NAND address */ - nandaddress = (uint32_t)(nandaddress + 1U); - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Read Spare area(s) from NAND memory (16-bits addressing) - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress pointer to NAND address structure - * @param pBuffer pointer to source buffer to write. pBuffer should be 16bits aligned. - * @param NumSpareAreaToRead Number of spare area to read - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Read_SpareArea_16b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - uint16_t *pBuffer, uint32_t NumSpareAreaToRead) -{ - uint32_t index; - uint32_t tickstart; - uint32_t deviceaddress; - uint32_t numsparearearead = 0U; - uint32_t nandaddress; - uint32_t columnaddress; - uint32_t nbspare = NumSpareAreaToRead; - uint16_t *buff = pBuffer; - - /* Check the NAND controller state */ - if (hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnand->State == HAL_NAND_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Identify the device address */ -#if defined(FMC_Bank2_3) - if (hnand->Init.NandBank == FMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } -#else - deviceaddress = NAND_DEVICE; -#endif /* FMC_Bank2_3 */ - - /* NAND raw address calculation */ - nandaddress = ARRAY_ADDRESS(pAddress, hnand); - - /* Column in page address */ - columnaddress = (uint32_t)(COLUMN_ADDRESS(hnand)); - - /* Spare area(s) read loop */ - while ((nbspare != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) - { - /* Cards with page size <= 512 bytes */ - if ((hnand->Config.PageSize) <= 512U) - { - /* Send read spare area command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C; - __DSB(); - - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - else /* (hnand->Config.PageSize) > 512 */ - { - /* Send read spare area command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; - __DSB(); - - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_TRUE1; - __DSB(); - - if (hnand->Config.ExtraCommandEnable == ENABLE) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Read status until NAND is ready */ - while (HAL_NAND_Read_Status(hnand) != NAND_READY) - { - if ((HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT) - { - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_ERROR; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_TIMEOUT; - } - } - - /* Go back to read mode */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = ((uint8_t)0x00); - __DSB(); - } - - /* Get Data into Buffer */ - for (index = 0U; index < hnand->Config.SpareAreaSize; index++) - { - *buff = *(__IO uint16_t *)deviceaddress; - buff++; - } - - /* Increment read spare areas number */ - numsparearearead++; - - /* Decrement spare areas to read */ - nbspare--; - - /* Increment the NAND address */ - nandaddress = (uint32_t)(nandaddress + 1U); - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Write Spare area(s) to NAND memory (8-bits addressing) - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress pointer to NAND address structure - * @param pBuffer pointer to source buffer to write - * @param NumSpareAreaTowrite number of spare areas to write to block - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Write_SpareArea_8b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - const uint8_t *pBuffer, uint32_t NumSpareAreaTowrite) -{ - uint32_t index; - uint32_t tickstart; - uint32_t deviceaddress; - uint32_t numspareareawritten = 0U; - uint32_t nandaddress; - uint32_t columnaddress; - uint32_t nbspare = NumSpareAreaTowrite; - const uint8_t *buff = pBuffer; - - /* Check the NAND controller state */ - if (hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnand->State == HAL_NAND_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Identify the device address */ -#if defined(FMC_Bank2_3) - if (hnand->Init.NandBank == FMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } -#else - deviceaddress = NAND_DEVICE; -#endif /* FMC_Bank2_3 */ - - /* Page address calculation */ - nandaddress = ARRAY_ADDRESS(pAddress, hnand); - - /* Column in page address */ - columnaddress = COLUMN_ADDRESS(hnand); - - /* Spare area(s) write loop */ - while ((nbspare != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) - { - /* Cards with page size <= 512 bytes */ - if ((hnand->Config.PageSize) <= 512U) - { - /* Send write Spare area command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0; - __DSB(); - - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - else /* (hnand->Config.PageSize) > 512 */ - { - /* Send write Spare area command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0; - __DSB(); - - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - - /* Write data to memory */ - for (index = 0U; index < hnand->Config.SpareAreaSize; index++) - { - *(__IO uint8_t *)deviceaddress = *buff; - buff++; - __DSB(); - } - - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE_TRUE1; - __DSB(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Read status until NAND is ready */ - while (HAL_NAND_Read_Status(hnand) != NAND_READY) - { - if ((HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT) - { - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_ERROR; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_TIMEOUT; - } - } - - /* Increment written spare areas number */ - numspareareawritten++; - - /* Decrement spare areas to write */ - nbspare--; - - /* Increment the NAND address */ - nandaddress = (uint32_t)(nandaddress + 1U); - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Write Spare area(s) to NAND memory (16-bits addressing) - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress pointer to NAND address structure - * @param pBuffer pointer to source buffer to write. pBuffer should be 16bits aligned. - * @param NumSpareAreaTowrite number of spare areas to write to block - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Write_SpareArea_16b(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress, - const uint16_t *pBuffer, uint32_t NumSpareAreaTowrite) -{ - uint32_t index; - uint32_t tickstart; - uint32_t deviceaddress; - uint32_t numspareareawritten = 0U; - uint32_t nandaddress; - uint32_t columnaddress; - uint32_t nbspare = NumSpareAreaTowrite; - const uint16_t *buff = pBuffer; - - /* Check the NAND controller state */ - if (hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnand->State == HAL_NAND_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Identify the device address */ -#if defined(FMC_Bank2_3) - if (hnand->Init.NandBank == FMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } -#else - deviceaddress = NAND_DEVICE; -#endif /* FMC_Bank2_3 */ - - /* NAND raw address calculation */ - nandaddress = ARRAY_ADDRESS(pAddress, hnand); - - /* Column in page address */ - columnaddress = (uint32_t)(COLUMN_ADDRESS(hnand)); - - /* Spare area(s) write loop */ - while ((nbspare != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) - { - /* Cards with page size <= 512 bytes */ - if ((hnand->Config.PageSize) <= 512U) - { - /* Send write Spare area command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0; - __DSB(); - - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - else /* (hnand->Config.PageSize) > 512 */ - { - /* Send write Spare area command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0; - __DSB(); - - if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - } - else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); - __DSB(); - } - } - - /* Write data to memory */ - for (index = 0U; index < hnand->Config.SpareAreaSize; index++) - { - *(__IO uint16_t *)deviceaddress = *buff; - buff++; - __DSB(); - } - - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE_TRUE1; - __DSB(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Read status until NAND is ready */ - while (HAL_NAND_Read_Status(hnand) != NAND_READY) - { - if ((HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT) - { - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_ERROR; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_TIMEOUT; - } - } - - /* Increment written spare areas number */ - numspareareawritten++; - - /* Decrement spare areas to write */ - nbspare--; - - /* Increment the NAND address */ - nandaddress = (uint32_t)(nandaddress + 1U); - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief NAND memory Block erase - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress pointer to NAND address structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Erase_Block(NAND_HandleTypeDef *hnand, const NAND_AddressTypeDef *pAddress) -{ - uint32_t deviceaddress; - - /* Check the NAND controller state */ - if (hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnand->State == HAL_NAND_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Identify the device address */ -#if defined(FMC_Bank2_3) - if (hnand->Init.NandBank == FMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } -#else - deviceaddress = NAND_DEVICE; -#endif /* FMC_Bank2_3 */ - - /* Send Erase block command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_ERASE0; - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(ARRAY_ADDRESS(pAddress, hnand)); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(ARRAY_ADDRESS(pAddress, hnand)); - __DSB(); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(ARRAY_ADDRESS(pAddress, hnand)); - __DSB(); - - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_ERASE1; - __DSB(); - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Increment the NAND memory address - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress pointer to NAND address structure - * @retval The new status of the increment address operation. It can be: - * - NAND_VALID_ADDRESS: When the new address is valid address - * - NAND_INVALID_ADDRESS: When the new address is invalid address - */ -uint32_t HAL_NAND_Address_Inc(const NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress) -{ - uint32_t status = NAND_VALID_ADDRESS; - - /* Increment page address */ - pAddress->Page++; - - /* Check NAND address is valid */ - if (pAddress->Page == hnand->Config.BlockSize) - { - pAddress->Page = 0; - pAddress->Block++; - - if (pAddress->Block == hnand->Config.PlaneSize) - { - pAddress->Block = 0; - pAddress->Plane++; - - if (pAddress->Plane == (hnand->Config.PlaneNbr)) - { - status = NAND_INVALID_ADDRESS; - } - } - } - - return (status); -} - -#if (USE_HAL_NAND_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User NAND Callback - * To be used to override the weak predefined callback - * @param hnand : NAND handle - * @param CallbackId : ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_NAND_MSP_INIT_CB_ID NAND MspInit callback ID - * @arg @ref HAL_NAND_MSP_DEINIT_CB_ID NAND MspDeInit callback ID - * @arg @ref HAL_NAND_IT_CB_ID NAND IT callback ID - * @param pCallback : pointer to the Callback function - * @retval status - */ -HAL_StatusTypeDef HAL_NAND_RegisterCallback(NAND_HandleTypeDef *hnand, HAL_NAND_CallbackIDTypeDef CallbackId, - pNAND_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - return HAL_ERROR; - } - - if (hnand->State == HAL_NAND_STATE_READY) - { - switch (CallbackId) - { - case HAL_NAND_MSP_INIT_CB_ID : - hnand->MspInitCallback = pCallback; - break; - case HAL_NAND_MSP_DEINIT_CB_ID : - hnand->MspDeInitCallback = pCallback; - break; - case HAL_NAND_IT_CB_ID : - hnand->ItCallback = pCallback; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else if (hnand->State == HAL_NAND_STATE_RESET) - { - switch (CallbackId) - { - case HAL_NAND_MSP_INIT_CB_ID : - hnand->MspInitCallback = pCallback; - break; - case HAL_NAND_MSP_DEINIT_CB_ID : - hnand->MspDeInitCallback = pCallback; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else - { - /* update return status */ - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Unregister a User NAND Callback - * NAND Callback is redirected to the weak predefined callback - * @param hnand : NAND handle - * @param CallbackId : ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_NAND_MSP_INIT_CB_ID NAND MspInit callback ID - * @arg @ref HAL_NAND_MSP_DEINIT_CB_ID NAND MspDeInit callback ID - * @arg @ref HAL_NAND_IT_CB_ID NAND IT callback ID - * @retval status - */ -HAL_StatusTypeDef HAL_NAND_UnRegisterCallback(NAND_HandleTypeDef *hnand, HAL_NAND_CallbackIDTypeDef CallbackId) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (hnand->State == HAL_NAND_STATE_READY) - { - switch (CallbackId) - { - case HAL_NAND_MSP_INIT_CB_ID : - hnand->MspInitCallback = HAL_NAND_MspInit; - break; - case HAL_NAND_MSP_DEINIT_CB_ID : - hnand->MspDeInitCallback = HAL_NAND_MspDeInit; - break; - case HAL_NAND_IT_CB_ID : - hnand->ItCallback = HAL_NAND_ITCallback; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else if (hnand->State == HAL_NAND_STATE_RESET) - { - switch (CallbackId) - { - case HAL_NAND_MSP_INIT_CB_ID : - hnand->MspInitCallback = HAL_NAND_MspInit; - break; - case HAL_NAND_MSP_DEINIT_CB_ID : - hnand->MspDeInitCallback = HAL_NAND_MspDeInit; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else - { - /* update return status */ - status = HAL_ERROR; - } - - return status; -} -#endif /* USE_HAL_NAND_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup NAND_Exported_Functions_Group3 Peripheral Control functions - * @brief management functions - * -@verbatim - ============================================================================== - ##### NAND Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control dynamically - the NAND interface. - -@endverbatim - * @{ - */ - - -/** - * @brief Enables dynamically NAND ECC feature. - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_ECC_Enable(NAND_HandleTypeDef *hnand) -{ - /* Check the NAND controller state */ - if (hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnand->State == HAL_NAND_STATE_READY) - { - /* Update the NAND state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Enable ECC feature */ - (void)FMC_NAND_ECC_Enable(hnand->Instance, hnand->Init.NandBank); - - /* Update the NAND state */ - hnand->State = HAL_NAND_STATE_READY; - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Disables dynamically FMC_NAND ECC feature. - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_ECC_Disable(NAND_HandleTypeDef *hnand) -{ - /* Check the NAND controller state */ - if (hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnand->State == HAL_NAND_STATE_READY) - { - /* Update the NAND state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Disable ECC feature */ - (void)FMC_NAND_ECC_Disable(hnand->Instance, hnand->Init.NandBank); - - /* Update the NAND state */ - hnand->State = HAL_NAND_STATE_READY; - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Disables dynamically NAND ECC feature. - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param ECCval pointer to ECC value - * @param Timeout maximum timeout to wait - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_GetECC(NAND_HandleTypeDef *hnand, uint32_t *ECCval, uint32_t Timeout) -{ - HAL_StatusTypeDef status; - - /* Check the NAND controller state */ - if (hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnand->State == HAL_NAND_STATE_READY) - { - /* Update the NAND state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Get NAND ECC value */ - status = FMC_NAND_GetECC(hnand->Instance, ECCval, hnand->Init.NandBank, Timeout); - - /* Update the NAND state */ - hnand->State = HAL_NAND_STATE_READY; - } - else - { - return HAL_ERROR; - } - - return status; -} - -/** - * @} - */ - - -/** @defgroup NAND_Exported_Functions_Group4 Peripheral State functions - * @brief Peripheral State functions - * -@verbatim - ============================================================================== - ##### NAND State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the NAND controller - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief return the NAND state - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval HAL state - */ -HAL_NAND_StateTypeDef HAL_NAND_GetState(const NAND_HandleTypeDef *hnand) -{ - return hnand->State; -} - -/** - * @brief NAND memory read status - * @param hnand pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval NAND status - */ -uint32_t HAL_NAND_Read_Status(const NAND_HandleTypeDef *hnand) -{ - uint32_t data; - uint32_t deviceaddress; - UNUSED(hnand); - - /* Identify the device address */ -#if defined(FMC_Bank2_3) - if (hnand->Init.NandBank == FMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } -#else - deviceaddress = NAND_DEVICE; -#endif /* FMC_Bank2_3 */ - - /* Send Read status operation command */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_STATUS; - - /* Read status register data */ - data = *(__IO uint8_t *)deviceaddress; - - /* Return the status */ - if ((data & NAND_ERROR) == NAND_ERROR) - { - return NAND_ERROR; - } - else if ((data & NAND_READY) == NAND_READY) - { - return NAND_READY; - } - else - { - return NAND_BUSY; - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_NAND_MODULE_ENABLED */ - -/** - * @} - */ - -#endif /* FMC_Bank3) || defined(FMC_Bank2_3) || defined(FSMC_Bank2_3 */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c deleted file mode 100644 index 22366b4..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c +++ /dev/null @@ -1,1641 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_nor.c - * @author MCD Application Team - * @brief NOR HAL module driver. - * This file provides a generic firmware to drive NOR memories mounted - * as external device. - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - This driver is a generic layered driver which contains a set of APIs used to - control NOR flash memories. It uses the FMC/FSMC layer functions to interface - with NOR devices. This driver is used as follows: - - (+) NOR flash memory configuration sequence using the function HAL_NOR_Init() - with control and timing parameters for both normal and extended mode. - - (+) Read NOR flash memory manufacturer code and device IDs using the function - HAL_NOR_Read_ID(). The read information is stored in the NOR_ID_TypeDef - structure declared by the function caller. - - (+) Access NOR flash memory by read/write data unit operations using the functions - HAL_NOR_Read(), HAL_NOR_Program(). - - (+) Perform NOR flash erase block/chip operations using the functions - HAL_NOR_Erase_Block() and HAL_NOR_Erase_Chip(). - - (+) Read the NOR flash CFI (common flash interface) IDs using the function - HAL_NOR_Read_CFI(). The read information is stored in the NOR_CFI_TypeDef - structure declared by the function caller. - - (+) You can also control the NOR device by calling the control APIs HAL_NOR_WriteOperation_Enable()/ - HAL_NOR_WriteOperation_Disable() to respectively enable/disable the NOR write operation - - (+) You can monitor the NOR device HAL state by calling the function - HAL_NOR_GetState() - [..] - (@) This driver is a set of generic APIs which handle standard NOR flash operations. - If a NOR flash device contains different operations and/or implementations, - it should be implemented separately. - - *** NOR HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in NOR HAL driver. - - (+) NOR_WRITE : NOR memory write data to specified address - - *** Callback registration *** - ============================================= - [..] - The compilation define USE_HAL_NOR_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - - Use Functions HAL_NOR_RegisterCallback() to register a user callback, - it allows to register following callbacks: - (+) MspInitCallback : NOR MspInit. - (+) MspDeInitCallback : NOR MspDeInit. - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - - Use function HAL_NOR_UnRegisterCallback() to reset a callback to the default - weak (overridden) function. It allows to reset following callbacks: - (+) MspInitCallback : NOR MspInit. - (+) MspDeInitCallback : NOR MspDeInit. - This function) takes as parameters the HAL peripheral handle and the Callback ID. - - By default, after the HAL_NOR_Init and if the state is HAL_NOR_STATE_RESET - all callbacks are reset to the corresponding legacy weak (overridden) functions. - Exception done for MspInit and MspDeInit callbacks that are respectively - reset to the legacy weak (overridden) functions in the HAL_NOR_Init - and HAL_NOR_DeInit only when these callbacks are null (not registered beforehand). - If not, MspInit or MspDeInit are not null, the HAL_NOR_Init and HAL_NOR_DeInit - keep and use the user MspInit/MspDeInit callbacks (registered beforehand) - - Callbacks can be registered/unregistered in READY state only. - Exception done for MspInit/MspDeInit callbacks that can be registered/unregistered - in READY or RESET state, thus registered (user) MspInit/DeInit callbacks can be used - during the Init/DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using HAL_NOR_RegisterCallback before calling HAL_NOR_DeInit - or HAL_NOR_Init function. - - When The compilation define USE_HAL_NOR_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registering feature is not available - and weak (overridden) callbacks are used. - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -#if defined(FMC_Bank1) || defined(FSMC_Bank1) - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -#ifdef HAL_NOR_MODULE_ENABLED - -/** @defgroup NOR NOR - * @brief NOR driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/** @defgroup NOR_Private_Defines NOR Private Defines - * @{ - */ - -/* Constants to define address to set to write a command */ -#define NOR_CMD_ADDRESS_FIRST_BYTE (uint16_t)0x0AAA -#define NOR_CMD_ADDRESS_FIRST_CFI_BYTE (uint16_t)0x00AA -#define NOR_CMD_ADDRESS_SECOND_BYTE (uint16_t)0x0555 -#define NOR_CMD_ADDRESS_THIRD_BYTE (uint16_t)0x0AAA - -#define NOR_CMD_ADDRESS_FIRST (uint16_t)0x0555 -#define NOR_CMD_ADDRESS_FIRST_CFI (uint16_t)0x0055 -#define NOR_CMD_ADDRESS_SECOND (uint16_t)0x02AA -#define NOR_CMD_ADDRESS_THIRD (uint16_t)0x0555 -#define NOR_CMD_ADDRESS_FOURTH (uint16_t)0x0555 -#define NOR_CMD_ADDRESS_FIFTH (uint16_t)0x02AA -#define NOR_CMD_ADDRESS_SIXTH (uint16_t)0x0555 - -/* Constants to define data to program a command */ -#define NOR_CMD_DATA_READ_RESET (uint16_t)0x00F0 -#define NOR_CMD_DATA_FIRST (uint16_t)0x00AA -#define NOR_CMD_DATA_SECOND (uint16_t)0x0055 -#define NOR_CMD_DATA_AUTO_SELECT (uint16_t)0x0090 -#define NOR_CMD_DATA_PROGRAM (uint16_t)0x00A0 -#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD (uint16_t)0x0080 -#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH (uint16_t)0x00AA -#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH (uint16_t)0x0055 -#define NOR_CMD_DATA_CHIP_ERASE (uint16_t)0x0010 -#define NOR_CMD_DATA_CFI (uint16_t)0x0098 - -#define NOR_CMD_DATA_BUFFER_AND_PROG (uint8_t)0x25 -#define NOR_CMD_DATA_BUFFER_AND_PROG_CONFIRM (uint8_t)0x29 -#define NOR_CMD_DATA_BLOCK_ERASE (uint8_t)0x30 - -#define NOR_CMD_READ_ARRAY (uint16_t)0x00FF -#define NOR_CMD_WORD_PROGRAM (uint16_t)0x0040 -#define NOR_CMD_BUFFERED_PROGRAM (uint16_t)0x00E8 -#define NOR_CMD_CONFIRM (uint16_t)0x00D0 -#define NOR_CMD_BLOCK_ERASE (uint16_t)0x0020 -#define NOR_CMD_BLOCK_UNLOCK (uint16_t)0x0060 -#define NOR_CMD_READ_STATUS_REG (uint16_t)0x0070 -#define NOR_CMD_CLEAR_STATUS_REG (uint16_t)0x0050 - -/* Mask on NOR STATUS REGISTER */ -#define NOR_MASK_STATUS_DQ4 (uint16_t)0x0010 -#define NOR_MASK_STATUS_DQ5 (uint16_t)0x0020 -#define NOR_MASK_STATUS_DQ6 (uint16_t)0x0040 -#define NOR_MASK_STATUS_DQ7 (uint16_t)0x0080 - -/* Address of the primary command set */ -#define NOR_ADDRESS_COMMAND_SET (uint16_t)0x0013 - -/* Command set code assignment (defined in JEDEC JEP137B version may 2004) */ -#define NOR_INTEL_SHARP_EXT_COMMAND_SET (uint16_t)0x0001 /* Supported in this driver */ -#define NOR_AMD_FUJITSU_COMMAND_SET (uint16_t)0x0002 /* Supported in this driver */ -#define NOR_INTEL_STANDARD_COMMAND_SET (uint16_t)0x0003 /* Not Supported in this driver */ -#define NOR_AMD_FUJITSU_EXT_COMMAND_SET (uint16_t)0x0004 /* Not Supported in this driver */ -#define NOR_WINDBOND_STANDARD_COMMAND_SET (uint16_t)0x0006 /* Not Supported in this driver */ -#define NOR_MITSUBISHI_STANDARD_COMMAND_SET (uint16_t)0x0100 /* Not Supported in this driver */ -#define NOR_MITSUBISHI_EXT_COMMAND_SET (uint16_t)0x0101 /* Not Supported in this driver */ -#define NOR_PAGE_WRITE_COMMAND_SET (uint16_t)0x0102 /* Not Supported in this driver */ -#define NOR_INTEL_PERFORMANCE_COMMAND_SET (uint16_t)0x0200 /* Not Supported in this driver */ -#define NOR_INTEL_DATA_COMMAND_SET (uint16_t)0x0210 /* Not Supported in this driver */ - -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup NOR_Private_Variables NOR Private Variables - * @{ - */ - -static uint32_t uwNORMemoryDataWidth = NOR_MEMORY_8B; - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup NOR_Exported_Functions NOR Exported Functions - * @{ - */ - -/** @defgroup NOR_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * - @verbatim - ============================================================================== - ##### NOR Initialization and de_initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to initialize/de-initialize - the NOR memory - -@endverbatim - * @{ - */ - -/** - * @brief Perform the NOR memory Initialization sequence - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @param Timing pointer to NOR control timing structure - * @param ExtTiming pointer to NOR extended mode timing structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_Init(NOR_HandleTypeDef *hnor, FMC_NORSRAM_TimingTypeDef *Timing, - FMC_NORSRAM_TimingTypeDef *ExtTiming) -{ - uint32_t deviceaddress; - HAL_StatusTypeDef status = HAL_OK; - - /* Check the NOR handle parameter */ - if (hnor == NULL) - { - return HAL_ERROR; - } - - if (hnor->State == HAL_NOR_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hnor->Lock = HAL_UNLOCKED; - -#if (USE_HAL_NOR_REGISTER_CALLBACKS == 1) - if (hnor->MspInitCallback == NULL) - { - hnor->MspInitCallback = HAL_NOR_MspInit; - } - - /* Init the low level hardware */ - hnor->MspInitCallback(hnor); -#else - /* Initialize the low level hardware (MSP) */ - HAL_NOR_MspInit(hnor); -#endif /* (USE_HAL_NOR_REGISTER_CALLBACKS) */ - } - - /* Initialize NOR control Interface */ - (void)FMC_NORSRAM_Init(hnor->Instance, &(hnor->Init)); - - /* Initialize NOR timing Interface */ - (void)FMC_NORSRAM_Timing_Init(hnor->Instance, Timing, hnor->Init.NSBank); - - /* Initialize NOR extended mode timing Interface */ - (void)FMC_NORSRAM_Extended_Timing_Init(hnor->Extended, ExtTiming, - hnor->Init.NSBank, hnor->Init.ExtendedMode); - - /* Enable the NORSRAM device */ - __FMC_NORSRAM_ENABLE(hnor->Instance, hnor->Init.NSBank); - - /* Initialize NOR Memory Data Width*/ - if (hnor->Init.MemoryDataWidth == FMC_NORSRAM_MEM_BUS_WIDTH_8) - { - uwNORMemoryDataWidth = NOR_MEMORY_8B; - } - else - { - uwNORMemoryDataWidth = NOR_MEMORY_16B; - } - - /* Initialize the NOR controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - if (hnor->Init.WriteOperation == FMC_WRITE_OPERATION_DISABLE) - { - (void)FMC_NORSRAM_WriteOperation_Disable(hnor->Instance, hnor->Init.NSBank); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_PROTECTED; - } - else - { - /* Get the value of the command set */ - if (uwNORMemoryDataWidth == NOR_MEMORY_8B) - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST_CFI_BYTE), - NOR_CMD_DATA_CFI); - } - else - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST_CFI), NOR_CMD_DATA_CFI); - } - - hnor->CommandSet = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_ADDRESS_COMMAND_SET); - - status = HAL_NOR_ReturnToReadMode(hnor); - } - - return status; -} - -/** - * @brief Perform NOR memory De-Initialization sequence - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_DeInit(NOR_HandleTypeDef *hnor) -{ -#if (USE_HAL_NOR_REGISTER_CALLBACKS == 1) - if (hnor->MspDeInitCallback == NULL) - { - hnor->MspDeInitCallback = HAL_NOR_MspDeInit; - } - - /* DeInit the low level hardware */ - hnor->MspDeInitCallback(hnor); -#else - /* De-Initialize the low level hardware (MSP) */ - HAL_NOR_MspDeInit(hnor); -#endif /* (USE_HAL_NOR_REGISTER_CALLBACKS) */ - - /* Configure the NOR registers with their reset values */ - (void)FMC_NORSRAM_DeInit(hnor->Instance, hnor->Extended, hnor->Init.NSBank); - - /* Reset the NOR controller state */ - hnor->State = HAL_NOR_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hnor); - - return HAL_OK; -} - -/** - * @brief NOR MSP Init - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @retval None - */ -__weak void HAL_NOR_MspInit(NOR_HandleTypeDef *hnor) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hnor); - - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_NOR_MspInit could be implemented in the user file - */ -} - -/** - * @brief NOR MSP DeInit - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @retval None - */ -__weak void HAL_NOR_MspDeInit(NOR_HandleTypeDef *hnor) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hnor); - - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_NOR_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief NOR MSP Wait for Ready/Busy signal - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @param Timeout Maximum timeout value - * @retval None - */ -__weak void HAL_NOR_MspWait(NOR_HandleTypeDef *hnor, uint32_t Timeout) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hnor); - UNUSED(Timeout); - - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_NOR_MspWait could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup NOR_Exported_Functions_Group2 Input and Output functions - * @brief Input Output and memory control functions - * - @verbatim - ============================================================================== - ##### NOR Input and Output functions ##### - ============================================================================== - [..] - This section provides functions allowing to use and control the NOR memory - -@endverbatim - * @{ - */ - -/** - * @brief Read NOR flash IDs - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @param pNOR_ID pointer to NOR ID structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_Read_ID(NOR_HandleTypeDef *hnor, NOR_IDTypeDef *pNOR_ID) -{ - uint32_t deviceaddress; - HAL_NOR_StateTypeDef state; - HAL_StatusTypeDef status = HAL_OK; - - /* Check the NOR controller state */ - state = hnor->State; - if (state == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - else if (state == HAL_NOR_STATE_PROTECTED) - { - return HAL_ERROR; - } - else if (state == HAL_NOR_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Send read ID command */ - if (hnor->CommandSet == NOR_AMD_FUJITSU_COMMAND_SET) - { - if (uwNORMemoryDataWidth == NOR_MEMORY_8B) - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST_BYTE), - NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND_BYTE), - NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD_BYTE), - NOR_CMD_DATA_AUTO_SELECT); - } - else - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD), - NOR_CMD_DATA_AUTO_SELECT); - } - } - else if (hnor->CommandSet == NOR_INTEL_SHARP_EXT_COMMAND_SET) - { - NOR_WRITE(deviceaddress, NOR_CMD_DATA_AUTO_SELECT); - } - else - { - /* Primary command set not supported by the driver */ - status = HAL_ERROR; - } - - if (status != HAL_ERROR) - { - /* Read the NOR IDs */ - pNOR_ID->Manufacturer_Code = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, MC_ADDRESS); - pNOR_ID->Device_Code1 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, - DEVICE_CODE1_ADDR); - pNOR_ID->Device_Code2 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, - DEVICE_CODE2_ADDR); - pNOR_ID->Device_Code3 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, - DEVICE_CODE3_ADDR); - } - - /* Check the NOR controller state */ - hnor->State = state; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - } - else - { - return HAL_ERROR; - } - - return status; -} - -/** - * @brief Returns the NOR memory to Read mode. - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_ReturnToReadMode(NOR_HandleTypeDef *hnor) -{ - uint32_t deviceaddress; - HAL_NOR_StateTypeDef state; - HAL_StatusTypeDef status = HAL_OK; - - /* Check the NOR controller state */ - state = hnor->State; - if (state == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - else if (state == HAL_NOR_STATE_PROTECTED) - { - return HAL_ERROR; - } - else if (state == HAL_NOR_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - if (hnor->CommandSet == NOR_AMD_FUJITSU_COMMAND_SET) - { - NOR_WRITE(deviceaddress, NOR_CMD_DATA_READ_RESET); - } - else if (hnor->CommandSet == NOR_INTEL_SHARP_EXT_COMMAND_SET) - { - NOR_WRITE(deviceaddress, NOR_CMD_READ_ARRAY); - } - else - { - /* Primary command set not supported by the driver */ - status = HAL_ERROR; - } - - /* Check the NOR controller state */ - hnor->State = state; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - } - else - { - return HAL_ERROR; - } - - return status; -} - -/** - * @brief Read data from NOR memory - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @param pAddress pointer to Device address - * @param pData pointer to read data - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_Read(NOR_HandleTypeDef *hnor, uint32_t *pAddress, uint16_t *pData) -{ - uint32_t deviceaddress; - HAL_NOR_StateTypeDef state; - HAL_StatusTypeDef status = HAL_OK; - - /* Check the NOR controller state */ - state = hnor->State; - if (state == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - else if (state == HAL_NOR_STATE_PROTECTED) - { - return HAL_ERROR; - } - else if (state == HAL_NOR_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Send read data command */ - if (hnor->CommandSet == NOR_AMD_FUJITSU_COMMAND_SET) - { - if (uwNORMemoryDataWidth == NOR_MEMORY_8B) - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST_BYTE), - NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND_BYTE), - NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD_BYTE), - NOR_CMD_DATA_READ_RESET); - } - else - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD), - NOR_CMD_DATA_READ_RESET); - } - } - else if (hnor->CommandSet == NOR_INTEL_SHARP_EXT_COMMAND_SET) - { - NOR_WRITE(pAddress, NOR_CMD_READ_ARRAY); - } - else - { - /* Primary command set not supported by the driver */ - status = HAL_ERROR; - } - - if (status != HAL_ERROR) - { - /* Read the data */ - *pData = (uint16_t)(*(__IO uint32_t *)pAddress); - } - - /* Check the NOR controller state */ - hnor->State = state; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - } - else - { - return HAL_ERROR; - } - - return status; -} - -/** - * @brief Program data to NOR memory - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @param pAddress Device address - * @param pData pointer to the data to write - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_Program(NOR_HandleTypeDef *hnor, uint32_t *pAddress, uint16_t *pData) -{ - uint32_t deviceaddress; - HAL_StatusTypeDef status = HAL_OK; - - /* Check the NOR controller state */ - if (hnor->State == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnor->State == HAL_NOR_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Send program data command */ - if (hnor->CommandSet == NOR_AMD_FUJITSU_COMMAND_SET) - { - if (uwNORMemoryDataWidth == NOR_MEMORY_8B) - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST_BYTE), - NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND_BYTE), - NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD_BYTE), - NOR_CMD_DATA_PROGRAM); - } - else - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_PROGRAM); - } - } - else if (hnor->CommandSet == NOR_INTEL_SHARP_EXT_COMMAND_SET) - { - NOR_WRITE(pAddress, NOR_CMD_WORD_PROGRAM); - } - else - { - /* Primary command set not supported by the driver */ - status = HAL_ERROR; - } - - if (status != HAL_ERROR) - { - /* Write the data */ - NOR_WRITE(pAddress, *pData); - } - - /* Check the NOR controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - } - else - { - return HAL_ERROR; - } - - return status; -} - -/** - * @brief Reads a half-word buffer from the NOR memory. - * @param hnor pointer to the NOR handle - * @param uwAddress NOR memory internal address to read from. - * @param pData pointer to the buffer that receives the data read from the - * NOR memory. - * @param uwBufferSize number of Half word to read. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_ReadBuffer(NOR_HandleTypeDef *hnor, uint32_t uwAddress, uint16_t *pData, - uint32_t uwBufferSize) -{ - uint32_t deviceaddress; - uint32_t size = uwBufferSize; - uint32_t address = uwAddress; - uint16_t *data = pData; - HAL_NOR_StateTypeDef state; - HAL_StatusTypeDef status = HAL_OK; - - /* Check the NOR controller state */ - state = hnor->State; - if (state == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - else if (state == HAL_NOR_STATE_PROTECTED) - { - return HAL_ERROR; - } - else if (state == HAL_NOR_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Send read data command */ - if (hnor->CommandSet == NOR_AMD_FUJITSU_COMMAND_SET) - { - if (uwNORMemoryDataWidth == NOR_MEMORY_8B) - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST_BYTE), - NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND_BYTE), - NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD_BYTE), - NOR_CMD_DATA_READ_RESET); - } - else - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD), - NOR_CMD_DATA_READ_RESET); - } - } - else if (hnor->CommandSet == NOR_INTEL_SHARP_EXT_COMMAND_SET) - { - NOR_WRITE(deviceaddress, NOR_CMD_READ_ARRAY); - } - else - { - /* Primary command set not supported by the driver */ - status = HAL_ERROR; - } - - if (status != HAL_ERROR) - { - /* Read buffer */ - while (size > 0U) - { - *data = *(__IO uint16_t *)address; - data++; - address += 2U; - size--; - } - } - - /* Check the NOR controller state */ - hnor->State = state; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - } - else - { - return HAL_ERROR; - } - - return status; -} - -/** - * @brief Writes a half-word buffer to the NOR memory. This function must be used - only with S29GL128P NOR memory. - * @param hnor pointer to the NOR handle - * @param uwAddress NOR memory internal start write address - * @param pData pointer to source data buffer. - * @param uwBufferSize Size of the buffer to write - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_ProgramBuffer(NOR_HandleTypeDef *hnor, uint32_t uwAddress, uint16_t *pData, - uint32_t uwBufferSize) -{ - uint16_t *p_currentaddress; - const uint16_t *p_endaddress; - uint16_t *data = pData; - uint32_t deviceaddress; - HAL_StatusTypeDef status = HAL_OK; - - /* Check the NOR controller state */ - if (hnor->State == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnor->State == HAL_NOR_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Initialize variables */ - p_currentaddress = (uint16_t *)(deviceaddress + uwAddress); - p_endaddress = (uint16_t *)(deviceaddress + uwAddress + (2U * (uwBufferSize - 1U))); - - if (hnor->CommandSet == NOR_AMD_FUJITSU_COMMAND_SET) - { - if (uwNORMemoryDataWidth == NOR_MEMORY_8B) - { - /* Issue unlock command sequence */ - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST_BYTE), - NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND_BYTE), - NOR_CMD_DATA_SECOND); - } - else - { - /* Issue unlock command sequence */ - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - } - /* Write Buffer Load Command */ - NOR_WRITE((deviceaddress + uwAddress), NOR_CMD_DATA_BUFFER_AND_PROG); - NOR_WRITE((deviceaddress + uwAddress), (uint16_t)(uwBufferSize - 1U)); - } - else if (hnor->CommandSet == NOR_INTEL_SHARP_EXT_COMMAND_SET) - { - /* Write Buffer Load Command */ - NOR_WRITE((deviceaddress + uwAddress), NOR_CMD_BUFFERED_PROGRAM); - NOR_WRITE((deviceaddress + uwAddress), (uint16_t)(uwBufferSize - 1U)); - } - else - { - /* Primary command set not supported by the driver */ - status = HAL_ERROR; - } - - if (status != HAL_ERROR) - { - /* Load Data into NOR Buffer */ - while (p_currentaddress <= p_endaddress) - { - NOR_WRITE(p_currentaddress, *data); - - data++; - p_currentaddress ++; - } - - if (hnor->CommandSet == NOR_AMD_FUJITSU_COMMAND_SET) - { - NOR_WRITE((deviceaddress + uwAddress), NOR_CMD_DATA_BUFFER_AND_PROG_CONFIRM); - } - else /* => hnor->CommandSet == NOR_INTEL_SHARP_EXT_COMMAND_SET */ - { - NOR_WRITE((deviceaddress + uwAddress), NOR_CMD_CONFIRM); - } - } - - /* Check the NOR controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - } - else - { - return HAL_ERROR; - } - - return status; - -} - -/** - * @brief Erase the specified block of the NOR memory - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @param BlockAddress Block to erase address - * @param Address Device address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_Erase_Block(NOR_HandleTypeDef *hnor, uint32_t BlockAddress, uint32_t Address) -{ - uint32_t deviceaddress; - HAL_StatusTypeDef status = HAL_OK; - - /* Check the NOR controller state */ - if (hnor->State == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnor->State == HAL_NOR_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Send block erase command sequence */ - if (hnor->CommandSet == NOR_AMD_FUJITSU_COMMAND_SET) - { - if (uwNORMemoryDataWidth == NOR_MEMORY_8B) - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST_BYTE), - NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND_BYTE), - NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD_BYTE), - NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD); - } - else - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD), - NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FOURTH), - NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIFTH), - NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH); - } - NOR_WRITE((uint32_t)(BlockAddress + Address), NOR_CMD_DATA_BLOCK_ERASE); - } - else if (hnor->CommandSet == NOR_INTEL_SHARP_EXT_COMMAND_SET) - { - NOR_WRITE((BlockAddress + Address), NOR_CMD_BLOCK_UNLOCK); - NOR_WRITE((BlockAddress + Address), NOR_CMD_CONFIRM); - NOR_WRITE((BlockAddress + Address), NOR_CMD_BLOCK_ERASE); - NOR_WRITE((BlockAddress + Address), NOR_CMD_CONFIRM); - } - else - { - /* Primary command set not supported by the driver */ - status = HAL_ERROR; - } - - /* Check the NOR memory status and update the controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - } - else - { - return HAL_ERROR; - } - - return status; - -} - -/** - * @brief Erase the entire NOR chip. - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @param Address Device address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_Erase_Chip(NOR_HandleTypeDef *hnor, uint32_t Address) -{ - uint32_t deviceaddress; - HAL_StatusTypeDef status = HAL_OK; - UNUSED(Address); - - /* Check the NOR controller state */ - if (hnor->State == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hnor->State == HAL_NOR_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Send NOR chip erase command sequence */ - if (hnor->CommandSet == NOR_AMD_FUJITSU_COMMAND_SET) - { - if (uwNORMemoryDataWidth == NOR_MEMORY_8B) - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST_BYTE), - NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND_BYTE), - NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD_BYTE), - NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD); - } - else - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD), - NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FOURTH), - NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIFTH), - NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SIXTH), - NOR_CMD_DATA_CHIP_ERASE); - } - } - else - { - /* Primary command set not supported by the driver */ - status = HAL_ERROR; - } - - /* Check the NOR memory status and update the controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - } - else - { - return HAL_ERROR; - } - - return status; -} - -/** - * @brief Read NOR flash CFI IDs - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @param pNOR_CFI pointer to NOR CFI IDs structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_Read_CFI(NOR_HandleTypeDef *hnor, NOR_CFITypeDef *pNOR_CFI) -{ - uint32_t deviceaddress; - HAL_NOR_StateTypeDef state; - - /* Check the NOR controller state */ - state = hnor->State; - if (state == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - else if (state == HAL_NOR_STATE_PROTECTED) - { - return HAL_ERROR; - } - else if (state == HAL_NOR_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Send read CFI query command */ - if (uwNORMemoryDataWidth == NOR_MEMORY_8B) - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST_CFI_BYTE), - NOR_CMD_DATA_CFI); - } - else - { - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST_CFI), NOR_CMD_DATA_CFI); - } - /* read the NOR CFI information */ - pNOR_CFI->CFI_1 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, CFI1_ADDRESS); - pNOR_CFI->CFI_2 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, CFI2_ADDRESS); - pNOR_CFI->CFI_3 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, CFI3_ADDRESS); - pNOR_CFI->CFI_4 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, CFI4_ADDRESS); - - /* Check the NOR controller state */ - hnor->State = state; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -#if (USE_HAL_NOR_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User NOR Callback - * To be used to override the weak predefined callback - * @param hnor : NOR handle - * @param CallbackId : ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_NOR_MSP_INIT_CB_ID NOR MspInit callback ID - * @arg @ref HAL_NOR_MSP_DEINIT_CB_ID NOR MspDeInit callback ID - * @param pCallback : pointer to the Callback function - * @retval status - */ -HAL_StatusTypeDef HAL_NOR_RegisterCallback(NOR_HandleTypeDef *hnor, HAL_NOR_CallbackIDTypeDef CallbackId, - pNOR_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - HAL_NOR_StateTypeDef state; - - if (pCallback == NULL) - { - return HAL_ERROR; - } - - state = hnor->State; - if ((state == HAL_NOR_STATE_READY) || (state == HAL_NOR_STATE_RESET) || (state == HAL_NOR_STATE_PROTECTED)) - { - switch (CallbackId) - { - case HAL_NOR_MSP_INIT_CB_ID : - hnor->MspInitCallback = pCallback; - break; - case HAL_NOR_MSP_DEINIT_CB_ID : - hnor->MspDeInitCallback = pCallback; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else - { - /* update return status */ - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Unregister a User NOR Callback - * NOR Callback is redirected to the weak predefined callback - * @param hnor : NOR handle - * @param CallbackId : ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_NOR_MSP_INIT_CB_ID NOR MspInit callback ID - * @arg @ref HAL_NOR_MSP_DEINIT_CB_ID NOR MspDeInit callback ID - * @retval status - */ -HAL_StatusTypeDef HAL_NOR_UnRegisterCallback(NOR_HandleTypeDef *hnor, HAL_NOR_CallbackIDTypeDef CallbackId) -{ - HAL_StatusTypeDef status = HAL_OK; - HAL_NOR_StateTypeDef state; - - state = hnor->State; - if ((state == HAL_NOR_STATE_READY) || (state == HAL_NOR_STATE_RESET) || (state == HAL_NOR_STATE_PROTECTED)) - { - switch (CallbackId) - { - case HAL_NOR_MSP_INIT_CB_ID : - hnor->MspInitCallback = HAL_NOR_MspInit; - break; - case HAL_NOR_MSP_DEINIT_CB_ID : - hnor->MspDeInitCallback = HAL_NOR_MspDeInit; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else - { - /* update return status */ - status = HAL_ERROR; - } - - return status; -} -#endif /* (USE_HAL_NOR_REGISTER_CALLBACKS) */ - -/** - * @} - */ - -/** @defgroup NOR_Exported_Functions_Group3 NOR Control functions - * @brief management functions - * -@verbatim - ============================================================================== - ##### NOR Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control dynamically - the NOR interface. - -@endverbatim - * @{ - */ - -/** - * @brief Enables dynamically NOR write operation. - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_WriteOperation_Enable(NOR_HandleTypeDef *hnor) -{ - /* Check the NOR controller state */ - if (hnor->State == HAL_NOR_STATE_PROTECTED) - { - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Enable write operation */ - (void)FMC_NORSRAM_WriteOperation_Enable(hnor->Instance, hnor->Init.NSBank); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Disables dynamically NOR write operation. - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_WriteOperation_Disable(NOR_HandleTypeDef *hnor) -{ - /* Check the NOR controller state */ - if (hnor->State == HAL_NOR_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Disable write operation */ - (void)FMC_NORSRAM_WriteOperation_Disable(hnor->Instance, hnor->Init.NSBank); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_PROTECTED; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup NOR_Exported_Functions_Group4 NOR State functions - * @brief Peripheral State functions - * -@verbatim - ============================================================================== - ##### NOR State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the NOR controller - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief return the NOR controller state - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @retval NOR controller state - */ -HAL_NOR_StateTypeDef HAL_NOR_GetState(const NOR_HandleTypeDef *hnor) -{ - return hnor->State; -} - -/** - * @brief Returns the NOR operation status. - * @param hnor pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @param Address Device address - * @param Timeout NOR programming Timeout - * @retval NOR_Status The returned value can be: HAL_NOR_STATUS_SUCCESS, HAL_NOR_STATUS_ERROR - * or HAL_NOR_STATUS_TIMEOUT - */ -HAL_NOR_StatusTypeDef HAL_NOR_GetStatus(NOR_HandleTypeDef *hnor, uint32_t Address, uint32_t Timeout) -{ - HAL_NOR_StatusTypeDef status = HAL_NOR_STATUS_ONGOING; - uint16_t tmpsr1; - uint16_t tmpsr2; - uint32_t tickstart; - - /* Poll on NOR memory Ready/Busy signal ------------------------------------*/ - HAL_NOR_MspWait(hnor, Timeout); - - /* Get the NOR memory operation status -------------------------------------*/ - - /* Get tick */ - tickstart = HAL_GetTick(); - - if (hnor->CommandSet == NOR_AMD_FUJITSU_COMMAND_SET) - { - while ((status != HAL_NOR_STATUS_SUCCESS) && (status != HAL_NOR_STATUS_TIMEOUT)) - { - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) - { - status = HAL_NOR_STATUS_TIMEOUT; - } - } - - /* Read NOR status register (DQ6 and DQ5) */ - tmpsr1 = *(__IO uint16_t *)Address; - tmpsr2 = *(__IO uint16_t *)Address; - - /* If DQ6 did not toggle between the two reads then return HAL_NOR_STATUS_SUCCESS */ - if ((tmpsr1 & NOR_MASK_STATUS_DQ6) == (tmpsr2 & NOR_MASK_STATUS_DQ6)) - { - return HAL_NOR_STATUS_SUCCESS ; - } - - if ((tmpsr1 & NOR_MASK_STATUS_DQ5) == NOR_MASK_STATUS_DQ5) - { - status = HAL_NOR_STATUS_ONGOING; - } - - tmpsr1 = *(__IO uint16_t *)Address; - tmpsr2 = *(__IO uint16_t *)Address; - - /* If DQ6 did not toggle between the two reads then return HAL_NOR_STATUS_SUCCESS */ - if ((tmpsr1 & NOR_MASK_STATUS_DQ6) == (tmpsr2 & NOR_MASK_STATUS_DQ6)) - { - return HAL_NOR_STATUS_SUCCESS; - } - if ((tmpsr1 & NOR_MASK_STATUS_DQ5) == NOR_MASK_STATUS_DQ5) - { - return HAL_NOR_STATUS_ERROR; - } - } - } - else if (hnor->CommandSet == NOR_INTEL_SHARP_EXT_COMMAND_SET) - { - do - { - NOR_WRITE(Address, NOR_CMD_READ_STATUS_REG); - tmpsr2 = *(__IO uint16_t *)(Address); - - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) - { - return HAL_NOR_STATUS_TIMEOUT; - } - } - } while ((tmpsr2 & NOR_MASK_STATUS_DQ7) == 0U); - - NOR_WRITE(Address, NOR_CMD_READ_STATUS_REG); - tmpsr1 = *(__IO uint16_t *)(Address); - if ((tmpsr1 & (NOR_MASK_STATUS_DQ5 | NOR_MASK_STATUS_DQ4)) != 0U) - { - /* Clear the Status Register */ - NOR_WRITE(Address, NOR_CMD_READ_STATUS_REG); - status = HAL_NOR_STATUS_ERROR; - } - else - { - status = HAL_NOR_STATUS_SUCCESS; - } - } - else - { - /* Primary command set not supported by the driver */ - status = HAL_NOR_STATUS_ERROR; - } - - /* Return the operation status */ - return status; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_NOR_MODULE_ENABLED */ - -/** - * @} - */ - -#endif /* FMC_Bank1 || FSMC_Bank1 */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.c deleted file mode 100644 index a568d57..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.c +++ /dev/null @@ -1,961 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pccard.c - * @author MCD Application Team - * @brief PCCARD HAL module driver. - * This file provides a generic firmware to drive PCCARD memories mounted - * as external device. - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - =============================================================================== - ##### How to use this driver ##### - =============================================================================== - [..] - This driver is a generic layered driver which contains a set of APIs used to - control PCCARD/compact flash memories. It uses the FMC/FSMC layer functions - to interface with PCCARD devices. This driver is used for: - - (+) PCCARD/Compact Flash memory configuration sequence using the function - HAL_PCCARD_Init()/HAL_CF_Init() with control and timing parameters for - both common and attribute spaces. - - (+) Read PCCARD/Compact Flash memory maker and device IDs using the function - HAL_PCCARD_Read_ID()/HAL_CF_Read_ID(). The read information is stored in - the CompactFlash_ID structure declared by the function caller. - - (+) Access PCCARD/Compact Flash memory by read/write operations using the functions - HAL_PCCARD_Read_Sector()/ HAL_PCCARD_Write_Sector() - - HAL_CF_Read_Sector()/HAL_CF_Write_Sector(), to read/write sector. - - (+) Perform PCCARD/Compact Flash Reset chip operation using the function - HAL_PCCARD_Reset()/HAL_CF_Reset. - - (+) Perform PCCARD/Compact Flash erase sector operation using the function - HAL_PCCARD_Erase_Sector()/HAL_CF_Erase_Sector. - - (+) Read the PCCARD/Compact Flash status operation using the function - HAL_PCCARD_ReadStatus()/HAL_CF_ReadStatus(). - - (+) You can monitor the PCCARD/Compact Flash device HAL state by calling - the function HAL_PCCARD_GetState()/HAL_CF_GetState() - - [..] - (@) This driver is a set of generic APIs which handle standard PCCARD/compact flash - operations. If a PCCARD/Compact Flash device contains different operations - and/or implementations, it should be implemented separately. - - *** Callback registration *** - ============================================= - [..] - The compilation define USE_HAL_PCCARD_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - - Use Functions HAL_PCCARD_RegisterCallback() to register a user callback, - it allows to register following callbacks: - (+) MspInitCallback : PCCARD MspInit. - (+) MspDeInitCallback : PCCARD MspDeInit. - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - - Use function HAL_PCCARD_UnRegisterCallback() to reset a callback to the default - weak (surcharged) function. It allows to reset following callbacks: - (+) MspInitCallback : PCCARD MspInit. - (+) MspDeInitCallback : PCCARD MspDeInit. - This function) takes as parameters the HAL peripheral handle and the Callback ID. - - By default, after the HAL_PCCARD_Init and if the state is HAL_PCCARD_STATE_RESET - all callbacks are reset to the corresponding legacy weak (surcharged) functions. - Exception done for MspInit and MspDeInit callbacks that are respectively - reset to the legacy weak (surcharged) functions in the HAL_PCCARD_Init - and HAL_PCCARD_DeInit only when these callbacks are null (not registered beforehand). - If not, MspInit or MspDeInit are not null, the HAL_PCCARD_Init and HAL_PCCARD_DeInit - keep and use the user MspInit/MspDeInit callbacks (registered beforehand) - - Callbacks can be registered/unregistered in READY state only. - Exception done for MspInit/MspDeInit callbacks that can be registered/unregistered - in READY or RESET state, thus registered (user) MspInit/DeInit callbacks can be used - during the Init/DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using HAL_PCCARD_RegisterCallback before calling HAL_PCCARD_DeInit - or HAL_PCCARD_Init function. - - When The compilation define USE_HAL_PCCARD_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registering feature is not available - and weak (surcharged) callbacks are used. - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -#if defined(FMC_Bank4) || defined(FSMC_Bank4) - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -#ifdef HAL_PCCARD_MODULE_ENABLED - -/** @defgroup PCCARD PCCARD - * @brief PCCARD HAL module driver - * @{ - */ -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/** @defgroup PCCARD_Private_Defines PCCARD Private Defines - * @{ - */ -#define PCCARD_TIMEOUT_READ_ID 0x0000FFFFU -#define PCCARD_TIMEOUT_READ_WRITE_SECTOR 0x0000FFFFU -#define PCCARD_TIMEOUT_ERASE_SECTOR 0x00000400U -#define PCCARD_TIMEOUT_STATUS 0x01000000U - -#define PCCARD_STATUS_OK (uint8_t)0x58 -#define PCCARD_STATUS_WRITE_OK (uint8_t)0x50 -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function ----------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup PCCARD_Exported_Functions PCCARD Exported Functions - * @{ - */ - -/** @defgroup PCCARD_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * - @verbatim - ============================================================================== - ##### PCCARD Initialization and de-initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to initialize/de-initialize - the PCCARD memory - -@endverbatim - * @{ - */ - -/** - * @brief Perform the PCCARD memory Initialization sequence - * @param hpccard pointer to a PCCARD_HandleTypeDef structure that contains - * the configuration information for PCCARD module. - * @param ComSpaceTiming Common space timing structure - * @param AttSpaceTiming Attribute space timing structure - * @param IOSpaceTiming IO space timing structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCCARD_Init(PCCARD_HandleTypeDef *hpccard, FMC_NAND_PCC_TimingTypeDef *ComSpaceTiming, - FMC_NAND_PCC_TimingTypeDef *AttSpaceTiming, - FMC_NAND_PCC_TimingTypeDef *IOSpaceTiming) -{ - /* Check the PCCARD controller state */ - if (hpccard == NULL) - { - return HAL_ERROR; - } - - if (hpccard->State == HAL_PCCARD_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hpccard->Lock = HAL_UNLOCKED; -#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1) - if (hpccard->MspInitCallback == NULL) - { - hpccard->MspInitCallback = HAL_PCCARD_MspInit; - } - hpccard->ItCallback = HAL_PCCARD_ITCallback; - - /* Init the low level hardware */ - hpccard->MspInitCallback(hpccard); -#else - /* Initialize the low level hardware (MSP) */ - HAL_PCCARD_MspInit(hpccard); -#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */ - } - - /* Initialize the PCCARD state */ - hpccard->State = HAL_PCCARD_STATE_BUSY; - - /* Initialize PCCARD control Interface */ - FMC_PCCARD_Init(hpccard->Instance, &(hpccard->Init)); - - /* Init PCCARD common space timing Interface */ - FMC_PCCARD_CommonSpace_Timing_Init(hpccard->Instance, ComSpaceTiming); - - /* Init PCCARD attribute space timing Interface */ - FMC_PCCARD_AttributeSpace_Timing_Init(hpccard->Instance, AttSpaceTiming); - - /* Init PCCARD IO space timing Interface */ - FMC_PCCARD_IOSpace_Timing_Init(hpccard->Instance, IOSpaceTiming); - - /* Enable the PCCARD device */ - __FMC_PCCARD_ENABLE(hpccard->Instance); - - /* Update the PCCARD state */ - hpccard->State = HAL_PCCARD_STATE_READY; - - return HAL_OK; - -} - -/** - * @brief Perform the PCCARD memory De-initialization sequence - * @param hpccard pointer to a PCCARD_HandleTypeDef structure that contains - * the configuration information for PCCARD module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCCARD_DeInit(PCCARD_HandleTypeDef *hpccard) -{ -#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1) - if (hpccard->MspDeInitCallback == NULL) - { - hpccard->MspDeInitCallback = HAL_PCCARD_MspDeInit; - } - - /* DeInit the low level hardware */ - hpccard->MspDeInitCallback(hpccard); -#else - /* De-Initialize the low level hardware (MSP) */ - HAL_PCCARD_MspDeInit(hpccard); -#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */ - - /* Configure the PCCARD registers with their reset values */ - FMC_PCCARD_DeInit(hpccard->Instance); - - /* Update the PCCARD controller state */ - hpccard->State = HAL_PCCARD_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hpccard); - - return HAL_OK; -} - -/** - * @brief PCCARD MSP Init - * @param hpccard pointer to a PCCARD_HandleTypeDef structure that contains - * the configuration information for PCCARD module. - * @retval None - */ -__weak void HAL_PCCARD_MspInit(PCCARD_HandleTypeDef *hpccard) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpccard); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCCARD_MspInit could be implemented in the user file - */ -} - -/** - * @brief PCCARD MSP DeInit - * @param hpccard pointer to a PCCARD_HandleTypeDef structure that contains - * the configuration information for PCCARD module. - * @retval None - */ -__weak void HAL_PCCARD_MspDeInit(PCCARD_HandleTypeDef *hpccard) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpccard); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCCARD_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup PCCARD_Exported_Functions_Group2 Input and Output functions - * @brief Input Output and memory control functions - * - @verbatim - ============================================================================== - ##### PCCARD Input and Output functions ##### - ============================================================================== - [..] - This section provides functions allowing to use and control the PCCARD memory - -@endverbatim - * @{ - */ - -/** - * @brief Read Compact Flash's ID. - * @param hpccard pointer to a PCCARD_HandleTypeDef structure that contains - * the configuration information for PCCARD module. - * @param CompactFlash_ID Compact flash ID structure. - * @param pStatus pointer to compact flash status - * @retval HAL status - * - */ -HAL_StatusTypeDef HAL_PCCARD_Read_ID(PCCARD_HandleTypeDef *hpccard, uint8_t CompactFlash_ID[], uint8_t *pStatus) -{ - uint32_t timeout = 0U; - uint32_t index = 0U; - uint8_t status = 0U; - - /* Process Locked */ - __HAL_LOCK(hpccard); - - /* Check the PCCARD controller state */ - if (hpccard->State == HAL_PCCARD_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Initialize timeout value */ - timeout = PCCARD_TIMEOUT_READ_ID; - - /* Update the PCCARD controller state */ - hpccard->State = HAL_PCCARD_STATE_BUSY; - - /* Initialize the PCCARD status */ - *pStatus = PCCARD_READY; - - /* Send the Identify Command */ - *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0xECEC; - - /* Read PCCARD IDs and timeout treatment */ - do - { - /* Read the PCCARD status */ - status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE); - - timeout--; - } while ((status != PCCARD_STATUS_OK) && timeout); - - if (timeout == 0U) - { - *pStatus = PCCARD_TIMEOUT_ERROR; - } - else - { - /* Read PCCARD ID bytes */ - for (index = 0U; index < 16U; index++) - { - CompactFlash_ID[index] = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_DATA); - } - } - - /* Update the PCCARD controller state */ - hpccard->State = HAL_PCCARD_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hpccard); - - return HAL_OK; -} - -/** - * @brief Read sector from PCCARD memory - * @param hpccard pointer to a PCCARD_HandleTypeDef structure that contains - * the configuration information for PCCARD module. - * @param pBuffer pointer to destination read buffer - * @param SectorAddress Sector address to read - * @param pStatus pointer to PCCARD status - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCCARD_Read_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t *pBuffer, uint16_t SectorAddress, - uint8_t *pStatus) -{ - uint32_t timeout = 0U; - uint32_t index = 0U; - uint8_t status = 0U; - - /* Process Locked */ - __HAL_LOCK(hpccard); - - /* Check the PCCARD controller state */ - if (hpccard->State == HAL_PCCARD_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Initialize timeout value */ - timeout = PCCARD_TIMEOUT_READ_WRITE_SECTOR; - - /* Update the PCCARD controller state */ - hpccard->State = HAL_PCCARD_STATE_BUSY; - - /* Initialize PCCARD status */ - *pStatus = PCCARD_READY; - - /* Set the parameters to write a sector */ - *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = (uint16_t)0x0000; - *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = ((uint16_t)0x0100) | ((uint16_t)SectorAddress); - *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0xE4A0; - - do - { - /* wait till the Status = 0x80 */ - status = *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE); - timeout--; - } while ((status == 0x80U) && timeout); - - if (timeout == 0U) - { - *pStatus = PCCARD_TIMEOUT_ERROR; - } - - timeout = PCCARD_TIMEOUT_READ_WRITE_SECTOR; - - do - { - /* wait till the Status = PCCARD_STATUS_OK */ - status = *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE); - timeout--; - } while ((status != PCCARD_STATUS_OK) && timeout); - - if (timeout == 0U) - { - *pStatus = PCCARD_TIMEOUT_ERROR; - } - - /* Read bytes */ - for (; index < PCCARD_SECTOR_SIZE; index++) - { - *(uint16_t *)pBuffer++ = *(uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR); - } - - /* Update the PCCARD controller state */ - hpccard->State = HAL_PCCARD_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hpccard); - - return HAL_OK; -} - - -/** - * @brief Write sector to PCCARD memory - * @param hpccard pointer to a PCCARD_HandleTypeDef structure that contains - * the configuration information for PCCARD module. - * @param pBuffer pointer to source write buffer - * @param SectorAddress Sector address to write - * @param pStatus pointer to PCCARD status - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCCARD_Write_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t *pBuffer, uint16_t SectorAddress, - uint8_t *pStatus) -{ - uint32_t timeout = 0U; - uint32_t index = 0U; - uint8_t status = 0U; - - /* Process Locked */ - __HAL_LOCK(hpccard); - - /* Check the PCCARD controller state */ - if (hpccard->State == HAL_PCCARD_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Initialize timeout value */ - timeout = PCCARD_TIMEOUT_READ_WRITE_SECTOR; - - /* Update the PCCARD controller state */ - hpccard->State = HAL_PCCARD_STATE_BUSY; - - /* Initialize PCCARD status */ - *pStatus = PCCARD_READY; - - /* Set the parameters to write a sector */ - *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = (uint16_t)0x0000; - *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = ((uint16_t)0x0100) | ((uint16_t)SectorAddress); - *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0x30A0; - - do - { - /* Wait till the Status = PCCARD_STATUS_OK */ - status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE); - timeout--; - } while ((status != PCCARD_STATUS_OK) && timeout); - - if (timeout == 0U) - { - *pStatus = PCCARD_TIMEOUT_ERROR; - } - - /* Write bytes */ - for (; index < PCCARD_SECTOR_SIZE; index++) - { - *(uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR) = *(uint16_t *)pBuffer++; - } - - do - { - /* Wait till the Status = PCCARD_STATUS_WRITE_OK */ - status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE); - timeout--; - } while ((status != PCCARD_STATUS_WRITE_OK) && timeout); - - if (timeout == 0U) - { - *pStatus = PCCARD_TIMEOUT_ERROR; - } - - /* Update the PCCARD controller state */ - hpccard->State = HAL_PCCARD_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hpccard); - - return HAL_OK; -} - - -/** - * @brief Erase sector from PCCARD memory - * @param hpccard pointer to a PCCARD_HandleTypeDef structure that contains - * the configuration information for PCCARD module. - * @param SectorAddress Sector address to erase - * @param pStatus pointer to PCCARD status - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCCARD_Erase_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t SectorAddress, uint8_t *pStatus) -{ - uint32_t timeout = PCCARD_TIMEOUT_ERASE_SECTOR; - uint8_t status = 0U; - - /* Process Locked */ - __HAL_LOCK(hpccard); - - /* Check the PCCARD controller state */ - if (hpccard->State == HAL_PCCARD_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Update the PCCARD controller state */ - hpccard->State = HAL_PCCARD_STATE_BUSY; - - /* Initialize PCCARD status */ - *pStatus = PCCARD_READY; - - /* Set the parameters to write a sector */ - *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_LOW) = 0x00; - *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = 0x00; - *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_NUMBER) = SectorAddress; - *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = 0x01; - *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CARD_HEAD) = 0xA0; - *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = ATA_ERASE_SECTOR_CMD; - - /* wait till the PCCARD is ready */ - status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE); - - while ((status != PCCARD_STATUS_WRITE_OK) && timeout) - { - status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE); - timeout--; - } - - if (timeout == 0U) - { - *pStatus = PCCARD_TIMEOUT_ERROR; - } - - /* Check the PCCARD controller state */ - hpccard->State = HAL_PCCARD_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hpccard); - - return HAL_OK; -} - -/** - * @brief Reset the PCCARD memory - * @param hpccard pointer to a PCCARD_HandleTypeDef structure that contains - * the configuration information for PCCARD module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCCARD_Reset(PCCARD_HandleTypeDef *hpccard) -{ - /* Process Locked */ - __HAL_LOCK(hpccard); - - /* Check the PCCARD controller state */ - if (hpccard->State == HAL_PCCARD_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Provide a SW reset and Read and verify the: - - PCCard Configuration Option Register at address 0x98000200 --> 0x80 - - Card Configuration and Status Register at address 0x98000202 --> 0x00 - - Pin Replacement Register at address 0x98000204 --> 0x0C - - Socket and Copy Register at address 0x98000206 --> 0x00 - */ - - /* Check the PCCARD controller state */ - hpccard->State = HAL_PCCARD_STATE_BUSY; - - *(__IO uint8_t *)(PCCARD_ATTRIBUTE_SPACE_ADDRESS | ATA_CARD_CONFIGURATION) = 0x01; - - /* Check the PCCARD controller state */ - hpccard->State = HAL_PCCARD_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hpccard); - - return HAL_OK; -} - -/** - * @brief This function handles PCCARD device interrupt request. - * @param hpccard pointer to a PCCARD_HandleTypeDef structure that contains - * the configuration information for PCCARD module. - * @retval HAL status - */ -void HAL_PCCARD_IRQHandler(PCCARD_HandleTypeDef *hpccard) -{ - /* Check PCCARD interrupt Rising edge flag */ - if (__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_RISING_EDGE)) - { - /* PCCARD interrupt callback*/ -#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1) - hpccard->ItCallback(hpccard); -#else - HAL_PCCARD_ITCallback(hpccard); -#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */ - - /* Clear PCCARD interrupt Rising edge pending bit */ - __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_RISING_EDGE); - } - - /* Check PCCARD interrupt Level flag */ - if (__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_LEVEL)) - { - /* PCCARD interrupt callback*/ -#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1) - hpccard->ItCallback(hpccard); -#else - HAL_PCCARD_ITCallback(hpccard); -#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */ - - /* Clear PCCARD interrupt Level pending bit */ - __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_LEVEL); - } - - /* Check PCCARD interrupt Falling edge flag */ - if (__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_FALLING_EDGE)) - { - /* PCCARD interrupt callback*/ -#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1) - hpccard->ItCallback(hpccard); -#else - HAL_PCCARD_ITCallback(hpccard); -#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */ - - /* Clear PCCARD interrupt Falling edge pending bit */ - __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_FALLING_EDGE); - } - - /* Check PCCARD interrupt FIFO empty flag */ - if (__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_FEMPT)) - { - /* PCCARD interrupt callback*/ -#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1) - hpccard->ItCallback(hpccard); -#else - HAL_PCCARD_ITCallback(hpccard); -#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */ - - /* Clear PCCARD interrupt FIFO empty pending bit */ - __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_FEMPT); - } -} - -/** - * @brief PCCARD interrupt feature callback - * @param hpccard pointer to a PCCARD_HandleTypeDef structure that contains - * the configuration information for PCCARD module. - * @retval None - */ -__weak void HAL_PCCARD_ITCallback(PCCARD_HandleTypeDef *hpccard) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hpccard); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCCARD_ITCallback could be implemented in the user file - */ -} - -#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User PCCARD Callback - * To be used instead of the weak (surcharged) predefined callback - * @param hpccard : PCCARD handle - * @param CallbackId : ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_PCCARD_MSP_INIT_CB_ID PCCARD MspInit callback ID - * @arg @ref HAL_PCCARD_MSP_DEINIT_CB_ID PCCARD MspDeInit callback ID - * @arg @ref HAL_PCCARD_IT_CB_ID PCCARD IT callback ID - * @param pCallback : pointer to the Callback function - * @retval status - */ -HAL_StatusTypeDef HAL_PCCARD_RegisterCallback(PCCARD_HandleTypeDef *hpccard, HAL_PCCARD_CallbackIDTypeDef CallbackId, - pPCCARD_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hpccard); - - if (hpccard->State == HAL_PCCARD_STATE_READY) - { - switch (CallbackId) - { - case HAL_PCCARD_MSP_INIT_CB_ID : - hpccard->MspInitCallback = pCallback; - break; - case HAL_PCCARD_MSP_DEINIT_CB_ID : - hpccard->MspDeInitCallback = pCallback; - break; - case HAL_PCCARD_IT_CB_ID : - hpccard->ItCallback = pCallback; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else if (hpccard->State == HAL_PCCARD_STATE_RESET) - { - switch (CallbackId) - { - case HAL_PCCARD_MSP_INIT_CB_ID : - hpccard->MspInitCallback = pCallback; - break; - case HAL_PCCARD_MSP_DEINIT_CB_ID : - hpccard->MspDeInitCallback = pCallback; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else - { - /* update return status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpccard); - return status; -} - -/** - * @brief Unregister a User PCCARD Callback - * PCCARD Callback is redirected to the weak (surcharged) predefined callback - * @param hpccard : PCCARD handle - * @param CallbackId : ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_PCCARD_MSP_INIT_CB_ID PCCARD MspInit callback ID - * @arg @ref HAL_PCCARD_MSP_DEINIT_CB_ID PCCARD MspDeInit callback ID - * @arg @ref HAL_PCCARD_IT_CB_ID PCCARD IT callback ID - * @retval status - */ -HAL_StatusTypeDef HAL_PCCARD_UnRegisterCallback(PCCARD_HandleTypeDef *hpccard, HAL_PCCARD_CallbackIDTypeDef CallbackId) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hpccard); - - if (hpccard->State == HAL_PCCARD_STATE_READY) - { - switch (CallbackId) - { - case HAL_PCCARD_MSP_INIT_CB_ID : - hpccard->MspInitCallback = HAL_PCCARD_MspInit; - break; - case HAL_PCCARD_MSP_DEINIT_CB_ID : - hpccard->MspDeInitCallback = HAL_PCCARD_MspDeInit; - break; - case HAL_PCCARD_IT_CB_ID : - hpccard->ItCallback = HAL_PCCARD_ITCallback; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else if (hpccard->State == HAL_PCCARD_STATE_RESET) - { - switch (CallbackId) - { - case HAL_PCCARD_MSP_INIT_CB_ID : - hpccard->MspInitCallback = HAL_PCCARD_MspInit; - break; - case HAL_PCCARD_MSP_DEINIT_CB_ID : - hpccard->MspDeInitCallback = HAL_PCCARD_MspDeInit; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else - { - /* update return status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hpccard); - return status; -} -#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup PCCARD_Exported_Functions_Group3 State functions - * @brief Peripheral State functions - * -@verbatim - ============================================================================== - ##### PCCARD State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the PCCARD controller - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief return the PCCARD controller state - * @param hpccard pointer to a PCCARD_HandleTypeDef structure that contains - * the configuration information for PCCARD module. - * @retval HAL state - */ -HAL_PCCARD_StateTypeDef HAL_PCCARD_GetState(PCCARD_HandleTypeDef *hpccard) -{ - return hpccard->State; -} - -/** - * @brief Get the compact flash memory status - * @param hpccard pointer to a PCCARD_HandleTypeDef structure that contains - * the configuration information for PCCARD module. - * @retval New status of the PCCARD operation. This parameter can be: - * - CompactFlash_TIMEOUT_ERROR: when the previous operation generate - * a Timeout error - * - CompactFlash_READY: when memory is ready for the next operation - */ -HAL_PCCARD_StatusTypeDef HAL_PCCARD_GetStatus(PCCARD_HandleTypeDef *hpccard) -{ - uint32_t timeout = PCCARD_TIMEOUT_STATUS; - uint32_t status_pccard = 0U; - - /* Check the PCCARD controller state */ - if (hpccard->State == HAL_PCCARD_STATE_BUSY) - { - return HAL_PCCARD_STATUS_ONGOING; - } - - status_pccard = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE); - - while ((status_pccard == PCCARD_BUSY) && timeout) - { - status_pccard = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE); - timeout--; - } - - if (timeout == 0U) - { - status_pccard = PCCARD_TIMEOUT_ERROR; - } - - /* Return the operation status */ - return (HAL_PCCARD_StatusTypeDef) status_pccard; -} - -/** - * @brief Reads the Compact Flash memory status using the Read status command - * @param hpccard pointer to a PCCARD_HandleTypeDef structure that contains - * the configuration information for PCCARD module. - * @retval The status of the Compact Flash memory. This parameter can be: - * - CompactFlash_BUSY: when memory is busy - * - CompactFlash_READY: when memory is ready for the next operation - * - CompactFlash_ERROR: when the previous operation generates error - */ -HAL_PCCARD_StatusTypeDef HAL_PCCARD_ReadStatus(PCCARD_HandleTypeDef *hpccard) -{ - uint8_t data = 0U; - uint8_t status_pccard = PCCARD_BUSY; - - /* Check the PCCARD controller state */ - if (hpccard->State == HAL_PCCARD_STATE_BUSY) - { - return HAL_PCCARD_STATUS_ONGOING; - } - - /* Read status operation */ - data = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE); - - if ((data & PCCARD_TIMEOUT_ERROR) == PCCARD_TIMEOUT_ERROR) - { - status_pccard = PCCARD_TIMEOUT_ERROR; - } - else if ((data & PCCARD_READY) == PCCARD_READY) - { - status_pccard = PCCARD_READY; - } - - return (HAL_PCCARD_StatusTypeDef) status_pccard; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_PCCARD_MODULE_ENABLED */ - -/** - * @} - */ - -#endif /* FMC_Bank4 || FSMC_Bank4 */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c deleted file mode 100644 index 5ccde64..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c +++ /dev/null @@ -1,598 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr.c - * @author MCD Application Team - * @brief PWR HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Power Controller (PWR) peripheral: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup PWR PWR - * @brief PWR HAL module driver - * @{ - */ - -#ifdef HAL_PWR_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup PWR_Private_Constants - * @{ - */ - -/** @defgroup PWR_PVD_Mode_Mask PWR PVD Mode Mask - * @{ - */ -#define PVD_MODE_IT 0x00010000U -#define PVD_MODE_EVT 0x00020000U -#define PVD_RISING_EDGE 0x00000001U -#define PVD_FALLING_EDGE 0x00000002U -/** - * @} - */ - -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup PWR_Exported_Functions PWR Exported Functions - * @{ - */ - -/** @defgroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - After reset, the backup domain (RTC registers, RTC backup data - registers and backup SRAM) is protected against possible unwanted - write accesses. - To enable access to the RTC Domain and RTC registers, proceed as follows: - (+) Enable the Power Controller (PWR) APB1 interface clock using the - __HAL_RCC_PWR_CLK_ENABLE() macro. - (+) Enable access to RTC domain using the HAL_PWR_EnableBkUpAccess() function. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the HAL PWR peripheral registers to their default reset values. - * @retval None - */ -void HAL_PWR_DeInit(void) -{ - __HAL_RCC_PWR_FORCE_RESET(); - __HAL_RCC_PWR_RELEASE_RESET(); -} - -/** - * @brief Enables access to the backup domain (RTC registers, RTC - * backup data registers and backup SRAM). - * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the - * Backup Domain Access should be kept enabled. - * @note The following sequence is required to bypass the delay between - * DBP bit programming and the effective enabling of the backup domain. - * Please check the Errata Sheet for more details under "Possible delay - * in backup domain protection disabling/enabling after programming the - * DBP bit" section. - * @retval None - */ -void HAL_PWR_EnableBkUpAccess(void) -{ - __IO uint32_t dummyread; - *(__IO uint32_t *) CR_DBP_BB = (uint32_t)ENABLE; - dummyread = PWR->CR; - UNUSED(dummyread); -} - -/** - * @brief Disables access to the backup domain (RTC registers, RTC - * backup data registers and backup SRAM). - * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the - * Backup Domain Access should be kept enabled. - * @note The following sequence is required to bypass the delay between - * DBP bit programming and the effective disabling of the backup domain. - * Please check the Errata Sheet for more details under "Possible delay - * in backup domain protection disabling/enabling after programming the - * DBP bit" section. - * @retval None - */ -void HAL_PWR_DisableBkUpAccess(void) -{ - __IO uint32_t dummyread; - *(__IO uint32_t *) CR_DBP_BB = (uint32_t)DISABLE; - dummyread = PWR->CR; - UNUSED(dummyread); -} - -/** - * @} - */ - -/** @defgroup PWR_Exported_Functions_Group2 Peripheral Control functions - * @brief Low Power modes configuration functions - * -@verbatim - - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - - *** PVD configuration *** - ========================= - [..] - (+) The PVD is used to monitor the VDD power supply by comparing it to a - threshold selected by the PVD Level (PLS[2:0] bits in the PWR_CR). - (+) A PVDO flag is available to indicate if VDD/VDDA is higher or lower - than the PVD threshold. This event is internally connected to the EXTI - line16 and can generate an interrupt if enabled. This is done through - __HAL_PWR_PVD_EXTI_ENABLE_IT() macro. - (+) The PVD is stopped in Standby mode. - - *** Wake-up pin configuration *** - ================================ - [..] - (+) Wake-up pin is used to wake up the system from Standby mode. This pin is - forced in input pull-down configuration and is active on rising edges. - (+) There is one Wake-up pin: Wake-up Pin 1 on PA.00. - (++) For STM32F446xx there are two Wake-Up pins: Pin1 on PA.00 and Pin2 on PC.13 - (++) For STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx there are three Wake-Up pins: Pin1 on PA.00, Pin2 on PC.00 and Pin3 on PC.01 - - *** Low Power modes configuration *** - ===================================== - [..] - The devices feature 3 low-power modes: - (+) Sleep mode: Cortex-M4 core stopped, peripherals kept running. - (+) Stop mode: all clocks are stopped, regulator running, regulator - in low power mode - (+) Standby mode: 1.2V domain powered off. - - *** Sleep mode *** - ================== - [..] - (+) Entry: - The Sleep mode is entered by using the HAL_PWR_EnterSLEEPMode(Regulator, SLEEPEntry) - functions with - (++) PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction - (++) PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction - (++) PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR: Enter SLEEP mode with WFE instruction and - no clear of pending event before. - - -@@- The Regulator parameter is not used for the STM32F4 family - and is kept as parameter just to maintain compatibility with the - lower power families (STM32L). - (+) Exit: - Any peripheral interrupt acknowledged by the nested vectored interrupt - controller (NVIC) can wake up the device from Sleep mode. - - *** Stop mode *** - ================= - [..] - In Stop mode, all clocks in the 1.2V domain are stopped, the PLL, the HSI, - and the HSE RC oscillators are disabled. Internal SRAM and register contents - are preserved. - The voltage regulator can be configured either in normal or low-power mode. - To minimize the consumption In Stop mode, FLASH can be powered off before - entering the Stop mode using the HAL_PWREx_EnableFlashPowerDown() function. - It can be switched on again by software after exiting the Stop mode using - the HAL_PWREx_DisableFlashPowerDown() function. - - (+) Entry: - The Stop mode is entered using the HAL_PWR_EnterSTOPMode(Regulator, STOPEntry) - function with: - (++) Regulator: - (+++) Main regulator ON. - (+++) Low Power regulator ON. - (++) STOPEntry: - (+++) PWR_STOPENTRY_WFI : Enter STOP mode with WFI instruction. - (+++) PWR_STOPENTRY_WFE : Enter STOP mode with WFE instruction and - clear of pending events before. - (+++) PWR_STOPENTRY_WFE_NO_EVT_CLEAR : Enter STOP mode with WFE instruction and - no clear of pending event before. - (+) Exit: - Any EXTI Line (Internal or External) configured in Interrupt/Event mode. - - *** Standby mode *** - ==================== - [..] - (+) - The Standby mode allows to achieve the lowest power consumption. It is based - on the Cortex-M4 deep sleep mode, with the voltage regulator disabled. - The 1.2V domain is consequently powered off. The PLL, the HSI oscillator and - the HSE oscillator are also switched off. SRAM and register contents are lost - except for the RTC registers, RTC backup registers, backup SRAM and Standby - circuitry. - - The voltage regulator is OFF. - - (++) Entry: - (+++) The Standby mode is entered using the HAL_PWR_EnterSTANDBYMode() function. - (++) Exit: - (+++) WKUP pin rising edge, RTC alarm (Alarm A and Alarm B), RTC wake-up, - tamper event, time-stamp event, external reset in NRST pin, IWDG reset. - - *** Auto-wake-up (AWU) from low-power mode *** - ============================================= - [..] - - (+) The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC - Wake-up event, a tamper event or a time-stamp event, without depending on - an external interrupt (Auto-wake-up mode). - - (+) RTC auto-wake-up (AWU) from the Stop and Standby modes - - (++) To wake up from the Stop mode with an RTC alarm event, it is necessary to - configure the RTC to generate the RTC alarm using the HAL_RTC_SetAlarm_IT() function. - - (++) To wake up from the Stop mode with an RTC Tamper or time stamp event, it - is necessary to configure the RTC to detect the tamper or time stamp event using the - HAL_RTCEx_SetTimeStamp_IT() or HAL_RTCEx_SetTamper_IT() functions. - - (++) To wake up from the Stop mode with an RTC Wake-up event, it is necessary to - configure the RTC to generate the RTC Wake-up event using the HAL_RTCEx_SetWakeUpTimer_IT() function. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). - * @param sConfigPVD pointer to an PWR_PVDTypeDef structure that contains the configuration - * information for the PVD. - * @note Refer to the electrical characteristics of your device datasheet for - * more details about the voltage threshold corresponding to each - * detection level. - * @retval None - */ -void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD) -{ - /* Check the parameters */ - assert_param(IS_PWR_PVD_LEVEL(sConfigPVD->PVDLevel)); - assert_param(IS_PWR_PVD_MODE(sConfigPVD->Mode)); - - /* Set PLS[7:5] bits according to PVDLevel value */ - MODIFY_REG(PWR->CR, PWR_CR_PLS, sConfigPVD->PVDLevel); - - /* Clear any previous config. Keep it clear if no event or IT mode is selected */ - __HAL_PWR_PVD_EXTI_DISABLE_EVENT(); - __HAL_PWR_PVD_EXTI_DISABLE_IT(); - __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE(); - __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); - - /* Configure interrupt mode */ - if((sConfigPVD->Mode & PVD_MODE_IT) == PVD_MODE_IT) - { - __HAL_PWR_PVD_EXTI_ENABLE_IT(); - } - - /* Configure event mode */ - if((sConfigPVD->Mode & PVD_MODE_EVT) == PVD_MODE_EVT) - { - __HAL_PWR_PVD_EXTI_ENABLE_EVENT(); - } - - /* Configure the edge */ - if((sConfigPVD->Mode & PVD_RISING_EDGE) == PVD_RISING_EDGE) - { - __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE(); - } - - if((sConfigPVD->Mode & PVD_FALLING_EDGE) == PVD_FALLING_EDGE) - { - __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE(); - } -} - -/** - * @brief Enables the Power Voltage Detector(PVD). - * @retval None - */ -void HAL_PWR_EnablePVD(void) -{ - *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Power Voltage Detector(PVD). - * @retval None - */ -void HAL_PWR_DisablePVD(void) -{ - *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)DISABLE; -} - -/** - * @brief Enables the Wake-up PINx functionality. - * @param WakeUpPinx Specifies the Power Wake-Up pin to enable. - * This parameter can be one of the following values: - * @arg PWR_WAKEUP_PIN1 - * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @retval None - */ -void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx) -{ - /* Check the parameter */ - assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); - - /* Enable the wake up pin */ - SET_BIT(PWR->CSR, WakeUpPinx); -} - -/** - * @brief Disables the Wake-up PINx functionality. - * @param WakeUpPinx Specifies the Power Wake-Up pin to disable. - * This parameter can be one of the following values: - * @arg PWR_WAKEUP_PIN1 - * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @retval None - */ -void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx) -{ - /* Check the parameter */ - assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); - - /* Disable the wake up pin */ - CLEAR_BIT(PWR->CSR, WakeUpPinx); -} - -/** - * @brief Enters Sleep mode. - * - * @note In Sleep mode, all I/O pins keep the same state as in Run mode. - * - * @note In Sleep mode, the systick is stopped to avoid exit from this mode with - * systick interrupt when used as time base for Timeout - * - * @param Regulator Specifies the regulator state in SLEEP mode. - * This parameter can be one of the following values: - * @arg PWR_MAINREGULATOR_ON: SLEEP mode with regulator ON - * @arg PWR_LOWPOWERREGULATOR_ON: SLEEP mode with low power regulator ON - * @note This parameter is not used for the STM32F4 family and is kept as parameter - * just to maintain compatibility with the lower power families. - * @param SLEEPEntry Specifies if SLEEP mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_SLEEPENTRY_WFI : Enter SLEEP mode with WFI instruction - * @arg PWR_SLEEPENTRY_WFE : Enter SLEEP mode with WFE instruction and - * clear of pending events before. - * @arg PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR : Enter SLEEP mode with WFE instruction and - * no clear of pending event before. - * @retval None - */ -void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(Regulator); - - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR(Regulator)); - assert_param(IS_PWR_SLEEP_ENTRY(SLEEPEntry)); - - /* Clear SLEEPDEEP bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); - - /* Select SLEEP mode entry -------------------------------------------------*/ - if(SLEEPEntry == PWR_SLEEPENTRY_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - if(SLEEPEntry != PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR) - { - /* Clear all pending event */ - __SEV(); - __WFE(); - } - - /* Request Wait For Event */ - __WFE(); - } -} - -/** - * @brief Enters Stop mode. - * @note In Stop mode, all I/O pins keep the same state as in Run mode. - * @note When exiting Stop mode by issuing an interrupt or a wake-up event, - * the HSI RC oscillator is selected as system clock. - * @note When the voltage regulator operates in low power mode, an additional - * startup delay is incurred when waking up from Stop mode. - * By keeping the internal regulator ON during Stop mode, the consumption - * is higher although the startup time is reduced. - * @param Regulator Specifies the regulator state in Stop mode. - * This parameter can be one of the following values: - * @arg PWR_MAINREGULATOR_ON: Stop mode with regulator ON - * @arg PWR_LOWPOWERREGULATOR_ON: Stop mode with low power regulator ON - * @param STOPEntry Specifies if Stop mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_STOPENTRY_WFI : Enter Stop mode with WFI instruction - * @arg PWR_STOPENTRY_WFE : Enter Stop mode with WFE instruction and - * clear of pending events before. - * @arg PWR_STOPENTRY_WFE_NO_EVT_CLEAR : Enter STOP mode with WFE instruction and - * no clear of pending event before. - * @retval None - */ -void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry) -{ - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR(Regulator)); - assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); - - /* Select the regulator state in Stop mode: Set PDDS and LPDS bits according to PWR_Regulator value */ - MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS), Regulator); - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); - - /* Select Stop mode entry --------------------------------------------------*/ - if(STOPEntry == PWR_STOPENTRY_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - if(STOPEntry != PWR_STOPENTRY_WFE_NO_EVT_CLEAR) - { - /* Clear all pending event */ - __SEV(); - __WFE(); - } - /* Request Wait For Event */ - __WFE(); - } - /* Reset SLEEPDEEP bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); -} - -/** - * @brief Enters Standby mode. - * @note In Standby mode, all I/O pins are high impedance except for: - * - Reset pad (still available) - * - RTC_AF1 pin (PC13) if configured for tamper, time-stamp, RTC - * Alarm out, or RTC clock calibration out. - * - RTC_AF2 pin (PI8) if configured for tamper or time-stamp. - * - WKUP pin 1 (PA0) if enabled. - * @retval None - */ -void HAL_PWR_EnterSTANDBYMode(void) -{ - /* Select Standby mode */ - SET_BIT(PWR->CR, PWR_CR_PDDS); - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); - - /* This option is used to ensure that store operations are completed */ -#if defined ( __CC_ARM) - __force_stores(); -#endif - /* Request Wait For Interrupt */ - __WFI(); -} - -/** - * @brief This function handles the PWR PVD interrupt request. - * @note This API should be called under the PVD_IRQHandler(). - * @retval None - */ -void HAL_PWR_PVD_IRQHandler(void) -{ - /* Check PWR Exti flag */ - if(__HAL_PWR_PVD_EXTI_GET_FLAG() != RESET) - { - /* PWR PVD interrupt user callback */ - HAL_PWR_PVDCallback(); - - /* Clear PWR Exti pending bit */ - __HAL_PWR_PVD_EXTI_CLEAR_FLAG(); - } -} - -/** - * @brief PWR PVD interrupt callback - * @retval None - */ -__weak void HAL_PWR_PVDCallback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PWR_PVDCallback could be implemented in the user file - */ -} - -/** - * @brief Indicates Sleep-On-Exit when returning from Handler mode to Thread mode. - * @note Set SLEEPONEXIT bit of SCR register. When this bit is set, the processor - * re-enters SLEEP mode when an interruption handling is over. - * Setting this bit is useful when the processor is expected to run only on - * interruptions handling. - * @retval None - */ -void HAL_PWR_EnableSleepOnExit(void) -{ - /* Set SLEEPONEXIT bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); -} - -/** - * @brief Disables Sleep-On-Exit feature when returning from Handler mode to Thread mode. - * @note Clears SLEEPONEXIT bit of SCR register. When this bit is set, the processor - * re-enters SLEEP mode when an interruption handling is over. - * @retval None - */ -void HAL_PWR_DisableSleepOnExit(void) -{ - /* Clear SLEEPONEXIT bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); -} - -/** - * @brief Enables CORTEX M4 SEVONPEND bit. - * @note Sets SEVONPEND bit of SCR register. When this bit is set, this causes - * WFE to wake up when an interrupt moves from inactive to pended. - * @retval None - */ -void HAL_PWR_EnableSEVOnPend(void) -{ - /* Set SEVONPEND bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); -} - -/** - * @brief Disables CORTEX M4 SEVONPEND bit. - * @note Clears SEVONPEND bit of SCR register. When this bit is set, this causes - * WFE to wake up when an interrupt moves from inactive to pended. - * @retval None - */ -void HAL_PWR_DisableSEVOnPend(void) -{ - /* Clear SEVONPEND bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_PWR_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c deleted file mode 100644 index 77f9c35..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c +++ /dev/null @@ -1,600 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr_ex.c - * @author MCD Application Team - * @brief Extended PWR HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of PWR extension peripheral: - * + Peripheral Extended features functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup PWREx PWREx - * @brief PWR HAL module driver - * @{ - */ - -#ifdef HAL_PWR_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup PWREx_Private_Constants - * @{ - */ -#define PWR_OVERDRIVE_TIMEOUT_VALUE 1000U -#define PWR_UDERDRIVE_TIMEOUT_VALUE 1000U -#define PWR_BKPREG_TIMEOUT_VALUE 1000U -#define PWR_VOSRDY_TIMEOUT_VALUE 1000U -/** - * @} - */ - - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @defgroup PWREx_Exported_Functions PWREx Exported Functions - * @{ - */ - -/** @defgroup PWREx_Exported_Functions_Group1 Peripheral Extended features functions - * @brief Peripheral Extended features functions - * -@verbatim - - =============================================================================== - ##### Peripheral extended features functions ##### - =============================================================================== - - *** Main and Backup Regulators configuration *** - ================================================ - [..] - (+) The backup domain includes 4 Kbytes of backup SRAM accessible only from - the CPU, and address in 32-bit, 16-bit or 8-bit mode. Its content is - retained even in Standby or VBAT mode when the low power backup regulator - is enabled. It can be considered as an internal EEPROM when VBAT is - always present. You can use the HAL_PWREx_EnableBkUpReg() function to - enable the low power backup regulator. - - (+) When the backup domain is supplied by VDD (analog switch connected to VDD) - the backup SRAM is powered from VDD which replaces the VBAT power supply to - save battery life. - - (+) The backup SRAM is not mass erased by a tamper event. It is read - protected to prevent confidential data, such as cryptographic private - key, from being accessed. The backup SRAM can be erased only through - the Flash interface when a protection level change from level 1 to - level 0 is requested. - -@- Refer to the description of Read protection (RDP) in the Flash - programming manual. - - (+) The main internal regulator can be configured to have a tradeoff between - performance and power consumption when the device does not operate at - the maximum frequency. This is done through __HAL_PWR_MAINREGULATORMODE_CONFIG() - macro which configure VOS bit in PWR_CR register - - Refer to the product datasheets for more details. - - *** FLASH Power Down configuration **** - ======================================= - [..] - (+) By setting the FPDS bit in the PWR_CR register by using the - HAL_PWREx_EnableFlashPowerDown() function, the Flash memory also enters power - down mode when the device enters Stop mode. When the Flash memory - is in power down mode, an additional startup delay is incurred when - waking up from Stop mode. - - (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, the scale can be modified only when the PLL - is OFF and the HSI or HSE clock source is selected as system clock. - The new value programmed is active only when the PLL is ON. - When the PLL is OFF, the voltage scale 3 is automatically selected. - Refer to the datasheets for more details. - - *** Over-Drive and Under-Drive configuration **** - ================================================= - [..] - (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Run mode: the main regulator has - 2 operating modes available: - (++) Normal mode: The CPU and core logic operate at maximum frequency at a given - voltage scaling (scale 1, scale 2 or scale 3) - (++) Over-drive mode: This mode allows the CPU and the core logic to operate at a - higher frequency than the normal mode for a given voltage scaling (scale 1, - scale 2 or scale 3). This mode is enabled through HAL_PWREx_EnableOverDrive() function and - disabled by HAL_PWREx_DisableOverDrive() function, to enter or exit from Over-drive mode please follow - the sequence described in Reference manual. - - (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Stop mode: the main regulator or low power regulator - supplies a low power voltage to the 1.2V domain, thus preserving the content of registers - and internal SRAM. 2 operating modes are available: - (++) Normal mode: the 1.2V domain is preserved in nominal leakage mode. This mode is only - available when the main regulator or the low power regulator is used in Scale 3 or - low voltage mode. - (++) Under-drive mode: the 1.2V domain is preserved in reduced leakage mode. This mode is only - available when the main regulator or the low power regulator is in low voltage mode. - -@endverbatim - * @{ - */ - -/** - * @brief Enables the Backup Regulator. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void) -{ - uint32_t tickstart = 0U; - - *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)ENABLE; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till Backup regulator ready flag is set */ - while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) == RESET) - { - if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Disables the Backup Regulator. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void) -{ - uint32_t tickstart = 0U; - - *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)DISABLE; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till Backup regulator ready flag is set */ - while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) != RESET) - { - if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Enables the Flash Power Down in Stop mode. - * @retval None - */ -void HAL_PWREx_EnableFlashPowerDown(void) -{ - *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Flash Power Down in Stop mode. - * @retval None - */ -void HAL_PWREx_DisableFlashPowerDown(void) -{ - *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)DISABLE; -} - -/** - * @brief Return Voltage Scaling Range. - * @retval The configured scale for the regulator voltage(VOS bit field). - * The returned value can be one of the following: - * - @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode - * - @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode - * - @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode - */ -uint32_t HAL_PWREx_GetVoltageRange(void) -{ - return (PWR->CR & PWR_CR_VOS); -} - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -/** - * @brief Configures the main internal regulator output voltage. - * @param VoltageScaling specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption. - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, - * the maximum value of fHCLK = 168 MHz. - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, - * the maximum value of fHCLK = 144 MHz. - * @note When moving from Range 1 to Range 2, the system frequency must be decreased to - * a value below 144 MHz before calling HAL_PWREx_ConfigVoltageScaling() API. - * When moving from Range 2 to Range 1, the system frequency can be increased to - * a value up to 168 MHz after calling HAL_PWREx_ConfigVoltageScaling() API. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) -{ - uint32_t tickstart = 0U; - - assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); - - /* Enable PWR RCC Clock Peripheral */ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Set Range */ - __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) - { - if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || \ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || \ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || \ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Configures the main internal regulator output voltage. - * @param VoltageScaling specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption. - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, - * the maximum value of fHCLK is 168 MHz. It can be extended to - * 180 MHz by activating the over-drive mode. - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, - * the maximum value of fHCLK is 144 MHz. It can be extended to, - * 168 MHz by activating the over-drive mode. - * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output range 3 mode, - * the maximum value of fHCLK is 120 MHz. - * @note To update the system clock frequency(SYSCLK): - * - Set the HSI or HSE as system clock frequency using the HAL_RCC_ClockConfig(). - * - Call the HAL_RCC_OscConfig() to configure the PLL. - * - Call HAL_PWREx_ConfigVoltageScaling() API to adjust the voltage scale. - * - Set the new system clock frequency using the HAL_RCC_ClockConfig(). - * @note The scale can be modified only when the HSI or HSE clock source is selected - * as system clock source, otherwise the API returns HAL_ERROR. - * @note When the PLL is OFF, the voltage scale 3 is automatically selected and the VOS bits - * value in the PWR_CR1 register are not taken in account. - * @note This API forces the PLL state ON to allow the possibility to configure the voltage scale 1 or 2. - * @note The new voltage scale is active only when the PLL is ON. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) -{ - uint32_t tickstart = 0U; - - assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); - - /* Enable PWR RCC Clock Peripheral */ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - { - /* Disable the main PLL */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - /* Wait till PLL is disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Set Range */ - __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); - - /* Enable the main PLL */ - __HAL_RCC_PLL_ENABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) - { - if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Enables Main Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xx devices. - * @retval None - */ -void HAL_PWREx_EnableMainRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables Main Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xxdevices. - * @retval None - */ -void HAL_PWREx_DisableMainRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)DISABLE; -} - -/** - * @brief Enables Low Power Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xx devices. - * @retval None - */ -void HAL_PWREx_EnableLowRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables Low Power Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xx devices. - * @retval None - */ -void HAL_PWREx_DisableLowRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)DISABLE; -} - -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F412Zx || STM32F412Rx || STM32F412Vx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Activates the Over-Drive mode. - * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. - * This mode allows the CPU and the core logic to operate at a higher frequency - * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). - * @note It is recommended to enter or exit Over-drive mode when the application is not running - * critical tasks and when the system clock source is either HSI or HSE. - * During the Over-drive switch activation, no peripheral clocks should be enabled. - * The peripheral clocks must be enabled once the Over-drive mode is activated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void) -{ - uint32_t tickstart = 0U; - - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable the Over-drive to extend the clock frequency to 180 Mhz */ - __HAL_PWR_OVERDRIVE_ENABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Enable the Over-drive switch */ - __HAL_PWR_OVERDRIVESWITCHING_ENABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) - { - if((HAL_GetTick() - tickstart ) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Deactivates the Over-Drive mode. - * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. - * This mode allows the CPU and the core logic to operate at a higher frequency - * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). - * @note It is recommended to enter or exit Over-drive mode when the application is not running - * critical tasks and when the system clock source is either HSI or HSE. - * During the Over-drive switch activation, no peripheral clocks should be enabled. - * The peripheral clocks must be enabled once the Over-drive mode is activated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void) -{ - uint32_t tickstart = 0U; - - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Disable the Over-drive switch */ - __HAL_PWR_OVERDRIVESWITCHING_DISABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Disable the Over-drive */ - __HAL_PWR_OVERDRIVE_DISABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Enters in Under-Drive STOP mode. - * - * @note This mode is only available for STM32F42xxx/STM32F43xxx/STM32F446xx/STM32F469xx/STM32F479xx devices. - * - * @note This mode can be selected only when the Under-Drive is already active - * - * @note This mode is enabled only with STOP low power mode. - * In this mode, the 1.2V domain is preserved in reduced leakage mode. This - * mode is only available when the main regulator or the low power regulator - * is in low voltage mode - * - * @note If the Under-drive mode was enabled, it is automatically disabled after - * exiting Stop mode. - * When the voltage regulator operates in Under-drive mode, an additional - * startup delay is induced when waking up from Stop mode. - * - * @note In Stop mode, all I/O pins keep the same state as in Run mode. - * - * @note When exiting Stop mode by issuing an interrupt or a wake-up event, - * the HSI RC oscillator is selected as system clock. - * - * @note When the voltage regulator operates in low power mode, an additional - * startup delay is incurred when waking up from Stop mode. - * By keeping the internal regulator ON during Stop mode, the consumption - * is higher although the startup time is reduced. - * - * @param Regulator specifies the regulator state in STOP mode. - * This parameter can be one of the following values: - * @arg PWR_MAINREGULATOR_UNDERDRIVE_ON: Main Regulator in under-drive mode - * and Flash memory in power-down when the device is in Stop under-drive mode - * @arg PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON: Low Power Regulator in under-drive mode - * and Flash memory in power-down when the device is in Stop under-drive mode - * @param STOPEntry specifies if STOP mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_SLEEPENTRY_WFI: enter STOP mode with WFI instruction - * @arg PWR_SLEEPENTRY_WFE: enter STOP mode with WFE instruction - * @retval None - */ -HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry) -{ - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR_UNDERDRIVE(Regulator)); - assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); - - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Enable the Under-drive Mode ---------------------------------------------*/ - /* Clear Under-drive flag */ - __HAL_PWR_CLEAR_ODRUDR_FLAG(); - - /* Enable the Under-drive */ - __HAL_PWR_UNDERDRIVE_ENABLE(); - - /* Select the regulator state in STOP mode ---------------------------------*/ - tmpreg1 = PWR->CR; - /* Clear PDDS, LPDS, MRLUDS and LPLUDS bits */ - tmpreg1 &= (uint32_t)~(PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_LPUDS | PWR_CR_MRUDS); - - /* Set LPDS, MRLUDS and LPLUDS bits according to PWR_Regulator value */ - tmpreg1 |= Regulator; - - /* Store the new value */ - PWR->CR = tmpreg1; - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - - /* Select STOP mode entry --------------------------------------------------*/ - if(STOPEntry == PWR_SLEEPENTRY_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - /* Request Wait For Event */ - __WFE(); - } - /* Reset SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); - - return HAL_OK; -} - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_PWR_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c deleted file mode 100644 index c18fa09..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c +++ /dev/null @@ -1,1124 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc.c - * @author MCD Application Team - * @brief RCC HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Reset and Clock Control (RCC) peripheral: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * - @verbatim - ============================================================================== - ##### RCC specific features ##### - ============================================================================== - [..] - After reset the device is running from Internal High Speed oscillator - (HSI 16MHz) with Flash 0 wait state, Flash prefetch buffer, D-Cache - and I-Cache are disabled, and all peripherals are off except internal - SRAM, Flash and JTAG. - (+) There is no prescaler on High speed (AHB) and Low speed (APB) busses; - all peripherals mapped on these busses are running at HSI speed. - (+) The clock for all peripherals is switched off, except the SRAM and FLASH. - (+) All GPIOs are in input floating state, except the JTAG pins which - are assigned to be used for debug purpose. - - [..] - Once the device started from reset, the user application has to: - (+) Configure the clock source to be used to drive the System clock - (if the application needs higher frequency/performance) - (+) Configure the System clock frequency and Flash settings - (+) Configure the AHB and APB busses prescalers - (+) Enable the clock for the peripheral(s) to be used - (+) Configure the clock source(s) for peripherals which clocks are not - derived from the System clock (I2S, RTC, ADC, USB OTG FS/SDIO/RNG) - - ##### RCC Limitations ##### - ============================================================================== - [..] - A delay between an RCC peripheral clock enable and the effective peripheral - enabling should be taken into account in order to manage the peripheral read/write - from/to registers. - (+) This delay depends on the peripheral mapping. - (+) If peripheral is mapped on AHB: the delay is 2 AHB clock cycle - after the clock enable bit is set on the hardware register - (+) If peripheral is mapped on APB: the delay is 2 APB clock cycle - after the clock enable bit is set on the hardware register - - [..] - Implemented Workaround: - (+) For AHB & APB peripherals, a dummy read to the peripheral register has been - inserted in each __HAL_RCC_PPP_CLK_ENABLE() macro. - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup RCC RCC - * @brief RCC HAL module driver - * @{ - */ - -#ifdef HAL_RCC_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup RCC_Private_Constants - * @{ - */ - -/* Private macro -------------------------------------------------------------*/ -#define __MCO1_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() -#define MCO1_GPIO_PORT GPIOA -#define MCO1_PIN GPIO_PIN_8 - -#define __MCO2_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() -#define MCO2_GPIO_PORT GPIOC -#define MCO2_PIN GPIO_PIN_9 -/** - * @} - */ - -/* Private variables ---------------------------------------------------------*/ -/** @defgroup RCC_Private_Variables RCC Private Variables - * @{ - */ -/** - * @} - */ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup RCC_Exported_Functions RCC Exported Functions - * @{ - */ - -/** @defgroup RCC_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to configure the internal/external oscillators - (HSE, HSI, LSE, LSI, PLL, CSS and MCO) and the System busses clocks (SYSCLK, AHB, APB1 - and APB2). - - [..] Internal/external clock and PLL configuration - (#) HSI (high-speed internal), 16 MHz factory-trimmed RC used directly or through - the PLL as System clock source. - - (#) LSI (low-speed internal), 32 KHz low consumption RC used as IWDG and/or RTC - clock source. - - (#) HSE (high-speed external), 4 to 26 MHz crystal oscillator used directly or - through the PLL as System clock source. Can be used also as RTC clock source. - - (#) LSE (low-speed external), 32 KHz oscillator used as RTC clock source. - - (#) PLL (clocked by HSI or HSE), featuring two different output clocks: - (++) The first output is used to generate the high speed system clock (up to 168 MHz) - (++) The second output is used to generate the clock for the USB OTG FS (48 MHz), - the random analog generator (<=48 MHz) and the SDIO (<= 48 MHz). - - (#) CSS (Clock security system), once enable using the macro __HAL_RCC_CSS_ENABLE() - and if a HSE clock failure occurs(HSE used directly or through PLL as System - clock source), the System clocks automatically switched to HSI and an interrupt - is generated if enabled. The interrupt is linked to the Cortex-M4 NMI - (Non-Maskable Interrupt) exception vector. - - (#) MCO1 (microcontroller clock output), used to output HSI, LSE, HSE or PLL - clock (through a configurable prescaler) on PA8 pin. - - (#) MCO2 (microcontroller clock output), used to output HSE, PLL, SYSCLK or PLLI2S - clock (through a configurable prescaler) on PC9 pin. - - [..] System, AHB and APB busses clocks configuration - (#) Several clock sources can be used to drive the System clock (SYSCLK): HSI, - HSE and PLL. - The AHB clock (HCLK) is derived from System clock through configurable - prescaler and used to clock the CPU, memory and peripherals mapped - on AHB bus (DMA, GPIO...). APB1 (PCLK1) and APB2 (PCLK2) clocks are derived - from AHB clock through configurable prescalers and used to clock - the peripherals mapped on these busses. You can use - "HAL_RCC_GetSysClockFreq()" function to retrieve the frequencies of these clocks. - - (#) For the STM32F405xx/07xx and STM32F415xx/17xx devices, the maximum - frequency of the SYSCLK and HCLK is 168 MHz, PCLK2 84 MHz and PCLK1 42 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - - (#) For the STM32F42xxx, STM32F43xxx, STM32F446xx, STM32F469xx and STM32F479xx devices, - the maximum frequency of the SYSCLK and HCLK is 180 MHz, PCLK2 90 MHz and PCLK1 45 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - - (#) For the STM32F401xx, the maximum frequency of the SYSCLK and HCLK is 84 MHz, - PCLK2 84 MHz and PCLK1 42 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - - (#) For the STM32F41xxx, the maximum frequency of the SYSCLK and HCLK is 100 MHz, - PCLK2 100 MHz and PCLK1 50 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - -@endverbatim - * @{ - */ - -/** - * @brief Resets the RCC clock configuration to the default reset state. - * @note The default reset state of the clock configuration is given below: - * - HSI ON and used as system clock source - * - HSE and PLL OFF - * - AHB, APB1 and APB2 prescaler set to 1. - * - CSS, MCO1 and MCO2 OFF - * - All interrupts disabled - * @note This function doesn't modify the configuration of the - * - Peripheral clocks - * - LSI, LSE and RTC clocks - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_RCC_DeInit(void) -{ - return HAL_OK; -} - -/** - * @brief Initializes the RCC Oscillators according to the specified parameters in the - * RCC_OscInitTypeDef. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that - * contains the configuration information for the RCC Oscillators. - * @note The PLL is not disabled when used as system clock. - * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not - * supported by this API. User should request a transition to LSE Off - * first and then LSE On or LSE Bypass. - * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not - * supported by this API. User should request a transition to HSE Off - * first and then HSE On or HSE Bypass. - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_RCC_OscConfig(const RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - uint32_t tickstart; - uint32_t pll_config; - /* Check Null pointer */ - if (RCC_OscInitStruct == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); - /*------------------------------- HSE Configuration ------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) - { - /* Check the parameters */ - assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); - /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) - { - if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) - { - return HAL_ERROR; - } - } - else - { - /* Set the new HSE configuration ---------------------------------------*/ - __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); - - /* Check the HSE State */ - if ((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) - { - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till HSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till HSE is bypassed or disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*----------------------------- HSI Configuration --------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) - { - /* Check the parameters */ - assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); - assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); - - /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) - { - /* When HSI is used as system clock it will not disabled */ - if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) - { - return HAL_ERROR; - } - /* Otherwise, just the calibration is allowed */ - else - { - /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - } - else - { - /* Check the HSI State */ - if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) - { - /* Enable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Adjusts the Internal High Speed oscillator (HSI) calibration value. */ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - else - { - /* Disable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*------------------------------ LSI Configuration -------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) - { - /* Check the parameters */ - assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); - - /* Check the LSI State */ - if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) - { - /* Enable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - /*------------------------------ LSE Configuration -------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) - { - FlagStatus pwrclkchanged = RESET; - - /* Check the parameters */ - assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); - - /* Update LSE configuration in Backup Domain control register */ - /* Requires to enable write access to Backup Domain of necessary */ - if (__HAL_RCC_PWR_IS_CLK_DISABLED()) - { - __HAL_RCC_PWR_CLK_ENABLE(); - pwrclkchanged = SET; - } - - if (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - /* Enable write access to Backup domain */ - SET_BIT(PWR->CR, PWR_CR_DBP); - - /* Wait for Backup domain Write protection disable */ - tickstart = HAL_GetTick(); - - while (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Set the new LSE configuration -----------------------------------------*/ - __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); - /* Check the LSE State */ - if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Restore clock configuration if changed */ - if (pwrclkchanged == SET) - { - __HAL_RCC_PWR_CLK_DISABLE(); - } - } - /*-------------------------------- PLL Configuration -----------------------*/ - /* Check the parameters */ - assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); - if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) - { - /* Check if the PLL is used as system clock or not */ - if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - { - if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) - { - /* Check the parameters */ - assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); - assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); - assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); - assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); - assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); - - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till PLL is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Configure the main PLL clock source, multiplication and division factors. */ - WRITE_REG(RCC->PLLCFGR, (RCC_OscInitStruct->PLL.PLLSource | \ - RCC_OscInitStruct->PLL.PLLM | \ - (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos) | \ - (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos) | \ - (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))); - /* Enable the main PLL. */ - __HAL_RCC_PLL_ENABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till PLL is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - else - { - /* Check if there is a request to disable the PLL used as System clock source */ - if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) - { - return HAL_ERROR; - } - else - { - /* Do not return HAL_ERROR if request repeats the current configuration */ - pll_config = RCC->PLLCFGR; -#if defined (RCC_PLLCFGR_PLLR) - if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) -#else - if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) -#endif /* RCC_PLLCFGR_PLLR */ - { - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief Initializes the CPU, AHB and APB busses clocks according to the specified - * parameters in the RCC_ClkInitStruct. - * @param RCC_ClkInitStruct pointer to an RCC_OscInitTypeDef structure that - * contains the configuration information for the RCC peripheral. - * @param FLatency FLASH Latency, this parameter depend on device selected - * - * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency - * and updated by HAL_RCC_GetHCLKFreq() function called within this function - * - * @note The HSI is used (enabled by hardware) as system clock source after - * startup from Reset, wake-up from STOP and STANDBY mode, or in case - * of failure of the HSE used directly or indirectly as system clock - * (if the Clock Security System CSS is enabled). - * - * @note A switch from one clock source to another occurs only if the target - * clock source is ready (clock stable after startup delay or PLL locked). - * If a clock source which is not yet ready is selected, the switch will - * occur when the clock source will be ready. - * - * @note Depending on the device voltage range, the software has to set correctly - * HPRE[3:0] bits to ensure that HCLK not exceed the maximum allowed frequency - * (for more details refer to section above "Initialization/de-initialization functions") - * @retval None - */ -HAL_StatusTypeDef HAL_RCC_ClockConfig(const RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency) -{ - uint32_t tickstart; - - /* Check Null pointer */ - if (RCC_ClkInitStruct == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_RCC_CLOCKTYPE(RCC_ClkInitStruct->ClockType)); - assert_param(IS_FLASH_LATENCY(FLatency)); - - /* To correctly read data from FLASH memory, the number of wait states (LATENCY) - must be correctly programmed according to the frequency of the CPU clock - (HCLK) and the supply voltage of the device. */ - - /* Increasing the number of wait states because of higher CPU frequency */ - if (FLatency > __HAL_FLASH_GET_LATENCY()) - { - /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ - __HAL_FLASH_SET_LATENCY(FLatency); - - /* Check that the new number of wait states is taken into account to access the Flash - memory by reading the FLASH_ACR register */ - if (__HAL_FLASH_GET_LATENCY() != FLatency) - { - return HAL_ERROR; - } - } - - /*-------------------------- HCLK Configuration --------------------------*/ - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) - { - /* Set the highest APBx dividers in order to ensure that we do not go through - a non-spec phase whatever we decrease or increase HCLK. */ - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) - { - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); - } - - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) - { - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); - } - - assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider)); - MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); - } - - /*------------------------- SYSCLK Configuration ---------------------------*/ - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) - { - assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); - - /* HSE is selected as System Clock Source */ - if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) - { - /* Check the HSE ready flag */ - if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - { - return HAL_ERROR; - } - } - /* PLL is selected as System Clock Source */ - else if ((RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) || - (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLRCLK)) - { - /* Check the PLL ready flag */ - if (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - return HAL_ERROR; - } - } - /* HSI is selected as System Clock Source */ - else - { - /* Check the HSI ready flag */ - if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - { - return HAL_ERROR; - } - } - - __HAL_RCC_SYSCLK_CONFIG(RCC_ClkInitStruct->SYSCLKSource); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) - { - if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Decreasing the number of wait states because of lower CPU frequency */ - if (FLatency < __HAL_FLASH_GET_LATENCY()) - { - /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ - __HAL_FLASH_SET_LATENCY(FLatency); - - /* Check that the new number of wait states is taken into account to access the Flash - memory by reading the FLASH_ACR register */ - if (__HAL_FLASH_GET_LATENCY() != FLatency) - { - return HAL_ERROR; - } - } - - /*-------------------------- PCLK1 Configuration ---------------------------*/ - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) - { - assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); - } - - /*-------------------------- PCLK2 Configuration ---------------------------*/ - if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) - { - assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3U)); - } - - /* Update the SystemCoreClock global variable */ - SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]; - - /* Configure the source of time base considering new system clocks settings */ - HAL_InitTick(uwTickPrio); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup RCC_Exported_Functions_Group2 Peripheral Control functions - * @brief RCC clocks control functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the RCC Clocks - frequencies. - -@endverbatim - * @{ - */ - -/** - * @brief Selects the clock source to output on MCO1 pin(PA8) or on MCO2 pin(PC9). - * @note PA8/PC9 should be configured in alternate function mode. - * @param RCC_MCOx specifies the output direction for the clock source. - * This parameter can be one of the following values: - * @arg RCC_MCO1: Clock source to output on MCO1 pin(PA8). - * @arg RCC_MCO2: Clock source to output on MCO2 pin(PC9). - * @param RCC_MCOSource specifies the clock source to output. - * This parameter can be one of the following values: - * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source - * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx - * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices - * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source - * @param RCC_MCODiv specifies the MCOx prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCODIV_1: no division applied to MCOx clock - * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock - * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock - * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock - * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock - * @note For STM32F410Rx devices to output I2SCLK clock on MCO2 you should have - * at last one of the SPI clocks enabled (SPI1, SPI2 or SPI5). - * @retval None - */ -void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv) -{ - GPIO_InitTypeDef GPIO_InitStruct; - /* Check the parameters */ - assert_param(IS_RCC_MCO(RCC_MCOx)); - assert_param(IS_RCC_MCODIV(RCC_MCODiv)); - /* RCC_MCO1 */ - if (RCC_MCOx == RCC_MCO1) - { - assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); - - /* MCO1 Clock Enable */ - __MCO1_CLK_ENABLE(); - - /* Configure the MCO1 pin in alternate function mode */ - GPIO_InitStruct.Pin = MCO1_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Alternate = GPIO_AF0_MCO; - HAL_GPIO_Init(MCO1_GPIO_PORT, &GPIO_InitStruct); - - /* Mask MCO1 and MCO1PRE[2:0] bits then Select MCO1 clock source and prescaler */ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), (RCC_MCOSource | RCC_MCODiv)); - - /* This RCC MCO1 enable feature is available only on STM32F410xx devices */ -#if defined(RCC_CFGR_MCO1EN) - __HAL_RCC_MCO1_ENABLE(); -#endif /* RCC_CFGR_MCO1EN */ - } -#if defined(RCC_CFGR_MCO2) - else - { - assert_param(IS_RCC_MCO2SOURCE(RCC_MCOSource)); - - /* MCO2 Clock Enable */ - __MCO2_CLK_ENABLE(); - - /* Configure the MCO2 pin in alternate function mode */ - GPIO_InitStruct.Pin = MCO2_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Alternate = GPIO_AF0_MCO; - HAL_GPIO_Init(MCO2_GPIO_PORT, &GPIO_InitStruct); - - /* Mask MCO2 and MCO2PRE[2:0] bits then Select MCO2 clock source and prescaler */ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), (RCC_MCOSource | (RCC_MCODiv << 3U))); - - /* This RCC MCO2 enable feature is available only on STM32F410Rx devices */ -#if defined(RCC_CFGR_MCO2EN) - __HAL_RCC_MCO2_ENABLE(); -#endif /* RCC_CFGR_MCO2EN */ - } -#endif /* RCC_CFGR_MCO2 */ -} - -/** - * @brief Enables the Clock Security System. - * @note If a failure is detected on the HSE oscillator clock, this oscillator - * is automatically disabled and an interrupt is generated to inform the - * software about the failure (Clock Security System Interrupt, CSSI), - * allowing the MCU to perform rescue operations. The CSSI is linked to - * the Cortex-M4 NMI (Non-Maskable Interrupt) exception vector. - * @retval None - */ -void HAL_RCC_EnableCSS(void) -{ - *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Clock Security System. - * @retval None - */ -void HAL_RCC_DisableCSS(void) -{ - *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)DISABLE; -} - -/** - * @brief Returns the SYSCLK frequency - * - * @note The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * @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 HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 25 MHz), 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 not correct when using fractional - * value for HSE crystal. - * - * @note This function can be used by the user application to compute the - * baudrate for the communication peripherals or configure other parameters. - * - * @note Each time SYSCLK changes, this function must be called to update the - * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * - * @retval SYSCLK frequency - */ -__weak uint32_t HAL_RCC_GetSysClockFreq(void) -{ - uint32_t pllm = 0U; - uint32_t pllvco = 0U; - uint32_t pllp = 0U; - uint32_t sysclockfreq = 0U; - - /* Get SYSCLK source -------------------------------------------------------*/ - switch (RCC->CFGR & RCC_CFGR_SWS) - { - case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ - { - sysclockfreq = HSI_VALUE; - break; - } - case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ - { - sysclockfreq = HSE_VALUE; - break; - } - case RCC_CFGR_SWS_PLL: /* PLL used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLP */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) * 2U); - - sysclockfreq = pllvco / pllp; - break; - } - default: - { - sysclockfreq = HSI_VALUE; - break; - } - } - return sysclockfreq; -} - -/** - * @brief Returns the HCLK frequency - * @note Each time HCLK changes, this function must be called to update the - * right HCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency - * and updated within this function - * @retval HCLK frequency - */ -uint32_t HAL_RCC_GetHCLKFreq(void) -{ - return SystemCoreClock; -} - -/** - * @brief Returns the PCLK1 frequency - * @note Each time PCLK1 changes, this function must be called to update the - * right PCLK1 value. Otherwise, any configuration based on this function will be incorrect. - * @retval PCLK1 frequency - */ -uint32_t HAL_RCC_GetPCLK1Freq(void) -{ - /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos]); -} - -/** - * @brief Returns the PCLK2 frequency - * @note Each time PCLK2 changes, this function must be called to update the - * right PCLK2 value. Otherwise, any configuration based on this function will be incorrect. - * @retval PCLK2 frequency - */ -uint32_t HAL_RCC_GetPCLK2Freq(void) -{ - /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos]); -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that - * will be configured. - * @retval None - */ -__weak void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - /* Set all possible values for the Oscillator type parameter ---------------*/ - RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; - - /* Get the HSE configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) - { - RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; - } - else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) - { - RCC_OscInitStruct->HSEState = RCC_HSE_ON; - } - else - { - RCC_OscInitStruct->HSEState = RCC_HSE_OFF; - } - - /* Get the HSI configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) - { - RCC_OscInitStruct->HSIState = RCC_HSI_ON; - } - else - { - RCC_OscInitStruct->HSIState = RCC_HSI_OFF; - } - - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); - - /* Get the LSE configuration -----------------------------------------------*/ - if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) - { - RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; - } - else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) - { - RCC_OscInitStruct->LSEState = RCC_LSE_ON; - } - else - { - RCC_OscInitStruct->LSEState = RCC_LSE_OFF; - } - - /* Get the LSI configuration -----------------------------------------------*/ - if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) - { - RCC_OscInitStruct->LSIState = RCC_LSI_ON; - } - else - { - RCC_OscInitStruct->LSIState = RCC_LSI_OFF; - } - - /* Get the PLL configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; - } - else - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; - } - RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); - RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); - RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); - RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); - RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); -} - -/** - * @brief Configures the RCC_ClkInitStruct according to the internal - * RCC configuration registers. - * @param RCC_ClkInitStruct pointer to an RCC_ClkInitTypeDef structure that - * will be configured. - * @param pFLatency Pointer on the Flash Latency. - * @retval None - */ -void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency) -{ - /* Set all possible values for the Clock type parameter --------------------*/ - RCC_ClkInitStruct->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - - /* Get the SYSCLK configuration --------------------------------------------*/ - RCC_ClkInitStruct->SYSCLKSource = (uint32_t)(RCC->CFGR & RCC_CFGR_SW); - - /* Get the HCLK configuration ----------------------------------------------*/ - RCC_ClkInitStruct->AHBCLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_HPRE); - - /* Get the APB1 configuration ----------------------------------------------*/ - RCC_ClkInitStruct->APB1CLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_PPRE1); - - /* Get the APB2 configuration ----------------------------------------------*/ - RCC_ClkInitStruct->APB2CLKDivider = (uint32_t)((RCC->CFGR & RCC_CFGR_PPRE2) >> 3U); - - /* Get the Flash Wait State (Latency) configuration ------------------------*/ - *pFLatency = (uint32_t)(FLASH->ACR & FLASH_ACR_LATENCY); -} - -/** - * @brief This function handles the RCC CSS interrupt request. - * @note This API should be called under the NMI_Handler(). - * @retval None - */ -void HAL_RCC_NMI_IRQHandler(void) -{ - /* Check RCC CSSF flag */ - if (__HAL_RCC_GET_IT(RCC_IT_CSS)) - { - /* RCC Clock Security System interrupt user callback */ - HAL_RCC_CSSCallback(); - - /* Clear RCC CSS pending bit */ - __HAL_RCC_CLEAR_IT(RCC_IT_CSS); - } -} - -/** - * @brief RCC Clock Security System interrupt callback - * @retval None - */ -__weak void HAL_RCC_CSSCallback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_RCC_CSSCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_RCC_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c deleted file mode 100644 index 0431718..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c +++ /dev/null @@ -1,3833 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc_ex.c - * @author MCD Application Team - * @brief Extension RCC HAL module driver. - * This file provides firmware functions to manage the following - * functionalities RCC extension peripheral: - * + Extended Peripheral Control functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file in - * the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup RCCEx RCCEx - * @brief RCCEx HAL module driver - * @{ - */ - -#ifdef HAL_RCC_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup RCCEx_Private_Constants - * @{ - */ -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions - * @{ - */ - -/** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions - * @brief Extended Peripheral Control functions - * -@verbatim - =============================================================================== - ##### Extended Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the RCC Clocks - frequencies. - [..] - (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to - select the RTC clock source; in this case the Backup domain will be reset in - order to modify the RTC Clock source, as consequence RTC registers (including - the backup registers) and RCC_BDCR register are set to their reset values. - -@endverbatim - * @{ - */ - -#if defined(STM32F446xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, SAI, LTDC RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - uint32_t plli2sp = 0U; - uint32_t plli2sq = 0U; - uint32_t plli2sr = 0U; - uint32_t pllsaip = 0U; - uint32_t pllsaiq = 0U; - uint32_t plli2sused = 0U; - uint32_t pllsaiused = 0U; - - /* Check the peripheral clock selection parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*------------------------ I2S APB1 configuration --------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- I2S APB2 configuration ----------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*--------------------------- SAI1 configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == (RCC_PERIPHCLK_SAI1)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAI1CLKSOURCE(PeriphClkInit->Sai1ClockSelection)); - - /* Configure SAI1 Clock source */ - __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection); - /* Enable the PLLI2S when it's used as clock source for SAI */ - if (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI) - { - pllsaiused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*-------------------------- SAI2 configuration ----------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == (RCC_PERIPHCLK_SAI2)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAI2CLKSOURCE(PeriphClkInit->Sai2ClockSelection)); - - /* Configure SAI2 Clock source */ - __HAL_RCC_SAI2_CONFIG(PeriphClkInit->Sai2ClockSelection); - - /* Enable the PLLI2S when it's used as clock source for SAI */ - if (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI) - { - pllsaiused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- RTC configuration --------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - /* Configure Timer Prescaler */ - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- FMPI2C1 Configuration -----------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) - { - /* Check the parameters */ - assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); - - /* Configure the FMPI2C1 clock source */ - __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------ CEC Configuration -------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CEC) == RCC_PERIPHCLK_CEC) - { - /* Check the parameters */ - assert_param(IS_RCC_CECCLKSOURCE(PeriphClkInit->CecClockSelection)); - - /* Configure the CEC clock source */ - __HAL_RCC_CEC_CONFIG(PeriphClkInit->CecClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- CLK48 Configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - { - /* Check the parameters */ - assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); - - /* Configure the CLK48 clock source */ - __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); - - /* Enable the PLLSAI when it's used as clock source for CLK48 */ - if (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP) - { - pllsaiused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- SDIO Configuration -------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------ SPDIFRX Configuration ---------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) - { - /* Check the parameters */ - assert_param(IS_RCC_SPDIFRXCLKSOURCE(PeriphClkInit->SpdifClockSelection)); - - /* Configure the SPDIFRX clock source */ - __HAL_RCC_SPDIFRX_CONFIG(PeriphClkInit->SpdifClockSelection); - /* Enable the PLLI2S when it's used as clock source for SPDIFRX */ - if (PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- PLLI2S Configuration ------------------------*/ - /* PLLI2S is configured when a peripheral will use it as source clock : SAI1, SAI2, I2S on APB1, - I2S on APB2 or SPDIFRX */ - if ((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) - { - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* check for common PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - - /*------ In Case of PLLI2S is selected as source clock for I2S -----------*/ - if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) - && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S))) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - - /* Read PLLI2SP/PLLI2SQ value from PLLI2SCFGR register (this value is not needed for I2S configuration) */ - plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sp, plli2sq, - PeriphClkInit->PLLI2S.PLLI2SR); - } - - /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ - if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) - && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S))) - { - /* Check for PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - /* Check for PLLI2S/DIVQ parameters */ - assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); - - /* Read PLLI2SP/PLLI2SR value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ - plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sp, - PeriphClkInit->PLLI2S.PLLI2SQ, plli2sr); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); - } - - /*------ In Case of PLLI2S is selected as source clock for SPDIFRX -------*/ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) - && (PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); - /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - plli2sq = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SP, - plli2sq, plli2sr); - } - - /*----------------- In Case of PLLI2S is just selected -----------------*/ - if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SP, - PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- PLLSAI Configuration -----------------------*/ - /* PLLSAI is configured when a peripheral will use it as source clock : SAI1, SAI2, CLK48 or SDIO */ - if (pllsaiused == 1U) - { - /* Disable PLLSAI Clock */ - __HAL_RCC_PLLSAI_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is disabled */ - while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* Check the PLLSAI division factors */ - assert_param(IS_RCC_PLLSAIM_VALUE(PeriphClkInit->PLLSAI.PLLSAIM)); - assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); - - /*------ In Case of PLLSAI is selected as source clock for SAI -----------*/ - if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) - && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI))) - { - /* check for PLLSAIQ Parameter */ - assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); - /* check for PLLSAI/DIVQ Parameter */ - assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); - - /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ - pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, - PeriphClkInit->PLLSAI.PLLSAIQ, 0U); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); - } - - /*------ In Case of PLLSAI is selected as source clock for CLK48 ---------*/ - /* In Case of PLLI2S is selected as source clock for CLK48 */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); - /* Read PLLSAIQ value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Configure the PLLSAI division factors */ - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLI2SN/PLLSAIM) */ - /* 48CLK = f(PLLSAI clock output) = f(VCO clock) / PLLSAIP */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIP, - pllsaiq, 0U); - } - - /* Enable PLLSAI Clock */ - __HAL_RCC_PLLSAI_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is ready */ - while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - return HAL_OK; -} - -/** - * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 | \ - RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 | \ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ - RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_FMPI2C1 | \ - RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO | \ - RCC_PERIPHCLK_SPDIFRX; - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SP = (uint32_t)((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Get the PLLSAI Clock configuration --------------------------------------*/ - PeriphClkInit->PLLSAI.PLLSAIM = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM) >> RCC_PLLSAICFGR_PLLSAIM_Pos); - PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); - PeriphClkInit->PLLSAI.PLLSAIP = (uint32_t)((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ - PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); - PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); - - /* Get the SAI1 clock configuration ----------------------------------------*/ - PeriphClkInit->Sai1ClockSelection = __HAL_RCC_GET_SAI1_SOURCE(); - - /* Get the SAI2 clock configuration ----------------------------------------*/ - PeriphClkInit->Sai2ClockSelection = __HAL_RCC_GET_SAI2_SOURCE(); - - /* Get the I2S APB1 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); - - /* Get the I2S APB2 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); - - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - /* Get the CEC clock configuration -----------------------------------------*/ - PeriphClkInit->CecClockSelection = __HAL_RCC_GET_CEC_SOURCE(); - - /* Get the FMPI2C1 clock configuration -------------------------------------*/ - PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); - - /* Get the CLK48 clock configuration ----------------------------------------*/ - PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); - - /* Get the SDIO clock configuration ----------------------------------------*/ - PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); - - /* Get the SPDIFRX clock configuration -------------------------------------*/ - PeriphClkInit->SpdifClockSelection = __HAL_RCC_GET_SPDIFRX_SOURCE(); - - /* Get the TIM Prescaler configuration -------------------------------------*/ - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_SAI1: SAI1 peripheral clock - * @arg RCC_PERIPHCLK_SAI2: SAI2 peripheral clock - * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock - * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - uint32_t tmpreg1 = 0U; - /* This variable used to store the SAI clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - /* This variable used to store the SAI clock source */ - uint32_t saiclocksource = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_SAI1: - case RCC_PERIPHCLK_SAI2: - { - saiclocksource = RCC->DCKCFGR; - saiclocksource &= (RCC_DCKCFGR_SAI1SRC | RCC_DCKCFGR_SAI2SRC); - switch (saiclocksource) - { - case 0U: /* PLLSAI is the clock source for SAI*/ - { - /* Configure the PLLSAI division factor */ - /* PLLSAI_VCO Input = PLL_SOURCE/PLLSAIM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM)); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM))); - } - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - tmpreg1 = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24U; - frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6U)) / (tmpreg1); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - tmpreg1 = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> 8U) + 1U); - frequency = frequency / (tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC_0: /* PLLI2S is the clock source for SAI*/ - case RCC_DCKCFGR_SAI2SRC_0: /* PLLI2S is the clock source for SAI*/ - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM))); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - tmpreg1 = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24U; - frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U)) / (tmpreg1); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - tmpreg1 = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) + 1U); - frequency = frequency / (tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC_1: /* PLLR is the clock source for SAI*/ - case RCC_DCKCFGR_SAI2SRC_1: /* PLLR is the clock source for SAI*/ - { - /* Configure the PLLI2S division factor */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - /* SAI_CLK_x = PLL_VCO Output/PLLR */ - tmpreg1 = (RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U; - frequency = (vcoinput * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U)) / (tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC: /* External clock is the clock source for SAI*/ - { - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - case RCC_DCKCFGR_SAI2SRC: /* PLLSRC(HSE or HSI) is the clock source for SAI*/ - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - frequency = (uint32_t)(HSI_VALUE); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - frequency = (uint32_t)(HSE_VALUE); - } - break; - } - default : - { - break; - } - } - break; - } - case RCC_PERIPHCLK_I2S_APB1: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB1CLKSOURCE_PLLSRC: - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - case RCC_PERIPHCLK_I2S_APB2: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB2CLKSOURCE_PLLSRC: - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, SAI, LTDC, RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - uint32_t pllsaip = 0U; - uint32_t pllsaiq = 0U; - uint32_t pllsair = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*--------------------------- CLK48 Configuration --------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - { - /* Check the parameters */ - assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); - - /* Configure the CLK48 clock source */ - __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------ SDIO Configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ - /*------------------- Common configuration SAI/I2S -------------------------*/ - /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division - factor is common parameters for both peripherals */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------- I2S configuration -------------------------------*/ - /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added - only for I2S configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must - be added only for SAI configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) - { - /* Check the PLLI2S division factors */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); - - /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, tmpreg1); - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); - } - - /*----------------- In Case of PLLI2S is just selected -----------------*/ - if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - - /* Configure the PLLI2S multiplication and division factors */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, - PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ - /*----------------------- Common configuration SAI/LTDC --------------------*/ - /* In Case of SAI, LTDC or CLK48 Clock Configuration through PLLSAI, PLLSAIN division - factor is common parameters for these peripherals */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && - (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP))) - { - /* Check the PLLSAI division factors */ - assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); - - /* Disable PLLSAI Clock */ - __HAL_RCC_PLLSAI_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is disabled */ - while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must - be added only for SAI configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) - { - assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); - assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); - - /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ - pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, PeriphClkInit->PLLSAI.PLLSAIQ, pllsair); - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); - } - - /*---------------------------- LTDC configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) - { - assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); - assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); - - /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ - pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, pllsaiq, PeriphClkInit->PLLSAI.PLLSAIR); - /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); - } - - /*---------------------------- CLK48 configuration ------------------------*/ - /* Configure the PLLSAI when it is used as clock source for CLK48 */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == (RCC_PERIPHCLK_CLK48)) && - (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) - { - assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); - - /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* CLK48_CLK(first level) = PLLSAI_VCO Output/PLLSAIP */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIP, pllsaiq, pllsair); - } - - /* Enable PLLSAI Clock */ - __HAL_RCC_PLLSAI_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is ready */ - while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - - /*--------------------------------------------------------------------------*/ - - /*---------------------------- RTC configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - return HAL_OK; -} - -/** - * @brief Configures the RCC_PeriphCLKInitTypeDef according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI | \ - RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC | \ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ - RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO; - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Get the PLLSAI Clock configuration --------------------------------------*/ - PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); - PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ - PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); - PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); - PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - /* Get the CLK48 clock configuration -------------------------------------*/ - PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); - - /* Get the SDIO clock configuration ----------------------------------------*/ - PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); - - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SCLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, LTDC RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; -#if defined(STM32F413xx) || defined(STM32F423xx) - uint32_t plli2sq = 0U; -#endif /* STM32F413xx || STM32F423xx */ - uint32_t plli2sused = 0U; - - /* Check the peripheral clock selection parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*----------------------------------- I2S APB1 configuration ---------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------------- I2S APB2 configuration ---------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - -#if defined(STM32F413xx) || defined(STM32F423xx) - /*----------------------- SAI1 Block A configuration -----------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == (RCC_PERIPHCLK_SAIA)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAIACLKSOURCE(PeriphClkInit->SaiAClockSelection)); - - /* Configure SAI1 Clock source */ - __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(PeriphClkInit->SaiAClockSelection); - /* Enable the PLLI2S when it's used as clock source for SAI */ - if (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLR) - { - /* Check for PLL/DIVR parameters */ - assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ - __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------- SAI1 Block B configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == (RCC_PERIPHCLK_SAIB)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAIBCLKSOURCE(PeriphClkInit->SaiBClockSelection)); - - /* Configure SAI1 Clock source */ - __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(PeriphClkInit->SaiBClockSelection); - /* Enable the PLLI2S when it's used as clock source for SAI */ - if (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLR) - { - /* Check for PLL/DIVR parameters */ - assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ - __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); - } - } - /*--------------------------------------------------------------------------*/ -#endif /* STM32F413xx || STM32F423xx */ - - /*------------------------------------ RTC configuration -------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------ TIM configuration -------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - /* Configure Timer Prescaler */ - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------- FMPI2C1 Configuration --------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) - { - /* Check the parameters */ - assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); - - /* Configure the FMPI2C1 clock source */ - __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------- CLK48 Configuration ----------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - { - /* Check the parameters */ - assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); - - /* Enable the PLLI2S when it's used as clock source for CLK48 */ - if (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------- SDIO Configuration -----------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*-------------------------------------- PLLI2S Configuration --------------*/ - /* PLLI2S is configured when a peripheral will use it as source clock : I2S on APB1 or - I2S on APB2*/ - if ((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) - { - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* check for common PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SCLKSOURCE(PeriphClkInit->PLLI2SSelection)); - assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - /*-------------------- Set the PLL I2S clock -----------------------------*/ - __HAL_RCC_PLL_I2S_CONFIG(PeriphClkInit->PLLI2SSelection); - - /*------- In Case of PLLI2S is selected as source clock for I2S ----------*/ - if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) - && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) && (PeriphClkInit->SdioClockSelection == RCC_SDIOCLKSOURCE_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ))) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, - PeriphClkInit->PLLI2S.PLLI2SR); - } - -#if defined(STM32F413xx) || defined(STM32F423xx) - /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ - if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == RCC_PERIPHCLK_SAIA) - && (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == RCC_PERIPHCLK_SAIB) && (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR))) - { - /* Check for PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - /* Check for PLLI2S/DIVR parameters */ - assert_param(IS_RCC_PLLI2S_DIVR_VALUE(PeriphClkInit->PLLI2SDivR)); - - /* Read PLLI2SQ value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ - plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sq, - PeriphClkInit->PLLI2S.PLLI2SR); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVR */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLI2SDivR); - } -#endif /* STM32F413xx || STM32F423xx */ - - /*----------------- In Case of PLLI2S is just selected ------------------*/ - if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ - /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, - PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*-------------------- DFSDM1 clock source configuration -------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1) == RCC_PERIPHCLK_DFSDM1) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM1CLKSOURCE(PeriphClkInit->Dfsdm1ClockSelection)); - - /* Configure the DFSDM1 interface clock source */ - __HAL_RCC_DFSDM1_CONFIG(PeriphClkInit->Dfsdm1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*-------------------- DFSDM1 Audio clock source configuration -------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1_AUDIO) == RCC_PERIPHCLK_DFSDM1_AUDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM1AUDIOCLKSOURCE(PeriphClkInit->Dfsdm1AudioClockSelection)); - - /* Configure the DFSDM1 Audio interface clock source */ - __HAL_RCC_DFSDM1AUDIO_CONFIG(PeriphClkInit->Dfsdm1AudioClockSelection); - } - /*--------------------------------------------------------------------------*/ - -#if defined(STM32F413xx) || defined(STM32F423xx) - /*-------------------- DFSDM2 clock source configuration -------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2) == RCC_PERIPHCLK_DFSDM2) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM2CLKSOURCE(PeriphClkInit->Dfsdm2ClockSelection)); - - /* Configure the DFSDM1 interface clock source */ - __HAL_RCC_DFSDM2_CONFIG(PeriphClkInit->Dfsdm2ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*-------------------- DFSDM2 Audio clock source configuration -------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2_AUDIO) == RCC_PERIPHCLK_DFSDM2_AUDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM2AUDIOCLKSOURCE(PeriphClkInit->Dfsdm2AudioClockSelection)); - - /* Configure the DFSDM1 Audio interface clock source */ - __HAL_RCC_DFSDM2AUDIO_CONFIG(PeriphClkInit->Dfsdm2AudioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- LPTIM1 Configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) - { - /* Check the parameters */ - assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); - - /* Configure the LPTIM1 clock source */ - __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); - } - /*--------------------------------------------------------------------------*/ -#endif /* STM32F413xx || STM32F423xx */ - - return HAL_OK; -} - -/** - * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 | \ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ - RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 | \ - RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 | \ - RCC_PERIPHCLK_DFSDM1_AUDIO | RCC_PERIPHCLK_DFSDM2 | \ - RCC_PERIPHCLK_DFSDM2_AUDIO | RCC_PERIPHCLK_LPTIM1 | \ - RCC_PERIPHCLK_SAIA | RCC_PERIPHCLK_SAIB; -#else /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 | \ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ - RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 | \ - RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 | \ - RCC_PERIPHCLK_DFSDM1_AUDIO; -#endif /* STM32F413xx || STM32F423xx */ - - - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); -#if defined(STM32F413xx) || defined(STM32F423xx) - /* Get the PLL/PLLI2S division factors -------------------------------------*/ - PeriphClkInit->PLLI2SDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVR) >> RCC_DCKCFGR_PLLI2SDIVR_Pos); - PeriphClkInit->PLLDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLDIVR) >> RCC_DCKCFGR_PLLDIVR_Pos); -#endif /* STM32F413xx || STM32F423xx */ - - /* Get the I2S APB1 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); - - /* Get the I2S APB2 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); - - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - /* Get the FMPI2C1 clock configuration -------------------------------------*/ - PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); - - /* Get the CLK48 clock configuration ---------------------------------------*/ - PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); - - /* Get the SDIO clock configuration ----------------------------------------*/ - PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); - - /* Get the DFSDM1 clock configuration --------------------------------------*/ - PeriphClkInit->Dfsdm1ClockSelection = __HAL_RCC_GET_DFSDM1_SOURCE(); - - /* Get the DFSDM1 Audio clock configuration --------------------------------*/ - PeriphClkInit->Dfsdm1AudioClockSelection = __HAL_RCC_GET_DFSDM1AUDIO_SOURCE(); - -#if defined(STM32F413xx) || defined(STM32F423xx) - /* Get the DFSDM2 clock configuration --------------------------------------*/ - PeriphClkInit->Dfsdm2ClockSelection = __HAL_RCC_GET_DFSDM2_SOURCE(); - - /* Get the DFSDM2 Audio clock configuration --------------------------------*/ - PeriphClkInit->Dfsdm2AudioClockSelection = __HAL_RCC_GET_DFSDM2AUDIO_SOURCE(); - - /* Get the LPTIM1 clock configuration --------------------------------------*/ - PeriphClkInit->Lptim1ClockSelection = __HAL_RCC_GET_LPTIM1_SOURCE(); - - /* Get the SAI1 Block Aclock configuration ---------------------------------*/ - PeriphClkInit->SaiAClockSelection = __HAL_RCC_GET_SAI_BLOCKA_SOURCE(); - - /* Get the SAI1 Block B clock configuration --------------------------------*/ - PeriphClkInit->SaiBClockSelection = __HAL_RCC_GET_SAI_BLOCKB_SOURCE(); -#endif /* STM32F413xx || STM32F423xx */ - - /* Get the TIM Prescaler configuration -------------------------------------*/ - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(I2S..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock - * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S_APB1: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLI2S: - { - if ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - } - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB1CLKSOURCE_PLLSRC: - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - case RCC_PERIPHCLK_I2S_APB2: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLI2S: - { - if ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - } - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB2CLKSOURCE_PLLSRC: - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the - * RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). - * - * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case - * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup - * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*---------------------------- RTC configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- FMPI2C1 Configuration -----------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) - { - /* Check the parameters */ - assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); - - /* Configure the FMPI2C1 clock source */ - __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- LPTIM1 Configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) - { - /* Check the parameters */ - assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); - - /* Configure the LPTIM1 clock source */ - __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); - } - - /*---------------------------- I2S Configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPBCLKSOURCE(PeriphClkInit->I2SClockSelection)); - - /* Configure the I2S clock source */ - __HAL_RCC_I2S_CONFIG(PeriphClkInit->I2SClockSelection); - } - - return HAL_OK; -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; - - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } - /* Get the FMPI2C1 clock configuration -------------------------------------*/ - PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); - - /* Get the I2S clock configuration -----------------------------------------*/ - PeriphClkInit->I2SClockSelection = __HAL_RCC_GET_I2S_SOURCE(); - - -} -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPBCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPBCLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPBCLKSOURCE_PLLSRC: - { - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, SAI, LTDC RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ - /*----------------------- Common configuration SAI/I2S ---------------------*/ - /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division - factor is common parameters for both peripherals */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------------- I2S configuration -------------------------*/ - /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added - only for I2S configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must - be added only for SAI configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) - { - /* Check the PLLI2S division factors */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); - - /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, tmpreg1); - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); - } - - /*----------------- In Case of PLLI2S is just selected -----------------*/ - if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - - /* Configure the PLLI2S multiplication and division factors */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, - PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ - /*----------------------- Common configuration SAI/LTDC --------------------*/ - /* In Case of SAI or LTDC Clock Configuration through PLLSAI, PLLSAIN division - factor is common parameters for both peripherals */ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC)) - { - /* Check the PLLSAI division factors */ - assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); - - /* Disable PLLSAI Clock */ - __HAL_RCC_PLLSAI_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is disabled */ - while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must - be added only for SAI configuration */ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) - { - assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); - assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); - - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIQ, tmpreg1); - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); - } - - /*---------------------------- LTDC configuration ------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) - { - assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); - assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); - - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, tmpreg1, PeriphClkInit->PLLSAI.PLLSAIR); - /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); - } - /* Enable PLLSAI Clock */ - __HAL_RCC_PLLSAI_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is ready */ - while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- RTC configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - return HAL_OK; -} - -/** - * @brief Configures the PeriphClkInit according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI | RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; - - /* Get the PLLI2S Clock configuration -----------------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Get the PLLSAI Clock configuration -----------------------------------------------*/ - PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); - PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Get the PLLSAI/PLLI2S division factors -----------------------------------------------*/ - PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); - PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); - PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); - /* Get the RTC Clock configuration -----------------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SCLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the - * RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). - * - * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case - * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup - * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*---------------------------- I2S configuration ---------------------------*/ - if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); -#if defined(STM32F411xE) - assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); -#endif /* STM32F411xE */ - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - -#if defined(STM32F411xE) - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, - PeriphClkInit->PLLI2S.PLLI2SR); -#else - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); -#endif /* STM32F411xE */ - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - - /*---------------------------- RTC configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while ((PWR->CR & PWR_CR_DBP) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) - /*---------------------------- TIM configuration ---------------------------*/ - if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ - return HAL_OK; -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_RTC; - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); -#if defined(STM32F411xE) - PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM); -#endif /* STM32F411xE */ - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) - /* Get the TIM Prescaler configuration -------------------------------------*/ - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SCLKSOURCE_PLLI2S: - { -#if defined(STM32F411xE) - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } -#else - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } -#endif /* STM32F411xE */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - default: - { - break; - } - } - return frequency; -} -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Select LSE mode - * - * @note This mode is only available for STM32F410xx/STM32F411xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. - * - * @param Mode specifies the LSE mode. - * This parameter can be one of the following values: - * @arg RCC_LSE_LOWPOWER_MODE: LSE oscillator in low power mode selection - * @arg RCC_LSE_HIGHDRIVE_MODE: LSE oscillator in High Drive mode selection - * @retval None - */ -void HAL_RCCEx_SelectLSEMode(uint8_t Mode) -{ - /* Check the parameters */ - assert_param(IS_RCC_LSE_MODE(Mode)); - if (Mode == RCC_LSE_HIGHDRIVE_MODE) - { - SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); - } - else - { - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); - } -} - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/** @defgroup RCCEx_Exported_Functions_Group2 Extended Clock management functions - * @brief Extended Clock management functions - * -@verbatim - =============================================================================== - ##### Extended clock management functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the - activation or deactivation of PLLI2S, PLLSAI. -@endverbatim - * @{ - */ - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Enable PLLI2S. - * @param PLLI2SInit pointer to an RCC_PLLI2SInitTypeDef structure that - * contains the configuration information for the PLLI2S - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit) -{ - uint32_t tickstart; - - /* Check for parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PLLI2SInit->PLLI2SN)); - assert_param(IS_RCC_PLLI2SR_VALUE(PLLI2SInit->PLLI2SR)); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - assert_param(IS_RCC_PLLI2SM_VALUE(PLLI2SInit->PLLI2SM)); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ -#if defined(RCC_PLLI2SCFGR_PLLI2SP) - assert_param(IS_RCC_PLLI2SP_VALUE(PLLI2SInit->PLLI2SP)); -#endif /* RCC_PLLI2SCFGR_PLLI2SP */ -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) - assert_param(IS_RCC_PLLI2SQ_VALUE(PLLI2SInit->PLLI2SQ)); -#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - - /* Wait till PLLI2S is disabled */ - tickstart = HAL_GetTick(); - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* Configure the PLLI2S division factors */ -#if defined(STM32F446xx) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SPCLK = PLLI2S_VCO / PLLI2SP */ - /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ - PLLI2SInit->PLLI2SP, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); -#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ - /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ - PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); -#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * PLLI2SN */ - /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); -#elif defined(STM32F411xE) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); -#else - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x PLLI2SN */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); -#endif /* STM32F446xx */ - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - - /* Wait till PLLI2S is ready */ - tickstart = HAL_GetTick(); - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Disable PLLI2S. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void) -{ - uint32_t tickstart; - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - - /* Wait till PLLI2S is disabled */ - tickstart = HAL_GetTick(); - while (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Enable PLLSAI. - * @param PLLSAIInit pointer to an RCC_PLLSAIInitTypeDef structure that - * contains the configuration information for the PLLSAI - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit) -{ - uint32_t tickstart; - - /* Check for parameters */ - assert_param(IS_RCC_PLLSAIN_VALUE(PLLSAIInit->PLLSAIN)); - assert_param(IS_RCC_PLLSAIQ_VALUE(PLLSAIInit->PLLSAIQ)); -#if defined(RCC_PLLSAICFGR_PLLSAIM) - assert_param(IS_RCC_PLLSAIM_VALUE(PLLSAIInit->PLLSAIM)); -#endif /* RCC_PLLSAICFGR_PLLSAIM */ -#if defined(RCC_PLLSAICFGR_PLLSAIP) - assert_param(IS_RCC_PLLSAIP_VALUE(PLLSAIInit->PLLSAIP)); -#endif /* RCC_PLLSAICFGR_PLLSAIP */ -#if defined(RCC_PLLSAICFGR_PLLSAIR) - assert_param(IS_RCC_PLLSAIR_VALUE(PLLSAIInit->PLLSAIR)); -#endif /* RCC_PLLSAICFGR_PLLSAIR */ - - /* Disable the PLLSAI */ - __HAL_RCC_PLLSAI_DISABLE(); - - /* Wait till PLLSAI is disabled */ - tickstart = HAL_GetTick(); - while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* Configure the PLLSAI division factors */ -#if defined(STM32F446xx) - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLSAIN/PLLSAIM) */ - /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ - /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ - /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIM, PLLSAIInit->PLLSAIN, \ - PLLSAIInit->PLLSAIP, PLLSAIInit->PLLSAIQ, 0U); -#elif defined(STM32F469xx) || defined(STM32F479xx) - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * PLLSAIN */ - /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ - /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ - /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIP, \ - PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); -#else - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) x PLLSAIN */ - /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ - /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); -#endif /* STM32F446xx */ - - /* Enable the PLLSAI */ - __HAL_RCC_PLLSAI_ENABLE(); - - /* Wait till PLLSAI is ready */ - tickstart = HAL_GetTick(); - while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Disable PLLSAI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void) -{ - uint32_t tickstart; - - /* Disable the PLLSAI */ - __HAL_RCC_PLLSAI_DISABLE(); - - /* Wait till PLLSAI is disabled */ - tickstart = HAL_GetTick(); - while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @} - */ - -#if defined(STM32F446xx) -/** - * @brief Returns the SYSCLK frequency - * - * @note This function implementation is valid only for STM32F446xx devices. - * @note This function add the PLL/PLLR System clock source - * - * @note The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * @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 or PLLR, function returns values based on HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 25 MHz), 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 not correct when using fractional - * value for HSE crystal. - * - * @note This function can be used by the user application to compute the - * baudrate for the communication peripherals or configure other parameters. - * - * @note Each time SYSCLK changes, this function must be called to update the - * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * - * @retval SYSCLK frequency - */ -uint32_t HAL_RCC_GetSysClockFreq(void) -{ - uint32_t pllm = 0U; - uint32_t pllvco = 0U; - uint32_t pllp = 0U; - uint32_t pllr = 0U; - uint32_t sysclockfreq = 0U; - - /* Get SYSCLK source -------------------------------------------------------*/ - switch (RCC->CFGR & RCC_CFGR_SWS) - { - case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ - { - sysclockfreq = HSI_VALUE; - break; - } - case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ - { - sysclockfreq = HSE_VALUE; - break; - } - case RCC_CFGR_SWS_PLL: /* PLL/PLLP used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLP */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) * 2U); - - sysclockfreq = pllvco / pllp; - break; - } - case RCC_CFGR_SWS_PLLR: /* PLL/PLLR used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLR */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - pllr = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); - - sysclockfreq = pllvco / pllr; - break; - } - default: - { - sysclockfreq = HSI_VALUE; - break; - } - } - return sysclockfreq; -} -#endif /* STM32F446xx */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @brief Resets the RCC clock configuration to the default reset state. - * @note The default reset state of the clock configuration is given below: - * - HSI ON and used as system clock source - * - HSE, PLL, PLLI2S and PLLSAI OFF - * - AHB, APB1 and APB2 prescaler set to 1. - * - CSS, MCO1 and MCO2 OFF - * - All interrupts disabled - * @note This function doesn't modify the configuration of the - * - Peripheral clocks - * - LSI, LSE and RTC clocks - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCC_DeInit(void) -{ - uint32_t tickstart; - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Set HSION bit to the reset value */ - SET_BIT(RCC->CR, RCC_CR_HSION); - - /* Wait till HSI is ready */ - while (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Set HSITRIM[4:0] bits to the reset value */ - SET_BIT(RCC->CR, RCC_CR_HSITRIM_4); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Reset CFGR register */ - CLEAR_REG(RCC->CFGR); - - /* Wait till clock switch is ready */ - while (READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RESET) - { - if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Clear HSEON, HSEBYP and CSSON bits */ - CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_CSSON); - - /* Wait till HSE is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_HSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Clear PLLON bit */ - CLEAR_BIT(RCC->CR, RCC_CR_PLLON); - - /* Wait till PLL is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - -#if defined(RCC_PLLI2S_SUPPORT) - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Reset PLLI2SON bit */ - CLEAR_BIT(RCC->CR, RCC_CR_PLLI2SON); - - /* Wait till PLLI2S is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Reset PLLSAI bit */ - CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); - - /* Wait till PLLSAI is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_PLLSAIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } -#endif /* RCC_PLLSAI_SUPPORT */ - - /* Once PLL, PLLI2S and PLLSAI are OFF, reset PLLCFGR register to default value */ -#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ - defined(STM32F423xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) - RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLR_1; -#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) - RCC->PLLCFGR = RCC_PLLCFGR_PLLR_0 | RCC_PLLCFGR_PLLR_1 | RCC_PLLCFGR_PLLR_2 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_0 | RCC_PLLCFGR_PLLQ_1 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLQ_3; -#else - RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2; -#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx || STM32F469xx || STM32F479xx */ - - /* Reset PLLI2SCFGR register to default value */ -#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ - defined(STM32F423xx) || defined(STM32F446xx) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; -#elif defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; -#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; -#elif defined(STM32F411xE) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; -#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx */ - - /* Reset PLLSAICFGR register */ -#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIR_1; -#elif defined(STM32F446xx) - RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2; -#endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx || STM32F469xx || STM32F479xx */ - - /* Disable all interrupts */ - CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE | RCC_CIR_LSERDYIE | RCC_CIR_HSIRDYIE | RCC_CIR_HSERDYIE | RCC_CIR_PLLRDYIE); - -#if defined(RCC_CIR_PLLI2SRDYIE) - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); -#endif /* RCC_CIR_PLLI2SRDYIE */ - -#if defined(RCC_CIR_PLLSAIRDYIE) - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); -#endif /* RCC_CIR_PLLSAIRDYIE */ - - /* Clear all interrupt flags */ - SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC | RCC_CIR_LSERDYC | RCC_CIR_HSIRDYC | RCC_CIR_HSERDYC | RCC_CIR_PLLRDYC | - RCC_CIR_CSSC); - -#if defined(RCC_CIR_PLLI2SRDYC) - SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC); -#endif /* RCC_CIR_PLLI2SRDYC */ - -#if defined(RCC_CIR_PLLSAIRDYC) - SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC); -#endif /* RCC_CIR_PLLSAIRDYC */ - - /* Clear LSION bit */ - CLEAR_BIT(RCC->CSR, RCC_CSR_LSION); - - /* Reset all CSR flags */ - SET_BIT(RCC->CSR, RCC_CSR_RMVF); - - /* Update the SystemCoreClock global variable */ - SystemCoreClock = HSI_VALUE; - - /* Adapt Systick interrupt period */ - if (HAL_InitTick(uwTickPrio) != HAL_OK) - { - return HAL_ERROR; - } - else - { - return HAL_OK; - } -} - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Initializes the RCC Oscillators according to the specified parameters in the - * RCC_OscInitTypeDef. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that - * contains the configuration information for the RCC Oscillators. - * @note The PLL is not disabled when used as system clock. - * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not - * supported by this API. User should request a transition to LSE Off - * first and then LSE On or LSE Bypass. - * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not - * supported by this API. User should request a transition to HSE Off - * first and then HSE On or HSE Bypass. - * @note This function add the PLL/PLLR factor management during PLL configuration this feature - * is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCC_OscConfig(const RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - uint32_t tickstart; - uint32_t pll_config; - - /* Check Null pointer */ - if (RCC_OscInitStruct == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); - /*------------------------------- HSE Configuration ------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) - { - /* Check the parameters */ - assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); - /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ -#if defined(STM32F446xx) - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) - || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) -#else - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) - || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) -#endif /* STM32F446xx */ - { - if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) - { - return HAL_ERROR; - } - } - else - { - /* Set the new HSE configuration ---------------------------------------*/ - __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); - - /* Check the HSE State */ - if ((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSE is bypassed or disabled */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*----------------------------- HSI Configuration --------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) - { - /* Check the parameters */ - assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); - assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); - - /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ -#if defined(STM32F446xx) - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) - || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) -#else - if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) - || \ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) -#endif /* STM32F446xx */ - { - /* When HSI is used as system clock it will not disabled */ - if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) - { - return HAL_ERROR; - } - /* Otherwise, just the calibration is allowed */ - else - { - /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - } - else - { - /* Check the HSI State */ - if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) - { - /* Enable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - else - { - /* Disable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*------------------------------ LSI Configuration -------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) - { - /* Check the parameters */ - assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); - - /* Check the LSI State */ - if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) - { - /* Enable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - /*------------------------------ LSE Configuration -------------------------*/ - if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) - { - FlagStatus pwrclkchanged = RESET; - - /* Check the parameters */ - assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); - - /* Update LSE configuration in Backup Domain control register */ - /* Requires to enable write access to Backup Domain of necessary */ - if (__HAL_RCC_PWR_IS_CLK_DISABLED()) - { - __HAL_RCC_PWR_CLK_ENABLE(); - pwrclkchanged = SET; - } - - if (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - /* Enable write access to Backup domain */ - SET_BIT(PWR->CR, PWR_CR_DBP); - - /* Wait for Backup domain Write protection disable */ - tickstart = HAL_GetTick(); - - while (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Set the new LSE configuration -----------------------------------------*/ - __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); - /* Check the LSE State */ - if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Restore clock configuration if changed */ - if (pwrclkchanged == SET) - { - __HAL_RCC_PWR_CLK_DISABLE(); - } - } - /*-------------------------------- PLL Configuration -----------------------*/ - /* Check the parameters */ - assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); - if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) - { - /* Check if the PLL is used as system clock or not */ - if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - { - if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) - { - /* Check the parameters */ - assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); - assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); - assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); - assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); - assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); - assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR)); - - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Configure the main PLL clock source, multiplication and division factors. */ - WRITE_REG(RCC->PLLCFGR, (RCC_OscInitStruct->PLL.PLLSource | \ - RCC_OscInitStruct->PLL.PLLM | \ - (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos) | \ - (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos) | \ - (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos) | \ - (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))); - /* Enable the main PLL. */ - __HAL_RCC_PLL_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - else - { - /* Check if there is a request to disable the PLL used as System clock source */ - if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) - { - return HAL_ERROR; - } - else - { - /* Do not return HAL_ERROR if request repeats the current configuration */ - pll_config = RCC->PLLCFGR; -#if defined (RCC_PLLCFGR_PLLR) - if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) -#else - if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) -#endif /* RCC_PLLCFGR_PLLR */ - { - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that will be configured. - * - * @note This function is only available in case of STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. - * @note This function add the PLL/PLLR factor management - * @retval None - */ -void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - /* Set all possible values for the Oscillator type parameter ---------------*/ - RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; - - /* Get the HSE configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) - { - RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; - } - else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) - { - RCC_OscInitStruct->HSEState = RCC_HSE_ON; - } - else - { - RCC_OscInitStruct->HSEState = RCC_HSE_OFF; - } - - /* Get the HSI configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) - { - RCC_OscInitStruct->HSIState = RCC_HSI_ON; - } - else - { - RCC_OscInitStruct->HSIState = RCC_HSI_OFF; - } - - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); - - /* Get the LSE configuration -----------------------------------------------*/ - if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) - { - RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; - } - else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) - { - RCC_OscInitStruct->LSEState = RCC_LSE_ON; - } - else - { - RCC_OscInitStruct->LSEState = RCC_LSE_OFF; - } - - /* Get the LSI configuration -----------------------------------------------*/ - if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) - { - RCC_OscInitStruct->LSIState = RCC_LSI_ON; - } - else - { - RCC_OscInitStruct->LSIState = RCC_LSI_OFF; - } - - /* Get the PLL configuration -----------------------------------------------*/ - if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; - } - else - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; - } - RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); - RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); - RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); - RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); - RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); - RCC_OscInitStruct->PLL.PLLR = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); -} -#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#endif /* HAL_RCC_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c deleted file mode 100644 index da5226f..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c +++ /dev/null @@ -1,1313 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_sdram.c - * @author MCD Application Team - * @brief SDRAM HAL module driver. - * This file provides a generic firmware to drive SDRAM memories mounted - * as external device. - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - This driver is a generic layered driver which contains a set of APIs used to - control SDRAM memories. It uses the FMC layer functions to interface - with SDRAM devices. - The following sequence should be followed to configure the FMC to interface - with SDRAM memories: - - (#) Declare a SDRAM_HandleTypeDef handle structure, for example: - SDRAM_HandleTypeDef hsdram - - (++) Fill the SDRAM_HandleTypeDef handle "Init" field with the allowed - values of the structure member. - - (++) Fill the SDRAM_HandleTypeDef handle "Instance" field with a predefined - base register instance for NOR or SDRAM device - - (#) Declare a FMC_SDRAM_TimingTypeDef structure; for example: - FMC_SDRAM_TimingTypeDef Timing; - and fill its fields with the allowed values of the structure member. - - (#) Initialize the SDRAM Controller by calling the function HAL_SDRAM_Init(). This function - performs the following sequence: - - (##) MSP hardware layer configuration using the function HAL_SDRAM_MspInit() - (##) Control register configuration using the FMC SDRAM interface function - FMC_SDRAM_Init() - (##) Timing register configuration using the FMC SDRAM interface function - FMC_SDRAM_Timing_Init() - (##) Program the SDRAM external device by applying its initialization sequence - according to the device plugged in your hardware. This step is mandatory - for accessing the SDRAM device. - - (#) At this stage you can perform read/write accesses from/to the memory connected - to the SDRAM Bank. You can perform either polling or DMA transfer using the - following APIs: - (++) HAL_SDRAM_Read()/HAL_SDRAM_Write() for polling read/write access - (++) HAL_SDRAM_Read_DMA()/HAL_SDRAM_Write_DMA() for DMA read/write transfer - - (#) You can also control the SDRAM device by calling the control APIs HAL_SDRAM_WriteOperation_Enable()/ - HAL_SDRAM_WriteOperation_Disable() to respectively enable/disable the SDRAM write operation or - the function HAL_SDRAM_SendCommand() to send a specified command to the SDRAM - device. The command to be sent must be configured with the FMC_SDRAM_CommandTypeDef - structure. - - (#) You can continuously monitor the SDRAM device HAL state by calling the function - HAL_SDRAM_GetState() - - *** Callback registration *** - ============================================= - [..] - The compilation define USE_HAL_SDRAM_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - - Use Functions HAL_SDRAM_RegisterCallback() to register a user callback, - it allows to register following callbacks: - (+) MspInitCallback : SDRAM MspInit. - (+) MspDeInitCallback : SDRAM MspDeInit. - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - - Use function HAL_SDRAM_UnRegisterCallback() to reset a callback to the default - weak (overridden) function. It allows to reset following callbacks: - (+) MspInitCallback : SDRAM MspInit. - (+) MspDeInitCallback : SDRAM MspDeInit. - This function) takes as parameters the HAL peripheral handle and the Callback ID. - - By default, after the HAL_SDRAM_Init and if the state is HAL_SDRAM_STATE_RESET - all callbacks are reset to the corresponding legacy weak (overridden) functions. - Exception done for MspInit and MspDeInit callbacks that are respectively - reset to the legacy weak (overridden) functions in the HAL_SDRAM_Init - and HAL_SDRAM_DeInit only when these callbacks are null (not registered beforehand). - If not, MspInit or MspDeInit are not null, the HAL_SDRAM_Init and HAL_SDRAM_DeInit - keep and use the user MspInit/MspDeInit callbacks (registered beforehand) - - Callbacks can be registered/unregistered in READY state only. - Exception done for MspInit/MspDeInit callbacks that can be registered/unregistered - in READY or RESET state, thus registered (user) MspInit/DeInit callbacks can be used - during the Init/DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using HAL_SDRAM_RegisterCallback before calling HAL_SDRAM_DeInit - or HAL_SDRAM_Init function. - - When The compilation define USE_HAL_SDRAM_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registering feature is not available - and weak (overridden) callbacks are used. - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -#if defined(FMC_Bank5_6) - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -#ifdef HAL_SDRAM_MODULE_ENABLED - -/** @defgroup SDRAM SDRAM - * @brief SDRAM driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup SDRAM_Private_Functions SDRAM Private Functions - * @{ - */ -static void SDRAM_DMACplt(DMA_HandleTypeDef *hdma); -static void SDRAM_DMACpltProt(DMA_HandleTypeDef *hdma); -static void SDRAM_DMAError(DMA_HandleTypeDef *hdma); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup SDRAM_Exported_Functions SDRAM Exported Functions - * @{ - */ - -/** @defgroup SDRAM_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * - @verbatim - ============================================================================== - ##### SDRAM Initialization and de_initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to initialize/de-initialize - the SDRAM memory - -@endverbatim - * @{ - */ - -/** - * @brief Performs the SDRAM device initialization sequence. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @param Timing Pointer to SDRAM control timing structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SDRAM_Init(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_TimingTypeDef *Timing) -{ - /* Check the SDRAM handle parameter */ - if (hsdram == NULL) - { - return HAL_ERROR; - } - - if (hsdram->State == HAL_SDRAM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hsdram->Lock = HAL_UNLOCKED; -#if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1) - if (hsdram->MspInitCallback == NULL) - { - hsdram->MspInitCallback = HAL_SDRAM_MspInit; - } - hsdram->RefreshErrorCallback = HAL_SDRAM_RefreshErrorCallback; - hsdram->DmaXferCpltCallback = HAL_SDRAM_DMA_XferCpltCallback; - hsdram->DmaXferErrorCallback = HAL_SDRAM_DMA_XferErrorCallback; - - /* Init the low level hardware */ - hsdram->MspInitCallback(hsdram); -#else - /* Initialize the low level hardware (MSP) */ - HAL_SDRAM_MspInit(hsdram); -#endif /* USE_HAL_SDRAM_REGISTER_CALLBACKS */ - } - - /* Initialize the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_BUSY; - - /* Initialize SDRAM control Interface */ - (void)FMC_SDRAM_Init(hsdram->Instance, &(hsdram->Init)); - - /* Initialize SDRAM timing Interface */ - (void)FMC_SDRAM_Timing_Init(hsdram->Instance, Timing, hsdram->Init.SDBank); - /* Update the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Perform the SDRAM device initialization sequence. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SDRAM_DeInit(SDRAM_HandleTypeDef *hsdram) -{ -#if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1) - if (hsdram->MspDeInitCallback == NULL) - { - hsdram->MspDeInitCallback = HAL_SDRAM_MspDeInit; - } - - /* DeInit the low level hardware */ - hsdram->MspDeInitCallback(hsdram); -#else - /* Initialize the low level hardware (MSP) */ - HAL_SDRAM_MspDeInit(hsdram); -#endif /* USE_HAL_SDRAM_REGISTER_CALLBACKS */ - - /* Configure the SDRAM registers with their reset values */ - (void)FMC_SDRAM_DeInit(hsdram->Instance, hsdram->Init.SDBank); - - /* Reset the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hsdram); - - return HAL_OK; -} - -/** - * @brief SDRAM MSP Init. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @retval None - */ -__weak void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef *hsdram) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hsdram); - - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_SDRAM_MspInit could be implemented in the user file - */ -} - -/** - * @brief SDRAM MSP DeInit. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @retval None - */ -__weak void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef *hsdram) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hsdram); - - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_SDRAM_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief This function handles SDRAM refresh error interrupt request. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @retval HAL status - */ -void HAL_SDRAM_IRQHandler(SDRAM_HandleTypeDef *hsdram) -{ - /* Check SDRAM interrupt Rising edge flag */ - if (__FMC_SDRAM_GET_FLAG(hsdram->Instance, FMC_SDRAM_FLAG_REFRESH_IT)) - { - /* SDRAM refresh error interrupt callback */ -#if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1) - hsdram->RefreshErrorCallback(hsdram); -#else - HAL_SDRAM_RefreshErrorCallback(hsdram); -#endif /* USE_HAL_SDRAM_REGISTER_CALLBACKS */ - - /* Clear SDRAM refresh error interrupt pending bit */ - __FMC_SDRAM_CLEAR_FLAG(hsdram->Instance, FMC_SDRAM_FLAG_REFRESH_ERROR); - } -} - -/** - * @brief SDRAM Refresh error callback. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @retval None - */ -__weak void HAL_SDRAM_RefreshErrorCallback(SDRAM_HandleTypeDef *hsdram) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hsdram); - - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_SDRAM_RefreshErrorCallback could be implemented in the user file - */ -} - -/** - * @brief DMA transfer complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -__weak void HAL_SDRAM_DMA_XferCpltCallback(DMA_HandleTypeDef *hdma) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hdma); - - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_SDRAM_DMA_XferCpltCallback could be implemented in the user file - */ -} - -/** - * @brief DMA transfer complete error callback. - * @param hdma DMA handle - * @retval None - */ -__weak void HAL_SDRAM_DMA_XferErrorCallback(DMA_HandleTypeDef *hdma) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hdma); - - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_SDRAM_DMA_XferErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup SDRAM_Exported_Functions_Group2 Input and Output functions - * @brief Input Output and memory control functions - * - @verbatim - ============================================================================== - ##### SDRAM Input and Output functions ##### - ============================================================================== - [..] - This section provides functions allowing to use and control the SDRAM memory - -@endverbatim - * @{ - */ - -/** - * @brief Reads 8-bit data buffer from the SDRAM memory. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @param pAddress Pointer to read start address - * @param pDstBuffer Pointer to destination buffer - * @param BufferSize Size of the buffer to read from memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SDRAM_Read_8b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint8_t *pDstBuffer, - uint32_t BufferSize) -{ - uint32_t size; - __IO uint8_t *pSdramAddress = (uint8_t *)pAddress; - uint8_t *pdestbuff = pDstBuffer; - HAL_SDRAM_StateTypeDef state = hsdram->State; - - /* Check the SDRAM controller state */ - if (state == HAL_SDRAM_STATE_BUSY) - { - return HAL_BUSY; - } - else if ((state == HAL_SDRAM_STATE_READY) || (state == HAL_SDRAM_STATE_WRITE_PROTECTED)) - { - /* Process Locked */ - __HAL_LOCK(hsdram); - - /* Update the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_BUSY; - - /* Read data from source */ - for (size = BufferSize; size != 0U; size--) - { - *pdestbuff = *(__IO uint8_t *)pSdramAddress; - pdestbuff++; - pSdramAddress++; - } - - /* Update the SDRAM controller state */ - hsdram->State = state; - - /* Process Unlocked */ - __HAL_UNLOCK(hsdram); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Writes 8-bit data buffer to SDRAM memory. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @param pAddress Pointer to write start address - * @param pSrcBuffer Pointer to source buffer to write - * @param BufferSize Size of the buffer to write to memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SDRAM_Write_8b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint8_t *pSrcBuffer, - uint32_t BufferSize) -{ - uint32_t size; - __IO uint8_t *pSdramAddress = (uint8_t *)pAddress; - uint8_t *psrcbuff = pSrcBuffer; - - /* Check the SDRAM controller state */ - if (hsdram->State == HAL_SDRAM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hsdram->State == HAL_SDRAM_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hsdram); - - /* Update the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_BUSY; - - /* Write data to memory */ - for (size = BufferSize; size != 0U; size--) - { - *(__IO uint8_t *)pSdramAddress = *psrcbuff; - psrcbuff++; - pSdramAddress++; - } - - /* Update the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hsdram); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Reads 16-bit data buffer from the SDRAM memory. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @param pAddress Pointer to read start address - * @param pDstBuffer Pointer to destination buffer - * @param BufferSize Size of the buffer to read from memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SDRAM_Read_16b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint16_t *pDstBuffer, - uint32_t BufferSize) -{ - uint32_t size; - __IO uint32_t *pSdramAddress = pAddress; - uint16_t *pdestbuff = pDstBuffer; - HAL_SDRAM_StateTypeDef state = hsdram->State; - - /* Check the SDRAM controller state */ - if (state == HAL_SDRAM_STATE_BUSY) - { - return HAL_BUSY; - } - else if ((state == HAL_SDRAM_STATE_READY) || (state == HAL_SDRAM_STATE_WRITE_PROTECTED)) - { - /* Process Locked */ - __HAL_LOCK(hsdram); - - /* Update the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_BUSY; - - /* Read data from memory */ - for (size = BufferSize; size >= 2U ; size -= 2U) - { - *pdestbuff = (uint16_t)((*pSdramAddress) & 0x0000FFFFU); - pdestbuff++; - *pdestbuff = (uint16_t)(((*pSdramAddress) & 0xFFFF0000U) >> 16U); - pdestbuff++; - pSdramAddress++; - } - - /* Read last 16-bits if size is not 32-bits multiple */ - if ((BufferSize % 2U) != 0U) - { - *pdestbuff = (uint16_t)((*pSdramAddress) & 0x0000FFFFU); - } - - /* Update the SDRAM controller state */ - hsdram->State = state; - - /* Process Unlocked */ - __HAL_UNLOCK(hsdram); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Writes 16-bit data buffer to SDRAM memory. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @param pAddress Pointer to write start address - * @param pSrcBuffer Pointer to source buffer to write - * @param BufferSize Size of the buffer to write to memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SDRAM_Write_16b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint16_t *pSrcBuffer, - uint32_t BufferSize) -{ - uint32_t size; - __IO uint32_t *psdramaddress = pAddress; - uint16_t *psrcbuff = pSrcBuffer; - - /* Check the SDRAM controller state */ - if (hsdram->State == HAL_SDRAM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hsdram->State == HAL_SDRAM_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hsdram); - - /* Update the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_BUSY; - - /* Write data to memory */ - for (size = BufferSize; size >= 2U ; size -= 2U) - { - *psdramaddress = (uint32_t)(*psrcbuff); - psrcbuff++; - *psdramaddress |= ((uint32_t)(*psrcbuff) << 16U); - psrcbuff++; - psdramaddress++; - } - - /* Write last 16-bits if size is not 32-bits multiple */ - if ((BufferSize % 2U) != 0U) - { - *psdramaddress = ((uint32_t)(*psrcbuff) & 0x0000FFFFU) | ((*psdramaddress) & 0xFFFF0000U); - } - - /* Update the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hsdram); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Reads 32-bit data buffer from the SDRAM memory. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @param pAddress Pointer to read start address - * @param pDstBuffer Pointer to destination buffer - * @param BufferSize Size of the buffer to read from memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SDRAM_Read_32b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pDstBuffer, - uint32_t BufferSize) -{ - uint32_t size; - __IO uint32_t *pSdramAddress = (uint32_t *)pAddress; - uint32_t *pdestbuff = pDstBuffer; - HAL_SDRAM_StateTypeDef state = hsdram->State; - - /* Check the SDRAM controller state */ - if (state == HAL_SDRAM_STATE_BUSY) - { - return HAL_BUSY; - } - else if ((state == HAL_SDRAM_STATE_READY) || (state == HAL_SDRAM_STATE_WRITE_PROTECTED)) - { - /* Process Locked */ - __HAL_LOCK(hsdram); - - /* Update the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_BUSY; - - /* Read data from source */ - for (size = BufferSize; size != 0U; size--) - { - *pdestbuff = *(__IO uint32_t *)pSdramAddress; - pdestbuff++; - pSdramAddress++; - } - - /* Update the SDRAM controller state */ - hsdram->State = state; - - /* Process Unlocked */ - __HAL_UNLOCK(hsdram); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Writes 32-bit data buffer to SDRAM memory. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @param pAddress Pointer to write start address - * @param pSrcBuffer Pointer to source buffer to write - * @param BufferSize Size of the buffer to write to memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SDRAM_Write_32b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pSrcBuffer, - uint32_t BufferSize) -{ - uint32_t size; - __IO uint32_t *pSdramAddress = pAddress; - uint32_t *psrcbuff = pSrcBuffer; - - /* Check the SDRAM controller state */ - if (hsdram->State == HAL_SDRAM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hsdram->State == HAL_SDRAM_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hsdram); - - /* Update the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_BUSY; - - /* Write data to memory */ - for (size = BufferSize; size != 0U; size--) - { - *pSdramAddress = *psrcbuff; - psrcbuff++; - pSdramAddress++; - } - - /* Update the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hsdram); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Reads a Words data from the SDRAM memory using DMA transfer. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @param pAddress Pointer to read start address - * @param pDstBuffer Pointer to destination buffer - * @param BufferSize Size of the buffer to read from memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SDRAM_Read_DMA(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pDstBuffer, - uint32_t BufferSize) -{ - HAL_StatusTypeDef status; - HAL_SDRAM_StateTypeDef state = hsdram->State; - - /* Check the SDRAM controller state */ - if (state == HAL_SDRAM_STATE_BUSY) - { - status = HAL_BUSY; - } - else if ((state == HAL_SDRAM_STATE_READY) || (state == HAL_SDRAM_STATE_WRITE_PROTECTED)) - { - /* Process Locked */ - __HAL_LOCK(hsdram); - - /* Update the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_BUSY; - - /* Configure DMA user callbacks */ - if (state == HAL_SDRAM_STATE_READY) - { - hsdram->hdma->XferCpltCallback = SDRAM_DMACplt; - } - else - { - hsdram->hdma->XferCpltCallback = SDRAM_DMACpltProt; - } - hsdram->hdma->XferErrorCallback = SDRAM_DMAError; - - /* Enable the DMA Stream */ - status = HAL_DMA_Start_IT(hsdram->hdma, (uint32_t)pAddress, (uint32_t)pDstBuffer, (uint32_t)BufferSize); - - /* Process Unlocked */ - __HAL_UNLOCK(hsdram); - } - else - { - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Writes a Words data buffer to SDRAM memory using DMA transfer. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @param pAddress Pointer to write start address - * @param pSrcBuffer Pointer to source buffer to write - * @param BufferSize Size of the buffer to write to memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SDRAM_Write_DMA(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pSrcBuffer, - uint32_t BufferSize) -{ - HAL_StatusTypeDef status; - - /* Check the SDRAM controller state */ - if (hsdram->State == HAL_SDRAM_STATE_BUSY) - { - status = HAL_BUSY; - } - else if (hsdram->State == HAL_SDRAM_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hsdram); - - /* Update the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_BUSY; - - /* Configure DMA user callbacks */ - hsdram->hdma->XferCpltCallback = SDRAM_DMACplt; - hsdram->hdma->XferErrorCallback = SDRAM_DMAError; - - /* Enable the DMA Stream */ - status = HAL_DMA_Start_IT(hsdram->hdma, (uint32_t)pSrcBuffer, (uint32_t)pAddress, (uint32_t)BufferSize); - - /* Process Unlocked */ - __HAL_UNLOCK(hsdram); - } - else - { - status = HAL_ERROR; - } - - return status; -} - -#if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User SDRAM Callback - * To be used to override the weak predefined callback - * @param hsdram : SDRAM handle - * @param CallbackId : ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_SDRAM_MSP_INIT_CB_ID SDRAM MspInit callback ID - * @arg @ref HAL_SDRAM_MSP_DEINIT_CB_ID SDRAM MspDeInit callback ID - * @arg @ref HAL_SDRAM_REFRESH_ERR_CB_ID SDRAM Refresh Error callback ID - * @param pCallback : pointer to the Callback function - * @retval status - */ -HAL_StatusTypeDef HAL_SDRAM_RegisterCallback(SDRAM_HandleTypeDef *hsdram, HAL_SDRAM_CallbackIDTypeDef CallbackId, - pSDRAM_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - HAL_SDRAM_StateTypeDef state; - - if (pCallback == NULL) - { - return HAL_ERROR; - } - - state = hsdram->State; - if ((state == HAL_SDRAM_STATE_READY) || (state == HAL_SDRAM_STATE_WRITE_PROTECTED)) - { - switch (CallbackId) - { - case HAL_SDRAM_MSP_INIT_CB_ID : - hsdram->MspInitCallback = pCallback; - break; - case HAL_SDRAM_MSP_DEINIT_CB_ID : - hsdram->MspDeInitCallback = pCallback; - break; - case HAL_SDRAM_REFRESH_ERR_CB_ID : - hsdram->RefreshErrorCallback = pCallback; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else if (hsdram->State == HAL_SDRAM_STATE_RESET) - { - switch (CallbackId) - { - case HAL_SDRAM_MSP_INIT_CB_ID : - hsdram->MspInitCallback = pCallback; - break; - case HAL_SDRAM_MSP_DEINIT_CB_ID : - hsdram->MspDeInitCallback = pCallback; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else - { - /* update return status */ - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Unregister a User SDRAM Callback - * SDRAM Callback is redirected to the weak predefined callback - * @param hsdram : SDRAM handle - * @param CallbackId : ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_SDRAM_MSP_INIT_CB_ID SDRAM MspInit callback ID - * @arg @ref HAL_SDRAM_MSP_DEINIT_CB_ID SDRAM MspDeInit callback ID - * @arg @ref HAL_SDRAM_REFRESH_ERR_CB_ID SDRAM Refresh Error callback ID - * @arg @ref HAL_SDRAM_DMA_XFER_CPLT_CB_ID SDRAM DMA Xfer Complete callback ID - * @arg @ref HAL_SDRAM_DMA_XFER_ERR_CB_ID SDRAM DMA Xfer Error callback ID - * @retval status - */ -HAL_StatusTypeDef HAL_SDRAM_UnRegisterCallback(SDRAM_HandleTypeDef *hsdram, HAL_SDRAM_CallbackIDTypeDef CallbackId) -{ - HAL_StatusTypeDef status = HAL_OK; - HAL_SDRAM_StateTypeDef state; - - state = hsdram->State; - if ((state == HAL_SDRAM_STATE_READY) || (state == HAL_SDRAM_STATE_WRITE_PROTECTED)) - { - switch (CallbackId) - { - case HAL_SDRAM_MSP_INIT_CB_ID : - hsdram->MspInitCallback = HAL_SDRAM_MspInit; - break; - case HAL_SDRAM_MSP_DEINIT_CB_ID : - hsdram->MspDeInitCallback = HAL_SDRAM_MspDeInit; - break; - case HAL_SDRAM_REFRESH_ERR_CB_ID : - hsdram->RefreshErrorCallback = HAL_SDRAM_RefreshErrorCallback; - break; - case HAL_SDRAM_DMA_XFER_CPLT_CB_ID : - hsdram->DmaXferCpltCallback = HAL_SDRAM_DMA_XferCpltCallback; - break; - case HAL_SDRAM_DMA_XFER_ERR_CB_ID : - hsdram->DmaXferErrorCallback = HAL_SDRAM_DMA_XferErrorCallback; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else if (hsdram->State == HAL_SDRAM_STATE_RESET) - { - switch (CallbackId) - { - case HAL_SDRAM_MSP_INIT_CB_ID : - hsdram->MspInitCallback = HAL_SDRAM_MspInit; - break; - case HAL_SDRAM_MSP_DEINIT_CB_ID : - hsdram->MspDeInitCallback = HAL_SDRAM_MspDeInit; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else - { - /* update return status */ - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Register a User SDRAM Callback for DMA transfers - * To be used to override the weak predefined callback - * @param hsdram : SDRAM handle - * @param CallbackId : ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_SDRAM_DMA_XFER_CPLT_CB_ID SDRAM DMA Xfer Complete callback ID - * @arg @ref HAL_SDRAM_DMA_XFER_ERR_CB_ID SDRAM DMA Xfer Error callback ID - * @param pCallback : pointer to the Callback function - * @retval status - */ -HAL_StatusTypeDef HAL_SDRAM_RegisterDmaCallback(SDRAM_HandleTypeDef *hsdram, HAL_SDRAM_CallbackIDTypeDef CallbackId, - pSDRAM_DmaCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - HAL_SDRAM_StateTypeDef state; - - if (pCallback == NULL) - { - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hsdram); - - state = hsdram->State; - if ((state == HAL_SDRAM_STATE_READY) || (state == HAL_SDRAM_STATE_WRITE_PROTECTED)) - { - switch (CallbackId) - { - case HAL_SDRAM_DMA_XFER_CPLT_CB_ID : - hsdram->DmaXferCpltCallback = pCallback; - break; - case HAL_SDRAM_DMA_XFER_ERR_CB_ID : - hsdram->DmaXferErrorCallback = pCallback; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else - { - /* update return status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hsdram); - return status; -} -#endif /* USE_HAL_SDRAM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup SDRAM_Exported_Functions_Group3 Control functions - * @brief management functions - * -@verbatim - ============================================================================== - ##### SDRAM Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control dynamically - the SDRAM interface. - -@endverbatim - * @{ - */ - -/** - * @brief Enables dynamically SDRAM write protection. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SDRAM_WriteProtection_Enable(SDRAM_HandleTypeDef *hsdram) -{ - /* Check the SDRAM controller state */ - if (hsdram->State == HAL_SDRAM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hsdram->State == HAL_SDRAM_STATE_READY) - { - /* Update the SDRAM state */ - hsdram->State = HAL_SDRAM_STATE_BUSY; - - /* Enable write protection */ - (void)FMC_SDRAM_WriteProtection_Enable(hsdram->Instance, hsdram->Init.SDBank); - - /* Update the SDRAM state */ - hsdram->State = HAL_SDRAM_STATE_WRITE_PROTECTED; - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Disables dynamically SDRAM write protection. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SDRAM_WriteProtection_Disable(SDRAM_HandleTypeDef *hsdram) -{ - HAL_SDRAM_StateTypeDef state = hsdram->State; - - /* Check the SDRAM controller state */ - if (state == HAL_SDRAM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (state == HAL_SDRAM_STATE_WRITE_PROTECTED) - { - /* Update the SDRAM state */ - hsdram->State = HAL_SDRAM_STATE_BUSY; - - /* Disable write protection */ - (void)FMC_SDRAM_WriteProtection_Disable(hsdram->Instance, hsdram->Init.SDBank); - - /* Update the SDRAM state */ - hsdram->State = HAL_SDRAM_STATE_READY; - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Sends Command to the SDRAM bank. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @param Command SDRAM command structure - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SDRAM_SendCommand(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command, - uint32_t Timeout) -{ - HAL_SDRAM_StateTypeDef state = hsdram->State; - - /* Check the SDRAM controller state */ - if (state == HAL_SDRAM_STATE_BUSY) - { - return HAL_BUSY; - } - else if ((state == HAL_SDRAM_STATE_READY) || (state == HAL_SDRAM_STATE_PRECHARGED)) - { - /* Update the SDRAM state */ - hsdram->State = HAL_SDRAM_STATE_BUSY; - - /* Send SDRAM command */ - (void)FMC_SDRAM_SendCommand(hsdram->Instance, Command, Timeout); - - /* Update the SDRAM controller state state */ - if (Command->CommandMode == FMC_SDRAM_CMD_PALL) - { - hsdram->State = HAL_SDRAM_STATE_PRECHARGED; - } - else - { - hsdram->State = HAL_SDRAM_STATE_READY; - } - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Programs the SDRAM Memory Refresh rate. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @param RefreshRate The SDRAM refresh rate value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SDRAM_ProgramRefreshRate(SDRAM_HandleTypeDef *hsdram, uint32_t RefreshRate) -{ - /* Check the SDRAM controller state */ - if (hsdram->State == HAL_SDRAM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hsdram->State == HAL_SDRAM_STATE_READY) - { - /* Update the SDRAM state */ - hsdram->State = HAL_SDRAM_STATE_BUSY; - - /* Program the refresh rate */ - (void)FMC_SDRAM_ProgramRefreshRate(hsdram->Instance, RefreshRate); - - /* Update the SDRAM state */ - hsdram->State = HAL_SDRAM_STATE_READY; - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Sets the Number of consecutive SDRAM Memory auto Refresh commands. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @param AutoRefreshNumber The SDRAM auto Refresh number - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SDRAM_SetAutoRefreshNumber(SDRAM_HandleTypeDef *hsdram, uint32_t AutoRefreshNumber) -{ - /* Check the SDRAM controller state */ - if (hsdram->State == HAL_SDRAM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (hsdram->State == HAL_SDRAM_STATE_READY) - { - /* Update the SDRAM state */ - hsdram->State = HAL_SDRAM_STATE_BUSY; - - /* Set the Auto-Refresh number */ - (void)FMC_SDRAM_SetAutoRefreshNumber(hsdram->Instance, AutoRefreshNumber); - - /* Update the SDRAM state */ - hsdram->State = HAL_SDRAM_STATE_READY; - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Returns the SDRAM memory current mode. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @retval The SDRAM memory mode. - */ -uint32_t HAL_SDRAM_GetModeStatus(SDRAM_HandleTypeDef *hsdram) -{ - /* Return the SDRAM memory current mode */ - return (FMC_SDRAM_GetModeStatus(hsdram->Instance, hsdram->Init.SDBank)); -} - -/** - * @} - */ - -/** @defgroup SDRAM_Exported_Functions_Group4 State functions - * @brief Peripheral State functions - * -@verbatim - ============================================================================== - ##### SDRAM State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the SDRAM controller - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the SDRAM state. - * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains - * the configuration information for SDRAM module. - * @retval HAL state - */ -HAL_SDRAM_StateTypeDef HAL_SDRAM_GetState(const SDRAM_HandleTypeDef *hsdram) -{ - return hsdram->State; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup SDRAM_Private_Functions SDRAM Private Functions - * @{ - */ -/** - * @brief DMA SDRAM process complete callback. - * @param hdma : DMA handle - * @retval None - */ -static void SDRAM_DMACplt(DMA_HandleTypeDef *hdma) -{ - /* Derogation MISRAC2012-Rule-11.5 */ - SDRAM_HandleTypeDef *hsdram = (SDRAM_HandleTypeDef *)(hdma->Parent); - - /* Disable the DMA channel */ - __HAL_DMA_DISABLE(hdma); - - /* Update the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_READY; - -#if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1) - hsdram->DmaXferCpltCallback(hdma); -#else - HAL_SDRAM_DMA_XferCpltCallback(hdma); -#endif /* USE_HAL_SDRAM_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SRAM process complete callback. - * @param hdma : DMA handle - * @retval None - */ -static void SDRAM_DMACpltProt(DMA_HandleTypeDef *hdma) -{ - /* Derogation MISRAC2012-Rule-11.5 */ - SDRAM_HandleTypeDef *hsdram = (SDRAM_HandleTypeDef *)(hdma->Parent); - - /* Disable the DMA channel */ - __HAL_DMA_DISABLE(hdma); - - /* Update the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_WRITE_PROTECTED; - -#if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1) - hsdram->DmaXferCpltCallback(hdma); -#else - HAL_SDRAM_DMA_XferCpltCallback(hdma); -#endif /* USE_HAL_SDRAM_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SDRAM error callback. - * @param hdma : DMA handle - * @retval None - */ -static void SDRAM_DMAError(DMA_HandleTypeDef *hdma) -{ - /* Derogation MISRAC2012-Rule-11.5 */ - SDRAM_HandleTypeDef *hsdram = (SDRAM_HandleTypeDef *)(hdma->Parent); - - /* Disable the DMA channel */ - __HAL_DMA_DISABLE(hdma); - - /* Update the SDRAM controller state */ - hsdram->State = HAL_SDRAM_STATE_ERROR; - -#if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1) - hsdram->DmaXferErrorCallback(hdma); -#else - HAL_SDRAM_DMA_XferErrorCallback(hdma); -#endif /* USE_HAL_SDRAM_REGISTER_CALLBACKS */ -} - -/** - * @} - */ -/** - * @} - */ - -#endif /* HAL_SDRAM_MODULE_ENABLED */ - -/** - * @} - */ - -#endif /* FMC_Bank5_6 */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c deleted file mode 100644 index 92757d8..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c +++ /dev/null @@ -1,3945 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_spi.c - * @author MCD Application Team - * @brief SPI HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Serial Peripheral Interface (SPI) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State functions - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The SPI HAL driver can be used as follows: - - (#) Declare a SPI_HandleTypeDef handle structure, for example: - SPI_HandleTypeDef hspi; - - (#)Initialize the SPI low level resources by implementing the HAL_SPI_MspInit() API: - (##) Enable the SPIx interface clock - (##) SPI pins configuration - (+++) Enable the clock for the SPI GPIOs - (+++) Configure these SPI pins as alternate function push-pull - (##) NVIC configuration if you need to use interrupt process - (+++) Configure the SPIx interrupt priority - (+++) Enable the NVIC SPI IRQ handle - (##) DMA Configuration if you need to use DMA process - (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive Stream/Channel - (+++) Enable the DMAx clock - (+++) Configure the DMA handle parameters - (+++) Configure the DMA Tx or Rx Stream/Channel - (+++) Associate the initialized hdma_tx(or _rx) handle to the hspi DMA Tx or Rx handle - (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx - or Rx Stream/Channel - - (#) Program the Mode, BidirectionalMode , Data size, Baudrate Prescaler, NSS - management, Clock polarity and phase, FirstBit and CRC configuration in the hspi Init structure. - - (#) Initialize the SPI registers by calling the HAL_SPI_Init() API: - (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc) - by calling the customized HAL_SPI_MspInit() API. - [..] - Circular mode restriction: - (#) The DMA circular mode cannot be used when the SPI is configured in these modes: - (##) Master 2Lines RxOnly - (##) Master 1Line Rx - (#) The CRC feature is not managed when the DMA circular mode is enabled - (#) When the SPI DMA Pause/Stop features are used, we must use the following APIs - the HAL_SPI_DMAPause()/ HAL_SPI_DMAStop() only under the SPI callbacks - [..] - Master Receive mode restriction: - (#) In Master unidirectional receive-only mode (MSTR =1, BIDIMODE=0, RXONLY=1) or - bidirectional receive mode (MSTR=1, BIDIMODE=1, BIDIOE=0), to ensure that the SPI - does not initiate a new transfer the following procedure has to be respected: - (##) HAL_SPI_DeInit() - (##) HAL_SPI_Init() - [..] - Callback registration: - - (#) The compilation flag USE_HAL_SPI_REGISTER_CALLBACKS when set to 1U - allows the user to configure dynamically the driver callbacks. - Use Functions HAL_SPI_RegisterCallback() to register an interrupt callback. - - Function HAL_SPI_RegisterCallback() allows to register following callbacks: - (++) TxCpltCallback : SPI Tx Completed callback - (++) RxCpltCallback : SPI Rx Completed callback - (++) TxRxCpltCallback : SPI TxRx Completed callback - (++) TxHalfCpltCallback : SPI Tx Half Completed callback - (++) RxHalfCpltCallback : SPI Rx Half Completed callback - (++) TxRxHalfCpltCallback : SPI TxRx Half Completed callback - (++) ErrorCallback : SPI Error callback - (++) AbortCpltCallback : SPI Abort callback - (++) MspInitCallback : SPI Msp Init callback - (++) MspDeInitCallback : SPI Msp DeInit callback - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - - - (#) Use function HAL_SPI_UnRegisterCallback to reset a callback to the default - weak function. - HAL_SPI_UnRegisterCallback takes as parameters the HAL peripheral handle, - and the Callback ID. - This function allows to reset following callbacks: - (++) TxCpltCallback : SPI Tx Completed callback - (++) RxCpltCallback : SPI Rx Completed callback - (++) TxRxCpltCallback : SPI TxRx Completed callback - (++) TxHalfCpltCallback : SPI Tx Half Completed callback - (++) RxHalfCpltCallback : SPI Rx Half Completed callback - (++) TxRxHalfCpltCallback : SPI TxRx Half Completed callback - (++) ErrorCallback : SPI Error callback - (++) AbortCpltCallback : SPI Abort callback - (++) MspInitCallback : SPI Msp Init callback - (++) MspDeInitCallback : SPI Msp DeInit callback - - [..] - By default, after the HAL_SPI_Init() and when the state is HAL_SPI_STATE_RESET - all callbacks are set to the corresponding weak functions: - examples HAL_SPI_MasterTxCpltCallback(), HAL_SPI_MasterRxCpltCallback(). - Exception done for MspInit and MspDeInit functions that are - reset to the legacy weak functions in the HAL_SPI_Init()/ HAL_SPI_DeInit() only when - these callbacks are null (not registered beforehand). - If MspInit or MspDeInit are not null, the HAL_SPI_Init()/ HAL_SPI_DeInit() - keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. - - [..] - Callbacks can be registered/unregistered in HAL_SPI_STATE_READY state only. - Exception done MspInit/MspDeInit functions that can be registered/unregistered - in HAL_SPI_STATE_READY or HAL_SPI_STATE_RESET state, - thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. - Then, the user first registers the MspInit/MspDeInit user callbacks - using HAL_SPI_RegisterCallback() before calling HAL_SPI_DeInit() - or HAL_SPI_Init() function. - - [..] - When the compilation define USE_HAL_PPP_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registering feature is not available - and weak (surcharged) callbacks are used. - - [..] - Using the HAL it is not possible to reach all supported SPI frequency with the different SPI Modes, - the following table resume the max SPI frequency reached with data size 8bits/16bits, - according to frequency of the APBx Peripheral Clock (fPCLK) used by the SPI instance. - - @endverbatim - - Additional table : - - DataSize = SPI_DATASIZE_8BIT: - +----------------------------------------------------------------------------------------------+ - | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line | - | Process | Transfer mode |---------------------|----------------------|----------------------| - | | | Master | Slave | Master | Slave | Master | Slave | - |==============================================================================================| - | T | Polling | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | / | Interrupt | Fpclk/4 | Fpclk/8 | NA | NA | NA | NA | - | R |----------------|----------|----------|-----------|----------|-----------|----------| - | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | R | Interrupt | Fpclk/8 | Fpclk/8 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/128 | Fpclk/2 | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/2 | Fpclk/64 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | T | Interrupt | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/2 | Fpclk/64 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/128| - +----------------------------------------------------------------------------------------------+ - - DataSize = SPI_DATASIZE_16BIT: - +----------------------------------------------------------------------------------------------+ - | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line | - | Process | Transfer mode |---------------------|----------------------|----------------------| - | | | Master | Slave | Master | Slave | Master | Slave | - |==============================================================================================| - | T | Polling | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | / | Interrupt | Fpclk/4 | Fpclk/4 | NA | NA | NA | NA | - | R |----------------|----------|----------|-----------|----------|-----------|----------| - | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/32 | Fpclk/2 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | R | Interrupt | Fpclk/4 | Fpclk/4 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/128 | Fpclk/2 | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/32 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | T | Interrupt | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/64 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/128| - +----------------------------------------------------------------------------------------------+ - @note The max SPI frequency depend on SPI data size (8bits, 16bits), - SPI mode(2 Lines fullduplex, 2 lines RxOnly, 1 line TX/RX) and Process mode (Polling, IT, DMA). - @note - (#) TX/RX processes are HAL_SPI_TransmitReceive(), HAL_SPI_TransmitReceive_IT() and - HAL_SPI_TransmitReceive_DMA() - (#) RX processes are HAL_SPI_Receive(), HAL_SPI_Receive_IT() and HAL_SPI_Receive_DMA() - (#) TX processes are HAL_SPI_Transmit(), HAL_SPI_Transmit_IT() and HAL_SPI_Transmit_DMA() - - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup SPI SPI - * @brief SPI HAL module driver - * @{ - */ -#ifdef HAL_SPI_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private defines -----------------------------------------------------------*/ -/** @defgroup SPI_Private_Constants SPI Private Constants - * @{ - */ -#define SPI_DEFAULT_TIMEOUT 100U -#define SPI_BSY_FLAG_WORKAROUND_TIMEOUT 1000U /*!< Timeout 1000 us */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @defgroup SPI_Private_Functions SPI Private Functions - * @{ - */ -static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAError(DMA_HandleTypeDef *hdma); -static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma); -static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma); -static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State, - uint32_t Timeout, uint32_t Tickstart); -static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi); -#if (USE_SPI_CRC != 0U) -static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi); -static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi); -static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi); -#endif /* USE_SPI_CRC */ -static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi); -static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi); -static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi); -static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi); -static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi); -static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart); -static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup SPI_Exported_Functions SPI Exported Functions - * @{ - */ - -/** @defgroup SPI_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the SPIx peripheral: - - (+) User must implement HAL_SPI_MspInit() function in which he configures - all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ). - - (+) Call the function HAL_SPI_Init() to configure the selected device with - the selected configuration: - (++) Mode - (++) Direction - (++) Data Size - (++) Clock Polarity and Phase - (++) NSS Management - (++) BaudRate Prescaler - (++) FirstBit - (++) TIMode - (++) CRC Calculation - (++) CRC Polynomial if CRC enabled - - (+) Call the function HAL_SPI_DeInit() to restore the default configuration - of the selected SPIx peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief Initialize the SPI according to the specified parameters - * in the SPI_InitTypeDef and initialize the associated handle. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi) -{ - /* Check the SPI handle allocation */ - if (hspi == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance)); - assert_param(IS_SPI_MODE(hspi->Init.Mode)); - assert_param(IS_SPI_DIRECTION(hspi->Init.Direction)); - assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize)); - assert_param(IS_SPI_NSS(hspi->Init.NSS)); - assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); - assert_param(IS_SPI_FIRST_BIT(hspi->Init.FirstBit)); - assert_param(IS_SPI_TIMODE(hspi->Init.TIMode)); - if (hspi->Init.TIMode == SPI_TIMODE_DISABLE) - { - assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity)); - assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase)); - - if (hspi->Init.Mode == SPI_MODE_MASTER) - { - assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); - } - else - { - /* Baudrate prescaler not use in Motoraola Slave mode. force to default value */ - hspi->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; - } - } - else - { - assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); - - /* Force polarity and phase to TI protocaol requirements */ - hspi->Init.CLKPolarity = SPI_POLARITY_LOW; - hspi->Init.CLKPhase = SPI_PHASE_1EDGE; - } -#if (USE_SPI_CRC != 0U) - assert_param(IS_SPI_CRC_CALCULATION(hspi->Init.CRCCalculation)); - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - assert_param(IS_SPI_CRC_POLYNOMIAL(hspi->Init.CRCPolynomial)); - } -#else - hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; -#endif /* USE_SPI_CRC */ - - if (hspi->State == HAL_SPI_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hspi->Lock = HAL_UNLOCKED; - -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - /* Init the SPI Callback settings */ - hspi->TxCpltCallback = HAL_SPI_TxCpltCallback; /* Legacy weak TxCpltCallback */ - hspi->RxCpltCallback = HAL_SPI_RxCpltCallback; /* Legacy weak RxCpltCallback */ - hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */ - hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ - hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ - hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */ - hspi->ErrorCallback = HAL_SPI_ErrorCallback; /* Legacy weak ErrorCallback */ - hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - - if (hspi->MspInitCallback == NULL) - { - hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ - } - - /* Init the low level hardware : GPIO, CLOCK, NVIC... */ - hspi->MspInitCallback(hspi); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC... */ - HAL_SPI_MspInit(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - - hspi->State = HAL_SPI_STATE_BUSY; - - /* Disable the selected SPI peripheral */ - __HAL_SPI_DISABLE(hspi); - - /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/ - /* Configure : SPI Mode, Communication Mode, Data size, Clock polarity and phase, NSS management, - Communication speed, First bit and CRC calculation state */ - WRITE_REG(hspi->Instance->CR1, ((hspi->Init.Mode & (SPI_CR1_MSTR | SPI_CR1_SSI)) | - (hspi->Init.Direction & (SPI_CR1_RXONLY | SPI_CR1_BIDIMODE)) | - (hspi->Init.DataSize & SPI_CR1_DFF) | - (hspi->Init.CLKPolarity & SPI_CR1_CPOL) | - (hspi->Init.CLKPhase & SPI_CR1_CPHA) | - (hspi->Init.NSS & SPI_CR1_SSM) | - (hspi->Init.BaudRatePrescaler & SPI_CR1_BR_Msk) | - (hspi->Init.FirstBit & SPI_CR1_LSBFIRST) | - (hspi->Init.CRCCalculation & SPI_CR1_CRCEN))); - - /* Configure : NSS management, TI Mode */ - WRITE_REG(hspi->Instance->CR2, (((hspi->Init.NSS >> 16U) & SPI_CR2_SSOE) | (hspi->Init.TIMode & SPI_CR2_FRF))); - -#if (USE_SPI_CRC != 0U) - /*---------------------------- SPIx CRCPOLY Configuration ------------------*/ - /* Configure : CRC Polynomial */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - WRITE_REG(hspi->Instance->CRCPR, (hspi->Init.CRCPolynomial & SPI_CRCPR_CRCPOLY_Msk)); - } -#endif /* USE_SPI_CRC */ - -#if defined(SPI_I2SCFGR_I2SMOD) - /* Activate the SPI mode (Make sure that I2SMOD bit in I2SCFGR register is reset) */ - CLEAR_BIT(hspi->Instance->I2SCFGR, SPI_I2SCFGR_I2SMOD); -#endif /* SPI_I2SCFGR_I2SMOD */ - - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->State = HAL_SPI_STATE_READY; - - return HAL_OK; -} - -/** - * @brief De-Initialize the SPI peripheral. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi) -{ - /* Check the SPI handle allocation */ - if (hspi == NULL) - { - return HAL_ERROR; - } - - /* Check SPI Instance parameter */ - assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance)); - - hspi->State = HAL_SPI_STATE_BUSY; - - /* Disable the SPI Peripheral Clock */ - __HAL_SPI_DISABLE(hspi); - -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - if (hspi->MspDeInitCallback == NULL) - { - hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ - } - - /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ - hspi->MspDeInitCallback(hspi); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ - HAL_SPI_MspDeInit(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->State = HAL_SPI_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hspi); - - return HAL_OK; -} - -/** - * @brief Initialize the SPI MSP. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_MspInit should be implemented in the user file - */ -} - -/** - * @brief De-Initialize the SPI MSP. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_MspDeInit should be implemented in the user file - */ -} - -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) -/** - * @brief Register a User SPI Callback - * To be used instead of the weak predefined callback - * @param hspi Pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI. - * @param CallbackID ID of the callback to be registered - * @param pCallback pointer to the Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID, - pSPI_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - hspi->ErrorCode |= HAL_SPI_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(hspi); - - if (HAL_SPI_STATE_READY == hspi->State) - { - switch (CallbackID) - { - case HAL_SPI_TX_COMPLETE_CB_ID : - hspi->TxCpltCallback = pCallback; - break; - - case HAL_SPI_RX_COMPLETE_CB_ID : - hspi->RxCpltCallback = pCallback; - break; - - case HAL_SPI_TX_RX_COMPLETE_CB_ID : - hspi->TxRxCpltCallback = pCallback; - break; - - case HAL_SPI_TX_HALF_COMPLETE_CB_ID : - hspi->TxHalfCpltCallback = pCallback; - break; - - case HAL_SPI_RX_HALF_COMPLETE_CB_ID : - hspi->RxHalfCpltCallback = pCallback; - break; - - case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID : - hspi->TxRxHalfCpltCallback = pCallback; - break; - - case HAL_SPI_ERROR_CB_ID : - hspi->ErrorCallback = pCallback; - break; - - case HAL_SPI_ABORT_CB_ID : - hspi->AbortCpltCallback = pCallback; - break; - - case HAL_SPI_MSPINIT_CB_ID : - hspi->MspInitCallback = pCallback; - break; - - case HAL_SPI_MSPDEINIT_CB_ID : - hspi->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_SPI_STATE_RESET == hspi->State) - { - switch (CallbackID) - { - case HAL_SPI_MSPINIT_CB_ID : - hspi->MspInitCallback = pCallback; - break; - - case HAL_SPI_MSPDEINIT_CB_ID : - hspi->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hspi); - return status; -} - -/** - * @brief Unregister an SPI Callback - * SPI callback is redirected to the weak predefined callback - * @param hspi Pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI. - * @param CallbackID ID of the callback to be unregistered - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hspi); - - if (HAL_SPI_STATE_READY == hspi->State) - { - switch (CallbackID) - { - case HAL_SPI_TX_COMPLETE_CB_ID : - hspi->TxCpltCallback = HAL_SPI_TxCpltCallback; /* Legacy weak TxCpltCallback */ - break; - - case HAL_SPI_RX_COMPLETE_CB_ID : - hspi->RxCpltCallback = HAL_SPI_RxCpltCallback; /* Legacy weak RxCpltCallback */ - break; - - case HAL_SPI_TX_RX_COMPLETE_CB_ID : - hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */ - break; - - case HAL_SPI_TX_HALF_COMPLETE_CB_ID : - hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ - break; - - case HAL_SPI_RX_HALF_COMPLETE_CB_ID : - hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ - break; - - case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID : - hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */ - break; - - case HAL_SPI_ERROR_CB_ID : - hspi->ErrorCallback = HAL_SPI_ErrorCallback; /* Legacy weak ErrorCallback */ - break; - - case HAL_SPI_ABORT_CB_ID : - hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - break; - - case HAL_SPI_MSPINIT_CB_ID : - hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ - break; - - case HAL_SPI_MSPDEINIT_CB_ID : - hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ - break; - - default : - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_SPI_STATE_RESET == hspi->State) - { - switch (CallbackID) - { - case HAL_SPI_MSPINIT_CB_ID : - hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ - break; - - case HAL_SPI_MSPDEINIT_CB_ID : - hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ - break; - - default : - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); - - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hspi); - return status; -} -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @defgroup SPI_Exported_Functions_Group2 IO operation functions - * @brief Data transfers functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the SPI - data transfers. - - [..] The SPI supports master and slave mode : - - (#) There are two modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode: The communication is performed using Interrupts - or DMA, These APIs return the HAL status. - The end of the data processing will be indicated through the - dedicated SPI IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The HAL_SPI_TxCpltCallback(), HAL_SPI_RxCpltCallback() and HAL_SPI_TxRxCpltCallback() user callbacks - will be executed respectively at the end of the transmit or Receive process - The HAL_SPI_ErrorCallback()user callback will be executed when a communication error is detected - - (#) APIs provided for these 2 transfer modes (Blocking mode or Non blocking mode using either Interrupt or DMA) - exist for 1Line (simplex) and 2Lines (full duplex) modes. - -@endverbatim - * @{ - */ - -/** - * @brief Transmit an amount of data in blocking mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer (u8 or u16 data elements) - * @param Size amount of data elements (u8 or u16) to be sent - * @param Timeout Timeout duration in ms - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - uint32_t tickstart; - uint16_t initial_TxXferCount; - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - initial_TxXferCount = Size; - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_TX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pTxBuffPtr = (const uint8_t *)pData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->pRxBuffPtr = (uint8_t *)NULL; - hspi->RxXferSize = 0U; - hspi->RxXferCount = 0U; - hspi->TxISR = NULL; - hspi->RxISR = NULL; - - /* Configure communication direction : 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_TX(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Transmit data in 16 Bit mode */ - if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) - { - if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) - { - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - } - /* Transmit data in 16 Bit mode */ - while (hspi->TxXferCount > 0U) - { - /* Wait until TXE flag is set to send data */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) - { - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - } - else - { - /* Timeout management */ - if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - } - /* Transmit data in 8 Bit mode */ - else - { - if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) - { - *((__IO uint8_t *)&hspi->Instance->DR) = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint8_t); - hspi->TxXferCount--; - } - while (hspi->TxXferCount > 0U) - { - /* Wait until TXE flag is set to send data */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) - { - *((__IO uint8_t *)&hspi->Instance->DR) = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint8_t); - hspi->TxXferCount--; - } - else - { - /* Timeout management */ - if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - } -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_FLAG; - } - - /* Clear overrun flag in 2 Lines communication mode because received is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - - hspi->State = HAL_SPI_STATE_READY; - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - return HAL_ERROR; - } - else - { - return HAL_OK; - } -} - -/** - * @brief Receive an amount of data in blocking mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer (u8 or u16 data elements) - * @param Size amount of data elements (u8 or u16) to be received - * @param Timeout Timeout duration in ms - * @retval HAL status - * @note In master mode, if the direction is set to SPI_DIRECTION_2LINES - * the receive buffer is written to data register (DR) to generate - * clock pulses and receive data - */ -HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ -#if (USE_SPI_CRC != 0U) - __IO uint32_t tmpreg = 0U; -#endif /* USE_SPI_CRC */ - uint32_t tickstart; - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - if ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES)) - { - hspi->State = HAL_SPI_STATE_BUSY_RX; - /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ - return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout); - } - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_RX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pRxBuffPtr = (uint8_t *)pData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->pTxBuffPtr = (uint8_t *)NULL; - hspi->TxXferSize = 0U; - hspi->TxXferCount = 0U; - hspi->RxISR = NULL; - hspi->TxISR = NULL; - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - /* this is done to handle the CRCNEXT before the latest data */ - hspi->RxXferCount--; - } -#endif /* USE_SPI_CRC */ - - /* Configure communication direction: 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_RX(hspi); - } - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Receive data in 8 Bit mode */ - if (hspi->Init.DataSize == SPI_DATASIZE_8BIT) - { - /* Transfer loop */ - while (hspi->RxXferCount > 0U) - { - /* Check the RXNE flag */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) - { - /* read the received data */ - (* (uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR; - hspi->pRxBuffPtr += sizeof(uint8_t); - hspi->RxXferCount--; - } - else - { - /* Timeout management */ - if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - } - else - { - /* Transfer loop */ - while (hspi->RxXferCount > 0U) - { - /* Check the RXNE flag */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) - { - *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; - hspi->pRxBuffPtr += sizeof(uint16_t); - hspi->RxXferCount--; - } - else - { - /* Timeout management */ - if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - } - -#if (USE_SPI_CRC != 0U) - /* Handle the CRC Transmission */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* freeze the CRC before the latest data */ - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - - /* Read the latest data */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) - { - /* the latest data has not been received */ - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - - /* Receive last data in 16 Bit mode */ - if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) - { - *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; - } - /* Receive last data in 8 Bit mode */ - else - { - (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR; - } - - /* Wait the CRC data */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - - /* Read CRC to Flush DR and RXNE flag */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - } -#endif /* USE_SPI_CRC */ - - /* Check the end of the transaction */ - if (SPI_EndRxTransaction(hspi, Timeout, tickstart) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_FLAG; - } - -#if (USE_SPI_CRC != 0U) - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - } -#endif /* USE_SPI_CRC */ - - hspi->State = HAL_SPI_STATE_READY; - /* Unlock the process */ - __HAL_UNLOCK(hspi); - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - return HAL_ERROR; - } - else - { - return HAL_OK; - } -} - -/** - * @brief Transmit and Receive an amount of data in blocking mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pTxData pointer to transmission data buffer (u8 or u16 data elements) - * @param pRxData pointer to reception data buffer (u8 or u16 data elements) - * @param Size amount of data elements (u8 or u16) to be sent and received - * @param Timeout Timeout duration in ms - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size, uint32_t Timeout) -{ - uint16_t initial_TxXferCount; - uint32_t tmp_mode; - HAL_SPI_StateTypeDef tmp_state; - uint32_t tickstart; -#if (USE_SPI_CRC != 0U) - __IO uint32_t tmpreg = 0U; -#endif /* USE_SPI_CRC */ - - /* Variable used to alternate Rx and Tx during transfer */ - uint32_t txallowed = 1U; - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* Init temporary variables */ - tmp_state = hspi->State; - tmp_mode = hspi->Init.Mode; - initial_TxXferCount = Size; - - if (!((tmp_state == HAL_SPI_STATE_READY) || \ - ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && - (tmp_state == HAL_SPI_STATE_BUSY_RX)))) - { - return HAL_BUSY; - } - - if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ - if (hspi->State != HAL_SPI_STATE_BUSY_RX) - { - hspi->State = HAL_SPI_STATE_BUSY_TX_RX; - } - - /* Set the transaction information */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pRxBuffPtr = (uint8_t *)pRxData; - hspi->RxXferCount = Size; - hspi->RxXferSize = Size; - hspi->pTxBuffPtr = (const uint8_t *)pTxData; - hspi->TxXferCount = Size; - hspi->TxXferSize = Size; - - /*Init field not used in handle to zero */ - hspi->RxISR = NULL; - hspi->TxISR = NULL; - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Transmit and Receive data in 16 Bit mode */ - if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) - { - if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) - { - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - - } - while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) - { - /* Check TXE flag */ - if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U)) - { - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - /* Next Data is a reception (Rx). Tx not allowed */ - txallowed = 0U; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - } - - /* Check RXNE flag */ - if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U)) - { - *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; - hspi->pRxBuffPtr += sizeof(uint16_t); - hspi->RxXferCount--; - /* Next Data is a Transmission (Tx). Tx is allowed */ - txallowed = 1U; - } - if (((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - /* Transmit and Receive data in 8 Bit mode */ - else - { - if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) - { - *((__IO uint8_t *)&hspi->Instance->DR) = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint8_t); - hspi->TxXferCount--; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - } - while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) - { - /* Check TXE flag */ - if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U)) - { - *(__IO uint8_t *)&hspi->Instance->DR = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr++; - hspi->TxXferCount--; - /* Next Data is a reception (Rx). Tx not allowed */ - txallowed = 0U; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - } - - /* Wait until RXNE flag is reset */ - if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U)) - { - (*(uint8_t *)hspi->pRxBuffPtr) = hspi->Instance->DR; - hspi->pRxBuffPtr++; - hspi->RxXferCount--; - /* Next Data is a Transmission (Tx). Tx is allowed */ - txallowed = 1U; - } - if ((((HAL_GetTick() - tickstart) >= Timeout) && ((Timeout != HAL_MAX_DELAY))) || (Timeout == 0U)) - { - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - } - } - -#if (USE_SPI_CRC != 0U) - /* Read CRC from DR to close CRC calculation process */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Wait until TXE flag */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) - { - /* Error on the CRC reception */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - hspi->State = HAL_SPI_STATE_READY; - __HAL_UNLOCK(hspi); - return HAL_TIMEOUT; - } - /* Read CRC */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - } - - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - /* Clear CRC Flag */ - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } -#endif /* USE_SPI_CRC */ - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_FLAG; - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } - - /* Clear overrun flag in 2 Lines communication mode because received is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - - - hspi->State = HAL_SPI_STATE_READY; - /* Unlock the process */ - __HAL_UNLOCK(hspi); - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - return HAL_ERROR; - } - else - { - return HAL_OK; - } -} - -/** - * @brief Transmit an amount of data in non-blocking mode with Interrupt. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer (u8 or u16 data elements) - * @param Size amount of data elements (u8 or u16) to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size) -{ - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); - - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_TX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pTxBuffPtr = (const uint8_t *)pData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - - /* Init field not used in handle to zero */ - hspi->pRxBuffPtr = (uint8_t *)NULL; - hspi->RxXferSize = 0U; - hspi->RxXferCount = 0U; - hspi->RxISR = NULL; - - /* Set the function for IT treatment */ - if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) - { - hspi->TxISR = SPI_TxISR_16BIT; - } - else - { - hspi->TxISR = SPI_TxISR_8BIT; - } - - /* Configure communication direction : 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_TX(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - /* Enable TXE and ERR interrupt */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR)); - - return HAL_OK; -} - -/** - * @brief Receive an amount of data in non-blocking mode with Interrupt. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer (u8 or u16 data elements) - * @param Size amount of data elements (u8 or u16) to be received - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) -{ - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) - { - hspi->State = HAL_SPI_STATE_BUSY_RX; - /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ - return HAL_SPI_TransmitReceive_IT(hspi, pData, pData, Size); - } - - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_RX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pRxBuffPtr = (uint8_t *)pData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /* Init field not used in handle to zero */ - hspi->pTxBuffPtr = (uint8_t *)NULL; - hspi->TxXferSize = 0U; - hspi->TxXferCount = 0U; - hspi->TxISR = NULL; - - /* Set the function for IT treatment */ - if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) - { - hspi->RxISR = SPI_RxISR_16BIT; - } - else - { - hspi->RxISR = SPI_RxISR_8BIT; - } - - /* Configure communication direction : 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_RX(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Note : The SPI must be enabled after unlocking current process - to avoid the risk of SPI interrupt handle execution before current - process unlock */ - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - /* Enable RXNE and ERR interrupt */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - return HAL_OK; -} - -/** - * @brief Transmit and Receive an amount of data in non-blocking mode with Interrupt. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pTxData pointer to transmission data buffer (u8 or u16 data elements) - * @param pRxData pointer to reception data buffer (u8 or u16 data elements) - * @param Size amount of data elements (u8 or u16) to be sent and received - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size) -{ - uint32_t tmp_mode; - HAL_SPI_StateTypeDef tmp_state; - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); - - /* Init temporary variables */ - tmp_state = hspi->State; - tmp_mode = hspi->Init.Mode; - - if (!((tmp_state == HAL_SPI_STATE_READY) || \ - ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && - (tmp_state == HAL_SPI_STATE_BUSY_RX)))) - { - return HAL_BUSY; - } - - if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hspi); - - /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ - if (hspi->State != HAL_SPI_STATE_BUSY_RX) - { - hspi->State = HAL_SPI_STATE_BUSY_TX_RX; - } - - /* Set the transaction information */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pTxBuffPtr = (const uint8_t *)pTxData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - hspi->pRxBuffPtr = (uint8_t *)pRxData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /* Set the function for IT treatment */ - if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) - { - hspi->RxISR = SPI_2linesRxISR_16BIT; - hspi->TxISR = SPI_2linesTxISR_16BIT; - } - else - { - hspi->RxISR = SPI_2linesRxISR_8BIT; - hspi->TxISR = SPI_2linesTxISR_8BIT; - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - /* Enable TXE, RXNE and ERR interrupt */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); - - return HAL_OK; -} - -/** - * @brief Transmit an amount of data in non-blocking mode with DMA. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer (u8 or u16 data elements) - * @param Size amount of data elements (u8 or u16) to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size) -{ - - /* Check tx dma handle */ - assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_TX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pTxBuffPtr = (const uint8_t *)pData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - - /* Init field not used in handle to zero */ - hspi->pRxBuffPtr = (uint8_t *)NULL; - hspi->TxISR = NULL; - hspi->RxISR = NULL; - hspi->RxXferSize = 0U; - hspi->RxXferCount = 0U; - - /* Configure communication direction : 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_TX(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Set the SPI TxDMA Half transfer complete callback */ - hspi->hdmatx->XferHalfCpltCallback = SPI_DMAHalfTransmitCplt; - - /* Set the SPI TxDMA transfer complete callback */ - hspi->hdmatx->XferCpltCallback = SPI_DMATransmitCplt; - - /* Set the DMA error callback */ - hspi->hdmatx->XferErrorCallback = SPI_DMAError; - - /* Set the DMA AbortCpltCallback */ - hspi->hdmatx->XferAbortCallback = NULL; - - /* Enable the Tx DMA Stream/Channel */ - if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, - hspi->TxXferCount)) - { - /* Update SPI error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Enable the SPI Error Interrupt Bit */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); - - /* Enable Tx DMA Request */ - SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); - - return HAL_OK; -} - -/** - * @brief Receive an amount of data in non-blocking mode with DMA. - * @note In case of MASTER mode and SPI_DIRECTION_2LINES direction, hdmatx shall be defined. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData pointer to data buffer (u8 or u16 data elements) - * @note When the CRC feature is enabled the pData Length must be Size + 1. - * @param Size amount of data elements (u8 or u16) to be received - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) -{ - /* Check rx dma handle */ - assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx)); - - if (hspi->State != HAL_SPI_STATE_READY) - { - return HAL_BUSY; - } - - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) - { - hspi->State = HAL_SPI_STATE_BUSY_RX; - - /* Check tx dma handle */ - assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); - - /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ - return HAL_SPI_TransmitReceive_DMA(hspi, pData, pData, Size); - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Set the transaction information */ - hspi->State = HAL_SPI_STATE_BUSY_RX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pRxBuffPtr = (uint8_t *)pData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->RxISR = NULL; - hspi->TxISR = NULL; - hspi->TxXferSize = 0U; - hspi->TxXferCount = 0U; - - /* Configure communication direction : 1Line */ - if (hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ - __HAL_SPI_DISABLE(hspi); - SPI_1LINE_RX(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Set the SPI RxDMA Half transfer complete callback */ - hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt; - - /* Set the SPI Rx DMA transfer complete callback */ - hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; - - /* Set the DMA error callback */ - hspi->hdmarx->XferErrorCallback = SPI_DMAError; - - /* Set the DMA AbortCpltCallback */ - hspi->hdmarx->XferAbortCallback = NULL; - - /* Enable the Rx DMA Stream/Channel */ - if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, - hspi->RxXferCount)) - { - /* Update SPI error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Enable the SPI Error Interrupt Bit */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); - - /* Enable Rx DMA Request */ - SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); - - return HAL_OK; -} - -/** - * @brief Transmit and Receive an amount of data in non-blocking mode with DMA. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pTxData pointer to transmission data buffer (u8 or u16 data elements) - * @param pRxData pointer to reception data buffer (u8 or u16 data elements) - * @note When the CRC feature is enabled the pRxData Length must be Size + 1 - * @param Size amount of data elements (u8 or u16) to be sent and received - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, - uint16_t Size) -{ - uint32_t tmp_mode; - HAL_SPI_StateTypeDef tmp_state; - - /* Check rx & tx dma handles */ - assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx)); - assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); - - /* Check Direction parameter */ - assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); - - /* Init temporary variables */ - tmp_state = hspi->State; - tmp_mode = hspi->Init.Mode; - - if (!((tmp_state == HAL_SPI_STATE_READY) || - ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && - (tmp_state == HAL_SPI_STATE_BUSY_RX)))) - { - return HAL_BUSY; - } - - if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hspi); - - /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ - if (hspi->State != HAL_SPI_STATE_BUSY_RX) - { - hspi->State = HAL_SPI_STATE_BUSY_TX_RX; - } - - /* Set the transaction information */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->pTxBuffPtr = (const uint8_t *)pTxData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - hspi->pRxBuffPtr = (uint8_t *)pRxData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /* Init field not used in handle to zero */ - hspi->RxISR = NULL; - hspi->TxISR = NULL; - -#if (USE_SPI_CRC != 0U) - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } -#endif /* USE_SPI_CRC */ - - /* Check if we are in Rx only or in Rx/Tx Mode and configure the DMA transfer complete callback */ - if (hspi->State == HAL_SPI_STATE_BUSY_RX) - { - /* Set the SPI Rx DMA Half transfer complete callback */ - hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt; - hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; - } - else - { - /* Set the SPI Tx/Rx DMA Half transfer complete callback */ - hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfTransmitReceiveCplt; - hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt; - } - - /* Set the DMA error callback */ - hspi->hdmarx->XferErrorCallback = SPI_DMAError; - - /* Set the DMA AbortCpltCallback */ - hspi->hdmarx->XferAbortCallback = NULL; - - /* Enable the Rx DMA Stream/Channel */ - if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, - hspi->RxXferCount)) - { - /* Update SPI error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } - - /* Enable Rx DMA Request */ - SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); - - /* Set the SPI Tx DMA transfer complete callback as NULL because the communication closing - is performed in DMA reception complete callback */ - hspi->hdmatx->XferHalfCpltCallback = NULL; - hspi->hdmatx->XferCpltCallback = NULL; - hspi->hdmatx->XferErrorCallback = NULL; - hspi->hdmatx->XferAbortCallback = NULL; - - /* Enable the Tx DMA Stream/Channel */ - if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, - hspi->TxXferCount)) - { - /* Update SPI error code */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - return HAL_ERROR; - } - - /* Check if the SPI is already enabled */ - if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Enable the SPI Error Interrupt Bit */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); - - /* Enable Tx DMA Request */ - SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); - - return HAL_OK; -} - -/** - * @brief Abort ongoing transfer (blocking mode). - * @param hspi SPI handle. - * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), - * started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable SPI Interrupts (depending of transfer direction) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) - * - Set handle State to READY - * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi) -{ - HAL_StatusTypeDef errorcode; - __IO uint32_t count; - __IO uint32_t resetcount; - - /* Initialized local variable */ - errorcode = HAL_OK; - resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - count = resetcount; - - /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE); - - /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)) - { - hspi->TxISR = SPI_AbortTx_ISR; - /* Wait HAL_SPI_STATE_ABORT state */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while (hspi->State != HAL_SPI_STATE_ABORT); - /* Reset Timeout Counter */ - count = resetcount; - } - - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) - { - hspi->RxISR = SPI_AbortRx_ISR; - /* Wait HAL_SPI_STATE_ABORT state */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while (hspi->State != HAL_SPI_STATE_ABORT); - /* Reset Timeout Counter */ - count = resetcount; - } - - /* Disable the SPI DMA Tx request if enabled */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) - { - /* Abort the SPI DMA Tx Stream/Channel : use blocking DMA Abort API (no callback) */ - if (hspi->hdmatx != NULL) - { - /* Set the SPI DMA Abort callback : - will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */ - hspi->hdmatx->XferAbortCallback = NULL; - - /* Abort DMA Tx Handle linked to SPI Peripheral */ - if (HAL_DMA_Abort(hspi->hdmatx) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_ABORT; - } - - /* Disable Tx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN)); - - /* Wait until TXE flag is set */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); - } - } - - /* Disable the SPI DMA Rx request if enabled */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) - { - /* Abort the SPI DMA Rx Stream/Channel : use blocking DMA Abort API (no callback) */ - if (hspi->hdmarx != NULL) - { - /* Set the SPI DMA Abort callback : - will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */ - hspi->hdmarx->XferAbortCallback = NULL; - - /* Abort DMA Rx Handle linked to SPI Peripheral */ - if (HAL_DMA_Abort(hspi->hdmarx) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_ABORT; - } - - /* Disable peripheral */ - __HAL_SPI_DISABLE(hspi); - - /* Disable Rx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXDMAEN)); - } - } - /* Reset Tx and Rx transfer counters */ - hspi->RxXferCount = 0U; - hspi->TxXferCount = 0U; - - /* Check error during Abort procedure */ - if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT) - { - /* return HAL_Error in case of error during Abort procedure */ - errorcode = HAL_ERROR; - } - else - { - /* Reset errorCode */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - } - - /* Clear the Error flags in the SR register */ - __HAL_SPI_CLEAR_OVRFLAG(hspi); - __HAL_SPI_CLEAR_FREFLAG(hspi); - - /* Restore hspi->state to ready */ - hspi->State = HAL_SPI_STATE_READY; - - return errorcode; -} - -/** - * @brief Abort ongoing transfer (Interrupt mode). - * @param hspi SPI handle. - * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), - * started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable SPI Interrupts (depending of transfer direction) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) - * - Set handle State to READY - * - At abort completion, call user abort complete callback - * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be - * considered as completed only when user abort complete callback is executed (not when exiting function). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi) -{ - HAL_StatusTypeDef errorcode; - uint32_t abortcplt ; - __IO uint32_t count; - __IO uint32_t resetcount; - - /* Initialized local variable */ - errorcode = HAL_OK; - abortcplt = 1U; - resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - count = resetcount; - - /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE); - - /* Change Rx and Tx Irq Handler to Disable TXEIE, RXNEIE and ERRIE interrupts */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)) - { - hspi->TxISR = SPI_AbortTx_ISR; - /* Wait HAL_SPI_STATE_ABORT state */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while (hspi->State != HAL_SPI_STATE_ABORT); - /* Reset Timeout Counter */ - count = resetcount; - } - - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) - { - hspi->RxISR = SPI_AbortRx_ISR; - /* Wait HAL_SPI_STATE_ABORT state */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while (hspi->State != HAL_SPI_STATE_ABORT); - /* Reset Timeout Counter */ - count = resetcount; - } - - /* If DMA Tx and/or DMA Rx Handles are associated to SPI Handle, DMA Abort complete callbacks should be initialised - before any call to DMA Abort functions */ - /* DMA Tx Handle is valid */ - if (hspi->hdmatx != NULL) - { - /* Set DMA Abort Complete callback if UART DMA Tx request if enabled. - Otherwise, set it to NULL */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) - { - hspi->hdmatx->XferAbortCallback = SPI_DMATxAbortCallback; - } - else - { - hspi->hdmatx->XferAbortCallback = NULL; - } - } - /* DMA Rx Handle is valid */ - if (hspi->hdmarx != NULL) - { - /* Set DMA Abort Complete callback if UART DMA Rx request if enabled. - Otherwise, set it to NULL */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) - { - hspi->hdmarx->XferAbortCallback = SPI_DMARxAbortCallback; - } - else - { - hspi->hdmarx->XferAbortCallback = NULL; - } - } - - /* Disable the SPI DMA Tx request if enabled */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) - { - /* Abort the SPI DMA Tx Stream/Channel */ - if (hspi->hdmatx != NULL) - { - /* Abort DMA Tx Handle linked to SPI Peripheral */ - if (HAL_DMA_Abort_IT(hspi->hdmatx) != HAL_OK) - { - hspi->hdmatx->XferAbortCallback = NULL; - hspi->ErrorCode = HAL_SPI_ERROR_ABORT; - } - else - { - abortcplt = 0U; - } - } - } - /* Disable the SPI DMA Rx request if enabled */ - if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) - { - /* Abort the SPI DMA Rx Stream/Channel */ - if (hspi->hdmarx != NULL) - { - /* Abort DMA Rx Handle linked to SPI Peripheral */ - if (HAL_DMA_Abort_IT(hspi->hdmarx) != HAL_OK) - { - hspi->hdmarx->XferAbortCallback = NULL; - hspi->ErrorCode = HAL_SPI_ERROR_ABORT; - } - else - { - abortcplt = 0U; - } - } - } - - if (abortcplt == 1U) - { - /* Reset Tx and Rx transfer counters */ - hspi->RxXferCount = 0U; - hspi->TxXferCount = 0U; - - /* Check error during Abort procedure */ - if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT) - { - /* return HAL_Error in case of error during Abort procedure */ - errorcode = HAL_ERROR; - } - else - { - /* Reset errorCode */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - } - - /* Clear the Error flags in the SR register */ - __HAL_SPI_CLEAR_OVRFLAG(hspi); - __HAL_SPI_CLEAR_FREFLAG(hspi); - - /* Restore hspi->State to Ready */ - hspi->State = HAL_SPI_STATE_READY; - - /* As no DMA to be aborted, call directly user Abort complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->AbortCpltCallback(hspi); -#else - HAL_SPI_AbortCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - - return errorcode; -} - -/** - * @brief Pause the DMA Transfer. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi) -{ - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Disable the SPI DMA Tx & Rx requests */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_OK; -} - -/** - * @brief Resume the DMA Transfer. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi) -{ - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Enable the SPI DMA Tx & Rx requests */ - SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_OK; -} - -/** - * @brief Stop the DMA Transfer. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi) -{ - HAL_StatusTypeDef errorcode = HAL_OK; - /* The Lock is not implemented on this API to allow the user application - to call the HAL SPI API under callbacks HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or - HAL_SPI_TxRxCpltCallback(): - when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated - and the correspond call back is executed HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or - HAL_SPI_TxRxCpltCallback() - */ - - /* Abort the SPI DMA tx Stream/Channel */ - if (hspi->hdmatx != NULL) - { - if (HAL_OK != HAL_DMA_Abort(hspi->hdmatx)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - errorcode = HAL_ERROR; - } - } - /* Abort the SPI DMA rx Stream/Channel */ - if (hspi->hdmarx != NULL) - { - if (HAL_OK != HAL_DMA_Abort(hspi->hdmarx)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - errorcode = HAL_ERROR; - } - } - - /* Disable the SPI DMA Tx & Rx requests */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - hspi->State = HAL_SPI_STATE_READY; - return errorcode; -} - -/** - * @brief Handle SPI interrupt request. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI module. - * @retval None - */ -void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi) -{ - uint32_t itsource = hspi->Instance->CR2; - uint32_t itflag = hspi->Instance->SR; - - /* SPI in mode Receiver ----------------------------------------------------*/ - if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) == RESET) && - (SPI_CHECK_FLAG(itflag, SPI_FLAG_RXNE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_RXNE) != RESET)) - { - hspi->RxISR(hspi); - return; - } - - /* SPI in mode Transmitter -------------------------------------------------*/ - if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_TXE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_TXE) != RESET)) - { - hspi->TxISR(hspi); - return; - } - - /* SPI in Error Treatment --------------------------------------------------*/ - if (((SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET) || (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET) - || (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET)) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_ERR) != RESET)) - { - /* SPI Overrun error interrupt occurred ----------------------------------*/ - if (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET) - { - if (hspi->State != HAL_SPI_STATE_BUSY_TX) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_OVR); - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - else - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - return; - } - } - - /* SPI Mode Fault error interrupt occurred -------------------------------*/ - if (SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_MODF); - __HAL_SPI_CLEAR_MODFFLAG(hspi); - } - - /* SPI Frame error interrupt occurred ------------------------------------*/ - if (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FRE); - __HAL_SPI_CLEAR_FREFLAG(hspi); - } - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - /* Disable all interrupts */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE | SPI_IT_TXE | SPI_IT_ERR); - - hspi->State = HAL_SPI_STATE_READY; - /* Disable the SPI DMA requests if enabled */ - if ((HAL_IS_BIT_SET(itsource, SPI_CR2_TXDMAEN)) || (HAL_IS_BIT_SET(itsource, SPI_CR2_RXDMAEN))) - { - CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN)); - - /* Abort the SPI DMA Rx channel */ - if (hspi->hdmarx != NULL) - { - /* Set the SPI DMA Abort callback : - will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */ - hspi->hdmarx->XferAbortCallback = SPI_DMAAbortOnError; - if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmarx)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - } - } - /* Abort the SPI DMA Tx channel */ - if (hspi->hdmatx != NULL) - { - /* Set the SPI DMA Abort callback : - will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */ - hspi->hdmatx->XferAbortCallback = SPI_DMAAbortOnError; - if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmatx)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - } - } - } - else - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - } - return; - } -} - -/** - * @brief Tx Transfer completed callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_TxCpltCallback should be implemented in the user file - */ -} - -/** - * @brief Rx Transfer completed callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_RxCpltCallback should be implemented in the user file - */ -} - -/** - * @brief Tx and Rx Transfer completed callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_TxRxCpltCallback should be implemented in the user file - */ -} - -/** - * @brief Tx Half Transfer completed callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_TxHalfCpltCallback should be implemented in the user file - */ -} - -/** - * @brief Rx Half Transfer completed callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_RxHalfCpltCallback() should be implemented in the user file - */ -} - -/** - * @brief Tx and Rx Half Transfer callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_TxRxHalfCpltCallback() should be implemented in the user file - */ -} - -/** - * @brief SPI error callback. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_ErrorCallback should be implemented in the user file - */ - /* NOTE : The ErrorCode parameter in the hspi handle is updated by the SPI processes - and user can use HAL_SPI_GetError() API to check the latest error occurred - */ -} - -/** - * @brief SPI Abort Complete callback. - * @param hspi SPI handle. - * @retval None - */ -__weak void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hspi); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_SPI_AbortCpltCallback can be implemented in the user file. - */ -} - -/** - * @} - */ - -/** @defgroup SPI_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief SPI control functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the SPI. - (+) HAL_SPI_GetState() API can be helpful to check in run-time the state of the SPI peripheral - (+) HAL_SPI_GetError() check in run-time Errors occurring during communication -@endverbatim - * @{ - */ - -/** - * @brief Return the SPI handle state. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval SPI state - */ -HAL_SPI_StateTypeDef HAL_SPI_GetState(const SPI_HandleTypeDef *hspi) -{ - /* Return SPI handle state */ - return hspi->State; -} - -/** - * @brief Return the SPI error code. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval SPI error code in bitmap format - */ -uint32_t HAL_SPI_GetError(const SPI_HandleTypeDef *hspi) -{ - /* Return SPI ErrorCode */ - return hspi->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup SPI_Private_Functions - * @brief Private functions - * @{ - */ - -/** - * @brief DMA SPI transmit process complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); - uint32_t tickstart; - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* DMA Normal Mode */ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) != DMA_SxCR_CIRC) - { - /* Disable ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); - - /* Disable Tx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - } - - /* Clear overrun flag in 2 Lines communication mode because received data is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - - hspi->TxXferCount = 0U; - hspi->State = HAL_SPI_STATE_READY; - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - return; - } - } - /* Call user Tx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxCpltCallback(hspi); -#else - HAL_SPI_TxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI receive process complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); - uint32_t tickstart; -#if (USE_SPI_CRC != 0U) - __IO uint32_t tmpreg = 0U; -#endif /* USE_SPI_CRC */ - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* DMA Normal Mode */ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) != DMA_SxCR_CIRC) - { - /* Disable ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); - -#if (USE_SPI_CRC != 0U) - /* CRC handling */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Wait until RXNE flag */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - /* Error on the CRC reception */ - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - } - /* Read CRC */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - } -#endif /* USE_SPI_CRC */ - - /* Check if we are in Master RX 2 line mode */ - if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) - { - /* Disable Rx/Tx DMA Request (done by default to handle the case master rx direction 2 lines) */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - } - else - { - /* Normal case */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); - } - - /* Check the end of the transaction */ - if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - hspi->ErrorCode = HAL_SPI_ERROR_FLAG; - } - - hspi->RxXferCount = 0U; - hspi->State = HAL_SPI_STATE_READY; - -#if (USE_SPI_CRC != 0U) - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - } -#endif /* USE_SPI_CRC */ - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - return; - } - } - /* Call user Rx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->RxCpltCallback(hspi); -#else - HAL_SPI_RxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI transmit receive process complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); - uint32_t tickstart; -#if (USE_SPI_CRC != 0U) - __IO uint32_t tmpreg = 0U; -#endif /* USE_SPI_CRC */ - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* DMA Normal Mode */ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) != DMA_SxCR_CIRC) - { - /* Disable ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); - -#if (USE_SPI_CRC != 0U) - /* CRC handling */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Wait the CRC data */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - } - /* Read CRC to Flush DR and RXNE flag */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - } -#endif /* USE_SPI_CRC */ - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - } - - /* Disable Rx/Tx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - - hspi->TxXferCount = 0U; - hspi->RxXferCount = 0U; - hspi->State = HAL_SPI_STATE_READY; - -#if (USE_SPI_CRC != 0U) - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - } -#endif /* USE_SPI_CRC */ - - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - return; - } - } - /* Call user TxRx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxRxCpltCallback(hspi); -#else - HAL_SPI_TxRxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI half transmit process complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); - - /* Call user Tx half complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxHalfCpltCallback(hspi); -#else - HAL_SPI_TxHalfCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI half receive process complete callback - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); - - /* Call user Rx half complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->RxHalfCpltCallback(hspi); -#else - HAL_SPI_RxHalfCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI half transmit receive process complete callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); - - /* Call user TxRx half complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxRxHalfCpltCallback(hspi); -#else - HAL_SPI_TxRxHalfCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI communication error callback. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAError(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); - - /* Stop the disable DMA transfer on SPI side */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); - - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); - hspi->State = HAL_SPI_STATE_READY; - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI communication abort callback, when initiated by HAL services on Error - * (To be called at end of DMA Abort procedure following error occurrence). - * @param hdma DMA handle. - * @retval None - */ -static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); - hspi->RxXferCount = 0U; - hspi->TxXferCount = 0U; - - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI Tx communication abort callback, when initiated by user - * (To be called at end of DMA Tx Abort procedure following user abort request). - * @note When this callback is executed, User Abort complete call back is called only if no - * Abort still ongoing for Rx DMA Handle. - * @param hdma DMA handle. - * @retval None - */ -static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); - __IO uint32_t count; - - hspi->hdmatx->XferAbortCallback = NULL; - count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - - /* Disable Tx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); - - /* Wait until TXE flag is set */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); - - /* Check if an Abort process is still ongoing */ - if (hspi->hdmarx != NULL) - { - if (hspi->hdmarx->XferAbortCallback != NULL) - { - return; - } - } - - /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */ - hspi->RxXferCount = 0U; - hspi->TxXferCount = 0U; - - /* Check no error during Abort procedure */ - if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT) - { - /* Reset errorCode */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - } - - /* Clear the Error flags in the SR register */ - __HAL_SPI_CLEAR_OVRFLAG(hspi); - __HAL_SPI_CLEAR_FREFLAG(hspi); - - /* Restore hspi->State to Ready */ - hspi->State = HAL_SPI_STATE_READY; - - /* Call user Abort complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->AbortCpltCallback(hspi); -#else - HAL_SPI_AbortCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SPI Rx communication abort callback, when initiated by user - * (To be called at end of DMA Rx Abort procedure following user abort request). - * @note When this callback is executed, User Abort complete call back is called only if no - * Abort still ongoing for Tx DMA Handle. - * @param hdma DMA handle. - * @retval None - */ -static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); - - /* Disable SPI Peripheral */ - __HAL_SPI_DISABLE(hspi); - - hspi->hdmarx->XferAbortCallback = NULL; - - /* Disable Rx DMA Request */ - CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); - - /* Check Busy flag */ - if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - } - - /* Check if an Abort process is still ongoing */ - if (hspi->hdmatx != NULL) - { - if (hspi->hdmatx->XferAbortCallback != NULL) - { - return; - } - } - - /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */ - hspi->RxXferCount = 0U; - hspi->TxXferCount = 0U; - - /* Check no error during Abort procedure */ - if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT) - { - /* Reset errorCode */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - } - - /* Clear the Error flags in the SR register */ - __HAL_SPI_CLEAR_OVRFLAG(hspi); - __HAL_SPI_CLEAR_FREFLAG(hspi); - - /* Restore hspi->State to Ready */ - hspi->State = HAL_SPI_STATE_READY; - - /* Call user Abort complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->AbortCpltCallback(hspi); -#else - HAL_SPI_AbortCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ -} - -/** - * @brief Rx 8-bit handler for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi) -{ - /* Receive data in 8bit mode */ - *hspi->pRxBuffPtr = *((__IO uint8_t *)&hspi->Instance->DR); - hspi->pRxBuffPtr++; - hspi->RxXferCount--; - - /* Check end of the reception */ - if (hspi->RxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->RxISR = SPI_2linesRxISR_8BITCRC; - return; - } -#endif /* USE_SPI_CRC */ - - /* Disable RXNE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - if (hspi->TxXferCount == 0U) - { - SPI_CloseRxTx_ISR(hspi); - } - } -} - -#if (USE_SPI_CRC != 0U) -/** - * @brief Rx 8-bit handler for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi) -{ - __IO uint8_t *ptmpreg8; - __IO uint8_t tmpreg8 = 0; - - /* Initialize the 8bit temporary pointer */ - ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; - /* Read 8bit CRC to flush Data Register */ - tmpreg8 = *ptmpreg8; - /* To avoid GCC warning */ - UNUSED(tmpreg8); - - /* Disable RXNE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - if (hspi->TxXferCount == 0U) - { - SPI_CloseRxTx_ISR(hspi); - } -} -#endif /* USE_SPI_CRC */ - -/** - * @brief Tx 8-bit handler for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi) -{ - *(__IO uint8_t *)&hspi->Instance->DR = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr++; - hspi->TxXferCount--; - - /* Check the end of the transmission */ - if (hspi->TxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Set CRC Next Bit to send CRC */ - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - /* Disable TXE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); - return; - } -#endif /* USE_SPI_CRC */ - - /* Disable TXE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); - - if (hspi->RxXferCount == 0U) - { - SPI_CloseRxTx_ISR(hspi); - } - } -} - -/** - * @brief Rx 16-bit handler for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi) -{ - /* Receive data in 16 Bit mode */ - *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); - hspi->pRxBuffPtr += sizeof(uint16_t); - hspi->RxXferCount--; - - if (hspi->RxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->RxISR = SPI_2linesRxISR_16BITCRC; - return; - } -#endif /* USE_SPI_CRC */ - - /* Disable RXNE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE); - - if (hspi->TxXferCount == 0U) - { - SPI_CloseRxTx_ISR(hspi); - } - } -} - -#if (USE_SPI_CRC != 0U) -/** - * @brief Manage the CRC 16-bit receive for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi) -{ - __IO uint32_t tmpreg = 0U; - - /* Read 16bit CRC to flush Data Register */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - - /* Disable RXNE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE); - - SPI_CloseRxTx_ISR(hspi); -} -#endif /* USE_SPI_CRC */ - -/** - * @brief Tx 16-bit handler for Transmit and Receive in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi) -{ - /* Transmit data in 16 Bit mode */ - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - - /* Enable CRC Transmission */ - if (hspi->TxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Set CRC Next Bit to send CRC */ - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - /* Disable TXE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); - return; - } -#endif /* USE_SPI_CRC */ - - /* Disable TXE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); - - if (hspi->RxXferCount == 0U) - { - SPI_CloseRxTx_ISR(hspi); - } - } -} - -#if (USE_SPI_CRC != 0U) -/** - * @brief Manage the CRC 8-bit receive in Interrupt context. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi) -{ - __IO uint8_t *ptmpreg8; - __IO uint8_t tmpreg8 = 0; - - /* Initialize the 8bit temporary pointer */ - ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; - /* Read 8bit CRC to flush Data Register */ - tmpreg8 = *ptmpreg8; - /* To avoid GCC warning */ - UNUSED(tmpreg8); - - SPI_CloseRx_ISR(hspi); -} -#endif /* USE_SPI_CRC */ - -/** - * @brief Manage the receive 8-bit in Interrupt context. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi) -{ - *hspi->pRxBuffPtr = (*(__IO uint8_t *)&hspi->Instance->DR); - hspi->pRxBuffPtr++; - hspi->RxXferCount--; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - - if (hspi->RxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->RxISR = SPI_RxISR_8BITCRC; - return; - } -#endif /* USE_SPI_CRC */ - SPI_CloseRx_ISR(hspi); - } -} - -#if (USE_SPI_CRC != 0U) -/** - * @brief Manage the CRC 16-bit receive in Interrupt context. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi) -{ - __IO uint32_t tmpreg = 0U; - - /* Read 16bit CRC to flush Data Register */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - - /* Disable RXNE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - SPI_CloseRx_ISR(hspi); -} -#endif /* USE_SPI_CRC */ - -/** - * @brief Manage the 16-bit receive in Interrupt context. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi) -{ - *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); - hspi->pRxBuffPtr += sizeof(uint16_t); - hspi->RxXferCount--; - -#if (USE_SPI_CRC != 0U) - /* Enable CRC Transmission */ - if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - - if (hspi->RxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->RxISR = SPI_RxISR_16BITCRC; - return; - } -#endif /* USE_SPI_CRC */ - SPI_CloseRx_ISR(hspi); - } -} - -/** - * @brief Handle the data 8-bit transmit in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi) -{ - *(__IO uint8_t *)&hspi->Instance->DR = *((const uint8_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr++; - hspi->TxXferCount--; - - if (hspi->TxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Enable CRC Transmission */ - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - SPI_CloseTx_ISR(hspi); - } -} - -/** - * @brief Handle the data 16-bit transmit in Interrupt mode. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi) -{ - /* Transmit data in 16 Bit mode */ - hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); - hspi->pTxBuffPtr += sizeof(uint16_t); - hspi->TxXferCount--; - - if (hspi->TxXferCount == 0U) - { -#if (USE_SPI_CRC != 0U) - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Enable CRC Transmission */ - SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); - } -#endif /* USE_SPI_CRC */ - SPI_CloseTx_ISR(hspi); - } -} - -/** - * @brief Handle SPI Communication Timeout. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param Flag SPI flag to check - * @param State flag state to check - * @param Timeout Timeout duration - * @param Tickstart tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State, - uint32_t Timeout, uint32_t Tickstart) -{ - __IO uint32_t count; - uint32_t tmp_timeout; - uint32_t tmp_tickstart; - - /* Adjust Timeout value in case of end of transfer */ - tmp_timeout = Timeout - (HAL_GetTick() - Tickstart); - tmp_tickstart = HAL_GetTick(); - - /* Calculate Timeout based on a software loop to avoid blocking issue if Systick is disabled */ - count = tmp_timeout * ((SystemCoreClock * 32U) >> 20U); - - while ((__HAL_SPI_GET_FLAG(hspi, Flag) ? SET : RESET) != State) - { - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - tmp_tickstart) >= tmp_timeout) || (tmp_timeout == 0U)) - { - /* Disable the SPI and reset the CRC: the CRC value should be cleared - on both master and slave sides in order to resynchronize the master - and slave for their respective CRC calculation */ - - /* Disable TXE, RXNE and ERR interrupts for the interrupt process */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); - - if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) - || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) - { - /* Disable SPI peripheral */ - __HAL_SPI_DISABLE(hspi); - } - - /* Reset CRC Calculation */ - if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } - - hspi->State = HAL_SPI_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_TIMEOUT; - } - /* If Systick is disabled or not incremented, deactivate timeout to go in disable loop procedure */ - if (count == 0U) - { - tmp_timeout = 0U; - } - else - { - count--; - } - } - } - - return HAL_OK; -} - -/** - * @brief Handle the check of the RX transaction complete. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param Timeout Timeout duration - * @param Tickstart tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart) -{ - if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) - || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) - { - /* Disable SPI peripheral */ - __HAL_SPI_DISABLE(hspi); - } - - /* Erratasheet: BSY bit may stay high at the end of a data transfer in Slave mode */ - if (hspi->Init.Mode == SPI_MODE_MASTER) - { - if (hspi->Init.Direction != SPI_DIRECTION_2LINES_RXONLY) - { - /* Control the BSY flag */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - return HAL_TIMEOUT; - } - } - else - { - /* Wait the RXNE reset */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout, Tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - return HAL_TIMEOUT; - } - } - } - else - { - /* Wait the RXNE reset */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout, Tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Handle the check of the RXTX or TX transaction complete. - * @param hspi SPI handle - * @param Timeout Timeout duration - * @param Tickstart tick start value - * @retval HAL status - */ -static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart) -{ - __IO uint32_t count; - - /* Wait until TXE flag */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_TXE, SET, Timeout, Tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - return HAL_TIMEOUT; - } - - /* Timeout in us */ - count = SPI_BSY_FLAG_WORKAROUND_TIMEOUT * (SystemCoreClock / 24U / 1000000U); - /* Erratasheet: BSY bit may stay high at the end of a data transfer in Slave mode */ - if (hspi->Init.Mode == SPI_MODE_MASTER) - { - /* Control the BSY flag */ - if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - return HAL_TIMEOUT; - } - } - else - { - /* Wait BSY flag during 1 Byte time transfer in case of Full-Duplex and Tx transfer - * If Timeout is reached, the transfer is considered as finish. - * User have to calculate the timeout value to fit with the time of 1 byte transfer. - * This time is directly link with the SPI clock from Master device. - */ - do - { - if (count == 0U) - { - break; - } - count--; - } while (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_BSY) != RESET); - } - - return HAL_OK; -} - -/** - * @brief Handle the end of the RXTX transaction. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi) -{ - uint32_t tickstart; - __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - - /* Init tickstart for timeout management */ - tickstart = HAL_GetTick(); - - /* Disable ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); - - /* Wait until TXE flag is set */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - break; - } - count--; - } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - } - - /* Clear overrun flag in 2 Lines communication mode because received is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - -#if (USE_SPI_CRC != 0U) - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) - { - hspi->State = HAL_SPI_STATE_READY; - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - else - { -#endif /* USE_SPI_CRC */ - if (hspi->ErrorCode == HAL_SPI_ERROR_NONE) - { - if (hspi->State == HAL_SPI_STATE_BUSY_RX) - { - hspi->State = HAL_SPI_STATE_READY; - /* Call user Rx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->RxCpltCallback(hspi); -#else - HAL_SPI_RxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - else - { - hspi->State = HAL_SPI_STATE_READY; - /* Call user TxRx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxRxCpltCallback(hspi); -#else - HAL_SPI_TxRxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - } - else - { - hspi->State = HAL_SPI_STATE_READY; - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } -#if (USE_SPI_CRC != 0U) - } -#endif /* USE_SPI_CRC */ -} - -/** - * @brief Handle the end of the RX transaction. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi) -{ - /* Disable RXNE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - /* Check the end of the transaction */ - if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - } - - /* Clear overrun flag in 2 Lines communication mode because received is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - hspi->State = HAL_SPI_STATE_READY; - -#if (USE_SPI_CRC != 0U) - /* Check if CRC error occurred */ - if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - else - { -#endif /* USE_SPI_CRC */ - if (hspi->ErrorCode == HAL_SPI_ERROR_NONE) - { - /* Call user Rx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->RxCpltCallback(hspi); -#else - HAL_SPI_RxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - else - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } -#if (USE_SPI_CRC != 0U) - } -#endif /* USE_SPI_CRC */ -} - -/** - * @brief Handle the end of the TX transaction. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi) -{ - uint32_t tickstart; - __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - - /* Init tickstart for timeout management*/ - tickstart = HAL_GetTick(); - - /* Wait until TXE flag is set */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - break; - } - count--; - } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); - - /* Disable TXE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR)); - - /* Check the end of the transaction */ - if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); - } - - /* Clear overrun flag in 2 Lines communication mode because received is not read */ - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - - hspi->State = HAL_SPI_STATE_READY; - if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - /* Call user error callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->ErrorCallback(hspi); -#else - HAL_SPI_ErrorCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } - else - { - /* Call user Rx complete callback */ -#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) - hspi->TxCpltCallback(hspi); -#else - HAL_SPI_TxCpltCallback(hspi); -#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ - } -} - -/** - * @brief Handle abort a Rx transaction. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi) -{ - __IO uint32_t tmpreg = 0U; - __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); - - /* Wait until TXE flag is set */ - do - { - if (count == 0U) - { - SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); - break; - } - count--; - } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); - - /* Disable SPI Peripheral */ - __HAL_SPI_DISABLE(hspi); - - /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */ - CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE | SPI_CR2_RXNEIE | SPI_CR2_ERRIE)); - - /* Flush Data Register by a blank read */ - tmpreg = READ_REG(hspi->Instance->DR); - /* To avoid GCC warning */ - UNUSED(tmpreg); - - hspi->State = HAL_SPI_STATE_ABORT; -} - -/** - * @brief Handle abort a Tx or Rx/Tx transaction. - * @param hspi pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi) -{ - /* Disable TXEIE interrupt */ - CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE)); - - /* Disable SPI Peripheral */ - __HAL_SPI_DISABLE(hspi); - - hspi->State = HAL_SPI_STATE_ABORT; -} - -/** - * @} - */ - -#endif /* HAL_SPI_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.c deleted file mode 100644 index 96b06f1..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.c +++ /dev/null @@ -1,1117 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_sram.c - * @author MCD Application Team - * @brief SRAM HAL module driver. - * This file provides a generic firmware to drive SRAM memories - * mounted as external device. - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - This driver is a generic layered driver which contains a set of APIs used to - control SRAM memories. It uses the FMC layer functions to interface - with SRAM devices. - The following sequence should be followed to configure the FMC/FSMC to interface - with SRAM/PSRAM memories: - - (#) Declare a SRAM_HandleTypeDef handle structure, for example: - SRAM_HandleTypeDef hsram; and: - - (++) Fill the SRAM_HandleTypeDef handle "Init" field with the allowed - values of the structure member. - - (++) Fill the SRAM_HandleTypeDef handle "Instance" field with a predefined - base register instance for NOR or SRAM device - - (++) Fill the SRAM_HandleTypeDef handle "Extended" field with a predefined - base register instance for NOR or SRAM extended mode - - (#) Declare two FMC_NORSRAM_TimingTypeDef structures, for both normal and extended - mode timings; for example: - FMC_NORSRAM_TimingTypeDef Timing and FMC_NORSRAM_TimingTypeDef ExTiming; - and fill its fields with the allowed values of the structure member. - - (#) Initialize the SRAM Controller by calling the function HAL_SRAM_Init(). This function - performs the following sequence: - - (##) MSP hardware layer configuration using the function HAL_SRAM_MspInit() - (##) Control register configuration using the FMC NORSRAM interface function - FMC_NORSRAM_Init() - (##) Timing register configuration using the FMC NORSRAM interface function - FMC_NORSRAM_Timing_Init() - (##) Extended mode Timing register configuration using the FMC NORSRAM interface function - FMC_NORSRAM_Extended_Timing_Init() - (##) Enable the SRAM device using the macro __FMC_NORSRAM_ENABLE() - - (#) At this stage you can perform read/write accesses from/to the memory connected - to the NOR/SRAM Bank. You can perform either polling or DMA transfer using the - following APIs: - (++) HAL_SRAM_Read()/HAL_SRAM_Write() for polling read/write access - (++) HAL_SRAM_Read_DMA()/HAL_SRAM_Write_DMA() for DMA read/write transfer - - (#) You can also control the SRAM device by calling the control APIs HAL_SRAM_WriteOperation_Enable()/ - HAL_SRAM_WriteOperation_Disable() to respectively enable/disable the SRAM write operation - - (#) You can continuously monitor the SRAM device HAL state by calling the function - HAL_SRAM_GetState() - - *** Callback registration *** - ============================================= - [..] - The compilation define USE_HAL_SRAM_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - - Use Functions HAL_SRAM_RegisterCallback() to register a user callback, - it allows to register following callbacks: - (+) MspInitCallback : SRAM MspInit. - (+) MspDeInitCallback : SRAM MspDeInit. - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - - Use function HAL_SRAM_UnRegisterCallback() to reset a callback to the default - weak (overridden) function. It allows to reset following callbacks: - (+) MspInitCallback : SRAM MspInit. - (+) MspDeInitCallback : SRAM MspDeInit. - This function) takes as parameters the HAL peripheral handle and the Callback ID. - - By default, after the HAL_SRAM_Init and if the state is HAL_SRAM_STATE_RESET - all callbacks are reset to the corresponding legacy weak (overridden) functions. - Exception done for MspInit and MspDeInit callbacks that are respectively - reset to the legacy weak (overridden) functions in the HAL_SRAM_Init - and HAL_SRAM_DeInit only when these callbacks are null (not registered beforehand). - If not, MspInit or MspDeInit are not null, the HAL_SRAM_Init and HAL_SRAM_DeInit - keep and use the user MspInit/MspDeInit callbacks (registered beforehand) - - Callbacks can be registered/unregistered in READY state only. - Exception done for MspInit/MspDeInit callbacks that can be registered/unregistered - in READY or RESET state, thus registered (user) MspInit/DeInit callbacks can be used - during the Init/DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using HAL_SRAM_RegisterCallback before calling HAL_SRAM_DeInit - or HAL_SRAM_Init function. - - When The compilation define USE_HAL_SRAM_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registering feature is not available - and weak (overridden) callbacks are used. - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -#if defined(FMC_Bank1) || defined(FSMC_Bank1) - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -#ifdef HAL_SRAM_MODULE_ENABLED - -/** @defgroup SRAM SRAM - * @brief SRAM driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup SRAM_Private_Functions SRAM Private Functions - * @{ - */ -static void SRAM_DMACplt(DMA_HandleTypeDef *hdma); -static void SRAM_DMACpltProt(DMA_HandleTypeDef *hdma); -static void SRAM_DMAError(DMA_HandleTypeDef *hdma); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup SRAM_Exported_Functions SRAM Exported Functions - * @{ - */ - -/** @defgroup SRAM_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions. - * - @verbatim - ============================================================================== - ##### SRAM Initialization and de_initialization functions ##### - ============================================================================== - [..] This section provides functions allowing to initialize/de-initialize - the SRAM memory - -@endverbatim - * @{ - */ - -/** - * @brief Performs the SRAM device initialization sequence - * @param hsram pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param Timing Pointer to SRAM control timing structure - * @param ExtTiming Pointer to SRAM extended mode timing structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Init(SRAM_HandleTypeDef *hsram, FMC_NORSRAM_TimingTypeDef *Timing, - FMC_NORSRAM_TimingTypeDef *ExtTiming) -{ - /* Check the SRAM handle parameter */ - if (hsram == NULL) - { - return HAL_ERROR; - } - - if (hsram->State == HAL_SRAM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hsram->Lock = HAL_UNLOCKED; - -#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1) - if (hsram->MspInitCallback == NULL) - { - hsram->MspInitCallback = HAL_SRAM_MspInit; - } - hsram->DmaXferCpltCallback = HAL_SRAM_DMA_XferCpltCallback; - hsram->DmaXferErrorCallback = HAL_SRAM_DMA_XferErrorCallback; - - /* Init the low level hardware */ - hsram->MspInitCallback(hsram); -#else - /* Initialize the low level hardware (MSP) */ - HAL_SRAM_MspInit(hsram); -#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */ - } - - /* Initialize SRAM control Interface */ - (void)FMC_NORSRAM_Init(hsram->Instance, &(hsram->Init)); - - /* Initialize SRAM timing Interface */ - (void)FMC_NORSRAM_Timing_Init(hsram->Instance, Timing, hsram->Init.NSBank); - - /* Initialize SRAM extended mode timing Interface */ - (void)FMC_NORSRAM_Extended_Timing_Init(hsram->Extended, ExtTiming, hsram->Init.NSBank, - hsram->Init.ExtendedMode); - - /* Enable the NORSRAM device */ - __FMC_NORSRAM_ENABLE(hsram->Instance, hsram->Init.NSBank); - - /* Initialize the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Performs the SRAM device De-initialization sequence. - * @param hsram pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_DeInit(SRAM_HandleTypeDef *hsram) -{ -#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1) - if (hsram->MspDeInitCallback == NULL) - { - hsram->MspDeInitCallback = HAL_SRAM_MspDeInit; - } - - /* DeInit the low level hardware */ - hsram->MspDeInitCallback(hsram); -#else - /* De-Initialize the low level hardware (MSP) */ - HAL_SRAM_MspDeInit(hsram); -#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */ - - /* Configure the SRAM registers with their reset values */ - (void)FMC_NORSRAM_DeInit(hsram->Instance, hsram->Extended, hsram->Init.NSBank); - - /* Reset the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hsram); - - return HAL_OK; -} - -/** - * @brief SRAM MSP Init. - * @param hsram pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval None - */ -__weak void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hsram); - - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SRAM_MspInit could be implemented in the user file - */ -} - -/** - * @brief SRAM MSP DeInit. - * @param hsram pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval None - */ -__weak void HAL_SRAM_MspDeInit(SRAM_HandleTypeDef *hsram) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hsram); - - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SRAM_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief DMA transfer complete callback. - * @param hdma pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval None - */ -__weak void HAL_SRAM_DMA_XferCpltCallback(DMA_HandleTypeDef *hdma) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hdma); - - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SRAM_DMA_XferCpltCallback could be implemented in the user file - */ -} - -/** - * @brief DMA transfer complete error callback. - * @param hdma pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval None - */ -__weak void HAL_SRAM_DMA_XferErrorCallback(DMA_HandleTypeDef *hdma) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(hdma); - - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SRAM_DMA_XferErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup SRAM_Exported_Functions_Group2 Input Output and memory control functions - * @brief Input Output and memory control functions - * - @verbatim - ============================================================================== - ##### SRAM Input and Output functions ##### - ============================================================================== - [..] - This section provides functions allowing to use and control the SRAM memory - -@endverbatim - * @{ - */ - -/** - * @brief Reads 8-bit buffer from SRAM memory. - * @param hsram pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress Pointer to read start address - * @param pDstBuffer Pointer to destination buffer - * @param BufferSize Size of the buffer to read from memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Read_8b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint8_t *pDstBuffer, - uint32_t BufferSize) -{ - uint32_t size; - __IO uint8_t *psramaddress = (uint8_t *)pAddress; - uint8_t *pdestbuff = pDstBuffer; - HAL_SRAM_StateTypeDef state = hsram->State; - - /* Check the SRAM controller state */ - if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED)) - { - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Read data from memory */ - for (size = BufferSize; size != 0U; size--) - { - *pdestbuff = *psramaddress; - pdestbuff++; - psramaddress++; - } - - /* Update the SRAM controller state */ - hsram->State = state; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Writes 8-bit buffer to SRAM memory. - * @param hsram pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress Pointer to write start address - * @param pSrcBuffer Pointer to source buffer to write - * @param BufferSize Size of the buffer to write to memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Write_8b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint8_t *pSrcBuffer, - uint32_t BufferSize) -{ - uint32_t size; - __IO uint8_t *psramaddress = (uint8_t *)pAddress; - uint8_t *psrcbuff = pSrcBuffer; - - /* Check the SRAM controller state */ - if (hsram->State == HAL_SRAM_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Write data to memory */ - for (size = BufferSize; size != 0U; size--) - { - *psramaddress = *psrcbuff; - psrcbuff++; - psramaddress++; - } - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Reads 16-bit buffer from SRAM memory. - * @param hsram pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress Pointer to read start address - * @param pDstBuffer Pointer to destination buffer - * @param BufferSize Size of the buffer to read from memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Read_16b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint16_t *pDstBuffer, - uint32_t BufferSize) -{ - uint32_t size; - __IO uint32_t *psramaddress = pAddress; - uint16_t *pdestbuff = pDstBuffer; - uint8_t limit; - HAL_SRAM_StateTypeDef state = hsram->State; - - /* Check the SRAM controller state */ - if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED)) - { - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Check if the size is a 32-bits multiple */ - limit = (((BufferSize % 2U) != 0U) ? 1U : 0U); - - /* Read data from memory */ - for (size = BufferSize; size != limit; size -= 2U) - { - *pdestbuff = (uint16_t)((*psramaddress) & 0x0000FFFFU); - pdestbuff++; - *pdestbuff = (uint16_t)(((*psramaddress) & 0xFFFF0000U) >> 16U); - pdestbuff++; - psramaddress++; - } - - /* Read last 16-bits if size is not 32-bits multiple */ - if (limit != 0U) - { - *pdestbuff = (uint16_t)((*psramaddress) & 0x0000FFFFU); - } - - /* Update the SRAM controller state */ - hsram->State = state; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Writes 16-bit buffer to SRAM memory. - * @param hsram pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress Pointer to write start address - * @param pSrcBuffer Pointer to source buffer to write - * @param BufferSize Size of the buffer to write to memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Write_16b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint16_t *pSrcBuffer, - uint32_t BufferSize) -{ - uint32_t size; - __IO uint32_t *psramaddress = pAddress; - uint16_t *psrcbuff = pSrcBuffer; - uint8_t limit; - - /* Check the SRAM controller state */ - if (hsram->State == HAL_SRAM_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Check if the size is a 32-bits multiple */ - limit = (((BufferSize % 2U) != 0U) ? 1U : 0U); - - /* Write data to memory */ - for (size = BufferSize; size != limit; size -= 2U) - { - *psramaddress = (uint32_t)(*psrcbuff); - psrcbuff++; - *psramaddress |= ((uint32_t)(*psrcbuff) << 16U); - psrcbuff++; - psramaddress++; - } - - /* Write last 16-bits if size is not 32-bits multiple */ - if (limit != 0U) - { - *psramaddress = ((uint32_t)(*psrcbuff) & 0x0000FFFFU) | ((*psramaddress) & 0xFFFF0000U); - } - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Reads 32-bit buffer from SRAM memory. - * @param hsram pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress Pointer to read start address - * @param pDstBuffer Pointer to destination buffer - * @param BufferSize Size of the buffer to read from memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Read_32b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pDstBuffer, - uint32_t BufferSize) -{ - uint32_t size; - __IO uint32_t *psramaddress = pAddress; - uint32_t *pdestbuff = pDstBuffer; - HAL_SRAM_StateTypeDef state = hsram->State; - - /* Check the SRAM controller state */ - if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED)) - { - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Read data from memory */ - for (size = BufferSize; size != 0U; size--) - { - *pdestbuff = *psramaddress; - pdestbuff++; - psramaddress++; - } - - /* Update the SRAM controller state */ - hsram->State = state; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Writes 32-bit buffer to SRAM memory. - * @param hsram pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress Pointer to write start address - * @param pSrcBuffer Pointer to source buffer to write - * @param BufferSize Size of the buffer to write to memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Write_32b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pSrcBuffer, - uint32_t BufferSize) -{ - uint32_t size; - __IO uint32_t *psramaddress = pAddress; - uint32_t *psrcbuff = pSrcBuffer; - - /* Check the SRAM controller state */ - if (hsram->State == HAL_SRAM_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Write data to memory */ - for (size = BufferSize; size != 0U; size--) - { - *psramaddress = *psrcbuff; - psrcbuff++; - psramaddress++; - } - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Reads a Words data from the SRAM memory using DMA transfer. - * @param hsram pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress Pointer to read start address - * @param pDstBuffer Pointer to destination buffer - * @param BufferSize Size of the buffer to read from memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Read_DMA(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pDstBuffer, - uint32_t BufferSize) -{ - HAL_StatusTypeDef status; - HAL_SRAM_StateTypeDef state = hsram->State; - - /* Check the SRAM controller state */ - if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED)) - { - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Configure DMA user callbacks */ - if (state == HAL_SRAM_STATE_READY) - { - hsram->hdma->XferCpltCallback = SRAM_DMACplt; - } - else - { - hsram->hdma->XferCpltCallback = SRAM_DMACpltProt; - } - hsram->hdma->XferErrorCallback = SRAM_DMAError; - - /* Enable the DMA Stream */ - status = HAL_DMA_Start_IT(hsram->hdma, (uint32_t)pAddress, (uint32_t)pDstBuffer, (uint32_t)BufferSize); - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - } - else - { - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Writes a Words data buffer to SRAM memory using DMA transfer. - * @param hsram pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress Pointer to write start address - * @param pSrcBuffer Pointer to source buffer to write - * @param BufferSize Size of the buffer to write to memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Write_DMA(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pSrcBuffer, - uint32_t BufferSize) -{ - HAL_StatusTypeDef status; - - /* Check the SRAM controller state */ - if (hsram->State == HAL_SRAM_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Configure DMA user callbacks */ - hsram->hdma->XferCpltCallback = SRAM_DMACplt; - hsram->hdma->XferErrorCallback = SRAM_DMAError; - - /* Enable the DMA Stream */ - status = HAL_DMA_Start_IT(hsram->hdma, (uint32_t)pSrcBuffer, (uint32_t)pAddress, (uint32_t)BufferSize); - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - } - else - { - status = HAL_ERROR; - } - - return status; -} - -#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User SRAM Callback - * To be used to override the weak predefined callback - * @param hsram : SRAM handle - * @param CallbackId : ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_SRAM_MSP_INIT_CB_ID SRAM MspInit callback ID - * @arg @ref HAL_SRAM_MSP_DEINIT_CB_ID SRAM MspDeInit callback ID - * @param pCallback : pointer to the Callback function - * @retval status - */ -HAL_StatusTypeDef HAL_SRAM_RegisterCallback(SRAM_HandleTypeDef *hsram, HAL_SRAM_CallbackIDTypeDef CallbackId, - pSRAM_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - HAL_SRAM_StateTypeDef state; - - if (pCallback == NULL) - { - return HAL_ERROR; - } - - state = hsram->State; - if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_RESET) || (state == HAL_SRAM_STATE_PROTECTED)) - { - switch (CallbackId) - { - case HAL_SRAM_MSP_INIT_CB_ID : - hsram->MspInitCallback = pCallback; - break; - case HAL_SRAM_MSP_DEINIT_CB_ID : - hsram->MspDeInitCallback = pCallback; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else - { - /* update return status */ - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Unregister a User SRAM Callback - * SRAM Callback is redirected to the weak predefined callback - * @param hsram : SRAM handle - * @param CallbackId : ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_SRAM_MSP_INIT_CB_ID SRAM MspInit callback ID - * @arg @ref HAL_SRAM_MSP_DEINIT_CB_ID SRAM MspDeInit callback ID - * @arg @ref HAL_SRAM_DMA_XFER_CPLT_CB_ID SRAM DMA Xfer Complete callback ID - * @arg @ref HAL_SRAM_DMA_XFER_ERR_CB_ID SRAM DMA Xfer Error callback ID - * @retval status - */ -HAL_StatusTypeDef HAL_SRAM_UnRegisterCallback(SRAM_HandleTypeDef *hsram, HAL_SRAM_CallbackIDTypeDef CallbackId) -{ - HAL_StatusTypeDef status = HAL_OK; - HAL_SRAM_StateTypeDef state; - - state = hsram->State; - if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED)) - { - switch (CallbackId) - { - case HAL_SRAM_MSP_INIT_CB_ID : - hsram->MspInitCallback = HAL_SRAM_MspInit; - break; - case HAL_SRAM_MSP_DEINIT_CB_ID : - hsram->MspDeInitCallback = HAL_SRAM_MspDeInit; - break; - case HAL_SRAM_DMA_XFER_CPLT_CB_ID : - hsram->DmaXferCpltCallback = HAL_SRAM_DMA_XferCpltCallback; - break; - case HAL_SRAM_DMA_XFER_ERR_CB_ID : - hsram->DmaXferErrorCallback = HAL_SRAM_DMA_XferErrorCallback; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else if (state == HAL_SRAM_STATE_RESET) - { - switch (CallbackId) - { - case HAL_SRAM_MSP_INIT_CB_ID : - hsram->MspInitCallback = HAL_SRAM_MspInit; - break; - case HAL_SRAM_MSP_DEINIT_CB_ID : - hsram->MspDeInitCallback = HAL_SRAM_MspDeInit; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else - { - /* update return status */ - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Register a User SRAM Callback for DMA transfers - * To be used to override the weak predefined callback - * @param hsram : SRAM handle - * @param CallbackId : ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_SRAM_DMA_XFER_CPLT_CB_ID SRAM DMA Xfer Complete callback ID - * @arg @ref HAL_SRAM_DMA_XFER_ERR_CB_ID SRAM DMA Xfer Error callback ID - * @param pCallback : pointer to the Callback function - * @retval status - */ -HAL_StatusTypeDef HAL_SRAM_RegisterDmaCallback(SRAM_HandleTypeDef *hsram, HAL_SRAM_CallbackIDTypeDef CallbackId, - pSRAM_DmaCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - HAL_SRAM_StateTypeDef state; - - if (pCallback == NULL) - { - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hsram); - - state = hsram->State; - if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED)) - { - switch (CallbackId) - { - case HAL_SRAM_DMA_XFER_CPLT_CB_ID : - hsram->DmaXferCpltCallback = pCallback; - break; - case HAL_SRAM_DMA_XFER_ERR_CB_ID : - hsram->DmaXferErrorCallback = pCallback; - break; - default : - /* update return status */ - status = HAL_ERROR; - break; - } - } - else - { - /* update return status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hsram); - return status; -} -#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup SRAM_Exported_Functions_Group3 Control functions - * @brief Control functions - * -@verbatim - ============================================================================== - ##### SRAM Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control dynamically - the SRAM interface. - -@endverbatim - * @{ - */ - -/** - * @brief Enables dynamically SRAM write operation. - * @param hsram pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_WriteOperation_Enable(SRAM_HandleTypeDef *hsram) -{ - /* Check the SRAM controller state */ - if (hsram->State == HAL_SRAM_STATE_PROTECTED) - { - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Enable write operation */ - (void)FMC_NORSRAM_WriteOperation_Enable(hsram->Instance, hsram->Init.NSBank); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Disables dynamically SRAM write operation. - * @param hsram pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_WriteOperation_Disable(SRAM_HandleTypeDef *hsram) -{ - /* Check the SRAM controller state */ - if (hsram->State == HAL_SRAM_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Disable write operation */ - (void)FMC_NORSRAM_WriteOperation_Disable(hsram->Instance, hsram->Init.NSBank); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_PROTECTED; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup SRAM_Exported_Functions_Group4 Peripheral State functions - * @brief Peripheral State functions - * -@verbatim - ============================================================================== - ##### SRAM State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the SRAM controller - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the SRAM controller state - * @param hsram pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval HAL state - */ -HAL_SRAM_StateTypeDef HAL_SRAM_GetState(const SRAM_HandleTypeDef *hsram) -{ - return hsram->State; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup SRAM_Private_Functions SRAM Private Functions - * @{ - */ - -/** - * @brief DMA SRAM process complete callback. - * @param hdma : DMA handle - * @retval None - */ -static void SRAM_DMACplt(DMA_HandleTypeDef *hdma) -{ - /* Derogation MISRAC2012-Rule-11.5 */ - SRAM_HandleTypeDef *hsram = (SRAM_HandleTypeDef *)(hdma->Parent); - - /* Disable the DMA channel */ - __HAL_DMA_DISABLE(hdma); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_READY; - -#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1) - hsram->DmaXferCpltCallback(hdma); -#else - HAL_SRAM_DMA_XferCpltCallback(hdma); -#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SRAM process complete callback. - * @param hdma : DMA handle - * @retval None - */ -static void SRAM_DMACpltProt(DMA_HandleTypeDef *hdma) -{ - /* Derogation MISRAC2012-Rule-11.5 */ - SRAM_HandleTypeDef *hsram = (SRAM_HandleTypeDef *)(hdma->Parent); - - /* Disable the DMA channel */ - __HAL_DMA_DISABLE(hdma); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_PROTECTED; - -#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1) - hsram->DmaXferCpltCallback(hdma); -#else - HAL_SRAM_DMA_XferCpltCallback(hdma); -#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA SRAM error callback. - * @param hdma : DMA handle - * @retval None - */ -static void SRAM_DMAError(DMA_HandleTypeDef *hdma) -{ - /* Derogation MISRAC2012-Rule-11.5 */ - SRAM_HandleTypeDef *hsram = (SRAM_HandleTypeDef *)(hdma->Parent); - - /* Disable the DMA channel */ - __HAL_DMA_DISABLE(hdma); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_ERROR; - -#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1) - hsram->DmaXferErrorCallback(hdma); -#else - HAL_SRAM_DMA_XferErrorCallback(hdma); -#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */ -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_SRAM_MODULE_ENABLED */ - -/** - * @} - */ - -#endif /* FMC_Bank1 || FSMC_Bank1 */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c deleted file mode 100644 index f056ebf..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c +++ /dev/null @@ -1,7629 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim.c - * @author MCD Application Team - * @brief TIM HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Timer (TIM) peripheral: - * + TIM Time Base Initialization - * + TIM Time Base Start - * + TIM Time Base Start Interruption - * + TIM Time Base Start DMA - * + TIM Output Compare/PWM Initialization - * + TIM Output Compare/PWM Channel Configuration - * + TIM Output Compare/PWM Start - * + TIM Output Compare/PWM Start Interruption - * + TIM Output Compare/PWM Start DMA - * + TIM Input Capture Initialization - * + TIM Input Capture Channel Configuration - * + TIM Input Capture Start - * + TIM Input Capture Start Interruption - * + TIM Input Capture Start DMA - * + TIM One Pulse Initialization - * + TIM One Pulse Channel Configuration - * + TIM One Pulse Start - * + TIM Encoder Interface Initialization - * + TIM Encoder Interface Start - * + TIM Encoder Interface Start Interruption - * + TIM Encoder Interface Start DMA - * + Commutation Event configuration with Interruption and DMA - * + TIM OCRef clear configuration - * + TIM External Clock configuration - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### TIMER Generic features ##### - ============================================================================== - [..] The Timer features include: - (#) 16-bit up, down, up/down auto-reload counter. - (#) 16-bit programmable prescaler allowing dividing (also on the fly) the - counter clock frequency either by any factor between 1 and 65536. - (#) Up to 4 independent channels for: - (++) Input Capture - (++) Output Compare - (++) PWM generation (Edge and Center-aligned Mode) - (++) One-pulse mode output - (#) Synchronization circuit to control the timer with external signals and to interconnect - several timers together. - (#) Supports incremental encoder for positioning purposes - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Initialize the TIM low level resources by implementing the following functions - depending on the selected feature: - (++) Time Base : HAL_TIM_Base_MspInit() - (++) Input Capture : HAL_TIM_IC_MspInit() - (++) Output Compare : HAL_TIM_OC_MspInit() - (++) PWM generation : HAL_TIM_PWM_MspInit() - (++) One-pulse mode output : HAL_TIM_OnePulse_MspInit() - (++) Encoder mode output : HAL_TIM_Encoder_MspInit() - - (#) Initialize the TIM low level resources : - (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); - (##) TIM pins configuration - (+++) Enable the clock for the TIM GPIOs using the following function: - __HAL_RCC_GPIOx_CLK_ENABLE(); - (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); - - (#) The external Clock can be configured, if needed (the default clock is the - internal clock from the APBx), using the following function: - HAL_TIM_ConfigClockSource, the clock configuration should be done before - any start function. - - (#) Configure the TIM in the desired functioning mode using one of the - Initialization function of this driver: - (++) HAL_TIM_Base_Init: to use the Timer to generate a simple time base - (++) HAL_TIM_OC_Init and HAL_TIM_OC_ConfigChannel: to use the Timer to generate an - Output Compare signal. - (++) HAL_TIM_PWM_Init and HAL_TIM_PWM_ConfigChannel: to use the Timer to generate a - PWM signal. - (++) HAL_TIM_IC_Init and HAL_TIM_IC_ConfigChannel: to use the Timer to measure an - external signal. - (++) HAL_TIM_OnePulse_Init and HAL_TIM_OnePulse_ConfigChannel: to use the Timer - in One Pulse Mode. - (++) HAL_TIM_Encoder_Init: to use the Timer Encoder Interface. - - (#) Activate the TIM peripheral using one of the start functions depending from the feature used: - (++) Time Base : HAL_TIM_Base_Start(), HAL_TIM_Base_Start_DMA(), HAL_TIM_Base_Start_IT() - (++) Input Capture : HAL_TIM_IC_Start(), HAL_TIM_IC_Start_DMA(), HAL_TIM_IC_Start_IT() - (++) Output Compare : HAL_TIM_OC_Start(), HAL_TIM_OC_Start_DMA(), HAL_TIM_OC_Start_IT() - (++) PWM generation : HAL_TIM_PWM_Start(), HAL_TIM_PWM_Start_DMA(), HAL_TIM_PWM_Start_IT() - (++) One-pulse mode output : HAL_TIM_OnePulse_Start(), HAL_TIM_OnePulse_Start_IT() - (++) Encoder mode output : HAL_TIM_Encoder_Start(), HAL_TIM_Encoder_Start_DMA(), HAL_TIM_Encoder_Start_IT(). - - (#) The DMA Burst is managed with the two following functions: - HAL_TIM_DMABurst_WriteStart() - HAL_TIM_DMABurst_ReadStart() - - *** Callback registration *** - ============================================= - - [..] - The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - - [..] - Use Function HAL_TIM_RegisterCallback() to register a callback. - HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, - the Callback ID and a pointer to the user callback function. - - [..] - Use function HAL_TIM_UnRegisterCallback() to reset a callback to the default - weak function. - HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, - and the Callback ID. - - [..] - These functions allow to register/unregister following callbacks: - (+) Base_MspInitCallback : TIM Base Msp Init Callback. - (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. - (+) IC_MspInitCallback : TIM IC Msp Init Callback. - (+) IC_MspDeInitCallback : TIM IC Msp DeInit Callback. - (+) OC_MspInitCallback : TIM OC Msp Init Callback. - (+) OC_MspDeInitCallback : TIM OC Msp DeInit Callback. - (+) PWM_MspInitCallback : TIM PWM Msp Init Callback. - (+) PWM_MspDeInitCallback : TIM PWM Msp DeInit Callback. - (+) OnePulse_MspInitCallback : TIM One Pulse Msp Init Callback. - (+) OnePulse_MspDeInitCallback : TIM One Pulse Msp DeInit Callback. - (+) Encoder_MspInitCallback : TIM Encoder Msp Init Callback. - (+) Encoder_MspDeInitCallback : TIM Encoder Msp DeInit Callback. - (+) HallSensor_MspInitCallback : TIM Hall Sensor Msp Init Callback. - (+) HallSensor_MspDeInitCallback : TIM Hall Sensor Msp DeInit Callback. - (+) PeriodElapsedCallback : TIM Period Elapsed Callback. - (+) PeriodElapsedHalfCpltCallback : TIM Period Elapsed half complete Callback. - (+) TriggerCallback : TIM Trigger Callback. - (+) TriggerHalfCpltCallback : TIM Trigger half complete Callback. - (+) IC_CaptureCallback : TIM Input Capture Callback. - (+) IC_CaptureHalfCpltCallback : TIM Input Capture half complete Callback. - (+) OC_DelayElapsedCallback : TIM Output Compare Delay Elapsed Callback. - (+) PWM_PulseFinishedCallback : TIM PWM Pulse Finished Callback. - (+) PWM_PulseFinishedHalfCpltCallback : TIM PWM Pulse Finished half complete Callback. - (+) ErrorCallback : TIM Error Callback. - (+) CommutationCallback : TIM Commutation Callback. - (+) CommutationHalfCpltCallback : TIM Commutation half complete Callback. - (+) BreakCallback : TIM Break Callback. - - [..] -By default, after the Init and when the state is HAL_TIM_STATE_RESET -all interrupt callbacks are set to the corresponding weak functions: - examples HAL_TIM_TriggerCallback(), HAL_TIM_ErrorCallback(). - - [..] - Exception done for MspInit and MspDeInit functions that are reset to the legacy weak - functionalities in the Init / DeInit only when these callbacks are null - (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit - keep and use the user MspInit / MspDeInit callbacks(registered beforehand) - - [..] - Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. - Exception done MspInit / MspDeInit that can be registered / unregistered - in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, - thus registered(user) MspInit / DeInit callbacks can be used during the Init / DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using HAL_TIM_RegisterCallback() before calling DeInit or Init function. - - [..] - When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registration feature is not available and all callbacks - are set to the corresponding weak functions. - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup TIM TIM - * @brief TIM HAL module driver - * @{ - */ - -#ifdef HAL_TIM_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup TIM_Private_Functions - * @{ - */ -static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); -static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); -static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); -static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); -static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); -static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource); -static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - const TIM_SlaveConfigTypeDef *sSlaveConfig); -/** - * @} - */ -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup TIM_Exported_Functions TIM Exported Functions - * @{ - */ - -/** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * -@verbatim - ============================================================================== - ##### Time Base functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM base. - (+) De-initialize the TIM base. - (+) Start the Time Base. - (+) Stop the Time Base. - (+) Start the Time Base and enable interrupt. - (+) Stop the Time Base and disable interrupt. - (+) Start the Time Base and enable DMA transfer. - (+) Stop the Time Base and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Time base Unit according to the specified - * parameters in the TIM_HandleTypeDef and initialize the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_Base_DeInit() before HAL_TIM_Base_Init() - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->Base_MspInitCallback == NULL) - { - htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->Base_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - HAL_TIM_Base_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Set the Time Base configuration */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM Base peripheral - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->Base_MspDeInitCallback == NULL) - { - htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; - } - /* DeInit the low level hardware */ - htim->Base_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_Base_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Change the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Base MSP. - * @param htim TIM Base handle - * @retval None - */ -__weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Base_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Base MSP. - * @param htim TIM Base handle - * @retval None - */ -__weak void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Base_MspDeInit could be implemented in the user file - */ -} - - -/** - * @brief Starts the TIM Base generation. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Check the TIM state */ - if (htim->State != HAL_TIM_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Base generation in interrupt mode. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Check the TIM state */ - if (htim->State != HAL_TIM_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Enable the TIM Update interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation in interrupt mode. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Disable the TIM Update interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_UPDATE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Base generation in DMA mode. - * @param htim TIM Base handle - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, const uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - - /* Set the TIM state */ - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - return HAL_ERROR; - } - - /* Set the DMA Period elapsed callbacks */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)pData, (uint32_t)&htim->Instance->ARR, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Enable the TIM Update DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_UPDATE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation in DMA mode. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_UPDATE); - - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * -@verbatim - ============================================================================== - ##### TIM Output Compare functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Output Compare. - (+) De-initialize the TIM Output Compare. - (+) Start the TIM Output Compare. - (+) Stop the TIM Output Compare. - (+) Start the TIM Output Compare and enable interrupt. - (+) Stop the TIM Output Compare and disable interrupt. - (+) Start the TIM Output Compare and enable DMA transfer. - (+) Stop the TIM Output Compare and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Output Compare according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_OC_DeInit() before HAL_TIM_OC_Init() - * @param htim TIM Output Compare handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->OC_MspInitCallback == NULL) - { - htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->OC_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OC_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Init the base time for the Output Compare */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim TIM Output Compare handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->OC_MspDeInitCallback == NULL) - { - htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; - } - /* DeInit the low level hardware */ - htim->OC_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OC_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Change the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Output Compare MSP. - * @param htim TIM Output Compare handle - * @retval None - */ -__weak void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OC_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Output Compare MSP. - * @param htim TIM Output Compare handle - * @retval None - */ -__weak void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OC_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Output Compare signal generation. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in interrupt mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Output Compare signal generation in interrupt mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @brief Starts the TIM Output Compare signal generation in DMA mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Set the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) - { - return HAL_BUSY; - } - else if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Output Compare signal generation in DMA mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * -@verbatim - ============================================================================== - ##### TIM PWM functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM PWM. - (+) De-initialize the TIM PWM. - (+) Start the TIM PWM. - (+) Stop the TIM PWM. - (+) Start the TIM PWM and enable interrupt. - (+) Stop the TIM PWM and disable interrupt. - (+) Start the TIM PWM and enable DMA transfer. - (+) Stop the TIM PWM and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM PWM Time Base according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_PWM_DeInit() before HAL_TIM_PWM_Init() - * @param htim TIM PWM handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->PWM_MspInitCallback == NULL) - { - htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->PWM_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_PWM_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Init the base time for the PWM */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim TIM PWM handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->PWM_MspDeInitCallback == NULL) - { - htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; - } - /* DeInit the low level hardware */ - htim->PWM_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_PWM_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Change the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM PWM MSP. - * @param htim TIM PWM handle - * @retval None - */ -__weak void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM PWM MSP. - * @param htim TIM PWM handle - * @retval None - */ -__weak void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the PWM signal generation. - * @param htim TIM handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the PWM signal generation in interrupt mode. - * @param htim TIM PWM handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the PWM signal generation in interrupt mode. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @brief Starts the TIM PWM signal generation in DMA mode. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Set the TIM channel state */ - if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) - { - return HAL_BUSY; - } - else if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Output Capture/Compare 3 request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM PWM signal generation in DMA mode. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * -@verbatim - ============================================================================== - ##### TIM Input Capture functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Input Capture. - (+) De-initialize the TIM Input Capture. - (+) Start the TIM Input Capture. - (+) Stop the TIM Input Capture. - (+) Start the TIM Input Capture and enable interrupt. - (+) Stop the TIM Input Capture and disable interrupt. - (+) Start the TIM Input Capture and enable DMA transfer. - (+) Stop the TIM Input Capture and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Input Capture Time base according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_IC_DeInit() before HAL_TIM_IC_Init() - * @param htim TIM Input Capture handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->IC_MspInitCallback == NULL) - { - htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->IC_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_IC_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Init the base time for the input capture */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim TIM Input Capture handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->IC_MspDeInitCallback == NULL) - { - htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; - } - /* DeInit the low level hardware */ - htim->IC_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_IC_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Change the TIM channels state */ - TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Input Capture MSP. - * @param htim TIM Input Capture handle - * @retval None - */ -__weak void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Input Capture MSP. - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Input Capture measurement. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); - HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if ((channel_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Input Capture measurement. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Input Capture measurement in interrupt mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); - HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM channel state */ - if ((channel_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Input Capture measurement in interrupt mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @brief Starts the TIM Input Capture measurement in DMA mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData The destination Buffer address. - * @param Length The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); - HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - /* Set the TIM channel state */ - if ((channel_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_state == HAL_TIM_CHANNEL_STATE_BUSY)) - { - return HAL_BUSY; - } - else if ((channel_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_state == HAL_TIM_CHANNEL_STATE_READY)) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->CCR3, (uint32_t)pData, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->CCR4, (uint32_t)pData, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - break; - } - - default: - status = HAL_ERROR; - break; - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Input Capture measurement in DMA mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * -@verbatim - ============================================================================== - ##### TIM One Pulse functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM One Pulse. - (+) De-initialize the TIM One Pulse. - (+) Start the TIM One Pulse. - (+) Stop the TIM One Pulse. - (+) Start the TIM One Pulse and enable interrupt. - (+) Stop the TIM One Pulse and disable interrupt. - (+) Start the TIM One Pulse and enable DMA transfer. - (+) Stop the TIM One Pulse and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM One Pulse Time Base according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_OnePulse_DeInit() before HAL_TIM_OnePulse_Init() - * @note When the timer instance is initialized in One Pulse mode, timer - * channels 1 and channel 2 are reserved and cannot be used for other - * purpose. - * @param htim TIM One Pulse handle - * @param OnePulseMode Select the One pulse mode. - * This parameter can be one of the following values: - * @arg TIM_OPMODE_SINGLE: Only one pulse will be generated. - * @arg TIM_OPMODE_REPETITIVE: Repetitive pulses will be generated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_OPM_MODE(OnePulseMode)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->OnePulse_MspInitCallback == NULL) - { - htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->OnePulse_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OnePulse_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Configure the Time base in the One Pulse Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Reset the OPM Bit */ - htim->Instance->CR1 &= ~TIM_CR1_OPM; - - /* Configure the OPM Mode */ - htim->Instance->CR1 |= OnePulseMode; - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM One Pulse - * @param htim TIM One Pulse handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->OnePulse_MspDeInitCallback == NULL) - { - htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; - } - /* DeInit the low level hardware */ - htim->OnePulse_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_OnePulse_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM One Pulse MSP. - * @param htim TIM One Pulse handle - * @retval None - */ -__weak void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OnePulse_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM One Pulse MSP. - * @param htim TIM One Pulse handle - * @retval None - */ -__weak void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OnePulse_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM One Pulse signal generation. - * @note Though OutputChannel parameter is deprecated and ignored by the function - * it has been kept to avoid HAL_TIM API compatibility break. - * @note The pulse output channel is determined when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel See note above - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together - - No need to enable the counter, it's enabled automatically by hardware - (the counter starts in response to a stimulus and generate a pulse */ - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation. - * @note Though OutputChannel parameter is deprecated and ignored by the function - * it has been kept to avoid HAL_TIM API compatibility break. - * @note The pulse output channel is determined when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel See note above - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Disable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM One Pulse signal generation in interrupt mode. - * @note Though OutputChannel parameter is deprecated and ignored by the function - * it has been kept to avoid HAL_TIM API compatibility break. - * @note The pulse output channel is determined when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel See note above - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together - - No need to enable the counter, it's enabled automatically by hardware - (the counter starts in response to a stimulus and generate a pulse */ - - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation in interrupt mode. - * @note Though OutputChannel parameter is deprecated and ignored by the function - * it has been kept to avoid HAL_TIM API compatibility break. - * @note The pulse output channel is determined when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel See note above - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - - /* Disable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * -@verbatim - ============================================================================== - ##### TIM Encoder functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Encoder. - (+) De-initialize the TIM Encoder. - (+) Start the TIM Encoder. - (+) Stop the TIM Encoder. - (+) Start the TIM Encoder and enable interrupt. - (+) Stop the TIM Encoder and disable interrupt. - (+) Start the TIM Encoder and enable DMA transfer. - (+) Stop the TIM Encoder and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Encoder Interface and initialize the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_Encoder_DeInit() before HAL_TIM_Encoder_Init() - * @note Encoder mode and External clock mode 2 are not compatible and must not be selected together - * Ex: A call for @ref HAL_TIM_Encoder_Init will erase the settings of @ref HAL_TIM_ConfigClockSource - * using TIM_CLOCKSOURCE_ETRMODE2 and vice versa - * @note When the timer instance is initialized in Encoder mode, timer - * channels 1 and channel 2 are reserved and cannot be used for other - * purpose. - * @param htim TIM Encoder Interface handle - * @param sConfig TIM Encoder Interface configuration structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, const TIM_Encoder_InitTypeDef *sConfig) -{ - uint32_t tmpsmcr; - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); - assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); - assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); - assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC2Filter)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->Encoder_MspInitCallback == NULL) - { - htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->Encoder_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_Encoder_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Reset the SMS and ECE bits */ - htim->Instance->SMCR &= ~(TIM_SMCR_SMS | TIM_SMCR_ECE); - - /* Configure the Time base in the Encoder Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Get the TIMx CCMR1 register value */ - tmpccmr1 = htim->Instance->CCMR1; - - /* Get the TIMx CCER register value */ - tmpccer = htim->Instance->CCER; - - /* Set the encoder Mode */ - tmpsmcr |= sConfig->EncoderMode; - - /* Select the Capture Compare 1 and the Capture Compare 2 as input */ - tmpccmr1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S); - tmpccmr1 |= (sConfig->IC1Selection | (sConfig->IC2Selection << 8U)); - - /* Set the Capture Compare 1 and the Capture Compare 2 prescalers and filters */ - tmpccmr1 &= ~(TIM_CCMR1_IC1PSC | TIM_CCMR1_IC2PSC); - tmpccmr1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_IC2F); - tmpccmr1 |= sConfig->IC1Prescaler | (sConfig->IC2Prescaler << 8U); - tmpccmr1 |= (sConfig->IC1Filter << 4U) | (sConfig->IC2Filter << 12U); - - /* Set the TI1 and the TI2 Polarities */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P); - tmpccer &= ~(TIM_CCER_CC1NP | TIM_CCER_CC2NP); - tmpccer |= sConfig->IC1Polarity | (sConfig->IC2Polarity << 4U); - - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - - /* Write to TIMx CCMR1 */ - htim->Instance->CCMR1 = tmpccmr1; - - /* Write to TIMx CCER */ - htim->Instance->CCER = tmpccer; - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - - -/** - * @brief DeInitializes the TIM Encoder interface - * @param htim TIM Encoder Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->Encoder_MspDeInitCallback == NULL) - { - htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; - } - /* DeInit the low level hardware */ - htim->Encoder_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_Encoder_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Encoder Interface MSP. - * @param htim TIM Encoder Interface handle - * @retval None - */ -__weak void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Encoder_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Encoder Interface MSP. - * @param htim TIM Encoder Interface handle - * @retval None - */ -__weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Encoder_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Encoder Interface. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Set the TIM channel(s) state */ - if (Channel == TIM_CHANNEL_1) - { - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else if (Channel == TIM_CHANNEL_2) - { - if ((channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - - /* Enable the encoder interface channels */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - break; - } - - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - break; - } - - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - break; - } - } - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - break; - } - - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - break; - } - - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - break; - } - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel(s) state */ - if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Encoder Interface in interrupt mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Set the TIM channel(s) state */ - if (Channel == TIM_CHANNEL_1) - { - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else if (Channel == TIM_CHANNEL_2) - { - if ((channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - - /* Enable the encoder interface channels */ - /* Enable the capture compare Interrupts 1 and/or 2 */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - } - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface in interrupt mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - if (Channel == TIM_CHANNEL_1) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 1 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - } - else if (Channel == TIM_CHANNEL_2) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 2 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - } - else - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 1 and 2 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel(s) state */ - if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Encoder Interface in DMA mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @param pData1 The destination Buffer address for IC1. - * @param pData2 The destination Buffer address for IC2. - * @param Length The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, - uint32_t *pData2, uint16_t Length) -{ - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Set the TIM channel(s) state */ - if (Channel == TIM_CHANNEL_1) - { - if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)) - { - return HAL_BUSY; - } - else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY)) - { - if ((pData1 == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - } - else if (Channel == TIM_CHANNEL_2) - { - if ((channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY)) - { - return HAL_BUSY; - } - else if ((channel_2_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_READY)) - { - if ((pData2 == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - } - else - { - if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY)) - { - return HAL_BUSY; - } - else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) - && (channel_2_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_READY)) - { - if ((((pData1 == NULL) || (pData2 == NULL))) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError; - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - break; - } - - default: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - break; - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface in DMA mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - if (Channel == TIM_CHANNEL_1) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 1 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - } - else if (Channel == TIM_CHANNEL_2) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 2 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - } - else - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 1 and 2 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel(s) state */ - if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) - { - TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ -/** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief TIM IRQ handler management - * -@verbatim - ============================================================================== - ##### IRQ handler management ##### - ============================================================================== - [..] - This section provides Timer IRQ handler function. - -@endverbatim - * @{ - */ -/** - * @brief This function handles TIM interrupts requests. - * @param htim TIM handle - * @retval None - */ -void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) -{ - uint32_t itsource = htim->Instance->DIER; - uint32_t itflag = htim->Instance->SR; - - /* Capture compare 1 event */ - if ((itflag & (TIM_FLAG_CC1)) == (TIM_FLAG_CC1)) - { - if ((itsource & (TIM_IT_CC1)) == (TIM_IT_CC1)) - { - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC1); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - - /* Input capture event */ - if ((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - } - /* Capture compare 2 event */ - if ((itflag & (TIM_FLAG_CC2)) == (TIM_FLAG_CC2)) - { - if ((itsource & (TIM_IT_CC2)) == (TIM_IT_CC2)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC2); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - /* Input capture event */ - if ((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* Capture compare 3 event */ - if ((itflag & (TIM_FLAG_CC3)) == (TIM_FLAG_CC3)) - { - if ((itsource & (TIM_IT_CC3)) == (TIM_IT_CC3)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC3); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - /* Input capture event */ - if ((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* Capture compare 4 event */ - if ((itflag & (TIM_FLAG_CC4)) == (TIM_FLAG_CC4)) - { - if ((itsource & (TIM_IT_CC4)) == (TIM_IT_CC4)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC4); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - /* Input capture event */ - if ((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* TIM Update event */ - if ((itflag & (TIM_FLAG_UPDATE)) == (TIM_FLAG_UPDATE)) - { - if ((itsource & (TIM_IT_UPDATE)) == (TIM_IT_UPDATE)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_UPDATE); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PeriodElapsedCallback(htim); -#else - HAL_TIM_PeriodElapsedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } - /* TIM Break input event */ - if ((itflag & (TIM_FLAG_BREAK)) == (TIM_FLAG_BREAK)) - { - if ((itsource & (TIM_IT_BREAK)) == (TIM_IT_BREAK)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_BREAK); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->BreakCallback(htim); -#else - HAL_TIMEx_BreakCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } - /* TIM Trigger detection event */ - if ((itflag & (TIM_FLAG_TRIGGER)) == (TIM_FLAG_TRIGGER)) - { - if ((itsource & (TIM_IT_TRIGGER)) == (TIM_IT_TRIGGER)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_TRIGGER); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->TriggerCallback(htim); -#else - HAL_TIM_TriggerCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } - /* TIM commutation event */ - if ((itflag & (TIM_FLAG_COM)) == (TIM_FLAG_COM)) - { - if ((itsource & (TIM_IT_COM)) == (TIM_IT_COM)) - { - __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_COM); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->CommutationCallback(htim); -#else - HAL_TIMEx_CommutCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief TIM Peripheral Control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Configure The Input Output channels for OC, PWM, IC or One Pulse mode. - (+) Configure External Clock source. - (+) Configure Complementary channels, break features and dead time. - (+) Configure Master and the Slave synchronization. - (+) Configure the DMA Burst Mode. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the TIM Output Compare Channels according to the specified - * parameters in the TIM_OC_InitTypeDef. - * @param htim TIM Output Compare handle - * @param sConfig TIM Output Compare configuration structure - * @param Channel TIM Channels to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, - const TIM_OC_InitTypeDef *sConfig, - uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CHANNELS(Channel)); - assert_param(IS_TIM_OC_MODE(sConfig->OCMode)); - assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); - - /* Process Locked */ - __HAL_LOCK(htim); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 1 in Output Compare */ - TIM_OC1_SetConfig(htim->Instance, sConfig); - break; - } - - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 2 in Output Compare */ - TIM_OC2_SetConfig(htim->Instance, sConfig); - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 3 in Output Compare */ - TIM_OC3_SetConfig(htim->Instance, sConfig); - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 4 in Output Compare */ - TIM_OC4_SetConfig(htim->Instance, sConfig); - break; - } - - default: - status = HAL_ERROR; - break; - } - - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Initializes the TIM Input Capture Channels according to the specified - * parameters in the TIM_IC_InitTypeDef. - * @param htim TIM IC handle - * @param sConfig TIM Input Capture configuration structure - * @param Channel TIM Channel to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_IC_InitTypeDef *sConfig, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_IC_POLARITY(sConfig->ICPolarity)); - assert_param(IS_TIM_IC_SELECTION(sConfig->ICSelection)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->ICPrescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->ICFilter)); - - /* Process Locked */ - __HAL_LOCK(htim); - - if (Channel == TIM_CHANNEL_1) - { - /* TI1 Configuration */ - TIM_TI1_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - - /* Set the IC1PSC value */ - htim->Instance->CCMR1 |= sConfig->ICPrescaler; - } - else if (Channel == TIM_CHANNEL_2) - { - /* TI2 Configuration */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_TI2_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC2PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; - - /* Set the IC2PSC value */ - htim->Instance->CCMR1 |= (sConfig->ICPrescaler << 8U); - } - else if (Channel == TIM_CHANNEL_3) - { - /* TI3 Configuration */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - TIM_TI3_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC3PSC Bits */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC; - - /* Set the IC3PSC value */ - htim->Instance->CCMR2 |= sConfig->ICPrescaler; - } - else if (Channel == TIM_CHANNEL_4) - { - /* TI4 Configuration */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - TIM_TI4_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC4PSC Bits */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC; - - /* Set the IC4PSC value */ - htim->Instance->CCMR2 |= (sConfig->ICPrescaler << 8U); - } - else - { - status = HAL_ERROR; - } - - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Initializes the TIM PWM channels according to the specified - * parameters in the TIM_OC_InitTypeDef. - * @param htim TIM PWM handle - * @param sConfig TIM PWM configuration structure - * @param Channel TIM Channels to be configured - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, - const TIM_OC_InitTypeDef *sConfig, - uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CHANNELS(Channel)); - assert_param(IS_TIM_PWM_MODE(sConfig->OCMode)); - assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); - assert_param(IS_TIM_FAST_STATE(sConfig->OCFastMode)); - - /* Process Locked */ - __HAL_LOCK(htim); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Configure the Channel 1 in PWM mode */ - TIM_OC1_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel1 */ - htim->Instance->CCMR1 |= TIM_CCMR1_OC1PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE; - htim->Instance->CCMR1 |= sConfig->OCFastMode; - break; - } - - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Configure the Channel 2 in PWM mode */ - TIM_OC2_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel2 */ - htim->Instance->CCMR1 |= TIM_CCMR1_OC2PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE; - htim->Instance->CCMR1 |= sConfig->OCFastMode << 8U; - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Configure the Channel 3 in PWM mode */ - TIM_OC3_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel3 */ - htim->Instance->CCMR2 |= TIM_CCMR2_OC3PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE; - htim->Instance->CCMR2 |= sConfig->OCFastMode; - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Configure the Channel 4 in PWM mode */ - TIM_OC4_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel4 */ - htim->Instance->CCMR2 |= TIM_CCMR2_OC4PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE; - htim->Instance->CCMR2 |= sConfig->OCFastMode << 8U; - break; - } - - default: - status = HAL_ERROR; - break; - } - - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Initializes the TIM One Pulse Channels according to the specified - * parameters in the TIM_OnePulse_InitTypeDef. - * @param htim TIM One Pulse handle - * @param sConfig TIM One Pulse configuration structure - * @param OutputChannel TIM output channel to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @param InputChannel TIM input Channel to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @note To output a waveform with a minimum delay user can enable the fast - * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx - * output is forced in response to the edge detection on TIx input, - * without taking in account the comparison. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, - uint32_t OutputChannel, uint32_t InputChannel) -{ - HAL_StatusTypeDef status = HAL_OK; - TIM_OC_InitTypeDef temp1; - - /* Check the parameters */ - assert_param(IS_TIM_OPM_CHANNELS(OutputChannel)); - assert_param(IS_TIM_OPM_CHANNELS(InputChannel)); - - if (OutputChannel != InputChannel) - { - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Extract the Output compare configuration from sConfig structure */ - temp1.OCMode = sConfig->OCMode; - temp1.Pulse = sConfig->Pulse; - temp1.OCPolarity = sConfig->OCPolarity; - temp1.OCNPolarity = sConfig->OCNPolarity; - temp1.OCIdleState = sConfig->OCIdleState; - temp1.OCNIdleState = sConfig->OCNIdleState; - - switch (OutputChannel) - { - case TIM_CHANNEL_1: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - TIM_OC1_SetConfig(htim->Instance, &temp1); - break; - } - - case TIM_CHANNEL_2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_OC2_SetConfig(htim->Instance, &temp1); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - switch (InputChannel) - { - case TIM_CHANNEL_1: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - TIM_TI1_SetConfig(htim->Instance, sConfig->ICPolarity, - sConfig->ICSelection, sConfig->ICFilter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - - /* Select the Trigger source */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI1FP1; - - /* Select the Slave Mode */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; - break; - } - - case TIM_CHANNEL_2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_TI2_SetConfig(htim->Instance, sConfig->ICPolarity, - sConfig->ICSelection, sConfig->ICFilter); - - /* Reset the IC2PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; - - /* Select the Trigger source */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI2FP2; - - /* Select the Slave Mode */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; - break; - } - - default: - status = HAL_ERROR; - break; - } - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return status; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Configure the DMA Burst to transfer Data from the memory to the TIM peripheral - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @note This function should be used only when BurstLength is equal to DMA data transfer length. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, - uint32_t BurstLength) -{ - HAL_StatusTypeDef status; - - status = HAL_TIM_DMABurst_MultiWriteStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength, - ((BurstLength) >> 8U) + 1U); - - - - return status; -} - -/** - * @brief Configure the DMA Burst to transfer multiple Data from the memory to the TIM peripheral - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @param DataLength Data length. This parameter can be one value - * between 1 and 0xFFFF. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_MultiWriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, - uint32_t BurstLength, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); - assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength)); - - if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY) - { - if ((BurstBuffer == NULL) && (BurstLength > 0U)) - { - return HAL_ERROR; - } - else - { - htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - /* Set the DMA Period elapsed callbacks */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC4: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_COM: - { - /* Set the DMA commutation callbacks */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_TRIGGER: - { - /* Set the DMA trigger callbacks */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; - htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Configure the DMA Burst Mode */ - htim->Instance->DCR = (BurstBaseAddress | BurstLength); - /* Enable the TIM DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM DMA Burst mode - * @param htim TIM handle - * @param BurstRequestSrc TIM DMA Request sources to disable - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - - /* Abort the DMA transfer (at least disable the DMA stream) */ - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); - break; - } - case TIM_DMA_CC1: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - case TIM_DMA_CC2: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - case TIM_DMA_CC3: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - case TIM_DMA_CC4: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - case TIM_DMA_COM: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); - break; - } - case TIM_DMA_TRIGGER: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); - break; - } - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - } - - /* Return function status */ - return status; -} - -/** - * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @note This function should be used only when BurstLength is equal to DMA data transfer length. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) -{ - HAL_StatusTypeDef status; - - status = HAL_TIM_DMABurst_MultiReadStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength, - ((BurstLength) >> 8U) + 1U); - - - return status; -} - -/** - * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @param DataLength Data length. This parameter can be one value - * between 1 and 0xFFFF. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, - uint32_t BurstLength, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); - assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength)); - - if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY) - { - if ((BurstBuffer == NULL) && (BurstLength > 0U)) - { - return HAL_ERROR; - } - else - { - htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - /* Set the DMA Period elapsed callbacks */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC1: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC2: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC3: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC4: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_COM: - { - /* Set the DMA commutation callbacks */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - case TIM_DMA_TRIGGER: - { - /* Set the DMA trigger callbacks */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; - htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, - DataLength) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - break; - } - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Configure the DMA Burst Mode */ - htim->Instance->DCR = (BurstBaseAddress | BurstLength); - - /* Enable the TIM DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); - } - - /* Return function status */ - return status; -} - -/** - * @brief Stop the DMA burst reading - * @param htim TIM handle - * @param BurstRequestSrc TIM DMA Request sources to disable. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - - /* Abort the DMA transfer (at least disable the DMA stream) */ - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); - break; - } - case TIM_DMA_CC1: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - case TIM_DMA_CC2: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - case TIM_DMA_CC3: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - case TIM_DMA_CC4: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - case TIM_DMA_COM: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); - break; - } - case TIM_DMA_TRIGGER: - { - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); - break; - } - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - } - - /* Return function status */ - return status; -} - -/** - * @brief Generate a software event - * @param htim TIM handle - * @param EventSource specifies the event source. - * This parameter can be one of the following values: - * @arg TIM_EVENTSOURCE_UPDATE: Timer update Event source - * @arg TIM_EVENTSOURCE_CC1: Timer Capture Compare 1 Event source - * @arg TIM_EVENTSOURCE_CC2: Timer Capture Compare 2 Event source - * @arg TIM_EVENTSOURCE_CC3: Timer Capture Compare 3 Event source - * @arg TIM_EVENTSOURCE_CC4: Timer Capture Compare 4 Event source - * @arg TIM_EVENTSOURCE_COM: Timer COM event source - * @arg TIM_EVENTSOURCE_TRIGGER: Timer Trigger Event source - * @arg TIM_EVENTSOURCE_BREAK: Timer Break event source - * @note Basic timers can only generate an update event. - * @note TIM_EVENTSOURCE_COM is relevant only with advanced timer instances. - * @note TIM_EVENTSOURCE_BREAK are relevant only for timer instances - * supporting a break input. - * @retval HAL status - */ - -HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_EVENT_SOURCE(EventSource)); - - /* Process Locked */ - __HAL_LOCK(htim); - - /* Change the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Set the event sources */ - htim->Instance->EGR = EventSource; - - /* Change the TIM state */ - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Configures the OCRef clear feature - * @param htim TIM handle - * @param sClearInputConfig pointer to a TIM_ClearInputConfigTypeDef structure that - * contains the OCREF clear feature and parameters for the TIM peripheral. - * @param Channel specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @arg TIM_CHANNEL_4: TIM Channel 4 - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, - const TIM_ClearInputConfigTypeDef *sClearInputConfig, - uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_OCXREF_CLEAR_INSTANCE(htim->Instance)); - assert_param(IS_TIM_CLEARINPUT_SOURCE(sClearInputConfig->ClearInputSource)); - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - switch (sClearInputConfig->ClearInputSource) - { - case TIM_CLEARINPUTSOURCE_NONE: - { - /* Clear the OCREF clear selection bit and the the ETR Bits */ - CLEAR_BIT(htim->Instance->SMCR, (TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP)); - break; - } - - case TIM_CLEARINPUTSOURCE_ETR: - { - /* Check the parameters */ - assert_param(IS_TIM_CLEARINPUT_POLARITY(sClearInputConfig->ClearInputPolarity)); - assert_param(IS_TIM_CLEARINPUT_PRESCALER(sClearInputConfig->ClearInputPrescaler)); - assert_param(IS_TIM_CLEARINPUT_FILTER(sClearInputConfig->ClearInputFilter)); - - /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ - if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) - { - htim->State = HAL_TIM_STATE_READY; - __HAL_UNLOCK(htim); - return HAL_ERROR; - } - - TIM_ETR_SetConfig(htim->Instance, - sClearInputConfig->ClearInputPrescaler, - sClearInputConfig->ClearInputPolarity, - sClearInputConfig->ClearInputFilter); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - switch (Channel) - { - case TIM_CHANNEL_1: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 1 */ - SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); - } - else - { - /* Disable the OCREF clear feature for Channel 1 */ - CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); - } - break; - } - case TIM_CHANNEL_2: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 2 */ - SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); - } - else - { - /* Disable the OCREF clear feature for Channel 2 */ - CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); - } - break; - } - case TIM_CHANNEL_3: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 3 */ - SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); - } - else - { - /* Disable the OCREF clear feature for Channel 3 */ - CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); - } - break; - } - case TIM_CHANNEL_4: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 4 */ - SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); - } - else - { - /* Disable the OCREF clear feature for Channel 4 */ - CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); - } - break; - } - default: - break; - } - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Configures the clock source to be used - * @param htim TIM handle - * @param sClockSourceConfig pointer to a TIM_ClockConfigTypeDef structure that - * contains the clock source information for the TIM peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, const TIM_ClockConfigTypeDef *sClockSourceConfig) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Check the parameters */ - assert_param(IS_TIM_CLOCKSOURCE(sClockSourceConfig->ClockSource)); - - /* Reset the SMS, TS, ECE, ETPS and ETRF bits */ - tmpsmcr = htim->Instance->SMCR; - tmpsmcr &= ~(TIM_SMCR_SMS | TIM_SMCR_TS); - tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); - htim->Instance->SMCR = tmpsmcr; - - switch (sClockSourceConfig->ClockSource) - { - case TIM_CLOCKSOURCE_INTERNAL: - { - assert_param(IS_TIM_INSTANCE(htim->Instance)); - break; - } - - case TIM_CLOCKSOURCE_ETRMODE1: - { - /* Check whether or not the timer instance supports external trigger input mode 1 (ETRF)*/ - assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); - - /* Check ETR input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - /* Configure the ETR Clock source */ - TIM_ETR_SetConfig(htim->Instance, - sClockSourceConfig->ClockPrescaler, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - - /* Select the External clock mode1 and the ETRF trigger */ - tmpsmcr = htim->Instance->SMCR; - tmpsmcr |= (TIM_SLAVEMODE_EXTERNAL1 | TIM_CLOCKSOURCE_ETRMODE1); - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - break; - } - - case TIM_CLOCKSOURCE_ETRMODE2: - { - /* Check whether or not the timer instance supports external trigger input mode 2 (ETRF)*/ - assert_param(IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(htim->Instance)); - - /* Check ETR input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - /* Configure the ETR Clock source */ - TIM_ETR_SetConfig(htim->Instance, - sClockSourceConfig->ClockPrescaler, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - /* Enable the External clock mode2 */ - htim->Instance->SMCR |= TIM_SMCR_ECE; - break; - } - - case TIM_CLOCKSOURCE_TI1: - { - /* Check whether or not the timer instance supports external clock mode 1 */ - assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); - - /* Check TI1 input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - TIM_TI1_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1); - break; - } - - case TIM_CLOCKSOURCE_TI2: - { - /* Check whether or not the timer instance supports external clock mode 1 (ETRF)*/ - assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); - - /* Check TI2 input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - TIM_TI2_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI2); - break; - } - - case TIM_CLOCKSOURCE_TI1ED: - { - /* Check whether or not the timer instance supports external clock mode 1 */ - assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); - - /* Check TI1 input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - TIM_TI1_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1ED); - break; - } - - case TIM_CLOCKSOURCE_ITR0: - case TIM_CLOCKSOURCE_ITR1: - case TIM_CLOCKSOURCE_ITR2: - case TIM_CLOCKSOURCE_ITR3: - { - /* Check whether or not the timer instance supports internal trigger input */ - assert_param(IS_TIM_CLOCKSOURCE_ITRX_INSTANCE(htim->Instance)); - - TIM_ITRx_SetConfig(htim->Instance, sClockSourceConfig->ClockSource); - break; - } - - default: - status = HAL_ERROR; - break; - } - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Selects the signal connected to the TI1 input: direct from CH1_input - * or a XOR combination between CH1_input, CH2_input & CH3_input - * @param htim TIM handle. - * @param TI1_Selection Indicate whether or not channel 1 is connected to the - * output of a XOR gate. - * This parameter can be one of the following values: - * @arg TIM_TI1SELECTION_CH1: The TIMx_CH1 pin is connected to TI1 input - * @arg TIM_TI1SELECTION_XORCOMBINATION: The TIMx_CH1, CH2 and CH3 - * pins are connected to the TI1 input (XOR combination) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection) -{ - uint32_t tmpcr2; - - /* Check the parameters */ - assert_param(IS_TIM_XOR_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TI1SELECTION(TI1_Selection)); - - /* Get the TIMx CR2 register value */ - tmpcr2 = htim->Instance->CR2; - - /* Reset the TI1 selection */ - tmpcr2 &= ~TIM_CR2_TI1S; - - /* Set the TI1 selection */ - tmpcr2 |= TI1_Selection; - - /* Write to TIMxCR2 */ - htim->Instance->CR2 = tmpcr2; - - return HAL_OK; -} - -/** - * @brief Configures the TIM in Slave mode - * @param htim TIM handle. - * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that - * contains the selected trigger (internal trigger input, filtered - * timer input or external trigger input) and the Slave mode - * (Disable, Reset, Gated, Trigger, External clock mode 1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig) -{ - /* Check the parameters */ - assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); - assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); - - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) - { - htim->State = HAL_TIM_STATE_READY; - __HAL_UNLOCK(htim); - return HAL_ERROR; - } - - /* Disable Trigger Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_TRIGGER); - - /* Disable Trigger DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIM in Slave mode in interrupt mode - * @param htim TIM handle. - * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that - * contains the selected trigger (internal trigger input, filtered - * timer input or external trigger input) and the Slave mode - * (Disable, Reset, Gated, Trigger, External clock mode 1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, - const TIM_SlaveConfigTypeDef *sSlaveConfig) -{ - /* Check the parameters */ - assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); - assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); - - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) - { - htim->State = HAL_TIM_STATE_READY; - __HAL_UNLOCK(htim); - return HAL_ERROR; - } - - /* Enable Trigger Interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_TRIGGER); - - /* Disable Trigger DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Read the captured value from Capture Compare unit - * @param htim TIM handle. - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval Captured value - */ -uint32_t HAL_TIM_ReadCapturedValue(const TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpreg = 0U; - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Return the capture 1 value */ - tmpreg = htim->Instance->CCR1; - - break; - } - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Return the capture 2 value */ - tmpreg = htim->Instance->CCR2; - - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Return the capture 3 value */ - tmpreg = htim->Instance->CCR3; - - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Return the capture 4 value */ - tmpreg = htim->Instance->CCR4; - - break; - } - - default: - break; - } - - return tmpreg; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * -@verbatim - ============================================================================== - ##### TIM Callbacks functions ##### - ============================================================================== - [..] - This section provides TIM callback functions: - (+) TIM Period elapsed callback - (+) TIM Output Compare callback - (+) TIM Input capture callback - (+) TIM Trigger callback - (+) TIM Error callback - -@endverbatim - * @{ - */ - -/** - * @brief Period elapsed callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PeriodElapsedCallback could be implemented in the user file - */ -} - -/** - * @brief Period elapsed half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PeriodElapsedHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Output Compare callback in non-blocking mode - * @param htim TIM OC handle - * @retval None - */ -__weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OC_DelayElapsedCallback could be implemented in the user file - */ -} - -/** - * @brief Input Capture callback in non-blocking mode - * @param htim TIM IC handle - * @retval None - */ -__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_CaptureCallback could be implemented in the user file - */ -} - -/** - * @brief Input Capture half complete callback in non-blocking mode - * @param htim TIM IC handle - * @retval None - */ -__weak void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_CaptureHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief PWM Pulse finished callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file - */ -} - -/** - * @brief PWM Pulse finished half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_PulseFinishedHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Hall Trigger detection callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_TriggerCallback could be implemented in the user file - */ -} - -/** - * @brief Hall Trigger detection half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_TriggerHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Timer error callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_ErrorCallback could be implemented in the user file - */ -} - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User TIM callback to be used instead of the weak predefined callback - * @param htim tim handle - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID - * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID - * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID - * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID - * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID - * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID - * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID - * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID - * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID - * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID - * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID - * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID - * @param pCallback pointer to the callback function - * @retval status - */ -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, - pTIM_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - return HAL_ERROR; - } - - if (htim->State == HAL_TIM_STATE_READY) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - htim->Base_MspInitCallback = pCallback; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - htim->Base_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - htim->IC_MspInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - htim->IC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - htim->OC_MspInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - htim->OC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - htim->PWM_MspInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - htim->PWM_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - htim->OnePulse_MspInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - htim->OnePulse_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - htim->Encoder_MspInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - htim->Encoder_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - htim->HallSensor_MspInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - htim->HallSensor_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_PERIOD_ELAPSED_CB_ID : - htim->PeriodElapsedCallback = pCallback; - break; - - case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : - htim->PeriodElapsedHalfCpltCallback = pCallback; - break; - - case HAL_TIM_TRIGGER_CB_ID : - htim->TriggerCallback = pCallback; - break; - - case HAL_TIM_TRIGGER_HALF_CB_ID : - htim->TriggerHalfCpltCallback = pCallback; - break; - - case HAL_TIM_IC_CAPTURE_CB_ID : - htim->IC_CaptureCallback = pCallback; - break; - - case HAL_TIM_IC_CAPTURE_HALF_CB_ID : - htim->IC_CaptureHalfCpltCallback = pCallback; - break; - - case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : - htim->OC_DelayElapsedCallback = pCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : - htim->PWM_PulseFinishedCallback = pCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : - htim->PWM_PulseFinishedHalfCpltCallback = pCallback; - break; - - case HAL_TIM_ERROR_CB_ID : - htim->ErrorCallback = pCallback; - break; - - case HAL_TIM_COMMUTATION_CB_ID : - htim->CommutationCallback = pCallback; - break; - - case HAL_TIM_COMMUTATION_HALF_CB_ID : - htim->CommutationHalfCpltCallback = pCallback; - break; - - case HAL_TIM_BREAK_CB_ID : - htim->BreakCallback = pCallback; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (htim->State == HAL_TIM_STATE_RESET) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - htim->Base_MspInitCallback = pCallback; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - htim->Base_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - htim->IC_MspInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - htim->IC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - htim->OC_MspInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - htim->OC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - htim->PWM_MspInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - htim->PWM_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - htim->OnePulse_MspInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - htim->OnePulse_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - htim->Encoder_MspInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - htim->Encoder_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - htim->HallSensor_MspInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - htim->HallSensor_MspDeInitCallback = pCallback; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Return error status */ - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Unregister a TIM callback - * TIM callback is redirected to the weak predefined callback - * @param htim tim handle - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID - * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID - * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID - * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID - * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID - * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID - * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID - * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID - * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID - * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID - * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID - * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID - * @retval status - */ -HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (htim->State == HAL_TIM_STATE_READY) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - /* Legacy weak Base MspInit Callback */ - htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - /* Legacy weak Base Msp DeInit Callback */ - htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - /* Legacy weak IC Msp Init Callback */ - htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - /* Legacy weak IC Msp DeInit Callback */ - htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - /* Legacy weak OC Msp Init Callback */ - htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - /* Legacy weak OC Msp DeInit Callback */ - htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - /* Legacy weak PWM Msp Init Callback */ - htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - /* Legacy weak PWM Msp DeInit Callback */ - htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - /* Legacy weak One Pulse Msp Init Callback */ - htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - /* Legacy weak One Pulse Msp DeInit Callback */ - htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - /* Legacy weak Encoder Msp Init Callback */ - htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - /* Legacy weak Encoder Msp DeInit Callback */ - htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - /* Legacy weak Hall Sensor Msp Init Callback */ - htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - /* Legacy weak Hall Sensor Msp DeInit Callback */ - htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; - break; - - case HAL_TIM_PERIOD_ELAPSED_CB_ID : - /* Legacy weak Period Elapsed Callback */ - htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; - break; - - case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : - /* Legacy weak Period Elapsed half complete Callback */ - htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; - break; - - case HAL_TIM_TRIGGER_CB_ID : - /* Legacy weak Trigger Callback */ - htim->TriggerCallback = HAL_TIM_TriggerCallback; - break; - - case HAL_TIM_TRIGGER_HALF_CB_ID : - /* Legacy weak Trigger half complete Callback */ - htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; - break; - - case HAL_TIM_IC_CAPTURE_CB_ID : - /* Legacy weak IC Capture Callback */ - htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; - break; - - case HAL_TIM_IC_CAPTURE_HALF_CB_ID : - /* Legacy weak IC Capture half complete Callback */ - htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; - break; - - case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : - /* Legacy weak OC Delay Elapsed Callback */ - htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : - /* Legacy weak PWM Pulse Finished Callback */ - htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : - /* Legacy weak PWM Pulse Finished half complete Callback */ - htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; - break; - - case HAL_TIM_ERROR_CB_ID : - /* Legacy weak Error Callback */ - htim->ErrorCallback = HAL_TIM_ErrorCallback; - break; - - case HAL_TIM_COMMUTATION_CB_ID : - /* Legacy weak Commutation Callback */ - htim->CommutationCallback = HAL_TIMEx_CommutCallback; - break; - - case HAL_TIM_COMMUTATION_HALF_CB_ID : - /* Legacy weak Commutation half complete Callback */ - htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; - break; - - case HAL_TIM_BREAK_CB_ID : - /* Legacy weak Break Callback */ - htim->BreakCallback = HAL_TIMEx_BreakCallback; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (htim->State == HAL_TIM_STATE_RESET) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - /* Legacy weak Base MspInit Callback */ - htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - /* Legacy weak Base Msp DeInit Callback */ - htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - /* Legacy weak IC Msp Init Callback */ - htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - /* Legacy weak IC Msp DeInit Callback */ - htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - /* Legacy weak OC Msp Init Callback */ - htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - /* Legacy weak OC Msp DeInit Callback */ - htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - /* Legacy weak PWM Msp Init Callback */ - htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - /* Legacy weak PWM Msp DeInit Callback */ - htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - /* Legacy weak One Pulse Msp Init Callback */ - htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - /* Legacy weak One Pulse Msp DeInit Callback */ - htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - /* Legacy weak Encoder Msp Init Callback */ - htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - /* Legacy weak Encoder Msp DeInit Callback */ - htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - /* Legacy weak Hall Sensor Msp Init Callback */ - htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - /* Legacy weak Hall Sensor Msp DeInit Callback */ - htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Return error status */ - status = HAL_ERROR; - } - - return status; -} -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief TIM Peripheral State functions - * -@verbatim - ============================================================================== - ##### Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the TIM Base handle state. - * @param htim TIM Base handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM OC handle state. - * @param htim TIM Output Compare handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM PWM handle state. - * @param htim TIM handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM Input Capture handle state. - * @param htim TIM IC handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM One Pulse Mode handle state. - * @param htim TIM OPM handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM Encoder Mode handle state. - * @param htim TIM Encoder Interface handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM Encoder Mode handle state. - * @param htim TIM handle - * @retval Active channel - */ -HAL_TIM_ActiveChannel HAL_TIM_GetActiveChannel(const TIM_HandleTypeDef *htim) -{ - return htim->Channel; -} - -/** - * @brief Return actual state of the TIM channel. - * @param htim TIM handle - * @param Channel TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @arg TIM_CHANNEL_4: TIM Channel 4 - * @arg TIM_CHANNEL_5: TIM Channel 5 - * @arg TIM_CHANNEL_6: TIM Channel 6 - * @retval TIM Channel state - */ -HAL_TIM_ChannelStateTypeDef HAL_TIM_GetChannelState(const TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_TIM_ChannelStateTypeDef channel_state; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); - - return channel_state; -} - -/** - * @brief Return actual state of a DMA burst operation. - * @param htim TIM handle - * @retval DMA burst state - */ -HAL_TIM_DMABurstStateTypeDef HAL_TIM_DMABurstState(const TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); - - return htim->DMABurstState; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup TIM_Private_Functions TIM Private Functions - * @{ - */ - -/** - * @brief TIM DMA error callback - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMAError(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); - } - else - { - htim->State = HAL_TIM_STATE_READY; - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->ErrorCallback(htim); -#else - HAL_TIM_ErrorCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Delay Pulse complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); - } - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Delay Pulse half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PWM_PulseFinishedHalfCpltCallback(htim); -#else - HAL_TIM_PWM_PulseFinishedHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Capture complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); - } - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Capture half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureHalfCpltCallback(htim); -#else - HAL_TIM_IC_CaptureHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Period Elapse complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (htim->hdma[TIM_DMA_ID_UPDATE]->Init.Mode == DMA_NORMAL) - { - htim->State = HAL_TIM_STATE_READY; - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PeriodElapsedCallback(htim); -#else - HAL_TIM_PeriodElapsedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Period Elapse half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PeriodElapsedHalfCpltCallback(htim); -#else - HAL_TIM_PeriodElapsedHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Trigger callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (htim->hdma[TIM_DMA_ID_TRIGGER]->Init.Mode == DMA_NORMAL) - { - htim->State = HAL_TIM_STATE_READY; - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->TriggerCallback(htim); -#else - HAL_TIM_TriggerCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Trigger half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->TriggerHalfCpltCallback(htim); -#else - HAL_TIM_TriggerHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief Time Base configuration - * @param TIMx TIM peripheral - * @param Structure TIM Base configuration structure - * @retval None - */ -void TIM_Base_SetConfig(TIM_TypeDef *TIMx, const TIM_Base_InitTypeDef *Structure) -{ - uint32_t tmpcr1; - tmpcr1 = TIMx->CR1; - - /* Set TIM Time Base Unit parameters ---------------------------------------*/ - if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx)) - { - /* Select the Counter Mode */ - tmpcr1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS); - tmpcr1 |= Structure->CounterMode; - } - - if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx)) - { - /* Set the clock division */ - tmpcr1 &= ~TIM_CR1_CKD; - tmpcr1 |= (uint32_t)Structure->ClockDivision; - } - - /* Set the auto-reload preload */ - MODIFY_REG(tmpcr1, TIM_CR1_ARPE, Structure->AutoReloadPreload); - - /* Set the Autoreload value */ - TIMx->ARR = (uint32_t)Structure->Period ; - - /* Set the Prescaler value */ - TIMx->PSC = Structure->Prescaler; - - if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx)) - { - /* Set the Repetition Counter value */ - TIMx->RCR = Structure->RepetitionCounter; - } - - /* Disable Update Event (UEV) with Update Generation (UG) - by changing Update Request Source (URS) to avoid Update flag (UIF) */ - SET_BIT(TIMx->CR1, TIM_CR1_URS); - - /* Generate an update event to reload the Prescaler - and the repetition counter (only for advanced timer) value immediately */ - TIMx->EGR = TIM_EGR_UG; - - TIMx->CR1 = tmpcr1; -} - -/** - * @brief Timer Output Compare 1 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The output configuration structure - * @retval None - */ -static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - - /* Disable the Channel 1: Reset the CC1E Bit */ - TIMx->CCER &= ~TIM_CCER_CC1E; - - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare Mode Bits */ - tmpccmrx &= ~TIM_CCMR1_OC1M; - tmpccmrx &= ~TIM_CCMR1_CC1S; - /* Select the Output Compare Mode */ - tmpccmrx |= OC_Config->OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC1P; - /* Set the Output Compare Polarity */ - tmpccer |= OC_Config->OCPolarity; - - if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_1)) - { - /* Check parameters */ - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC1NP; - /* Set the Output N Polarity */ - tmpccer |= OC_Config->OCNPolarity; - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC1NE; - } - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS1; - tmpcr2 &= ~TIM_CR2_OIS1N; - /* Set the Output Idle state */ - tmpcr2 |= OC_Config->OCIdleState; - /* Set the Output N Idle state */ - tmpcr2 |= OC_Config->OCNIdleState; - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR1 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Timer Output Compare 2 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The output configuration structure - * @retval None - */ -void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC2E; - - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR1_OC2M; - tmpccmrx &= ~TIM_CCMR1_CC2S; - - /* Select the Output Compare Mode */ - tmpccmrx |= (OC_Config->OCMode << 8U); - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC2P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 4U); - - if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_2)) - { - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC2NP; - /* Set the Output N Polarity */ - tmpccer |= (OC_Config->OCNPolarity << 4U); - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC2NE; - } - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS2; - tmpcr2 &= ~TIM_CR2_OIS2N; - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 2U); - /* Set the Output N Idle state */ - tmpcr2 |= (OC_Config->OCNIdleState << 2U); - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR2 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Timer Output Compare 3 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The output configuration structure - * @retval None - */ -static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - - /* Disable the Channel 3: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC3E; - - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR2_OC3M; - tmpccmrx &= ~TIM_CCMR2_CC3S; - /* Select the Output Compare Mode */ - tmpccmrx |= OC_Config->OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC3P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 8U); - - if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_3)) - { - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC3NP; - /* Set the Output N Polarity */ - tmpccer |= (OC_Config->OCNPolarity << 8U); - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC3NE; - } - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS3; - tmpcr2 &= ~TIM_CR2_OIS3N; - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 4U); - /* Set the Output N Idle state */ - tmpcr2 |= (OC_Config->OCNIdleState << 4U); - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR3 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Timer Output Compare 4 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The output configuration structure - * @retval None - */ -static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - - /* Disable the Channel 4: Reset the CC4E Bit */ - TIMx->CCER &= ~TIM_CCER_CC4E; - - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR2_OC4M; - tmpccmrx &= ~TIM_CCMR2_CC4S; - - /* Select the Output Compare Mode */ - tmpccmrx |= (OC_Config->OCMode << 8U); - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC4P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 12U); - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS4; - - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 6U); - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR4 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Slave Timer configuration function - * @param htim TIM handle - * @param sSlaveConfig Slave timer configuration - * @retval None - */ -static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - const TIM_SlaveConfigTypeDef *sSlaveConfig) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Reset the Trigger Selection Bits */ - tmpsmcr &= ~TIM_SMCR_TS; - /* Set the Input Trigger source */ - tmpsmcr |= sSlaveConfig->InputTrigger; - - /* Reset the slave mode Bits */ - tmpsmcr &= ~TIM_SMCR_SMS; - /* Set the slave mode */ - tmpsmcr |= sSlaveConfig->SlaveMode; - - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - - /* Configure the trigger prescaler, filter, and polarity */ - switch (sSlaveConfig->InputTrigger) - { - case TIM_TS_ETRF: - { - /* Check the parameters */ - assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPRESCALER(sSlaveConfig->TriggerPrescaler)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - /* Configure the ETR Trigger source */ - TIM_ETR_SetConfig(htim->Instance, - sSlaveConfig->TriggerPrescaler, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - break; - } - - case TIM_TS_TI1F_ED: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - if (sSlaveConfig->SlaveMode == TIM_SLAVEMODE_GATED) - { - return HAL_ERROR; - } - - /* Disable the Channel 1: Reset the CC1E Bit */ - tmpccer = htim->Instance->CCER; - htim->Instance->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = htim->Instance->CCMR1; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= ((sSlaveConfig->TriggerFilter) << 4U); - - /* Write to TIMx CCMR1 and CCER registers */ - htim->Instance->CCMR1 = tmpccmr1; - htim->Instance->CCER = tmpccer; - break; - } - - case TIM_TS_TI1FP1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - /* Configure TI1 Filter and Polarity */ - TIM_TI1_ConfigInputStage(htim->Instance, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - break; - } - - case TIM_TS_TI2FP2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - /* Configure TI2 Filter and Polarity */ - TIM_TI2_ConfigInputStage(htim->Instance, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - break; - } - - case TIM_TS_ITR0: - case TIM_TS_ITR1: - case TIM_TS_ITR2: - case TIM_TS_ITR3: - { - /* Check the parameter */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - break; - } - - default: - status = HAL_ERROR; - break; - } - - return status; -} - -/** - * @brief Configure the TI1 as Input. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 1 is selected to be connected to IC1. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 1 is selected to be connected to IC2. - * @arg TIM_ICSELECTION_TRC: TIM Input 1 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI2FP1 - * (on channel2 path) is used as the input signal. Therefore CCMR1 must be - * protected against un-initialized filter and polarity values. - */ -void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 1: Reset the CC1E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = TIMx->CCMR1; - - /* Select the Input */ - if (IS_TIM_CC2_INSTANCE(TIMx) != RESET) - { - tmpccmr1 &= ~TIM_CCMR1_CC1S; - tmpccmr1 |= TIM_ICSelection; - } - else - { - tmpccmr1 |= TIM_CCMR1_CC1S_0; - } - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= ((TIM_ICFilter << 4U) & TIM_CCMR1_IC1F); - - /* Select the Polarity and set the CC1E Bit */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); - tmpccer |= (TIM_ICPolarity & (TIM_CCER_CC1P | TIM_CCER_CC1NP)); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the Polarity and Filter for TI1. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 1: Reset the CC1E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = TIMx->CCMR1; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= (TIM_ICFilter << 4U); - - /* Select the Polarity and set the CC1E Bit */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); - tmpccer |= TIM_ICPolarity; - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI2 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 2 is selected to be connected to IC2. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 2 is selected to be connected to IC1. - * @arg TIM_ICSELECTION_TRC: TIM Input 2 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI1FP2 - * (on channel1 path) is used as the input signal. Therefore CCMR1 must be - * protected against un-initialized filter and polarity values. - */ -static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 2: Reset the CC2E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC2E; - tmpccmr1 = TIMx->CCMR1; - - /* Select the Input */ - tmpccmr1 &= ~TIM_CCMR1_CC2S; - tmpccmr1 |= (TIM_ICSelection << 8U); - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC2F; - tmpccmr1 |= ((TIM_ICFilter << 12U) & TIM_CCMR1_IC2F); - - /* Select the Polarity and set the CC2E Bit */ - tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); - tmpccer |= ((TIM_ICPolarity << 4U) & (TIM_CCER_CC2P | TIM_CCER_CC2NP)); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1 ; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the Polarity and Filter for TI2. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 2: Reset the CC2E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC2E; - tmpccmr1 = TIMx->CCMR1; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC2F; - tmpccmr1 |= (TIM_ICFilter << 12U); - - /* Select the Polarity and set the CC2E Bit */ - tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); - tmpccer |= (TIM_ICPolarity << 4U); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1 ; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI3 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 3 is selected to be connected to IC3. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 3 is selected to be connected to IC4. - * @arg TIM_ICSELECTION_TRC: TIM Input 3 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI3FP4 - * (on channel1 path) is used as the input signal. Therefore CCMR2 must be - * protected against un-initialized filter and polarity values. - */ -static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr2; - uint32_t tmpccer; - - /* Disable the Channel 3: Reset the CC3E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC3E; - tmpccmr2 = TIMx->CCMR2; - - /* Select the Input */ - tmpccmr2 &= ~TIM_CCMR2_CC3S; - tmpccmr2 |= TIM_ICSelection; - - /* Set the filter */ - tmpccmr2 &= ~TIM_CCMR2_IC3F; - tmpccmr2 |= ((TIM_ICFilter << 4U) & TIM_CCMR2_IC3F); - - /* Select the Polarity and set the CC3E Bit */ - tmpccer &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP); - tmpccer |= ((TIM_ICPolarity << 8U) & (TIM_CCER_CC3P | TIM_CCER_CC3NP)); - - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI4 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 4 is selected to be connected to IC4. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 4 is selected to be connected to IC3. - * @arg TIM_ICSELECTION_TRC: TIM Input 4 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI4FP3 - * (on channel1 path) is used as the input signal. Therefore CCMR2 must be - * protected against un-initialized filter and polarity values. - * @retval None - */ -static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr2; - uint32_t tmpccer; - - /* Disable the Channel 4: Reset the CC4E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC4E; - tmpccmr2 = TIMx->CCMR2; - - /* Select the Input */ - tmpccmr2 &= ~TIM_CCMR2_CC4S; - tmpccmr2 |= (TIM_ICSelection << 8U); - - /* Set the filter */ - tmpccmr2 &= ~TIM_CCMR2_IC4F; - tmpccmr2 |= ((TIM_ICFilter << 12U) & TIM_CCMR2_IC4F); - - /* Select the Polarity and set the CC4E Bit */ - tmpccer &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP); - tmpccer |= ((TIM_ICPolarity << 12U) & (TIM_CCER_CC4P | TIM_CCER_CC4NP)); - - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer ; -} - -/** - * @brief Selects the Input Trigger source - * @param TIMx to select the TIM peripheral - * @param InputTriggerSource The Input Trigger source. - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal Trigger 0 - * @arg TIM_TS_ITR1: Internal Trigger 1 - * @arg TIM_TS_ITR2: Internal Trigger 2 - * @arg TIM_TS_ITR3: Internal Trigger 3 - * @arg TIM_TS_TI1F_ED: TI1 Edge Detector - * @arg TIM_TS_TI1FP1: Filtered Timer Input 1 - * @arg TIM_TS_TI2FP2: Filtered Timer Input 2 - * @arg TIM_TS_ETRF: External Trigger input - * @retval None - */ -static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource) -{ - uint32_t tmpsmcr; - - /* Get the TIMx SMCR register value */ - tmpsmcr = TIMx->SMCR; - /* Reset the TS Bits */ - tmpsmcr &= ~TIM_SMCR_TS; - /* Set the Input Trigger source and the slave mode*/ - tmpsmcr |= (InputTriggerSource | TIM_SLAVEMODE_EXTERNAL1); - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} -/** - * @brief Configures the TIMx External Trigger (ETR). - * @param TIMx to select the TIM peripheral - * @param TIM_ExtTRGPrescaler The external Trigger Prescaler. - * This parameter can be one of the following values: - * @arg TIM_ETRPRESCALER_DIV1: ETRP Prescaler OFF. - * @arg TIM_ETRPRESCALER_DIV2: ETRP frequency divided by 2. - * @arg TIM_ETRPRESCALER_DIV4: ETRP frequency divided by 4. - * @arg TIM_ETRPRESCALER_DIV8: ETRP frequency divided by 8. - * @param TIM_ExtTRGPolarity The external Trigger Polarity. - * This parameter can be one of the following values: - * @arg TIM_ETRPOLARITY_INVERTED: active low or falling edge active. - * @arg TIM_ETRPOLARITY_NONINVERTED: active high or rising edge active. - * @param ExtTRGFilter External Trigger Filter. - * This parameter must be a value between 0x00 and 0x0F - * @retval None - */ -void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, - uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter) -{ - uint32_t tmpsmcr; - - tmpsmcr = TIMx->SMCR; - - /* Reset the ETR Bits */ - tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); - - /* Set the Prescaler, the Filter value and the Polarity */ - tmpsmcr |= (uint32_t)(TIM_ExtTRGPrescaler | (TIM_ExtTRGPolarity | (ExtTRGFilter << 8U))); - - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} - -/** - * @brief Enables or disables the TIM Capture Compare Channel x. - * @param TIMx to select the TIM peripheral - * @param Channel specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @arg TIM_CHANNEL_4: TIM Channel 4 - * @param ChannelState specifies the TIM Channel CCxE bit new state. - * This parameter can be: TIM_CCx_ENABLE or TIM_CCx_DISABLE. - * @retval None - */ -void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState) -{ - uint32_t tmp; - - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(TIMx)); - assert_param(IS_TIM_CHANNELS(Channel)); - - tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */ - - /* Reset the CCxE Bit */ - TIMx->CCER &= ~tmp; - - /* Set or reset the CCxE Bit */ - TIMx->CCER |= (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */ -} - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -/** - * @brief Reset interrupt callbacks to the legacy weak callbacks. - * @param htim pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -void TIM_ResetCallback(TIM_HandleTypeDef *htim) -{ - /* Reset the TIM callback to the legacy weak callbacks */ - htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; - htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; - htim->TriggerCallback = HAL_TIM_TriggerCallback; - htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; - htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; - htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; - htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; - htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; - htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; - htim->ErrorCallback = HAL_TIM_ErrorCallback; - htim->CommutationCallback = HAL_TIMEx_CommutCallback; - htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; - htim->BreakCallback = HAL_TIMEx_BreakCallback; -} -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -#endif /* HAL_TIM_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c deleted file mode 100644 index 889f8fb..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c +++ /dev/null @@ -1,2410 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim_ex.c - * @author MCD Application Team - * @brief TIM HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Timer Extended peripheral: - * + Time Hall Sensor Interface Initialization - * + Time Hall Sensor Interface Start - * + Time Complementary signal break and dead time configuration - * + Time Master and Slave synchronization configuration - * + Timer remapping capabilities configuration - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### TIMER Extended features ##### - ============================================================================== - [..] - The Timer Extended features include: - (#) Complementary outputs with programmable dead-time for : - (++) Output Compare - (++) PWM generation (Edge and Center-aligned Mode) - (++) One-pulse mode output - (#) Synchronization circuit to control the timer with external signals and to - interconnect several timers together. - (#) Break input to put the timer output signals in reset state or in a known state. - (#) Supports incremental (quadrature) encoder and hall-sensor circuitry for - positioning purposes - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Initialize the TIM low level resources by implementing the following functions - depending on the selected feature: - (++) Hall Sensor output : HAL_TIMEx_HallSensor_MspInit() - - (#) Initialize the TIM low level resources : - (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); - (##) TIM pins configuration - (+++) Enable the clock for the TIM GPIOs using the following function: - __HAL_RCC_GPIOx_CLK_ENABLE(); - (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); - - (#) The external Clock can be configured, if needed (the default clock is the - internal clock from the APBx), using the following function: - HAL_TIM_ConfigClockSource, the clock configuration should be done before - any start function. - - (#) Configure the TIM in the desired functioning mode using one of the - initialization function of this driver: - (++) HAL_TIMEx_HallSensor_Init() and HAL_TIMEx_ConfigCommutEvent(): to use the - Timer Hall Sensor Interface and the commutation event with the corresponding - Interrupt and DMA request if needed (Note that One Timer is used to interface - with the Hall sensor Interface and another Timer should be used to use - the commutation event). - - (#) Activate the TIM peripheral using one of the start functions: - (++) Complementary Output Compare : HAL_TIMEx_OCN_Start(), HAL_TIMEx_OCN_Start_DMA(), - HAL_TIMEx_OCN_Start_IT() - (++) Complementary PWM generation : HAL_TIMEx_PWMN_Start(), HAL_TIMEx_PWMN_Start_DMA(), - HAL_TIMEx_PWMN_Start_IT() - (++) Complementary One-pulse mode output : HAL_TIMEx_OnePulseN_Start(), HAL_TIMEx_OnePulseN_Start_IT() - (++) Hall Sensor output : HAL_TIMEx_HallSensor_Start(), HAL_TIMEx_HallSensor_Start_DMA(), - HAL_TIMEx_HallSensor_Start_IT(). - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup TIMEx TIMEx - * @brief TIM Extended HAL module driver - * @{ - */ - -#ifdef HAL_TIM_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma); -static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState); - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Functions TIM Extended Exported Functions - * @{ - */ - -/** @defgroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * -@verbatim - ============================================================================== - ##### Timer Hall Sensor functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure TIM HAL Sensor. - (+) De-initialize TIM HAL Sensor. - (+) Start the Hall Sensor Interface. - (+) Stop the Hall Sensor Interface. - (+) Start the Hall Sensor Interface and enable interrupts. - (+) Stop the Hall Sensor Interface and disable interrupts. - (+) Start the Hall Sensor Interface and enable DMA transfers. - (+) Stop the Hall Sensor Interface and disable DMA transfers. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Hall Sensor Interface and initialize the associated handle. - * @note When the timer instance is initialized in Hall Sensor Interface mode, - * timer channels 1 and channel 2 are reserved and cannot be used for - * other purpose. - * @param htim TIM Hall Sensor Interface handle - * @param sConfig TIM Hall Sensor configuration structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, const TIM_HallSensor_InitTypeDef *sConfig) -{ - TIM_OC_InitTypeDef OC_Config; - - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy week callbacks */ - TIM_ResetCallback(htim); - - if (htim->HallSensor_MspInitCallback == NULL) - { - htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->HallSensor_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIMEx_HallSensor_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Configure the Time base in the Encoder Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Configure the Channel 1 as Input Channel to interface with the three Outputs of the Hall sensor */ - TIM_TI1_SetConfig(htim->Instance, sConfig->IC1Polarity, TIM_ICSELECTION_TRC, sConfig->IC1Filter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - /* Set the IC1PSC value */ - htim->Instance->CCMR1 |= sConfig->IC1Prescaler; - - /* Enable the Hall sensor interface (XOR function of the three inputs) */ - htim->Instance->CR2 |= TIM_CR2_TI1S; - - /* Select the TIM_TS_TI1F_ED signal as Input trigger for the TIM */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI1F_ED; - - /* Use the TIM_TS_TI1F_ED signal to reset the TIM counter each edge detection */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_RESET; - - /* Program channel 2 in PWM 2 mode with the desired Commutation_Delay*/ - OC_Config.OCFastMode = TIM_OCFAST_DISABLE; - OC_Config.OCIdleState = TIM_OCIDLESTATE_RESET; - OC_Config.OCMode = TIM_OCMODE_PWM2; - OC_Config.OCNIdleState = TIM_OCNIDLESTATE_RESET; - OC_Config.OCNPolarity = TIM_OCNPOLARITY_HIGH; - OC_Config.OCPolarity = TIM_OCPOLARITY_HIGH; - OC_Config.Pulse = sConfig->Commutation_Delay; - - TIM_OC2_SetConfig(htim->Instance, &OC_Config); - - /* Select OC2REF as trigger output on TRGO: write the MMS bits in the TIMx_CR2 - register to 101 */ - htim->Instance->CR2 &= ~TIM_CR2_MMS; - htim->Instance->CR2 |= TIM_TRGO_OC2REF; - - /* Initialize the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_READY; - - /* Initialize the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM Hall Sensor interface - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->HallSensor_MspDeInitCallback == NULL) - { - htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; - } - /* DeInit the low level hardware */ - htim->HallSensor_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIMEx_HallSensor_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change the DMA burst operation state */ - htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; - - /* Change the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Hall Sensor MSP. - * @param htim TIM Hall Sensor Interface handle - * @retval None - */ -__weak void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_HallSensor_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Hall Sensor MSP. - * @param htim TIM Hall Sensor Interface handle - * @retval None - */ -__weak void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_HallSensor_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Hall Sensor Interface. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Hall sensor Interface. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1, 2 and 3 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Hall Sensor Interface in interrupt mode. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the capture compare Interrupts 1 event */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Hall Sensor Interface in interrupt mode. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts event */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Hall Sensor Interface in DMA mode. - * @param htim TIM Hall Sensor Interface handle - * @param pData The destination Buffer address. - * @param Length The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Set the TIM channel state */ - if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) - || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)) - { - return HAL_BUSY; - } - else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) - && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY)) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - /* Enable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Set the DMA Input Capture 1 Callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream for Capture 1*/ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the capture compare 1 Interrupt */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Hall Sensor Interface in DMA mode. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, - TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - - /* Disable the capture compare Interrupts 1 event */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channel state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * -@verbatim - ============================================================================== - ##### Timer Complementary Output Compare functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the Complementary Output Compare/PWM. - (+) Stop the Complementary Output Compare/PWM. - (+) Start the Complementary Output Compare/PWM and enable interrupts. - (+) Stop the Complementary Output Compare/PWM and disable interrupts. - (+) Start the Complementary Output Compare/PWM and enable DMA transfers. - (+) Stop the Complementary Output Compare/PWM and disable DMA transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Starts the TIM Output Compare signal generation on the complementary - * output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation on the complementary - * output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Disable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in interrupt mode - * on the complementary output. - * @param htim TIM OC handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Output Compare interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Output Compare interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Output Compare interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the TIM Break interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); - - /* Enable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Output Compare signal generation in interrupt mode - * on the complementary output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpccer; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Output Compare interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Output Compare interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Output Compare interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the TIM Break interrupt (only if no more channel is active) */ - tmpccer = htim->Instance->CCER; - if ((tmpccer & TIM_CCER_CCxNE_MASK) == (uint32_t)RESET) - { - __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); - } - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @brief Starts the TIM Output Compare signal generation in DMA mode - * on the complementary output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Set the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) - { - return HAL_BUSY; - } - else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Output Compare DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Output Compare DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Output Compare DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM Output Compare signal generation in DMA mode - * on the complementary output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Output Compare DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Output Compare DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Output Compare DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * -@verbatim - ============================================================================== - ##### Timer Complementary PWM functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the Complementary PWM. - (+) Stop the Complementary PWM. - (+) Start the Complementary PWM and enable interrupts. - (+) Stop the Complementary PWM and disable interrupts. - (+) Start the Complementary PWM and enable DMA transfers. - (+) Stop the Complementary PWM and disable DMA transfers. -@endverbatim - * @{ - */ - -/** - * @brief Starts the PWM signal generation on the complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation on the complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Disable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the PWM signal generation in interrupt mode on the - * complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Check the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) - { - return HAL_ERROR; - } - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the TIM Break interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); - - /* Enable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the PWM signal generation in interrupt mode on the - * complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpccer; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the TIM Break interrupt (only if no more channel is active) */ - tmpccer = htim->Instance->CCER; - if ((tmpccer & TIM_CCER_CCxNE_MASK) == (uint32_t)RESET) - { - __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); - } - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @brief Starts the TIM PWM signal generation in DMA mode on the - * complementary output - * @param htim TIM handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, - uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Set the TIM complementary channel state */ - if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) - { - return HAL_BUSY; - } - else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) - { - if ((pData == NULL) || (Length == 0U)) - { - return HAL_ERROR; - } - else - { - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); - } - } - else - { - return HAL_ERROR; - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseNCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAErrorCCxN ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, - Length) != HAL_OK) - { - /* Return error status */ - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Enable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - } - else - { - __HAL_TIM_ENABLE(htim); - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Stops the TIM PWM signal generation in DMA mode on the complementary - * output - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - default: - status = HAL_ERROR; - break; - } - - if (status == HAL_OK) - { - /* Disable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM complementary channel state */ - TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); - } - - /* Return function status */ - return status; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * -@verbatim - ============================================================================== - ##### Timer Complementary One Pulse functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the Complementary One Pulse generation. - (+) Stop the Complementary One Pulse. - (+) Start the Complementary One Pulse and enable interrupts. - (+) Stop the Complementary One Pulse and disable interrupts. - -@endverbatim - * @{ - */ - -/** - * @brief Starts the TIM One Pulse signal generation on the complementary - * output. - * @note OutputChannel must match the pulse output channel chosen when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel pulse output channel to enable - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the complementary One Pulse output channel and the Input Capture channel */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); - TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation on the complementary - * output. - * @note OutputChannel must match the pulse output channel chosen when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel pulse output channel to disable - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Disable the complementary One Pulse output channel and the Input Capture channel */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); - TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM One Pulse signal generation in interrupt mode on the - * complementary channel. - * @note OutputChannel must match the pulse output channel chosen when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel pulse output channel to enable - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; - HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); - HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); - HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Check the TIM channels state */ - if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) - || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) - { - return HAL_ERROR; - } - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); - - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - - /* Enable the complementary One Pulse output channel and the Input Capture channel */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); - TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation in interrupt mode on the - * complementary channel. - * @note OutputChannel must match the pulse output channel chosen when calling - * @ref HAL_TIM_OnePulse_ConfigChannel(). - * @param htim TIM One Pulse handle - * @param OutputChannel pulse output channel to disable - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - - /* Disable the complementary One Pulse output channel and the Input Capture channel */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); - TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Set the TIM channels state */ - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Configure the commutation event in case of use of the Hall sensor interface. - (+) Configure Output channels for OC and PWM mode. - - (+) Configure Complementary channels, break features and dead time. - (+) Configure Master synchronization. - (+) Configure timer remapping capabilities. - -@endverbatim - * @{ - */ - -/** - * @brief Configure the TIM commutation event sequence. - * @note This function is mandatory to use the commutation event in order to - * update the configuration at each commutation detection on the TRGI input of the Timer, - * the typical use of this feature is with the use of another Timer(interface Timer) - * configured in Hall sensor interface, this interface Timer will generate the - * commutation at its TRGO output (connected to Timer used in this function) each time - * the TI1 of the Interface Timer detect a commutation at its input TI1. - * @param htim TIM handle - * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal trigger 0 selected - * @arg TIM_TS_ITR1: Internal trigger 1 selected - * @arg TIM_TS_ITR2: Internal trigger 2 selected - * @arg TIM_TS_ITR3: Internal trigger 3 selected - * @arg TIM_TS_NONE: No trigger is needed - * @param CommutationSource the Commutation Event source - * This parameter can be one of the following values: - * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer - * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); - assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); - - __HAL_LOCK(htim); - - if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || - (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) - { - /* Select the Input trigger */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= InputTrigger; - } - - /* Select the Capture Compare preload feature */ - htim->Instance->CR2 |= TIM_CR2_CCPC; - /* Select the Commutation event source */ - htim->Instance->CR2 &= ~TIM_CR2_CCUS; - htim->Instance->CR2 |= CommutationSource; - - /* Disable Commutation Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); - - /* Disable Commutation DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configure the TIM commutation event sequence with interrupt. - * @note This function is mandatory to use the commutation event in order to - * update the configuration at each commutation detection on the TRGI input of the Timer, - * the typical use of this feature is with the use of another Timer(interface Timer) - * configured in Hall sensor interface, this interface Timer will generate the - * commutation at its TRGO output (connected to Timer used in this function) each time - * the TI1 of the Interface Timer detect a commutation at its input TI1. - * @param htim TIM handle - * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal trigger 0 selected - * @arg TIM_TS_ITR1: Internal trigger 1 selected - * @arg TIM_TS_ITR2: Internal trigger 2 selected - * @arg TIM_TS_ITR3: Internal trigger 3 selected - * @arg TIM_TS_NONE: No trigger is needed - * @param CommutationSource the Commutation Event source - * This parameter can be one of the following values: - * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer - * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); - assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); - - __HAL_LOCK(htim); - - if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || - (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) - { - /* Select the Input trigger */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= InputTrigger; - } - - /* Select the Capture Compare preload feature */ - htim->Instance->CR2 |= TIM_CR2_CCPC; - /* Select the Commutation event source */ - htim->Instance->CR2 &= ~TIM_CR2_CCUS; - htim->Instance->CR2 |= CommutationSource; - - /* Disable Commutation DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); - - /* Enable the Commutation Interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_COM); - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configure the TIM commutation event sequence with DMA. - * @note This function is mandatory to use the commutation event in order to - * update the configuration at each commutation detection on the TRGI input of the Timer, - * the typical use of this feature is with the use of another Timer(interface Timer) - * configured in Hall sensor interface, this interface Timer will generate the - * commutation at its TRGO output (connected to Timer used in this function) each time - * the TI1 of the Interface Timer detect a commutation at its input TI1. - * @note The user should configure the DMA in his own software, in This function only the COMDE bit is set - * @param htim TIM handle - * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal trigger 0 selected - * @arg TIM_TS_ITR1: Internal trigger 1 selected - * @arg TIM_TS_ITR2: Internal trigger 2 selected - * @arg TIM_TS_ITR3: Internal trigger 3 selected - * @arg TIM_TS_NONE: No trigger is needed - * @param CommutationSource the Commutation Event source - * This parameter can be one of the following values: - * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer - * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); - assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); - - __HAL_LOCK(htim); - - if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || - (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) - { - /* Select the Input trigger */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= InputTrigger; - } - - /* Select the Capture Compare preload feature */ - htim->Instance->CR2 |= TIM_CR2_CCPC; - /* Select the Commutation event source */ - htim->Instance->CR2 &= ~TIM_CR2_CCUS; - htim->Instance->CR2 |= CommutationSource; - - /* Enable the Commutation DMA Request */ - /* Set the DMA Commutation Callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError; - - /* Disable Commutation Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); - - /* Enable the Commutation DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_COM); - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIM in master mode. - * @param htim TIM handle. - * @param sMasterConfig pointer to a TIM_MasterConfigTypeDef structure that - * contains the selected trigger output (TRGO) and the Master/Slave - * mode. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, - const TIM_MasterConfigTypeDef *sMasterConfig) -{ - uint32_t tmpcr2; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); - assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); - - /* Check input state */ - __HAL_LOCK(htim); - - /* Change the handler state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Get the TIMx CR2 register value */ - tmpcr2 = htim->Instance->CR2; - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Reset the MMS Bits */ - tmpcr2 &= ~TIM_CR2_MMS; - /* Select the TRGO source */ - tmpcr2 |= sMasterConfig->MasterOutputTrigger; - - /* Update TIMx CR2 */ - htim->Instance->CR2 = tmpcr2; - - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - /* Reset the MSM Bit */ - tmpsmcr &= ~TIM_SMCR_MSM; - /* Set master mode */ - tmpsmcr |= sMasterConfig->MasterSlaveMode; - - /* Update TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - } - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the Break feature, dead time, Lock level, OSSI/OSSR State - * and the AOE(automatic output enable). - * @param htim TIM handle - * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that - * contains the BDTR Register configuration information for the TIM peripheral. - * @note Interrupts can be generated when an active level is detected on the - * break input, the break 2 input or the system break input. Break - * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, - const TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig) -{ - /* Keep this variable initialized to 0 as it is used to configure BDTR register */ - uint32_t tmpbdtr = 0U; - - /* Check the parameters */ - assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); - assert_param(IS_TIM_OSSR_STATE(sBreakDeadTimeConfig->OffStateRunMode)); - assert_param(IS_TIM_OSSI_STATE(sBreakDeadTimeConfig->OffStateIDLEMode)); - assert_param(IS_TIM_LOCK_LEVEL(sBreakDeadTimeConfig->LockLevel)); - assert_param(IS_TIM_DEADTIME(sBreakDeadTimeConfig->DeadTime)); - assert_param(IS_TIM_BREAK_STATE(sBreakDeadTimeConfig->BreakState)); - assert_param(IS_TIM_BREAK_POLARITY(sBreakDeadTimeConfig->BreakPolarity)); - assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(sBreakDeadTimeConfig->AutomaticOutput)); - - /* Check input state */ - __HAL_LOCK(htim); - - /* Set the Lock level, the Break enable Bit and the Polarity, the OSSR State, - the OSSI State, the dead time value and the Automatic Output Enable Bit */ - - /* Set the BDTR bits */ - MODIFY_REG(tmpbdtr, TIM_BDTR_DTG, sBreakDeadTimeConfig->DeadTime); - MODIFY_REG(tmpbdtr, TIM_BDTR_LOCK, sBreakDeadTimeConfig->LockLevel); - MODIFY_REG(tmpbdtr, TIM_BDTR_OSSI, sBreakDeadTimeConfig->OffStateIDLEMode); - MODIFY_REG(tmpbdtr, TIM_BDTR_OSSR, sBreakDeadTimeConfig->OffStateRunMode); - MODIFY_REG(tmpbdtr, TIM_BDTR_BKE, sBreakDeadTimeConfig->BreakState); - MODIFY_REG(tmpbdtr, TIM_BDTR_BKP, sBreakDeadTimeConfig->BreakPolarity); - MODIFY_REG(tmpbdtr, TIM_BDTR_AOE, sBreakDeadTimeConfig->AutomaticOutput); - - - /* Set TIMx_BDTR */ - htim->Instance->BDTR = tmpbdtr; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIMx Remapping input capabilities. - * @param htim TIM handle. - * @param Remap specifies the TIM remapping source. - * For TIM1, the parameter can have the following values: (**) - * @arg TIM_TIM1_TIM3_TRGO: TIM1 ITR2 is connected to TIM3 TRGO - * @arg TIM_TIM1_LPTIM: TIM1 ITR2 is connected to LPTIM1 output - * - * For TIM2, the parameter can have the following values: (**) - * @arg TIM_TIM2_TIM8_TRGO: TIM2 ITR1 is connected to TIM8 TRGO (*) - * @arg TIM_TIM2_ETH_PTP: TIM2 ITR1 is connected to PTP trigger output (*) - * @arg TIM_TIM2_USBFS_SOF: TIM2 ITR1 is connected to OTG FS SOF - * @arg TIM_TIM2_USBHS_SOF: TIM2 ITR1 is connected to OTG FS SOF - * - * For TIM5, the parameter can have the following values: - * @arg TIM_TIM5_GPIO: TIM5 TI4 is connected to GPIO - * @arg TIM_TIM5_LSI: TIM5 TI4 is connected to LSI - * @arg TIM_TIM5_LSE: TIM5 TI4 is connected to LSE - * @arg TIM_TIM5_RTC: TIM5 TI4 is connected to the RTC wakeup interrupt - * @arg TIM_TIM5_TIM3_TRGO: TIM5 ITR1 is connected to TIM3 TRGO (*) - * @arg TIM_TIM5_LPTIM: TIM5 ITR1 is connected to LPTIM1 output (*) - * - * For TIM9, the parameter can have the following values: (**) - * @arg TIM_TIM9_TIM3_TRGO: TIM9 ITR1 is connected to TIM3 TRGO - * @arg TIM_TIM9_LPTIM: TIM9 ITR1 is connected to LPTIM1 output - * - * For TIM11, the parameter can have the following values: - * @arg TIM_TIM11_GPIO: TIM11 TI1 is connected to GPIO - * @arg TIM_TIM11_HSE: TIM11 TI1 is connected to HSE_RTC clock - * @arg TIM_TIM11_SPDIFRX: TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC (*) - * - * (*) Value not defined in all devices. \n - * (**) Register not available in all devices. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap) -{ - /* Check parameters */ - assert_param(IS_TIM_REMAP(htim->Instance, Remap)); - - __HAL_LOCK(htim); - -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM9_ITR1_RMP) - if ((Remap & LPTIM_REMAP_MASK) == LPTIM_REMAP_MASK) - { - /* Connect TIMx internal trigger to LPTIM1 output */ - __HAL_RCC_LPTIM1_CLK_ENABLE(); - MODIFY_REG(LPTIM1->OR, - (LPTIM_OR_TIM1_ITR2_RMP | LPTIM_OR_TIM5_ITR1_RMP | LPTIM_OR_TIM9_ITR1_RMP), - Remap & ~(LPTIM_REMAP_MASK)); - } - else - { - /* Set the Timer remapping configuration */ - WRITE_REG(htim->Instance->OR, Remap); - } -#else - /* Set the Timer remapping configuration */ - WRITE_REG(htim->Instance->OR, Remap); -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM9_ITR1_RMP */ - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions - * @brief Extended Callbacks functions - * -@verbatim - ============================================================================== - ##### Extended Callbacks functions ##### - ============================================================================== - [..] - This section provides Extended TIM callback functions: - (+) Timer Commutation callback - (+) Timer Break callback - -@endverbatim - * @{ - */ - -/** - * @brief Commutation callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_CommutCallback could be implemented in the user file - */ -} -/** - * @brief Commutation half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_CommutHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Break detection callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_BreakCallback could be implemented in the user file - */ -} -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions - * @brief Extended Peripheral State functions - * -@verbatim - ============================================================================== - ##### Extended Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the TIM Hall Sensor interface handle state. - * @param htim TIM Hall Sensor handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(const TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return actual state of the TIM complementary channel. - * @param htim TIM handle - * @param ChannelN TIM Complementary channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @retval TIM Complementary channel state - */ -HAL_TIM_ChannelStateTypeDef HAL_TIMEx_GetChannelNState(const TIM_HandleTypeDef *htim, uint32_t ChannelN) -{ - HAL_TIM_ChannelStateTypeDef channel_state; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, ChannelN)); - - channel_state = TIM_CHANNEL_N_STATE_GET(htim, ChannelN); - - return channel_state; -} -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions - * @{ - */ - -/** - * @brief TIM DMA Commutation callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->CommutationCallback(htim); -#else - HAL_TIMEx_CommutCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Commutation half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->CommutationHalfCpltCallback(htim); -#else - HAL_TIMEx_CommutHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - - -/** - * @brief TIM DMA Delay Pulse complete callback (complementary channel). - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - - if (hdma->Init.Mode == DMA_NORMAL) - { - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - } - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA error callback (complementary channel) - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->ErrorCallback(htim); -#else - HAL_TIM_ErrorCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief Enables or disables the TIM Capture Compare Channel xN. - * @param TIMx to select the TIM peripheral - * @param Channel specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @param ChannelNState specifies the TIM Channel CCxNE bit new state. - * This parameter can be: TIM_CCxN_ENABLE or TIM_CCxN_Disable. - * @retval None - */ -static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState) -{ - uint32_t tmp; - - tmp = TIM_CCER_CC1NE << (Channel & 0xFU); /* 0xFU = 15 bits max shift */ - - /* Reset the CCxNE Bit */ - TIMx->CCER &= ~tmp; - - /* Set or reset the CCxNE Bit */ - TIMx->CCER |= (uint32_t)(ChannelNState << (Channel & 0xFU)); /* 0xFU = 15 bits max shift */ -} -/** - * @} - */ - -#endif /* HAL_TIM_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c deleted file mode 100644 index cf6d201..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c +++ /dev/null @@ -1,3807 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_uart.c - * @author MCD Application Team - * @brief UART HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Universal Asynchronous Receiver Transmitter Peripheral (UART). - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State and Errors functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The UART HAL driver can be used as follows: - - (#) Declare a UART_HandleTypeDef handle structure (eg. UART_HandleTypeDef huart). - (#) Initialize the UART low level resources by implementing the HAL_UART_MspInit() API: - (##) Enable the USARTx interface clock. - (##) UART pins configuration: - (+++) Enable the clock for the UART GPIOs. - (+++) Configure the UART TX/RX pins as alternate function pull-up. - (##) NVIC configuration if you need to use interrupt process (HAL_UART_Transmit_IT() - and HAL_UART_Receive_IT() APIs): - (+++) Configure the USARTx interrupt priority. - (+++) Enable the NVIC USART IRQ handle. - (##) DMA Configuration if you need to use DMA process (HAL_UART_Transmit_DMA() - and HAL_UART_Receive_DMA() APIs): - (+++) Declare a DMA handle structure for the Tx/Rx stream. - (+++) Enable the DMAx interface clock. - (+++) Configure the declared DMA handle structure with the required - Tx/Rx parameters. - (+++) Configure the DMA Tx/Rx stream. - (+++) Associate the initialized DMA handle to the UART DMA Tx/Rx handle. - (+++) Configure the priority and enable the NVIC for the transfer complete - interrupt on the DMA Tx/Rx stream. - (+++) Configure the USARTx interrupt priority and enable the NVIC USART IRQ handle - (used for last byte sending completion detection in DMA non circular mode) - - (#) Program the Baud Rate, Word Length, Stop Bit, Parity, Hardware - flow control and Mode(Receiver/Transmitter) in the huart Init structure. - - (#) For the UART asynchronous mode, initialize the UART registers by calling - the HAL_UART_Init() API. - - (#) For the UART Half duplex mode, initialize the UART registers by calling - the HAL_HalfDuplex_Init() API. - - (#) For the LIN mode, initialize the UART registers by calling the HAL_LIN_Init() API. - - (#) For the Multi-Processor mode, initialize the UART registers by calling - the HAL_MultiProcessor_Init() API. - - [..] - (@) The specific UART interrupts (Transmission complete interrupt, - RXNE interrupt and Error Interrupts) will be managed using the macros - __HAL_UART_ENABLE_IT() and __HAL_UART_DISABLE_IT() inside the transmit - and receive process. - - [..] - (@) These APIs (HAL_UART_Init() and HAL_HalfDuplex_Init()) configure also the - low level Hardware GPIO, CLOCK, CORTEX...etc) by calling the customized - HAL_UART_MspInit() API. - - ##### Callback registration ##### - ================================== - - [..] - The compilation define USE_HAL_UART_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - - [..] - Use Function HAL_UART_RegisterCallback() to register a user callback. - Function HAL_UART_RegisterCallback() allows to register following callbacks: - (+) TxHalfCpltCallback : Tx Half Complete Callback. - (+) TxCpltCallback : Tx Complete Callback. - (+) RxHalfCpltCallback : Rx Half Complete Callback. - (+) RxCpltCallback : Rx Complete Callback. - (+) ErrorCallback : Error Callback. - (+) AbortCpltCallback : Abort Complete Callback. - (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback. - (+) AbortReceiveCpltCallback : Abort Receive Complete Callback. - (+) MspInitCallback : UART MspInit. - (+) MspDeInitCallback : UART MspDeInit. - This function takes as parameters the HAL peripheral handle, the Callback ID - and a pointer to the user callback function. - - [..] - Use function HAL_UART_UnRegisterCallback() to reset a callback to the default - weak (surcharged) function. - HAL_UART_UnRegisterCallback() takes as parameters the HAL peripheral handle, - and the Callback ID. - This function allows to reset following callbacks: - (+) TxHalfCpltCallback : Tx Half Complete Callback. - (+) TxCpltCallback : Tx Complete Callback. - (+) RxHalfCpltCallback : Rx Half Complete Callback. - (+) RxCpltCallback : Rx Complete Callback. - (+) ErrorCallback : Error Callback. - (+) AbortCpltCallback : Abort Complete Callback. - (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback. - (+) AbortReceiveCpltCallback : Abort Receive Complete Callback. - (+) MspInitCallback : UART MspInit. - (+) MspDeInitCallback : UART MspDeInit. - - [..] - For specific callback RxEventCallback, use dedicated registration/reset functions: - respectively HAL_UART_RegisterRxEventCallback() , HAL_UART_UnRegisterRxEventCallback(). - - [..] - By default, after the HAL_UART_Init() and when the state is HAL_UART_STATE_RESET - all callbacks are set to the corresponding weak (surcharged) functions: - examples HAL_UART_TxCpltCallback(), HAL_UART_RxHalfCpltCallback(). - Exception done for MspInit and MspDeInit functions that are respectively - reset to the legacy weak (surcharged) functions in the HAL_UART_Init() - and HAL_UART_DeInit() only when these callbacks are null (not registered beforehand). - If not, MspInit or MspDeInit are not null, the HAL_UART_Init() and HAL_UART_DeInit() - keep and use the user MspInit/MspDeInit callbacks (registered beforehand). - - [..] - Callbacks can be registered/unregistered in HAL_UART_STATE_READY state only. - Exception done MspInit/MspDeInit that can be registered/unregistered - in HAL_UART_STATE_READY or HAL_UART_STATE_RESET state, thus registered (user) - MspInit/DeInit callbacks can be used during the Init/DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using HAL_UART_RegisterCallback() before calling HAL_UART_DeInit() - or HAL_UART_Init() function. - - [..] - When The compilation define USE_HAL_UART_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registration feature is not available - and weak (surcharged) callbacks are used. - - [..] - Three operation modes are available within this driver : - - *** Polling mode IO operation *** - ================================= - [..] - (+) Send an amount of data in blocking mode using HAL_UART_Transmit() - (+) Receive an amount of data in blocking mode using HAL_UART_Receive() - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Send an amount of data in non blocking mode using HAL_UART_Transmit_IT() - (+) At transmission end of transfer HAL_UART_TxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_UART_TxCpltCallback - (+) Receive an amount of data in non blocking mode using HAL_UART_Receive_IT() - (+) At reception end of transfer HAL_UART_RxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_UART_RxCpltCallback - (+) In case of transfer Error, HAL_UART_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_UART_ErrorCallback - - *** DMA mode IO operation *** - ============================== - [..] - (+) Send an amount of data in non blocking mode (DMA) using HAL_UART_Transmit_DMA() - (+) At transmission end of half transfer HAL_UART_TxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_UART_TxHalfCpltCallback - (+) At transmission end of transfer HAL_UART_TxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_UART_TxCpltCallback - (+) Receive an amount of data in non blocking mode (DMA) using HAL_UART_Receive_DMA() - (+) At reception end of half transfer HAL_UART_RxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_UART_RxHalfCpltCallback - (+) At reception end of transfer HAL_UART_RxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_UART_RxCpltCallback - (+) In case of transfer Error, HAL_UART_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_UART_ErrorCallback - (+) Pause the DMA Transfer using HAL_UART_DMAPause() - (+) Resume the DMA Transfer using HAL_UART_DMAResume() - (+) Stop the DMA Transfer using HAL_UART_DMAStop() - - - [..] This subsection also provides a set of additional functions providing enhanced reception - services to user. (For example, these functions allow application to handle use cases - where number of data to be received is unknown). - - (#) Compared to standard reception services which only consider number of received - data elements as reception completion criteria, these functions also consider additional events - as triggers for updating reception status to caller : - (+) Detection of inactivity period (RX line has not been active for a given period). - (++) RX inactivity detected by IDLE event, i.e. RX line has been in idle state (normally high state) - for 1 frame time, after last received byte. - - (#) There are two mode of transfer: - (+) Blocking mode: The reception is performed in polling mode, until either expected number of data is received, - or till IDLE event occurs. Reception is handled only during function execution. - When function exits, no data reception could occur. HAL status and number of actually received data elements, - are returned by function after finishing transfer. - (+) Non-Blocking mode: The reception is performed using Interrupts or DMA. - These API's return the HAL status. - The end of the data processing will be indicated through the - dedicated UART IRQ when using Interrupt mode or the DMA IRQ when using DMA mode. - The HAL_UARTEx_RxEventCallback() user callback will be executed during Receive process - The HAL_UART_ErrorCallback()user callback will be executed when a reception error is detected. - - (#) Blocking mode API: - (+) HAL_UARTEx_ReceiveToIdle() - - (#) Non-Blocking mode API with Interrupt: - (+) HAL_UARTEx_ReceiveToIdle_IT() - - (#) Non-Blocking mode API with DMA: - (+) HAL_UARTEx_ReceiveToIdle_DMA() - - - *** UART HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in UART HAL driver. - - (+) __HAL_UART_ENABLE: Enable the UART peripheral - (+) __HAL_UART_DISABLE: Disable the UART peripheral - (+) __HAL_UART_GET_FLAG : Check whether the specified UART flag is set or not - (+) __HAL_UART_CLEAR_FLAG : Clear the specified UART pending flag - (+) __HAL_UART_ENABLE_IT: Enable the specified UART interrupt - (+) __HAL_UART_DISABLE_IT: Disable the specified UART interrupt - (+) __HAL_UART_GET_IT_SOURCE: Check whether the specified UART interrupt has occurred or not - - [..] - (@) You can refer to the UART HAL driver header file for more useful macros - - @endverbatim - [..] - (@) Additional remark: If the parity is enabled, then the MSB bit of the data written - in the data register is transmitted but is changed by the parity bit. - Depending on the frame length defined by the M bit (8-bits or 9-bits), - the possible UART frame formats are as listed in the following table: - +-------------------------------------------------------------+ - | M bit | PCE bit | UART frame | - |---------------------|---------------------------------------| - | 0 | 0 | | SB | 8 bit data | STB | | - |---------|-----------|---------------------------------------| - | 0 | 1 | | SB | 7 bit data | PB | STB | | - |---------|-----------|---------------------------------------| - | 1 | 0 | | SB | 9 bit data | STB | | - |---------|-----------|---------------------------------------| - | 1 | 1 | | SB | 8 bit data | PB | STB | | - +-------------------------------------------------------------+ - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup UART UART - * @brief HAL UART module driver - * @{ - */ -#ifdef HAL_UART_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup UART_Private_Constants - * @{ - */ -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup UART_Private_Functions UART Private Functions - * @{ - */ - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) -void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ -static void UART_EndTxTransfer(UART_HandleTypeDef *huart); -static void UART_EndRxTransfer(UART_HandleTypeDef *huart); -static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma); -static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma); -static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma); -static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma); -static void UART_DMAError(DMA_HandleTypeDef *hdma); -static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma); -static void UART_DMATxAbortCallback(DMA_HandleTypeDef *hdma); -static void UART_DMARxAbortCallback(DMA_HandleTypeDef *hdma); -static void UART_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma); -static void UART_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart); -static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart); -static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart); -static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, - uint32_t Tickstart, uint32_t Timeout); -static void UART_SetConfig(UART_HandleTypeDef *huart); - -/** - * @} - */ - -/* Exported functions ---------------------------------------------------------*/ -/** @defgroup UART_Exported_Functions UART Exported Functions - * @{ - */ - -/** @defgroup UART_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to initialize the USARTx or the UARTy - in asynchronous mode. - (+) For the asynchronous mode only these parameters can be configured: - (++) Baud Rate - (++) Word Length - (++) Stop Bit - (++) Parity: If the parity is enabled, then the MSB bit of the data written - in the data register is transmitted but is changed by the parity bit. - Depending on the frame length defined by the M bit (8-bits or 9-bits), - please refer to Reference manual for possible UART frame formats. - (++) Hardware flow control - (++) Receiver/transmitter modes - (++) Over Sampling Method - [..] - The HAL_UART_Init(), HAL_HalfDuplex_Init(), HAL_LIN_Init() and HAL_MultiProcessor_Init() APIs - follow respectively the UART asynchronous, UART Half duplex, LIN and Multi-Processor configuration - procedures (details for the procedures are available in reference manual - (RM0430 for STM32F4X3xx MCUs and RM0402 for STM32F412xx MCUs - RM0383 for STM32F411xC/E MCUs and RM0401 for STM32F410xx MCUs - RM0090 for STM32F4X5xx/STM32F4X7xx/STM32F429xx/STM32F439xx MCUs - RM0390 for STM32F446xx MCUs and RM0386 for STM32F469xx/STM32F479xx MCUs)). - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the UART mode according to the specified parameters in - * the UART_InitTypeDef and create the associated handle. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) -{ - /* Check the UART handle allocation */ - if (huart == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - if (huart->Init.HwFlowCtl != UART_HWCONTROL_NONE) - { - /* The hardware flow control is available only for USART1, USART2, USART3 and USART6. - Except for STM32F446xx devices, that is available for USART1, USART2, USART3, USART6, UART4 and UART5. - */ - assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance)); - assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl)); - } - else - { - assert_param(IS_UART_INSTANCE(huart->Instance)); - } - assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); - assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling)); - - if (huart->gState == HAL_UART_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - huart->Lock = HAL_UNLOCKED; - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - UART_InitCallbacksToDefault(huart); - - if (huart->MspInitCallback == NULL) - { - huart->MspInitCallback = HAL_UART_MspInit; - } - - /* Init the low level hardware */ - huart->MspInitCallback(huart); -#else - /* Init the low level hardware : GPIO, CLOCK */ - HAL_UART_MspInit(huart); -#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ - } - - huart->gState = HAL_UART_STATE_BUSY; - - /* Disable the peripheral */ - __HAL_UART_DISABLE(huart); - - /* Set the UART Communication parameters */ - UART_SetConfig(huart); - - /* In asynchronous mode, the following bits must be kept cleared: - - LINEN and CLKEN bits in the USART_CR2 register, - - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/ - CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); - CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); - - /* Enable the peripheral */ - __HAL_UART_ENABLE(huart); - - /* Initialize the UART state */ - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->gState = HAL_UART_STATE_READY; - huart->RxState = HAL_UART_STATE_READY; - huart->RxEventType = HAL_UART_RXEVENT_TC; - - return HAL_OK; -} - -/** - * @brief Initializes the half-duplex mode according to the specified - * parameters in the UART_InitTypeDef and create the associated handle. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart) -{ - /* Check the UART handle allocation */ - if (huart == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_UART_HALFDUPLEX_INSTANCE(huart->Instance)); - assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); - assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling)); - - if (huart->gState == HAL_UART_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - huart->Lock = HAL_UNLOCKED; - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - UART_InitCallbacksToDefault(huart); - - if (huart->MspInitCallback == NULL) - { - huart->MspInitCallback = HAL_UART_MspInit; - } - - /* Init the low level hardware */ - huart->MspInitCallback(huart); -#else - /* Init the low level hardware : GPIO, CLOCK */ - HAL_UART_MspInit(huart); -#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ - } - - huart->gState = HAL_UART_STATE_BUSY; - - /* Disable the peripheral */ - __HAL_UART_DISABLE(huart); - - /* Set the UART Communication parameters */ - UART_SetConfig(huart); - - /* In half-duplex mode, the following bits must be kept cleared: - - LINEN and CLKEN bits in the USART_CR2 register, - - SCEN and IREN bits in the USART_CR3 register.*/ - CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); - CLEAR_BIT(huart->Instance->CR3, (USART_CR3_IREN | USART_CR3_SCEN)); - - /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */ - SET_BIT(huart->Instance->CR3, USART_CR3_HDSEL); - - /* Enable the peripheral */ - __HAL_UART_ENABLE(huart); - - /* Initialize the UART state*/ - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->gState = HAL_UART_STATE_READY; - huart->RxState = HAL_UART_STATE_READY; - huart->RxEventType = HAL_UART_RXEVENT_TC; - - return HAL_OK; -} - -/** - * @brief Initializes the LIN mode according to the specified - * parameters in the UART_InitTypeDef and create the associated handle. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param BreakDetectLength Specifies the LIN break detection length. - * This parameter can be one of the following values: - * @arg UART_LINBREAKDETECTLENGTH_10B: 10-bit break detection - * @arg UART_LINBREAKDETECTLENGTH_11B: 11-bit break detection - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength) -{ - /* Check the UART handle allocation */ - if (huart == NULL) - { - return HAL_ERROR; - } - - /* Check the LIN UART instance */ - assert_param(IS_UART_LIN_INSTANCE(huart->Instance)); - - /* Check the Break detection length parameter */ - assert_param(IS_UART_LIN_BREAK_DETECT_LENGTH(BreakDetectLength)); - assert_param(IS_UART_LIN_WORD_LENGTH(huart->Init.WordLength)); - assert_param(IS_UART_LIN_OVERSAMPLING(huart->Init.OverSampling)); - - if (huart->gState == HAL_UART_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - huart->Lock = HAL_UNLOCKED; - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - UART_InitCallbacksToDefault(huart); - - if (huart->MspInitCallback == NULL) - { - huart->MspInitCallback = HAL_UART_MspInit; - } - - /* Init the low level hardware */ - huart->MspInitCallback(huart); -#else - /* Init the low level hardware : GPIO, CLOCK */ - HAL_UART_MspInit(huart); -#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ - } - - huart->gState = HAL_UART_STATE_BUSY; - - /* Disable the peripheral */ - __HAL_UART_DISABLE(huart); - - /* Set the UART Communication parameters */ - UART_SetConfig(huart); - - /* In LIN mode, the following bits must be kept cleared: - - CLKEN bits in the USART_CR2 register, - - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/ - CLEAR_BIT(huart->Instance->CR2, (USART_CR2_CLKEN)); - CLEAR_BIT(huart->Instance->CR3, (USART_CR3_HDSEL | USART_CR3_IREN | USART_CR3_SCEN)); - - /* Enable the LIN mode by setting the LINEN bit in the CR2 register */ - SET_BIT(huart->Instance->CR2, USART_CR2_LINEN); - - /* Set the USART LIN Break detection length. */ - CLEAR_BIT(huart->Instance->CR2, USART_CR2_LBDL); - SET_BIT(huart->Instance->CR2, BreakDetectLength); - - /* Enable the peripheral */ - __HAL_UART_ENABLE(huart); - - /* Initialize the UART state*/ - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->gState = HAL_UART_STATE_READY; - huart->RxState = HAL_UART_STATE_READY; - huart->RxEventType = HAL_UART_RXEVENT_TC; - - return HAL_OK; -} - -/** - * @brief Initializes the Multi-Processor mode according to the specified - * parameters in the UART_InitTypeDef and create the associated handle. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param Address USART address - * @param WakeUpMethod specifies the USART wake-up method. - * This parameter can be one of the following values: - * @arg UART_WAKEUPMETHOD_IDLELINE: Wake-up by an idle line detection - * @arg UART_WAKEUPMETHOD_ADDRESSMARK: Wake-up by an address mark - * @retval HAL status - */ -HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod) -{ - /* Check the UART handle allocation */ - if (huart == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_UART_INSTANCE(huart->Instance)); - - /* Check the Address & wake up method parameters */ - assert_param(IS_UART_WAKEUPMETHOD(WakeUpMethod)); - assert_param(IS_UART_ADDRESS(Address)); - assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); - assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling)); - - if (huart->gState == HAL_UART_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - huart->Lock = HAL_UNLOCKED; - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - UART_InitCallbacksToDefault(huart); - - if (huart->MspInitCallback == NULL) - { - huart->MspInitCallback = HAL_UART_MspInit; - } - - /* Init the low level hardware */ - huart->MspInitCallback(huart); -#else - /* Init the low level hardware : GPIO, CLOCK */ - HAL_UART_MspInit(huart); -#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ - } - - huart->gState = HAL_UART_STATE_BUSY; - - /* Disable the peripheral */ - __HAL_UART_DISABLE(huart); - - /* Set the UART Communication parameters */ - UART_SetConfig(huart); - - /* In Multi-Processor mode, the following bits must be kept cleared: - - LINEN and CLKEN bits in the USART_CR2 register, - - SCEN, HDSEL and IREN bits in the USART_CR3 register */ - CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); - CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); - - /* Set the USART address node */ - CLEAR_BIT(huart->Instance->CR2, USART_CR2_ADD); - SET_BIT(huart->Instance->CR2, Address); - - /* Set the wake up method by setting the WAKE bit in the CR1 register */ - CLEAR_BIT(huart->Instance->CR1, USART_CR1_WAKE); - SET_BIT(huart->Instance->CR1, WakeUpMethod); - - /* Enable the peripheral */ - __HAL_UART_ENABLE(huart); - - /* Initialize the UART state */ - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->gState = HAL_UART_STATE_READY; - huart->RxState = HAL_UART_STATE_READY; - huart->RxEventType = HAL_UART_RXEVENT_TC; - - return HAL_OK; -} - -/** - * @brief DeInitializes the UART peripheral. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) -{ - /* Check the UART handle allocation */ - if (huart == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_UART_INSTANCE(huart->Instance)); - - huart->gState = HAL_UART_STATE_BUSY; - - /* Disable the Peripheral */ - __HAL_UART_DISABLE(huart); - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - if (huart->MspDeInitCallback == NULL) - { - huart->MspDeInitCallback = HAL_UART_MspDeInit; - } - /* DeInit the low level hardware */ - huart->MspDeInitCallback(huart); -#else - /* DeInit the low level hardware */ - HAL_UART_MspDeInit(huart); -#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ - - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->gState = HAL_UART_STATE_RESET; - huart->RxState = HAL_UART_STATE_RESET; - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; - huart->RxEventType = HAL_UART_RXEVENT_TC; - - /* Process Unlock */ - __HAL_UNLOCK(huart); - - return HAL_OK; -} - -/** - * @brief UART MSP Init. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ -__weak void HAL_UART_MspInit(UART_HandleTypeDef *huart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(huart); - /* NOTE: This function should not be modified, when the callback is needed, - the HAL_UART_MspInit could be implemented in the user file - */ -} - -/** - * @brief UART MSP DeInit. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ -__weak void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(huart); - /* NOTE: This function should not be modified, when the callback is needed, - the HAL_UART_MspDeInit could be implemented in the user file - */ -} - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User UART Callback - * To be used instead of the weak predefined callback - * @note The HAL_UART_RegisterCallback() may be called before HAL_UART_Init(), HAL_HalfDuplex_Init(), HAL_LIN_Init(), - * HAL_MultiProcessor_Init() to register callbacks for HAL_UART_MSPINIT_CB_ID and HAL_UART_MSPDEINIT_CB_ID - * @param huart uart handle - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_UART_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback ID - * @arg @ref HAL_UART_TX_COMPLETE_CB_ID Tx Complete Callback ID - * @arg @ref HAL_UART_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback ID - * @arg @ref HAL_UART_RX_COMPLETE_CB_ID Rx Complete Callback ID - * @arg @ref HAL_UART_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_UART_ABORT_COMPLETE_CB_ID Abort Complete Callback ID - * @arg @ref HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID - * @arg @ref HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID - * @arg @ref HAL_UART_MSPINIT_CB_ID MspInit Callback ID - * @arg @ref HAL_UART_MSPDEINIT_CB_ID MspDeInit Callback ID - * @param pCallback pointer to the Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, - pUART_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - /* Update the error code */ - huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - if (huart->gState == HAL_UART_STATE_READY) - { - switch (CallbackID) - { - case HAL_UART_TX_HALFCOMPLETE_CB_ID : - huart->TxHalfCpltCallback = pCallback; - break; - - case HAL_UART_TX_COMPLETE_CB_ID : - huart->TxCpltCallback = pCallback; - break; - - case HAL_UART_RX_HALFCOMPLETE_CB_ID : - huart->RxHalfCpltCallback = pCallback; - break; - - case HAL_UART_RX_COMPLETE_CB_ID : - huart->RxCpltCallback = pCallback; - break; - - case HAL_UART_ERROR_CB_ID : - huart->ErrorCallback = pCallback; - break; - - case HAL_UART_ABORT_COMPLETE_CB_ID : - huart->AbortCpltCallback = pCallback; - break; - - case HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID : - huart->AbortTransmitCpltCallback = pCallback; - break; - - case HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID : - huart->AbortReceiveCpltCallback = pCallback; - break; - - case HAL_UART_MSPINIT_CB_ID : - huart->MspInitCallback = pCallback; - break; - - case HAL_UART_MSPDEINIT_CB_ID : - huart->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (huart->gState == HAL_UART_STATE_RESET) - { - switch (CallbackID) - { - case HAL_UART_MSPINIT_CB_ID : - huart->MspInitCallback = pCallback; - break; - - case HAL_UART_MSPDEINIT_CB_ID : - huart->MspDeInitCallback = pCallback; - break; - - default : - /* Update the error code */ - huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Unregister an UART Callback - * UART callaback is redirected to the weak predefined callback - * @note The HAL_UART_UnRegisterCallback() may be called before HAL_UART_Init(), HAL_HalfDuplex_Init(), - * HAL_LIN_Init(), HAL_MultiProcessor_Init() to un-register callbacks for HAL_UART_MSPINIT_CB_ID - * and HAL_UART_MSPDEINIT_CB_ID - * @param huart uart handle - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_UART_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback ID - * @arg @ref HAL_UART_TX_COMPLETE_CB_ID Tx Complete Callback ID - * @arg @ref HAL_UART_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback ID - * @arg @ref HAL_UART_RX_COMPLETE_CB_ID Rx Complete Callback ID - * @arg @ref HAL_UART_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_UART_ABORT_COMPLETE_CB_ID Abort Complete Callback ID - * @arg @ref HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID - * @arg @ref HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID - * @arg @ref HAL_UART_MSPINIT_CB_ID MspInit Callback ID - * @arg @ref HAL_UART_MSPDEINIT_CB_ID MspDeInit Callback ID - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (HAL_UART_STATE_READY == huart->gState) - { - switch (CallbackID) - { - case HAL_UART_TX_HALFCOMPLETE_CB_ID : - huart->TxHalfCpltCallback = HAL_UART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ - break; - - case HAL_UART_TX_COMPLETE_CB_ID : - huart->TxCpltCallback = HAL_UART_TxCpltCallback; /* Legacy weak TxCpltCallback */ - break; - - case HAL_UART_RX_HALFCOMPLETE_CB_ID : - huart->RxHalfCpltCallback = HAL_UART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ - break; - - case HAL_UART_RX_COMPLETE_CB_ID : - huart->RxCpltCallback = HAL_UART_RxCpltCallback; /* Legacy weak RxCpltCallback */ - break; - - case HAL_UART_ERROR_CB_ID : - huart->ErrorCallback = HAL_UART_ErrorCallback; /* Legacy weak ErrorCallback */ - break; - - case HAL_UART_ABORT_COMPLETE_CB_ID : - huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - break; - - case HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID : - huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */ - break; - - case HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID : - huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */ - break; - - case HAL_UART_MSPINIT_CB_ID : - huart->MspInitCallback = HAL_UART_MspInit; /* Legacy weak MspInitCallback */ - break; - - case HAL_UART_MSPDEINIT_CB_ID : - huart->MspDeInitCallback = HAL_UART_MspDeInit; /* Legacy weak MspDeInitCallback */ - break; - - default : - /* Update the error code */ - huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (HAL_UART_STATE_RESET == huart->gState) - { - switch (CallbackID) - { - case HAL_UART_MSPINIT_CB_ID : - huart->MspInitCallback = HAL_UART_MspInit; - break; - - case HAL_UART_MSPDEINIT_CB_ID : - huart->MspDeInitCallback = HAL_UART_MspDeInit; - break; - - default : - /* Update the error code */ - huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Update the error code */ - huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - - /* Return error status */ - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Register a User UART Rx Event Callback - * To be used instead of the weak predefined callback - * @param huart Uart handle - * @param pCallback Pointer to the Rx Event Callback function - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_RegisterRxEventCallback(UART_HandleTypeDef *huart, pUART_RxEventCallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(huart); - - if (huart->gState == HAL_UART_STATE_READY) - { - huart->RxEventCallback = pCallback; - } - else - { - huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(huart); - - return status; -} - -/** - * @brief UnRegister the UART Rx Event Callback - * UART Rx Event Callback is redirected to the weak HAL_UARTEx_RxEventCallback() predefined callback - * @param huart Uart handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_UnRegisterRxEventCallback(UART_HandleTypeDef *huart) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(huart); - - if (huart->gState == HAL_UART_STATE_READY) - { - huart->RxEventCallback = HAL_UARTEx_RxEventCallback; /* Legacy weak UART Rx Event Callback */ - } - else - { - huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(huart); - return status; -} -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup UART_Exported_Functions_Group2 IO operation functions - * @brief UART Transmit and Receive functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - This subsection provides a set of functions allowing to manage the UART asynchronous - and Half duplex data transfers. - - (#) There are two modes of transfer: - (+) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - (+) Non-Blocking mode: The communication is performed using Interrupts - or DMA, these API's return the HAL status. - The end of the data processing will be indicated through the - dedicated UART IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The HAL_UART_TxCpltCallback(), HAL_UART_RxCpltCallback() user callbacks - will be executed respectively at the end of the transmit or receive process - The HAL_UART_ErrorCallback()user callback will be executed when a communication error is detected. - - (#) Blocking mode API's are : - (+) HAL_UART_Transmit() - (+) HAL_UART_Receive() - - (#) Non-Blocking mode API's with Interrupt are : - (+) HAL_UART_Transmit_IT() - (+) HAL_UART_Receive_IT() - (+) HAL_UART_IRQHandler() - - (#) Non-Blocking mode API's with DMA are : - (+) HAL_UART_Transmit_DMA() - (+) HAL_UART_Receive_DMA() - (+) HAL_UART_DMAPause() - (+) HAL_UART_DMAResume() - (+) HAL_UART_DMAStop() - - (#) A set of Transfer Complete Callbacks are provided in Non_Blocking mode: - (+) HAL_UART_TxHalfCpltCallback() - (+) HAL_UART_TxCpltCallback() - (+) HAL_UART_RxHalfCpltCallback() - (+) HAL_UART_RxCpltCallback() - (+) HAL_UART_ErrorCallback() - - (#) Non-Blocking mode transfers could be aborted using Abort API's : - (+) HAL_UART_Abort() - (+) HAL_UART_AbortTransmit() - (+) HAL_UART_AbortReceive() - (+) HAL_UART_Abort_IT() - (+) HAL_UART_AbortTransmit_IT() - (+) HAL_UART_AbortReceive_IT() - - (#) For Abort services based on interrupts (HAL_UART_Abortxxx_IT), a set of Abort Complete Callbacks are provided: - (+) HAL_UART_AbortCpltCallback() - (+) HAL_UART_AbortTransmitCpltCallback() - (+) HAL_UART_AbortReceiveCpltCallback() - - (#) A Rx Event Reception Callback (Rx event notification) is available for Non_Blocking modes of enhanced reception services: - (+) HAL_UARTEx_RxEventCallback() - - (#) In Non-Blocking mode transfers, possible errors are split into 2 categories. - Errors are handled as follows : - (+) Error is considered as Recoverable and non blocking : Transfer could go till end, but error severity is - to be evaluated by user : this concerns Frame Error, Parity Error or Noise Error in Interrupt mode reception . - Received character is then retrieved and stored in Rx buffer, Error code is set to allow user to identify error type, - and HAL_UART_ErrorCallback() user callback is executed. Transfer is kept ongoing on UART side. - If user wants to abort it, Abort services should be called by user. - (+) Error is considered as Blocking : Transfer could not be completed properly and is aborted. - This concerns Overrun Error In Interrupt mode reception and all errors in DMA mode. - Error code is set to allow user to identify error type, and HAL_UART_ErrorCallback() user callback is executed. - - -@- In the Half duplex communication, it is forbidden to run the transmit - and receive process in parallel, the UART state HAL_UART_STATE_BUSY_TX_RX can't be useful. - -@endverbatim - * @{ - */ - -/** - * @brief Sends an amount of data in blocking mode. - * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), - * the sent data is handled as a set of u16. In this case, Size must indicate the number - * of u16 provided through pData. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param pData Pointer to data buffer (u8 or u16 data elements). - * @param Size Amount of data elements (u8 or u16) to be sent - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - const uint8_t *pdata8bits; - const uint16_t *pdata16bits; - uint32_t tickstart = 0U; - - /* Check that a Tx process is not already ongoing */ - if (huart->gState == HAL_UART_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->gState = HAL_UART_STATE_BUSY_TX; - - /* Init tickstart for timeout management */ - tickstart = HAL_GetTick(); - - huart->TxXferSize = Size; - huart->TxXferCount = Size; - - /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */ - if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) - { - pdata8bits = NULL; - pdata16bits = (const uint16_t *) pData; - } - else - { - pdata8bits = pData; - pdata16bits = NULL; - } - - while (huart->TxXferCount > 0U) - { - if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) - { - huart->gState = HAL_UART_STATE_READY; - - return HAL_TIMEOUT; - } - if (pdata8bits == NULL) - { - huart->Instance->DR = (uint16_t)(*pdata16bits & 0x01FFU); - pdata16bits++; - } - else - { - huart->Instance->DR = (uint8_t)(*pdata8bits & 0xFFU); - pdata8bits++; - } - huart->TxXferCount--; - } - - if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK) - { - huart->gState = HAL_UART_STATE_READY; - - return HAL_TIMEOUT; - } - - /* At end of Tx process, restore huart->gState to Ready */ - huart->gState = HAL_UART_STATE_READY; - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receives an amount of data in blocking mode. - * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), - * the received data is handled as a set of u16. In this case, Size must indicate the number - * of u16 available through pData. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param pData Pointer to data buffer (u8 or u16 data elements). - * @param Size Amount of data elements (u8 or u16) to be received. - * @param Timeout Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - uint8_t *pdata8bits; - uint16_t *pdata16bits; - uint32_t tickstart = 0U; - - /* Check that a Rx process is not already ongoing */ - if (huart->RxState == HAL_UART_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->RxState = HAL_UART_STATE_BUSY_RX; - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; - - /* Init tickstart for timeout management */ - tickstart = HAL_GetTick(); - - huart->RxXferSize = Size; - huart->RxXferCount = Size; - - /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */ - if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) - { - pdata8bits = NULL; - pdata16bits = (uint16_t *) pData; - } - else - { - pdata8bits = pData; - pdata16bits = NULL; - } - - /* Check the remain data to be received */ - while (huart->RxXferCount > 0U) - { - if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) - { - huart->RxState = HAL_UART_STATE_READY; - - return HAL_TIMEOUT; - } - if (pdata8bits == NULL) - { - *pdata16bits = (uint16_t)(huart->Instance->DR & 0x01FF); - pdata16bits++; - } - else - { - if ((huart->Init.WordLength == UART_WORDLENGTH_9B) || ((huart->Init.WordLength == UART_WORDLENGTH_8B) && (huart->Init.Parity == UART_PARITY_NONE))) - { - *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF); - } - else - { - *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F); - } - pdata8bits++; - } - huart->RxXferCount--; - } - - /* At end of Rx process, restore huart->RxState to Ready */ - huart->RxState = HAL_UART_STATE_READY; - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sends an amount of data in non blocking mode. - * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), - * the sent data is handled as a set of u16. In this case, Size must indicate the number - * of u16 provided through pData. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param pData Pointer to data buffer (u8 or u16 data elements). - * @param Size Amount of data elements (u8 or u16) to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size) -{ - /* Check that a Tx process is not already ongoing */ - if (huart->gState == HAL_UART_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - huart->pTxBuffPtr = pData; - huart->TxXferSize = Size; - huart->TxXferCount = Size; - - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->gState = HAL_UART_STATE_BUSY_TX; - - /* Enable the UART Transmit data register empty Interrupt */ - __HAL_UART_ENABLE_IT(huart, UART_IT_TXE); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receives an amount of data in non blocking mode. - * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), - * the received data is handled as a set of u16. In this case, Size must indicate the number - * of u16 available through pData. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param pData Pointer to data buffer (u8 or u16 data elements). - * @param Size Amount of data elements (u8 or u16) to be received. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) -{ - /* Check that a Rx process is not already ongoing */ - if (huart->RxState == HAL_UART_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Set Reception type to Standard reception */ - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; - - return (UART_Start_Receive_IT(huart, pData, Size)); - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sends an amount of data in DMA mode. - * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), - * the sent data is handled as a set of u16. In this case, Size must indicate the number - * of u16 provided through pData. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param pData Pointer to data buffer (u8 or u16 data elements). - * @param Size Amount of data elements (u8 or u16) to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size) -{ - const uint32_t *tmp; - - /* Check that a Tx process is not already ongoing */ - if (huart->gState == HAL_UART_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - huart->pTxBuffPtr = pData; - huart->TxXferSize = Size; - huart->TxXferCount = Size; - - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->gState = HAL_UART_STATE_BUSY_TX; - - /* Set the UART DMA transfer complete callback */ - huart->hdmatx->XferCpltCallback = UART_DMATransmitCplt; - - /* Set the UART DMA Half transfer complete callback */ - huart->hdmatx->XferHalfCpltCallback = UART_DMATxHalfCplt; - - /* Set the DMA error callback */ - huart->hdmatx->XferErrorCallback = UART_DMAError; - - /* Set the DMA abort callback */ - huart->hdmatx->XferAbortCallback = NULL; - - /* Enable the UART transmit DMA stream */ - tmp = (const uint32_t *)&pData; - if (HAL_DMA_Start_IT(huart->hdmatx, *(const uint32_t *)tmp, (uint32_t)&huart->Instance->DR, Size) != HAL_OK) - { - /* Set error code to DMA */ - huart->ErrorCode = HAL_UART_ERROR_DMA; - - /* Restore huart->gState to ready */ - huart->gState = HAL_UART_STATE_READY; - - return HAL_ERROR; - } - /* Clear the TC flag in the SR register by writing 0 to it */ - __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC); - - /* Enable the DMA transfer for transmit request by setting the DMAT bit - in the UART CR3 register */ - ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAT); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receives an amount of data in DMA mode. - * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), - * the received data is handled as a set of u16. In this case, Size must indicate the number - * of u16 available through pData. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param pData Pointer to data buffer (u8 or u16 data elements). - * @param Size Amount of data elements (u8 or u16) to be received. - * @note When the UART parity is enabled (PCE = 1) the received data contains the parity bit. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) -{ - /* Check that a Rx process is not already ongoing */ - if (huart->RxState == HAL_UART_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Set Reception type to Standard reception */ - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; - - return (UART_Start_Receive_DMA(huart, pData, Size)); - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Pauses the DMA Transfer. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) -{ - uint32_t dmarequest = 0x00U; - - dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT); - if ((huart->gState == HAL_UART_STATE_BUSY_TX) && dmarequest) - { - /* Disable the UART DMA Tx request */ - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); - } - - dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR); - if ((huart->RxState == HAL_UART_STATE_BUSY_RX) && dmarequest) - { - /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ - ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE); - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); - - /* Disable the UART DMA Rx request */ - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); - } - - return HAL_OK; -} - -/** - * @brief Resumes the DMA Transfer. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) -{ - - if (huart->gState == HAL_UART_STATE_BUSY_TX) - { - /* Enable the UART DMA Tx request */ - ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAT); - } - - if (huart->RxState == HAL_UART_STATE_BUSY_RX) - { - /* Clear the Overrun flag before resuming the Rx transfer*/ - __HAL_UART_CLEAR_OREFLAG(huart); - - /* Re-enable PE and ERR (Frame error, noise error, overrun error) interrupts */ - if (huart->Init.Parity != UART_PARITY_NONE) - { - ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_PEIE); - } - ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_EIE); - - /* Enable the UART DMA Rx request */ - ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAR); - } - - return HAL_OK; -} - -/** - * @brief Stops the DMA Transfer. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart) -{ - uint32_t dmarequest = 0x00U; - /* The Lock is not implemented on this API to allow the user application - to call the HAL UART API under callbacks HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback(): - when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated - and the correspond call back is executed HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback() - */ - - /* Stop UART DMA Tx request if ongoing */ - dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT); - if ((huart->gState == HAL_UART_STATE_BUSY_TX) && dmarequest) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); - - /* Abort the UART DMA Tx stream */ - if (huart->hdmatx != NULL) - { - HAL_DMA_Abort(huart->hdmatx); - } - UART_EndTxTransfer(huart); - } - - /* Stop UART DMA Rx request if ongoing */ - dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR); - if ((huart->RxState == HAL_UART_STATE_BUSY_RX) && dmarequest) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); - - /* Abort the UART DMA Rx stream */ - if (huart->hdmarx != NULL) - { - HAL_DMA_Abort(huart->hdmarx); - } - UART_EndRxTransfer(huart); - } - - return HAL_OK; -} - -/** - * @brief Receive an amount of data in blocking mode till either the expected number of data is received or an IDLE event occurs. - * @note HAL_OK is returned if reception is completed (expected number of data has been received) - * or if reception is stopped after IDLE event (less than the expected number of data has been received) - * In this case, RxLen output parameter indicates number of data available in reception buffer. - * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M = 01), - * the received data is handled as a set of uint16_t. In this case, Size must indicate the number - * of uint16_t available through pData. - * @param huart UART handle. - * @param pData Pointer to data buffer (uint8_t or uint16_t data elements). - * @param Size Amount of data elements (uint8_t or uint16_t) to be received. - * @param RxLen Number of data elements finally received (could be lower than Size, in case reception ends on IDLE event) - * @param Timeout Timeout duration expressed in ms (covers the whole reception sequence). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen, - uint32_t Timeout) -{ - uint8_t *pdata8bits; - uint16_t *pdata16bits; - uint32_t tickstart; - - /* Check that a Rx process is not already ongoing */ - if (huart->RxState == HAL_UART_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->RxState = HAL_UART_STATE_BUSY_RX; - huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE; - huart->RxEventType = HAL_UART_RXEVENT_TC; - - /* Init tickstart for timeout management */ - tickstart = HAL_GetTick(); - - huart->RxXferSize = Size; - huart->RxXferCount = Size; - - /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */ - if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) - { - pdata8bits = NULL; - pdata16bits = (uint16_t *) pData; - } - else - { - pdata8bits = pData; - pdata16bits = NULL; - } - - /* Initialize output number of received elements */ - *RxLen = 0U; - - /* as long as data have to be received */ - while (huart->RxXferCount > 0U) - { - /* Check if IDLE flag is set */ - if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) - { - /* Clear IDLE flag in ISR */ - __HAL_UART_CLEAR_IDLEFLAG(huart); - - /* If Set, but no data ever received, clear flag without exiting loop */ - /* If Set, and data has already been received, this means Idle Event is valid : End reception */ - if (*RxLen > 0U) - { - huart->RxEventType = HAL_UART_RXEVENT_IDLE; - huart->RxState = HAL_UART_STATE_READY; - - return HAL_OK; - } - } - - /* Check if RXNE flag is set */ - if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE)) - { - if (pdata8bits == NULL) - { - *pdata16bits = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF); - pdata16bits++; - } - else - { - if ((huart->Init.WordLength == UART_WORDLENGTH_9B) || ((huart->Init.WordLength == UART_WORDLENGTH_8B) && (huart->Init.Parity == UART_PARITY_NONE))) - { - *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF); - } - else - { - *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F); - } - - pdata8bits++; - } - /* Increment number of received elements */ - *RxLen += 1U; - huart->RxXferCount--; - } - - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) - { - huart->RxState = HAL_UART_STATE_READY; - - return HAL_TIMEOUT; - } - } - } - - /* Set number of received elements in output parameter : RxLen */ - *RxLen = huart->RxXferSize - huart->RxXferCount; - /* At end of Rx process, restore huart->RxState to Ready */ - huart->RxState = HAL_UART_STATE_READY; - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in interrupt mode till either the expected number of data is received or an IDLE event occurs. - * @note Reception is initiated by this function call. Further progress of reception is achieved thanks - * to UART interrupts raised by RXNE and IDLE events. Callback is called at end of reception indicating - * number of received data elements. - * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M = 01), - * the received data is handled as a set of uint16_t. In this case, Size must indicate the number - * of uint16_t available through pData. - * @param huart UART handle. - * @param pData Pointer to data buffer (uint8_t or uint16_t data elements). - * @param Size Amount of data elements (uint8_t or uint16_t) to be received. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) -{ - HAL_StatusTypeDef status; - - /* Check that a Rx process is not already ongoing */ - if (huart->RxState == HAL_UART_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Set Reception type to reception till IDLE Event*/ - huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE; - huart->RxEventType = HAL_UART_RXEVENT_TC; - - status = UART_Start_Receive_IT(huart, pData, Size); - - /* Check Rx process has been successfully started */ - if (status == HAL_OK) - { - if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) - { - __HAL_UART_CLEAR_IDLEFLAG(huart); - ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); - } - else - { - /* In case of errors already pending when reception is started, - Interrupts may have already been raised and lead to reception abortion. - (Overrun error for instance). - In such case Reception Type has been reset to HAL_UART_RECEPTION_STANDARD. */ - status = HAL_ERROR; - } - } - - return status; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in DMA mode till either the expected number of data is received or an IDLE event occurs. - * @note Reception is initiated by this function call. Further progress of reception is achieved thanks - * to DMA services, transferring automatically received data elements in user reception buffer and - * calling registered callbacks at half/end of reception. UART IDLE events are also used to consider - * reception phase as ended. In all cases, callback execution will indicate number of received data elements. - * @note When the UART parity is enabled (PCE = 1), the received data contain - * the parity bit (MSB position). - * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M = 01), - * the received data is handled as a set of uint16_t. In this case, Size must indicate the number - * of uint16_t available through pData. - * @param huart UART handle. - * @param pData Pointer to data buffer (uint8_t or uint16_t data elements). - * @param Size Amount of data elements (uint8_t or uint16_t) to be received. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) -{ - HAL_StatusTypeDef status; - - /* Check that a Rx process is not already ongoing */ - if (huart->RxState == HAL_UART_STATE_READY) - { - if ((pData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - /* Set Reception type to reception till IDLE Event*/ - huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE; - huart->RxEventType = HAL_UART_RXEVENT_TC; - - status = UART_Start_Receive_DMA(huart, pData, Size); - - /* Check Rx process has been successfully started */ - if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) - { - __HAL_UART_CLEAR_IDLEFLAG(huart); - ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); - } - else - { - /* In case of errors already pending when reception is started, - Interrupts may have already been raised and lead to reception abortion. - (Overrun error for instance). - In such case Reception Type has been reset to HAL_UART_RECEPTION_STANDARD. */ - status = HAL_ERROR; - } - - return status; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Provide Rx Event type that has lead to RxEvent callback execution. - * @note When HAL_UARTEx_ReceiveToIdle_IT() or HAL_UARTEx_ReceiveToIdle_DMA() API are called, progress - * of reception process is provided to application through calls of Rx Event callback (either default one - * HAL_UARTEx_RxEventCallback() or user registered one). As several types of events could occur (IDLE event, - * Half Transfer, or Transfer Complete), this function allows to retrieve the Rx Event type that has lead - * to Rx Event callback execution. - * @note This function is expected to be called within the user implementation of Rx Event Callback, - * in order to provide the accurate value : - * In Interrupt Mode : - * - HAL_UART_RXEVENT_TC : when Reception has been completed (expected nb of data has been received) - * - HAL_UART_RXEVENT_IDLE : when Idle event occurred prior reception has been completed (nb of - * received data is lower than expected one) - * In DMA Mode : - * - HAL_UART_RXEVENT_TC : when Reception has been completed (expected nb of data has been received) - * - HAL_UART_RXEVENT_HT : when half of expected nb of data has been received - * - HAL_UART_RXEVENT_IDLE : when Idle event occurred prior reception has been completed (nb of - * received data is lower than expected one). - * In DMA mode, RxEvent callback could be called several times; - * When DMA is configured in Normal Mode, HT event does not stop Reception process; - * When DMA is configured in Circular Mode, HT, TC or IDLE events don't stop Reception process; - * @param huart UART handle. - * @retval Rx Event Type (returned value will be a value of @ref UART_RxEvent_Type_Values) - */ -HAL_UART_RxEventTypeTypeDef HAL_UARTEx_GetRxEventType(UART_HandleTypeDef *huart) -{ - /* Return Rx Event type value, as stored in UART handle */ - return(huart->RxEventType); -} - -/** - * @brief Abort ongoing transfers (blocking mode). - * @param huart UART handle. - * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable UART Interrupts (Tx and Rx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) - * - Set handle State to READY - * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) -{ - /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ - ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE)); - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); - - /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ - if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); - } - - /* Disable the UART DMA Tx request if enabled */ - if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); - - /* Abort the UART DMA Tx stream: use blocking DMA Abort API (no callback) */ - if (huart->hdmatx != NULL) - { - /* Set the UART DMA Abort callback to Null. - No call back execution at end of DMA abort procedure */ - huart->hdmatx->XferAbortCallback = NULL; - - if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK) - { - if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT) - { - /* Set error code to DMA */ - huart->ErrorCode = HAL_UART_ERROR_DMA; - - return HAL_TIMEOUT; - } - } - } - } - - /* Disable the UART DMA Rx request if enabled */ - if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); - - /* Abort the UART DMA Rx stream: use blocking DMA Abort API (no callback) */ - if (huart->hdmarx != NULL) - { - /* Set the UART DMA Abort callback to Null. - No call back execution at end of DMA abort procedure */ - huart->hdmarx->XferAbortCallback = NULL; - - if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK) - { - if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT) - { - /* Set error code to DMA */ - huart->ErrorCode = HAL_UART_ERROR_DMA; - - return HAL_TIMEOUT; - } - } - } - } - - /* Reset Tx and Rx transfer counters */ - huart->TxXferCount = 0x00U; - huart->RxXferCount = 0x00U; - - /* Reset ErrorCode */ - huart->ErrorCode = HAL_UART_ERROR_NONE; - - /* Restore huart->RxState and huart->gState to Ready */ - huart->RxState = HAL_UART_STATE_READY; - huart->gState = HAL_UART_STATE_READY; - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; - - return HAL_OK; -} - -/** - * @brief Abort ongoing Transmit transfer (blocking mode). - * @param huart UART handle. - * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable UART Interrupts (Tx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) - * - Set handle State to READY - * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart) -{ - /* Disable TXEIE and TCIE interrupts */ - ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE)); - - /* Disable the UART DMA Tx request if enabled */ - if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); - - /* Abort the UART DMA Tx stream : use blocking DMA Abort API (no callback) */ - if (huart->hdmatx != NULL) - { - /* Set the UART DMA Abort callback to Null. - No call back execution at end of DMA abort procedure */ - huart->hdmatx->XferAbortCallback = NULL; - - if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK) - { - if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT) - { - /* Set error code to DMA */ - huart->ErrorCode = HAL_UART_ERROR_DMA; - - return HAL_TIMEOUT; - } - } - } - } - - /* Reset Tx transfer counter */ - huart->TxXferCount = 0x00U; - - /* Restore huart->gState to Ready */ - huart->gState = HAL_UART_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Abort ongoing Receive transfer (blocking mode). - * @param huart UART handle. - * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable UART Interrupts (Rx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) - * - Set handle State to READY - * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart) -{ - /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ - ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE)); - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); - - /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ - if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); - } - - /* Disable the UART DMA Rx request if enabled */ - if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); - - /* Abort the UART DMA Rx stream : use blocking DMA Abort API (no callback) */ - if (huart->hdmarx != NULL) - { - /* Set the UART DMA Abort callback to Null. - No call back execution at end of DMA abort procedure */ - huart->hdmarx->XferAbortCallback = NULL; - - if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK) - { - if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT) - { - /* Set error code to DMA */ - huart->ErrorCode = HAL_UART_ERROR_DMA; - - return HAL_TIMEOUT; - } - } - } - } - - /* Reset Rx transfer counter */ - huart->RxXferCount = 0x00U; - - /* Restore huart->RxState to Ready */ - huart->RxState = HAL_UART_STATE_READY; - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; - - return HAL_OK; -} - -/** - * @brief Abort ongoing transfers (Interrupt mode). - * @param huart UART handle. - * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable UART Interrupts (Tx and Rx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) - * - Set handle State to READY - * - At abort completion, call user abort complete callback - * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be - * considered as completed only when user abort complete callback is executed (not when exiting function). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart) -{ - uint32_t AbortCplt = 0x01U; - - /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ - ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE)); - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); - - /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ - if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); - } - - /* If DMA Tx and/or DMA Rx Handles are associated to UART Handle, DMA Abort complete callbacks should be initialised - before any call to DMA Abort functions */ - /* DMA Tx Handle is valid */ - if (huart->hdmatx != NULL) - { - /* Set DMA Abort Complete callback if UART DMA Tx request if enabled. - Otherwise, set it to NULL */ - if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) - { - huart->hdmatx->XferAbortCallback = UART_DMATxAbortCallback; - } - else - { - huart->hdmatx->XferAbortCallback = NULL; - } - } - /* DMA Rx Handle is valid */ - if (huart->hdmarx != NULL) - { - /* Set DMA Abort Complete callback if UART DMA Rx request if enabled. - Otherwise, set it to NULL */ - if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) - { - huart->hdmarx->XferAbortCallback = UART_DMARxAbortCallback; - } - else - { - huart->hdmarx->XferAbortCallback = NULL; - } - } - - /* Disable the UART DMA Tx request if enabled */ - if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) - { - /* Disable DMA Tx at UART level */ - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); - - /* Abort the UART DMA Tx stream : use non blocking DMA Abort API (callback) */ - if (huart->hdmatx != NULL) - { - /* UART Tx DMA Abort callback has already been initialised : - will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ - - /* Abort DMA TX */ - if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK) - { - huart->hdmatx->XferAbortCallback = NULL; - } - else - { - AbortCplt = 0x00U; - } - } - } - - /* Disable the UART DMA Rx request if enabled */ - if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); - - /* Abort the UART DMA Rx stream : use non blocking DMA Abort API (callback) */ - if (huart->hdmarx != NULL) - { - /* UART Rx DMA Abort callback has already been initialised : - will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ - - /* Abort DMA RX */ - if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK) - { - huart->hdmarx->XferAbortCallback = NULL; - AbortCplt = 0x01U; - } - else - { - AbortCplt = 0x00U; - } - } - } - - /* if no DMA abort complete callback execution is required => call user Abort Complete callback */ - if (AbortCplt == 0x01U) - { - /* Reset Tx and Rx transfer counters */ - huart->TxXferCount = 0x00U; - huart->RxXferCount = 0x00U; - - /* Reset ErrorCode */ - huart->ErrorCode = HAL_UART_ERROR_NONE; - - /* Restore huart->gState and huart->RxState to Ready */ - huart->gState = HAL_UART_STATE_READY; - huart->RxState = HAL_UART_STATE_READY; - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; - - /* As no DMA to be aborted, call directly user Abort complete callback */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /* Call registered Abort complete callback */ - huart->AbortCpltCallback(huart); -#else - /* Call legacy weak Abort complete callback */ - HAL_UART_AbortCpltCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } - - return HAL_OK; -} - -/** - * @brief Abort ongoing Transmit transfer (Interrupt mode). - * @param huart UART handle. - * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable UART Interrupts (Tx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) - * - Set handle State to READY - * - At abort completion, call user abort complete callback - * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be - * considered as completed only when user abort complete callback is executed (not when exiting function). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart) -{ - /* Disable TXEIE and TCIE interrupts */ - ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE)); - - /* Disable the UART DMA Tx request if enabled */ - if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); - - /* Abort the UART DMA Tx stream : use blocking DMA Abort API (no callback) */ - if (huart->hdmatx != NULL) - { - /* Set the UART DMA Abort callback : - will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ - huart->hdmatx->XferAbortCallback = UART_DMATxOnlyAbortCallback; - - /* Abort DMA TX */ - if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK) - { - /* Call Directly huart->hdmatx->XferAbortCallback function in case of error */ - huart->hdmatx->XferAbortCallback(huart->hdmatx); - } - } - else - { - /* Reset Tx transfer counter */ - huart->TxXferCount = 0x00U; - - /* Restore huart->gState to Ready */ - huart->gState = HAL_UART_STATE_READY; - - /* As no DMA to be aborted, call directly user Abort complete callback */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /* Call registered Abort Transmit Complete Callback */ - huart->AbortTransmitCpltCallback(huart); -#else - /* Call legacy weak Abort Transmit Complete Callback */ - HAL_UART_AbortTransmitCpltCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } - } - else - { - /* Reset Tx transfer counter */ - huart->TxXferCount = 0x00U; - - /* Restore huart->gState to Ready */ - huart->gState = HAL_UART_STATE_READY; - - /* As no DMA to be aborted, call directly user Abort complete callback */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /* Call registered Abort Transmit Complete Callback */ - huart->AbortTransmitCpltCallback(huart); -#else - /* Call legacy weak Abort Transmit Complete Callback */ - HAL_UART_AbortTransmitCpltCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } - - return HAL_OK; -} - -/** - * @brief Abort ongoing Receive transfer (Interrupt mode). - * @param huart UART handle. - * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode. - * This procedure performs following operations : - * - Disable UART Interrupts (Rx) - * - Disable the DMA transfer in the peripheral register (if enabled) - * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) - * - Set handle State to READY - * - At abort completion, call user abort complete callback - * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be - * considered as completed only when user abort complete callback is executed (not when exiting function). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart) -{ - /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ - ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE)); - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); - - /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ - if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); - } - - /* Disable the UART DMA Rx request if enabled */ - if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); - - /* Abort the UART DMA Rx stream : use blocking DMA Abort API (no callback) */ - if (huart->hdmarx != NULL) - { - /* Set the UART DMA Abort callback : - will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ - huart->hdmarx->XferAbortCallback = UART_DMARxOnlyAbortCallback; - - /* Abort DMA RX */ - if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK) - { - /* Call Directly huart->hdmarx->XferAbortCallback function in case of error */ - huart->hdmarx->XferAbortCallback(huart->hdmarx); - } - } - else - { - /* Reset Rx transfer counter */ - huart->RxXferCount = 0x00U; - - /* Restore huart->RxState to Ready */ - huart->RxState = HAL_UART_STATE_READY; - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; - - /* As no DMA to be aborted, call directly user Abort complete callback */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /* Call registered Abort Receive Complete Callback */ - huart->AbortReceiveCpltCallback(huart); -#else - /* Call legacy weak Abort Receive Complete Callback */ - HAL_UART_AbortReceiveCpltCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } - } - else - { - /* Reset Rx transfer counter */ - huart->RxXferCount = 0x00U; - - /* Restore huart->RxState to Ready */ - huart->RxState = HAL_UART_STATE_READY; - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; - - /* As no DMA to be aborted, call directly user Abort complete callback */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /* Call registered Abort Receive Complete Callback */ - huart->AbortReceiveCpltCallback(huart); -#else - /* Call legacy weak Abort Receive Complete Callback */ - HAL_UART_AbortReceiveCpltCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } - - return HAL_OK; -} - -/** - * @brief This function handles UART interrupt request. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ -void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) -{ - uint32_t isrflags = READ_REG(huart->Instance->SR); - uint32_t cr1its = READ_REG(huart->Instance->CR1); - uint32_t cr3its = READ_REG(huart->Instance->CR3); - uint32_t errorflags = 0x00U; - uint32_t dmarequest = 0x00U; - - /* If no error occurs */ - errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE)); - if (errorflags == RESET) - { - /* UART in mode Receiver -------------------------------------------------*/ - if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET)) - { - UART_Receive_IT(huart); - return; - } - } - - /* If some errors occur */ - if ((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) - || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET))) - { - /* UART parity error interrupt occurred ----------------------------------*/ - if (((isrflags & USART_SR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET)) - { - huart->ErrorCode |= HAL_UART_ERROR_PE; - } - - /* UART noise error interrupt occurred -----------------------------------*/ - if (((isrflags & USART_SR_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET)) - { - huart->ErrorCode |= HAL_UART_ERROR_NE; - } - - /* UART frame error interrupt occurred -----------------------------------*/ - if (((isrflags & USART_SR_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET)) - { - huart->ErrorCode |= HAL_UART_ERROR_FE; - } - - /* UART Over-Run interrupt occurred --------------------------------------*/ - if (((isrflags & USART_SR_ORE) != RESET) && (((cr1its & USART_CR1_RXNEIE) != RESET) - || ((cr3its & USART_CR3_EIE) != RESET))) - { - huart->ErrorCode |= HAL_UART_ERROR_ORE; - } - - /* Call UART Error Call back function if need be --------------------------*/ - if (huart->ErrorCode != HAL_UART_ERROR_NONE) - { - /* UART in mode Receiver -----------------------------------------------*/ - if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET)) - { - UART_Receive_IT(huart); - } - - /* If Overrun error occurs, or if any error occurs in DMA mode reception, - consider error as blocking */ - dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR); - if (((huart->ErrorCode & HAL_UART_ERROR_ORE) != RESET) || dmarequest) - { - /* Blocking error : transfer is aborted - Set the UART state ready to be able to start again the process, - Disable Rx Interrupts, and disable Rx DMA request, if ongoing */ - UART_EndRxTransfer(huart); - - /* Disable the UART DMA Rx request if enabled */ - if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); - - /* Abort the UART DMA Rx stream */ - if (huart->hdmarx != NULL) - { - /* Set the UART DMA Abort callback : - will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */ - huart->hdmarx->XferAbortCallback = UART_DMAAbortOnError; - if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK) - { - /* Call Directly XferAbortCallback function in case of error */ - huart->hdmarx->XferAbortCallback(huart->hdmarx); - } - } - else - { - /* Call user error callback */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered error callback*/ - huart->ErrorCallback(huart); -#else - /*Call legacy weak error callback*/ - HAL_UART_ErrorCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } - } - else - { - /* Call user error callback */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered error callback*/ - huart->ErrorCallback(huart); -#else - /*Call legacy weak error callback*/ - HAL_UART_ErrorCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } - } - else - { - /* Non Blocking error : transfer could go on. - Error is notified to user through user error callback */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered error callback*/ - huart->ErrorCallback(huart); -#else - /*Call legacy weak error callback*/ - HAL_UART_ErrorCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - - huart->ErrorCode = HAL_UART_ERROR_NONE; - } - } - return; - } /* End if some error occurs */ - - /* Check current reception Mode : - If Reception till IDLE event has been selected : */ - if ((huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) - && ((isrflags & USART_SR_IDLE) != 0U) - && ((cr1its & USART_CR1_IDLEIE) != 0U)) - { - __HAL_UART_CLEAR_IDLEFLAG(huart); - - /* Check if DMA mode is enabled in UART */ - if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) - { - /* DMA mode enabled */ - /* Check received length : If all expected data are received, do nothing, - (DMA cplt callback will be called). - Otherwise, if at least one data has already been received, IDLE event is to be notified to user */ - uint16_t nb_remaining_rx_data = (uint16_t) __HAL_DMA_GET_COUNTER(huart->hdmarx); - if ((nb_remaining_rx_data > 0U) - && (nb_remaining_rx_data < huart->RxXferSize)) - { - /* Reception is not complete */ - huart->RxXferCount = nb_remaining_rx_data; - - /* In Normal mode, end DMA xfer and HAL UART Rx process*/ - if (huart->hdmarx->Init.Mode != DMA_CIRCULAR) - { - /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */ - ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE); - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); - - /* Disable the DMA transfer for the receiver request by resetting the DMAR bit - in the UART CR3 register */ - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); - - /* At end of Rx process, restore huart->RxState to Ready */ - huart->RxState = HAL_UART_STATE_READY; - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; - - ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); - - /* Last bytes received, so no need as the abort is immediate */ - (void)HAL_DMA_Abort(huart->hdmarx); - } - - /* Initialize type of RxEvent that correspond to RxEvent callback execution; - In this case, Rx Event type is Idle Event */ - huart->RxEventType = HAL_UART_RXEVENT_IDLE; - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered Rx Event callback*/ - huart->RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount)); -#else - /*Call legacy weak Rx Event callback*/ - HAL_UARTEx_RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount)); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } - else - { - /* If DMA is in Circular mode, Idle event is to be reported to user - even if occurring after a Transfer Complete event from DMA */ - if (nb_remaining_rx_data == huart->RxXferSize) - { - if (huart->hdmarx->Init.Mode == DMA_CIRCULAR) - { - /* Initialize type of RxEvent that correspond to RxEvent callback execution; - In this case, Rx Event type is Idle Event */ - huart->RxEventType = HAL_UART_RXEVENT_IDLE; - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered Rx Event callback*/ - huart->RxEventCallback(huart, huart->RxXferSize); -#else - /*Call legacy weak Rx Event callback*/ - HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize); -#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ - } - } - } - return; - } - else - { - /* DMA mode not enabled */ - /* Check received length : If all expected data are received, do nothing. - Otherwise, if at least one data has already been received, IDLE event is to be notified to user */ - uint16_t nb_rx_data = huart->RxXferSize - huart->RxXferCount; - if ((huart->RxXferCount > 0U) - && (nb_rx_data > 0U)) - { - /* Disable the UART Parity Error Interrupt and RXNE interrupts */ - ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE)); - - /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */ - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); - - /* Rx process is completed, restore huart->RxState to Ready */ - huart->RxState = HAL_UART_STATE_READY; - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; - - ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); - - /* Initialize type of RxEvent that correspond to RxEvent callback execution; - In this case, Rx Event type is Idle Event */ - huart->RxEventType = HAL_UART_RXEVENT_IDLE; - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered Rx complete callback*/ - huart->RxEventCallback(huart, nb_rx_data); -#else - /*Call legacy weak Rx Event callback*/ - HAL_UARTEx_RxEventCallback(huart, nb_rx_data); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } - return; - } - } - - /* UART in mode Transmitter ------------------------------------------------*/ - if (((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET)) - { - UART_Transmit_IT(huart); - return; - } - - /* UART in mode Transmitter end --------------------------------------------*/ - if (((isrflags & USART_SR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET)) - { - UART_EndTransmit_IT(huart); - return; - } -} - -/** - * @brief Tx Transfer completed callbacks. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ -__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(huart); - /* NOTE: This function should not be modified, when the callback is needed, - the HAL_UART_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Tx Half Transfer completed callbacks. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ -__weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(huart); - /* NOTE: This function should not be modified, when the callback is needed, - the HAL_UART_TxHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Rx Transfer completed callbacks. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ -__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(huart); - /* NOTE: This function should not be modified, when the callback is needed, - the HAL_UART_RxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Rx Half Transfer completed callbacks. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ -__weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(huart); - /* NOTE: This function should not be modified, when the callback is needed, - the HAL_UART_RxHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief UART error callbacks. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ -__weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(huart); - /* NOTE: This function should not be modified, when the callback is needed, - the HAL_UART_ErrorCallback could be implemented in the user file - */ -} - -/** - * @brief UART Abort Complete callback. - * @param huart UART handle. - * @retval None - */ -__weak void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(huart); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_UART_AbortCpltCallback can be implemented in the user file. - */ -} - -/** - * @brief UART Abort Complete callback. - * @param huart UART handle. - * @retval None - */ -__weak void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(huart); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_UART_AbortTransmitCpltCallback can be implemented in the user file. - */ -} - -/** - * @brief UART Abort Receive Complete callback. - * @param huart UART handle. - * @retval None - */ -__weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(huart); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_UART_AbortReceiveCpltCallback can be implemented in the user file. - */ -} - -/** - * @brief Reception Event Callback (Rx event notification called after use of advanced reception service). - * @param huart UART handle - * @param Size Number of data available in application reception buffer (indicates a position in - * reception buffer until which, data are available) - * @retval None - */ -__weak void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(huart); - UNUSED(Size); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_UARTEx_RxEventCallback can be implemented in the user file. - */ -} - -/** - * @} - */ - -/** @defgroup UART_Exported_Functions_Group3 Peripheral Control functions - * @brief UART control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control the UART: - (+) HAL_LIN_SendBreak() API can be helpful to transmit the break character. - (+) HAL_MultiProcessor_EnterMuteMode() API can be helpful to enter the UART in mute mode. - (+) HAL_MultiProcessor_ExitMuteMode() API can be helpful to exit the UART mute mode by software. - (+) HAL_HalfDuplex_EnableTransmitter() API to enable the UART transmitter and disables the UART receiver in Half Duplex mode - (+) HAL_HalfDuplex_EnableReceiver() API to enable the UART receiver and disables the UART transmitter in Half Duplex mode - -@endverbatim - * @{ - */ - -/** - * @brief Transmits break characters. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) -{ - /* Check the parameters */ - assert_param(IS_UART_INSTANCE(huart->Instance)); - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->gState = HAL_UART_STATE_BUSY; - - /* Send break characters */ - ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_SBK); - - huart->gState = HAL_UART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; -} - -/** - * @brief Enters the UART in mute mode. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart) -{ - /* Check the parameters */ - assert_param(IS_UART_INSTANCE(huart->Instance)); - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->gState = HAL_UART_STATE_BUSY; - - /* Enable the USART mute mode by setting the RWU bit in the CR1 register */ - ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RWU); - - huart->gState = HAL_UART_STATE_READY; - huart->RxEventType = HAL_UART_RXEVENT_TC; - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; -} - -/** - * @brief Exits the UART mute mode: wake up software. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart) -{ - /* Check the parameters */ - assert_param(IS_UART_INSTANCE(huart->Instance)); - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->gState = HAL_UART_STATE_BUSY; - - /* Disable the USART mute mode by clearing the RWU bit in the CR1 register */ - ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_RWU); - - huart->gState = HAL_UART_STATE_READY; - huart->RxEventType = HAL_UART_RXEVENT_TC; - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; -} - -/** - * @brief Enables the UART transmitter and disables the UART receiver. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) -{ - uint32_t tmpreg = 0x00U; - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->gState = HAL_UART_STATE_BUSY; - - /*-------------------------- USART CR1 Configuration -----------------------*/ - tmpreg = huart->Instance->CR1; - - /* Clear TE and RE bits */ - tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_TE | USART_CR1_RE)); - - /* Enable the USART's transmit interface by setting the TE bit in the USART CR1 register */ - tmpreg |= (uint32_t)USART_CR1_TE; - - /* Write to USART CR1 */ - WRITE_REG(huart->Instance->CR1, (uint32_t)tmpreg); - - huart->gState = HAL_UART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; -} - -/** - * @brief Enables the UART receiver and disables the UART transmitter. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart) -{ - uint32_t tmpreg = 0x00U; - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->gState = HAL_UART_STATE_BUSY; - - /*-------------------------- USART CR1 Configuration -----------------------*/ - tmpreg = huart->Instance->CR1; - - /* Clear TE and RE bits */ - tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_TE | USART_CR1_RE)); - - /* Enable the USART's receive interface by setting the RE bit in the USART CR1 register */ - tmpreg |= (uint32_t)USART_CR1_RE; - - /* Write to USART CR1 */ - WRITE_REG(huart->Instance->CR1, (uint32_t)tmpreg); - - huart->gState = HAL_UART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup UART_Exported_Functions_Group4 Peripheral State and Errors functions - * @brief UART State and Errors functions - * -@verbatim - ============================================================================== - ##### Peripheral State and Errors functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to return the State of - UART communication process, return Peripheral Errors occurred during communication - process - (+) HAL_UART_GetState() API can be helpful to check in run-time the state of the UART peripheral. - (+) HAL_UART_GetError() check in run-time errors that could be occurred during communication. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the UART state. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL state - */ -HAL_UART_StateTypeDef HAL_UART_GetState(const UART_HandleTypeDef *huart) -{ - uint32_t temp1 = 0x00U, temp2 = 0x00U; - temp1 = huart->gState; - temp2 = huart->RxState; - - return (HAL_UART_StateTypeDef)(temp1 | temp2); -} - -/** - * @brief Return the UART error code - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART. - * @retval UART Error Code - */ -uint32_t HAL_UART_GetError(const UART_HandleTypeDef *huart) -{ - return huart->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup UART_Private_Functions UART Private Functions - * @{ - */ - -/** - * @brief Initialize the callbacks to their default values. - * @param huart UART handle. - * @retval none - */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) -void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart) -{ - /* Init the UART Callback settings */ - huart->TxHalfCpltCallback = HAL_UART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ - huart->TxCpltCallback = HAL_UART_TxCpltCallback; /* Legacy weak TxCpltCallback */ - huart->RxHalfCpltCallback = HAL_UART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ - huart->RxCpltCallback = HAL_UART_RxCpltCallback; /* Legacy weak RxCpltCallback */ - huart->ErrorCallback = HAL_UART_ErrorCallback; /* Legacy weak ErrorCallback */ - huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ - huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */ - huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */ - huart->RxEventCallback = HAL_UARTEx_RxEventCallback; /* Legacy weak RxEventCallback */ - -} -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - -/** - * @brief DMA UART transmit process complete callback. - * @param hdma Pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma) -{ - UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - /* DMA Normal mode*/ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U) - { - huart->TxXferCount = 0x00U; - - /* Disable the DMA transfer for transmit request by setting the DMAT bit - in the UART CR3 register */ - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); - - /* Enable the UART Transmit Complete Interrupt */ - ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TCIE); - - } - /* DMA Circular mode */ - else - { -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered Tx complete callback*/ - huart->TxCpltCallback(huart); -#else - /*Call legacy weak Tx complete callback*/ - HAL_UART_TxCpltCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } -} - -/** - * @brief DMA UART transmit process half complete callback - * @param hdma Pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma) -{ - UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered Tx complete callback*/ - huart->TxHalfCpltCallback(huart); -#else - /*Call legacy weak Tx complete callback*/ - HAL_UART_TxHalfCpltCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA UART receive process complete callback. - * @param hdma Pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma) -{ - UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - /* DMA Normal mode*/ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U) - { - huart->RxXferCount = 0U; - - /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ - ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE); - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); - - /* Disable the DMA transfer for the receiver request by setting the DMAR bit - in the UART CR3 register */ - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); - - /* At end of Rx process, restore huart->RxState to Ready */ - huart->RxState = HAL_UART_STATE_READY; - - /* If Reception till IDLE event has been selected, Disable IDLE Interrupt */ - if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); - } - } - - /* Initialize type of RxEvent that correspond to RxEvent callback execution; - In this case, Rx Event type is Transfer Complete */ - huart->RxEventType = HAL_UART_RXEVENT_TC; - - /* Check current reception Mode : - If Reception till IDLE event has been selected : use Rx Event callback */ - if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) - { -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered Rx Event callback*/ - huart->RxEventCallback(huart, huart->RxXferSize); -#else - /*Call legacy weak Rx Event callback*/ - HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } - else - { - /* In other cases : use Rx Complete callback */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered Rx complete callback*/ - huart->RxCpltCallback(huart); -#else - /*Call legacy weak Rx complete callback*/ - HAL_UART_RxCpltCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } -} - -/** - * @brief DMA UART receive process half complete callback - * @param hdma Pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma) -{ - UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - /* Initialize type of RxEvent that correspond to RxEvent callback execution; - In this case, Rx Event type is Half Transfer */ - huart->RxEventType = HAL_UART_RXEVENT_HT; - - /* Check current reception Mode : - If Reception till IDLE event has been selected : use Rx Event callback */ - if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) - { -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered Rx Event callback*/ - huart->RxEventCallback(huart, huart->RxXferSize / 2U); -#else - /*Call legacy weak Rx Event callback*/ - HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize / 2U); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } - else - { - /* In other cases : use Rx Half Complete callback */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered Rx Half complete callback*/ - huart->RxHalfCpltCallback(huart); -#else - /*Call legacy weak Rx Half complete callback*/ - HAL_UART_RxHalfCpltCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } -} - -/** - * @brief DMA UART communication error callback. - * @param hdma Pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void UART_DMAError(DMA_HandleTypeDef *hdma) -{ - uint32_t dmarequest = 0x00U; - UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - /* Stop UART DMA Tx request if ongoing */ - dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT); - if ((huart->gState == HAL_UART_STATE_BUSY_TX) && dmarequest) - { - huart->TxXferCount = 0x00U; - UART_EndTxTransfer(huart); - } - - /* Stop UART DMA Rx request if ongoing */ - dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR); - if ((huart->RxState == HAL_UART_STATE_BUSY_RX) && dmarequest) - { - huart->RxXferCount = 0x00U; - UART_EndRxTransfer(huart); - } - - huart->ErrorCode |= HAL_UART_ERROR_DMA; -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered error callback*/ - huart->ErrorCallback(huart); -#else - /*Call legacy weak error callback*/ - HAL_UART_ErrorCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ -} - -/** - * @brief This function handles UART Communication Timeout. It waits - * until a flag is no longer in the specified status. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param Flag specifies the UART flag to check. - * @param Status The actual Flag status (SET or RESET). - * @param Tickstart Tick start value - * @param Timeout Timeout duration - * @retval HAL status - */ -static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, - uint32_t Tickstart, uint32_t Timeout) -{ - /* Wait until flag is set */ - while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status) - { - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) - { - - return HAL_TIMEOUT; - } - - if ((READ_BIT(huart->Instance->CR1, USART_CR1_RE) != 0U) && (Flag != UART_FLAG_TXE) && (Flag != UART_FLAG_TC)) - { - if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) == SET) - { - /* Clear Overrun Error flag*/ - __HAL_UART_CLEAR_OREFLAG(huart); - - /* Blocking error : transfer is aborted - Set the UART state ready to be able to start again the process, - Disable Rx Interrupts if ongoing */ - UART_EndRxTransfer(huart); - - huart->ErrorCode = HAL_UART_ERROR_ORE; - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief Start Receive operation in interrupt mode. - * @note This function could be called by all HAL UART API providing reception in Interrupt mode. - * @note When calling this function, parameters validity is considered as already checked, - * i.e. Rx State, buffer address, ... - * UART Handle is assumed as Locked. - * @param huart UART handle. - * @param pData Pointer to data buffer (u8 or u16 data elements). - * @param Size Amount of data elements (u8 or u16) to be received. - * @retval HAL status - */ -HAL_StatusTypeDef UART_Start_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) -{ - huart->pRxBuffPtr = pData; - huart->RxXferSize = Size; - huart->RxXferCount = Size; - - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->RxState = HAL_UART_STATE_BUSY_RX; - - if (huart->Init.Parity != UART_PARITY_NONE) - { - /* Enable the UART Parity Error Interrupt */ - __HAL_UART_ENABLE_IT(huart, UART_IT_PE); - } - - /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_UART_ENABLE_IT(huart, UART_IT_ERR); - - /* Enable the UART Data Register not empty Interrupt */ - __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE); - - return HAL_OK; -} - -/** - * @brief Start Receive operation in DMA mode. - * @note This function could be called by all HAL UART API providing reception in DMA mode. - * @note When calling this function, parameters validity is considered as already checked, - * i.e. Rx State, buffer address, ... - * UART Handle is assumed as Locked. - * @param huart UART handle. - * @param pData Pointer to data buffer (u8 or u16 data elements). - * @param Size Amount of data elements (u8 or u16) to be received. - * @retval HAL status - */ -HAL_StatusTypeDef UART_Start_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) -{ - uint32_t *tmp; - - huart->pRxBuffPtr = pData; - huart->RxXferSize = Size; - - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->RxState = HAL_UART_STATE_BUSY_RX; - - /* Set the UART DMA transfer complete callback */ - huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt; - - /* Set the UART DMA Half transfer complete callback */ - huart->hdmarx->XferHalfCpltCallback = UART_DMARxHalfCplt; - - /* Set the DMA error callback */ - huart->hdmarx->XferErrorCallback = UART_DMAError; - - /* Set the DMA abort callback */ - huart->hdmarx->XferAbortCallback = NULL; - - /* Enable the DMA stream */ - tmp = (uint32_t *)&pData; - if (HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->DR, *(uint32_t *)tmp, Size) != HAL_OK) - { - /* Set error code to DMA */ - huart->ErrorCode = HAL_UART_ERROR_DMA; - - /* Restore huart->RxState to ready */ - huart->RxState = HAL_UART_STATE_READY; - - return HAL_ERROR; - } - /* Clear the Overrun flag just before enabling the DMA Rx request: can be mandatory for the second transfer */ - __HAL_UART_CLEAR_OREFLAG(huart); - - if (huart->Init.Parity != UART_PARITY_NONE) - { - /* Enable the UART Parity Error Interrupt */ - ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_PEIE); - } - - /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */ - ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_EIE); - - /* Enable the DMA transfer for the receiver request by setting the DMAR bit - in the UART CR3 register */ - ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAR); - - return HAL_OK; -} - -/** - * @brief End ongoing Tx transfer on UART peripheral (following error detection or Transmit completion). - * @param huart UART handle. - * @retval None - */ -static void UART_EndTxTransfer(UART_HandleTypeDef *huart) -{ - /* Disable TXEIE and TCIE interrupts */ - ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE)); - - /* At end of Tx process, restore huart->gState to Ready */ - huart->gState = HAL_UART_STATE_READY; -} - -/** - * @brief End ongoing Rx transfer on UART peripheral (following error detection or Reception completion). - * @param huart UART handle. - * @retval None - */ -static void UART_EndRxTransfer(UART_HandleTypeDef *huart) -{ - /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ - ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE)); - ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); - - /* In case of reception waiting for IDLE event, disable also the IDLE IE interrupt source */ - if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) - { - ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); - } - - /* At end of Rx process, restore huart->RxState to Ready */ - huart->RxState = HAL_UART_STATE_READY; - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; -} - -/** - * @brief DMA UART communication abort callback, when initiated by HAL services on Error - * (To be called at end of DMA Abort procedure following error occurrence). - * @param hdma Pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma) -{ - UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - huart->RxXferCount = 0x00U; - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered error callback*/ - huart->ErrorCallback(huart); -#else - /*Call legacy weak error callback*/ - HAL_UART_ErrorCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA UART Tx communication abort callback, when initiated by user - * (To be called at end of DMA Tx Abort procedure following user abort request). - * @note When this callback is executed, User Abort complete call back is called only if no - * Abort still ongoing for Rx DMA Handle. - * @param hdma Pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void UART_DMATxAbortCallback(DMA_HandleTypeDef *hdma) -{ - UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - huart->hdmatx->XferAbortCallback = NULL; - - /* Check if an Abort process is still ongoing */ - if (huart->hdmarx != NULL) - { - if (huart->hdmarx->XferAbortCallback != NULL) - { - return; - } - } - - /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */ - huart->TxXferCount = 0x00U; - huart->RxXferCount = 0x00U; - - /* Reset ErrorCode */ - huart->ErrorCode = HAL_UART_ERROR_NONE; - - /* Restore huart->gState and huart->RxState to Ready */ - huart->gState = HAL_UART_STATE_READY; - huart->RxState = HAL_UART_STATE_READY; - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; - - /* Call user Abort complete callback */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /* Call registered Abort complete callback */ - huart->AbortCpltCallback(huart); -#else - /* Call legacy weak Abort complete callback */ - HAL_UART_AbortCpltCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA UART Rx communication abort callback, when initiated by user - * (To be called at end of DMA Rx Abort procedure following user abort request). - * @note When this callback is executed, User Abort complete call back is called only if no - * Abort still ongoing for Tx DMA Handle. - * @param hdma Pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void UART_DMARxAbortCallback(DMA_HandleTypeDef *hdma) -{ - UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - huart->hdmarx->XferAbortCallback = NULL; - - /* Check if an Abort process is still ongoing */ - if (huart->hdmatx != NULL) - { - if (huart->hdmatx->XferAbortCallback != NULL) - { - return; - } - } - - /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */ - huart->TxXferCount = 0x00U; - huart->RxXferCount = 0x00U; - - /* Reset ErrorCode */ - huart->ErrorCode = HAL_UART_ERROR_NONE; - - /* Restore huart->gState and huart->RxState to Ready */ - huart->gState = HAL_UART_STATE_READY; - huart->RxState = HAL_UART_STATE_READY; - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; - - /* Call user Abort complete callback */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /* Call registered Abort complete callback */ - huart->AbortCpltCallback(huart); -#else - /* Call legacy weak Abort complete callback */ - HAL_UART_AbortCpltCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA UART Tx communication abort callback, when initiated by user by a call to - * HAL_UART_AbortTransmit_IT API (Abort only Tx transfer) - * (This callback is executed at end of DMA Tx Abort procedure following user abort request, - * and leads to user Tx Abort Complete callback execution). - * @param hdma Pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void UART_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma) -{ - UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - huart->TxXferCount = 0x00U; - - /* Restore huart->gState to Ready */ - huart->gState = HAL_UART_STATE_READY; - - /* Call user Abort complete callback */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /* Call registered Abort Transmit Complete Callback */ - huart->AbortTransmitCpltCallback(huart); -#else - /* Call legacy weak Abort Transmit Complete Callback */ - HAL_UART_AbortTransmitCpltCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ -} - -/** - * @brief DMA UART Rx communication abort callback, when initiated by user by a call to - * HAL_UART_AbortReceive_IT API (Abort only Rx transfer) - * (This callback is executed at end of DMA Rx Abort procedure following user abort request, - * and leads to user Rx Abort Complete callback execution). - * @param hdma Pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void UART_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma) -{ - UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - huart->RxXferCount = 0x00U; - - /* Restore huart->RxState to Ready */ - huart->RxState = HAL_UART_STATE_READY; - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; - - /* Call user Abort complete callback */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /* Call registered Abort Receive Complete Callback */ - huart->AbortReceiveCpltCallback(huart); -#else - /* Call legacy weak Abort Receive Complete Callback */ - HAL_UART_AbortReceiveCpltCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ -} - -/** - * @brief Sends an amount of data in non blocking mode. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart) -{ - const uint16_t *tmp; - - /* Check that a Tx process is ongoing */ - if (huart->gState == HAL_UART_STATE_BUSY_TX) - { - if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) - { - tmp = (const uint16_t *) huart->pTxBuffPtr; - huart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF); - huart->pTxBuffPtr += 2U; - } - else - { - huart->Instance->DR = (uint8_t)(*huart->pTxBuffPtr++ & (uint8_t)0x00FF); - } - - if (--huart->TxXferCount == 0U) - { - /* Disable the UART Transmit Data Register Empty Interrupt */ - __HAL_UART_DISABLE_IT(huart, UART_IT_TXE); - - /* Enable the UART Transmit Complete Interrupt */ - __HAL_UART_ENABLE_IT(huart, UART_IT_TC); - } - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Wraps up transmission in non blocking mode. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart) -{ - /* Disable the UART Transmit Complete Interrupt */ - __HAL_UART_DISABLE_IT(huart, UART_IT_TC); - - /* Tx process is ended, restore huart->gState to Ready */ - huart->gState = HAL_UART_STATE_READY; - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered Tx complete callback*/ - huart->TxCpltCallback(huart); -#else - /*Call legacy weak Tx complete callback*/ - HAL_UART_TxCpltCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - - return HAL_OK; -} - -/** - * @brief Receives an amount of data in non blocking mode - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart) -{ - uint8_t *pdata8bits = NULL; - uint16_t *pdata16bits = NULL; - - /* Check that a Rx process is ongoing */ - if (huart->RxState == HAL_UART_STATE_BUSY_RX) - { - if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) - { - /* Unused pdata8bits */ - UNUSED(pdata8bits); - pdata16bits = (uint16_t *) huart->pRxBuffPtr; - *pdata16bits = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF); - huart->pRxBuffPtr += 2U; - } - else - { - pdata8bits = (uint8_t *) huart->pRxBuffPtr; - /* Unused pdata16bits */ - UNUSED(pdata16bits); - - if ((huart->Init.WordLength == UART_WORDLENGTH_9B) || ((huart->Init.WordLength == UART_WORDLENGTH_8B) && (huart->Init.Parity == UART_PARITY_NONE))) - { - *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF); - } - else - { - *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F); - } - huart->pRxBuffPtr += 1U; - } - - if (--huart->RxXferCount == 0U) - { - /* Disable the UART Data Register not empty Interrupt */ - __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE); - - /* Disable the UART Parity Error Interrupt */ - __HAL_UART_DISABLE_IT(huart, UART_IT_PE); - - /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_UART_DISABLE_IT(huart, UART_IT_ERR); - - /* Rx process is completed, restore huart->RxState to Ready */ - huart->RxState = HAL_UART_STATE_READY; - - /* Initialize type of RxEvent to Transfer Complete */ - huart->RxEventType = HAL_UART_RXEVENT_TC; - - /* Check current reception Mode : - If Reception till IDLE event has been selected : */ - if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) - { - /* Set reception type to Standard */ - huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; - - /* Disable IDLE interrupt */ - ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); - - /* Check if IDLE flag is set */ - if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) - { - /* Clear IDLE flag in ISR */ - __HAL_UART_CLEAR_IDLEFLAG(huart); - } - -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered Rx Event callback*/ - huart->RxEventCallback(huart, huart->RxXferSize); -#else - /*Call legacy weak Rx Event callback*/ - HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } - else - { - /* Standard reception API called */ -#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) - /*Call registered Rx complete callback*/ - huart->RxCpltCallback(huart); -#else - /*Call legacy weak Rx complete callback*/ - HAL_UART_RxCpltCallback(huart); -#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ - } - - return HAL_OK; - } - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Configures the UART peripheral. - * @param huart Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ -static void UART_SetConfig(UART_HandleTypeDef *huart) -{ - uint32_t tmpreg; - uint32_t pclk; - - /* Check the parameters */ - assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate)); - assert_param(IS_UART_STOPBITS(huart->Init.StopBits)); - assert_param(IS_UART_PARITY(huart->Init.Parity)); - assert_param(IS_UART_MODE(huart->Init.Mode)); - - /*-------------------------- USART CR2 Configuration -----------------------*/ - /* Configure the UART Stop Bits: Set STOP[13:12] bits - according to huart->Init.StopBits value */ - MODIFY_REG(huart->Instance->CR2, USART_CR2_STOP, huart->Init.StopBits); - - /*-------------------------- USART CR1 Configuration -----------------------*/ - /* Configure the UART Word Length, Parity and mode: - Set the M bits according to huart->Init.WordLength value - Set PCE and PS bits according to huart->Init.Parity value - Set TE and RE bits according to huart->Init.Mode value - Set OVER8 bit according to huart->Init.OverSampling value */ - - tmpreg = (uint32_t)huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling; - MODIFY_REG(huart->Instance->CR1, - (uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8), - tmpreg); - - /*-------------------------- USART CR3 Configuration -----------------------*/ - /* Configure the UART HFC: Set CTSE and RTSE bits according to huart->Init.HwFlowCtl value */ - MODIFY_REG(huart->Instance->CR3, (USART_CR3_RTSE | USART_CR3_CTSE), huart->Init.HwFlowCtl); - - -#if defined(USART6) && defined(UART9) && defined(UART10) - if ((huart->Instance == USART1) || (huart->Instance == USART6) || (huart->Instance == UART9) || (huart->Instance == UART10)) - { - pclk = HAL_RCC_GetPCLK2Freq(); - } -#elif defined(USART6) - if ((huart->Instance == USART1) || (huart->Instance == USART6)) - { - pclk = HAL_RCC_GetPCLK2Freq(); - } -#else - if (huart->Instance == USART1) - { - pclk = HAL_RCC_GetPCLK2Freq(); - } -#endif /* USART6 */ - else - { - pclk = HAL_RCC_GetPCLK1Freq(); - } - /*-------------------------- USART BRR Configuration ---------------------*/ - if (huart->Init.OverSampling == UART_OVERSAMPLING_8) - { - huart->Instance->BRR = UART_BRR_SAMPLING8(pclk, huart->Init.BaudRate); - } - else - { - huart->Instance->BRR = UART_BRR_SAMPLING16(pclk, huart->Init.BaudRate); - } -} - -/** - * @} - */ - -#endif /* HAL_UART_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c b/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c deleted file mode 100644 index 94dd0c6..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c +++ /dev/null @@ -1,1497 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_ll_fmc.c - * @author MCD Application Team - * @brief FMC Low Layer HAL module driver. - * - * This file provides firmware functions to manage the following - * functionalities of the Flexible Memory Controller (FMC) peripheral memories: - * + Initialization/de-initialization functions - * + Peripheral Control functions - * + Peripheral State functions - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2016 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - @verbatim - ============================================================================== - ##### FMC peripheral features ##### - ============================================================================== - [..] The Flexible memory controller (FMC) includes following memory controllers: - (+) The NOR/PSRAM memory controller - (+) The NAND/PC Card memory controller - (+) The Synchronous DRAM (SDRAM) controller - - [..] The FMC functional block makes the interface with synchronous and asynchronous static - memories, SDRAM memories, and 16-bit PC memory cards. Its main purposes are: - (+) to translate AHB transactions into the appropriate external device protocol - (+) to meet the access time requirements of the external memory devices - - [..] All external memories share the addresses, data and control signals with the controller. - Each external device is accessed by means of a unique Chip Select. The FMC performs - only one access at a time to an external device. - The main features of the FMC controller are the following: - (+) Interface with static-memory mapped devices including: - (++) Static random access memory (SRAM) - (++) Read-only memory (ROM) - (++) NOR Flash memory/OneNAND Flash memory - (++) PSRAM (4 memory banks) - (++) 16-bit PC Card compatible devices - (++) Two banks of NAND Flash memory with ECC hardware to check up to 8 Kbytes of - data - (+) Interface with synchronous DRAM (SDRAM) memories - (+) Independent Chip Select control for each memory bank - (+) Independent configuration for each memory bank - - @endverbatim - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ -#if defined(HAL_NOR_MODULE_ENABLED) || (defined(HAL_NAND_MODULE_ENABLED)) || defined(HAL_PCCARD_MODULE_ENABLED) || defined(HAL_SDRAM_MODULE_ENABLED)\ - || defined(HAL_SRAM_MODULE_ENABLED) - -/** @defgroup FMC_LL FMC Low Layer - * @brief FMC driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/** @defgroup FMC_LL_Private_Constants FMC Low Layer Private Constants - * @{ - */ - -/* ----------------------- FMC registers bit mask --------------------------- */ - -#if defined(FMC_Bank1) -/* --- BCR Register ---*/ -/* BCR register clear mask */ - -/* --- BTR Register ---*/ -/* BTR register clear mask */ -#define BTR_CLEAR_MASK ((uint32_t)(FMC_BTR1_ADDSET | FMC_BTR1_ADDHLD |\ - FMC_BTR1_DATAST | FMC_BTR1_BUSTURN |\ - FMC_BTR1_CLKDIV | FMC_BTR1_DATLAT |\ - FMC_BTR1_ACCMOD)) - -/* --- BWTR Register ---*/ -/* BWTR register clear mask */ -#define BWTR_CLEAR_MASK ((uint32_t)(FMC_BWTR1_ADDSET | FMC_BWTR1_ADDHLD |\ - FMC_BWTR1_DATAST | FMC_BWTR1_BUSTURN |\ - FMC_BWTR1_ACCMOD)) -#endif /* FMC_Bank1 */ -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) - -#if defined (FMC_PCR_PWAITEN) -/* --- PCR Register ---*/ -/* PCR register clear mask */ -#define PCR_CLEAR_MASK ((uint32_t)(FMC_PCR_PWAITEN | FMC_PCR_PBKEN | \ - FMC_PCR_PTYP | FMC_PCR_PWID | \ - FMC_PCR_ECCEN | FMC_PCR_TCLR | \ - FMC_PCR_TAR | FMC_PCR_ECCPS)) -/* --- PMEM Register ---*/ -/* PMEM register clear mask */ -#define PMEM_CLEAR_MASK ((uint32_t)(FMC_PMEM_MEMSET2 | FMC_PMEM_MEMWAIT2 |\ - FMC_PMEM_MEMHOLD2 | FMC_PMEM_MEMHIZ2)) - -/* --- PATT Register ---*/ -/* PATT register clear mask */ -#define PATT_CLEAR_MASK ((uint32_t)(FMC_PATT_ATTSET2 | FMC_PATT_ATTWAIT2 |\ - FMC_PATT_ATTHOLD2 | FMC_PATT_ATTHIZ2)) -#else -/* --- PCR Register ---*/ -/* PCR register clear mask */ -#define PCR_CLEAR_MASK ((uint32_t)(FMC_PCR2_PWAITEN | FMC_PCR2_PBKEN | \ - FMC_PCR2_PTYP | FMC_PCR2_PWID | \ - FMC_PCR2_ECCEN | FMC_PCR2_TCLR | \ - FMC_PCR2_TAR | FMC_PCR2_ECCPS)) -/* --- PMEM Register ---*/ -/* PMEM register clear mask */ -#define PMEM_CLEAR_MASK ((uint32_t)(FMC_PMEM2_MEMSET2 | FMC_PMEM2_MEMWAIT2 |\ - FMC_PMEM2_MEMHOLD2 | FMC_PMEM2_MEMHIZ2)) - -/* --- PATT Register ---*/ -/* PATT register clear mask */ -#define PATT_CLEAR_MASK ((uint32_t)(FMC_PATT2_ATTSET2 | FMC_PATT2_ATTWAIT2 |\ - FMC_PATT2_ATTHOLD2 | FMC_PATT2_ATTHIZ2)) - -#endif /* FMC_PCR_PWAITEN */ -#endif /* FMC_Bank3) || defined(FMC_Bank2_3 */ -#if defined(FMC_Bank4) -/* --- PCR Register ---*/ -/* PCR register clear mask */ -#define PCR4_CLEAR_MASK ((uint32_t)(FMC_PCR4_PWAITEN | FMC_PCR4_PBKEN | \ - FMC_PCR4_PTYP | FMC_PCR4_PWID | \ - FMC_PCR4_ECCEN | FMC_PCR4_TCLR | \ - FMC_PCR4_TAR | FMC_PCR4_ECCPS)) -/* --- PMEM Register ---*/ -/* PMEM register clear mask */ -#define PMEM4_CLEAR_MASK ((uint32_t)(FMC_PMEM4_MEMSET4 | FMC_PMEM4_MEMWAIT4 |\ - FMC_PMEM4_MEMHOLD4 | FMC_PMEM4_MEMHIZ4)) - -/* --- PATT Register ---*/ -/* PATT register clear mask */ -#define PATT4_CLEAR_MASK ((uint32_t)(FMC_PATT4_ATTSET4 | FMC_PATT4_ATTWAIT4 |\ - FMC_PATT4_ATTHOLD4 | FMC_PATT4_ATTHIZ4)) - -/* --- PIO4 Register ---*/ -/* PIO4 register clear mask */ -#define PIO4_CLEAR_MASK ((uint32_t)(FMC_PIO4_IOSET4 | FMC_PIO4_IOWAIT4 | \ - FMC_PIO4_IOHOLD4 | FMC_PIO4_IOHIZ4)) - -#endif /* FMC_Bank4 */ -#if defined(FMC_Bank5_6) - -/* --- SDCR Register ---*/ -/* SDCR register clear mask */ -#define SDCR_CLEAR_MASK ((uint32_t)(FMC_SDCR1_NC | FMC_SDCR1_NR | \ - FMC_SDCR1_MWID | FMC_SDCR1_NB | \ - FMC_SDCR1_CAS | FMC_SDCR1_WP | \ - FMC_SDCR1_SDCLK | FMC_SDCR1_RBURST | \ - FMC_SDCR1_RPIPE)) - -/* --- SDTR Register ---*/ -/* SDTR register clear mask */ -#define SDTR_CLEAR_MASK ((uint32_t)(FMC_SDTR1_TMRD | FMC_SDTR1_TXSR | \ - FMC_SDTR1_TRAS | FMC_SDTR1_TRC | \ - FMC_SDTR1_TWR | FMC_SDTR1_TRP | \ - FMC_SDTR1_TRCD)) -#endif /* FMC_Bank5_6 */ - -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup FMC_LL_Exported_Functions FMC Low Layer Exported Functions - * @{ - */ - -#if defined(FMC_Bank1) - -/** @defgroup FMC_LL_Exported_Functions_NORSRAM FMC Low Layer NOR SRAM Exported Functions - * @brief NORSRAM Controller functions - * - @verbatim - ============================================================================== - ##### How to use NORSRAM device driver ##### - ============================================================================== - - [..] - This driver contains a set of APIs to interface with the FMC NORSRAM banks in order - to run the NORSRAM external devices. - - (+) FMC NORSRAM bank reset using the function FMC_NORSRAM_DeInit() - (+) FMC NORSRAM bank control configuration using the function FMC_NORSRAM_Init() - (+) FMC NORSRAM bank timing configuration using the function FMC_NORSRAM_Timing_Init() - (+) FMC NORSRAM bank extended timing configuration using the function - FMC_NORSRAM_Extended_Timing_Init() - (+) FMC NORSRAM bank enable/disable write operation using the functions - FMC_NORSRAM_WriteOperation_Enable()/FMC_NORSRAM_WriteOperation_Disable() - -@endverbatim - * @{ - */ - -/** @defgroup FMC_LL_NORSRAM_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * - @verbatim - ============================================================================== - ##### Initialization and de_initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the FMC NORSRAM interface - (+) De-initialize the FMC NORSRAM interface - (+) Configure the FMC clock and associated GPIOs - -@endverbatim - * @{ - */ - -/** - * @brief Initialize the FMC_NORSRAM device according to the specified - * control parameters in the FMC_NORSRAM_InitTypeDef - * @param Device Pointer to NORSRAM device instance - * @param Init Pointer to NORSRAM Initialization structure - * @retval HAL status - */ -HAL_StatusTypeDef FMC_NORSRAM_Init(FMC_NORSRAM_TypeDef *Device, - const FMC_NORSRAM_InitTypeDef *Init) -{ - uint32_t flashaccess; - uint32_t btcr_reg; - uint32_t mask; - - /* Check the parameters */ - assert_param(IS_FMC_NORSRAM_DEVICE(Device)); - assert_param(IS_FMC_NORSRAM_BANK(Init->NSBank)); - assert_param(IS_FMC_MUX(Init->DataAddressMux)); - assert_param(IS_FMC_MEMORY(Init->MemoryType)); - assert_param(IS_FMC_NORSRAM_MEMORY_WIDTH(Init->MemoryDataWidth)); - assert_param(IS_FMC_BURSTMODE(Init->BurstAccessMode)); - assert_param(IS_FMC_WAIT_POLARITY(Init->WaitSignalPolarity)); -#if defined(FMC_BCR1_WRAPMOD) - assert_param(IS_FMC_WRAP_MODE(Init->WrapMode)); -#endif /* FMC_BCR1_WRAPMOD */ - assert_param(IS_FMC_WAIT_SIGNAL_ACTIVE(Init->WaitSignalActive)); - assert_param(IS_FMC_WRITE_OPERATION(Init->WriteOperation)); - assert_param(IS_FMC_WAITE_SIGNAL(Init->WaitSignal)); - assert_param(IS_FMC_EXTENDED_MODE(Init->ExtendedMode)); - assert_param(IS_FMC_ASYNWAIT(Init->AsynchronousWait)); - assert_param(IS_FMC_WRITE_BURST(Init->WriteBurst)); -#if defined(FMC_BCR1_CCLKEN) - assert_param(IS_FMC_CONTINOUS_CLOCK(Init->ContinuousClock)); -#endif /* FMC_BCR1_CCLKEN */ -#if defined(FMC_BCR1_WFDIS) - assert_param(IS_FMC_WRITE_FIFO(Init->WriteFifo)); -#endif /* FMC_BCR1_WFDIS */ - assert_param(IS_FMC_PAGESIZE(Init->PageSize)); - - /* Disable NORSRAM Device */ - __FMC_NORSRAM_DISABLE(Device, Init->NSBank); - - /* Set NORSRAM device control parameters */ - if (Init->MemoryType == FMC_MEMORY_TYPE_NOR) - { - flashaccess = FMC_NORSRAM_FLASH_ACCESS_ENABLE; - } - else - { - flashaccess = FMC_NORSRAM_FLASH_ACCESS_DISABLE; - } - - btcr_reg = (flashaccess | \ - Init->DataAddressMux | \ - Init->MemoryType | \ - Init->MemoryDataWidth | \ - Init->BurstAccessMode | \ - Init->WaitSignalPolarity | \ - Init->WaitSignalActive | \ - Init->WriteOperation | \ - Init->WaitSignal | \ - Init->ExtendedMode | \ - Init->AsynchronousWait | \ - Init->WriteBurst); - -#if defined(FMC_BCR1_WRAPMOD) - btcr_reg |= Init->WrapMode; -#endif /* FMC_BCR1_WRAPMOD */ -#if defined(FMC_BCR1_CCLKEN) - btcr_reg |= Init->ContinuousClock; -#endif /* FMC_BCR1_CCLKEN */ -#if defined(FMC_BCR1_WFDIS) - btcr_reg |= Init->WriteFifo; -#endif /* FMC_BCR1_WFDIS */ - btcr_reg |= Init->PageSize; - - mask = (FMC_BCR1_MBKEN | - FMC_BCR1_MUXEN | - FMC_BCR1_MTYP | - FMC_BCR1_MWID | - FMC_BCR1_FACCEN | - FMC_BCR1_BURSTEN | - FMC_BCR1_WAITPOL | - FMC_BCR1_WAITCFG | - FMC_BCR1_WREN | - FMC_BCR1_WAITEN | - FMC_BCR1_EXTMOD | - FMC_BCR1_ASYNCWAIT | - FMC_BCR1_CBURSTRW); - -#if defined(FMC_BCR1_WRAPMOD) - mask |= FMC_BCR1_WRAPMOD; -#endif /* FMC_BCR1_WRAPMOD */ -#if defined(FMC_BCR1_CCLKEN) - mask |= FMC_BCR1_CCLKEN; -#endif /* FMC_BCR1_CCLKEN */ -#if defined(FMC_BCR1_WFDIS) - mask |= FMC_BCR1_WFDIS; -#endif /* FMC_BCR1_WFDIS */ - mask |= FMC_BCR1_CPSIZE; - - MODIFY_REG(Device->BTCR[Init->NSBank], mask, btcr_reg); - -#if defined(FMC_BCR1_CCLKEN) - /* Configure synchronous mode when Continuous clock is enabled for bank2..4 */ - if ((Init->ContinuousClock == FMC_CONTINUOUS_CLOCK_SYNC_ASYNC) && (Init->NSBank != FMC_NORSRAM_BANK1)) - { - MODIFY_REG(Device->BTCR[FMC_NORSRAM_BANK1], FMC_BCR1_CCLKEN, Init->ContinuousClock); - } -#endif /* FMC_BCR1_CCLKEN */ -#if defined(FMC_BCR1_WFDIS) - - if (Init->NSBank != FMC_NORSRAM_BANK1) - { - /* Configure Write FIFO mode when Write Fifo is enabled for bank2..4 */ - SET_BIT(Device->BTCR[FMC_NORSRAM_BANK1], (uint32_t)(Init->WriteFifo)); - } -#endif /* FMC_BCR1_WFDIS */ - - return HAL_OK; -} - -/** - * @brief DeInitialize the FMC_NORSRAM peripheral - * @param Device Pointer to NORSRAM device instance - * @param ExDevice Pointer to NORSRAM extended mode device instance - * @param Bank NORSRAM bank number - * @retval HAL status - */ -HAL_StatusTypeDef FMC_NORSRAM_DeInit(FMC_NORSRAM_TypeDef *Device, - FMC_NORSRAM_EXTENDED_TypeDef *ExDevice, uint32_t Bank) -{ - /* Check the parameters */ - assert_param(IS_FMC_NORSRAM_DEVICE(Device)); - assert_param(IS_FMC_NORSRAM_EXTENDED_DEVICE(ExDevice)); - assert_param(IS_FMC_NORSRAM_BANK(Bank)); - - /* Disable the FMC_NORSRAM device */ - __FMC_NORSRAM_DISABLE(Device, Bank); - - /* De-initialize the FMC_NORSRAM device */ - /* FMC_NORSRAM_BANK1 */ - if (Bank == FMC_NORSRAM_BANK1) - { - Device->BTCR[Bank] = 0x000030DBU; - } - /* FMC_NORSRAM_BANK2, FMC_NORSRAM_BANK3 or FMC_NORSRAM_BANK4 */ - else - { - Device->BTCR[Bank] = 0x000030D2U; - } - - Device->BTCR[Bank + 1U] = 0x0FFFFFFFU; - ExDevice->BWTR[Bank] = 0x0FFFFFFFU; - - return HAL_OK; -} - -/** - * @brief Initialize the FMC_NORSRAM Timing according to the specified - * parameters in the FMC_NORSRAM_TimingTypeDef - * @param Device Pointer to NORSRAM device instance - * @param Timing Pointer to NORSRAM Timing structure - * @param Bank NORSRAM bank number - * @retval HAL status - */ -HAL_StatusTypeDef FMC_NORSRAM_Timing_Init(FMC_NORSRAM_TypeDef *Device, - const FMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank) -{ -#if defined(FMC_BCR1_CCLKEN) - uint32_t tmpr; -#endif /* FMC_BCR1_CCLKEN */ - - /* Check the parameters */ - assert_param(IS_FMC_NORSRAM_DEVICE(Device)); - assert_param(IS_FMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime)); - assert_param(IS_FMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime)); - assert_param(IS_FMC_DATASETUP_TIME(Timing->DataSetupTime)); - assert_param(IS_FMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration)); - assert_param(IS_FMC_CLK_DIV(Timing->CLKDivision)); - assert_param(IS_FMC_DATA_LATENCY(Timing->DataLatency)); - assert_param(IS_FMC_ACCESS_MODE(Timing->AccessMode)); - assert_param(IS_FMC_NORSRAM_BANK(Bank)); - - /* Set FMC_NORSRAM device timing parameters */ - Device->BTCR[Bank + 1U] = - (Timing->AddressSetupTime << FMC_BTR1_ADDSET_Pos) | - (Timing->AddressHoldTime << FMC_BTR1_ADDHLD_Pos) | - (Timing->DataSetupTime << FMC_BTR1_DATAST_Pos) | - (Timing->BusTurnAroundDuration << FMC_BTR1_BUSTURN_Pos) | - ((Timing->CLKDivision - 1U) << FMC_BTR1_CLKDIV_Pos) | - ((Timing->DataLatency - 2U) << FMC_BTR1_DATLAT_Pos) | - Timing->AccessMode; - -#if defined(FMC_BCR1_CCLKEN) - /* Configure Clock division value (in NORSRAM bank 1) when continuous clock is enabled */ - if (HAL_IS_BIT_SET(Device->BTCR[FMC_NORSRAM_BANK1], FMC_BCR1_CCLKEN)) - { - tmpr = (uint32_t)(Device->BTCR[FMC_NORSRAM_BANK1 + 1U] & ~((0x0FU) << FMC_BTR1_CLKDIV_Pos)); - tmpr |= (uint32_t)(((Timing->CLKDivision) - 1U) << FMC_BTR1_CLKDIV_Pos); - MODIFY_REG(Device->BTCR[FMC_NORSRAM_BANK1 + 1U], FMC_BTR1_CLKDIV, tmpr); - } - -#endif /* FMC_BCR1_CCLKEN */ - return HAL_OK; -} - -/** - * @brief Initialize the FMC_NORSRAM Extended mode Timing according to the specified - * parameters in the FMC_NORSRAM_TimingTypeDef - * @param Device Pointer to NORSRAM device instance - * @param Timing Pointer to NORSRAM Timing structure - * @param Bank NORSRAM bank number - * @param ExtendedMode FMC Extended Mode - * This parameter can be one of the following values: - * @arg FMC_EXTENDED_MODE_DISABLE - * @arg FMC_EXTENDED_MODE_ENABLE - * @retval HAL status - */ -HAL_StatusTypeDef FMC_NORSRAM_Extended_Timing_Init(FMC_NORSRAM_EXTENDED_TypeDef *Device, - const FMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank, - uint32_t ExtendedMode) -{ - /* Check the parameters */ - assert_param(IS_FMC_EXTENDED_MODE(ExtendedMode)); - - /* Set NORSRAM device timing register for write configuration, if extended mode is used */ - if (ExtendedMode == FMC_EXTENDED_MODE_ENABLE) - { - /* Check the parameters */ - assert_param(IS_FMC_NORSRAM_EXTENDED_DEVICE(Device)); - assert_param(IS_FMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime)); - assert_param(IS_FMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime)); - assert_param(IS_FMC_DATASETUP_TIME(Timing->DataSetupTime)); - assert_param(IS_FMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration)); - assert_param(IS_FMC_ACCESS_MODE(Timing->AccessMode)); - assert_param(IS_FMC_NORSRAM_BANK(Bank)); - - /* Set NORSRAM device timing register for write configuration, if extended mode is used */ - MODIFY_REG(Device->BWTR[Bank], BWTR_CLEAR_MASK, (Timing->AddressSetupTime | - ((Timing->AddressHoldTime) << FMC_BWTR1_ADDHLD_Pos) | - ((Timing->DataSetupTime) << FMC_BWTR1_DATAST_Pos) | - Timing->AccessMode | - ((Timing->BusTurnAroundDuration) << FMC_BWTR1_BUSTURN_Pos))); - } - else - { - Device->BWTR[Bank] = 0x0FFFFFFFU; - } - - return HAL_OK; -} -/** - * @} - */ - -/** @addtogroup FMC_LL_NORSRAM_Private_Functions_Group2 - * @brief management functions - * -@verbatim - ============================================================================== - ##### FMC_NORSRAM Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control dynamically - the FMC NORSRAM interface. - -@endverbatim - * @{ - */ - -/** - * @brief Enables dynamically FMC_NORSRAM write operation. - * @param Device Pointer to NORSRAM device instance - * @param Bank NORSRAM bank number - * @retval HAL status - */ -HAL_StatusTypeDef FMC_NORSRAM_WriteOperation_Enable(FMC_NORSRAM_TypeDef *Device, uint32_t Bank) -{ - /* Check the parameters */ - assert_param(IS_FMC_NORSRAM_DEVICE(Device)); - assert_param(IS_FMC_NORSRAM_BANK(Bank)); - - /* Enable write operation */ - SET_BIT(Device->BTCR[Bank], FMC_WRITE_OPERATION_ENABLE); - - return HAL_OK; -} - -/** - * @brief Disables dynamically FMC_NORSRAM write operation. - * @param Device Pointer to NORSRAM device instance - * @param Bank NORSRAM bank number - * @retval HAL status - */ -HAL_StatusTypeDef FMC_NORSRAM_WriteOperation_Disable(FMC_NORSRAM_TypeDef *Device, uint32_t Bank) -{ - /* Check the parameters */ - assert_param(IS_FMC_NORSRAM_DEVICE(Device)); - assert_param(IS_FMC_NORSRAM_BANK(Bank)); - - /* Disable write operation */ - CLEAR_BIT(Device->BTCR[Bank], FMC_WRITE_OPERATION_ENABLE); - - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ -#endif /* FMC_Bank1 */ - -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) - -/** @defgroup FMC_LL_Exported_Functions_NAND FMC Low Layer NAND Exported Functions - * @brief NAND Controller functions - * - @verbatim - ============================================================================== - ##### How to use NAND device driver ##### - ============================================================================== - [..] - This driver contains a set of APIs to interface with the FMC NAND banks in order - to run the NAND external devices. - - (+) FMC NAND bank reset using the function FMC_NAND_DeInit() - (+) FMC NAND bank control configuration using the function FMC_NAND_Init() - (+) FMC NAND bank common space timing configuration using the function - FMC_NAND_CommonSpace_Timing_Init() - (+) FMC NAND bank attribute space timing configuration using the function - FMC_NAND_AttributeSpace_Timing_Init() - (+) FMC NAND bank enable/disable ECC correction feature using the functions - FMC_NAND_ECC_Enable()/FMC_NAND_ECC_Disable() - (+) FMC NAND bank get ECC correction code using the function FMC_NAND_GetECC() - -@endverbatim - * @{ - */ - -/** @defgroup FMC_LL_NAND_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - ============================================================================== - ##### Initialization and de_initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the FMC NAND interface - (+) De-initialize the FMC NAND interface - (+) Configure the FMC clock and associated GPIOs - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the FMC_NAND device according to the specified - * control parameters in the FMC_NAND_HandleTypeDef - * @param Device Pointer to NAND device instance - * @param Init Pointer to NAND Initialization structure - * @retval HAL status - */ -HAL_StatusTypeDef FMC_NAND_Init(FMC_NAND_TypeDef *Device, const FMC_NAND_InitTypeDef *Init) -{ - /* Check the parameters */ - assert_param(IS_FMC_NAND_DEVICE(Device)); - assert_param(IS_FMC_NAND_BANK(Init->NandBank)); - assert_param(IS_FMC_WAIT_FEATURE(Init->Waitfeature)); - assert_param(IS_FMC_NAND_MEMORY_WIDTH(Init->MemoryDataWidth)); - assert_param(IS_FMC_ECC_STATE(Init->EccComputation)); - assert_param(IS_FMC_ECCPAGE_SIZE(Init->ECCPageSize)); - assert_param(IS_FMC_TCLR_TIME(Init->TCLRSetupTime)); - assert_param(IS_FMC_TAR_TIME(Init->TARSetupTime)); - -#if defined(FMC_Bank2_3) - /* Set NAND device control parameters */ - if (Init->NandBank == FMC_NAND_BANK2) - { - /* NAND bank 2 registers configuration */ - MODIFY_REG(Device->PCR2, PCR_CLEAR_MASK, (Init->Waitfeature | - FMC_PCR_MEMORY_TYPE_NAND | - Init->MemoryDataWidth | - Init->EccComputation | - Init->ECCPageSize | - ((Init->TCLRSetupTime) << FMC_PCR2_TCLR_Pos) | - ((Init->TARSetupTime) << FMC_PCR2_TAR_Pos))); - } - else - { - /* NAND bank 3 registers configuration */ - MODIFY_REG(Device->PCR3, PCR_CLEAR_MASK, (Init->Waitfeature | - FMC_PCR_MEMORY_TYPE_NAND | - Init->MemoryDataWidth | - Init->EccComputation | - Init->ECCPageSize | - ((Init->TCLRSetupTime) << FMC_PCR2_TCLR_Pos) | - ((Init->TARSetupTime) << FMC_PCR2_TAR_Pos))); - } -#else - /* NAND bank 3 registers configuration */ - MODIFY_REG(Device->PCR, PCR_CLEAR_MASK, (Init->Waitfeature | - FMC_PCR_MEMORY_TYPE_NAND | - Init->MemoryDataWidth | - Init->EccComputation | - Init->ECCPageSize | - ((Init->TCLRSetupTime) << FMC_PCR_TCLR_Pos) | - ((Init->TARSetupTime) << FMC_PCR_TAR_Pos))); -#endif /* FMC_Bank2_3 */ - - return HAL_OK; -} - -/** - * @brief Initializes the FMC_NAND Common space Timing according to the specified - * parameters in the FMC_NAND_PCC_TimingTypeDef - * @param Device Pointer to NAND device instance - * @param Timing Pointer to NAND timing structure - * @param Bank NAND bank number - * @retval HAL status - */ -HAL_StatusTypeDef FMC_NAND_CommonSpace_Timing_Init(FMC_NAND_TypeDef *Device, - const FMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank) -{ - /* Check the parameters */ - assert_param(IS_FMC_NAND_DEVICE(Device)); - assert_param(IS_FMC_SETUP_TIME(Timing->SetupTime)); - assert_param(IS_FMC_WAIT_TIME(Timing->WaitSetupTime)); - assert_param(IS_FMC_HOLD_TIME(Timing->HoldSetupTime)); - assert_param(IS_FMC_HIZ_TIME(Timing->HiZSetupTime)); - assert_param(IS_FMC_NAND_BANK(Bank)); - -#if defined(FMC_Bank2_3) - /* Set FMC_NAND device timing parameters */ - if (Bank == FMC_NAND_BANK2) - { - /* NAND bank 2 registers configuration */ - WRITE_REG(Device->PMEM2, (Timing->SetupTime | - ((Timing->WaitSetupTime) << FMC_PMEM2_MEMWAIT2_Pos) | - ((Timing->HoldSetupTime) << FMC_PMEM2_MEMHOLD2_Pos) | - ((Timing->HiZSetupTime) << FMC_PMEM2_MEMHIZ2_Pos))); - } - else - { - /* NAND bank 3 registers configuration */ - WRITE_REG(Device->PMEM3, (Timing->SetupTime | - ((Timing->WaitSetupTime) << FMC_PMEM2_MEMWAIT2_Pos) | - ((Timing->HoldSetupTime) << FMC_PMEM2_MEMHOLD2_Pos) | - ((Timing->HiZSetupTime) << FMC_PMEM2_MEMHIZ2_Pos))); - } -#else - /* Prevent unused argument(s) compilation warning if no assert_param check */ - UNUSED(Bank); - - /* NAND bank 3 registers configuration */ - Device->PMEM = (Timing->SetupTime | - ((Timing->WaitSetupTime) << FMC_PMEM_MEMWAIT2_Pos) | - ((Timing->HoldSetupTime) << FMC_PMEM_MEMHOLD2_Pos) | - ((Timing->HiZSetupTime) << FMC_PMEM_MEMHIZ2_Pos)); -#endif /* FMC_Bank2_3 */ - - return HAL_OK; -} - -/** - * @brief Initializes the FMC_NAND Attribute space Timing according to the specified - * parameters in the FMC_NAND_PCC_TimingTypeDef - * @param Device Pointer to NAND device instance - * @param Timing Pointer to NAND timing structure - * @param Bank NAND bank number - * @retval HAL status - */ -HAL_StatusTypeDef FMC_NAND_AttributeSpace_Timing_Init(FMC_NAND_TypeDef *Device, - const FMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank) -{ - /* Check the parameters */ - assert_param(IS_FMC_NAND_DEVICE(Device)); - assert_param(IS_FMC_SETUP_TIME(Timing->SetupTime)); - assert_param(IS_FMC_WAIT_TIME(Timing->WaitSetupTime)); - assert_param(IS_FMC_HOLD_TIME(Timing->HoldSetupTime)); - assert_param(IS_FMC_HIZ_TIME(Timing->HiZSetupTime)); - assert_param(IS_FMC_NAND_BANK(Bank)); - -#if defined(FMC_Bank2_3) - /* Set FMC_NAND device timing parameters */ - if (Bank == FMC_NAND_BANK2) - { - /* NAND bank 2 registers configuration */ - WRITE_REG(Device->PATT2, (Timing->SetupTime | - ((Timing->WaitSetupTime) << FMC_PATT2_ATTWAIT2_Pos) | - ((Timing->HoldSetupTime) << FMC_PATT2_ATTHOLD2_Pos) | - ((Timing->HiZSetupTime) << FMC_PATT2_ATTHIZ2_Pos))); - } - else - { - /* NAND bank 3 registers configuration */ - WRITE_REG(Device->PATT3, (Timing->SetupTime | - ((Timing->WaitSetupTime) << FMC_PATT2_ATTWAIT2_Pos) | - ((Timing->HoldSetupTime) << FMC_PATT2_ATTHOLD2_Pos) | - ((Timing->HiZSetupTime) << FMC_PATT2_ATTHIZ2_Pos))); - } -#else - /* Prevent unused argument(s) compilation warning if no assert_param check */ - UNUSED(Bank); - - /* NAND bank 3 registers configuration */ - Device->PATT = (Timing->SetupTime | - ((Timing->WaitSetupTime) << FMC_PATT_ATTWAIT2_Pos) | - ((Timing->HoldSetupTime) << FMC_PATT_ATTHOLD2_Pos) | - ((Timing->HiZSetupTime) << FMC_PATT_ATTHIZ2_Pos)); -#endif /* FMC_Bank2_3 */ - - return HAL_OK; -} - -/** - * @brief DeInitializes the FMC_NAND device - * @param Device Pointer to NAND device instance - * @param Bank NAND bank number - * @retval HAL status - */ -HAL_StatusTypeDef FMC_NAND_DeInit(FMC_NAND_TypeDef *Device, uint32_t Bank) -{ - /* Check the parameters */ - assert_param(IS_FMC_NAND_DEVICE(Device)); - assert_param(IS_FMC_NAND_BANK(Bank)); - - /* Disable the NAND Bank */ - __FMC_NAND_DISABLE(Device, Bank); - - /* De-initialize the NAND Bank */ -#if defined(FMC_Bank2_3) - if (Bank == FMC_NAND_BANK2) - { - /* Set the FMC_NAND_BANK2 registers to their reset values */ - WRITE_REG(Device->PCR2, 0x00000018U); - WRITE_REG(Device->SR2, 0x00000040U); - WRITE_REG(Device->PMEM2, 0xFCFCFCFCU); - WRITE_REG(Device->PATT2, 0xFCFCFCFCU); - } - /* FMC_Bank3_NAND */ - else - { - /* Set the FMC_NAND_BANK3 registers to their reset values */ - WRITE_REG(Device->PCR3, 0x00000018U); - WRITE_REG(Device->SR3, 0x00000040U); - WRITE_REG(Device->PMEM3, 0xFCFCFCFCU); - WRITE_REG(Device->PATT3, 0xFCFCFCFCU); - } -#else - /* Prevent unused argument(s) compilation warning if no assert_param check */ - UNUSED(Bank); - - /* Set the FMC_NAND_BANK3 registers to their reset values */ - WRITE_REG(Device->PCR, 0x00000018U); - WRITE_REG(Device->SR, 0x00000040U); - WRITE_REG(Device->PMEM, 0xFCFCFCFCU); - WRITE_REG(Device->PATT, 0xFCFCFCFCU); -#endif /* FMC_Bank2_3 */ - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup HAL_FMC_NAND_Group2 Peripheral Control functions - * @brief management functions - * -@verbatim - ============================================================================== - ##### FMC_NAND Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control dynamically - the FMC NAND interface. - -@endverbatim - * @{ - */ - - -/** - * @brief Enables dynamically FMC_NAND ECC feature. - * @param Device Pointer to NAND device instance - * @param Bank NAND bank number - * @retval HAL status - */ -HAL_StatusTypeDef FMC_NAND_ECC_Enable(FMC_NAND_TypeDef *Device, uint32_t Bank) -{ - /* Check the parameters */ - assert_param(IS_FMC_NAND_DEVICE(Device)); - assert_param(IS_FMC_NAND_BANK(Bank)); - - /* Enable ECC feature */ -#if defined(FMC_Bank2_3) - if (Bank == FMC_NAND_BANK2) - { - SET_BIT(Device->PCR2, FMC_PCR2_ECCEN); - } - else - { - SET_BIT(Device->PCR3, FMC_PCR2_ECCEN); - } -#else - /* Prevent unused argument(s) compilation warning if no assert_param check */ - UNUSED(Bank); - - SET_BIT(Device->PCR, FMC_PCR_ECCEN); -#endif /* FMC_Bank2_3 */ - - return HAL_OK; -} - - -/** - * @brief Disables dynamically FMC_NAND ECC feature. - * @param Device Pointer to NAND device instance - * @param Bank NAND bank number - * @retval HAL status - */ -HAL_StatusTypeDef FMC_NAND_ECC_Disable(FMC_NAND_TypeDef *Device, uint32_t Bank) -{ - /* Check the parameters */ - assert_param(IS_FMC_NAND_DEVICE(Device)); - assert_param(IS_FMC_NAND_BANK(Bank)); - - /* Disable ECC feature */ -#if defined(FMC_Bank2_3) - if (Bank == FMC_NAND_BANK2) - { - CLEAR_BIT(Device->PCR2, FMC_PCR2_ECCEN); - } - else - { - CLEAR_BIT(Device->PCR3, FMC_PCR2_ECCEN); - } -#else - /* Prevent unused argument(s) compilation warning if no assert_param check */ - UNUSED(Bank); - - CLEAR_BIT(Device->PCR, FMC_PCR_ECCEN); -#endif /* FMC_Bank2_3 */ - - return HAL_OK; -} - -/** - * @brief Disables dynamically FMC_NAND ECC feature. - * @param Device Pointer to NAND device instance - * @param ECCval Pointer to ECC value - * @param Bank NAND bank number - * @param Timeout Timeout wait value - * @retval HAL status - */ -HAL_StatusTypeDef FMC_NAND_GetECC(const FMC_NAND_TypeDef *Device, uint32_t *ECCval, uint32_t Bank, - uint32_t Timeout) -{ - uint32_t tickstart; - - /* Check the parameters */ - assert_param(IS_FMC_NAND_DEVICE(Device)); - assert_param(IS_FMC_NAND_BANK(Bank)); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait until FIFO is empty */ - while (__FMC_NAND_GET_FLAG(Device, Bank, FMC_FLAG_FEMPT) == RESET) - { - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) - { - return HAL_TIMEOUT; - } - } - } - -#if defined(FMC_Bank2_3) - if (Bank == FMC_NAND_BANK2) - { - /* Get the ECCR2 register value */ - *ECCval = (uint32_t)Device->ECCR2; - } - else - { - /* Get the ECCR3 register value */ - *ECCval = (uint32_t)Device->ECCR3; - } -#else - /* Prevent unused argument(s) compilation warning if no assert_param check */ - UNUSED(Bank); - - /* Get the ECCR register value */ - *ECCval = (uint32_t)Device->ECCR; -#endif /* FMC_Bank2_3 */ - - return HAL_OK; -} - -/** - * @} - */ -#endif /* FMC_Bank3) || defined(FMC_Bank2_3 */ - -#if defined(FMC_Bank4) - -/** @addtogroup FMC_LL_PCCARD - * @brief PCCARD Controller functions - * - @verbatim - ============================================================================== - ##### How to use PCCARD device driver ##### - ============================================================================== - [..] - This driver contains a set of APIs to interface with the FMC PCCARD bank in order - to run the PCCARD/compact flash external devices. - - (+) FMC PCCARD bank reset using the function FMC_PCCARD_DeInit() - (+) FMC PCCARD bank control configuration using the function FMC_PCCARD_Init() - (+) FMC PCCARD bank common space timing configuration using the function - FMC_PCCARD_CommonSpace_Timing_Init() - (+) FMC PCCARD bank attribute space timing configuration using the function - FMC_PCCARD_AttributeSpace_Timing_Init() - (+) FMC PCCARD bank IO space timing configuration using the function - FMC_PCCARD_IOSpace_Timing_Init() -@endverbatim - * @{ - */ - -/** @addtogroup FMC_LL_PCCARD_Private_Functions_Group1 - * @brief Initialization and Configuration functions - * -@verbatim - ============================================================================== - ##### Initialization and de_initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the FMC PCCARD interface - (+) De-initialize the FMC PCCARD interface - (+) Configure the FMC clock and associated GPIOs - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the FMC_PCCARD device according to the specified - * control parameters in the FMC_PCCARD_HandleTypeDef - * @param Device Pointer to PCCARD device instance - * @param Init Pointer to PCCARD Initialization structure - * @retval HAL status - */ -HAL_StatusTypeDef FMC_PCCARD_Init(FMC_PCCARD_TypeDef *Device, const FMC_PCCARD_InitTypeDef *Init) -{ - /* Check the parameters */ - assert_param(IS_FMC_PCCARD_DEVICE(Device)); -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) - assert_param(IS_FMC_WAIT_FEATURE(Init->Waitfeature)); - assert_param(IS_FMC_TCLR_TIME(Init->TCLRSetupTime)); - assert_param(IS_FMC_TAR_TIME(Init->TARSetupTime)); -#endif /* FMC_Bank3) || defined(FMC_Bank2_3 */ - - /* Set FMC_PCCARD device control parameters */ - MODIFY_REG(Device->PCR4, - (FMC_PCR4_PTYP | - FMC_PCR4_PWAITEN | - FMC_PCR4_PWID | - FMC_PCR4_TCLR | - FMC_PCR4_TAR), - (FMC_PCR_MEMORY_TYPE_PCCARD | - Init->Waitfeature | - FMC_NAND_PCC_MEM_BUS_WIDTH_16 | - (Init->TCLRSetupTime << FMC_PCR4_TCLR_Pos) | - (Init->TARSetupTime << FMC_PCR4_TAR_Pos))); - - return HAL_OK; -} - -/** - * @brief Initializes the FMC_PCCARD Common space Timing according to the specified - * parameters in the FMC_NAND_PCC_TimingTypeDef - * @param Device Pointer to PCCARD device instance - * @param Timing Pointer to PCCARD timing structure - * @retval HAL status - */ -HAL_StatusTypeDef FMC_PCCARD_CommonSpace_Timing_Init(FMC_PCCARD_TypeDef *Device, - const FMC_NAND_PCC_TimingTypeDef *Timing) -{ - /* Check the parameters */ - assert_param(IS_FMC_PCCARD_DEVICE(Device)); -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) - assert_param(IS_FMC_SETUP_TIME(Timing->SetupTime)); - assert_param(IS_FMC_WAIT_TIME(Timing->WaitSetupTime)); - assert_param(IS_FMC_HOLD_TIME(Timing->HoldSetupTime)); - assert_param(IS_FMC_HIZ_TIME(Timing->HiZSetupTime)); -#endif /* FMC_Bank3) || defined(FMC_Bank2_3 */ - - /* Set PCCARD timing parameters */ - WRITE_REG(Device->PMEM4, (Timing->SetupTime | - ((Timing->WaitSetupTime) << FMC_PMEM4_MEMWAIT4_Pos) | - ((Timing->HoldSetupTime) << FMC_PMEM4_MEMHOLD4_Pos) | - ((Timing->HiZSetupTime) << FMC_PMEM4_MEMHIZ4_Pos))); - - return HAL_OK; -} - -/** - * @brief Initializes the FMC_PCCARD Attribute space Timing according to the specified - * parameters in the FMC_NAND_PCC_TimingTypeDef - * @param Device Pointer to PCCARD device instance - * @param Timing Pointer to PCCARD timing structure - * @retval HAL status - */ -HAL_StatusTypeDef FMC_PCCARD_AttributeSpace_Timing_Init(FMC_PCCARD_TypeDef *Device, - const FMC_NAND_PCC_TimingTypeDef *Timing) -{ - /* Check the parameters */ - assert_param(IS_FMC_PCCARD_DEVICE(Device)); -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) - assert_param(IS_FMC_SETUP_TIME(Timing->SetupTime)); - assert_param(IS_FMC_WAIT_TIME(Timing->WaitSetupTime)); - assert_param(IS_FMC_HOLD_TIME(Timing->HoldSetupTime)); - assert_param(IS_FMC_HIZ_TIME(Timing->HiZSetupTime)); -#endif /* FMC_Bank3) || defined(FMC_Bank2_3 */ - - /* Set PCCARD timing parameters */ - WRITE_REG(Device->PATT4, (Timing->SetupTime | - ((Timing->WaitSetupTime) << FMC_PATT4_ATTWAIT4_Pos) | - ((Timing->HoldSetupTime) << FMC_PATT4_ATTHOLD4_Pos) | - ((Timing->HiZSetupTime) << FMC_PATT4_ATTHIZ4_Pos))); - - return HAL_OK; -} - -/** - * @brief Initializes the FMC_PCCARD IO space Timing according to the specified - * parameters in the FMC_NAND_PCC_TimingTypeDef - * @param Device Pointer to PCCARD device instance - * @param Timing Pointer to PCCARD timing structure - * @retval HAL status - */ -HAL_StatusTypeDef FMC_PCCARD_IOSpace_Timing_Init(FMC_PCCARD_TypeDef *Device, - const FMC_NAND_PCC_TimingTypeDef *Timing) -{ - /* Check the parameters */ - assert_param(IS_FMC_PCCARD_DEVICE(Device)); -#if defined(FMC_Bank3) || defined(FMC_Bank2_3) - assert_param(IS_FMC_SETUP_TIME(Timing->SetupTime)); - assert_param(IS_FMC_WAIT_TIME(Timing->WaitSetupTime)); - assert_param(IS_FMC_HOLD_TIME(Timing->HoldSetupTime)); - assert_param(IS_FMC_HIZ_TIME(Timing->HiZSetupTime)); -#endif /* FMC_Bank3) || defined(FMC_Bank2_3 */ - - /* Set FMC_PCCARD device timing parameters */ - WRITE_REG(Device->PIO4, (Timing->SetupTime | - (Timing->WaitSetupTime << FMC_PIO4_IOWAIT4_Pos) | - (Timing->HoldSetupTime << FMC_PIO4_IOHOLD4_Pos) | - (Timing->HiZSetupTime << FMC_PIO4_IOHIZ4_Pos))); - - return HAL_OK; -} - -/** - * @brief DeInitializes the FMC_PCCARD device - * @param Device Pointer to PCCARD device instance - * @retval HAL status - */ -HAL_StatusTypeDef FMC_PCCARD_DeInit(FMC_PCCARD_TypeDef *Device) -{ - /* Check the parameters */ - assert_param(IS_FMC_PCCARD_DEVICE(Device)); - - /* Disable the FMC_PCCARD device */ - __FMC_PCCARD_DISABLE(Device); - - /* De-initialize the FMC_PCCARD device */ - Device->PCR4 = 0x00000018U; - Device->SR4 = 0x00000040U; - Device->PMEM4 = 0xFCFCFCFCU; - Device->PATT4 = 0xFCFCFCFCU; - Device->PIO4 = 0xFCFCFCFCU; - - return HAL_OK; -} - -/** - * @} - */ -#endif /* FMC_Bank4 */ - -#if defined(FMC_Bank5_6) - -/** @defgroup FMC_LL_SDRAM - * @brief SDRAM Controller functions - * - @verbatim - ============================================================================== - ##### How to use SDRAM device driver ##### - ============================================================================== - [..] - This driver contains a set of APIs to interface with the FMC SDRAM banks in order - to run the SDRAM external devices. - - (+) FMC SDRAM bank reset using the function FMC_SDRAM_DeInit() - (+) FMC SDRAM bank control configuration using the function FMC_SDRAM_Init() - (+) FMC SDRAM bank timing configuration using the function FMC_SDRAM_Timing_Init() - (+) FMC SDRAM bank enable/disable write operation using the functions - FMC_SDRAM_WriteOperation_Enable()/FMC_SDRAM_WriteOperation_Disable() - (+) FMC SDRAM bank send command using the function FMC_SDRAM_SendCommand() - -@endverbatim - * @{ - */ - -/** @addtogroup FMC_LL_SDRAM_Private_Functions_Group1 - * @brief Initialization and Configuration functions - * -@verbatim - ============================================================================== - ##### Initialization and de_initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the FMC SDRAM interface - (+) De-initialize the FMC SDRAM interface - (+) Configure the FMC clock and associated GPIOs - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the FMC_SDRAM device according to the specified - * control parameters in the FMC_SDRAM_InitTypeDef - * @param Device Pointer to SDRAM device instance - * @param Init Pointer to SDRAM Initialization structure - * @retval HAL status - */ -HAL_StatusTypeDef FMC_SDRAM_Init(FMC_SDRAM_TypeDef *Device, const FMC_SDRAM_InitTypeDef *Init) -{ - /* Check the parameters */ - assert_param(IS_FMC_SDRAM_DEVICE(Device)); - assert_param(IS_FMC_SDRAM_BANK(Init->SDBank)); - assert_param(IS_FMC_COLUMNBITS_NUMBER(Init->ColumnBitsNumber)); - assert_param(IS_FMC_ROWBITS_NUMBER(Init->RowBitsNumber)); - assert_param(IS_FMC_SDMEMORY_WIDTH(Init->MemoryDataWidth)); - assert_param(IS_FMC_INTERNALBANK_NUMBER(Init->InternalBankNumber)); - assert_param(IS_FMC_CAS_LATENCY(Init->CASLatency)); - assert_param(IS_FMC_WRITE_PROTECTION(Init->WriteProtection)); - assert_param(IS_FMC_SDCLOCK_PERIOD(Init->SDClockPeriod)); - assert_param(IS_FMC_READ_BURST(Init->ReadBurst)); - assert_param(IS_FMC_READPIPE_DELAY(Init->ReadPipeDelay)); - - /* Set SDRAM bank configuration parameters */ - if (Init->SDBank == FMC_SDRAM_BANK1) - { - MODIFY_REG(Device->SDCR[FMC_SDRAM_BANK1], - SDCR_CLEAR_MASK, - (Init->ColumnBitsNumber | - Init->RowBitsNumber | - Init->MemoryDataWidth | - Init->InternalBankNumber | - Init->CASLatency | - Init->WriteProtection | - Init->SDClockPeriod | - Init->ReadBurst | - Init->ReadPipeDelay)); - } - else /* FMC_Bank2_SDRAM */ - { - MODIFY_REG(Device->SDCR[FMC_SDRAM_BANK1], - FMC_SDCR1_SDCLK | - FMC_SDCR1_RBURST | - FMC_SDCR1_RPIPE, - (Init->SDClockPeriod | - Init->ReadBurst | - Init->ReadPipeDelay)); - - MODIFY_REG(Device->SDCR[FMC_SDRAM_BANK2], - SDCR_CLEAR_MASK, - (Init->ColumnBitsNumber | - Init->RowBitsNumber | - Init->MemoryDataWidth | - Init->InternalBankNumber | - Init->CASLatency | - Init->WriteProtection)); - } - - return HAL_OK; -} - - -/** - * @brief Initializes the FMC_SDRAM device timing according to the specified - * parameters in the FMC_SDRAM_TimingTypeDef - * @param Device Pointer to SDRAM device instance - * @param Timing Pointer to SDRAM Timing structure - * @param Bank SDRAM bank number - * @retval HAL status - */ -HAL_StatusTypeDef FMC_SDRAM_Timing_Init(FMC_SDRAM_TypeDef *Device, - const FMC_SDRAM_TimingTypeDef *Timing, uint32_t Bank) -{ - /* Check the parameters */ - assert_param(IS_FMC_SDRAM_DEVICE(Device)); - assert_param(IS_FMC_LOADTOACTIVE_DELAY(Timing->LoadToActiveDelay)); - assert_param(IS_FMC_EXITSELFREFRESH_DELAY(Timing->ExitSelfRefreshDelay)); - assert_param(IS_FMC_SELFREFRESH_TIME(Timing->SelfRefreshTime)); - assert_param(IS_FMC_ROWCYCLE_DELAY(Timing->RowCycleDelay)); - assert_param(IS_FMC_WRITE_RECOVERY_TIME(Timing->WriteRecoveryTime)); - assert_param(IS_FMC_RP_DELAY(Timing->RPDelay)); - assert_param(IS_FMC_RCD_DELAY(Timing->RCDDelay)); - assert_param(IS_FMC_SDRAM_BANK(Bank)); - - /* Set SDRAM device timing parameters */ - if (Bank == FMC_SDRAM_BANK1) - { - MODIFY_REG(Device->SDTR[FMC_SDRAM_BANK1], - SDTR_CLEAR_MASK, - (((Timing->LoadToActiveDelay) - 1U) | - (((Timing->ExitSelfRefreshDelay) - 1U) << FMC_SDTR1_TXSR_Pos) | - (((Timing->SelfRefreshTime) - 1U) << FMC_SDTR1_TRAS_Pos) | - (((Timing->RowCycleDelay) - 1U) << FMC_SDTR1_TRC_Pos) | - (((Timing->WriteRecoveryTime) - 1U) << FMC_SDTR1_TWR_Pos) | - (((Timing->RPDelay) - 1U) << FMC_SDTR1_TRP_Pos) | - (((Timing->RCDDelay) - 1U) << FMC_SDTR1_TRCD_Pos))); - } - else /* FMC_Bank2_SDRAM */ - { - MODIFY_REG(Device->SDTR[FMC_SDRAM_BANK1], - FMC_SDTR1_TRC | - FMC_SDTR1_TRP, - (((Timing->RowCycleDelay) - 1U) << FMC_SDTR1_TRC_Pos) | - (((Timing->RPDelay) - 1U) << FMC_SDTR1_TRP_Pos)); - - MODIFY_REG(Device->SDTR[FMC_SDRAM_BANK2], - SDTR_CLEAR_MASK, - (((Timing->LoadToActiveDelay) - 1U) | - (((Timing->ExitSelfRefreshDelay) - 1U) << FMC_SDTR1_TXSR_Pos) | - (((Timing->SelfRefreshTime) - 1U) << FMC_SDTR1_TRAS_Pos) | - (((Timing->WriteRecoveryTime) - 1U) << FMC_SDTR1_TWR_Pos) | - (((Timing->RCDDelay) - 1U) << FMC_SDTR1_TRCD_Pos))); - } - - return HAL_OK; -} - -/** - * @brief DeInitializes the FMC_SDRAM peripheral - * @param Device Pointer to SDRAM device instance - * @retval HAL status - */ -HAL_StatusTypeDef FMC_SDRAM_DeInit(FMC_SDRAM_TypeDef *Device, uint32_t Bank) -{ - /* Check the parameters */ - assert_param(IS_FMC_SDRAM_DEVICE(Device)); - assert_param(IS_FMC_SDRAM_BANK(Bank)); - - /* De-initialize the SDRAM device */ - Device->SDCR[Bank] = 0x000002D0U; - Device->SDTR[Bank] = 0x0FFFFFFFU; - Device->SDCMR = 0x00000000U; - Device->SDRTR = 0x00000000U; - Device->SDSR = 0x00000000U; - - return HAL_OK; -} - -/** - * @} - */ - -/** @addtogroup FMC_LL_SDRAMPrivate_Functions_Group2 - * @brief management functions - * -@verbatim - ============================================================================== - ##### FMC_SDRAM Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control dynamically - the FMC SDRAM interface. - -@endverbatim - * @{ - */ - -/** - * @brief Enables dynamically FMC_SDRAM write protection. - * @param Device Pointer to SDRAM device instance - * @param Bank SDRAM bank number - * @retval HAL status - */ -HAL_StatusTypeDef FMC_SDRAM_WriteProtection_Enable(FMC_SDRAM_TypeDef *Device, uint32_t Bank) -{ - /* Check the parameters */ - assert_param(IS_FMC_SDRAM_DEVICE(Device)); - assert_param(IS_FMC_SDRAM_BANK(Bank)); - - /* Enable write protection */ - SET_BIT(Device->SDCR[Bank], FMC_SDRAM_WRITE_PROTECTION_ENABLE); - - return HAL_OK; -} - -/** - * @brief Disables dynamically FMC_SDRAM write protection. - * @param hsdram FMC_SDRAM handle - * @retval HAL status - */ -HAL_StatusTypeDef FMC_SDRAM_WriteProtection_Disable(FMC_SDRAM_TypeDef *Device, uint32_t Bank) -{ - /* Check the parameters */ - assert_param(IS_FMC_SDRAM_DEVICE(Device)); - assert_param(IS_FMC_SDRAM_BANK(Bank)); - - /* Disable write protection */ - CLEAR_BIT(Device->SDCR[Bank], FMC_SDRAM_WRITE_PROTECTION_ENABLE); - - return HAL_OK; -} - -/** - * @brief Send Command to the FMC SDRAM bank - * @param Device Pointer to SDRAM device instance - * @param Command Pointer to SDRAM command structure - * @param Timing Pointer to SDRAM Timing structure - * @param Timeout Timeout wait value - * @retval HAL state - */ -HAL_StatusTypeDef FMC_SDRAM_SendCommand(FMC_SDRAM_TypeDef *Device, - const FMC_SDRAM_CommandTypeDef *Command, uint32_t Timeout) -{ - uint32_t tickstart = 0U; - /* Check the parameters */ - assert_param(IS_FMC_SDRAM_DEVICE(Device)); - assert_param(IS_FMC_COMMAND_MODE(Command->CommandMode)); - assert_param(IS_FMC_COMMAND_TARGET(Command->CommandTarget)); - assert_param(IS_FMC_AUTOREFRESH_NUMBER(Command->AutoRefreshNumber)); - assert_param(IS_FMC_MODE_REGISTER(Command->ModeRegisterDefinition)); - - /* Set command register */ - MODIFY_REG(Device->SDCMR, (FMC_SDCMR_MODE | FMC_SDCMR_CTB2 | FMC_SDCMR_CTB1 | FMC_SDCMR_NRFS | FMC_SDCMR_MRD), - ((Command->CommandMode) | (Command->CommandTarget) | - (((Command->AutoRefreshNumber) - 1U) << FMC_SDCMR_NRFS_Pos) | - ((Command->ModeRegisterDefinition) << FMC_SDCMR_MRD_Pos))); - /* Get tick */ - tickstart = HAL_GetTick(); - - /* wait until command is send */ - while (HAL_IS_BIT_SET(Device->SDSR, FMC_SDSR_BUSY)) - { - /* Check for the Timeout */ - if (Timeout != HAL_MAX_DELAY) - { - if ((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout)) - { - return HAL_TIMEOUT; - } - } - } - return HAL_OK; -} - -/** - * @brief Program the SDRAM Memory Refresh rate. - * @param Device Pointer to SDRAM device instance - * @param RefreshRate The SDRAM refresh rate value. - * @retval HAL state - */ -HAL_StatusTypeDef FMC_SDRAM_ProgramRefreshRate(FMC_SDRAM_TypeDef *Device, uint32_t RefreshRate) -{ - /* Check the parameters */ - assert_param(IS_FMC_SDRAM_DEVICE(Device)); - assert_param(IS_FMC_REFRESH_RATE(RefreshRate)); - - /* Set the refresh rate in command register */ - MODIFY_REG(Device->SDRTR, FMC_SDRTR_COUNT, (RefreshRate << FMC_SDRTR_COUNT_Pos)); - - return HAL_OK; -} - -/** - * @brief Set the Number of consecutive SDRAM Memory auto Refresh commands. - * @param Device Pointer to SDRAM device instance - * @param AutoRefreshNumber Specifies the auto Refresh number. - * @retval None - */ -HAL_StatusTypeDef FMC_SDRAM_SetAutoRefreshNumber(FMC_SDRAM_TypeDef *Device, - uint32_t AutoRefreshNumber) -{ - /* Check the parameters */ - assert_param(IS_FMC_SDRAM_DEVICE(Device)); - assert_param(IS_FMC_AUTOREFRESH_NUMBER(AutoRefreshNumber)); - - /* Set the Auto-refresh number in command register */ - MODIFY_REG(Device->SDCMR, FMC_SDCMR_NRFS, ((AutoRefreshNumber - 1U) << FMC_SDCMR_NRFS_Pos)); - - return HAL_OK; -} - -/** - * @brief Returns the indicated FMC SDRAM bank mode status. - * @param Device Pointer to SDRAM device instance - * @param Bank Defines the FMC SDRAM bank. This parameter can be - * FMC_Bank1_SDRAM or FMC_Bank2_SDRAM. - * @retval The FMC SDRAM bank mode status, could be on of the following values: - * FMC_SDRAM_NORMAL_MODE, FMC_SDRAM_SELF_REFRESH_MODE or - * FMC_SDRAM_POWER_DOWN_MODE. - */ -uint32_t FMC_SDRAM_GetModeStatus(const FMC_SDRAM_TypeDef *Device, uint32_t Bank) -{ - uint32_t tmpreg; - - /* Check the parameters */ - assert_param(IS_FMC_SDRAM_DEVICE(Device)); - assert_param(IS_FMC_SDRAM_BANK(Bank)); - - /* Get the corresponding bank mode */ - if (Bank == FMC_SDRAM_BANK1) - { - tmpreg = (uint32_t)(Device->SDSR & FMC_SDSR_MODES1); - } - else - { - tmpreg = ((uint32_t)(Device->SDSR & FMC_SDSR_MODES2) >> 2U); - } - - /* Return the mode status */ - return tmpreg; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* FMC_Bank5_6 */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_NOR_MODULE_ENABLED */ -/** - * @} - */ -/** - * @} - */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Middlewares/ST/ARM/DSP/Inc/arm_math.h b/L1_MCU/STM32F429ZIT6_STARM/Middlewares/ST/ARM/DSP/Inc/arm_math.h deleted file mode 100644 index 8daa218..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Middlewares/ST/ARM/DSP/Inc/arm_math.h +++ /dev/null @@ -1,8970 +0,0 @@ -/****************************************************************************** - * @file arm_math.h - * @brief Public header file for CMSIS DSP Library - * @version V1.7.0 - * @date 18. March 2019 - ******************************************************************************/ -/* - * Copyright (c) 2010-2019 Arm Limited or its affiliates. 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. - */ - -/** - \mainpage CMSIS DSP Software Library - * - * Introduction - * ------------ - * - * This user manual describes the CMSIS DSP software library, - * a suite of common signal processing functions for use on Cortex-M and Cortex-A processor - * based devices. - * - * The library is divided into a number of functions each covering a specific category: - * - Basic math functions - * - Fast math functions - * - Complex math functions - * - Filtering functions - * - Matrix functions - * - Transform functions - * - Motor control functions - * - Statistical functions - * - Support functions - * - Interpolation functions - * - Support Vector Machine functions (SVM) - * - Bayes classifier functions - * - Distance functions - * - * The library has generally separate functions for operating on 8-bit integers, 16-bit integers, - * 32-bit integer and 32-bit floating-point values. - * - * Using the Library - * ------------ - * - * The library installer contains prebuilt versions of the libraries in the Lib folder. - * - * Here is the list of pre-built libraries : - * - arm_cortexM7lfdp_math.lib (Cortex-M7, Little endian, Double Precision Floating Point Unit) - * - arm_cortexM7bfdp_math.lib (Cortex-M7, Big endian, Double Precision Floating Point Unit) - * - arm_cortexM7lfsp_math.lib (Cortex-M7, Little endian, Single Precision Floating Point Unit) - * - arm_cortexM7bfsp_math.lib (Cortex-M7, Big endian and Single Precision Floating Point Unit on) - * - arm_cortexM7l_math.lib (Cortex-M7, Little endian) - * - arm_cortexM7b_math.lib (Cortex-M7, Big endian) - * - arm_cortexM4lf_math.lib (Cortex-M4, Little endian, Floating Point Unit) - * - arm_cortexM4bf_math.lib (Cortex-M4, Big endian, Floating Point Unit) - * - arm_cortexM4l_math.lib (Cortex-M4, Little endian) - * - arm_cortexM4b_math.lib (Cortex-M4, Big endian) - * - arm_cortexM3l_math.lib (Cortex-M3, Little endian) - * - arm_cortexM3b_math.lib (Cortex-M3, Big endian) - * - arm_cortexM0l_math.lib (Cortex-M0 / Cortex-M0+, Little endian) - * - arm_cortexM0b_math.lib (Cortex-M0 / Cortex-M0+, Big endian) - * - arm_ARMv8MBLl_math.lib (Armv8-M Baseline, Little endian) - * - arm_ARMv8MMLl_math.lib (Armv8-M Mainline, Little endian) - * - arm_ARMv8MMLlfsp_math.lib (Armv8-M Mainline, Little endian, Single Precision Floating Point Unit) - * - arm_ARMv8MMLld_math.lib (Armv8-M Mainline, Little endian, DSP instructions) - * - arm_ARMv8MMLldfsp_math.lib (Armv8-M Mainline, Little endian, DSP instructions, Single Precision Floating Point Unit) - * - * The library functions are declared in the public file arm_math.h which is placed in the Include folder. - * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single - * public header file arm_math.h for Cortex-M cores with little endian and big endian. Same header file will be used for floating point unit(FPU) variants. - * - * - * Examples - * -------- - * - * The library ships with a number of examples which demonstrate how to use the library functions. - * - * Toolchain Support - * ------------ - * - * The library is now tested on Fast Models building with cmake. - * Core M0, M7, A5 are tested. - * - * - * - * Building the Library - * ------------ - * - * The library installer contains a project file to rebuild libraries on MDK toolchain in the CMSIS\\DSP\\Projects\\ARM folder. - * - arm_cortexM_math.uvprojx - * - * - * The libraries can be built by opening the arm_cortexM_math.uvprojx project in MDK-ARM, selecting a specific target, and defining the optional preprocessor macros detailed above. - * - * There is also a work in progress cmake build. The README file is giving more details. - * - * Preprocessor Macros - * ------------ - * - * Each library project have different preprocessor macros. - * - * - ARM_MATH_BIG_ENDIAN: - * - * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. - * - * - ARM_MATH_MATRIX_CHECK: - * - * Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices - * - * - ARM_MATH_ROUNDING: - * - * Define macro ARM_MATH_ROUNDING for rounding on support functions - * - * - ARM_MATH_LOOPUNROLL: - * - * Define macro ARM_MATH_LOOPUNROLL to enable manual loop unrolling in DSP functions - * - * - ARM_MATH_NEON: - * - * Define macro ARM_MATH_NEON to enable Neon versions of the DSP functions. - * It is not enabled by default when Neon is available because performances are - * dependent on the compiler and target architecture. - * - * - ARM_MATH_NEON_EXPERIMENTAL: - * - * Define macro ARM_MATH_NEON_EXPERIMENTAL to enable experimental Neon versions of - * of some DSP functions. Experimental Neon versions currently do not have better - * performances than the scalar versions. - * - * - ARM_MATH_HELIUM: - * - * It implies the flags ARM_MATH_MVEF and ARM_MATH_MVEI and ARM_MATH_FLOAT16. - * - * - ARM_MATH_MVEF: - * - * Select Helium versions of the f32 algorithms. - * It implies ARM_MATH_FLOAT16 and ARM_MATH_MVEI. - * - * - ARM_MATH_MVEI: - * - * Select Helium versions of the int and fixed point algorithms. - * - * - ARM_MATH_FLOAT16: - * - * Float16 implementations of some algorithms (Requires MVE extension). - * - *
- * CMSIS-DSP in ARM::CMSIS Pack - * ----------------------------- - * - * The following files relevant to CMSIS-DSP are present in the ARM::CMSIS Pack directories: - * |File/Folder |Content | - * |---------------------------------|------------------------------------------------------------------------| - * |\b CMSIS\\Documentation\\DSP | This documentation | - * |\b CMSIS\\DSP\\DSP_Lib_TestSuite | DSP_Lib test suite | - * |\b CMSIS\\DSP\\Examples | Example projects demonstrating the usage of the library functions | - * |\b CMSIS\\DSP\\Include | DSP_Lib include files | - * |\b CMSIS\\DSP\\Lib | DSP_Lib binaries | - * |\b CMSIS\\DSP\\Projects | Projects to rebuild DSP_Lib binaries | - * |\b CMSIS\\DSP\\Source | DSP_Lib source files | - * - *
- * Revision History of CMSIS-DSP - * ------------ - * Please refer to \ref ChangeLog_pg. - */ - - -/** - * @defgroup groupMath Basic Math Functions - */ - -/** - * @defgroup groupFastMath Fast Math Functions - * This set of functions provides a fast approximation to sine, cosine, and square root. - * As compared to most of the other functions in the CMSIS math library, the fast math functions - * operate on individual values and not arrays. - * There are separate functions for Q15, Q31, and floating-point data. - * - */ - -/** - * @defgroup groupCmplxMath Complex Math Functions - * This set of functions operates on complex data vectors. - * The data in the complex arrays is stored in an interleaved fashion - * (real, imag, real, imag, ...). - * In the API functions, the number of samples in a complex array refers - * to the number of complex values; the array contains twice this number of - * real values. - */ - -/** - * @defgroup groupFilters Filtering Functions - */ - -/** - * @defgroup groupMatrix Matrix Functions - * - * This set of functions provides basic matrix math operations. - * The functions operate on matrix data structures. For example, - * the type - * definition for the floating-point matrix structure is shown - * below: - *
- *     typedef struct
- *     {
- *       uint16_t numRows;     // number of rows of the matrix.
- *       uint16_t numCols;     // number of columns of the matrix.
- *       float32_t *pData;     // points to the data of the matrix.
- *     } arm_matrix_instance_f32;
- * 
- * There are similar definitions for Q15 and Q31 data types. - * - * The structure specifies the size of the matrix and then points to - * an array of data. The array is of size numRows X numCols - * and the values are arranged in row order. That is, the - * matrix element (i, j) is stored at: - *
- *     pData[i*numCols + j]
- * 
- * - * \par Init Functions - * There is an associated initialization function for each type of matrix - * data structure. - * The initialization function sets the values of the internal structure fields. - * Refer to \ref arm_mat_init_f32(), \ref arm_mat_init_q31() and \ref arm_mat_init_q15() - * for floating-point, Q31 and Q15 types, respectively. - * - * \par - * Use of the initialization function is optional. However, if initialization function is used - * then the instance structure cannot be placed into a const data section. - * To place the instance structure in a const data - * section, manually initialize the data structure. For example: - *
- * arm_matrix_instance_f32 S = {nRows, nColumns, pData};
- * arm_matrix_instance_q31 S = {nRows, nColumns, pData};
- * arm_matrix_instance_q15 S = {nRows, nColumns, pData};
- * 
- * where nRows specifies the number of rows, nColumns - * specifies the number of columns, and pData points to the - * data array. - * - * \par Size Checking - * By default all of the matrix functions perform size checking on the input and - * output matrices. For example, the matrix addition function verifies that the - * two input matrices and the output matrix all have the same number of rows and - * columns. If the size check fails the functions return: - *
- *     ARM_MATH_SIZE_MISMATCH
- * 
- * Otherwise the functions return - *
- *     ARM_MATH_SUCCESS
- * 
- * There is some overhead associated with this matrix size checking. - * The matrix size checking is enabled via the \#define - *
- *     ARM_MATH_MATRIX_CHECK
- * 
- * within the library project settings. By default this macro is defined - * and size checking is enabled. By changing the project settings and - * undefining this macro size checking is eliminated and the functions - * run a bit faster. With size checking disabled the functions always - * return ARM_MATH_SUCCESS. - */ - -/** - * @defgroup groupTransforms Transform Functions - */ - -/** - * @defgroup groupController Controller Functions - */ - -/** - * @defgroup groupStats Statistics Functions - */ - -/** - * @defgroup groupSupport Support Functions - */ - -/** - * @defgroup groupInterpolation Interpolation Functions - * These functions perform 1- and 2-dimensional interpolation of data. - * Linear interpolation is used for 1-dimensional data and - * bilinear interpolation is used for 2-dimensional data. - */ - -/** - * @defgroup groupExamples Examples - */ - -/** - * @defgroup groupSVM SVM Functions - * This set of functions is implementing SVM classification on 2 classes. - * The training must be done from scikit-learn. The parameters can be easily - * generated from the scikit-learn object. Some examples are given in - * DSP/Testing/PatternGeneration/SVM.py - * - * If more than 2 classes are needed, the functions in this folder - * will have to be used, as building blocks, to do multi-class classification. - * - * No multi-class classification is provided in this SVM folder. - * - */ - - -/** - * @defgroup groupBayes Bayesian estimators - * - * Implement the naive gaussian Bayes estimator. - * The training must be done from scikit-learn. - * - * The parameters can be easily - * generated from the scikit-learn object. Some examples are given in - * DSP/Testing/PatternGeneration/Bayes.py - */ - -/** - * @defgroup groupDistance Distance functions - * - * Distance functions for use with clustering algorithms. - * There are distance functions for float vectors and boolean vectors. - * - */ - - -#ifndef _ARM_MATH_H -#define _ARM_MATH_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Compiler specific diagnostic adjustment */ -#if defined ( __CC_ARM ) - -#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) - -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wsign-conversion" - #pragma GCC diagnostic ignored "-Wconversion" - #pragma GCC diagnostic ignored "-Wunused-parameter" - -#elif defined ( __ICCARM__ ) - -#elif defined ( __TI_ARM__ ) - -#elif defined ( __CSMC__ ) - -#elif defined ( __TASKING__ ) - -#elif defined ( _MSC_VER ) - -#else - #error Unknown compiler -#endif - - -/* Included for instrinsics definitions */ -#if defined (_MSC_VER ) -#include -#define __STATIC_FORCEINLINE static __forceinline -#define __STATIC_INLINE static __inline -#define __ALIGNED(x) __declspec(align(x)) - -#elif defined (__GNUC_PYTHON__) -#include -#define __ALIGNED(x) __attribute__((aligned(x))) -#define __STATIC_FORCEINLINE static __attribute__((inline)) -#define __STATIC_INLINE static __attribute__((inline)) -#pragma GCC diagnostic ignored "-Wunused-function" -#pragma GCC diagnostic ignored "-Wattributes" - -#else -#include "cmsis_compiler.h" -#endif - - - -#include -#include -#include -#include - - -#define F64_MAX ((float64_t)DBL_MAX) -#define F32_MAX ((float32_t)FLT_MAX) - -#if defined(ARM_MATH_FLOAT16) -#define F16_MAX ((float16_t)FLT_MAX) -#endif - -#define F64_MIN (-DBL_MAX) -#define F32_MIN (-FLT_MAX) - -#if defined(ARM_MATH_FLOAT16) -#define F16_MIN (-(float16_t)FLT_MAX) -#endif - -#define F64_ABSMAX ((float64_t)DBL_MAX) -#define F32_ABSMAX ((float32_t)FLT_MAX) - -#if defined(ARM_MATH_FLOAT16) -#define F16_ABSMAX ((float16_t)FLT_MAX) -#endif - -#define F64_ABSMIN ((float64_t)0.0) -#define F32_ABSMIN ((float32_t)0.0) - -#if defined(ARM_MATH_FLOAT16) -#define F16_ABSMIN ((float16_t)0.0) -#endif - -#define Q31_MAX ((q31_t)(0x7FFFFFFFL)) -#define Q15_MAX ((q15_t)(0x7FFF)) -#define Q7_MAX ((q7_t)(0x7F)) -#define Q31_MIN ((q31_t)(0x80000000L)) -#define Q15_MIN ((q15_t)(0x8000)) -#define Q7_MIN ((q7_t)(0x80)) - -#define Q31_ABSMAX ((q31_t)(0x7FFFFFFFL)) -#define Q15_ABSMAX ((q15_t)(0x7FFF)) -#define Q7_ABSMAX ((q7_t)(0x7F)) -#define Q31_ABSMIN ((q31_t)0) -#define Q15_ABSMIN ((q15_t)0) -#define Q7_ABSMIN ((q7_t)0) - -/* evaluate ARM DSP feature */ -#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) - #define ARM_MATH_DSP 1 -#endif - -#if defined(ARM_MATH_NEON) -#include -#endif - -#if defined (ARM_MATH_HELIUM) - #define ARM_MATH_MVEF - #define ARM_MATH_FLOAT16 -#endif - -#if defined (ARM_MATH_MVEF) - #define ARM_MATH_MVEI - #define ARM_MATH_FLOAT16 -#endif - -#if defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI) -#include -#endif - - - /** - * @brief Macros required for reciprocal calculation in Normalized LMS - */ - -#define DELTA_Q31 ((q31_t)(0x100)) -#define DELTA_Q15 ((q15_t)0x5) -#define INDEX_MASK 0x0000003F -#ifndef PI - #define PI 3.14159265358979f -#endif - - /** - * @brief Macros required for SINE and COSINE Fast math approximations - */ - -#define FAST_MATH_TABLE_SIZE 512 -#define FAST_MATH_Q31_SHIFT (32 - 10) -#define FAST_MATH_Q15_SHIFT (16 - 10) -#define CONTROLLER_Q31_SHIFT (32 - 9) -#define TABLE_SPACING_Q31 0x400000 -#define TABLE_SPACING_Q15 0x80 - - /** - * @brief Macros required for SINE and COSINE Controller functions - */ - /* 1.31(q31) Fixed value of 2/360 */ - /* -1 to +1 is divided into 360 values so total spacing is (2/360) */ -#define INPUT_SPACING 0xB60B61 - - /** - * @brief Macros for complex numbers - */ - - /* Dimension C vector space */ - #define CMPLX_DIM 2 - - /** - * @brief Error status returned by some functions in the library. - */ - - typedef enum - { - ARM_MATH_SUCCESS = 0, /**< No error */ - ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ - ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ - ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation */ - ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ - ARM_MATH_SINGULAR = -5, /**< Input matrix is singular and cannot be inverted */ - ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */ - } arm_status; - - /** - * @brief 8-bit fractional data type in 1.7 format. - */ - typedef int8_t q7_t; - - /** - * @brief 16-bit fractional data type in 1.15 format. - */ - typedef int16_t q15_t; - - /** - * @brief 32-bit fractional data type in 1.31 format. - */ - typedef int32_t q31_t; - - /** - * @brief 64-bit fractional data type in 1.63 format. - */ - typedef int64_t q63_t; - - /** - * @brief 32-bit floating-point type definition. - */ - typedef float float32_t; - - /** - * @brief 64-bit floating-point type definition. - */ - typedef double float64_t; - - /** - * @brief vector types - */ -#if defined(ARM_MATH_NEON) || defined (ARM_MATH_MVEI) - /** - * @brief 64-bit fractional 128-bit vector data type in 1.63 format - */ - typedef int64x2_t q63x2_t; - - /** - * @brief 32-bit fractional 128-bit vector data type in 1.31 format. - */ - typedef int32x4_t q31x4_t; - - /** - * @brief 16-bit fractional 128-bit vector data type with 16-bit alignement in 1.15 format. - */ - typedef __ALIGNED(2) int16x8_t q15x8_t; - - /** - * @brief 8-bit fractional 128-bit vector data type with 8-bit alignement in 1.7 format. - */ - typedef __ALIGNED(1) int8x16_t q7x16_t; - - /** - * @brief 32-bit fractional 128-bit vector pair data type in 1.31 format. - */ - typedef int32x4x2_t q31x4x2_t; - - /** - * @brief 32-bit fractional 128-bit vector quadruplet data type in 1.31 format. - */ - typedef int32x4x4_t q31x4x4_t; - - /** - * @brief 16-bit fractional 128-bit vector pair data type in 1.15 format. - */ - typedef int16x8x2_t q15x8x2_t; - - /** - * @brief 16-bit fractional 128-bit vector quadruplet data type in 1.15 format. - */ - typedef int16x8x4_t q15x8x4_t; - - /** - * @brief 8-bit fractional 128-bit vector pair data type in 1.7 format. - */ - typedef int8x16x2_t q7x16x2_t; - - /** - * @brief 8-bit fractional 128-bit vector quadruplet data type in 1.7 format. - */ - typedef int8x16x4_t q7x16x4_t; - - /** - * @brief 32-bit fractional data type in 9.23 format. - */ - typedef int32_t q23_t; - - /** - * @brief 32-bit fractional 128-bit vector data type in 9.23 format. - */ - typedef int32x4_t q23x4_t; - - /** - * @brief 64-bit status 128-bit vector data type. - */ - typedef int64x2_t status64x2_t; - - /** - * @brief 32-bit status 128-bit vector data type. - */ - typedef int32x4_t status32x4_t; - - /** - * @brief 16-bit status 128-bit vector data type. - */ - typedef int16x8_t status16x8_t; - - /** - * @brief 8-bit status 128-bit vector data type. - */ - typedef int8x16_t status8x16_t; - - -#endif - -#if defined(ARM_MATH_NEON) || defined(ARM_MATH_MVEF) /* floating point vector*/ - /** - * @brief 32-bit floating-point 128-bit vector type - */ - typedef float32x4_t f32x4_t; - -#if defined(ARM_MATH_FLOAT16) - /** - * @brief 16-bit floating-point 128-bit vector data type - */ - typedef __ALIGNED(2) float16x8_t f16x8_t; -#endif - - /** - * @brief 32-bit floating-point 128-bit vector pair data type - */ - typedef float32x4x2_t f32x4x2_t; - - /** - * @brief 32-bit floating-point 128-bit vector quadruplet data type - */ - typedef float32x4x4_t f32x4x4_t; - -#if defined(ARM_MATH_FLOAT16) - /** - * @brief 16-bit floating-point 128-bit vector pair data type - */ - typedef float16x8x2_t f16x8x2_t; - - /** - * @brief 16-bit floating-point 128-bit vector quadruplet data type - */ - typedef float16x8x4_t f16x8x4_t; -#endif - - /** - * @brief 32-bit ubiquitous 128-bit vector data type - */ - typedef union _any32x4_t - { - float32x4_t f; - int32x4_t i; - } any32x4_t; - -#if defined(ARM_MATH_FLOAT16) - /** - * @brief 16-bit ubiquitous 128-bit vector data type - */ - typedef union _any16x8_t - { - float16x8_t f; - int16x8_t i; - } any16x8_t; -#endif - -#endif - -#if defined(ARM_MATH_NEON) - /** - * @brief 32-bit fractional 64-bit vector data type in 1.31 format. - */ - typedef int32x2_t q31x2_t; - - /** - * @brief 16-bit fractional 64-bit vector data type in 1.15 format. - */ - typedef __ALIGNED(2) int16x4_t q15x4_t; - - /** - * @brief 8-bit fractional 64-bit vector data type in 1.7 format. - */ - typedef __ALIGNED(1) int8x8_t q7x8_t; - - /** - * @brief 32-bit float 64-bit vector data type. - */ - typedef float32x2_t f32x2_t; - -#if defined(ARM_MATH_FLOAT16) - /** - * @brief 16-bit float 64-bit vector data type. - */ - typedef __ALIGNED(2) float16x4_t f16x4_t; -#endif - - /** - * @brief 32-bit floating-point 128-bit vector triplet data type - */ - typedef float32x4x3_t f32x4x3_t; - -#if defined(ARM_MATH_FLOAT16) - /** - * @brief 16-bit floating-point 128-bit vector triplet data type - */ - typedef float16x8x3_t f16x8x3_t; -#endif - - /** - * @brief 32-bit fractional 128-bit vector triplet data type in 1.31 format - */ - typedef int32x4x3_t q31x4x3_t; - - /** - * @brief 16-bit fractional 128-bit vector triplet data type in 1.15 format - */ - typedef int16x8x3_t q15x8x3_t; - - /** - * @brief 8-bit fractional 128-bit vector triplet data type in 1.7 format - */ - typedef int8x16x3_t q7x16x3_t; - - /** - * @brief 32-bit floating-point 64-bit vector pair data type - */ - typedef float32x2x2_t f32x2x2_t; - - /** - * @brief 32-bit floating-point 64-bit vector triplet data type - */ - typedef float32x2x3_t f32x2x3_t; - - /** - * @brief 32-bit floating-point 64-bit vector quadruplet data type - */ - typedef float32x2x4_t f32x2x4_t; - -#if defined(ARM_MATH_FLOAT16) - /** - * @brief 16-bit floating-point 64-bit vector pair data type - */ - typedef float16x4x2_t f16x4x2_t; - - /** - * @brief 16-bit floating-point 64-bit vector triplet data type - */ - typedef float16x4x3_t f16x4x3_t; - - /** - * @brief 16-bit floating-point 64-bit vector quadruplet data type - */ - typedef float16x4x4_t f16x4x4_t; -#endif - - /** - * @brief 32-bit fractional 64-bit vector pair data type in 1.31 format - */ - typedef int32x2x2_t q31x2x2_t; - - /** - * @brief 32-bit fractional 64-bit vector triplet data type in 1.31 format - */ - typedef int32x2x3_t q31x2x3_t; - - /** - * @brief 32-bit fractional 64-bit vector quadruplet data type in 1.31 format - */ - typedef int32x4x3_t q31x2x4_t; - - /** - * @brief 16-bit fractional 64-bit vector pair data type in 1.15 format - */ - typedef int16x4x2_t q15x4x2_t; - - /** - * @brief 16-bit fractional 64-bit vector triplet data type in 1.15 format - */ - typedef int16x4x2_t q15x4x3_t; - - /** - * @brief 16-bit fractional 64-bit vector quadruplet data type in 1.15 format - */ - typedef int16x4x3_t q15x4x4_t; - - /** - * @brief 8-bit fractional 64-bit vector pair data type in 1.7 format - */ - typedef int8x8x2_t q7x8x2_t; - - /** - * @brief 8-bit fractional 64-bit vector triplet data type in 1.7 format - */ - typedef int8x8x3_t q7x8x3_t; - - /** - * @brief 8-bit fractional 64-bit vector quadruplet data type in 1.7 format - */ - typedef int8x8x4_t q7x8x4_t; - - /** - * @brief 32-bit ubiquitous 64-bit vector data type - */ - typedef union _any32x2_t - { - float32x2_t f; - int32x2_t i; - } any32x2_t; - -#if defined(ARM_MATH_FLOAT16) - /** - * @brief 16-bit ubiquitous 64-bit vector data type - */ - typedef union _any16x4_t - { - float16x4_t f; - int16x4_t i; - } any16x4_t; -#endif - - /** - * @brief 32-bit status 64-bit vector data type. - */ - typedef int32x4_t status32x2_t; - - /** - * @brief 16-bit status 64-bit vector data type. - */ - typedef int16x8_t status16x4_t; - - /** - * @brief 8-bit status 64-bit vector data type. - */ - typedef int8x16_t status8x8_t; - -#endif - - - -/** - @brief definition to read/write two 16 bit values. - @deprecated - */ -#if defined ( __CC_ARM ) - #define __SIMD32_TYPE int32_t __packed -#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) - #define __SIMD32_TYPE int32_t -#elif defined ( __GNUC__ ) - #define __SIMD32_TYPE int32_t -#elif defined ( __ICCARM__ ) - #define __SIMD32_TYPE int32_t __packed -#elif defined ( __TI_ARM__ ) - #define __SIMD32_TYPE int32_t -#elif defined ( __CSMC__ ) - #define __SIMD32_TYPE int32_t -#elif defined ( __TASKING__ ) - #define __SIMD32_TYPE __un(aligned) int32_t -#elif defined(_MSC_VER ) - #define __SIMD32_TYPE int32_t -#else - #error Unknown compiler -#endif - -#define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr)) -#define __SIMD32_CONST(addr) ( (__SIMD32_TYPE * ) (addr)) -#define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE * ) (addr)) -#define __SIMD64(addr) (*( int64_t **) & (addr)) - -#define STEP(x) (x) <= 0 ? 0 : 1 -#define SQ(x) ((x) * (x)) - -/* SIMD replacement */ - - -/** - @brief Read 2 Q15 from Q15 pointer. - @param[in] pQ15 points to input value - @return Q31 value - */ -__STATIC_FORCEINLINE q31_t read_q15x2 ( - q15_t * pQ15) -{ - q31_t val; - -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (&val, pQ15, 4); -#else - val = (pQ15[1] << 16) | (pQ15[0] & 0x0FFFF) ; -#endif - - return (val); -} - -/** - @brief Read 2 Q15 from Q15 pointer and increment pointer afterwards. - @param[in] pQ15 points to input value - @return Q31 value - */ -__STATIC_FORCEINLINE q31_t read_q15x2_ia ( - q15_t ** pQ15) -{ - q31_t val; - -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (&val, *pQ15, 4); -#else - val = ((*pQ15)[1] << 16) | ((*pQ15)[0] & 0x0FFFF); -#endif - - *pQ15 += 2; - return (val); -} - -/** - @brief Read 2 Q15 from Q15 pointer and decrement pointer afterwards. - @param[in] pQ15 points to input value - @return Q31 value - */ -__STATIC_FORCEINLINE q31_t read_q15x2_da ( - q15_t ** pQ15) -{ - q31_t val; - -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (&val, *pQ15, 4); -#else - val = ((*pQ15)[1] << 16) | ((*pQ15)[0] & 0x0FFFF); -#endif - - *pQ15 -= 2; - return (val); -} - -/** - @brief Write 2 Q15 to Q15 pointer and increment pointer afterwards. - @param[in] pQ15 points to input value - @param[in] value Q31 value - @return none - */ -__STATIC_FORCEINLINE void write_q15x2_ia ( - q15_t ** pQ15, - q31_t value) -{ - q31_t val = value; -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (*pQ15, &val, 4); -#else - (*pQ15)[0] = (val & 0x0FFFF); - (*pQ15)[1] = (val >> 16) & 0x0FFFF; -#endif - - *pQ15 += 2; -} - -/** - @brief Write 2 Q15 to Q15 pointer. - @param[in] pQ15 points to input value - @param[in] value Q31 value - @return none - */ -__STATIC_FORCEINLINE void write_q15x2 ( - q15_t * pQ15, - q31_t value) -{ - q31_t val = value; - -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (pQ15, &val, 4); -#else - pQ15[0] = val & 0x0FFFF; - pQ15[1] = val >> 16; -#endif -} - - -/** - @brief Read 4 Q7 from Q7 pointer and increment pointer afterwards. - @param[in] pQ7 points to input value - @return Q31 value - */ -__STATIC_FORCEINLINE q31_t read_q7x4_ia ( - q7_t ** pQ7) -{ - q31_t val; - - -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (&val, *pQ7, 4); -#else - val =(((*pQ7)[3] & 0x0FF) << 24) | (((*pQ7)[2] & 0x0FF) << 16) | (((*pQ7)[1] & 0x0FF) << 8) | ((*pQ7)[0] & 0x0FF); -#endif - - *pQ7 += 4; - - return (val); -} - -/** - @brief Read 4 Q7 from Q7 pointer and decrement pointer afterwards. - @param[in] pQ7 points to input value - @return Q31 value - */ -__STATIC_FORCEINLINE q31_t read_q7x4_da ( - q7_t ** pQ7) -{ - q31_t val; -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (&val, *pQ7, 4); -#else - val = ((((*pQ7)[3]) & 0x0FF) << 24) | ((((*pQ7)[2]) & 0x0FF) << 16) | ((((*pQ7)[1]) & 0x0FF) << 8) | ((*pQ7)[0] & 0x0FF); -#endif - *pQ7 -= 4; - - return (val); -} - -/** - @brief Write 4 Q7 to Q7 pointer and increment pointer afterwards. - @param[in] pQ7 points to input value - @param[in] value Q31 value - @return none - */ -__STATIC_FORCEINLINE void write_q7x4_ia ( - q7_t ** pQ7, - q31_t value) -{ - q31_t val = value; -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (*pQ7, &val, 4); -#else - (*pQ7)[0] = val & 0x0FF; - (*pQ7)[1] = (val >> 8) & 0x0FF; - (*pQ7)[2] = (val >> 16) & 0x0FF; - (*pQ7)[3] = (val >> 24) & 0x0FF; - -#endif - *pQ7 += 4; -} - -/* - -Normally those kind of definitions are in a compiler file -in Core or Core_A. - -But for MSVC compiler it is a bit special. The goal is very specific -to CMSIS-DSP and only to allow the use of this library from other -systems like Python or Matlab. - -MSVC is not going to be used to cross-compile to ARM. So, having a MSVC -compiler file in Core or Core_A would not make sense. - -*/ -#if defined ( _MSC_VER ) || defined(__GNUC_PYTHON__) - __STATIC_FORCEINLINE 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_FORCEINLINE 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_FORCEINLINE 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 - -#ifndef ARM_MATH_DSP - /** - * @brief definition to pack two 16 bit values. - */ - #define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ - (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) - #define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \ - (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) ) -#endif - - /** - * @brief definition to pack four 8 bit values. - */ -#ifndef ARM_MATH_BIG_ENDIAN - #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) -#else - #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) -#endif - - - /** - * @brief Clips Q63 to Q31 values. - */ - __STATIC_FORCEINLINE q31_t clip_q63_to_q31( - q63_t x) - { - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; - } - - /** - * @brief Clips Q63 to Q15 values. - */ - __STATIC_FORCEINLINE q15_t clip_q63_to_q15( - q63_t x) - { - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); - } - - /** - * @brief Clips Q31 to Q7 values. - */ - __STATIC_FORCEINLINE q7_t clip_q31_to_q7( - q31_t x) - { - return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? - ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; - } - - /** - * @brief Clips Q31 to Q15 values. - */ - __STATIC_FORCEINLINE q15_t clip_q31_to_q15( - q31_t x) - { - return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? - ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; - } - - /** - * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. - */ - __STATIC_FORCEINLINE q63_t mult32x64( - q63_t x, - q31_t y) - { - return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + - (((q63_t) (x >> 32) * y) ) ); - } - - /** - * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type. - */ - __STATIC_FORCEINLINE uint32_t arm_recip_q31( - q31_t in, - q31_t * dst, - const q31_t * pRecipTable) - { - q31_t out; - uint32_t tempVal; - uint32_t index, i; - uint32_t signBits; - - if (in > 0) - { - signBits = ((uint32_t) (__CLZ( in) - 1)); - } - else - { - signBits = ((uint32_t) (__CLZ(-in) - 1)); - } - - /* Convert input sample to 1.31 format */ - in = (in << signBits); - - /* calculation of index for initial approximated Val */ - index = (uint32_t)(in >> 24); - index = (index & INDEX_MASK); - - /* 1.31 with exp 1 */ - out = pRecipTable[index]; - - /* calculation of reciprocal value */ - /* running approximation for two iterations */ - for (i = 0U; i < 2U; i++) - { - tempVal = (uint32_t) (((q63_t) in * out) >> 31); - tempVal = 0x7FFFFFFFu - tempVal; - /* 1.31 with exp 1 */ - /* out = (q31_t) (((q63_t) out * tempVal) >> 30); */ - out = clip_q63_to_q31(((q63_t) out * tempVal) >> 30); - } - - /* write output */ - *dst = out; - - /* return num of signbits of out = 1/in value */ - return (signBits + 1U); - } - - - /** - * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type. - */ - __STATIC_FORCEINLINE uint32_t arm_recip_q15( - q15_t in, - q15_t * dst, - const q15_t * pRecipTable) - { - q15_t out = 0; - uint32_t tempVal = 0; - uint32_t index = 0, i = 0; - uint32_t signBits = 0; - - if (in > 0) - { - signBits = ((uint32_t)(__CLZ( in) - 17)); - } - else - { - signBits = ((uint32_t)(__CLZ(-in) - 17)); - } - - /* Convert input sample to 1.15 format */ - in = (in << signBits); - - /* calculation of index for initial approximated Val */ - index = (uint32_t)(in >> 8); - index = (index & INDEX_MASK); - - /* 1.15 with exp 1 */ - out = pRecipTable[index]; - - /* calculation of reciprocal value */ - /* running approximation for two iterations */ - for (i = 0U; i < 2U; i++) - { - tempVal = (uint32_t) (((q31_t) in * out) >> 15); - tempVal = 0x7FFFu - tempVal; - /* 1.15 with exp 1 */ - out = (q15_t) (((q31_t) out * tempVal) >> 14); - /* out = clip_q31_to_q15(((q31_t) out * tempVal) >> 14); */ - } - - /* write output */ - *dst = out; - - /* return num of signbits of out = 1/in value */ - return (signBits + 1); - } - -/** - * @brief Integer exponentiation - * @param[in] x value - * @param[in] nb integer exponent >= 1 - * @return x^nb - * - */ -__STATIC_INLINE float32_t arm_exponent_f32(float32_t x, int32_t nb) -{ - float32_t r = x; - nb --; - while(nb > 0) - { - r = r * x; - nb--; - } - return(r); -} - -/** - * @brief 64-bit to 32-bit unsigned normalization - * @param[in] in is input unsigned long long value - * @param[out] normalized is the 32-bit normalized value - * @param[out] norm is norm scale - */ -__STATIC_INLINE void arm_norm_64_to_32u(uint64_t in, int32_t * normalized, int32_t *norm) -{ - int32_t n1; - int32_t hi = (int32_t) (in >> 32); - int32_t lo = (int32_t) ((in << 32) >> 32); - - n1 = __CLZ(hi) - 32; - if (!n1) - { - /* - * input fits in 32-bit - */ - n1 = __CLZ(lo); - if (!n1) - { - /* - * MSB set, need to scale down by 1 - */ - *norm = -1; - *normalized = (((uint32_t) lo) >> 1); - } else - { - if (n1 == 32) - { - /* - * input is zero - */ - *norm = 0; - *normalized = 0; - } else - { - /* - * 32-bit normalization - */ - *norm = n1 - 1; - *normalized = lo << *norm; - } - } - } else - { - /* - * input fits in 64-bit - */ - n1 = 1 - n1; - *norm = -n1; - /* - * 64 bit normalization - */ - *normalized = (((uint32_t) lo) >> n1) | (hi << (32 - n1)); - } -} - -__STATIC_INLINE q31_t arm_div_q63_to_q31(q63_t num, q31_t den) -{ - q31_t result; - uint64_t absNum; - int32_t normalized; - int32_t norm; - - /* - * if sum fits in 32bits - * avoid costly 64-bit division - */ - absNum = num > 0 ? num : -num; - arm_norm_64_to_32u(absNum, &normalized, &norm); - if (norm > 0) - /* - * 32-bit division - */ - result = (q31_t) num / den; - else - /* - * 64-bit division - */ - result = (q31_t) (num / den); - - return result; -} - - -/* - * @brief C custom defined intrinsic functions - */ -#if !defined (ARM_MATH_DSP) - - /* - * @brief C custom defined QADD8 - */ - __STATIC_FORCEINLINE uint32_t __QADD8( - uint32_t x, - uint32_t y) - { - q31_t r, s, t, u; - - r = __SSAT(((((q31_t)x << 24) >> 24) + (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; - s = __SSAT(((((q31_t)x << 16) >> 24) + (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; - t = __SSAT(((((q31_t)x << 8) >> 24) + (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; - u = __SSAT(((((q31_t)x ) >> 24) + (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; - - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); - } - - - /* - * @brief C custom defined QSUB8 - */ - __STATIC_FORCEINLINE uint32_t __QSUB8( - uint32_t x, - uint32_t y) - { - q31_t r, s, t, u; - - r = __SSAT(((((q31_t)x << 24) >> 24) - (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; - s = __SSAT(((((q31_t)x << 16) >> 24) - (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; - t = __SSAT(((((q31_t)x << 8) >> 24) - (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; - u = __SSAT(((((q31_t)x ) >> 24) - (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; - - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); - } - - - /* - * @brief C custom defined QADD16 - */ - __STATIC_FORCEINLINE uint32_t __QADD16( - uint32_t x, - uint32_t y) - { -/* q31_t r, s; without initialisation 'arm_offset_q15 test' fails but 'intrinsic' tests pass! for armCC */ - q31_t r = 0, s = 0; - - r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined SHADD16 - */ - __STATIC_FORCEINLINE uint32_t __SHADD16( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = (((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined QSUB16 - */ - __STATIC_FORCEINLINE uint32_t __QSUB16( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined SHSUB16 - */ - __STATIC_FORCEINLINE uint32_t __SHSUB16( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = (((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined QASX - */ - __STATIC_FORCEINLINE uint32_t __QASX( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined SHASX - */ - __STATIC_FORCEINLINE uint32_t __SHASX( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = (((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined QSAX - */ - __STATIC_FORCEINLINE uint32_t __QSAX( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined SHSAX - */ - __STATIC_FORCEINLINE uint32_t __SHSAX( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = (((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined SMUSDX - */ - __STATIC_FORCEINLINE uint32_t __SMUSDX( - uint32_t x, - uint32_t y) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); - } - - /* - * @brief C custom defined SMUADX - */ - __STATIC_FORCEINLINE uint32_t __SMUADX( - uint32_t x, - uint32_t y) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); - } - - - /* - * @brief C custom defined QADD - */ - __STATIC_FORCEINLINE int32_t __QADD( - int32_t x, - int32_t y) - { - return ((int32_t)(clip_q63_to_q31((q63_t)x + (q31_t)y))); - } - - - /* - * @brief C custom defined QSUB - */ - __STATIC_FORCEINLINE int32_t __QSUB( - int32_t x, - int32_t y) - { - return ((int32_t)(clip_q63_to_q31((q63_t)x - (q31_t)y))); - } - - - /* - * @brief C custom defined SMLAD - */ - __STATIC_FORCEINLINE uint32_t __SMLAD( - uint32_t x, - uint32_t y, - uint32_t sum) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + - ( ((q31_t)sum ) ) )); - } - - - /* - * @brief C custom defined SMLADX - */ - __STATIC_FORCEINLINE uint32_t __SMLADX( - uint32_t x, - uint32_t y, - uint32_t sum) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + - ( ((q31_t)sum ) ) )); - } - - - /* - * @brief C custom defined SMLSDX - */ - __STATIC_FORCEINLINE uint32_t __SMLSDX( - uint32_t x, - uint32_t y, - uint32_t sum) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + - ( ((q31_t)sum ) ) )); - } - - - /* - * @brief C custom defined SMLALD - */ - __STATIC_FORCEINLINE uint64_t __SMLALD( - uint32_t x, - uint32_t y, - uint64_t sum) - { -/* return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); */ - return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + - ( ((q63_t)sum ) ) )); - } - - - /* - * @brief C custom defined SMLALDX - */ - __STATIC_FORCEINLINE uint64_t __SMLALDX( - uint32_t x, - uint32_t y, - uint64_t sum) - { -/* return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); */ - return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + - ( ((q63_t)sum ) ) )); - } - - - /* - * @brief C custom defined SMUAD - */ - __STATIC_FORCEINLINE uint32_t __SMUAD( - uint32_t x, - uint32_t y) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); - } - - - /* - * @brief C custom defined SMUSD - */ - __STATIC_FORCEINLINE uint32_t __SMUSD( - uint32_t x, - uint32_t y) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) - - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); - } - - - /* - * @brief C custom defined SXTB16 - */ - __STATIC_FORCEINLINE uint32_t __SXTB16( - uint32_t x) - { - return ((uint32_t)(((((q31_t)x << 24) >> 24) & (q31_t)0x0000FFFF) | - ((((q31_t)x << 8) >> 8) & (q31_t)0xFFFF0000) )); - } - - /* - * @brief C custom defined SMMLA - */ - __STATIC_FORCEINLINE int32_t __SMMLA( - int32_t x, - int32_t y, - int32_t sum) - { - return (sum + (int32_t) (((int64_t) x * y) >> 32)); - } - -#endif /* !defined (ARM_MATH_DSP) */ - - - /** - * @brief Instance structure for the Q7 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } arm_fir_instance_q7; - - /** - * @brief Instance structure for the Q15 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } arm_fir_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_f32; - - /** - * @brief Processing function for the Q7 FIR filter. - * @param[in] S points to an instance of the Q7 FIR filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_q7( - const arm_fir_instance_q7 * S, - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q7 FIR filter. - * @param[in,out] S points to an instance of the Q7 FIR structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed. - */ - void arm_fir_init_q7( - arm_fir_instance_q7 * S, - uint16_t numTaps, - const q7_t * pCoeffs, - q7_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q15 FIR filter. - * @param[in] S points to an instance of the Q15 FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_q15( - const arm_fir_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the fast Q15 FIR filter (fast version). - * @param[in] S points to an instance of the Q15 FIR filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_fast_q15( - const arm_fir_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q15 FIR filter. - * @param[in,out] S points to an instance of the Q15 FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - * @return The function returns either - * ARM_MATH_SUCCESS if initialization was successful or - * ARM_MATH_ARGUMENT_ERROR if numTaps is not a supported value. - */ - arm_status arm_fir_init_q15( - arm_fir_instance_q15 * S, - uint16_t numTaps, - const q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR filter. - * @param[in] S points to an instance of the Q31 FIR filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_q31( - const arm_fir_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the fast Q31 FIR filter (fast version). - * @param[in] S points to an instance of the Q31 FIR filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_fast_q31( - const arm_fir_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 FIR filter. - * @param[in,out] S points to an instance of the Q31 FIR structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - */ - void arm_fir_init_q31( - arm_fir_instance_q31 * S, - uint16_t numTaps, - const q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the floating-point FIR filter. - * @param[in] S points to an instance of the floating-point FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_f32( - const arm_fir_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point FIR filter. - * @param[in,out] S points to an instance of the floating-point FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - */ - void arm_fir_init_f32( - arm_fir_instance_f32 * S, - uint16_t numTaps, - const float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - /** - * @brief Instance structure for the Q15 Biquad cascade filter. - */ - typedef struct - { - int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - const q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - } arm_biquad_casd_df1_inst_q15; - - /** - * @brief Instance structure for the Q31 Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - const q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - } arm_biquad_casd_df1_inst_q31; - - /** - * @brief Instance structure for the floating-point Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - const float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_casd_df1_inst_f32; - -#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) - /** - * @brief Instance structure for the modified Biquad coefs required by vectorized code. - */ - typedef struct - { - float32_t coeffs[8][4]; /**< Points to the array of modified coefficients. The array is of length 32. There is one per stage */ - } arm_biquad_mod_coef_f32; -#endif - - /** - * @brief Processing function for the Q15 Biquad cascade filter. - * @param[in] S points to an instance of the Q15 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df1_q15( - const arm_biquad_casd_df1_inst_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q15 Biquad cascade filter. - * @param[in,out] S points to an instance of the Q15 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format - */ - void arm_biquad_cascade_df1_init_q15( - arm_biquad_casd_df1_inst_q15 * S, - uint8_t numStages, - const q15_t * pCoeffs, - q15_t * pState, - int8_t postShift); - - /** - * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q15 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df1_fast_q15( - const arm_biquad_casd_df1_inst_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 Biquad cascade filter - * @param[in] S points to an instance of the Q31 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df1_q31( - const arm_biquad_casd_df1_inst_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q31 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df1_fast_q31( - const arm_biquad_casd_df1_inst_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 Biquad cascade filter. - * @param[in,out] S points to an instance of the Q31 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format - */ - void arm_biquad_cascade_df1_init_q31( - arm_biquad_casd_df1_inst_q31 * S, - uint8_t numStages, - const q31_t * pCoeffs, - q31_t * pState, - int8_t postShift); - - /** - * @brief Processing function for the floating-point Biquad cascade filter. - * @param[in] S points to an instance of the floating-point Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df1_f32( - const arm_biquad_casd_df1_inst_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point Biquad cascade filter. - * @param[in,out] S points to an instance of the floating-point Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pCoeffsMod points to the modified filter coefficients (only MVE version). - * @param[in] pState points to the state buffer. - */ -#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) - void arm_biquad_cascade_df1_mve_init_f32( - arm_biquad_casd_df1_inst_f32 * S, - uint8_t numStages, - const float32_t * pCoeffs, - arm_biquad_mod_coef_f32 * pCoeffsMod, - float32_t * pState); -#endif - - void arm_biquad_cascade_df1_init_f32( - arm_biquad_casd_df1_inst_f32 * S, - uint8_t numStages, - const float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Compute the logical bitwise AND of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_and_u16( - const uint16_t * pSrcA, - const uint16_t * pSrcB, - uint16_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise AND of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_and_u32( - const uint32_t * pSrcA, - const uint32_t * pSrcB, - uint32_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise AND of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_and_u8( - const uint8_t * pSrcA, - const uint8_t * pSrcB, - uint8_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise OR of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_or_u16( - const uint16_t * pSrcA, - const uint16_t * pSrcB, - uint16_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise OR of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_or_u32( - const uint32_t * pSrcA, - const uint32_t * pSrcB, - uint32_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise OR of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_or_u8( - const uint8_t * pSrcA, - const uint8_t * pSrcB, - uint8_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise NOT of a fixed-point vector. - * @param[in] pSrc points to input vector - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_not_u16( - const uint16_t * pSrc, - uint16_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise NOT of a fixed-point vector. - * @param[in] pSrc points to input vector - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_not_u32( - const uint32_t * pSrc, - uint32_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise NOT of a fixed-point vector. - * @param[in] pSrc points to input vector - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_not_u8( - const uint8_t * pSrc, - uint8_t * pDst, - uint32_t blockSize); - -/** - * @brief Compute the logical bitwise XOR of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_xor_u16( - const uint16_t * pSrcA, - const uint16_t * pSrcB, - uint16_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise XOR of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_xor_u32( - const uint32_t * pSrcA, - const uint32_t * pSrcB, - uint32_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise XOR of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_xor_u8( - const uint8_t * pSrcA, - const uint8_t * pSrcB, - uint8_t * pDst, - uint32_t blockSize); - - /** - * @brief Struct for specifying sorting algorithm - */ - typedef enum - { - ARM_SORT_BITONIC = 0, - /**< Bitonic sort */ - ARM_SORT_BUBBLE = 1, - /**< Bubble sort */ - ARM_SORT_HEAP = 2, - /**< Heap sort */ - ARM_SORT_INSERTION = 3, - /**< Insertion sort */ - ARM_SORT_QUICK = 4, - /**< Quick sort */ - ARM_SORT_SELECTION = 5 - /**< Selection sort */ - } arm_sort_alg; - - /** - * @brief Struct for specifying sorting algorithm - */ - typedef enum - { - ARM_SORT_DESCENDING = 0, - /**< Descending order (9 to 0) */ - ARM_SORT_ASCENDING = 1 - /**< Ascending order (0 to 9) */ - } arm_sort_dir; - - /** - * @brief Instance structure for the sorting algorithms. - */ - typedef struct - { - arm_sort_alg alg; /**< Sorting algorithm selected */ - arm_sort_dir dir; /**< Sorting order (direction) */ - } arm_sort_instance_f32; - - /** - * @param[in] S points to an instance of the sorting structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_sort_f32( - const arm_sort_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @param[in,out] S points to an instance of the sorting structure. - * @param[in] alg Selected algorithm. - * @param[in] dir Sorting order. - */ - void arm_sort_init_f32( - arm_sort_instance_f32 * S, - arm_sort_alg alg, - arm_sort_dir dir); - - /** - * @brief Instance structure for the sorting algorithms. - */ - typedef struct - { - arm_sort_dir dir; /**< Sorting order (direction) */ - float32_t * buffer; /**< Working buffer */ - } arm_merge_sort_instance_f32; - - /** - * @param[in] S points to an instance of the sorting structure. - * @param[in,out] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_merge_sort_f32( - const arm_merge_sort_instance_f32 * S, - float32_t *pSrc, - float32_t *pDst, - uint32_t blockSize); - - /** - * @param[in,out] S points to an instance of the sorting structure. - * @param[in] dir Sorting order. - * @param[in] buffer Working buffer. - */ - void arm_merge_sort_init_f32( - arm_merge_sort_instance_f32 * S, - arm_sort_dir dir, - float32_t * buffer); - - /** - * @brief Struct for specifying cubic spline type - */ - typedef enum - { - ARM_SPLINE_NATURAL = 0, /**< Natural spline */ - ARM_SPLINE_PARABOLIC_RUNOUT = 1 /**< Parabolic runout spline */ - } arm_spline_type; - - /** - * @brief Instance structure for the floating-point cubic spline interpolation. - */ - typedef struct - { - arm_spline_type type; /**< Type (boundary conditions) */ - const float32_t * x; /**< x values */ - const float32_t * y; /**< y values */ - uint32_t n_x; /**< Number of known data points */ - float32_t * coeffs; /**< Coefficients buffer (b,c, and d) */ - } arm_spline_instance_f32; - - /** - * @brief Processing function for the floating-point cubic spline interpolation. - * @param[in] S points to an instance of the floating-point spline structure. - * @param[in] xq points to the x values ot the interpolated data points. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples of output data. - */ - void arm_spline_f32( - arm_spline_instance_f32 * S, - const float32_t * xq, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point cubic spline interpolation. - * @param[in,out] S points to an instance of the floating-point spline structure. - * @param[in] type type of cubic spline interpolation (boundary conditions) - * @param[in] x points to the x values of the known data points. - * @param[in] y points to the y values of the known data points. - * @param[in] n number of known data points. - * @param[in] coeffs coefficients array for b, c, and d - * @param[in] tempBuffer buffer array for internal computations - */ - void arm_spline_init_f32( - arm_spline_instance_f32 * S, - arm_spline_type type, - const float32_t * x, - const float32_t * y, - uint32_t n, - float32_t * coeffs, - float32_t * tempBuffer); - - /** - * @brief Instance structure for the floating-point matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float32_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_f32; - - /** - * @brief Instance structure for the floating-point matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float64_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_f64; - - /** - * @brief Instance structure for the Q15 matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q15_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_q15; - - /** - * @brief Instance structure for the Q31 matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q31_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_q31; - - /** - * @brief Floating-point matrix addition. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_add_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix addition. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_add_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix addition. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_add_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Floating-point, complex, matrix multiplication. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_cmplx_mult_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15, complex, matrix multiplication. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_cmplx_mult_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pScratch); - - /** - * @brief Q31, complex, matrix multiplication. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_cmplx_mult_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Floating-point matrix transpose. - * @param[in] pSrc points to the input matrix - * @param[out] pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_trans_f32( - const arm_matrix_instance_f32 * pSrc, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix transpose. - * @param[in] pSrc points to the input matrix - * @param[out] pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_trans_q15( - const arm_matrix_instance_q15 * pSrc, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix transpose. - * @param[in] pSrc points to the input matrix - * @param[out] pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_trans_q31( - const arm_matrix_instance_q31 * pSrc, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Floating-point matrix multiplication - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_mult_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix multiplication - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @param[in] pState points to the array for storing intermediate results - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_mult_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState); - - /** - * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @param[in] pState points to the array for storing intermediate results - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_mult_fast_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState); - - /** - * @brief Q31 matrix multiplication - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_mult_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_mult_fast_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Floating-point matrix subtraction - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_sub_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix subtraction - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_sub_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix subtraction - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_sub_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Floating-point matrix scaling. - * @param[in] pSrc points to the input matrix - * @param[in] scale scale factor - * @param[out] pDst points to the output matrix - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_scale_f32( - const arm_matrix_instance_f32 * pSrc, - float32_t scale, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix scaling. - * @param[in] pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to output matrix - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_scale_q15( - const arm_matrix_instance_q15 * pSrc, - q15_t scaleFract, - int32_t shift, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix scaling. - * @param[in] pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_scale_q31( - const arm_matrix_instance_q31 * pSrc, - q31_t scaleFract, - int32_t shift, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Q31 matrix initialization. - * @param[in,out] S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] pData points to the matrix data array. - */ -void arm_mat_init_q31( - arm_matrix_instance_q31 * S, - uint16_t nRows, - uint16_t nColumns, - q31_t * pData); - - /** - * @brief Q15 matrix initialization. - * @param[in,out] S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] pData points to the matrix data array. - */ -void arm_mat_init_q15( - arm_matrix_instance_q15 * S, - uint16_t nRows, - uint16_t nColumns, - q15_t * pData); - - /** - * @brief Floating-point matrix initialization. - * @param[in,out] S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] pData points to the matrix data array. - */ -void arm_mat_init_f32( - arm_matrix_instance_f32 * S, - uint16_t nRows, - uint16_t nColumns, - float32_t * pData); - - - /** - * @brief Instance structure for the Q15 PID Control. - */ - typedef struct - { - q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ -#if !defined (ARM_MATH_DSP) - q15_t A1; - q15_t A2; -#else - q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ -#endif - q15_t state[3]; /**< The state array of length 3. */ - q15_t Kp; /**< The proportional gain. */ - q15_t Ki; /**< The integral gain. */ - q15_t Kd; /**< The derivative gain. */ - } arm_pid_instance_q15; - - /** - * @brief Instance structure for the Q31 PID Control. - */ - typedef struct - { - q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - q31_t A2; /**< The derived gain, A2 = Kd . */ - q31_t state[3]; /**< The state array of length 3. */ - q31_t Kp; /**< The proportional gain. */ - q31_t Ki; /**< The integral gain. */ - q31_t Kd; /**< The derivative gain. */ - } arm_pid_instance_q31; - - /** - * @brief Instance structure for the floating-point PID Control. - */ - typedef struct - { - float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - float32_t A2; /**< The derived gain, A2 = Kd . */ - float32_t state[3]; /**< The state array of length 3. */ - float32_t Kp; /**< The proportional gain. */ - float32_t Ki; /**< The integral gain. */ - float32_t Kd; /**< The derivative gain. */ - } arm_pid_instance_f32; - - - - /** - * @brief Initialization function for the floating-point PID Control. - * @param[in,out] S points to an instance of the PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - */ - void arm_pid_init_f32( - arm_pid_instance_f32 * S, - int32_t resetStateFlag); - - - /** - * @brief Reset function for the floating-point PID Control. - * @param[in,out] S is an instance of the floating-point PID Control structure - */ - void arm_pid_reset_f32( - arm_pid_instance_f32 * S); - - - /** - * @brief Initialization function for the Q31 PID Control. - * @param[in,out] S points to an instance of the Q15 PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - */ - void arm_pid_init_q31( - arm_pid_instance_q31 * S, - int32_t resetStateFlag); - - - /** - * @brief Reset function for the Q31 PID Control. - * @param[in,out] S points to an instance of the Q31 PID Control structure - */ - - void arm_pid_reset_q31( - arm_pid_instance_q31 * S); - - - /** - * @brief Initialization function for the Q15 PID Control. - * @param[in,out] S points to an instance of the Q15 PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - */ - void arm_pid_init_q15( - arm_pid_instance_q15 * S, - int32_t resetStateFlag); - - - /** - * @brief Reset function for the Q15 PID Control. - * @param[in,out] S points to an instance of the q15 PID Control structure - */ - void arm_pid_reset_q15( - arm_pid_instance_q15 * S); - - - /** - * @brief Instance structure for the floating-point Linear Interpolate function. - */ - typedef struct - { - uint32_t nValues; /**< nValues */ - float32_t x1; /**< x1 */ - float32_t xSpacing; /**< xSpacing */ - float32_t *pYData; /**< pointer to the table of Y values */ - } arm_linear_interp_instance_f32; - - /** - * @brief Instance structure for the floating-point bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - float32_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_f32; - - /** - * @brief Instance structure for the Q31 bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q31_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q31; - - /** - * @brief Instance structure for the Q15 bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q15_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q15; - - /** - * @brief Instance structure for the Q15 bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q7_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q7; - - - /** - * @brief Q7 vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_mult_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q15 vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_mult_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q31 vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_mult_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Floating-point vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_mult_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix2_instance_q15; - -/* Deprecated */ - arm_status arm_cfft_radix2_init_q15( - arm_cfft_radix2_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix2_q15( - const arm_cfft_radix2_instance_q15 * S, - q15_t * pSrc); - - - /** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q15_t *pTwiddle; /**< points to the twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix4_instance_q15; - -/* Deprecated */ - arm_status arm_cfft_radix4_init_q15( - arm_cfft_radix4_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix4_q15( - const arm_cfft_radix4_instance_q15 * S, - q15_t * pSrc); - - /** - * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix2_instance_q31; - -/* Deprecated */ - arm_status arm_cfft_radix2_init_q31( - arm_cfft_radix2_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix2_q31( - const arm_cfft_radix2_instance_q31 * S, - q31_t * pSrc); - - /** - * @brief Instance structure for the Q31 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q31_t *pTwiddle; /**< points to the twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix4_instance_q31; - -/* Deprecated */ - void arm_cfft_radix4_q31( - const arm_cfft_radix4_instance_q31 * S, - q31_t * pSrc); - -/* Deprecated */ - arm_status arm_cfft_radix4_init_q31( - arm_cfft_radix4_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } arm_cfft_radix2_instance_f32; - -/* Deprecated */ - arm_status arm_cfft_radix2_init_f32( - arm_cfft_radix2_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix2_f32( - const arm_cfft_radix2_instance_f32 * S, - float32_t * pSrc); - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } arm_cfft_radix4_instance_f32; - -/* Deprecated */ - arm_status arm_cfft_radix4_init_f32( - arm_cfft_radix4_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix4_f32( - const arm_cfft_radix4_instance_f32 * S, - float32_t * pSrc); - - /** - * @brief Instance structure for the fixed-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const q15_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ -#if defined(ARM_MATH_MVEI) - const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \ - const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \ - const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \ - const q15_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \ - const q15_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \ - const q15_t *rearranged_twiddle_stride3; -#endif - } arm_cfft_instance_q15; - -arm_status arm_cfft_init_q15( - arm_cfft_instance_q15 * S, - uint16_t fftLen); - -void arm_cfft_q15( - const arm_cfft_instance_q15 * S, - q15_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the fixed-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ -#if defined(ARM_MATH_MVEI) - const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \ - const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \ - const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \ - const q31_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \ - const q31_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \ - const q31_t *rearranged_twiddle_stride3; -#endif - } arm_cfft_instance_q31; - -arm_status arm_cfft_init_q31( - arm_cfft_instance_q31 * S, - uint16_t fftLen); - -void arm_cfft_q31( - const arm_cfft_instance_q31 * S, - q31_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ -#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) - const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \ - const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \ - const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \ - const float32_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \ - const float32_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \ - const float32_t *rearranged_twiddle_stride3; -#endif - } arm_cfft_instance_f32; - - - arm_status arm_cfft_init_f32( - arm_cfft_instance_f32 * S, - uint16_t fftLen); - - void arm_cfft_f32( - const arm_cfft_instance_f32 * S, - float32_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - - /** - * @brief Instance structure for the Double Precision Floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const float64_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ - } arm_cfft_instance_f64; - - void arm_cfft_f64( - const arm_cfft_instance_f64 * S, - float64_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the Q15 RFFT/RIFFT function. - */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - const q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - const q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ -#if defined(ARM_MATH_MVEI) - arm_cfft_instance_q15 cfftInst; -#else - const arm_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ -#endif - } arm_rfft_instance_q15; - - arm_status arm_rfft_init_q15( - arm_rfft_instance_q15 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void arm_rfft_q15( - const arm_rfft_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst); - - /** - * @brief Instance structure for the Q31 RFFT/RIFFT function. - */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - const q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - const q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ -#if defined(ARM_MATH_MVEI) - arm_cfft_instance_q31 cfftInst; -#else - const arm_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ -#endif - } arm_rfft_instance_q31; - - arm_status arm_rfft_init_q31( - arm_rfft_instance_q31 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void arm_rfft_q31( - const arm_rfft_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst); - - /** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint16_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - const float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - const float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } arm_rfft_instance_f32; - - arm_status arm_rfft_init_f32( - arm_rfft_instance_f32 * S, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void arm_rfft_f32( - const arm_rfft_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst); - - /** - * @brief Instance structure for the Double Precision Floating-point RFFT/RIFFT function. - */ -typedef struct - { - arm_cfft_instance_f64 Sint; /**< Internal CFFT structure. */ - uint16_t fftLenRFFT; /**< length of the real sequence */ - const float64_t * pTwiddleRFFT; /**< Twiddle factors real stage */ - } arm_rfft_fast_instance_f64 ; - -arm_status arm_rfft_fast_init_f64 ( - arm_rfft_fast_instance_f64 * S, - uint16_t fftLen); - - -void arm_rfft_fast_f64( - arm_rfft_fast_instance_f64 * S, - float64_t * p, float64_t * pOut, - uint8_t ifftFlag); - - - /** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ -typedef struct - { - arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ - uint16_t fftLenRFFT; /**< length of the real sequence */ - const float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */ - } arm_rfft_fast_instance_f32 ; - -arm_status arm_rfft_fast_init_f32 ( - arm_rfft_fast_instance_f32 * S, - uint16_t fftLen); - - - void arm_rfft_fast_f32( - const arm_rfft_fast_instance_f32 * S, - float32_t * p, float32_t * pOut, - uint8_t ifftFlag); - - /** - * @brief Instance structure for the floating-point DCT4/IDCT4 function. - */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - float32_t normalize; /**< normalizing factor. */ - const float32_t *pTwiddle; /**< points to the twiddle factor table. */ - const float32_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_f32; - - - /** - * @brief Initialization function for the floating-point DCT4/IDCT4. - * @param[in,out] S points to an instance of floating-point DCT4/IDCT4 structure. - * @param[in] S_RFFT points to an instance of floating-point RFFT/RIFFT structure. - * @param[in] S_CFFT points to an instance of floating-point CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported transform length. - */ - arm_status arm_dct4_init_f32( - arm_dct4_instance_f32 * S, - arm_rfft_instance_f32 * S_RFFT, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint16_t N, - uint16_t Nby2, - float32_t normalize); - - - /** - * @brief Processing function for the floating-point DCT4/IDCT4. - * @param[in] S points to an instance of the floating-point DCT4/IDCT4 structure. - * @param[in] pState points to state buffer. - * @param[in,out] pInlineBuffer points to the in-place input and output buffer. - */ - void arm_dct4_f32( - const arm_dct4_instance_f32 * S, - float32_t * pState, - float32_t * pInlineBuffer); - - - /** - * @brief Instance structure for the Q31 DCT4/IDCT4 function. - */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q31_t normalize; /**< normalizing factor. */ - const q31_t *pTwiddle; /**< points to the twiddle factor table. */ - const q31_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_q31; - - - /** - * @brief Initialization function for the Q31 DCT4/IDCT4. - * @param[in,out] S points to an instance of Q31 DCT4/IDCT4 structure. - * @param[in] S_RFFT points to an instance of Q31 RFFT/RIFFT structure - * @param[in] S_CFFT points to an instance of Q31 CFFT/CIFFT structure - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. - */ - arm_status arm_dct4_init_q31( - arm_dct4_instance_q31 * S, - arm_rfft_instance_q31 * S_RFFT, - arm_cfft_radix4_instance_q31 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q31_t normalize); - - - /** - * @brief Processing function for the Q31 DCT4/IDCT4. - * @param[in] S points to an instance of the Q31 DCT4 structure. - * @param[in] pState points to state buffer. - * @param[in,out] pInlineBuffer points to the in-place input and output buffer. - */ - void arm_dct4_q31( - const arm_dct4_instance_q31 * S, - q31_t * pState, - q31_t * pInlineBuffer); - - - /** - * @brief Instance structure for the Q15 DCT4/IDCT4 function. - */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q15_t normalize; /**< normalizing factor. */ - const q15_t *pTwiddle; /**< points to the twiddle factor table. */ - const q15_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_q15; - - - /** - * @brief Initialization function for the Q15 DCT4/IDCT4. - * @param[in,out] S points to an instance of Q15 DCT4/IDCT4 structure. - * @param[in] S_RFFT points to an instance of Q15 RFFT/RIFFT structure. - * @param[in] S_CFFT points to an instance of Q15 CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. - */ - arm_status arm_dct4_init_q15( - arm_dct4_instance_q15 * S, - arm_rfft_instance_q15 * S_RFFT, - arm_cfft_radix4_instance_q15 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q15_t normalize); - - - /** - * @brief Processing function for the Q15 DCT4/IDCT4. - * @param[in] S points to an instance of the Q15 DCT4 structure. - * @param[in] pState points to state buffer. - * @param[in,out] pInlineBuffer points to the in-place input and output buffer. - */ - void arm_dct4_q15( - const arm_dct4_instance_q15 * S, - q15_t * pState, - q15_t * pInlineBuffer); - - - /** - * @brief Floating-point vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_add_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q7 vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_add_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q15 vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_add_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q31 vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_add_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Floating-point vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_sub_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q7 vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_sub_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q15 vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_sub_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q31 vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_sub_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Multiplies a floating-point vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scale scale factor to be applied - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_scale_f32( - const float32_t * pSrc, - float32_t scale, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Multiplies a Q7 vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_scale_q7( - const q7_t * pSrc, - q7_t scaleFract, - int8_t shift, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Multiplies a Q15 vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_scale_q15( - const q15_t * pSrc, - q15_t scaleFract, - int8_t shift, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Multiplies a Q31 vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_scale_q31( - const q31_t * pSrc, - q31_t scaleFract, - int8_t shift, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q7 vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ - void arm_abs_q7( - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Floating-point vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ - void arm_abs_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q15 vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ - void arm_abs_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q31 vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ - void arm_abs_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Dot product of floating-point vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ - void arm_dot_prod_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - uint32_t blockSize, - float32_t * result); - - - /** - * @brief Dot product of Q7 vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ - void arm_dot_prod_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - uint32_t blockSize, - q31_t * result); - - - /** - * @brief Dot product of Q15 vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ - void arm_dot_prod_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - - /** - * @brief Dot product of Q31 vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ - void arm_dot_prod_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - - /** - * @brief Shifts the elements of a Q7 vector a specified number of bits. - * @param[in] pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_shift_q7( - const q7_t * pSrc, - int8_t shiftBits, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Shifts the elements of a Q15 vector a specified number of bits. - * @param[in] pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_shift_q15( - const q15_t * pSrc, - int8_t shiftBits, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Shifts the elements of a Q31 vector a specified number of bits. - * @param[in] pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_shift_q31( - const q31_t * pSrc, - int8_t shiftBits, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Adds a constant offset to a floating-point vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_offset_f32( - const float32_t * pSrc, - float32_t offset, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Adds a constant offset to a Q7 vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_offset_q7( - const q7_t * pSrc, - q7_t offset, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Adds a constant offset to a Q15 vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_offset_q15( - const q15_t * pSrc, - q15_t offset, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Adds a constant offset to a Q31 vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_offset_q31( - const q31_t * pSrc, - q31_t offset, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Negates the elements of a floating-point vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_negate_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Negates the elements of a Q7 vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_negate_q7( - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Negates the elements of a Q15 vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_negate_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Negates the elements of a Q31 vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_negate_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Copies the elements of a floating-point vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_copy_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Copies the elements of a Q7 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_copy_q7( - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Copies the elements of a Q15 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_copy_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Copies the elements of a Q31 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_copy_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Fills a constant value into a floating-point vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_fill_f32( - float32_t value, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Fills a constant value into a Q7 vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_fill_q7( - q7_t value, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Fills a constant value into a Q15 vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_fill_q15( - q15_t value, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Fills a constant value into a Q31 vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_fill_q31( - q31_t value, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Convolution of floating-point sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - */ - void arm_conv_f32( - const float32_t * pSrcA, - uint32_t srcALen, - const float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - - /** - * @brief Convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - */ - void arm_conv_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - */ - void arm_conv_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - - /** - * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ - void arm_conv_fast_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - - /** - * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - */ - void arm_conv_fast_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Convolution of Q31 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ - void arm_conv_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - - /** - * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ - void arm_conv_fast_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - - /** - * @brief Convolution of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - */ - void arm_conv_opt_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Convolution of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ - void arm_conv_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - - /** - * @brief Partial convolution of floating-point sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_f32( - const float32_t * pSrcA, - uint32_t srcALen, - const float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Partial convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_fast_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_fast_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Partial convolution of Q31 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_fast_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q7 sequences - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_opt_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Partial convolution of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Instance structure for the Q15 FIR decimator. - */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR decimator. - */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_q31; - -/** - @brief Instance structure for floating-point FIR decimator. - */ -typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_f32; - - -/** - @brief Processing function for floating-point FIR decimator. - @param[in] S points to an instance of the floating-point FIR decimator structure - @param[in] pSrc points to the block of input data - @param[out] pDst points to the block of output data - @param[in] blockSize number of samples to process - */ -void arm_fir_decimate_f32( - const arm_fir_decimate_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - -/** - @brief Initialization function for the floating-point FIR decimator. - @param[in,out] S points to an instance of the floating-point FIR decimator structure - @param[in] numTaps number of coefficients in the filter - @param[in] M decimation factor - @param[in] pCoeffs points to the filter coefficients - @param[in] pState points to the state buffer - @param[in] blockSize number of input samples to process per call - @return execution status - - \ref ARM_MATH_SUCCESS : Operation successful - - \ref ARM_MATH_LENGTH_ERROR : blockSize is not a multiple of M - */ -arm_status arm_fir_decimate_init_f32( - arm_fir_decimate_instance_f32 * S, - uint16_t numTaps, - uint8_t M, - const float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 FIR decimator. - * @param[in] S points to an instance of the Q15 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_decimate_q15( - const arm_fir_decimate_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q15 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_decimate_fast_q15( - const arm_fir_decimate_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 FIR decimator. - * @param[in,out] S points to an instance of the Q15 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - */ - arm_status arm_fir_decimate_init_q15( - arm_fir_decimate_instance_q15 * S, - uint16_t numTaps, - uint8_t M, - const q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 FIR decimator. - * @param[in] S points to an instance of the Q31 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_decimate_q31( - const arm_fir_decimate_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q31 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_decimate_fast_q31( - const arm_fir_decimate_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 FIR decimator. - * @param[in,out] S points to an instance of the Q31 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - */ - arm_status arm_fir_decimate_init_q31( - arm_fir_decimate_instance_q31 * S, - uint16_t numTaps, - uint8_t M, - const q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 FIR interpolator. - */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } arm_fir_interpolate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR interpolator. - */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } arm_fir_interpolate_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR interpolator. - */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ - } arm_fir_interpolate_instance_f32; - - - /** - * @brief Processing function for the Q15 FIR interpolator. - * @param[in] S points to an instance of the Q15 FIR interpolator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_interpolate_q15( - const arm_fir_interpolate_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 FIR interpolator. - * @param[in,out] S points to an instance of the Q15 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - */ - arm_status arm_fir_interpolate_init_q15( - arm_fir_interpolate_instance_q15 * S, - uint8_t L, - uint16_t numTaps, - const q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 FIR interpolator. - * @param[in] S points to an instance of the Q15 FIR interpolator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_interpolate_q31( - const arm_fir_interpolate_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 FIR interpolator. - * @param[in,out] S points to an instance of the Q31 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - */ - arm_status arm_fir_interpolate_init_q31( - arm_fir_interpolate_instance_q31 * S, - uint8_t L, - uint16_t numTaps, - const q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the floating-point FIR interpolator. - * @param[in] S points to an instance of the floating-point FIR interpolator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_interpolate_f32( - const arm_fir_interpolate_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point FIR interpolator. - * @param[in,out] S points to an instance of the floating-point FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - */ - arm_status arm_fir_interpolate_init_f32( - arm_fir_interpolate_instance_f32 * S, - uint8_t L, - uint16_t numTaps, - const float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the high precision Q31 Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - const q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ - } arm_biquad_cas_df1_32x64_ins_q31; - - - /** - * @param[in] S points to an instance of the high precision Q31 Biquad cascade filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cas_df1_32x64_q31( - const arm_biquad_cas_df1_32x64_ins_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @param[in,out] S points to an instance of the high precision Q31 Biquad cascade filter structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format - */ - void arm_biquad_cas_df1_32x64_init_q31( - arm_biquad_cas_df1_32x64_ins_q31 * S, - uint8_t numStages, - const q31_t * pCoeffs, - q63_t * pState, - uint8_t postShift); - - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - const float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_df2T_instance_f32; - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - const float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_stereo_df2T_instance_f32; - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float64_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - const float64_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_df2T_instance_f64; - - - /** - * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in] S points to an instance of the filter data structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df2T_f32( - const arm_biquad_cascade_df2T_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels - * @param[in] S points to an instance of the filter data structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_stereo_df2T_f32( - const arm_biquad_cascade_stereo_df2T_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in] S points to an instance of the filter data structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df2T_f64( - const arm_biquad_cascade_df2T_instance_f64 * S, - const float64_t * pSrc, - float64_t * pDst, - uint32_t blockSize); - - -#if defined(ARM_MATH_NEON) -void arm_biquad_cascade_df2T_compute_coefs_f32( - arm_biquad_cascade_df2T_instance_f32 * S, - uint8_t numStages, - float32_t * pCoeffs); -#endif - /** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - */ - void arm_biquad_cascade_df2T_init_f32( - arm_biquad_cascade_df2T_instance_f32 * S, - uint8_t numStages, - const float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - */ - void arm_biquad_cascade_stereo_df2T_init_f32( - arm_biquad_cascade_stereo_df2T_instance_f32 * S, - uint8_t numStages, - const float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - */ - void arm_biquad_cascade_df2T_init_f64( - arm_biquad_cascade_df2T_instance_f64 * S, - uint8_t numStages, - const float64_t * pCoeffs, - float64_t * pState); - - - /** - * @brief Instance structure for the Q15 FIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_f32; - - - /** - * @brief Initialization function for the Q15 FIR lattice filter. - * @param[in] S points to an instance of the Q15 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] pState points to the state buffer. The array is of length numStages. - */ - void arm_fir_lattice_init_q15( - arm_fir_lattice_instance_q15 * S, - uint16_t numStages, - const q15_t * pCoeffs, - q15_t * pState); - - - /** - * @brief Processing function for the Q15 FIR lattice filter. - * @param[in] S points to an instance of the Q15 FIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_lattice_q15( - const arm_fir_lattice_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 FIR lattice filter. - * @param[in] S points to an instance of the Q31 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] pState points to the state buffer. The array is of length numStages. - */ - void arm_fir_lattice_init_q31( - arm_fir_lattice_instance_q31 * S, - uint16_t numStages, - const q31_t * pCoeffs, - q31_t * pState); - - - /** - * @brief Processing function for the Q31 FIR lattice filter. - * @param[in] S points to an instance of the Q31 FIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_fir_lattice_q31( - const arm_fir_lattice_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the floating-point FIR lattice filter. - * @param[in] S points to an instance of the floating-point FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] pState points to the state buffer. The array is of length numStages. - */ - void arm_fir_lattice_init_f32( - arm_fir_lattice_instance_f32 * S, - uint16_t numStages, - const float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Processing function for the floating-point FIR lattice filter. - * @param[in] S points to an instance of the floating-point FIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_fir_lattice_f32( - const arm_fir_lattice_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_f32; - - - /** - * @brief Processing function for the floating-point IIR lattice filter. - * @param[in] S points to an instance of the floating-point IIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_iir_lattice_f32( - const arm_iir_lattice_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point IIR lattice filter. - * @param[in] S points to an instance of the floating-point IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] pState points to the state buffer. The array is of length numStages+blockSize-1. - * @param[in] blockSize number of samples to process. - */ - void arm_iir_lattice_init_f32( - arm_iir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pkCoeffs, - float32_t * pvCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 IIR lattice filter. - * @param[in] S points to an instance of the Q31 IIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_iir_lattice_q31( - const arm_iir_lattice_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 IIR lattice filter. - * @param[in] S points to an instance of the Q31 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] pState points to the state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process. - */ - void arm_iir_lattice_init_q31( - arm_iir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pkCoeffs, - q31_t * pvCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 IIR lattice filter. - * @param[in] S points to an instance of the Q15 IIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_iir_lattice_q15( - const arm_iir_lattice_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q15 IIR lattice filter. - * @param[in] S points to an instance of the fixed-point Q15 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] pkCoeffs points to reflection coefficient buffer. The array is of length numStages. - * @param[in] pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. - * @param[in] pState points to state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process per call. - */ - void arm_iir_lattice_init_q15( - arm_iir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pkCoeffs, - q15_t * pvCoeffs, - q15_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the floating-point LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that controls filter coefficient updates. */ - } arm_lms_instance_f32; - - - /** - * @brief Processing function for floating-point LMS filter. - * @param[in] S points to an instance of the floating-point LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_f32( - const arm_lms_instance_f32 * S, - const float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for floating-point LMS filter. - * @param[in] S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to the coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_init_f32( - arm_lms_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - } arm_lms_instance_q15; - - - /** - * @brief Initialization function for the Q15 LMS filter. - * @param[in] S points to an instance of the Q15 LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to the coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ - void arm_lms_init_q15( - arm_lms_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint32_t postShift); - - - /** - * @brief Processing function for Q15 LMS filter. - * @param[in] S points to an instance of the Q15 LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_q15( - const arm_lms_instance_q15 * S, - const q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - } arm_lms_instance_q31; - - - /** - * @brief Processing function for Q31 LMS filter. - * @param[in] S points to an instance of the Q15 LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_q31( - const arm_lms_instance_q31 * S, - const q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for Q31 LMS filter. - * @param[in] S points to an instance of the Q31 LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ - void arm_lms_init_q31( - arm_lms_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint32_t postShift); - - - /** - * @brief Instance structure for the floating-point normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that control filter coefficient updates. */ - float32_t energy; /**< saves previous frame energy. */ - float32_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_f32; - - - /** - * @brief Processing function for floating-point normalized LMS filter. - * @param[in] S points to an instance of the floating-point normalized LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_norm_f32( - arm_lms_norm_instance_f32 * S, - const float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for floating-point normalized LMS filter. - * @param[in] S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_norm_init_f32( - arm_lms_norm_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - const q31_t *recipTable; /**< points to the reciprocal initial value table. */ - q31_t energy; /**< saves previous frame energy. */ - q31_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_q31; - - - /** - * @brief Processing function for Q31 normalized LMS filter. - * @param[in] S points to an instance of the Q31 normalized LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_norm_q31( - arm_lms_norm_instance_q31 * S, - const q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for Q31 normalized LMS filter. - * @param[in] S points to an instance of the Q31 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ - void arm_lms_norm_init_q31( - arm_lms_norm_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint8_t postShift); - - - /** - * @brief Instance structure for the Q15 normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< Number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - const q15_t *recipTable; /**< Points to the reciprocal initial value table. */ - q15_t energy; /**< saves previous frame energy. */ - q15_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_q15; - - - /** - * @brief Processing function for Q15 normalized LMS filter. - * @param[in] S points to an instance of the Q15 normalized LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_norm_q15( - arm_lms_norm_instance_q15 * S, - const q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for Q15 normalized LMS filter. - * @param[in] S points to an instance of the Q15 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ - void arm_lms_norm_init_q15( - arm_lms_norm_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint8_t postShift); - - - /** - * @brief Correlation of floating-point sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ - void arm_correlate_f32( - const float32_t * pSrcA, - uint32_t srcALen, - const float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - -/** - @brief Correlation of Q15 sequences - @param[in] pSrcA points to the first input sequence - @param[in] srcALen length of the first input sequence - @param[in] pSrcB points to the second input sequence - @param[in] srcBLen length of the second input sequence - @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. -*/ -void arm_correlate_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - -/** - @brief Correlation of Q15 sequences. - @param[in] pSrcA points to the first input sequence - @param[in] srcALen length of the first input sequence - @param[in] pSrcB points to the second input sequence - @param[in] srcBLen length of the second input sequence - @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ - void arm_correlate_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - -/** - @brief Correlation of Q15 sequences (fast version). - @param[in] pSrcA points to the first input sequence - @param[in] srcALen length of the first input sequence - @param[in] pSrcB points to the second input sequence - @param[in] srcBLen length of the second input sequence - @param[out] pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. - @return none - */ -void arm_correlate_fast_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - -/** - @brief Correlation of Q15 sequences (fast version). - @param[in] pSrcA points to the first input sequence. - @param[in] srcALen length of the first input sequence. - @param[in] pSrcB points to the second input sequence. - @param[in] srcBLen length of the second input sequence. - @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - */ -void arm_correlate_fast_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - - /** - * @brief Correlation of Q31 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ - void arm_correlate_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - -/** - @brief Correlation of Q31 sequences (fast version). - @param[in] pSrcA points to the first input sequence - @param[in] srcALen length of the first input sequence - @param[in] pSrcB points to the second input sequence - @param[in] srcBLen length of the second input sequence - @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ -void arm_correlate_fast_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - - /** - * @brief Correlation of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - */ - void arm_correlate_opt_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Correlation of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ - void arm_correlate_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - - /** - * @brief Instance structure for the floating-point sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_f32; - - /** - * @brief Instance structure for the Q31 sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q31; - - /** - * @brief Instance structure for the Q15 sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q15; - - /** - * @brief Instance structure for the Q7 sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q7; - - - /** - * @brief Processing function for the floating-point sparse FIR filter. - * @param[in] S points to an instance of the floating-point sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_sparse_f32( - arm_fir_sparse_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - float32_t * pScratchIn, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point sparse FIR filter. - * @param[in,out] S points to an instance of the floating-point sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ - void arm_fir_sparse_init_f32( - arm_fir_sparse_instance_f32 * S, - uint16_t numTaps, - const float32_t * pCoeffs, - float32_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 sparse FIR filter. - * @param[in] S points to an instance of the Q31 sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_sparse_q31( - arm_fir_sparse_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - q31_t * pScratchIn, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 sparse FIR filter. - * @param[in,out] S points to an instance of the Q31 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ - void arm_fir_sparse_init_q31( - arm_fir_sparse_instance_q31 * S, - uint16_t numTaps, - const q31_t * pCoeffs, - q31_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 sparse FIR filter. - * @param[in] S points to an instance of the Q15 sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_sparse_q15( - arm_fir_sparse_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - q15_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 sparse FIR filter. - * @param[in,out] S points to an instance of the Q15 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ - void arm_fir_sparse_init_q15( - arm_fir_sparse_instance_q15 * S, - uint16_t numTaps, - const q15_t * pCoeffs, - q15_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q7 sparse FIR filter. - * @param[in] S points to an instance of the Q7 sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_sparse_q7( - arm_fir_sparse_instance_q7 * S, - const q7_t * pSrc, - q7_t * pDst, - q7_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q7 sparse FIR filter. - * @param[in,out] S points to an instance of the Q7 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ - void arm_fir_sparse_init_q7( - arm_fir_sparse_instance_q7 * S, - uint16_t numTaps, - const q7_t * pCoeffs, - q7_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - - /** - * @brief Floating-point sin_cos function. - * @param[in] theta input value in degrees - * @param[out] pSinVal points to the processed sine output. - * @param[out] pCosVal points to the processed cos output. - */ - void arm_sin_cos_f32( - float32_t theta, - float32_t * pSinVal, - float32_t * pCosVal); - - - /** - * @brief Q31 sin_cos function. - * @param[in] theta scaled input value in degrees - * @param[out] pSinVal points to the processed sine output. - * @param[out] pCosVal points to the processed cosine output. - */ - void arm_sin_cos_q31( - q31_t theta, - q31_t * pSinVal, - q31_t * pCosVal); - - - /** - * @brief Floating-point complex conjugate. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_conj_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - /** - * @brief Q31 complex conjugate. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_conj_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q15 complex conjugate. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_conj_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - - /** - * @brief Floating-point complex magnitude squared - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_squared_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q31 complex magnitude squared - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_squared_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q15 complex magnitude squared - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_squared_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - - /** - * @ingroup groupController - */ - - /** - * @defgroup PID PID Motor Control - * - * A Proportional Integral Derivative (PID) controller is a generic feedback control - * loop mechanism widely used in industrial control systems. - * A PID controller is the most commonly used type of feedback controller. - * - * This set of functions implements (PID) controllers - * for Q15, Q31, and floating-point data types. The functions operate on a single sample - * of data and each call to the function returns a single processed value. - * S points to an instance of the PID control data structure. in - * is the input sample value. The functions return the output value. - * - * \par Algorithm: - *
-   *    y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
-   *    A0 = Kp + Ki + Kd
-   *    A1 = (-Kp ) - (2 * Kd )
-   *    A2 = Kd
-   * 
- * - * \par - * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant - * - * \par - * \image html PID.gif "Proportional Integral Derivative Controller" - * - * \par - * The PID controller calculates an "error" value as the difference between - * the measured output and the reference input. - * The controller attempts to minimize the error by adjusting the process control inputs. - * The proportional value determines the reaction to the current error, - * the integral value determines the reaction based on the sum of recent errors, - * and the derivative value determines the reaction based on the rate at which the error has been changing. - * - * \par Instance Structure - * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. - * A separate instance structure must be defined for each PID Controller. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Reset Functions - * There is also an associated reset function for each data type which clears the state array. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. - * - Zeros out the values in the state buffer. - * - * \par - * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. - * - * \par Fixed-Point Behavior - * Care must be taken when using the fixed-point versions of the PID Controller functions. - * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup PID - * @{ - */ - - /** - * @brief Process function for the floating-point PID Control. - * @param[in,out] S is an instance of the floating-point PID Control structure - * @param[in] in input sample to process - * @return processed output sample. - */ - __STATIC_FORCEINLINE float32_t arm_pid_f32( - arm_pid_instance_f32 * S, - float32_t in) - { - float32_t out; - - /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ - out = (S->A0 * in) + - (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - - } - -/** - @brief Process function for the Q31 PID Control. - @param[in,out] S points to an instance of the Q31 PID Control structure - @param[in] in input sample to process - @return processed output sample. - - \par Scaling and Overflow Behavior - The function is implemented using an internal 64-bit accumulator. - The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - Thus, if the accumulator result overflows it wraps around rather than clip. - In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. - After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. - */ -__STATIC_FORCEINLINE q31_t arm_pid_q31( - arm_pid_instance_q31 * S, - q31_t in) - { - q63_t acc; - q31_t out; - - /* acc = A0 * x[n] */ - acc = (q63_t) S->A0 * in; - - /* acc += A1 * x[n-1] */ - acc += (q63_t) S->A1 * S->state[0]; - - /* acc += A2 * x[n-2] */ - acc += (q63_t) S->A2 * S->state[1]; - - /* convert output to 1.31 format to add y[n-1] */ - out = (q31_t) (acc >> 31U); - - /* out += y[n-1] */ - out += S->state[2]; - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - } - - -/** - @brief Process function for the Q15 PID Control. - @param[in,out] S points to an instance of the Q15 PID Control structure - @param[in] in input sample to process - @return processed output sample. - - \par Scaling and Overflow Behavior - The function is implemented using a 64-bit internal accumulator. - Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. - The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. - Lastly, the accumulator is saturated to yield a result in 1.15 format. - */ -__STATIC_FORCEINLINE q15_t arm_pid_q15( - arm_pid_instance_q15 * S, - q15_t in) - { - q63_t acc; - q15_t out; - -#if defined (ARM_MATH_DSP) - /* Implementation of PID controller */ - - /* acc = A0 * x[n] */ - acc = (q31_t) __SMUAD((uint32_t)S->A0, (uint32_t)in); - - /* acc += A1 * x[n-1] + A2 * x[n-2] */ - acc = (q63_t)__SMLALD((uint32_t)S->A1, (uint32_t)read_q15x2 (S->state), (uint64_t)acc); -#else - /* acc = A0 * x[n] */ - acc = ((q31_t) S->A0) * in; - - /* acc += A1 * x[n-1] + A2 * x[n-2] */ - acc += (q31_t) S->A1 * S->state[0]; - acc += (q31_t) S->A2 * S->state[1]; -#endif - - /* acc += y[n-1] */ - acc += (q31_t) S->state[2] << 15; - - /* saturate the output */ - out = (q15_t) (__SSAT((q31_t)(acc >> 15), 16)); - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - } - - /** - * @} end of PID group - */ - - - /** - * @brief Floating-point matrix inverse. - * @param[in] src points to the instance of the input floating-point matrix structure. - * @param[out] dst points to the instance of the output floating-point matrix structure. - * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. - * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. - */ - arm_status arm_mat_inverse_f32( - const arm_matrix_instance_f32 * src, - arm_matrix_instance_f32 * dst); - - - /** - * @brief Floating-point matrix inverse. - * @param[in] src points to the instance of the input floating-point matrix structure. - * @param[out] dst points to the instance of the output floating-point matrix structure. - * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. - * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. - */ - arm_status arm_mat_inverse_f64( - const arm_matrix_instance_f64 * src, - arm_matrix_instance_f64 * dst); - - - - /** - * @ingroup groupController - */ - - /** - * @defgroup clarke Vector Clarke Transform - * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. - * Generally the Clarke transform uses three-phase currents Ia, Ib and Ic to calculate currents - * in the two-phase orthogonal stator axis Ialpha and Ibeta. - * When Ialpha is superposed with Ia as shown in the figure below - * \image html clarke.gif Stator current space vector and its components in (a,b). - * and Ia + Ib + Ic = 0, in this condition Ialpha and Ibeta - * can be calculated using only Ia and Ib. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeFormula.gif - * where Ia and Ib are the instantaneous stator phases and - * pIalpha and pIbeta are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup clarke - * @{ - */ - - /** - * - * @brief Floating-point Clarke transform - * @param[in] Ia input three-phase coordinate a - * @param[in] Ib input three-phase coordinate b - * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] pIbeta points to output two-phase orthogonal vector axis beta - * @return none - */ - __STATIC_FORCEINLINE void arm_clarke_f32( - float32_t Ia, - float32_t Ib, - float32_t * pIalpha, - float32_t * pIbeta) - { - /* Calculate pIalpha using the equation, pIalpha = Ia */ - *pIalpha = Ia; - - /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ - *pIbeta = ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib); - } - - -/** - @brief Clarke transform for Q31 version - @param[in] Ia input three-phase coordinate a - @param[in] Ib input three-phase coordinate b - @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - @param[out] pIbeta points to output two-phase orthogonal vector axis beta - @return none - - \par Scaling and Overflow Behavior - The function is implemented using an internal 32-bit accumulator. - The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - There is saturation on the addition, hence there is no risk of overflow. - */ -__STATIC_FORCEINLINE void arm_clarke_q31( - q31_t Ia, - q31_t Ib, - q31_t * pIalpha, - q31_t * pIbeta) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - - /* Calculating pIalpha from Ia by equation pIalpha = Ia */ - *pIalpha = Ia; - - /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); - - /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ - product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); - - /* pIbeta is calculated by adding the intermediate products */ - *pIbeta = __QADD(product1, product2); - } - - /** - * @} end of clarke group - */ - - - /** - * @ingroup groupController - */ - - /** - * @defgroup inv_clarke Vector Inverse Clarke Transform - * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeInvFormula.gif - * where pIa and pIb are the instantaneous stator phases and - * Ialpha and Ibeta are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup inv_clarke - * @{ - */ - - /** - * @brief Floating-point Inverse Clarke transform - * @param[in] Ialpha input two-phase orthogonal vector axis alpha - * @param[in] Ibeta input two-phase orthogonal vector axis beta - * @param[out] pIa points to output three-phase coordinate a - * @param[out] pIb points to output three-phase coordinate b - * @return none - */ - __STATIC_FORCEINLINE void arm_inv_clarke_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pIa, - float32_t * pIb) - { - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - - /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ - *pIb = -0.5f * Ialpha + 0.8660254039f * Ibeta; - } - - -/** - @brief Inverse Clarke transform for Q31 version - @param[in] Ialpha input two-phase orthogonal vector axis alpha - @param[in] Ibeta input two-phase orthogonal vector axis beta - @param[out] pIa points to output three-phase coordinate a - @param[out] pIb points to output three-phase coordinate b - @return none - - \par Scaling and Overflow Behavior - The function is implemented using an internal 32-bit accumulator. - The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - There is saturation on the subtraction, hence there is no risk of overflow. - */ -__STATIC_FORCEINLINE void arm_inv_clarke_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pIa, - q31_t * pIb) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - - /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); - - /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); - - /* pIb is calculated by subtracting the products */ - *pIb = __QSUB(product2, product1); - } - - /** - * @} end of inv_clarke group - */ - - - - /** - * @ingroup groupController - */ - - /** - * @defgroup park Vector Park Transform - * - * Forward Park transform converts the input two-coordinate vector to flux and torque components. - * The Park transform can be used to realize the transformation of the Ialpha and the Ibeta currents - * from the stationary to the moving reference frame and control the spatial relationship between - * the stator vector current and rotor flux vector. - * If we consider the d axis aligned with the rotor flux, the diagram below shows the - * current vector and the relationship from the two reference frames: - * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkFormula.gif - * where Ialpha and Ibeta are the stator vector components, - * pId and pIq are rotor vector components and cosVal and sinVal are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup park - * @{ - */ - - /** - * @brief Floating-point Park transform - * @param[in] Ialpha input two-phase vector coordinate alpha - * @param[in] Ibeta input two-phase vector coordinate beta - * @param[out] pId points to output rotor reference frame d - * @param[out] pIq points to output rotor reference frame q - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none - * - * The function implements the forward Park transform. - * - */ - __STATIC_FORCEINLINE void arm_park_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pId, - float32_t * pIq, - float32_t sinVal, - float32_t cosVal) - { - /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ - *pId = Ialpha * cosVal + Ibeta * sinVal; - - /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ - *pIq = -Ialpha * sinVal + Ibeta * cosVal; - } - - -/** - @brief Park transform for Q31 version - @param[in] Ialpha input two-phase vector coordinate alpha - @param[in] Ibeta input two-phase vector coordinate beta - @param[out] pId points to output rotor reference frame d - @param[out] pIq points to output rotor reference frame q - @param[in] sinVal sine value of rotation angle theta - @param[in] cosVal cosine value of rotation angle theta - @return none - - \par Scaling and Overflow Behavior - The function is implemented using an internal 32-bit accumulator. - The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - There is saturation on the addition and subtraction, hence there is no risk of overflow. - */ -__STATIC_FORCEINLINE void arm_park_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pId, - q31_t * pIq, - q31_t sinVal, - q31_t cosVal) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - - /* Intermediate product is calculated by (Ialpha * cosVal) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31); - - /* Intermediate product is calculated by (Ibeta * sinVal) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31); - - - /* Intermediate product is calculated by (Ialpha * sinVal) */ - product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31); - - /* Intermediate product is calculated by (Ibeta * cosVal) */ - product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31); - - /* Calculate pId by adding the two intermediate products 1 and 2 */ - *pId = __QADD(product1, product2); - - /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ - *pIq = __QSUB(product4, product3); - } - - /** - * @} end of park group - */ - - - /** - * @ingroup groupController - */ - - /** - * @defgroup inv_park Vector Inverse Park transform - * Inverse Park transform converts the input flux and torque components to two-coordinate vector. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkInvFormula.gif - * where pIalpha and pIbeta are the stator vector components, - * Id and Iq are rotor vector components and cosVal and sinVal are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup inv_park - * @{ - */ - - /** - * @brief Floating-point Inverse Park transform - * @param[in] Id input coordinate of rotor reference frame d - * @param[in] Iq input coordinate of rotor reference frame q - * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] pIbeta points to output two-phase orthogonal vector axis beta - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none - */ - __STATIC_FORCEINLINE void arm_inv_park_f32( - float32_t Id, - float32_t Iq, - float32_t * pIalpha, - float32_t * pIbeta, - float32_t sinVal, - float32_t cosVal) - { - /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ - *pIalpha = Id * cosVal - Iq * sinVal; - - /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ - *pIbeta = Id * sinVal + Iq * cosVal; - } - - -/** - @brief Inverse Park transform for Q31 version - @param[in] Id input coordinate of rotor reference frame d - @param[in] Iq input coordinate of rotor reference frame q - @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - @param[out] pIbeta points to output two-phase orthogonal vector axis beta - @param[in] sinVal sine value of rotation angle theta - @param[in] cosVal cosine value of rotation angle theta - @return none - - @par Scaling and Overflow Behavior - The function is implemented using an internal 32-bit accumulator. - The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - There is saturation on the addition, hence there is no risk of overflow. - */ -__STATIC_FORCEINLINE void arm_inv_park_q31( - q31_t Id, - q31_t Iq, - q31_t * pIalpha, - q31_t * pIbeta, - q31_t sinVal, - q31_t cosVal) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - - /* Intermediate product is calculated by (Id * cosVal) */ - product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31); - - /* Intermediate product is calculated by (Iq * sinVal) */ - product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31); - - - /* Intermediate product is calculated by (Id * sinVal) */ - product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31); - - /* Intermediate product is calculated by (Iq * cosVal) */ - product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31); - - /* Calculate pIalpha by using the two intermediate products 1 and 2 */ - *pIalpha = __QSUB(product1, product2); - - /* Calculate pIbeta by using the two intermediate products 3 and 4 */ - *pIbeta = __QADD(product4, product3); - } - - /** - * @} end of Inverse park group - */ - - - /** - * @ingroup groupInterpolation - */ - - /** - * @defgroup LinearInterpolate Linear Interpolation - * - * Linear interpolation is a method of curve fitting using linear polynomials. - * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line - * - * \par - * \image html LinearInterp.gif "Linear interpolation" - * - * \par - * A Linear Interpolate function calculates an output value(y), for the input(x) - * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) - * - * \par Algorithm: - *
-   *       y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))
-   *       where x0, x1 are nearest values of input x
-   *             y0, y1 are nearest values to output y
-   * 
- * - * \par - * This set of functions implements Linear interpolation process - * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single - * sample of data and each call to the function returns a single processed value. - * S points to an instance of the Linear Interpolate function data structure. - * x is the input sample value. The functions returns the output value. - * - * \par - * if x is outside of the table boundary, Linear interpolation returns first value of the table - * if x is below input range and returns last value of table if x is above range. - */ - - /** - * @addtogroup LinearInterpolate - * @{ - */ - - /** - * @brief Process function for the floating-point Linear Interpolation Function. - * @param[in,out] S is an instance of the floating-point Linear Interpolation structure - * @param[in] x input sample to process - * @return y processed output sample. - * - */ - __STATIC_FORCEINLINE float32_t arm_linear_interp_f32( - arm_linear_interp_instance_f32 * S, - float32_t x) - { - float32_t y; - float32_t x0, x1; /* Nearest input values */ - float32_t y0, y1; /* Nearest output values */ - float32_t xSpacing = S->xSpacing; /* spacing between input values */ - int32_t i; /* Index variable */ - float32_t *pYData = S->pYData; /* pointer to output table */ - - /* Calculation of index */ - i = (int32_t) ((x - S->x1) / xSpacing); - - if (i < 0) - { - /* Iniatilize output for below specified range as least output value of table */ - y = pYData[0]; - } - else if ((uint32_t)i >= (S->nValues - 1)) - { - /* Iniatilize output for above specified range as last output value of table */ - y = pYData[S->nValues - 1]; - } - else - { - /* Calculation of nearest input values */ - x0 = S->x1 + i * xSpacing; - x1 = S->x1 + (i + 1) * xSpacing; - - /* Read of nearest output values */ - y0 = pYData[i]; - y1 = pYData[i + 1]; - - /* Calculation of output */ - y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0)); - - } - - /* returns output value */ - return (y); - } - - - /** - * - * @brief Process function for the Q31 Linear Interpolation Function. - * @param[in] pYData pointer to Q31 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - * - */ - __STATIC_FORCEINLINE q31_t arm_linear_interp_q31( - q31_t * pYData, - q31_t x, - uint32_t nValues) - { - q31_t y; /* output */ - q31_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & (q31_t)0xFFF00000) >> 20); - - if (index >= (int32_t)(nValues - 1)) - { - return (pYData[nValues - 1]); - } - else if (index < 0) - { - return (pYData[0]); - } - else - { - /* 20 bits for the fractional part */ - /* shift left by 11 to keep fract in 1.31 format */ - fract = (x & 0x000FFFFF) << 11; - - /* Read two nearest output values from the index in 1.31(q31) format */ - y0 = pYData[index]; - y1 = pYData[index + 1]; - - /* Calculation of y0 * (1-fract) and y is in 2.30 format */ - y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32)); - - /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ - y += ((q31_t) (((q63_t) y1 * fract) >> 32)); - - /* Convert y to 1.31 format */ - return (y << 1U); - } - } - - - /** - * - * @brief Process function for the Q15 Linear Interpolation Function. - * @param[in] pYData pointer to Q15 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - * - */ - __STATIC_FORCEINLINE q15_t arm_linear_interp_q15( - q15_t * pYData, - q31_t x, - uint32_t nValues) - { - q63_t y; /* output */ - q15_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & (int32_t)0xFFF00000) >> 20); - - if (index >= (int32_t)(nValues - 1)) - { - return (pYData[nValues - 1]); - } - else if (index < 0) - { - return (pYData[0]); - } - else - { - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - - /* Read two nearest output values from the index */ - y0 = pYData[index]; - y1 = pYData[index + 1]; - - /* Calculation of y0 * (1-fract) and y is in 13.35 format */ - y = ((q63_t) y0 * (0xFFFFF - fract)); - - /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ - y += ((q63_t) y1 * (fract)); - - /* convert y to 1.15 format */ - return (q15_t) (y >> 20); - } - } - - - /** - * - * @brief Process function for the Q7 Linear Interpolation Function. - * @param[in] pYData pointer to Q7 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - */ - __STATIC_FORCEINLINE q7_t arm_linear_interp_q7( - q7_t * pYData, - q31_t x, - uint32_t nValues) - { - q31_t y; /* output */ - q7_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - uint32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - if (x < 0) - { - return (pYData[0]); - } - index = (x >> 20) & 0xfff; - - if (index >= (nValues - 1)) - { - return (pYData[nValues - 1]); - } - else - { - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - - /* Read two nearest output values from the index and are in 1.7(q7) format */ - y0 = pYData[index]; - y1 = pYData[index + 1]; - - /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */ - y = ((y0 * (0xFFFFF - fract))); - - /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */ - y += (y1 * fract); - - /* convert y to 1.7(q7) format */ - return (q7_t) (y >> 20); - } - } - - /** - * @} end of LinearInterpolate group - */ - - /** - * @brief Fast approximation to the trigonometric sine function for floating-point data. - * @param[in] x input value in radians. - * @return sin(x). - */ - float32_t arm_sin_f32( - float32_t x); - - - /** - * @brief Fast approximation to the trigonometric sine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - */ - q31_t arm_sin_q31( - q31_t x); - - - /** - * @brief Fast approximation to the trigonometric sine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - */ - q15_t arm_sin_q15( - q15_t x); - - - /** - * @brief Fast approximation to the trigonometric cosine function for floating-point data. - * @param[in] x input value in radians. - * @return cos(x). - */ - float32_t arm_cos_f32( - float32_t x); - - - /** - * @brief Fast approximation to the trigonometric cosine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - */ - q31_t arm_cos_q31( - q31_t x); - - - /** - * @brief Fast approximation to the trigonometric cosine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - */ - q15_t arm_cos_q15( - q15_t x); - - -/** - @brief Floating-point vector of log values. - @param[in] pSrc points to the input vector - @param[out] pDst points to the output vector - @param[in] blockSize number of samples in each vector - @return none - */ - void arm_vlog_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - -/** - @brief Floating-point vector of exp values. - @param[in] pSrc points to the input vector - @param[out] pDst points to the output vector - @param[in] blockSize number of samples in each vector - @return none - */ - void arm_vexp_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @ingroup groupFastMath - */ - - - /** - * @defgroup SQRT Square Root - * - * Computes the square root of a number. - * There are separate functions for Q15, Q31, and floating-point data types. - * The square root function is computed using the Newton-Raphson algorithm. - * This is an iterative algorithm of the form: - *
-   *      x1 = x0 - f(x0)/f'(x0)
-   * 
- * where x1 is the current estimate, - * x0 is the previous estimate, and - * f'(x0) is the derivative of f() evaluated at x0. - * For the square root function, the algorithm reduces to: - *
-   *     x0 = in/2                         [initial guess]
-   *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
-   * 
- */ - - - /** - * @addtogroup SQRT - * @{ - */ - -/** - @brief Floating-point square root function. - @param[in] in input value - @param[out] pOut square root of input value - @return execution status - - \ref ARM_MATH_SUCCESS : input value is positive - - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 - */ -__STATIC_FORCEINLINE arm_status arm_sqrt_f32( - float32_t in, - float32_t * pOut) - { - if (in >= 0.0f) - { -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - *pOut = __sqrtf(in); - #else - *pOut = sqrtf(in); - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - __ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in)); - #else - *pOut = sqrtf(in); - #endif - -#else - *pOut = sqrtf(in); -#endif - - return (ARM_MATH_SUCCESS); - } - else - { - *pOut = 0.0f; - return (ARM_MATH_ARGUMENT_ERROR); - } - } - - -/** - @brief Q31 square root function. - @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF - @param[out] pOut points to square root of input value - @return execution status - - \ref ARM_MATH_SUCCESS : input value is positive - - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 - */ -arm_status arm_sqrt_q31( - q31_t in, - q31_t * pOut); - - -/** - @brief Q15 square root function. - @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF - @param[out] pOut points to square root of input value - @return execution status - - \ref ARM_MATH_SUCCESS : input value is positive - - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 - */ -arm_status arm_sqrt_q15( - q15_t in, - q15_t * pOut); - - /** - * @brief Vector Floating-point square root function. - * @param[in] pIn input vector. - * @param[out] pOut vector of square roots of input elements. - * @param[in] len length of input vector. - * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if - * in is negative value and returns zero output for negative values. - */ - void arm_vsqrt_f32( - float32_t * pIn, - float32_t * pOut, - uint16_t len); - - void arm_vsqrt_q31( - q31_t * pIn, - q31_t * pOut, - uint16_t len); - - void arm_vsqrt_q15( - q15_t * pIn, - q15_t * pOut, - uint16_t len); - - /** - * @} end of SQRT group - */ - - - /** - * @brief floating-point Circular write function. - */ - __STATIC_FORCEINLINE void arm_circularWrite_f32( - int32_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const int32_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0U; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while (i > 0U) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if (wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = (uint16_t)wOffset; - } - - - - /** - * @brief floating-point Circular Read function. - */ - __STATIC_FORCEINLINE void arm_circularRead_f32( - int32_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - int32_t * dst, - int32_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0U; - int32_t rOffset; - int32_t* dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - dst_end = dst_base + dst_length; - - /* Loop over the blockSize */ - i = blockSize; - - while (i > 0U) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if (dst == dst_end) - { - dst = dst_base; - } - - /* Circularly update rOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if (rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - - /** - * @brief Q15 Circular write function. - */ - __STATIC_FORCEINLINE void arm_circularWrite_q15( - q15_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const q15_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0U; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while (i > 0U) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if (wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = (uint16_t)wOffset; - } - - - /** - * @brief Q15 Circular Read function. - */ - __STATIC_FORCEINLINE void arm_circularRead_q15( - q15_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - q15_t * dst, - q15_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0; - int32_t rOffset; - q15_t* dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - - dst_end = dst_base + dst_length; - - /* Loop over the blockSize */ - i = blockSize; - - while (i > 0U) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if (dst == dst_end) - { - dst = dst_base; - } - - /* Circularly update wOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if (rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - - /** - * @brief Q7 Circular write function. - */ - __STATIC_FORCEINLINE void arm_circularWrite_q7( - q7_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const q7_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0U; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while (i > 0U) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if (wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = (uint16_t)wOffset; - } - - - /** - * @brief Q7 Circular Read function. - */ - __STATIC_FORCEINLINE void arm_circularRead_q7( - q7_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - q7_t * dst, - q7_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0; - int32_t rOffset; - q7_t* dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - - dst_end = dst_base + dst_length; - - /* Loop over the blockSize */ - i = blockSize; - - while (i > 0U) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if (dst == dst_end) - { - dst = dst_base; - } - - /* Circularly update rOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if (rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - - /** - * @brief Sum of the squares of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_power_q31( - const q31_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - - /** - * @brief Sum of the squares of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_power_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - - /** - * @brief Sum of the squares of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_power_q15( - const q15_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - - /** - * @brief Sum of the squares of the elements of a Q7 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_power_q7( - const q7_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - - /** - * @brief Mean value of a Q7 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_mean_q7( - const q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult); - - - /** - * @brief Mean value of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_mean_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - - /** - * @brief Mean value of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_mean_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - - /** - * @brief Mean value of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_mean_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - - /** - * @brief Variance of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_var_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - - /** - * @brief Variance of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_var_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - - /** - * @brief Variance of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_var_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - - /** - * @brief Root Mean Square of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_rms_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - - /** - * @brief Root Mean Square of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_rms_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - - /** - * @brief Root Mean Square of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_rms_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - - /** - * @brief Standard deviation of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_std_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - - /** - * @brief Standard deviation of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_std_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - - /** - * @brief Standard deviation of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_std_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - - /** - * @brief Floating-point complex magnitude - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q31 complex magnitude - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q15 complex magnitude - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q15 complex dot product - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] realResult real part of the result returned here - * @param[out] imagResult imaginary part of the result returned here - */ - void arm_cmplx_dot_prod_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - uint32_t numSamples, - q31_t * realResult, - q31_t * imagResult); - - - /** - * @brief Q31 complex dot product - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] realResult real part of the result returned here - * @param[out] imagResult imaginary part of the result returned here - */ - void arm_cmplx_dot_prod_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - uint32_t numSamples, - q63_t * realResult, - q63_t * imagResult); - - - /** - * @brief Floating-point complex dot product - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] realResult real part of the result returned here - * @param[out] imagResult imaginary part of the result returned here - */ - void arm_cmplx_dot_prod_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - uint32_t numSamples, - float32_t * realResult, - float32_t * imagResult); - - - /** - * @brief Q15 complex-by-real multiplication - * @param[in] pSrcCmplx points to the complex input vector - * @param[in] pSrcReal points to the real input vector - * @param[out] pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - */ - void arm_cmplx_mult_real_q15( - const q15_t * pSrcCmplx, - const q15_t * pSrcReal, - q15_t * pCmplxDst, - uint32_t numSamples); - - - /** - * @brief Q31 complex-by-real multiplication - * @param[in] pSrcCmplx points to the complex input vector - * @param[in] pSrcReal points to the real input vector - * @param[out] pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - */ - void arm_cmplx_mult_real_q31( - const q31_t * pSrcCmplx, - const q31_t * pSrcReal, - q31_t * pCmplxDst, - uint32_t numSamples); - - - /** - * @brief Floating-point complex-by-real multiplication - * @param[in] pSrcCmplx points to the complex input vector - * @param[in] pSrcReal points to the real input vector - * @param[out] pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - */ - void arm_cmplx_mult_real_f32( - const float32_t * pSrcCmplx, - const float32_t * pSrcReal, - float32_t * pCmplxDst, - uint32_t numSamples); - - - /** - * @brief Minimum value of a Q7 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] result is output pointer - * @param[in] index is the array index of the minimum value in the input buffer. - */ - void arm_min_q7( - const q7_t * pSrc, - uint32_t blockSize, - q7_t * result, - uint32_t * index); - - - /** - * @brief Minimum value of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output pointer - * @param[in] pIndex is the array index of the minimum value in the input buffer. - */ - void arm_min_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - - - /** - * @brief Minimum value of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output pointer - * @param[out] pIndex is the array index of the minimum value in the input buffer. - */ - void arm_min_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - - - /** - * @brief Minimum value of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output pointer - * @param[out] pIndex is the array index of the minimum value in the input buffer. - */ - void arm_min_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - - -/** - * @brief Maximum value of a Q7 vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ - void arm_max_q7( - const q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult, - uint32_t * pIndex); - - -/** - * @brief Maximum value of a Q15 vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ - void arm_max_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - - -/** - * @brief Maximum value of a Q31 vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ - void arm_max_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - - -/** - * @brief Maximum value of a floating-point vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ - void arm_max_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - - /** - @brief Maximum value of a floating-point vector. - @param[in] pSrc points to the input vector - @param[in] blockSize number of samples in input vector - @param[out] pResult maximum value returned here - @return none - */ - void arm_max_no_idx_f32( - const float32_t *pSrc, - uint32_t blockSize, - float32_t *pResult); - - /** - * @brief Q15 complex-by-complex multiplication - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_mult_cmplx_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q31 complex-by-complex multiplication - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_mult_cmplx_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t numSamples); - - - /** - * @brief Floating-point complex-by-complex multiplication - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_mult_cmplx_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t numSamples); - - - /** - * @brief Converts the elements of the floating-point vector to Q31 vector. - * @param[in] pSrc points to the floating-point input vector - * @param[out] pDst points to the Q31 output vector - * @param[in] blockSize length of the input vector - */ - void arm_float_to_q31( - const float32_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the floating-point vector to Q15 vector. - * @param[in] pSrc points to the floating-point input vector - * @param[out] pDst points to the Q15 output vector - * @param[in] blockSize length of the input vector - */ - void arm_float_to_q15( - const float32_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the floating-point vector to Q7 vector. - * @param[in] pSrc points to the floating-point input vector - * @param[out] pDst points to the Q7 output vector - * @param[in] blockSize length of the input vector - */ - void arm_float_to_q7( - const float32_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q31 vector to floating-point vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q31_to_float( - const q31_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q31 vector to Q15 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q31_to_q15( - const q31_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q31 vector to Q7 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q31_to_q7( - const q31_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q15 vector to floating-point vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q15_to_float( - const q15_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q15 vector to Q31 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q15_to_q31( - const q15_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q15 vector to Q7 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q15_to_q7( - const q15_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q7 vector to floating-point vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q7_to_float( - const q7_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q7 vector to Q31 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_q7_to_q31( - const q7_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q7 vector to Q15 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_q7_to_q15( - const q7_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - -/** - * @brief Struct for specifying SVM Kernel - */ -typedef enum -{ - ARM_ML_KERNEL_LINEAR = 0, - /**< Linear kernel */ - ARM_ML_KERNEL_POLYNOMIAL = 1, - /**< Polynomial kernel */ - ARM_ML_KERNEL_RBF = 2, - /**< Radial Basis Function kernel */ - ARM_ML_KERNEL_SIGMOID = 3 - /**< Sigmoid kernel */ -} arm_ml_kernel_type; - - -/** - * @brief Instance structure for linear SVM prediction function. - */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ -} arm_svm_linear_instance_f32; - - -/** - * @brief Instance structure for polynomial SVM prediction function. - */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ - int32_t degree; /**< Polynomial degree */ - float32_t coef0; /**< Polynomial constant */ - float32_t gamma; /**< Gamma factor */ -} arm_svm_polynomial_instance_f32; - -/** - * @brief Instance structure for rbf SVM prediction function. - */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ - float32_t gamma; /**< Gamma factor */ -} arm_svm_rbf_instance_f32; - -/** - * @brief Instance structure for sigmoid SVM prediction function. - */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ - float32_t coef0; /**< Independant constant */ - float32_t gamma; /**< Gamma factor */ -} arm_svm_sigmoid_instance_f32; - -/** - * @brief SVM linear instance init function - * @param[in] S Parameters for SVM functions - * @param[in] nbOfSupportVectors Number of support vectors - * @param[in] vectorDimension Dimension of vector space - * @param[in] intercept Intercept - * @param[in] dualCoefficients Array of dual coefficients - * @param[in] supportVectors Array of support vectors - * @param[in] classes Array of 2 classes ID - * @return none. - * - */ - - -void arm_svm_linear_init_f32(arm_svm_linear_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes); - -/** - * @brief SVM linear prediction - * @param[in] S Pointer to an instance of the linear SVM structure. - * @param[in] in Pointer to input vector - * @param[out] pResult Decision value - * @return none. - * - */ - -void arm_svm_linear_predict_f32(const arm_svm_linear_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - - -/** - * @brief SVM polynomial instance init function - * @param[in] S points to an instance of the polynomial SVM structure. - * @param[in] nbOfSupportVectors Number of support vectors - * @param[in] vectorDimension Dimension of vector space - * @param[in] intercept Intercept - * @param[in] dualCoefficients Array of dual coefficients - * @param[in] supportVectors Array of support vectors - * @param[in] classes Array of 2 classes ID - * @param[in] degree Polynomial degree - * @param[in] coef0 coeff0 (scikit-learn terminology) - * @param[in] gamma gamma (scikit-learn terminology) - * @return none. - * - */ - - -void arm_svm_polynomial_init_f32(arm_svm_polynomial_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes, - int32_t degree, - float32_t coef0, - float32_t gamma - ); - -/** - * @brief SVM polynomial prediction - * @param[in] S Pointer to an instance of the polynomial SVM structure. - * @param[in] in Pointer to input vector - * @param[out] pResult Decision value - * @return none. - * - */ -void arm_svm_polynomial_predict_f32(const arm_svm_polynomial_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - - -/** - * @brief SVM radial basis function instance init function - * @param[in] S points to an instance of the polynomial SVM structure. - * @param[in] nbOfSupportVectors Number of support vectors - * @param[in] vectorDimension Dimension of vector space - * @param[in] intercept Intercept - * @param[in] dualCoefficients Array of dual coefficients - * @param[in] supportVectors Array of support vectors - * @param[in] classes Array of 2 classes ID - * @param[in] gamma gamma (scikit-learn terminology) - * @return none. - * - */ - -void arm_svm_rbf_init_f32(arm_svm_rbf_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes, - float32_t gamma - ); - -/** - * @brief SVM rbf prediction - * @param[in] S Pointer to an instance of the rbf SVM structure. - * @param[in] in Pointer to input vector - * @param[out] pResult decision value - * @return none. - * - */ -void arm_svm_rbf_predict_f32(const arm_svm_rbf_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - -/** - * @brief SVM sigmoid instance init function - * @param[in] S points to an instance of the rbf SVM structure. - * @param[in] nbOfSupportVectors Number of support vectors - * @param[in] vectorDimension Dimension of vector space - * @param[in] intercept Intercept - * @param[in] dualCoefficients Array of dual coefficients - * @param[in] supportVectors Array of support vectors - * @param[in] classes Array of 2 classes ID - * @param[in] coef0 coeff0 (scikit-learn terminology) - * @param[in] gamma gamma (scikit-learn terminology) - * @return none. - * - */ - -void arm_svm_sigmoid_init_f32(arm_svm_sigmoid_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes, - float32_t coef0, - float32_t gamma - ); - -/** - * @brief SVM sigmoid prediction - * @param[in] S Pointer to an instance of the rbf SVM structure. - * @param[in] in Pointer to input vector - * @param[out] pResult Decision value - * @return none. - * - */ -void arm_svm_sigmoid_predict_f32(const arm_svm_sigmoid_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - - - -/** - * @brief Instance structure for Naive Gaussian Bayesian estimator. - */ -typedef struct -{ - uint32_t vectorDimension; /**< Dimension of vector space */ - uint32_t numberOfClasses; /**< Number of different classes */ - const float32_t *theta; /**< Mean values for the Gaussians */ - const float32_t *sigma; /**< Variances for the Gaussians */ - const float32_t *classPriors; /**< Class prior probabilities */ - float32_t epsilon; /**< Additive value to variances */ -} arm_gaussian_naive_bayes_instance_f32; - -/** - * @brief Naive Gaussian Bayesian Estimator - * - * @param[in] S points to a naive bayes instance structure - * @param[in] in points to the elements of the input vector. - * @param[in] pBuffer points to a buffer of length numberOfClasses - * @return The predicted class - * - */ - - -uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_instance_f32 *S, - const float32_t * in, - float32_t *pBuffer); - -/** - * @brief Computation of the LogSumExp - * - * In probabilistic computations, the dynamic of the probability values can be very - * wide because they come from gaussian functions. - * To avoid underflow and overflow issues, the values are represented by their log. - * In this representation, multiplying the original exp values is easy : their logs are added. - * But adding the original exp values is requiring some special handling and it is the - * goal of the LogSumExp function. - * - * If the values are x1...xn, the function is computing: - * - * ln(exp(x1) + ... + exp(xn)) and the computation is done in such a way that - * rounding issues are minimised. - * - * The max xm of the values is extracted and the function is computing: - * xm + ln(exp(x1 - xm) + ... + exp(xn - xm)) - * - * @param[in] *in Pointer to an array of input values. - * @param[in] blockSize Number of samples in the input array. - * @return LogSumExp - * - */ - - -float32_t arm_logsumexp_f32(const float32_t *in, uint32_t blockSize); - -/** - * @brief Dot product with log arithmetic - * - * Vectors are containing the log of the samples - * - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[in] pTmpBuffer temporary buffer of length blockSize - * @return The log of the dot product . - * - */ - - -float32_t arm_logsumexp_dot_prod_f32(const float32_t * pSrcA, - const float32_t * pSrcB, - uint32_t blockSize, - float32_t *pTmpBuffer); - -/** - * @brief Entropy - * - * @param[in] pSrcA Array of input values. - * @param[in] blockSize Number of samples in the input array. - * @return Entropy -Sum(p ln p) - * - */ - - -float32_t arm_entropy_f32(const float32_t * pSrcA,uint32_t blockSize); - - -/** - * @brief Entropy - * - * @param[in] pSrcA Array of input values. - * @param[in] blockSize Number of samples in the input array. - * @return Entropy -Sum(p ln p) - * - */ - - -float64_t arm_entropy_f64(const float64_t * pSrcA, uint32_t blockSize); - - -/** - * @brief Kullback-Leibler - * - * @param[in] pSrcA Pointer to an array of input values for probability distribution A. - * @param[in] pSrcB Pointer to an array of input values for probability distribution B. - * @param[in] blockSize Number of samples in the input array. - * @return Kullback-Leibler Divergence D(A || B) - * - */ -float32_t arm_kullback_leibler_f32(const float32_t * pSrcA - ,const float32_t * pSrcB - ,uint32_t blockSize); - - -/** - * @brief Kullback-Leibler - * - * @param[in] pSrcA Pointer to an array of input values for probability distribution A. - * @param[in] pSrcB Pointer to an array of input values for probability distribution B. - * @param[in] blockSize Number of samples in the input array. - * @return Kullback-Leibler Divergence D(A || B) - * - */ -float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, - const float64_t * pSrcB, - uint32_t blockSize); - - -/** - * @brief Weighted sum - * - * - * @param[in] *in Array of input values. - * @param[in] *weigths Weights - * @param[in] blockSize Number of samples in the input array. - * @return Weighted sum - * - */ -float32_t arm_weighted_sum_f32(const float32_t *in - , const float32_t *weigths - , uint32_t blockSize); - - -/** - * @brief Barycenter - * - * - * @param[in] in List of vectors - * @param[in] weights Weights of the vectors - * @param[out] out Barycenter - * @param[in] nbVectors Number of vectors - * @param[in] vecDim Dimension of space (vector dimension) - * @return None - * - */ -void arm_barycenter_f32(const float32_t *in - , const float32_t *weights - , float32_t *out - , uint32_t nbVectors - , uint32_t vecDim); - -/** - * @brief Euclidean distance between two vectors - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ - -float32_t arm_euclidean_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - -/** - * @brief Bray-Curtis distance between two vectors - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ -float32_t arm_braycurtis_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - -/** - * @brief Canberra distance between two vectors - * - * This function may divide by zero when samples pA[i] and pB[i] are both zero. - * The result of the computation will be correct. So the division per zero may be - * ignored. - * - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ -float32_t arm_canberra_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - - -/** - * @brief Chebyshev distance between two vectors - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ -float32_t arm_chebyshev_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - - -/** - * @brief Cityblock (Manhattan) distance between two vectors - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ -float32_t arm_cityblock_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - -/** - * @brief Correlation distance between two vectors - * - * The input vectors are modified in place ! - * - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ -float32_t arm_correlation_distance_f32(float32_t *pA,float32_t *pB, uint32_t blockSize); - -/** - * @brief Cosine distance between two vectors - * - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ - -float32_t arm_cosine_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - -/** - * @brief Jensen-Shannon distance between two vectors - * - * This function is assuming that elements of second vector are > 0 - * and 0 only when the corresponding element of first vector is 0. - * Otherwise the result of the computation does not make sense - * and for speed reasons, the cases returning NaN or Infinity are not - * managed. - * - * When the function is computing x log (x / y) with x 0 and y 0, - * it will compute the right value (0) but a division per zero will occur - * and shoudl be ignored in client code. - * - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ - -float32_t arm_jensenshannon_distance_f32(const float32_t *pA,const float32_t *pB,uint32_t blockSize); - -/** - * @brief Minkowski distance between two vectors - * - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] n Norm order (>= 2) - * @param[in] blockSize vector length - * @return distance - * - */ - - - -float32_t arm_minkowski_distance_f32(const float32_t *pA,const float32_t *pB, int32_t order, uint32_t blockSize); - -/** - * @brief Dice distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] order Distance order - * @param[in] blockSize Number of samples - * @return distance - * - */ - - -float32_t arm_dice_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Hamming distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_hamming_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Jaccard distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_jaccard_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Kulsinski distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_kulsinski_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Roger Stanimoto distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_rogerstanimoto_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Russell-Rao distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_russellrao_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Sokal-Michener distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_sokalmichener_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Sokal-Sneath distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_sokalsneath_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Yule distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_yule_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - - - /** - * @ingroup groupInterpolation - */ - - /** - * @defgroup BilinearInterpolate Bilinear Interpolation - * - * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. - * The underlying function f(x, y) is sampled on a regular grid and the interpolation process - * determines values between the grid points. - * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. - * Bilinear interpolation is often used in image processing to rescale images. - * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. - * - * Algorithm - * \par - * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. - * For floating-point, the instance structure is defined as: - *
-   *   typedef struct
-   *   {
-   *     uint16_t numRows;
-   *     uint16_t numCols;
-   *     float32_t *pData;
-   * } arm_bilinear_interp_instance_f32;
-   * 
- * - * \par - * where numRows specifies the number of rows in the table; - * numCols specifies the number of columns in the table; - * and pData points to an array of size numRows*numCols values. - * The data table pTable is organized in row order and the supplied data values fall on integer indexes. - * That is, table element (x,y) is located at pTable[x + y*numCols] where x and y are integers. - * - * \par - * Let (x, y) specify the desired interpolation point. Then define: - *
-   *     XF = floor(x)
-   *     YF = floor(y)
-   * 
- * \par - * The interpolated output point is computed as: - *
-   *  f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))
-   *           + f(XF+1, YF) * (x-XF)*(1-(y-YF))
-   *           + f(XF, YF+1) * (1-(x-XF))*(y-YF)
-   *           + f(XF+1, YF+1) * (x-XF)*(y-YF)
-   * 
- * Note that the coordinates (x, y) contain integer and fractional components. - * The integer components specify which portion of the table to use while the - * fractional components control the interpolation processor. - * - * \par - * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. - */ - - - /** - * @addtogroup BilinearInterpolate - * @{ - */ - - /** - * @brief Floating-point bilinear interpolation. - * @param[in,out] S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate. - * @param[in] Y interpolation coordinate. - * @return out interpolated value. - */ - __STATIC_FORCEINLINE float32_t arm_bilinear_interp_f32( - const arm_bilinear_interp_instance_f32 * S, - float32_t X, - float32_t Y) - { - float32_t out; - float32_t f00, f01, f10, f11; - float32_t *pData = S->pData; - int32_t xIndex, yIndex, index; - float32_t xdiff, ydiff; - float32_t b1, b2, b3, b4; - - xIndex = (int32_t) X; - yIndex = (int32_t) Y; - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if (xIndex < 0 || xIndex > (S->numCols - 2) || yIndex < 0 || yIndex > (S->numRows - 2)) - { - return (0); - } - - /* Calculation of index for two nearest points in X-direction */ - index = (xIndex ) + (yIndex ) * S->numCols; - - - /* Read two nearest points in X-direction */ - f00 = pData[index]; - f01 = pData[index + 1]; - - /* Calculation of index for two nearest points in Y-direction */ - index = (xIndex ) + (yIndex+1) * S->numCols; - - - /* Read two nearest points in Y-direction */ - f10 = pData[index]; - f11 = pData[index + 1]; - - /* Calculation of intermediate values */ - b1 = f00; - b2 = f01 - f00; - b3 = f10 - f00; - b4 = f00 - f01 - f10 + f11; - - /* Calculation of fractional part in X */ - xdiff = X - xIndex; - - /* Calculation of fractional part in Y */ - ydiff = Y - yIndex; - - /* Calculation of bi-linear interpolated output */ - out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; - - /* return to application */ - return (out); - } - - - /** - * @brief Q31 bilinear interpolation. - * @param[in,out] S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - __STATIC_FORCEINLINE q31_t arm_bilinear_interp_q31( - arm_bilinear_interp_instance_q31 * S, - q31_t X, - q31_t Y) - { - q31_t out; /* Temporary output */ - q31_t acc = 0; /* output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q31_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q31_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & (q31_t)0xFFF00000) >> 20); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & (q31_t)0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if (rI < 0 || rI > (S->numCols - 2) || cI < 0 || cI > (S->numRows - 2)) - { - return (0); - } - - /* 20 bits for the fractional part */ - /* shift left xfract by 11 to keep 1.31 format */ - xfract = (X & 0x000FFFFF) << 11U; - - /* Read two nearest output values from the index */ - x1 = pYData[(rI) + (int32_t)nCols * (cI) ]; - x2 = pYData[(rI) + (int32_t)nCols * (cI) + 1]; - - /* 20 bits for the fractional part */ - /* shift left yfract by 11 to keep 1.31 format */ - yfract = (Y & 0x000FFFFF) << 11U; - - /* Read two nearest output values from the index */ - y1 = pYData[(rI) + (int32_t)nCols * (cI + 1) ]; - y2 = pYData[(rI) + (int32_t)nCols * (cI + 1) + 1]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ - out = ((q31_t) (((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32)); - acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32)); - - /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (xfract) >> 32)); - - /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); - - /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y2 * (xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); - - /* Convert acc to 1.31(q31) format */ - return ((q31_t)(acc << 2)); - } - - - /** - * @brief Q15 bilinear interpolation. - * @param[in,out] S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - __STATIC_FORCEINLINE q15_t arm_bilinear_interp_q15( - arm_bilinear_interp_instance_q15 * S, - q31_t X, - q31_t Y) - { - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q15_t x1, x2, y1, y2; /* Nearest output values */ - q31_t xfract, yfract; /* X, Y fractional parts */ - int32_t rI, cI; /* Row and column indices */ - q15_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & (q31_t)0xFFF00000) >> 20); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & (q31_t)0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if (rI < 0 || rI > (S->numCols - 2) || cI < 0 || cI > (S->numRows - 2)) - { - return (0); - } - - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & 0x000FFFFF); - - /* Read two nearest output values from the index */ - x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; - x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; - - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & 0x000FFFFF); - - /* Read two nearest output values from the index */ - y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; - y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */ - - /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */ - /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */ - out = (q31_t) (((q63_t) x1 * (0x0FFFFF - xfract)) >> 4U); - acc = ((q63_t) out * (0x0FFFFF - yfract)); - - /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) x2 * (0x0FFFFF - yfract)) >> 4U); - acc += ((q63_t) out * (xfract)); - - /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y1 * (0x0FFFFF - xfract)) >> 4U); - acc += ((q63_t) out * (yfract)); - - /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y2 * (xfract)) >> 4U); - acc += ((q63_t) out * (yfract)); - - /* acc is in 13.51 format and down shift acc by 36 times */ - /* Convert out to 1.15 format */ - return ((q15_t)(acc >> 36)); - } - - - /** - * @brief Q7 bilinear interpolation. - * @param[in,out] S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - __STATIC_FORCEINLINE q7_t arm_bilinear_interp_q7( - arm_bilinear_interp_instance_q7 * S, - q31_t X, - q31_t Y) - { - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q7_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q7_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & (q31_t)0xFFF00000) >> 20); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & (q31_t)0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if (rI < 0 || rI > (S->numCols - 2) || cI < 0 || cI > (S->numRows - 2)) - { - return (0); - } - - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & (q31_t)0x000FFFFF); - - /* Read two nearest output values from the index */ - x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; - x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; - - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & (q31_t)0x000FFFFF); - - /* Read two nearest output values from the index */ - y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; - y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */ - out = ((x1 * (0xFFFFF - xfract))); - acc = (((q63_t) out * (0xFFFFF - yfract))); - - /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ - out = ((x2 * (0xFFFFF - yfract))); - acc += (((q63_t) out * (xfract))); - - /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y1 * (0xFFFFF - xfract))); - acc += (((q63_t) out * (yfract))); - - /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y2 * (yfract))); - acc += (((q63_t) out * (xfract))); - - /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */ - return ((q7_t)(acc >> 40)); - } - - /** - * @} end of BilinearInterpolate group - */ - - -/* SMMLAR */ -#define multAcc_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32) - -/* SMMLSR */ -#define multSub_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32) - -/* SMMULR */ -#define mult_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32) - -/* SMMLA */ -#define multAcc_32x32_keep32(a, x, y) \ - a += (q31_t) (((q63_t) x * y) >> 32) - -/* SMMLS */ -#define multSub_32x32_keep32(a, x, y) \ - a -= (q31_t) (((q63_t) x * y) >> 32) - -/* SMMUL */ -#define mult_32x32_keep32(a, x, y) \ - a = (q31_t) (((q63_t) x * y ) >> 32) - - -#if defined ( __CC_ARM ) - /* Enter low optimization region - place directly above function definition */ - #if defined( __ARM_ARCH_7EM__ ) - #define LOW_OPTIMIZATION_ENTER \ - _Pragma ("push") \ - _Pragma ("O1") - #else - #define LOW_OPTIMIZATION_ENTER - #endif - - /* Exit low optimization region - place directly after end of function definition */ - #if defined ( __ARM_ARCH_7EM__ ) - #define LOW_OPTIMIZATION_EXIT \ - _Pragma ("pop") - #else - #define LOW_OPTIMIZATION_EXIT - #endif - - /* Enter low optimization region - place directly above function definition */ - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - - /* Exit low optimization region - place directly after end of function definition */ - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined (__ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __GNUC__ ) - #define LOW_OPTIMIZATION_ENTER \ - __attribute__(( optimize("-O1") )) - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __ICCARM__ ) - /* Enter low optimization region - place directly above function definition */ - #if defined ( __ARM_ARCH_7EM__ ) - #define LOW_OPTIMIZATION_ENTER \ - _Pragma ("optimize=low") - #else - #define LOW_OPTIMIZATION_ENTER - #endif - - /* Exit low optimization region - place directly after end of function definition */ - #define LOW_OPTIMIZATION_EXIT - - /* Enter low optimization region - place directly above function definition */ - #if defined ( __ARM_ARCH_7EM__ ) - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER \ - _Pragma ("optimize=low") - #else - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #endif - - /* Exit low optimization region - place directly after end of function definition */ - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __TI_ARM__ ) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __CSMC__ ) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __TASKING__ ) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( _MSC_VER ) || defined(__GNUC_PYTHON__) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT -#endif - - - -/* Compiler specific diagnostic adjustment */ -#if defined ( __CC_ARM ) - -#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) - -#elif defined ( __GNUC__ ) -#pragma GCC diagnostic pop - -#elif defined ( __ICCARM__ ) - -#elif defined ( __TI_ARM__ ) - -#elif defined ( __CSMC__ ) - -#elif defined ( __TASKING__ ) - -#elif defined ( _MSC_VER ) - -#else - #error Unknown compiler -#endif - -#ifdef __cplusplus -} -#endif - - -#endif /* _ARM_MATH_H */ - -/** - * - * End of file. - */ diff --git a/L1_MCU/STM32F429ZIT6_STARM/Middlewares/ST/ARM/DSP/Lib/libarm_cortexM4lf_math.a b/L1_MCU/STM32F429ZIT6_STARM/Middlewares/ST/ARM/DSP/Lib/libarm_cortexM4lf_math.a deleted file mode 100644 index 101d668ded58a363983a667556bfa2d6f9490304..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6421864 zcmeEv37lL-wSL`RW+tU7OU1-_TN~nX6CFqSF@p5 zsX(n#D@Q5Svq7oLUsUS;ZA$(67Uc}suAJ(hE9clL%Gth0IX9Op=ZTPV{#K;|V;)d} zWzVQUe@q3gEK-37)~movr7BpmDsw;SA{9LEWfi=oT?K#qh6?_@N`O?ce`zjKPrKJgzEA)~kwzEvn*_ZK~qJI#qFRyQ=uj8*1ptOV!W? z�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 z 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%0A615T^c!hJmy5uy zF-;#7#9I{~RQ$c-TZ$hmw(0ljyy1l4ytVl(_2%J!@er5u@m<8$_KaVK2sr22-{YY1`i7n9nW3P~-Oaw$`*k)OiQ?vyP!ulj0$ zgk`YT5^mOYs7H-sa=X9lAr0&AZ*1Z|!#Gev8mB5K6v)^&;Ufct_Wqm>(}Oc=flL7Ji8ji1~4qheI3jne;PQaf45z z7l`>yK~8WJvuh-td^1WZ=Et88kx&(7>JH=Oh_&f+t{D5c6Zx;KMBYX^%?~PY;DdQ_vhF zwJPMcXFS*qbs^@*N$Bt>J}Bl#26Z$ORU*SW3!6I2=~%D=`h41BC@L~#!&AKhM56pE zg_xh0OpB_RpO@^=v0$|m8Ik%M_MDZ0i8>y!l)3o$Gd9^b^i8%9#r!I9K%@V_2gLl$ z{-vTG#QeNuDEbD52{At}8Hv_$pm8czl#bUR=BJ%UAqzq=KQEaP-O9E{XtHZG$hL7R zR`evcZ9v6}OpiRqQIWF)F+avR>vz)f%yvw|ov9nWm&LPW$LQWPnhHh$#QeCU!K||a zPRe13J&)S5%YB?qr1glHUssI6o9`1kF;459II=huD|!#dUD%GSy+BqZ%4=t&s5d8z z905!!4X1D+aMK>bA$siX>~kJlb)T^xPqOEGx&U zSkVWV+$ysa$m$urfXSzNt;O&HS+OX64?@iER!L?@N!*2)-?Ne&7<~aIA?Ek4BnNlI zKX*Ej-)cv>NMZ+mr#mnPN$kNk9rL*8RGNCJ^yU~Hb4A7>}CjCL(57O5N*^E)0L1hPVz z{IaH)pO=ngj%3H6VtMJbO#T>-SX8VV&?&|Iet>T&oUxf7q7#bwdFN1WCOf5=-`!H4 zm-#Z=TU4ycJXD}!Juc?)!(i55!D9xInF{%reLGE~&(JT(*8CwBLpdx%zVz%E^q&2hU4hQ}l|NdMW9FScsNA!UE^YYH_=pQd{E4f z37YE6i2)VMODAOxLB|yHI~=0}`_f5alQcjJoX7HmX~q2o7syQpkjF$54xGuiKCdGm+_dJIhQpc=I3R=z3I)Y zVN0~c`ph;&s-9C<76G)zmjLgxTQ&6#(;Nd%ra|S9_p`=$k zDV!uG#8fXQg|`|!ku=@?)4)H|q>GI?==fZ1}|13UJxCTE(LtcP;*ok3t;+lT5kd>h6HwdMHZ`|M& zXcntx-98th&bmH_Vu}(q{r-;pll$C-%Slt3ejQ+>{YHF*L*D045bx)1geiBpuj#j% z-5|K1vv&)cru%8c0WX7>RRmOv_)? z@|AY^Vkc)X%8x*Mzb$Lb6AN(YT7nyzGVHJ~DadYzT9Sgfn{XK7l7horcP@6G8zlvi zd;<%BTVPzz2$B>a6cNIc(<6@C(e0n!IW?HxBYj~~M|Ymv0qp|WPHO7m$iyjqfD=p~ zn|f&KA*n~<=U_-naD585MarVbQhS%=PUFx|G_5%nWxq^#dbYJ~j}bnfB|z%Vnq zxC7F>zS{%`okYPwOxuA_AdJr=|C@L~LPpX<6R|=D_Hu`Hp65P1F?C_mqSRwkk4fdB z9ApU)9(4YCR|NllG7a%{7a@j;!&M^g8;*E(ELN8T@q6;cFQKWF#Zip0e zRmrDUM(;OQEre6B*eoQ#FzouKmHrI44jQk8qs(#bty;49Xk=5 zElo(qD=rEMxXx&xEfY+8GbtvYXxEz#BSGgaTpo9q@7E^xhxfiYhvW>;9d=00iFqJ8 zEw8G{2Ztr6vZ}H)hi`@B^g(&UTU-Ulqdw#B->CIBoTR@D>ikU)hlj<&Zm)1SD{1I) z%S6uagS;h;%K3$pf@ea#FEhyvcbpCpVo~;6KXOU9eQ?dVA%WnoXn=8PtXUIg9W`qz zoru~#L|eo0i<_LkaMGkH^XG%fQ*~7> zMV6LSg7Z^cRkflFg%it`dY(YRBU)8bxP~TbSC-c~E0H~7xbZ@|4E{~!aMI>VwBH@) zy#9EPI&MnA(MQccdcuN9(?~{I4Su^wL6Pa`b&Q8sA}b~ziM*r2T6nHCjHZIxsYlJ6 zg6SlKslbaH3KVvKPu%;B= zSZhlM#lDZR(q}7Hco8J3ikHP|N>3`QEvu@G4Ie#vSLamZ zAzim@WknH5fXLr(Xn{g2tEwxguBj>!QMqQ6{aQdyZTvLeWA0&mX?&YvfSig(#!qQ7 z5Q}ArgI@=QvZ^AU8Rb>AI57%pOUg>hD$B5ba01~bwqPmzgck}e4>4F`L~D!es_ib_FT=6lU`l5sDJDqvH1&YOKWQLmseF5R@UVX%U@bnmp|#~`A5w!80lgD*=hRd!FDnU4?nn?)cE7Qqvb;w zl*aI!r10GEg!F+GDd}A&irQa?{Zr$w2XB7kAtaLCd~)Ok|2~@O{gLC?7vsW>y4=5$ zqj(4hs-Xk$NRt3Ey{KNgnY&Oh8C3wVv9E{36Q3zOobkU;jW{5vh{7}EZxiwj`74Zk z!%8B4F!2W+{d01CQOk<&iHZCzMeIgIVSi$@<(h#BHwQ@{hH$675|~gS0*g)s<=S0Sdq^RS-wH>2E}_6f1&uiViF&ip+29s z68kHTRGgx?P_a~TrQ+F&S1I1AxLNTj#a9&HRs2FRj0GB)Q%u9d zW9IYK0C9lgXvHHHOB8Dq*DGGG_zT4s6kk`|q4-b5XvFKMmtv0MVTwm99sgJ1cfq6#v1dbeTy%N6fe{Jr8AMD&vZTf}U|fr=v(M=MTL zq_!99GtfRxH$h|z^1FulT@~fo6w=w69;leBn5Q^SalGO*#hHqW6-yLXC{`)1S3F1Y zV#Ui8H!0q!c%R~C#m5x4D88sD*L#fr15NKx{G5n2{gtLkRgwANbsG76(ZF;!#lDJs zN5*`d?o!Xp7m{9kMVOGZnb-RB`LWu;SE>^LnZlH}o)6mCm;HC06^i$Km>*1)%r_u` z^Tss3)+F@BC+p$sNCMZT9azRN02`0ZuIh1p*Y9^V@=V})!!Q^dE_Kd$Yz$ZSa-0~j zJ}-10^2`_zb?(MCn~Ot(DVv3~ZSO(Y+k*8*dt7tum*YPHn`win^EGU3Gm~MJRaLLvKQzUg-z;-(Fva^n}1i1%U2_;S#;_h7bnA4_|9_N+z zFhy~D_aaVv?2F+CxEG#@?_LvF#_dr>Q*S%?l#TI1f35WZ67sRYCz}K?r12+#_V}nN z*a3MQABGSgAFpp%%hdo08)460`(`eP)-*UTquyd8X!*P02& z9;P*+URrq~K(EH%e z*<*(Wki*mf{icS6Pnx`Q!}Qm81eagGBeeGV9pUBwyL0K< zb9UaA^32Ww%g@<4VC}^_f+?|`2d2ERBedM`O)uUNUfUsobDH+D%{PVKpYlzE7knyw zQ&?W>aZdk%bK5(1$~j$%BNV{ZAZBJ;5u8(U070*$n`m%Oe~-fo&goWWhQhBQ6{Mbx z&pEw<^&;WzG}r>p=}&3lQG6tFPM?4kH~0~HX^eAvH%c3FPVYgNhI2~R+HP}Bzrd8( zoYO@Zmf@W8zor^;PD%6fIHyUd+bHMs4H#{bb9w@X2?x>@m~B!ZzoC&mTvK+(-UaW=A2GphRr!WmAhnfPXC8CzC)bT#n=I#b1K&oi*w3H zJ~ro+|3ceB&gmgM_!j4sw?{VTbOC3sWt`KmSk>a3p3QVKoYS!!wZ%CV*UJ{?^au{E z8P4e-?xn>!y`23u!#Q2T{+i{S@{t%FNb`HIan9*%_GxoY-{Io6Ij222fi~xq)aV4x z>GiDfEpblC$89C&lvkZN=kzGfM3bD;>FDKK;+(c;$B_T4&p9Q{viA~v)Z?5EM*VfM zbWEvtj~M5iPD9qNIHzZ$&bmI}fYjrhzKi@_b51?FX+L)~M&;)DMAMh`9@RY?ce6q? z%^N{V>SE;QV-uoj-UMc?M^cEUC!=+^4~u?>Z6L>X9U|CwG(9p*@6m&9 zLFNZYzl&|q50QwIP@hH4{mAf0sJ}$)S7_i9NtJ}Uz$2lue7lw>kWd#n2M>plZ73Is zhB%3pR8|sEor5Q9c|X*leXqSCsyYYrvB8@t<72)C{euL%NXv^7+Uxj0f-OP$&V;tc z_Fz{@u<|7TmhOFB(vySS?M6wkJb(^puB&kTxhV;D7!D=3z*$0qL-zkjitNvE9)bRvOMKjmcO`D|;vI;*sIm?q zA#_1XDYC56JVn;4u`t1aB=|fCPPhr4L7~Wc)fdF82ku6cn@y4B1(X+3=7SPT&qy+G zHa2NQCD?UIi`|0U-(cGnMV7Wq*nr3nv6()%Aa0i*l&K_z8W0f+>%caQD`fr~`LgtH-56i?vdfP>ZdtfJ39&UR;LU2|T-@Biu{If(^+w=B1SuVN5TfDHQ*w@WlA_5+w+o~sbqZy; zUEIuISGSwn-RaBY5aZ)s^Ei-?JINX^e*n#?moBK6=EG4FSf9_YOkjFfx574Q zw~6zbCw=_VU+WgSV=^GwM2aR8*cBpTE0Q?O2uo4sDHEKR>ij!gRsGJh};NH zQY=J45ydAJf35hE;vW^aEB;OK6U8qSaru{i`EAZ|AX|{%Z%i8wE5Bcu z&Q>H%i|Jg&JjHQ};}xeV&Qx5iSfaQ>u}YEeiD>s6#fud$Q{1F@r{aBzn-w2Z+@i?W zK(zOYB47G2y+iSHVr1WOhRwX{^m zy?TGZ;%tmZd?M;4^xGf%fezR&^G&~J)w7q1o6{KbOfX|Q9T~R0Z3p^1SX>t4_O3?U zv_aH481^{#CYZ7-kYU^VE9{L&9>*8OX2y31;-(Fv&i7&OJhMowvRe_i?ZvP#c${d@ z<`MInLwjaSZ{wup|NfZ3GHzQGO}&MWelYw7n?1gP7#|Lu zj1NBr;`{q5;#l+500~{eJGa-qnG2#d4bDu|I~|$3;t@aJ8!vp-Ho@5Ih`2e|m_G*N z`;ZY0rryvIW1uAKhh6cA4;e9Lj8}Wt`m!Izq_a4WxGVPNh8>ZVqWeDn$X$CMwpBZy zS?iAdc;|a-bD<&o*^AXjRv+m+!B+BrLDD?r{seQ92->^a?yaLk$Zti>-_x*EEh56t=_~H5Ih8`?At-((CfNSn+Q34_c zK9jycPNHk>Ct0X^u-j2;Tyw*lr0T))p9A5Vn{ON29gP}r&CTyXPXX|sh=?>A^%p!=`v$JLccBOSI84wrHziJ^KW5*) z9xVS0$al>h4KnHL!IC=TyXKD4UApg@JGzuZ^SQb2V;6nb+|k?EkGV;m;Y89 zag$XK_SaZ1aLsM>U_YQ`i<|o;i!E-hy5??L54JB1h-+@qgO&OAxw${%$b4?@^BlLY z2g`vaw_Fdl1Vf{1?jp=hbPXrS*MqI+np^c?S7DCnn%n5XCMW2@CMW2@Ci{A@f9AM+ zJy>!88@lE;da(S`^j&jDc|Qo(+|)s(9_;N*`g*Y4Iom!rS6y=(J=jU?D3P0+oTvwz zoTvwz?CZgt6EcNwZ$tO`}CDx#oVA{abpl>)77n=KhG& zXmNA-p8#~tZS-J&z_i89<#|Qd+;KhF{xoQFbH!J;&CNBgx#N1U<7i|5=H{NoX*7DU zD{xH2HMi)&%C*Ge=JG7IU2`AC3290Xb^`2*Yi>%uW*XPrp8l(oc|Mz3dawmt49#+L zlZ_s1H?AX#n@h$pU2_{f*yY?IOAmG(M{RL)^Vzk<&8_d6dnDJHr3d>l*OkT1HLkhk zpGvc;GjZ?ZBwKp0cd&^jY(3as9I?&Ky@xeyJ=g;{Mw^??ivf!G44I&Qz}3CJJ40@>JG z3H_=kB5MY-Mk8YwwyY1)jeE|blM!Eztq5E84{^lZ^U`T?6Ve-*$6qh*c^S-m15y4! z$i|NrHQTVlY2wJR%r&10UYOC75&p?nQd*UZ;Od|NL+;@n3M4BN^ zQi8Rk+sPfDay2=_{Z#5xbY_)znWcK4c3yS@_0r>KVg+C=NZ`5y?~s5!#t*yd&<%`m zi6S4LUI<{lN$?s_EZ4z<2Q)Y_bOR$^gSk@2d}t?LlX(PLj?O#+e*U6$jeA235wG<; z#3b-k^8yyNB z@M9u0BP$C^SC`cl6xJ+-7GP_%I$Oe^YHB9;+==&+@D0NlwAhQR5mnZ*N+ioF#f9@~>Pr^Y*3?z4Dy}suuLUO+ik4vYNLjZmMIBRG zQREB47Q;okXSza6!_joXl9jX%-B{W*jUaP~Qz7@er;{lYSXNsCAx^nq%`aOEmBnS| z?BeuRR8@Ksp3ug{+&Bd@XHS|@umGogO&LXVy?u8Y@z>qvoqKOcT#|TG+~{QxOS9IK z#jLHva$HeRUMPa9MfTDZ_vScEODg3;O<(DyB{6ShLxZ)lPLEuofbf#ax;53MI6uV6 zxjFJ+G*Sb$QUp0YN9m$T{2#4$>AjP-{dQZg#^erff8@^fHn)9(A*U}eJD%s?F)}O2 zpP5z&I{5Kxg`m8B@-u>R&uXXb8KFJiulgY zYyQ5ztZ$S75Q|5<3Uo8@64I* zqR8(Lru!-KQ6JNXDo#|KsyJJbue(@pxniXvxgN}4qjGw3m zO&dg=^|(&N7|~$L)*@}&+XlWCc{;Sm^WNCwIcM4+>f8i-tY?BL<2h>E`>SP-cYwy; z&4`;ev~fS|jcR0G_^Q~p_c82oKRG@$iQD@r;XCO=@1zAc~6C~ z9wev3=RNhKg(3JzZTfz& z@5hwbyeHC44DTtO@dmu7*U`e`J<%h!;XOS8vvJ-V^;`TfC?37^cO0+Rn1Zs1S)3Mx1pZ65zFdJwR(pPyacu%W1E}!>wCA&)0Buw`GU{|uT?+5!K zCVk%1B~1Ffr%^nPKJQ7mJH94i7CUMs?}^_N7Vk;e8Ht*N7Vqf~9EPt+csf_6&wE1^(i&wHA}ep|(R+K$6%@t*i)Z}Xl;axyI5(@iY5cu&+vvUyLJaj99F zgmf-p^PUE?zQuc@CZNrGI*9#Qyr*lKws=o3vVV*BG?ex&-qX+7zr}khV0(-A^cbhn z;ynrb#Ns_Y#Bz)G#PceF_Y|fk)d$f5^H*=S4O~T`8WB=wo2~EiGo-V=;_`D~% zmRP(eVTxIPu<4w+N#4@{93G$dB;+DXlaQV|Y~Iu9oVk|qp89YdS-hva*wo@Z&EdMR zcuyO73@qN$ICgFEp1x0emL}mGt}~1G#D6HTc~1|sKTDHvBI{ecCprO1;5{v51)KMD zI4#(`rz=^*<~@DMK5gF9jm)rlPiJ#4Y~IrotYPz>US^HG#CwWyPA%TkI?h?^cu&0Q z#CcDYWNw=GL~X#m#e1S3Y>W4_k{#Q;r>}7cz zV<*BOcu%(=%i=weOwuUt2@M^0v(I}P!~P8KX|wR2_)CdFcu$*!_jC-B{E?XTEV^+w z3-9R`q_4%6P0eWcA>lpkK>9uAeS{D9A>lan!BBc(%RWf*`jYo_DAFUCH&pTlFz;lf zYq6nW8yD)ooC_7?GLyBy^?;zfC#*F500bY3kqj@NfZvr~J|kSxHcu*q%5km~%23D$ zBl62zxKjKH?irg)AkRqh8S#useWVxy{>b>79olXL{+t!+6fF$*@(Fof{<<3&8Rg~U zQv$A(8ra&oE+v8J*(BH zAS%IYC zc3J63jVQXkL61=V%n@U%Hlu8!p_Em>7qvm|GDENAwJSk98lsvPh} z%8Ki93d_q1;d^{3GD&ZutYQvWRm584!Ha95onBI%Q(RS9S5sJAcNi!k9z&{)g#`|z zP{|A_Y)Ki}QZ12FYat7(C49+7F9Jh~Tgl)mDU-uni(^dUkW;{=fPI1!Xt=mtT3%ID zSe|g6kubKVR9JI**(ob6#ViO5$#+Taaff(Xu7Vrslj=aZ!{wuJwYVrRAJvSo+P9&k zRSAib_jLKtF?<=i<`Z+Nzq`*daM|E}wH^UQR{f@~WCad*X2(cUOE5 z)f88YH(cKZu9kh1xIc2U`eJ~*x#oQO+^nXqJm6+Eb9;gx_V|JC9XI;)dOh>y-R zuPDByC_aCYFFt>P;`0|c923R*;`0|cPt)S_7isbN3lyKfK=Jtt6raC9@%alBpT9uy z`3n@Ezd-T%3lyKfK>n8p`$SqP<;LZ#pf?jeEtH(=P&Rt+FpGA zA}v0Df#UNQ$bai+f8z5OC_aCI;`0}{QOm{WFVf=k7bre|f#UNQD7-9SJN#avJ@NSq z6raC9@e}|&L(9eIFVf=k7kH26|3XoG{vtmK4~=NAi=w`~_aFY4Q1swD|l5iqBu5`1}Qm&tIVU`~`~7U!eH>1&YsKp!oa+ ziqBu5`1}Qm&tIVU`~}{KbD851pT9uy`3n@Ezd-T%3lyKfK=Jtt6raC9@%alBUKUXF zzkuXK(XROX1&YsKU?0sFpT9_p&tIVU`~`~7U!eH>1qv?3oi?4;bj4ZmxX-cWg#uREFiCS+|MWx z>5hunP2nN&;R^Xka(x8K^%2-l^AA+aQ5>cy*GbenT+@7nNjq|V1Quy}iDH#vts;38 ztk2g`#B&udRJ=v;cEz76%5@X{hkN@(!D5TzwFQSTc1xhy1nDXP;P>;$7_IX zZ%p5o@yU*XJ)Q?97<(5Z!?rigvWHu}`1o!{+_a&MrLcDd?n_KCWj7$hwzmlOxS!l# zUN_DD^4i2Ux!4#s;imHvbFh(S8MmJ+ntFLSNjV25n0maHF>b=Ws24K{pjj_l5x2*; zxUWBde9Ude$7>HrTV*s_BbpO@kA{mq84f2OuB2B=$J(?9;4yM4fD`zj2Ic zF!tESu24Ldrf zd}?&FmVdExJhZc(UVblFWFPN*`Z%)4M(^y8_}`X?UfjHM{Bq_5w>`b{Tv66?$G&B0 zYYo6T<;_{hy&F58wj8}p(+jk8tsmf+y@YIV%=!@m;fXjr;F$f5sZe+(Qo&rt;~ca1 zSRoQV3sVS=8E^D`j@eXL4SvOsxVBawTA*LgM2=Z!*mQ&Ku^bJ@>{&E395Y@o8gk62 zHDowuD`0Wg9J4fx&f=K8h$*o-W;Z@@A81}!{}+3hGd9J4nu)HugXm>*4P zYyA?#v^Zu3l8kfAPQ&namt*!COvE{6*JF4V$1I!n#X|aeU8~5ne;hk_b};m%&3NEam*??YM)~!vOBHhn4L{izP8o@Og70e zdx^vFIcC>zDf%3~VM0V6Fj@g?yoEFEdn0AW-$=>e#WRt#vP#n#D1@kvnB+YYk$3i(|Hx3*FMzDrSEc$Bh0-ZI0O|?BC*; z@nMS1F{6uTn`8DvwzoKDk8m0-j#+p1Z*j~XWVyvL<9U_9G0Ubwn`4&B44Y%NktS`9 z*>SY7e{;;vnWq;FyhN1)F1bC@t6=vj{8TU7rPge?!>S;ZtMa!aC(u8ZgI@IBezkG*+kTHxB48jnJ^OPm~9=^ zKwE3;^aO3KAo_Q=9&<8UEyGrXE&FO5arY_Vm|cVP70knrBIF6j>_tRhU|xpg#mFc7 z3{hT3vlr6dQ~jC8hbVk--MKZa^?|BYwOsK1{vIyj*!u^2?w$-D8k@%IK)FIq1moi=9lx`q> z1=oNKCiE|2E@Zqi!rcakqeH_zhJ@ivG&LujmctsIQRIfZJAsfJ3wJv%+`-6ttpr^x z24)!uWBWwfE0G!265>h|N5VKAbPB#zQdt|DY)SP=c{#P!IVHnJ#d0cyRhLs(RCX97 zuu70oxbHlL7Jp}yy@c1$*un*=sl2L|?62CAvXZjOGN>li)*%AYRAEI$p|GhC^JrPZ zX(|Jkv7o4sjg~-{sT{(AphT@K$7jL9nN^ibfl8^WJ*f=pX5Tj3Oh#ptpIWT>)y5dh z9hSeeY;OpEwK2x_0b?u;H(yQh#duS;Kk~(T*>{e3%M(L-T0GCc$z<04$REqXxcH-h z^Xv1+8oQ1TDRwMruf}S?guJJ1)Anl9_G;7i!cRv0v~JV(^5)^cRohEAWLO8nA;a?x z;gA9Q^4&MEzak%zkduTg!H$aLOEAB;Vn4;viiavrRGg|fTamBj*q)CoiRFs5io(4` z{^^=NOOcNepi#!=7-q zczurg8|MJZ^gR!w3al7A(z}ad{1MF0*4cmW)^F79h24imx(zd_F=X@jWK8Lty~9++UtE<%QF@9vmyFAZhJ-c5*`Hi$Y|u(zy{dHFHQYj5NeXo9o#E0o&fdot$lug%$d z3H7j+tHl^T$N{t0G{?k1w5Gv%2lZN_0hWRFcbHi4K8!tHv&}igl9ywS^EM+IOueCb zqruMdL)_P4Q=F~5F&>Gl1)MGN_7LiEw$i}RnwoNf@V1}^wtV!?zk#>4Y3;r6dq@Q^ zcWmy?4Bg1 zDN~^^C0>H#7?1O_K4XPQcs&e)pOp#Y_4rwjqYIy(HGmdK8cF15^?^+{*aJ(?@Ut#O zGsDkHLuo^P)+}^s_*tu9ao7ATezjTrtPNN)Hb0C1HDUN!{7;OA{H#Bsg~!j@gmS~r zx&>zA{H!&o(xe913mB%w&myZVd3cl&(GrZq-lQEA93_7eio^CHb0C1%VG1g zzQ=TP8ekLAo6paZ`S$r)bsU+`&$^o9ZZ$va5)3uY&)UEv?(?(KIm`wcU?j-zIX~+; zcGaW?7;gkEe%5tN`ur^34qE)ILwRU?4KO`T^Tp z{H&)qjTS%aK=yC(v$n9@;%D)^O5kVxA3L!5S$|`O&Cj}&*{99VTE`5VpY<5`!scfQ8QInV>%wvDC4SbwI6#Y^C4z^o<7e@z z6X$0=%rQ2}&#JxvpG9tZqx`H#aRA*re16s#RE+bp?ika6pLNH~1b$X3`giX*Hi4h@ zCAxO+5`GrH*RQ~qJ)QOL>P?Q-6G%VGJp3p^UJmo#L-cLt@#%tl*9e=Rg^V^X)_*k@ z3o8JNS^|HygI`794`k8*VuZ`KQQj2`!Mh^x7pw5D81Wj+Ma&P( ziKG`$0!|wVtY?^2j1R$PYjN$O-b^u~9~>lp>9YN7qG!uyV{zo#L!5Wj7{iKtX9qhy z8$${@@A5L?ew`l0+{)}C4Uc$3@i)I}WleGE(8=n(Z>oyo{D1bY1ip&u?#{d=d0BWY z0Ux^$5*86cSOr9lfDx<s=8s3B8@F@X}~jQa+GH}7&t7E=qCsk7@lAhv!Z9okBz z_|ab!rl8_FyWN>_R!oh-5+eYPW2pC^nA2OngR7 z&4T)Pc}-pX;JR;tScPXV{vOm4w~CKrdm^_AKet&fB)Tg8?>P7hXSqF*Th$Nk<3l{h zH^HrH;qIQqu4*95?MF3YX)ol2*q)V2P;liU*;jmWr z(dYt-Mi)>tx`3k51r*H}plEafMWYM&p4u0UE`&v+3n&_0K+)&|ibfYuG`fJI(FGKZ zE}&?10Y#$=C>mWr(dYt-Mi)>tx`3k51r&`g;1~FM!+wfJ7f>|1fTGa_6pb#RXmkPB z;%x=?_KjV_>QbOGD=Rc2h;_*G^c+W1u%2fXp{_*HVB#0yHk1R+mI?vp^d zPXhnle5%v5-j#}c^~iQysVMhJgm2Wa+$Rx!P{U6tKBLH2k}UtB;wOrKS8U9ulK!{C zpZb*dN7&;V&Tr12YUu;(`_7oxNi@SQ3-q3!f)H#0DDK{v)yxE+FC@| z_9n+o|JYv?N!Ys?ewN9@L6?IY)TO*=)iI3+f10rK-4knG_v%s22M{-=tK-DgPw?i; zL-5<}n;Q4~%h$Qy`0;rSj~+bD;%32~|LpCL1>0r~gL5wO?F@(NUOcECthNcXL&y6x z>P@&40S*VHhh#3zS^r3buy3IbauwO1_2bj^&d^Ubn4WCgF!_*o6FqscQBT@$jNHw3 zxZ~2B^u!%^#-vX-q+R(KTFW;yMp}4lt|B8K1!WzN{stt17{A#ebtW& zSjSuMeTJKrxvoQQ2`KgZ{t6s%@*eU9zQs9_tD^X`~v}S4Wd#)zr_F4C=9#7 zB2?uO0Dp{VB>+bLfr>l=U|J}AU2r=R)Bk~PfdKd*{Xaks5C9qPWbjr@HL}bGc!E&j z4PTQs2;t}>2>S%UD8B-N0JxsnvqMgh3P&ISvS@HK(|*_EVx+YXrGySc99WTeGM4@z zzwUViz$=i61i(jG$4STn0wDc?Y^P)4N#OLU22?02`|=IXsFE5Z(Sy)xp8yygg)&VD zfKQ5{&KRg-_%deV-)lIeZ@A+>4-+H+)}z|!k*qsG0F1tjYJ37<^gad?1iaU8l#;y+$xIK$j@Hq4~GhM}Y(0CIF< zvuW27XzRwo00FRAx)6%}km(=*ns6lcFe?TD(1bH%MVxAuK-(--N&?`Ocq|KKcaELH z{1ySQ3&S7)-XiHEW87!hCIFtsFbIGTO8WTNO{^aTKyxd}kA20kwF&4YtRI_zn)J!B zi7XES;9sQt;V}_lvj~7)c;SHn$icxd$7Dl75C9iR{#h|zS0n)PQVM228i>8l3P1ql zH4@BzA`p9+5g-7*j1s}@SHdy!!bt$^g&_-OZw$vom*4~Ptr8BDJ4YBzs~NR$jS+7Wo49iK5v#xEXQf>!J0$>%o+4W^~KnQ?ykRvAdZV&(&z%?HGlp|sh07cUh1VEh;sF58{33b5#uKWTo z1ixp>Ob&}Dkh?e76I@} z76k#&oX1cs&JKY9$jpK4NbEAU8U#RoOa!uXVsTb&5de8FunB-*fn(&gC>}(AJV1}IY6>f|pPJy-_60zEijb@8&0$>eu zK%k8#g4x%)vGuGI1V9sUlN(#a2oL~G#BFX&c2NZZ&_vwp#x7?L5CBcYLvF0eCZHLI z!8}_fW7^G;FdHS|R1@CU3&)&pTT?F&q|QV{Y%3cG0w4oCeNS=>KmaV4@DeA3cXbBD zR4*rkj~cv?G~9h_>S=)>?*u(~*C7FrC%4D-JU1W!vQ|_7jb5RyPU`K*ifgn<} zAhR12>`wSoLcGv>y1e+jYvB!ve+vIII0yd@k2C;8y|>u|5CD1SbKPFkSuqHJIo+fCaochC2{+0-WI~f}+rP+hpEps5BFOa<{fimZfw?LXER!h7)`@Wx znqMVxlCKNnZbA449R2uB*?qy4RSthg#Ai4#>Z{~GbM|qUaP+*+ZbDQBn{_kZFW8+u z0g+@w*`4LB^DZ1oo!u85-y26?yR*v?u~Z@p3LJNx8G+v*;s%owkq??kGRFC{Lf?`C zjMc*?@-swi!;v&%``~PnAKUMJG{Jq!j2Sn9{skjXX5`Z*asqld4o5$3%j-U8B3C1V zUAG4OZwTV{ZV&hYm`WtQ_b>Jb{D%m0<%!y1sq2%gL+e+FKQ;980D2jnq?ACNeIKvHli{R?qP12P_w<8U|wTyEcz z7?39sMV_K-&$z1*aS0B4FfwrAa085_!Kg)KDUPHW_YflfXd?X)+Kz}V5@}7Yy)e@| z;YgZX2O?rLBkg%~Dk2&fX%E{vMEo9yHEexwT4Ok@VXHv!M2Yf;?N+IhC&Xg=%`t6;J40=+toM3c3+8x;oo^cubhsR2MTFlMJKrmx$ zhKp?J?My0yES2H9Q?eMJ*$3u^Vkp~XCFKW4QmjdSZn4sy72-=omK%)PhC3o-#MCn- ziy1pfj<8>KRu^Xg+Sj>@J0R0kiibTmVy{F_w3&^;So>X|t*(jMG)FgWr3SleCpFl^ zE{~5R)=0a(plg^Inu9VqTD?Q)$AK9fLo;T~xA#Eg>xr`#7Z1AIC)YhF(>f>`YvHa$n>Q?dd^EioH$iJCMnCn+C#)z5B@X6mofi?*==EmY141c$p6KJ$Jk zxZ3#R0OLq+6^bi^eQ|&&Oz4k82*mVEHSvTMID*d7&>DJZ%_bJBDSqV88FSM-bFMRs z#s=XCI!i)p=rNXO&472N#Ghl{sB3j)rCGyIku zjhH0I_9BZ68covQ*lC^+QS*da$P=;hM7%t5J-7j0_xQSuuInhX_na|AGILyKHZPHx z#(N^bjPPuZ&q@=^@i9X+n{bthy%xZlVc|&t4|u(9+q06jqZyE;boj;8MFZ5a70Ioc z#nzZ6%<@msEWh4atd|FFHGUIjJ&G6}hS)W&JGX zI&+&VjfYC4p+|}CBwJxmTxU)J;6&r~J2dB9#F$>pc?jN@Oa=n03Oc7QU(;NjNK@xu zfX8?jgX_#V6{)m`6(0n1B_88liMrRjv0x?yFD}#F88q`N9GJ*{*%^M>Ci9qfIEUCn z*O_@3z?ho35?=NYExG`3o$>lsXZltXcSqz&IN$2AMY|hT;poIpC+GRh}2(NF2D* z2y6zt1TzwI{VvUAm)LYD`HAcv`Kj$g$bUPY#gIcwo< zY!^{*gK(JE9pjxRoOGV9wKy7GYPpHbGnkpv7nd3SC%NGWu|>F;#siG?nRW28MYxz& z04_3K{7-Uz*<F_mj#^%ukwgA`848J8!<_g=(%Zo^p_N9iPIL#BX^6A zcHEu3M%Z(NW6^Tyxqj)n&6So$@LrH`b_>Rf?K$~?S;k9qW|-%!gqOpK4_5Yy*5Pfg z5~Qf(`8VAl`~7V5}bNTb+6~VvW_Q zzSU!WtJd9MII_~7eWpiB82{v+Ks57>_-p=y+hjl<64fifc}dq=z60^bE9g9q$<($Q zb9d_9%eLFaSoKj>RP8UmY$&U$T~O3emRo@d;}n*bl@~!|y0BqsZCO3y0*Di(>IMXG zjbkavNyeARf>`80LBxk}F_o27Yv!t=h6+T6al*r{(BE-p9}T+UaF?!KI%jnbr@K&} z57xNh^kB#FVK-P4r!O9k)*KpKHXeSgsEknc9_uV4SZ}GA6>f(jSg_eE*eN%hk#bXXFJl+%8bd57r@o>`@dWwiE25*f$)L@JL{AnTxVZ) zkK zH0lI9ch<~sqmj#1a^jD#lUMv2oTJsPM_4;z;n=po#TmNk8+QK)<=CH zJC}9FHOG8>6&rp0JFSZPsq-ri{a+{I&Cbx$& z$q(ZsM<+4K7n}0pHxoVuvo~r@`Ch%6JzKa#`1c*2_>L@A_Xo`OAa=)S=|+>0lH=V? zaPyICy7BEKm{Fd%ckn_g=SACVmfj=$dqv{*(I@Hl(YGc0GKAQy0}~{Jw?w(6;GSge z2e@fwu(o?JOVN*bAc)Jn(c<&Mn(D%`C6x_@MRoJAes*z5LrqmN?&`SfV;hZ;V{nJB zoL616ppYvB7gjS+RvMQL2o@BV*H2zpb610fh#oPV`I%G! z!3FqAY8GM}1lfE7%U>(YHMNQxCsbC|F03mntZm>T$Fe02tdY3Tw*C>&sAiSyfrxyt3+&r4Cn6 zP8_yhd~ELU++p$IdBesI%Nsr_KCrF~AFuUg`^1kwc={1s)jVYE5Ufn7E~$vul`X2Q zudJz#58rRUQDeuRfL%07Y8M_*Qd5V0yN6VbM7W`1VO24=+d%yHYPop{haa<|uAyde zNxe4{N*Z{=78Na6h%;Y1O6DH3AfuP1s@R`7Uw?6VNja*;^e8!r6Q@Mx$KsNT@54%Q zF0ya@EC$|y%zm?Oyc%<%tnR4t30$b_6jpc_AFq$9nrbt-Ti=jFR@FDHrEo?;A$}U& zT?@*auSKdz+=(j7$}k6Hk+Of~Ev#NxUxxcfb=hK^y+sX}3YbMjOXNyiFnVN>xj>5- zoMdi7=(*U?3p@Fmt`>EG#kh@dE|k{S6jtDNumH8PTC9jh1xYtJoo@b(XI@!DDej3J zXJ_KBtTk_bAZ8R66zGT-7L}GdJEMfq=$z$J0->I*FPtYAlXrhwgyrzKr7+bb)HmSz zI;n6$k!%-J%*)Zc)MW569Oc#WIiRVVa9o=8g(XXhV6Tj){`<6qJrmz!?Dgw| z`At?Gzt~QQ=A4oC^$tgikTR6*4smIU&Z|tk5D{T zk!w|$zgF=lidQM#sQ9|#M~eSYOvg(XmhYxGP;o!S0>xt#xj`iJQ$d)xQt?8?Unt(9 z__X3i#g7&LrPvN{bZCd0IuoZT&Qh#a{H5Y;icc%Pp}1A?E5#@-aoX#pI9sto@l3^^ zDqgF2tKtKS8x%8eOQ1b&-%T8(ND?5!hbbPXIA3v@;@OH>Knc&Xw8icc%PskmJ+5Ha<1 zQtYcZTycWpbj4!Ddc`vof2w$$B6)>u|D%d8DsEC74MHH(3lx8(c%I@-ik~Z{rkng- z757%mQQS}Q0L6)lQxwT5WPK+pRuXahu2MXih}-py!fTLFq508sW@0m^l;l(c%0%98b6bWF*;6huBO*3 zE>>Knc#h%)MA*Gb!)q09QM_I8Va3N3UsilwajW8|ieC_6H;fxP+nc5sB_h7NhI=b! zYy40Rk5C+=@sl(>S@BrK;}z#CRx6&SxKi;V#h)o&NkluY*YJ&sC*BC|<946A|^@rQv%OAJq6Kh`4vHSA15}-%69_?M8`cUnj+E z#Q}ilY?yoW^n!6blrOP~`81Og~O>uHsTf zuGV7u8H%eF&sV%y@hZi&iq|XNsCb*AJkP-1QyP9oQJ!lM|C)y1QT#x0yW-yzxmbbi z>ZsUFks1q(&ruwxI8n4RgUT<3CmWT#?i~#)lO%6+0+$4G7a^6*X|QhQ}!$taymxk&4q5XDgnd zSgtrwxUz#fqmWu2hugWZ3*1;x;ysEFDn6pfm8?vETJc52R~6q@bj8_8rijOOD`wQ0dg5oQRTu8)t`91)2`FsxyD`qNoP>d;ZvmoZ<#v{c3id==n@WG0c z73F&b;*Zwwv5MTOf%%ISxnhaoA1PA$pW$;AFIK!%@#l(HE8d{^8^zlc?^5LIC)#^n z@ioOa6+ckitoW(o=Zaq`2KoI2cG4B2id;y=_-sWkp5pV`eu@VvPEqKx&mSKLdn zyP|xbM!I~T2Igw~aK*8T2PhUO9;P@=@fby}Fl2oVil-=p8rN~vJv@hS!foc36 z3v8#@S+T3)-iq?Q9r*@nI9G9$;#fs4NTt0a74h*cdcN{~81ejlh4-5{5%;ixM9fh- zmcwJBAa3uH52sB~$|HYghJj)S<$5v<6#ZP3KatPjurKd{k#9PmACNBP@K4Gi-z1hp zc(U4Gpy65~%E|X;q_1U|?aQrSTGdcg48*Ucf)$<*RE!2E7e50RIl0C4^-eA$a$ES3 zLx0t6Esy+&(pm=Vr<7K+Ic++YICJ9gwO!l*{O8=lG!Zva(E~5vU_{W*`Af%q>&0jO zah}pm#bM{e>NMvjNiqMtd?z=`cQf*R)J(q18s+2n_SMbg`-A55l5)_YFL2Fyj%}hN zSsT;Y$;UzWHac=M27uQA$ARr5K8(XF1FzEyzpdq?ZqIpXFCfD6GwlRiBXgUn_gSRb z^$z^6GsLe%szXea+$(M2qv%-a^Q>ciZ9S-a&h~r6ufr3BOkcUgs0o z8%U2jFOBc3Yj_Vp$i!c60l-6-FQukBL>t@xEA?1r}_JA3o=!falz)4E7}(vwP|%)#)m%+uh|?+ zziXS*K6Cy41)&eq0=IqSF8c(>ye+GiT{0nW%YgLHHpI8=lYY-f?%8=;($c^B`@g;# zxW!37;gBU;R-FC%hR?RFJA2!f4qw(+o_oLB*Xeuo=Y8{_FPV4WN1=1>d;fF3-gP=; zdSf4Q`JOX#E5SKfH<&f8@Ws&a(i}KI~4D{qYalhj$_> zC3GMDryhk;ZjfqW&^~1CL3Rq-hxA8AB9+>QD-aOv!*p~o{ZO<4+J`SAGJOdwLi>>M zM(wIQhk*H2`;d}o(G3Vg`%qq&L%!}l%vER~zK>YZKHNluHwIZWcp&}1>v1E}sC`(B zIE>gfmY_e#pRA#M$WiHVE&fsaa3kxu4q2dmNIyiARQu4>7%~!Y!!t}U66Je3Xdjwj zW|ZPR&^|Q54jl`ZIH@Bt-W5aCK3oQ0Mm7HZ4Ttm%b$QDp1lortm>KQJwj7|r4$+GkJWzw3qc_piK^p8Dy@+M=HP|!C z_npu_G^XNCC*CVX`|w4!O2nUjkWN2FBud>)Xdf~dr1oJMPCB#?*)fCz(LXXgO~ZJD zopBse_=Z`!4DCZo!HD+ZC{%04du}KCX`K`WXdilgzLf1QN;7JH3GG7;mTDi;aK;Z% zn1|Mo5}Jkpv=84$Q>lH(_s7xm@ekUE@-7(_i6YrzuOgft-n={PkG4|#@N=|LwGXv` zY9DIDRQu3`nrI(B#;TfVAIk0u*$M4KQ?_fA52esPbT z0~l23phfwH4cdqANpN6P6g(eKO()#n3)9;mjDH!l->{%6EvJfl8@;C~t9~efU%6 zhxVaK&x`HDFtiViHsQ$FajXxUADi?svGoi?`;g*hf$Z@yKBZCn(A-M$WBe73+J`3p zq}ZQXKeP```sCP8SsvPl6hsSTA0B&{!wBs|lYeS#CdPo;ha4PgAO4By&^{D4MfR*1 zuPbUF@=_A*!)`PP?L%H8qJ78@V`?9Mf*M5oFoj)$_TeZDS&-U?^JoLwhhIq!(LUs* zU{2D#$Zee@39@lGN&E#bCG5` zwGRh+VO-B5Q3>tCAEPr}KgO7d_F)5Z#N^%$?L!7|Gl>o1h(Y_%j9|zJ7()9{X9Q|w z$5TQy-xW)ujP~LEG$lfr&^}~U!3;APG$Xdjvjt|G=?8K`||!oK#Q2``ELFYAN$VYZxeOZ#wyL_quS7wjyw z57~lX_F6Ya548_zLbMOlIXuulG!f7~uHpnYf}pnb?6C#ijCBA|W9 z$4hR0Y-)MJbux-!o~@EGh4vxCY?OqdeaP@cFYIX_RwE+zFE$X`hYWDcw{i@ieR!IL zp?%1kA_HOy+J`GpfESX6jrQTKi0Hw)4z&+?a(mp(HbVQ5wVL`L^a?@ykiUmO`;bwp zamf1?CK%NXp(2Xr_H;ji-@6vRka!A>W^fL+$NNrc05l4>qad{pX#v`Y%ULnB52GFRS5>i5B9CVAPz1KU9?^a{{;U?{a-dUF+n!`F7Hq$nF;gE=prhV8u zi-tIrC!!T;ANB6MTEdyJ({awzHhbX?u{&sQOYhE?NP6ekBHH`dE8jJC78;wj)eHA@ zBK&1BZCmdk8CzjCsgK(idECcTyzvq=jLzjN(!NJK?&I!0^d5+~F*y2S!4M=EV{8z= z4$a4reJW~o|LV3s50O_Rf}hAa^$V-0GT5G7S&xV(8ChD>;JE8e{5yFE%Mw;)c2Vlh(MubOXjvH;0 zfBSEee``kBtyu-QvsStw;tb2ebjfw7QnxBU>WRr=Ceh)l!=-K{Iyk%FA4ojc_{R`= zr7#}Q$nilKA_#;F#5&H%qh}t`wypHoAzVp0jJ7N)g=oSmX?`S5A}6M2U(Cd=oro#8Q!aR*zK7cZr_KJ0a;jmjMef`J%I8+xPLg7 z4LyNJ!H-5yY6>Hwj6lN(DQG0t%6EgtLD$2=-QwY{XkTvF z9eP-RS^|lseP)O2-MGlOFtHT)J6vuoi;n#T$^X73$BW9a9=mQ5mLp^3wJhapZ3%Ko zO<8%KQ#;)(n*J|ekX*m8wic_WXUYh2@itb*E|o>)mDN}=Sy?S>OYwtV)1}Efzbd)* zXj9AA-}{>PhZb&3)~aQ!$Ny#vmgf~!Rbf44F_xXfELL(ZsFcN@TvcCKc+BB7)$@Sm zr3)&H*`7)a%Hk4Ph3%~jEw7YivL#f8!NwVyxiGP~RG0gEi}TI$WPd?2*33d(zzqKm z7A7awmddiz(uG9}CSpRDSC&*lG^T#Htw>IEcQ-FP#*L}0uB5EC!7RQ`^ak;=#Lhn3 zmDSKls4gkv=MYxP+N+Zj_qUc;DJLxwwx11Tr*ylXvL$QY=%fQ9MO)wc;-oZ&Q3wQPzaOP6%Jy zXfI2#ui`Mpd_``S!F+QSs}xUF%qPR&>)?Oe#x3^-sy%hT?&QL5; ztW`WyQPw)3+!Gq+kE66BYZ`zNTp|p|6#1Jj!}6mt@MI0IQ2e>#Zxp!=9P>Y}_>v-j z&}2L$?gfV{PEZt1KhldeT&K8F@gl{m6@Rbzfa24NZz^tA3}Aw@-cE{r6^AQMP!#Sw z@|9|Mq2if}``|q+?Tl8Oq&P#dRPjfO=PRyJ{GH-UiklR_R20rP?01itdIl+uQ#?#j zINZoLU&G53g`aXuFUrfBS>%&7vp`uZ3zW68Kv^pbl(n)z;qC&3y9<0? z?FnZW;f)N#?nfFgYiAMv8N+C2D(v?5ZfQn@~PS!vhuhW}9{= zC{9rX)kfmw{*3fl8m?7rP~@gSEWcdwOvSSmuU5QH@i&UMDBh)bucF+qVeeTDzpwa_ z;^&J0ROCBz*564{?&k>0T0$V-l}rB=rzny~#Q2$t^7}c$xQy|;2!6^}`vA#@+mhhN zn!hu{AUb&C`?a{B5cl#qnk_toxA8PN^x`n&;s)S9P7QyC7B^DS12115BIxJ2q+`BI z#Ap8TT+$83f!mdnkAp6bZQW>pFC5IngW;JtJlpWfZUCKmp{euI_?FkUHxTx?hK%;u z7SCQW{9YM&9j+H28KBQNFRcMV&(D+&m~Z^0+;g6n*Q8zVy1w9`B9Zkn-mCX?_`Ndl zI!iIhw)%g8%o&w8T?)uc%92(4}S^grCo#=+g{wVheySPyd_G67 zqDK2Ub8Tr7zwr|^z~?uPpvi;qFPYz1j8blp>nuHf<3lLs@f#0CYEypWQD}q5Z#)MU zcg%0(280&BkzWODej~S>_V|qj^f%!*c3~`85kda)@9`TsO%wdaXJE8Ne&ZWxW~$F` z6w-muZ(IVyUzgwbPgqRw8?R^GKEJUy?fLvhJ`q^_#_sHa&u<*WruqEFUoztEAsh`|3_0T@*BJ3tYU9xkKZUXD~sPanaLKv@fQrY#&0|lP4oGUGTuJF@kzGK z=Qr|>wCnuF4VZTce&eO=q|a}h#%4C*H`Zdvzd65=`c6B|Z`{Bx`us+IMp*pDLwO#3 ze&e6nYM3S0ui?z}`Heqjs?Tq9G3+h#8!u$N zyTotIMafq9ja3{Bi{Hp6ZkyluI4idJjeMhE^Bbv>Ve=c8Fu%ob$mug|HJYYzmci~Hoviw!)oyxpJlqmZ{&5A#BV%+25o*L z*UKdF8%YmL;x{g%jXj&+_!ADJ$8V(4fX{D~dx^zw%xCv3e&aFhe@pzvaj+|UI}5*& zOZ>UFv&V0|o<%Kw;}bN!bNt4WXv*R@{+&fFeq#wcWbqsC<2kVSjSZ~Y;y3<|_FCaL zMws8?H-?zM6@DY%NVU#yJew`H`HjEj)VBGJxvbOXH}caWiQo7jbJ+aGzcYu;Z|uW% z>?VFA-*(#kMk+GwBEOM$odmz}3AV9Ce&ZjIb$9U_2e1b|zfsmJ*!)I$FAxbGiz<7+ zhV#>i-^h*Mm&b3%pgVCKjvK!O2ElK96Hykwu`^NC_94*?2R~w#{t3oc6$MB&RR{GC8FlZD!+zXl4?#k?%{%Y$O%3kIT2S z?pU)SHNFHmfgd{VvuGzNjbjg>&z+jhHoN08FJt$o<*>!>{t`lAaoKFOJHDOJF)zr^ zVWZsxgpJ9s;@LddaQ8sN(7e#eX1m>kI!UuH3}v&~ZoV2gIGe3@57yuWuogLXZ8XL2 z9ZeD2_3AFQ>5X=&m5qG)-W2muScQoQ?oZ1-YfXgN$5v(;|MA;9cC;eMbag0Ql3$NOoxPEahhG^_a>ttRz`VPg zA&Rwl@56UJ`K_Gih@3CsgaL&U2JFUoe8cNUM5e)-Z-nAF#e)?K6lW;TR-C6;ttgx@ z*gsvvs}(O-yk7ApMd5@Y|3eyHulS1Mc17WYA)jyvfWip_3MULGoG_qp!hpgF0}3Y$ zD4Z~$aKeDX2?Giz3@Ds1pm4%~!U+QkCk!Z@Fkn8upKv^d69yDc7*IH2K;eV|g%bu8 zP8d))VL;)80fiF=6iygWIAK8HgaL&U1{6*hP&i>g;e-K&69yDc7*IH2K;eV|g%bu8 zP8d))VL;)80fiF=6iygWIAOpQm~!l&aKeDX2?Giz3@Ds1pm4%~!U+QkCk!|omlVrS zP@JyFU)dO6r?^t_BE_o}f3Ns};?s(6DsEQ{V1m=0aKeD{yCP6HVZaHRE}Srgg%bu8 zP8d))VL;)80fiF=6iygWIAK8HgaL&U1{6*hP&i>g;e-K&69yDc7*IH2K;eV|g%bu8 zP8d))VL;)80fiF=6iygWIAK8HgaL&U1{6*hP&i>g;e-J<;`=$rLpWhT;e-K&69yDc z7*IH2K;eV|g%bu8P8d))VL;)80fiF=6iygWIAK8HgaL&U1{6*hP&i>g;e-L#;FigD z$$ksK`!)QO;_HeZD}JRYdXUH;$32SWMfVXnnqkZV*+&6*w5As+E+FCue$jaZF4Xul z6wlXm(RD=nWg36I;vI^AR^(d?*2mW$L~%6%9gE93w$A05%N z`w`!CAl#Yp`1sf*&Qe0Z&gLt59~9qzvJxm2@|no7q%*t(bH?+zqkQ~KWEs0&`+0)rknSiPo^6Jw;vi?xb6(mH5P>P@z(4)??*O-HJE!y{{mkH?Q8#>D46d7hwf`c?79yjD9 z^M6=g-ssVz<8f%a?FWF{F$bxlpH!IOAgQ+7#Gq)q1ytMZ!h-#8U0vV|SXi-UbN6Kn zZwW!sZDPTvAG!0X;kJ0oyUT8xFmKEC%l6wcVA&@dKB@Q_I7`6~R|Vr+4o$y!vvW4p z+(uMT&&}QMo(W5!==S0Z%_+M5MHJlvRCGICC~5L#$c%Z&y#WJ~S%Q(hidS(X2hP)A z%qb|8EkY_dPiNtDfb(<^B7=3v>}$GRjFjLR%$49gjbJDez7EF0dD;&ZHR3!SjSNYg zr{`hP=R6%llSTNK%z2uJQf{yUP4GBRzd|vO^K>{;n{u8GK^r{I6Q2rq%z4^Io4%&o z^B6Ci^VEe#RMU;ykTvBzWiVDaPa?pinr>93OK_gn!Dx$|ryx3Fah`sG3N1}H`SJQ| zYP$7?#RTW+64vc=p3-o3EY8zLG}GcdbwFP%&eP#+i_dv_gh8M4^ko^E8gHO>=%?(sQKGTuJt=^hS&&w09;?cQZgxBo>` z6P%|%aJ+oZ)A4L(6VB7|81iqCUr^e?zJ;hf0oF{76 z?JDQ#U7GSaPc;m-$a(6*lkRJ}oyVE!bDpkeBYn;jzq(nRr_dCOB>BgN6ZO+p_ z7`8Z1PqBWB^E8C^EzZ;Htl#21tz&tM^Yjmns-@{x&0)1TPk&>&#d+d&mBe`(L4!8u zNobO`rrQ@ZX=}Ps3ThAMJPEVZ<2=2J4)~lWxtCa+r$g91i}OU?#}+wH{cw7G&eN?t z*%s$XWEw5b6X}#Y$$8=%0-N*19batD(~+DP7U$`8o&$^XBxFsC^K>`Mx59b)jPuIk zJc))}E1W0ph}k;l>3rs}IZqdHYTKMAVbj^1CvGd1#Cdv`V{dbw-ewM)^F#r#-Nktl zy0E3`Mup{FwJ5-NwPOIZt2U6hPCh2vzoe3+Ja1 z=V=4-FOQRk>BMn3ZhScmg7Xwcg2j3I3Te%9o>n12HQjoqz1TaAYwBVjp|-S_Jqw@;0R8wq2chTEq`!;MSLxOH8>0J`FSW;ER9A)*LJ|CwkKH^#)s_60!0 z?Nf{xk4R;khFjSA-jSoi3360QBXSf{rep;S^$8C|p6Xg6F6ZB?;TGq6j+Hp5+eYM- z0)HIP$YB8#zJX6AoGIR!1m^<}}<)iRpeFv+X(>Yq*)VHq~$& zh*~@iH~RB&K*Q}wfH>S4&=sT1#;T~%A6|Hbi*9`18+(jM`#N4B%W+(A3&yn_2f8$<2i%TTK;F5d%$ z-nRNeZ{ZyXy`|?u=q(#uHaDEPH?-d339Ywo5L*k1a2u4~MB;67SmOE`r8gtf76idf z6yMr6C-~OS2))60F02LOCYaEDOICq1@^4FW!y*SaP|OB`2up%#SYV*13WxZ{s&MJe ztHK5Uoy0ru*KD5nWND@EN-nOxp%k*Rg@q+G3nBj`>^k#*&r^+S(~B#tFDr5OaJ{%f z%%PH#L}jftO}HHsO`F~v3q>T35}DQT8TGOS5Qd9Wx$HX2 zRebJ0ikkPe)#4IDbV~93b~WJ2mefM2t+0OHf`w2Z`G+UMZ$`5tRnZ ztBdO9LG2H-v8*(1+6>)7OvU;N=sCs{-QnzPqu}i%1+NJQ&-+c1Ppf=Noe+(m9yufR z$0=uqSA|vw&kCI9PKpi;PfZU`OFKnG-{N~DPmjOx`!3}4MqqU!!hbSn)SjsM)(7pv zR{}W)3us{@2yd~BNra_MTChqtvBWM;Ya*7tv7uC#5lBRy_s;wg&D75Q?D`Oj9oTJbtXa-Nuei{f31 z_bRSed{*&&#g7y}SNx|U->K7HSH-xZr}eh4hKDM0ZxrSqujpyLP17*ny)*qJ#X3c9 zAH#V0Sp;~xhEv#%NXz`n4>ezB<^y@tJ0IUn6Rz=xblbkY7+!H0ZgD%yvCKnmmf?A% z8;Qey+v+{}4Mx1pnagWI501}CUK`+b*5L^8qEzRl9f`1QZw%~RfO$pE9NWTrF|G7n zG(74ag01HC;CNknwwd*F+(Rz1B0TQ`q}la8+ShSbAd&Sl-m90_vsVUQ=j;xS6Q@U= zm&WVgwl^6!7-SWDxJ4!G@h4!f47|>-k%{>{=cS#82;1H)%U(OAdF{IveypMjcPi|0u6mAj(h>0kLBidP zeEEpnksjPud_eHCz;m9x#$3!5Xx}?tCZLyZ=;&diK&(u-9dR+o4$m{>%$?w3=EbGL z1Q(NfaPEl{PINAJuXyl8Xu)+7O*n8XYY&yrRmmQ5uR-H7KgOv27#CJ!2VP_coL}%F z3y}(5$bD#%YhRLi zk=!BI4RX8P=6I2Dq&DS6jz$|iUgVEpamT#KO&AM{7r6oR#pXr6NQ26Y972B+Ex3QO zgzzFSLAs{}m&A+w1G2Qpi+mouSMmhlvC)@;uh<^CGcWzZG7j z%O3bzaB;T9=S5!0V2iv+*%Z>}MZQf_E%G8GII9*fawtxw&5In(WQ!MhKEti?A}66~ zJ}*+n+vi2z&LP-cyvX~})C4c`G`u@znzZt#f#+Qjm?Xk!ul*NxceDyg%{bM z_AOqd$Yoi)$TL{p;zd5iVYGOW$MV9nc#)4W-Qq>^x=P|j=Fp(cizF>PNehm&!X#d# za4Yw0Ex408j2r+2%!_$D$T5@((n< zb6Rk-Y0A=qdxu3WEx1G3A&VDzE6=0Fixj~}ixck$>Wt?b=?qLWlPD zx_yA>rbS-luTabG;zee#2fh~EYF2FXBDdqN3SK04;_Xdg!bZGEYQZj#Uxh(;;y4^P z{v#L!FY+&lvUrhvEzvA5@?s=(6GkLgl*ZPh9-9$a1Zy@U^8Zku&4}bO4Vw{pDbBXd zh+IW`U_^Raa7)mvW*L!2`)vYx=#DYkZ}KJr+Hbd`U8F*e8ATto-`GZXY_i%L+o^hR z{AQhvBZqBu_fIImv8nEOQG0Wb&S67U4=!+_lf!np2YT9XIc%nTkf;3ydLsv?P3-M^ z$7lT7VsD1vn5_4Px0?xvX@akm6c{#d%KR_9i7fm!ta@-Vg)Kcee22xgNr$YkkBLtlwqIOka-52U!}5lYiVwt2DrMNOa%Y$g@gY?uwF?g@0WqX($&jj% z2sczLtSSbUBfh+L(a0h7wL?mWjb_Y(nxcjwMa7i|R20>fBBH3Sq~ZXa&qe!{4XN6< zyf!{$Ug_eZy7D2z<3o-b5g$@sT{8rX73>#0q-a59QGF#iQA5h9iq?S5SciZ$Myy9% zX;DLw9WJjOQc_dhP*+saZ~!`Pw!i$=SZ4o)T5c`g_7huTHoB9^ez0x)u~v2)O}^0? ztxu=0WKl!$!g43U!un1~Wo>-2n!0-I12b{rxcETcMrTmyHC|p*7eBbJDt<^+aan08 z*mG0sYD&uL>ybI$Nb+@`Z*te=V;O%MYf00Mk7|3Orkni;X+LVRKYOC48-4=f6PG+u zCuzDhx|e|n*6hW~r*Zzq&2vR9B>pBuq@D>8G9GPOZWxC)EjKeC+O*uvIJ9ZGnQ{28 zwcI-3mt9P4F$ zUcF1;_sYQQOo6>PJ?gx)283;UU7_nmt_$t)C7@^T9QeI5@H&;S$9$gi(pDkDwl~nS z$7dDK-v7Ywm7$HLu$OJ#6Ec`cyBvPo-Wb?pKiNJMN!Ysqe%i~!L3b4z_m+3E5oQ{X z+Z4Tg%R$0vjw|#h%?A+oPvncMpTK_5kzirBFW>5KC!~4(eG-1WV6O#;>xs$7Ip{gI zjgDvygEJNR;)ownZdc@ec<#xms z8kV=;aI<;jj&<7x_LmBixI#ld*m`iN;)2bA`N7Hy3eLE7LdB}ehY^k(w|;Z#aYt=h z8Fddz`S6U)HJiIFE50SOAoyW44E?tG&~aNfZ_9PdZk#~eelXE(^UnzQ7$nZ_BD>|JYCtowwT#8NFq|{FgS|zGdC~ZCg5gIkEEG``y0ydFAuI zd5==V?ftDkGWu=Rn4o6tL+5Sg)pzD;H&r- z%IiFfCL^ICG&vUk!hO5liKvtiCt>PADCGu!h9;y8j<0JE?Qs*b2m@ zg;K5yrla0;ich8dD)VJTrgPW3lpC@b?__W)b%!r=1w28gT_ok2v$kmy z@k;r1_0i%&&S@Z|8 zosNYkIg#P1OHCEgmr+B+-?MV51QR?ZZnqmr(r=55$aq%_b;dv~gD;~R|Ne$U`i85C zB1}1v{UYa}+UQ!=?eml($QSYVtb7-Zi0q$c+7gNOWDk6vQV!eV^OV*w=<}2wXIWpr z?Jid2^OQO;a}%CY?qvP8NO5ltRxle1+9{zA;LV^e6Au~Gy%Ec)mF0FwV^bmvBgqPG8#KJNY>YT`(-c0CNxY&u@rJ+c4I-7ZS z+J1mQc4qWhR+Y?CirmxjXff0wI)$0<)v{fq_b}+|w_U`buithsPmRx0`aibX=P8}Q zijsLsktemHypDwn(SfJ517i?G57ukF`~5uc|tpFQ&R+y26ec8RA%;?TfQqB#Zx+rVN1WQl=WFWr4JdlcuLQ)eoMcN z3h@z(r}QD~w|GixSl;3(J;PzNcuM8G@GPFvlT5dGO1!Qj*95Y7Sp~Bn4a5$jL7S)4 zpAoix+W>aS)^BT|jXj&EbQ*`z<0+A`n;FS=BMmsYF}ZhJJf&V7F^i{kEc@Tmo|Rl6 z5{(?>Mr6;*H#jnue%lQ!YVnl*Les7Clp-qvsabeB6OpQj#Zwwe(-u#O+{lQ(y1$Z7KE4cSw_-A-ZX)6OM^YGPa?;DVRdHhZcx)aCYxbYwJbUVGMEt>X|K=%H~ z<+_o7AuZ4=&~XTYVeZ|S5;|S}uR?(mQPwzK6!TbBaCg>9sjAKFtK4@WP=O zcPkG3)ze>##HOMZfhRq^w#=ApI`Nbj?hxC6h6mRB`fY=0Z$s}aRvyUi8oP?&r#*W; zV;7_GfoHsM+=&#h!e>?AjZN(1;`a;3eM0r!E%(IxAkzuxRbdfE+U6R2J*PW8Z_{=^qHx!*{mz9(s1RQ@C$T4Vhdsc{t<}5cD zwGDSf#)!9FBr|rB9AUretS-&~w6Aj)cR;486pFOpJ9gEM)Z)?A-Mwo< z#xW_gGG>SQx)aM*hIuk{12f!XFh%wm=|>I9#i_tBOUtHYadQlOfs~V>b6~KoQ^#os zhr0r9ML!he6$*b>#wWW@2!hu|I8VH@2+U7iIa~9M)7jX$;Ba`w@#0|oNF1K#8~u}U z*qU#y{EEdZ%NA`j*BbLD$FfD3N1_dh4MxYnJ03^SsXuj10X(PTKs^3?&YcV2i8!F} zMkvJro1jS@>|2c$Q{7QS%%Huej#eZ5#&AaV(C+LHj&r;-C%N+4;G) zC+NI|k^36#H$#w^vYY5)|Jhu)#ILEfH4Bzj*Hl#&EoiDI$6s8liW(|%D{$hQvf^-# zpmqZhum)tng+%ox<11`fT3c3c{K!#SRt`TtA4TNGM62Bt%z&`#gkc|N{3%~gE^B1C zeUES$`#khAA*?OIwk4-=6MtY5gG0k73W2~7Sa zI6tDiR8$Z4TUA*h*+Agq6ihk%5T|f)X}z-uw78nONl2@%2R#mnCarlsU`b6`d7jgz zLH8e|L1*rJ&bJ{e$IA>tM>W;Z2jgDUm~15=k5=Q2TA`V5g^SAS%rvYju5W-KoJiqflplxB46O>ThCbaM$uaEfHCQkt`=s(cgK_*u<-0wR zbI5O4{7%O4PU0N4cu^(G&^4cp-|g^q1@Gy2j;WKx-<*m3jh={~rXB7l+m8s2&R~rn zp*T+QV8sH(8H%$N=P6bzE>t{Sakb**iq|XNr1(e0hZNTtj#VpX-8GX1uQZDT?kK!c#OX z+(UeepUE)rI3iwbE!XsOG%WkbB7UuguT|t4Ugp1B@lnMm6uB=b(_dG7n~3_iYM9%N zF#Z3CsGs*z9_@*U&rAR{sm&6Ti z;S>3LEFYn9{>VpGAiWjEFHO|L0x&b(Nu6C4fF!HdBUGF6bdyeOw z?id`NZH6DkQO8N3&P$tyFdmDXe2u4o@m-idT@dDUqCK{&2!~e&US}MhkrsKKw9@J= zKl9y;IrIaopy#bYnqBW**^Y1sSugAJ>Rk!HR|a0^AGq-2^r-XFPD9wX_W~v~?-8_z z+fTyYPvQ5#L*sy(Q6-{-)wt7fW2YfNwm_gf#0?_u%GEC z?eR9}*}GNChi}3tTB`a!{2! zy=dL$)btgbBi(Bc{U<*UrC7)%b13r>TvatV8awbchvT9KUvmml!Pgv*AqQWR3M0bT z^!M8>KuVBuM82-vyUZL3pNyddUvnHPYQ)z}LG~nFIeswt`|a{^IM^Bgl6B>}qm&!0 zMiV?;xf@Z;+i&+PB^mm96Q#P;}6)DuG|Y4FI!h`BMmBFb0qyu_?kh+ z7NgU_E8+8W<<`M$V!z!#!Dx%Ra(AGamag0k2`2cO+A(UP4#yr>xuOYvLyr zTUYKaG}GE|H^LtHe9f;I^!b|0*fgK7$-BC>-|lZ%kQz-= z(v>TrU5l?N`db!X^BSgGe9f0xvBlTClT*#&Yp!9ZEWYMy=C}BoeHpg+np1g}ExzW% z3|oB7r&+(n*W{;~tt+>Y^;>++b6DQuYyOtQXz?`<=7neRHA%^`b>(OYffW_EWYMNY_-MLEN0afU-N#JZ^YM3 zwfLHUerrLbXVs_T%Yx3bZX}?`A9!S!aBkw**SMC<( zu=$$rFo(_8{2Oz8Grnf3$JgX?4_jA`tEYBRSB`g`#D2TK;8?ZD*Q8YE?&51k*#n=i zNr~VjUAfP23c%N#hbnvDf%DTySMChtUmm{(L+ZqFIBt9;41%w@9#NLA+&_@kvaVcC z8km}7(#1$cO|zJqC&5~p#ngNS^`%)%P40@DW-&E?jY)9B94XBWpC-MKjY0qD+sfp$}OZu~_0pgSjY+5?hx=hzST zK#3cGa@ja?*q4NOTzEiGr3+8IF<4Xrn z1_^N-$dY)QgRj;I)A^<1688Vu;ZevObT(r8ehmWOH&uB1&!+4p(;J&3@O{TBb`LwE zVi!xvqE=l(z0U0!?wBp=b>a4!6jh2ORmBU+sx|OmsBPEAQQPS~Pn*4MVUAUolo@*9x5QCvooM#87;N5c z*U;D6wo&~KW$*aFXY^-z%%3UU2EXA z$4e|;r+X{rDITa;K*T${!xT$2zM6<1_v;iFYy3(LpQ$LkG}ymF(`CO?l)FLGf2;BL zDGDDA`Gt=L+@$gRWMMn_CWQ#viC~r@-vTmzU&Y~yqZRoIkm*M%9-}C{Uc}3NJhf$> z)yKS#As^@(!dvUA<#%0Euer~Y?>T7-W3nglrs8Oi=e#GA>4?CoOt=~JSr1xX8s~}4 zmzmKWzcAzclg|T4@MY%0@0EeqnE_kPY3q?tW9K^xq@YR`Q0JvBK-jMLUOZr(h&a~E zxzBzOm*eot!0X%vdvSWyd1Lr@cHJbbauk6~^`IIi~Tr zN72jI9~WwKys1YuA3)q%)C)I$*slEBN@92^9}lKu<3-<-=8}Yc_XMHNDJc)%2jDw`>5E^X{B5dQ0m3 z_nOtrdlH&?Td6qb$maz;PRKnAf_6ky&DVcvYAEn$NrDZ(+6?r5c z|LQ2DHsxQJ3@^ zs}XFA&%YA#hR?sciDiAgymMLB=U?s3vQ6~zQdKWccqhJI-dwcU=3h<4Nw@h|{4KIo z{?)Ol&EMBk#@pv#UCEaD{HsgZ?qt2Z)ScJMdl5}d@ULXEOXHe2Rjb>&I-`B&6Q zviMi$v5`Lisy{RP{44%8Zt<@!XGOcjzZ#8_t?;jeB4hEdRG|Uwz52#lO0P^;`U_cC>Hl<=xNvE&kR0EN}6z-sGrS z{Hv2WtQP<3Ri;~ddAzQY_*YppX!EbWWQ{ie>hCmZ^RG^)jXj%xHH*XO>E&%i2YmjO z+)FI})ns*a;mMq4jW zc8<37^4?(%n}78Xn`!f}2C*HxiGTGkHqg?`6Yk~L(#uQr^zwMuN${_pV;fuKUp;`V zyNiFdojvgRS68xPTQBcLq=SD|h$?%(i}TZne{~n~FONTuL3iRf95-HwX$JmP2niPd z>UE?w%fI5?vs>4+dwQpRg|An!O{gdBK2I6XiA{#Jv_E>`P;4-okaoYPWEY7QqMEdI zo-$r$?1wnpX@By<9b#nRrajQRGmQtbDJOg}DvbP-#U3=Qs&E*uO!~OX&oNF%xGCU+pcs(<&Jg#O(kw9oym(Z9<0?A z2Ow`Opx2+ZO-d^Mwv-_T9DWMw$U_s8KW!_hwuhb_V8%K9>V z{YGrw8h|>+Fn@9^E9QHZK{!C?BIM!_Ww2Af@%;*qn4T~uZc<;!%#{i7_~I| zpqM5RP)$pVhr5Ai*7dM(H|(Z5KHM%h><;~|MAP_A&`k_eD3E~x+`uBI4tw~_@l^`yYnmsUb9veMtnuc-}{lx$sEt*{uI=l(x??*Si0 z^|g=BX0uB=RW}HM5F$;$&_PitiXfm=#Tr5igc4$UUqnU4ioN&Vd+&wb6qGI?s308y zDVG29+&Qy*_mTzQ@7uob|L1%%dFI@6=G=SFEi*fF=3Fa12Vwjs=Q70E6a?~v{?S9G z=8XsDWMM(+Dd~kJx$ws;%~Y;-j;CEt?qn9_|MeJZjvJY@Kxmk=ag!$%=2p;5MN_PF zwkV^fWfx>-=NH-05<>$e=BZ{bh0L+ztNpXIYI<>Aabb2=dO-$VMPbGK?9AMpT%^Ft z8I!Z&LYgxbJ$rJ-_`=Rs=H!gR!fXtn+`{zCvJ8xk>};IIlf}){ISsuZyh&>GU~y`A zp-#z|43)@(;o$PdU63=fIA8Z&{oh+!mG9_uA2Z&7IvZ~^`zAEH#&d1t4EJ@6fcEd{ zbJol$u);_cgCi@D78y9=!M~#qS}Mv#+tS`4K4?eJ$neSxjemBui1;qxg(2IPF?IM( zkjQta#KuH0PbR{rqP?Vd5mdi;AlFyu0fPLk!t<4n1aQ32d4k1)R|{S*c%R@if-eg4 zl^FGXDY#T{tstM>kk6-3#D8L+*>=dsqa4~}hTunn3k81>JS50q50v)_wi4_nsC>}C zpCQSmf@{e&JVm?ij6>@(X=|5LHg9^petw8txgp9n4yTrapw(2ECtly5AU zLPVRl5>)H3LiPgTUrGd>E|@P^BzUdh4TARyJ}CHt;46Y}5|RI>LVqcU=|`0V-Cd!Y zS5YoLT4MQ91=|RoDyZgD@Xr={pdcTQ^1QKvlLhky`K*-u8G?LJO8P-TJ|iW~H)BLP zJ`g_>oG-Xo5ZxcoxP#>dspOsd?8L=~=kpO-1RUuSh5xVnvej}``akZ<_V47!Hh~Q& z8{3fEaO}K?a5naprRcxT=J19hLHA#J6crnWw&%S8K=~V?t5}y~ch13~H5r}00Ux`{ z=J2M1c8-t`8 z5%j~tln~H23&+kmR8a|i9JkKq@NPzeuJ2P#AIG~>z9(?(oI@QqLf`ya?7|1by1u2* z$NI6pFi}9?D>$aUH0<0)H$Y594p`a9MIY~3k#Atz zg7R$+P{Djp?a}2w=Ev5hM|a!r?f7fNZb()chWN47d(-uxYiz`Q{lQL(>P^9&XHYclw?`kvhjk+8mJAE20;@7cwQ{7?Cw z@x_0@_iQrr{=2?s>nR+J{l%Cbn(rBx&(vany@*bv`JP?FbA!HTAM)I=zGuIp^|aVu zr;^mxYHfi=*L}}!Cw;8gU-Zlh`kpC!2Yt`(V9EZge9xXoQ3Jkb7qXH;-!m1_?7zwP zY!^gX+fnnTxWtrJ|UmA}@)`<~I!K=VEO zjbvEgv+2y}U-CU;(4=Gdo^_@%j^TUuAv4x|&u(E?(|ph9uAuv#@m&vjJ~+K@7WtPqvm_okNIo9XUe@)^F31@kNR4zcr|9#(S6Uj zuyKg**<7mBea}=h!~a9RXRo0GLEkeqmuS9cjafa-_v|DZLDXX}{XF?`RyV1CDp z{gp`#$Mik>m3ivEXAF)M68md9YoYs|sVI-S@7Wwm{5ScYeMy`BYrbbHRGYI_>(jJV zSl_c3kjsCQ@7ZK#T#N5n8nSHm4%)}?J-Y$&{^TN<)JoJA@xY zKDz84%j@h9q*_2bNO8&eOvtm;T2yC>7ljX&63)^LI?68IS$khImz zQqRu9sSz1HD|BLeYYIRg#ui9Yd8s7%=ZqebsStKsYcWFparnyopK$ncVmsi?8;t%x z?(Ox39mmV%t)J{UsRbf;wLmPddLCbjI;`tG!IRkD<7(-t-_DNeEyl_N z_>5ug)xzBISY$OTqX;fA@aLK^4(?%-r;fv##ko`Riwm;T^NZl}qJpu(VHQW?0G6B0 zbzYTcO>iMs+XIJj+DhS>R#Jq(Yj7aTDC5Ge>65#6%~0#T{^K7-Um|$UO-hFo5?$=Z zF`S*_MQ3{}!BHtMqhLH*4h@u@m25|@Q>#2nV}|;P<>aY_q1mADF3Xx)jHq{kK$Zbd zv|L%|bZSlx9SQT)dY1qAO)1|R-EWHTOr4GQYkdUUXF;@TUG>qnx0IA5Py&| zUA@Z(o+fl(!2yD!1TPj;zEP0R6S`RNYQgIT?-NwMQILO8XyqFP`b(jg3a%AYzER*S z-zcE+jRLB5A%SXLNT6C55~$XN1gdo*ftCCP0lZ%DpZHw1J(O=0?4o?5fd9njvhDIu zd@kD#|5fq1?!$u%j=$#w-xHiCxJq!Vpv8B~kWUaik%(u8CkZwq;)Q-!;h!aRf5Cy0 zuGWi$o@}8D1#3jkiPv?Vq~9*-cMD?r3Gp3L^C-$uPtqOVA@y7X>3pcia&{FwU6Akm zna-zn#ES&e1v3Tt1dsemK{bDZzD{U7>#-v01oH=}_CDUp_^GUcT*G zeRbcauOWv%n(v%H0s8bl?bw2-nZbGxa>+RY7#JTBj_%^ju83uft8e?YcuyywZ9d>wc zyzbTh6Q&Qaa$UEr-WoA!(bk9t)+vLQuHSLW^Vsj7HNa~9@lNac)r`5dbK=ZNZ#=T2 z)&1)ZMortjbI{Do2Uw|ZZFkLFy~9({b7$+BuC8r%wvGAgw?F@S8*#i2V&{3KJLgn9 z(Qo|DXDZ5ePMdk%&g&~)7|?5Ho%=VgJh0QMn6Pu^%(gpQ-(R+K-b~j6Z)|tPxbC2a zw4H5YTs@uxz4~Be+6VnUTIs&G@qozZJui^!xwp=%A8q&E_|cZ#w_2Z|cGK3>o!5u8 zd>ftIZof!Z1PAhiIE<95V@Zw z=Yq!R&=3(>hta;^lC>JW2`*WeKu0hfSbvDP5A$DIBXzZlioA{*?!Z5IU_AzoCz7}S z-W#CB<^BS>zyoUt&-jYW0(D$xD!BB(;w%ys>3Q0{4+qgtBTIN-Q81cOHQ<58bStI@ z{zal7v6OdPaZ#QpqT7RxXZ##Q|0+UqL`y6FbSik>^Nk`S;cG@EFSvQCo9+FI1P?44q26lzWAv~2V8k~iqfr*k8ljEnE3$R;*fuYP)&Ri{hrQl+R743&kW7{;#IfL+xMc@Kt0dSLNw zVElgkg9nyVzmp+{=wCJ&8Sf@}x{y)vlUUH+LdM0{F!M8ntQWtFrtuRg+*inCs{tHCttc0we|^DH6{1z)fyHB5y_z-{5>3+Ga+)jtF|yBB z6$2d+|0n6;Lc`T7=4_OE8KhN}n_CSYM{ddkt2t_5+xvE6KVwO4? zK@)pjJw||H^e;wUs-K>3)p@&toKQc#z^e0((-Z2ams)k+6)Gy8uD^BOi#`(&(K0Sx zt%LWzkO}qE$K_a9eUYn;MzpLKUrgZ-<=n)0c3(vQqLm_AHjRIde1$u%+4VFs2 zz2kdP)w23rk}9HQpZNJecwq5{G@@ny`stIQYK5peJH8(qeYKoBB%UE;5&i2WRo`Lp zOW1$DZ{UJZM9Wd}bjpSYR!>!eAgZzz6Op9&`j4=kJC z(|0DV01vFM6u-BR&p8LJU`dZaj;y#RlIj!tLa&Pc^&C}s@sA!@ zB&g~jPlX4TO?!POBV&4CorBV0$XhWycn`u-?8ZyE`r;qBxAZNgC_J!uHKQsOE)gDB zb~{G;u4IJ}{foj8Eu(yNlBNe1FB1_hQ+*4VH9WBFS`75Xv1stXnxga#^PK|Z>WdRq zQOEc$raU~b>;X5ycRBNi2bN9e`;sV+)fa8L%-4na!2>H^wfQucj~3_Zi%BZsdY5k# zCE$U@61ZDF>hjU`pV7al!rk&om(R~U;ell*yy)_!FagoO?1VR6K8EI`2bP`iq02`n za7O>K6TWo$iYWmPEIXHl2tG3e>RBpf)5bQ{11Rs}`X7n!- zw0RnB1`n(WiY~KaIIELTs*g9z5HVp3BVrvcTw(ZSxsu_uxPy{U_X&lwAwRQlKWAHzO)2nVVFh|;BE!Xf$> zXFiuJi7Nuq1B;!*PJ=* zL$=cOsu`qQt~yOn7>5073z@nXBh3?O|IfiO9I$R{9{mH3eDf%Gd-J&IkfSBrLQV7? z4jt*+j`Zj|n>V@=!tA||!m!bIIdq(lK9bRQJ9Ir?7xM3E9?#6^fK}%s3f$Y=U5bRd z%(8`R7<9Tu;@+8=a$9MG<+=;^!*s$L>AH-E7a@H(_LST_%Qeb%A`5W?=&P}}ydD2s zqg{0;A@M^T^P98O9heJU7r7Fsc@OrjOuQfeTx0A+u94dYd+PJ3sOw@|XCV^CGqHr` zzr;>lf&^M8mG*aCYA61Vgu_hCM?g8GOdgK=jFEK1xOf*z11LyyRLAl zMsUx1*Plugy3*~0EJ%#Q-nwW?zU3NgC#G^4T~~%pRDoNDJ=JF?Hlk&pM8c!kTV2bt zjkBxfp7o)>%@s&^0H&LSy=}y8ed_EV)^`8Mw#}?|j|%6Mk8$uk*{)%cv)=T3+qy=u zTy0$=sewI(pFOsBxz2z!xJONL;qvZcSVHd6>yo1WGyZCItyuU+;U_~wctZ6?LF$}n zyF?*A7t^DBuGm=HLyBHi(eXA{IZRZ)1jtT-C2StROlW-LvKlFIqb+d!@<9tI_= z1Jt@jNBAo$hck$<`1M^4TzyQBHSplEW;>`kPHTEvs-C~dos2ZvO_ysGB8U37)`c+g zZkXN6_%Y zBT&?B&3e`EoP*3?#c(n=`;-ydDR1hhycswJR|^z0LcLg|G{d(MpT_R8E+RaS-EEcn zAK}64b~^qCHw1&^DFd@;+S#_T$kXL+v*ktr)TZ7;s3Z1fdvh*?wb7+$4Y&Q);FtmR`el@77Y-=S%Ph*B znpbH3vs&tujEPeVE`z5|hrFqI*&VVo#^qjybr_Y4rtOe4NGRoGGCrfYurN0xFFh|K zwo42)Uc7~M3OE~v^%<^r%@+QeRolBPa@*o_4Y&~IpLx~o`z?7;_$4{?M?ACQt0wD zAa<1G!Jb|!xvtG_={bqyV9yD*P&A>Po!HqU)X7Xt_0%VH5Iv`QdXhx0N_}UW+f=w| z;%X7;9>aef@eg7AVioe7h!Z@GRT^a?dV72}oKA30=%{jv za3>}!O%bpYbBJ({cX>|afy>i^fRd?rfE~T=rX451(hYO)Q}sXYvYJ0Kcl;E_VS>LC zywB*F6yo7Tud(BGGdP)z%dx|2sW49nt(BEs20zY%g1o6#e!t?Joa_QbY&ts^vA6yU z*P$(%kWK%&g6u*DODl$VU6;-(P#e}ToiG*8m=F|gYB7B75W+1({s$$d;7&cn+m6ee z!ZnYvsJiyFMC-p6L@>m8Fm#qX_3u~|e$pjsMOK(BJFgJ4BkD3>(2#S2o`CsN3v*#( zxRe!U!>25JN_N5c?7Yl!>)i84C-?8vBe_?{&K)}?cTVfnt5aI%Zpm#5vL|OF$Xwgx zOZ$!(%2IUb)nOben>iu5AiE@&nIw1a(W6_hUY93#n39=ad`2dm7qiPcOz8@`XhQLn zaljm;=j4}k?NFHCA*)k&rqH+@FjJi|A)_D*2^j^M6V8DCk{;O|rks+KpWI=5R%u2- zPKVCP9WLmS+#x4#Y6m#tfa{{su!Vw`cf(dRR4 zEJ3&=BBh?mAk9B zL#7Y8p#R|XQOKbnm+J;&@!+!DA}fDbLGILoe=8T+$y3K;0;nZcpsG&DycoK=ZT={G zD#|LHnmz&ZhYH9Dk5YuMJKo~8ne4&J6ouih>7l_4$7dH|WMtFkR{zs38(o-PPtbx4O?w62yP4u-$T-iaSkLH~z6oO@E=%a$&pXOH+B?EK(mTvM zJR!Aj7bwZ#9i`>slQvI}b2<#QyzzC0Mn}YW8$>p8o#67h6J3p6C%Kxqn!1`rq~K{# z=%yz`T6_M|xo-T1(Kk1KY3Q39zX7(ZoGU@t-CvkU&kLMz{0&;>%@D)_MAOM)8(cMAR?7>Dl6 z{F(^16Xg1POdlwCkzkHsiQqMYcL+Wq_=eze!5;+o2y)m^e_g>d1qTaWBIv|3d`9TE z1(yqM65K23!tkQrdV*Yci}a;}d=pQa>xvQiH9nDFeiPpk14rO;gjdkFR>vc5tO5gab*mkXUC zm?Py!8w8p1eXi)9*gDJBe-Ai4?#S)Rs1NyI6>v>hVvQ=&9`>c z(^asyU?0JA1qTa`5~Mp8&*KX|VyPhgfJoz|gTfmH)%6SM4+{OL;4^|R2&%Q>A@{D( zd{;<)%LG>oelPg5pyTt+*NBwo?HrMB5Q*wK2uu;Wm0$sWC*`AU@fa7$$U%W*pKETtoU#TIqso!4>i z(f-dnw>N>UV79;=cvl?j8%(dZ7Whv&++wKBlp~K@YwWlz9ak<5GG@LUr_RPXiCcT@ zxNKQ{uycDe*`Ak9#4%;KGrx4~P8o1$aSXrD2~9SK$GJ$?w=mhVdZJ@dAN!Z1ZxW83 zb8u+Q#(i^zV+@T~tsPUY4<^sKwaAr&r{^09L%j+)=F4;^->-v^MAKQuLql2YW-;Z!iee4h1-hjYaxSw)1^0?0xbmaCX)$RlTt;hk?Ho2K) zjg?~p^X2w6cD;OSwfdq;f%5%;V^l96ptgn3r}urw7DTPtaT9~@Fp%g&I)7a{F(6W+&`#6Hl5HuFb#%5yJYb{CwgLAxfr8_Z*R5pX5z_ciQ}8J}ie}VL zA>W5Gvh^ft<=Fs(O%om=AG@Yb{XW*q^C|n8V@MqC#-5Db*%Eo6DKN{k;h*yS$L(XZ zr_+9Y9HRr-uG1V^YhU&^r~LwaBrT<^w4>Hs>OLTuJZ@$`bOg2bXMc41TQbj)Ee+Vm zA+++d{r@B7Xa97{G0o8j%;#|}<>%!qnLKV<`BlHIrTn`oC*@1#v25(eeH?=JL|&RY z#hJ$cNbf_`Hwq$MYX+N(G^QupRN%j&g%?QV0n3YY&3rbS2}pOUV<$>EkUq^xa4;DM zNXK93_W#p*t#9GjEYj5k{XgykOp49a%nF9f`^yQqPRzsA!gWew8Z3hEPsZc=<&MHd z+tnknKa(On*TcMShE#U-YJ8zesuP0?t-BGd?;4tz%cMxp$CP>iXS*(FT&0rgJcVl) zKHTYwuIRoQ*DhCXsxMd(`1->A8f+Z-f}5wh zM^pJLO(JnzH_{vV0cBiKpWqA+kKIMEp!Y;&)_O}&)I{&8QGC9bFcenxc50}eHQJv7 zc{@vvkqH}6OmF8{y8uxMiHdAwlW_^}!p7dtO>9zq3gqn)dlr=1F$eiGFm?|9@pqZ3 z8-`h5m?qWRBWg4A<^v^fuV|-!YfxS9X+lOO@UfxybRnY>zC>NTy@iZRXoxoPo*`tt zggh4QOd%U3>_Qd2X9<~@@G~>&BV^Nr#<&si_7xJJ0_}l;qg>weqB`TWgdfnQy@O+T zOsls-Q+tO*lXT-#poH7e=-%^VSTWEM2}5y<vDK0Zu-9S#@ zr$F9!oSwi>fxPbu6_vmz*xvV|`>T!_m#~Uiy)UHwDUkPr`uq?9p8_TPNZ}9V+{6Sv zMfQFXLo4A^poAtQze?JTA3yjMC}9Pgbxsne8hjRza3zg9KfaG5+a$b$UhZ8GeW@bt zPl3FPB_sP&Any{Xfc+_ucd6vtJK+(kT2?SMr^?gj^<5M7;-_v&wrXMdp1?sB!y?uw6KRyMrr;$k=jig8x4nm)!Ox{R-<<-bVM|yTpO_WJad$s_}*2iue6vFufkf3IN z_Cht7F@11cUggjj&n?*Z@F~#us8!;8jPN*bOIOq)Nchy;jZc9{V2t}Vvm@eDAlrhG zzFXL0_!LNb1af4>y^&O(*a!7Y@Sf$0N<_c#jb>-Tr$8jADvynWPl0UO>l=xTz4#R9 zLX?i50>$#64TPoGjhA}yDbQpzjqf}5BYXS`74E%A(;@pu3g6VZJM9dwdGCO4WLd?|!y2J_WJ|+yq}9 z^TVe=Hl6QlM0tD)WYcB7EzA#}0#zY@&gi};D1c9aZc+*O6sSHci%)@A0`)0S3wCXM z3Pcs^Q=pa16Q2Uv3HTI<%Dng#$WFkgK=-f~_!P)az^6br@DzLsWGCQLpxb#B!lyuX zF8CBE_5-M=B4yLYHqAmQx{ggh=+OKW$cs;b<{-hho7YNw3Pgf7zneD0r$8$dU1r5{ zRwtoUCE*f+s&OC*ebR0(J_X`T(1f#&7oP&LahrTbTj5h6=4$8P6f)|hM5|5?azQX= zCN*_&8c@9(9jpzGy^$Q~Op3 z3Z%Y8apA*n^-?e@@&$CRW=qjN9#;~Igip@ApF&IX+fYz{autkjCEtjDuH=yzH_-bS zW~n;(BIr&?xm;02$R;WwqTxG`@o=H5sM9fMq8dgtT+Wn@OyLLQQTS?T1_;luOxa7B zl!yj5GsVME6}c9N-pHNmKc9GcBbPuy<9bo8<6^RJ*ta zJ}`0n<~u_EDRC#XRWybH>>kzLk&m;YTEga0-Qqm_y2C@2P=0n?>Wdyc5P9r-BV z%WSE8oR*67b;gAz>RyMg=X;vxKNy$7%SSU0RFPhDiXcUL-JzvOZ#eQ&q&J=Rl_I_6&{CxL;!>EIT_nEji+Yn*`XJ8J8_AxJ z>>~XX7aaqG_|B%lmbex)9{cA7l-=qWx}NV`jKHX0;(T_)G_s;@!l;Yd7Ux+)WmJLs z9f^y+D4^_*xE5^efU-XgWq-x_>@EalQ)p8w-qRFkd#ECo!>0lVEjTs(g&23aAX4~! za`eef$Z)x04}$d&4%MX5-16K^kx`fuqT4oMx`=%0h@544UZn{AjiNg=VY-NHazy-= zXBkBv#=H~VsR`3X#EWjBGWyH%9H0n)xkYzt!gLX7heNx(_)Nbsh?F|0S9Gr?WQff9 z0U6Zk49cWJS@aoA$Pk%=fJ`0BlR=qY82r(Fn~)(gcL!wZTAphuQ^E3_(}WC>c|RZn z<2*;1@o22*K~2bj3@55}ICSi{h$0_jv_=nY%5)Lo(-0*B`|YO4RP=@D;Z2z?A}t*e z*smduQ_7(_dUR8!i^u>+1orDrk!sAM(HA#mx`<4~VZeSDQ)V&ieR)$dMCO)&4D44; znOIypqBEM3Au_KAWMIF?D6^cl$!7RI8Heg|Dp>LnJyxI9FbEkPZ~w4*^5gOnJyxkj!3%Y8A%ad zKBFrVnJywT9Fb2fPYFeeDN>WjbP;(Thsu6_^uPNkGmmweo=AqsEOuo6iohH|nZ5WI zJtL6}kztD64)_>;BW37-7dmo(UG~4H6Uh*n1kCn!ysAYl7N+~aM{#hdPPl}hdStc`0$`DjA zdWFm>Dd%u%SSwRQ3PTx0Z;)9a<$GFcvkdr@p15X4Z;`Q`(h>JE(c5Jdr}SlhyJftl z+(s??WMrl^Wqt>pF}MW1t{Rsa)jwdSDL77Q&MC}tH6a6bqReBC49ql(GF)gV+T&_M zhRA&7$n>y0Z&9W>D;nc!LWam}b!4Vmo>i2|VYAhBH6cS};!zh>o?U2u$~;YDHgYu~ zLu5MRP__ShjKdZnlCI!5Z0u@6jtE^85W++@fI>I2TQ_qxAxDI&9HCDzlTD(~%g8gj zrK<@!BJ@~5sIKL?jY4DD7;RAhpwL%1RON1n`cq~w{zZ30{ev=F9T^O?Rg}4c!@djZ zuVj+G;t1~NkW#w@enU7;O5-VKxSEh5WsY}Xjx-9bV;AV>YC?_((bP)l z69|o_&;!Uc`dn8NazyAxN2m_WQ9+?Y7zxosTusOkp;sND^$C{e5elthml^JALJodR ztYQ%_bgYw9!CGD6bf}~Q95|Uy-$@!ndrxrcob)O!JH_b{Ne$S~3!KJJs>dRiI?bHK zHj1ut8Z>DiYkif|bV>U;-e&}g@c;@JJ<}!EmZUq`V{UXvb*Z@lnc34ybIVf(BB=o@ zcB?Cq98~OccA(oFQcbTP>F2!2a|W`0ce)bE!8v@K6Ma{J?95W!=aP||G>JvN-zCF3 zX%GwbuuH~nQa28>M_e+nlkTTopK!_OP5PCldeWs|bO+^rZ!63G#v?ExY5!Zj4CWF6mdC6XgT^&2~yFy0t~I4PRhz2izGM})cu zgwRz_rqD8$`(0NeIU;mvKnV6Yk3tME6aAqpksR0~hLg)jPV1;%a0@t&J!*Ig{a~X% zb0v}iy}T)T-I0Mk9;eK=l=nsqQ16h}%Aq!5_K9ijP`{#>F>M@b4(b`x)}hWt#xd<2YBYJLIMk__ z7h>8w)F#wDrekZmYa(}gTgRO0P`xmr#H2Y?Z*+*5P7YPfvUGN+MJ#6*hx(rRb#7BkSHUZl=J4&`Tl=LyyF95jDy+awPP2)Ejiq)v6H3{u@3YAUJI9jcmCUx&Jp z)VU6IAE}`Z^$e+z4)qqPiyi6$zu63wrxZlR!=ukdV zvmEMVQujDi7g7&7R9{kWIMfBC-gBtSNqyo_lSqB#Q01f+IMj8dzILd)NUd$c!#}J7<*_Gl$w|3cG;AAfbSZs&TwC~XkW4nc>HN|`ydq!y5dW_%Lb3)VBqVvTL z4NdzHgCllyXd3%p?B$_pW6_Ocb6qJ}TKVQ+28_KjH0>FlTOOL$g=M}fG_8{P-VmDB z7L!fvtkATJn08-i8b3LReJnI>3v$<(CgUmObo=>*`aC0w81x_X^|LlvEPTL zor~MA*k3}^?#10m?19j<4=EQB5t8p7)-544?Mvo+QfS(5tXtcNq#jzC`M@`}TWDG& z&+QwUMrVN7p`mG|xMz#KI5aIA6LD;IXxhz8yD~J5F{fgyL({%u|GOb1O%GyJ5A29k z1PVGc){S1_mXJgebSP3dXe*B$MhK6>>?lTcoG3<7p;3&YL!%hQNMs*T80$naigThE z#fL^QO3>x`Sx8+wiqZdT;fs`c(3~j}SxDK>j)2s%t9348A0dg~WTXm-ctj*m)__dOy!79Ed@C__-+&{8l@MGNYClsH66=8bxrHl-O8L=i1f^& zsRf0@yL3wL)~Pdd?U!3LBD-V|BXp=5ck0~JE)3N`!<7()hA`4yl#cXFN4Qfr3U}_- z9iNlS5>;hW^RfQaMcKLIClnQ?cTPhrjiZZ+FdR6~$y-$+@QwSGox0UlP*tb&sd?#) z9+0jUX(}qs&BC|#TyiTNK`y$o@D@TV6iuBnPS$nOLsQijm_rx)mDCofoC zLyM}WmZs`W`C~^`Q56qndXyGc>Zs@{wKQUSPHtItR=RDXbSDrB%^qkeyII*%TE9@8 zLNB%|5R4@89KtmmBs497BZV_Cnjzs{VnKgNEu3t2lvV z0%Z)cRevnV&OnfZDdP&z(WEozn)H#9Kg#Y%BL)l@6;dj6Q@ag|5X+*-U}3E=1Yu#o znH&VKf^KtYvGR5cW=@?tDHowHj$Y#prBqAC^}`Ug();C(=NfT(Ib}SmuA#zflxAg= zA06~YZ$!%4LxFKoR3w~$kpdHij6ilU{an?B!bz(_a1f{>n$?v~XtX36nnRs^Doiw< zS}e!*W!b~T=n0fBI3}TArW_bDJ!DV^s%+1V>>Mz1r|xVy3HGB|fQ_a`fpj9q7DDKC zO}VmyiU?9mSdffDM6a2GSX>CCWN1~DDzu~cFxW~hwWw|0W?eK*=_sG-lj#h2q-qgR zWYkn;sPfa#hd!l%XF0QjG!nB4%;R=|p^!7X+c`_jA)Up6f)1=F*+%5_@7N91!_0ANlP?VcLwg2DSGimQ6?0)*8hOEU}Q>XNQTB-r)@Zd}`) zOPSdq&a7#Sa?UGLq?NM3P8gSw4LM?|yCNwr_&m@8)&-3FY8 zw0K?ti>ruqJ)uVzw)=DDh&uV~$3xHHe9 zDUKUQ%pUR~`LlQ16a6^Ei^JUwe$GtJRV$`4&R%-@=pj?{#slSszpx}X3+tuYKcMUr zOEXnx2;O#?y`FY7x_F>LXpSKRc#s9eurZA z5b5v64H8QkI*kR&W_N5=`o9xKjf1PU%Bdbw%f#cP2Ya?%LRA`P1fc2d9>zgs2WQi| zmeYH4(dq*xXN(^a((bA-YTWCc$r)2xTHyA|n0D0dgA)o)lV^t{&nQVSKYgCbfq^k| zU<#|v2I%RvB+DEctT{u_)s~yIaj4m4LW1hBPX$!aMuZ;JewSy4#JJNkQ{BV9{g%LY zfg3eS@yF_jp;NPRb8@o_LT6a}I?UT5KXv+z zzz>f=EWY5Vv4499Zw&1mL;IfU@qtN+zvP1JT!$;O-JT<|GjsFR?Hu|)r3a`BU!k+Uw$=sh>w;z{{NS|Ph%qMZ`Fot2uu4tvKtS63{wPdnpRvmsI;?0mTV3c)OyB}zkHv69K&7Yu z*TjZI6~m0M+S`dUPQWb2^uYPd4mDYeRyAGmrwSg86!VTq?kSuwlvHZW477DfvOP06 z7v(VJW|Qb0R&`Xno$NrDwGdKlKxw#}sH6)HEL#6I?{I#EQ5D z%$drbVV2doJ3t@Bt$oJ$!diL)JMiBR9?CKW3}+8zRSDd0GbU?#-js~VXj+t#kAa*^ zZs4G=y7vC>g&OVK6R(vd6lg~rdivXeo`-h*UycWg_uATqcP84#_@AMCyav@a#sdxI z;|-{`xv}C#D4(y{f*V$MH28RvuWfEC!QkWFtG2n}cOR-Bo(0;*_@SYEybabiH(vRL z^5LMPZEi%x3FYH0ySBLzi7k{5*Enr+W7&yNKK!J#&22R`_;9k&Hn-Kx;3LS5wz;ij zgP*K%`O-4Q;HMb;RD+*t@LL)DRtCR~!Ea;m+Zp_J2EV<*Z*TBB8hj3&;O0hTno#?u z1(`T;CD6n-3@+sgWuEObCd@+w{@DqKP||_k=yER@OvBlGY$Tk2EUKN z?_==$8T@_*|7?SQw!t4@@CO+Dfd+q|!9UO7pJ(ug82ljy|9pdgzQG@6@P`@v5e9#R z!5?MtM;ZJJ4gQ4&e~iH&WAHCA_?H;`%MAWy2LB3!PdD`7=C;Nf{INkMj@*b096CP6 z8T>4RpJniK41SKmpJ4DO82pI_f1<&kZ15)={5*r7XYlh4e!jskF!%)qzsTUzyD_-A ztrCM@5@h1YZIv1PGJ{`X@GA^{mBFtv_%#N<#^6sg_|pvjbb~+L;9q0#uQB*D4E_v* zf4#xK-r&zP_%jXuO$PragMW*`zs2C+X3)1A^c@C$mqFic(DxYhy(-o!6M1E?Z&d~2 z;n{SFT01Mq&&P!T2Ug|#e%F0!_U(6_*O*G{m{ zzh1>eWr|Htw>pLJYb>re8062i#)i<>s2He0{xpl1&tS3Y08P@wD^o7=n5PF!k zFN7Xq)sN8ijjp@9(@^4f-a7 ze%zqnFz5vay~d#T8ni3QDV;rrdlHeFB`sosBf3f;b!La}D|ugDy2_#`SPE zp8u#pzhTgG4SKCX?=tAfI7ho}&qRYh#i04|k+ZQp7aBBU$2%MOR~a-HLUuOtUohxT z4SKmj?=WZ&9Q2)y`kEPZcY_{k&^ZQOW6*aQ^y3Eoib3JrGbAq(0(CRe1JyFp15IY6JC!k#orW@!ohlf~QhFn`_JSJ@Df$~_ z4uOCUyZatp9T@}8)L_UTRUJ_y&0dP%}ZH{UkNk6JO&RZU{ zI+AWy$5CTc$I(*z+d`u{B5YL0QDIca?t({GM|!(BUItpt>FGyR$Cf{;I-oE9_1RJtxGO=8M1Sr@a7Zb~6l6H@O}js9&7p@1={;h{}N~BvHI?^)#BwP{*nsm59n5 zm4@zUo~v$BkD6cYRHN&t#G@M9PBq$7B^qs}(vE5sm1-JZC59T814bpAWeqYyiyKHc zOB`f`7CMj~TJAuyS@ZzID19Iu6$m(<(8bUp`ssx74Gwb9ve@|OFyed0I|Qy5dV|m# zh5kY4O+s%L`bVLE68dMMw+Ove=wF21CiHfpcL=>x=v_kZ7J84+dxid0=zT)(7y5wE zzX^R%=tDvu7W#Yzz;enSSV2MA0}u8U9U-(^XhgDCe2>sr_g>L;gvMfN zijEdKM(9|fu>h0e#|xbxbX}nl%wO^A3*A8IhC(B1u;M%AIYDTrJXi)m@tyMcgm%i4 zD6~@^EaDbYo|A-j%F{$>r#y%?uH>EaXzkgE{RoSbD!Xazs?wWDy4K%RdUHwF`khKo zmUONEsq_|-uJuEej!>E^U#&l?^p=voMcNttQl+O#y4L&Gg+y~|$L7K_00xlBYym#rT! zu=q$R!c6}(O!|jm(mx54{&|@655lB>947s0cleGus8PNLBmbRVd86k_U8h^a=QTAvv8 zLRVLGH^ISz7YSAi-X!>-;Io1s3(gf}>{Qxoqu`%{@pz}m^rnKt1TPnyEXW9Il$$Ad zpP*V-5$W#;JzJ3PE-BAwP{dyaBk+!pbOXT@!Ty571;+|9N-gEN6btbs!S@B{39c7B z5fcaHP8RGhI6^Q(FkjFwc#GhC!Bv6`{z83Tyn7>_AebuHMX;Y>mEetn4+y>>_<`U8 z!8L;01dj;DqQf)4CW5C3o-R08@KV7^f|Y_d3O*qCqTok@iv`yUPRF|}=69>$LxL{} zek8bBaEstU!6;nVczzeb{(>U~GX)C;uNJ&R@Cm^;1iuhmCdhYJ)W2WQi+4e!eS&QS z8Dp90=Lzy173pUL-x1s^_?KW3-rZ0xSFlWw5&oHeo8Vo7&kDXQ_@?0df}aU475qVP zpP)C^)_a=Zd4hZg#QY`-s`Z3H-y`%hg6{~<5nL&_Pmu3&sHc%&s$e(4;er{0R|@hS z4bQt*@J+!l1^Et!{LO;<1S9dTL**xUir~3|7YQ9HB6wIZ zHo?}@TCj)Uxq@Q^rwKkGI9qV5U>t&8u{>#lqXf$Y9~9&|eU#fI=*5i#>9&GH1oH*& z6ns~3tspO4Jg=qT0Kr_rn*?7KTrPM}kg;`nejmY1!5MY5%Ex26p2f^Kfe+tIo28;Sn5^N*bUGQwd5rSg{uNLHTM?8Ol;4Z<2 zCrJ4PFBhCH_>ABJ!CiuX3Z|TBpMS34WWia2Zwr1UxLlBN7FnLXf-VH_B8{bX6gC&^ zD0qh85J4_Q3;rdTkZ9{k5^OIxTyU)5HGI2#f&&Cc362xY7pxJy zN$`HbX9eFD{8I26!3}~t1%DTeX=>-6DA-D{t6)FDVS-l(P8O^Xyk78b!6yY@7yMLk zvEW+4Ujz>ddJ$KU_Gl!SBA6z4E^(b@jV7+OtW4q>tZPnOjdf9ot1Rng;!4YUfVjf4 zo+EyT`!V9Tmh}~JIo9tcF2nsF@f*w9Mf@5*6~v_oAlD4I1nWN#7h}z3;v&oHMqFrF z{fP@KYdCQ}LR=B&S=JQdT&&kioMTxx5NG3hMf}RLo+5sUHF$|%Sk`C6&n;^S@iVMk zK>XCQwh{5W=`itQ1X^tl{0P2)#1By(;s=)1o%p_Golb=P&Lh5u_2`7Yg7_}%C3FGt z9b9jOoI6h5nrQhGoqW`a9z5mbFIcUx=^4ot+ z$v~8^0r3^wrwHAO_%eKJgg%Y<64oac`h4PxSnpiual{uaYrN1U#OGmep=T1G!+o33 z4-=oYtS5wio%js;gV3{yPh)-+dNuJW%UUn=PU4feUl%%}1?VTR+zt`-Ig$7{?n{Mk zM|{k(P8Ir0;-ly#L3{}PS?F7c4_ek8LO)J?0QYY~zfHW~ zvOW-cKJh;EC!xP5-YdTsXIYljv9Np!LZ$)nX`aFf&JmYnw>qjXdOMCQEVR_Z>jhJp zpjK*kUUfPz_V{Avcrtjxc{~w(IL-y(!)K%(haOJ`PezX;f`_EXkx8u=&Xzf*>1>f>m`=PD)Wh^} zrgLPDVLC@7yy-;Zn5J`Nj$t|xIfm&(;+UornPZtwM2=-TaV$92fEBL^z9A25-GG0> zaU_myI$I0hfF4K9u}o(xIkxF+nPZyH7OBN_>cvgKOUM46xYn*$t6(igtWB;~JJl*! zi?M2xtHolqiPdVh+5~H}U2Ss5HK0AZ|AqlY@VExF<^F~NMew)=wB?R#KwIo@7|<3x zz5#8ya0b+T4r?2{sx35`aApgNgtwR`6V6yck#KejN`yC2P$sN(f+EK^jB*V%XOe(n z>;WFW<1r_ZIhOHkkz*TAWR7J#TjW^Avn7sgJX_|N# z{?-JdF6?*=tG2F!4n)WSZflhs9&@YBl%o!At+C?~DZcNsw{UW4VDlVDKjrX;$y?n^FR(<%16QVCs(-))Z!%x!?eMMpP;iqYczBZaZJUR`OZv&3? z@?8VEw))~xK#0Dcnm#Lq3kNG?H!zKH@eK#8VuGjS8kz2ri zuN(R{htc=4q3>Qz-$|N2zR$y7VEpb2qi?C9?^#V>Q%&DNLmyll5qxR%-fEG<_L{zOG^P@ja-n zZ;PfcRnvEkq3`T4`lcEB4r=;ZY5JZv^o=yhQ24m=o?|^8>8v#tm!K=^t~BIUy-42f~K#lrtd*R-j6Ss%EzawMo!eYZUmws=qsB*`p)WOz zzKKTpR%-hCY5Hav`nrbEce9~yi>B{vP2U@azO%#Vd&SUqP}4U+)3?IVH!6(2Wrn_} z@xl3Tpr-Gzp)V_pz5|B7L`~m$nm#V(r1!rf=;QU?*`P*kiICI#UmNJ79OvgD*eS>P z?;JzlO=0x)HT3n-^qsHin_}pDGK{`lL*E!p-!M(z-G;so!|1!+(3h|28=>j@*wD8; zjK22`eb;OHMrrzfH1ur`qi>_3?@>+Pg_^zuZ)p2+@u}L{HwJQg`@XB`8>8v#Zs=IeSebWtn)`VbxzCzRYvY{_4jK1d$ zeTkaBv6{XWhCarwsI5Jg8T!&Red9EJe;N81`=T~|M+|)fHGNr{zE*WY`wL@d)TS>5 za(aImtLe+p^j%=+W9*IE^bI!jm1+8L7?@v54Sj3F=qohz-KOcAsOfvy(6=v)zWWV* z&uaQ6Yx+Jn^u=LftgXHu8~Q%g^yO*#el+y)x?P*TjfTFJn!bEZUvyMx`}Pi_&jUHV zeRpg63N(G~4Sl1+=xbx>i^{d@!Rtqnrtf@1-{dg*&NK8SYx+tweFcWTYr^QuGxYV; z^p$D)?lSZ}7)IYLL*Fn>UxlXc9Yf!nVf4LW=$oMFtJ3tXG4w4Aqi=82awj^i9+Br9_A7`#p@lW{|_5)dxGbS2capLE|)azcIkj*9h0e+Qvse zL*HCY-!+=PTti>`F#56$eH%1=GcKPz}EC4%bEvYR%dhc!Ob&7?l#z^ z7-exbNAA>~ojWIMTc>V4yLal@qkESg$;oLd-TvPxEv;4WBlg~ z8Q^j`npl@Mf%-6?Ay=XUAkHtJFYqbS)z)>>uYZ{ z`2#;spStzayYp`TWd4-SA0L{$=EKy^G78;`oPFWkK~T1`*4@x2@f5)p#FoOoS*o> zRYP0ef7Xyr_Z>N}|GjSxy5yeRfkk&WJ@<~g7M=61eH-6vc_nCQ}FP(WL?UNg> zJGJ!<^*i2q{k`qI*Ec_<>bfV|{x+jko01vNwmNcco0G4;_UV@OuWgy~#5Ip3pMFi_ z<}0qgBdPT2*rrKWPd{nS^n-~d)2H~_P5^w?E%8)RP9tNtlhy-@eJX-yL5 zPP;Mg;b})=%BM|?zIfWII%iHh*V|^=+mXI$sqUC*x4Yca*#3X{fBx$)|6=TKVSf<& z)z~LuACA2T_GZ{UfBos-{^y_mW!T@x{@9;?_^-#Fhkf*)zx#V*Z;3tT&m;ale;o0z z{Nu3yW9(1;amarY_QF37`Y*xW_mAKFZLrt<j?Yo7JsKBKl>Ap z{N(@Z@Q?nV4sZ4^I=spM=HVaw4;u4&-q_Dz;X7Jzxu!v{;UI!`3E0( z#NYYAL;l7G9`IWS?(_e={~rIM{df7_+<%Avf&H`m)A!%%&)t8sf7t#T{XO>I;BU5{ zWAs}8_I=a+%l1w4zrU}>|Jc4N|MmOI{Zsdq`Y+s9>_1~)fj@O$zCU(fo`3JJll-fG z&Gmo!>v;b&zh?Pw`IX~4-GAAym;3wwdWpZ?uVei6e;w^VxOb#~{oY~z*?WijU)np^ zf9KwT{>r`Q_{Z(-?;o_ck3Vhi8Ghg1)BS($;oQ*8zi>}y{~LQw_20jzga4{M?fet= zwDw=HC)MA5PYZw2o@V~YJx%=Eb|?D3*?oflz1B{Pxf0|rf^waq2OMe%5BdZVncz*SU9|u*>{jq=b zD?grDefN)?`@2?W|9EQk&>!1Ycl|N7y6KP2tKB~~uKs0nqv~%q*R6hUb9D7%n&Ew0Yd5W|`f}5tW8f>ZTaERswF?%U-ixpcUC?8!>v^_e&99d>Z;K{R9E%> zp|mRXhbyaMf0$hL>&Bd_H5S3s+zU&{HpSe1FObv>{m5#WACc8joqt! z8`G-(+Q92o%c{j2lB(X`;H!FQL;b32H^f#=+2E-fwc*do-Wv{9rf%3<8M|Ry<*)01 ztX#8xedXutS5-d0{+r6%*DtIrU(ajZCzXTNzgL;I{`Jbl^)FUh>z}IJ^8F)~OTNFi z@}2K*uYBbD8!NB-{+i0X?`tYA{JymE%uhv~q`Qo~P zm3OY|S6Q|0^vbMtT`PyI>rmNcU8~9_>zY@(*EO!(wzfg#vbC|5AFPe6e0=R66*Jc! zs3=&=YwVVaerq>Yv|GEnqQTl_6^GU=tk}5btBQGRKB{AU*n#ozIs!c~6GcZbS4e7C3UgzvVL{rT;NvY)Om?TF(2CsSh(UVd@eq~*iQMlK&%)_ZxMvee~0%Ho%IEZe`VRoS{_NoBK_H7a{~SzOsY%iLxD zWxSW!Q#x$f*3zEKHk7tlwxTq8+2Yc@-+WcN`kN0+zxd|O(igsYq4dsg9xtu>=DyPG zZ*D6c`ptEv-M^_RZT3xZX`OF)ACy_T^6N`VKl^%k>2qJ7TYCG~XO>oc-K{k9>-MFC zziwID_3M*LlfJH3>iN1(>CUBpmaJI1zvPpp+e)5Y`a{XArM!n)QZjDo?2^GtKPu_6 z^o^3HOP??CEPb?O$C7(WzFTrj$tO#$DS2i|Wyx(zt}H2EGNEMLk}FEiTQaJo%aXw* zO_%Wgt7pm1#T`q&Tbx?*$>Js@&n~WCGHY?2l8VKD6pvfHuXym{Uy8df-cX#h_`727 z;)TV#7JX5?a?yLmpDuc(__;;AcYC0?a?z~ftVP!q4_#DU+99-Mz((Y5pY6y?qDRy1b*DMfwfCl|Gwe?n2i`LRX6&$Ehtns=aZ$-Hfa@6Ov$ z_}IMf3U8dZps;A(r-hf#Q^CD+))Y*i zv$SB+oUaN-&w0P#%sH(+d{QE-83t_N0QxW{)kHIh*&n zg9mId9qPbI=?4KKpyNBfBkI!Y;~YvZJ%j+5XuEZ0GEY zZ0qdf>|5D;*{8F&uyimVr>iif=?j^pbOq*>^xup_=|hYS>Fo@q^cu#`v;sy) zS~8< z=+v1E|J1*9m((wGPHG3;IJK63HWl3yDfE@8;dF)6K>BEk54|bHg`SrprAMSN>3%7u zbjK83Iy>bo{Z`6Bx>kxBT|GsGzC2|CeOk&i`j=#Miww|mlACGa$rZGx$=NiAdvHA>WZW)>a?UB>PTWdwJGr(H80VR8ky)xeU@lLbx!0^If*2yQKA9$Y$CdW zj!;)6?x4;{Ttgj8SU_z_m_{v3_+b^3@Y(7`LX(wiLa7x$A;ZcfAAOOB4_ke^4JlU<{A$%1GtvT5`_^5y6)MThy>Hz6`*nMF&)b&KMN(-!d& zdo5l?Y_#x-SZpDUP_Upxd^f)yf$r3LbG3*9^JNi<=2IiynU91&HE#}gH7^X8n8$|G z%mcy=%{{{}nM=Ztn3KcR%&&*9GS>{BW4U z78vGb<`pJ4lZLU)EW=F9bi;Jaj)xsL+a9*lYjm9m+P{6>4I-Dpbc*G4#0UkC2_Fogr&XD?;X(riM&3 zeIJ5u>sAx{ka81tNVxp zu6u{y&V9$Y9re!m_KSCyZhO2td|UEv>ut(A<=eXNX5K#e?x(T(yI$j!?~osmYy9JF zjB)qdSH@Lu9~h^Mnwyj@{@?5(2lwzt2Gl;8Fl zDZH&S8V^QZLab4F@N1*gU~i-M!FEQz!E7U^;5$a#U~MDQ;G;%Yg4K+U1TQz*8a&fz zS@2Ioh2UPpu{X7b?Qe1n%ika$BEazdn|p@7Z{&tfZy1KWH%5kLZ!Q?>yg6ui?9CR# zZEuzsD!-X#IQ`Aot#3gcw>pC=ZdC@Q-%1Y(y%idSJPg-ccY{Q?gh7;Bq#(Up*Mm;q zIuW${mU_^dTdRZS-kKfs-_75z2X6MgZoK*Nb-~S?*Ks$aUcbH>@Y?&P*K6c|ux`>` z8{fS3`qIsFuMgea_j=3C4X>BnT=;tG%}KAn-uUvW?MBP1@*5?uQg0-^`f%gjt0y-e zzjD6e^ooCj_X>F@S8rT>rFld1)%F`ZUah#X^3}{6vtIo$_!Zb~&=**3@G&sMAU80~ zASUpcL13V(!Tmsyfjp3GzzoziFb+h%i@L#~z*PpSfwK&j2L9An2<*}S7Eq(#6_BN0 z6%ekU8Q`xU5#Xl(B0!|?89>&T1?cM20#4}P3Q*TSAAmd?Mg7eIKlPRbbn8tEsMZ^Q znW5MDGEA@PrJr8L%e#8vF9mupURvmRzPzf3z0}mBzf{vRe5tH=;pKF_gD;Wa)1kZc zWx1}x%M{&jFW&2Rzj&-$^TI(l`-Qb`)Qda10WU7;-hXjW*XG4$UDk_5x_4eo($#)3 zeEsN)rt4}ikXICUeb$Rt*Z(}fcfJ2PcD>;_^?KoRgX;;;PhWrgeE0Ro&sDBFKc9VF z@ch>`^7Ec+de5t`X+6)lw)c7HwGGda&*Xe<%5&beul}ajI{YtRtMWf|Ez^JVwMhR( z*8=<}UAyN$eAULk=_=d5;Hrs#%+)LY0arEsJ+G?!ORuWc3|vt`0xjakb^y zimPSMre95aHm(!)tX=2%vr-+;XGuEPvtS*@GjAQ^XEr*QpD}cfKD(*2{n;6vRnL&W zrK0oCZx#FjB zMbmHXm7RV{SJwC;Z>&dql3%s<=+kuV_NO1TtDgF5XFYY$j(W=0e)ZH?+xzKxZHK2C z+PtT0wJn}1Y3n`xeOc>i&*gnjt1fSPihQ*XmuEbEeEH`S`^%r7ur4<|F}z&#g#op?kl}$>`S?*?R)*A zrZ4jIwq9K8yX4{m-^mxJ_zqtff821P`*H4tkB=iS6g>97koef;!u!X(3x1DHF1SCw zcmaF7{{rjr`U@tHl`dR;jJ&{}^Lrmxp5OR5_56~@Z_m$o{P6s*M>gmCAJNW#dSr0E z^wG)l>5q1tk9eefKH$-`^WKj}&N)2#bWZRn{~YBJ@)4h(yYT4lxg(GG=XN|YIj8dI z(z*GM_Me;lXx+JSAEk3WKEKY^`E;Kx^r<+T?2~*p#3%UdbDsxi@A+V7?R=02se6{> zqj}cAXY1MXK8w#D_L+26&1dk;YM;6@^L(<-O!f&qGyd?&nVyFZXX+oa&J;bobtdJZ z)|s$}JI}m)i2TdxXB-}W)e<~x*0Ow9pmpnEwAQ7E&$W&{ysNeAAx~@l!#i4wA70R! z{!l~fm-ia2LGM{wE#BWxS9rId&hkdyXZ-14@4(YfyxmW`dkatF-e#xS-j`3CdmlKh z=e_>)S#PD&hrEBCQuFRSrQ%(7YQA^ksj1$tPkn#jb?Wm2VD#h-21Oj#NYQk@&3N}g#Uf>6Zh_GpRm7w;Dq4*`V&_7 z=bSLQ|MU2j`yIzm-ba3I{BhO$0moO~cRxP&zTo)e`=-ag-Me_a@1Dl-rh99Sm)}!7 zo^|h=X6(II&A0aoHJ{y!(e%3aT+{BJi>BZn@_LOmjqaV*)Va4y^VGeSn)~i4Xl}hX za%|PT#$)sE+MlDbdJ}rBa^&3k9_ki zJ@VNTdCUPvDm>ke~vJmTW1a75-ga+vMec-X=-=kN{B zu)~);eGeb^v^%`llXh4Y{Ata@^F37$PxD-O_?O4uLqi@thdMke4t?}UI#lHG`cRsO z$DwEs;h|s;(?fn97Z2U@*n7yqWA!1i$BaV^59Dn(9n|;8J$S(*?4YKH@4-DDb_ch3 z&%Qv%=Dy+p$9>uXiu>?>Blo)fI_{bKwcOwDKji*!zq&iNe}g+^zp}f|ekJ!q z`=@}XK70R=+xLAPZms+3+zR)VxJB*Dbo1L6=jOQYgBx?-OE-gkK5i%Wxw>uLXXCbT zAK&di4XRs@#vQkE4PEf#12r_=+%)#O@ibK3ZfmHxoz+<6wo_xKo3h3Pw<#Lqu7i8~ zU2FHYx~A=|aSh&E-4?0uA_Sdu8n)>uGxD` zT|@R5xccn5?27L>=}Osiz*T3@4%dTwHn^_aqwG3s&s^8>-P0fk$lE<~H+*-`UEkfG z?%M9Ix=Y<%aQFJ|w7W-k$K2hx`~6*|-7oL{*!Adc+b;LJg}dzTM(q;a_1nd~>#)lL zG6elyI(Id9ow>Vt*O9yPcI~g@M>B8JO>|(I9 z%jNjaCKuJ6l`ivl=DVQ$p;JA^r9}OMORRc;i@*9~7bkU37nZt%%MEp@%W-vU7gcpj zmj&u~Tz>D+bLrf1$)#k+Ntc)%2VMMk?1b!sxnq@!!Hz{P$9E{YY}ql%W&Vzz&cC;R zaqigO?OeS5lXJ}WYUgL$i<}*|XF4;sCphbG4|6`YJ;-_U_Giv0_xP#i>fEko>s+WN za*k4CIX_h+JKL)nJJZy3opseNIv-Ix<-AetknWPV2TcI4N$cbo#orz^Q3#x>NSnc&Cu9VNMUXzHyRm^>-p| zedu&~tGkoNR(mIuw@=1|9&%|VXOHv2m|ZuW6xZ1!-}+wACgbTbAy&z#K+$8Vd+jxC#RJLYZD zcMRL4?f7WZ8Ap7RrXzXNen;(1>W=$1ZFXF}X^o@8re%)98|OLJZJg2P*qlY{!k8i%DDOB^O_%ysD9km^vrA4Z#l18(uoFHuyRi zY`E{Bxxp3kC8Z5ghwtlo4lU~$4teWI4q@wWJ3Lx%;DE2!aUich@1VW@q{F`Tha6U~ z-{YXLUd>@>-A0Gnb*mjx*DZx?%46M32mZRr4#w;L*q>fEZm+g($bQkf9{ay*+w8m6 zHrSV}t+J0^TWs&QHpkw6ZK^$OZM^;UwGsA**1oexxt8MEXZBy$_}DkB@wCre<6{4A zjjjFtHBx)g8lJt$8ixJ3H5B`uYfS8yuDNADVa;{>UX{!C+ll@VZHTD}+mfO!(S!6%HdX9b5>go2`t0&oiSpD1X!Rm24$?9P{v(w z?OOfG4&`YRSC`xMttzxDUzKeazbe)4#j1Ear&W=5%vB%k^i~Dg9bNUpZo{f4cC%M` z+l{aEv};=FVwb(r&hGt68Dw$dm25lHl{C9^D@k@cSKhH(y7H#ogq6B>y(_fs%2u4S zi(7HZ&VR*GJI59K?dU6Z+v%=Qvpc+Ev)%d?Yaz!QUB1MwVflQ!jODZJ-Y!?L^IAU9 zPPqJ!?d|2?ZO<$pvE9CWz;^NS9^1dlZML1tO}53#A8n(QD{P-C7u%u?&`LSeR!2F- zcE56*t%`D_t%7oh?eMZ-+uCJ;wkgZ}ZC@|*wRKzOZOd8aX?ttgUE34O9BfsW$!+H? zlR$phx|D63x0GfZx|Cw;v((I1w$#|xeCZ9_i%YND?p}JuR(a_K+eu5cZ2OiRw=G|C z#5Qipe%t3ucH25G*#X(3?vjnRhnK9eUAJU~?aU=hZATX`u&rOLWShQtrfu-zX||q= zC))BC|Ftn%{L|+2;xU_Ti@(?`SUh0!Yf+C4$}I~Pwb+C&YOr~RyfvB1WLzd&YVv_NcgY60J7>jG<=`3o2}Kj%|zTIZ7? zFAbZ2+s0?Up^a?5fsOfmU7HK@b!>Lczhtv){&|~;^R;Yx=bf}En|I76cHUu|XY=;k z*w5Q*L!GzN=IXrdkhQLvx5;Muy!AH2bJy6^&RuDfGFRE=)!ZdEu5%aISkIknb7Sso z8_l^hZ8ptSu$eP=vdy^C1e;Gvf92UqzvL*Vy{|MT7b%U%?sfyC z8?$`nnzJ6sH_dt|pEK*ed|c5>-lXUu&r)=izf*LP-&1sw3l;66j@i8IrDr=OH7PCqUmRnUY?J6++3{EfmPxrf3*IZt7~{FcH#`3Z%+@+}H` zQx?nZ zrYw?MO<5?{nX*8>f69FMYC_Yd%##mJo-41OtRzpIJV*YLkn`l(a^~b&ay>#vCM!Y? zuSjI^Ba>#x>jC0@?MnjqFfhcxhTIynJvm` zQ8tV6Sd_t{+!bZ5C|^aHD#}q&c8c;+l#!xb6lI|(|3sN5$~jTCiSkU8VWQj;WtAwO zM42SYAyM{-@ZP&S3~ zD3n2=+zDk(C|^RE63UTKc7*aGlo6p^2xUPi|3R4#%6U+>gYq1d;h@|GWi=?DL75E7 zVNmvh@)ne_pj-uIDJVZdnF-2CP&R_{5R`$S+yiADDBnPt2Ffu|c7gH=lu@8u0%Z{> ze?XZ7${A3$fbs;CA)wpjr?rnVI$ufdDY0DMxHeCp^^8D z{AT1aBVQSL$;dxOo-y)?kvEL|VB`TK-xqnk$lpbtF7k1acZ>X5!9$iu_dMp(5WDd8No7MV=_~L6P@~{7&R?B3~1EnaICHo+a`rkvEC_NaR5x-w}C@ z$X`UBBJvTDcZmE#Fyw(D-wSzN$lpSq7V@!>cZK{a1bHFI|3IDx@;Q*Vf&2{QVIbcEc@@y>B0LG?Lm=+~b-a+rfP4ky zB_RI*c?QTQK;8iI1CR%R?tXOZqx&A+^yrR9w>!Gm(T$Goa&(KMei*vB(VdNMYjjVe z8yels=vGGeF}jJ-9gJ>Y)FDGRF1l;cEsOeO=w?NCD!NV4J&JBnba$d#6ZOo{O^NPE zbUUKX8M+bCU5IW$bpN5758Zj_wnJSsbi<*$4c%(!K0`Mdy2H@zg*s~J#zJ=$x~0(l zgl;BuC!yO2-9zXGLU#|kbx@BD-8ATqLAML)w4oaX-6iN2LH#y#bD%o|-4>|phHeOS zH=tVq-3RCM2YPFuo*#Ns zpmzj%JD~RhdLy8B0eTDk|Ns9N@&6wqG(-q>0ow>Q5~?ADdV%?bG6^LSLLI>{LT?EL z5JGPUA3~mlTnM4=po|co5Q`A%5t?YJgsGbn&BbE@#C6rDGbrYiqg%El}=p~^i#Jk3ukOv{u zS+pS}A;cqu`im4ori2U$=@QZ=bdKmUp7>v{QG@uZ6WT%ubsSd`T1;pzp_zoH5S_=r zMCb84A=G{ROsJDkGod;{6@-ci<@~P`8Bcs834MTmsGEIzRL+Mf}Z7fd^+)+M7-tx5PeJ3 zxf~|cN2r4k>R;9pDkoGxD2q@Ep*TX}|LbMGBEJ5F9zjQQ40k2og!Y6mcpHAjt%)y{ z=xkd2ue)hLe6JF^NC@>fj}baRXg72^NAQirds2mvGQ2Cl;IoOZ0@3rF2wl%%eC+oy zK18VJf4$E};#)(glo0BGW)eyw6a#(GLHsSz2@N3R2i?#C+>`ja5FJrF=!y2@eB#R@ z`l43Q8U2hK5np{mI`E$D!%q?4qlETDm$Vn(N_;mES_Qq*9(+FWokeIWbWFSPpTD~C zuY?AmZ`y^o65o14RnR@{#Pf)6I-x}9p?2UQ#P#m? zs!Zsrw&JG5*O2I}>OpU{1wTi8PZIsr!_Z-E#?^_pw<@7^@CN^cFCjXu^9ap^Zfhg{ z-_J(;JE4)EsOQ>%cM)nPR0o~cdc27E<`CW2H0Zz9;gLiK_5-1y|8-$~i9YNDLhjIu zt-<9#Yj80kE_7t8aWe5WA>RGB;O$?9UnV-UX9*pL?ra6V_h$vZgV1K^(U#*Yi0@*e zPpbr-+A@4HaWDM&QHp;f^yNnh{+Un*p-<4YEyl}C#JzDJZjLBM&u(dqsD9rb!s@nJ%}gxbHOj&BNHOZ0rp2o*rzHwjPq zo`lB|z29)?{wCmo-xKg>gdRZ;I3B-Cbb;*&VbBSV#o6CuaVl{mS-_nXjT?NA#;+2( z2wmYQ{Mh$M`~acd&>N1xHxgeJqCcz*9pW&2_V+Mcfw-?Gz>O7(k9`ZlhY0mRxA+6z z`0YJjL#Pyb#_#Yac?}BPyqCvAK(wi z@8h0?T%ZGe50{R6;e0|YxG6nxvvCjHh>#w1quufI<8JsVq9c6-deV3Co#S`$twdjX zJ#?m>@ulO=_p*Am=zOoB_s#5fOn*dp9=Oo*EjGK5aH0KYQE z$IlTr@JYCXx%j>@F0MYt!BwHFZH=!QW8+H*&4b=H3!gg1#Q*!sz<&@L{Yu9N2z7m> z;VsbTrs9=ft?*((xzO#V;0a$Tcofm`4uPIG34ig`0)Ilt8#>?SxYJiN+=jTlC2)V6 z;Eb<#a0($)=z`zIb-x*6D$*YSR$L*4~F@~e2=s19C9s2Dos+IZTiHl8qg8IKx8cmE|kX!Iif zg6Nq)fv)*^+ZTvVw-8!4dK6y?J@q5_+|k4MOrozo1v={o@$VxC@DW1&&|lw&H;-uGb%ZKM zP?voVo=YfgWH+7wz4l#r$jDASXha=<0Uh@pxcA6*+T72CI@;OxSC4}aVtj1?TSAHe_ z-uZ(vQYWcDZuY(T#61@1!5Ur2cq?!nH%2A~T>e#nBcu+VP&>AMxD8u1+=?xQZ9ogAINXd) z9sY#<8$vsQMr?Gb0UIFH4V!^FtbXVtRy9F$r0M7nO$@4dr6`Lpj(L*dAnIr-rhyqeGe4 zKG-3oV_S#Punj}0*lO4$BxCc3lCW8Xrh$)@fc+ed$G#56VS}($h{0M1qp=1;)v#NL z#PS9su#CZQED1IYp;*{p2o^l}0Sf>R>^>L6y z^T7bjnAkfQz~2c6!hsI|lxlAGT}oDYk9!3APco5Rb8CgO9KUgFe`7*hP3_ z69>JqUjq-Yu>rJ^xQF!)cwub=o>(L7CET&H0XM8*z!l4c?Su;!JK&6k4>)1(U`OGA zJsYsc9uc}XfHoDjnEikah7HIuA^3I}Mjeo076Vf3Hf$}#*tG!>c5y(6X~FJ-j~yJ~ zVS5I+m>O&_tg$r%Y;5@e3tI%99|M~{K*uHx(6B%KXq#b$4fk7Oef<=y19loDthV0* zEAKbQ3j5J!!xT&HH^Jii?_d$I-!R5r_Zwl)`wg+ju;sXkx%J<`9QzG0IqW+0FiyWN zM(@9lkzwO;6}#E5gI({xf?Wo$@iKOz{}Ohn|01>*wjbxQE&b=Pb^T|t6|e)*!shm$ z#%A`P!lu9`NCV+pVu*^7mI z-h;jQyc>G~8Nm9bf{MOljd>sx~T>|2a|?L)hi z1z1nte5|c+9@YRG6(y{+Zw{8D_f>zj_fh3(2T%&%`M=F>L?^MW1A zB+R~VB8K%%zyz>q`75LL{gGMp{g&MZU-qZ$YTpmp#lG({E!et@%MSK^mF?~um8rq* z<%?`h->__X-;it}Y+wdt)B8TlCiV5n{`4YGw?{VI+b!$s?UHrCHl|(nvA0cD-rFiG zgq=*YEVcKOEWWo%773e~dfDsVI@$Byk1}8IgKK1Nz11?u-b$Gqwlw83Zf}{4(OW7b z!>*=ScB{8grrTQ}(}s;rp6o<#uIzAcj!Xl*j{-*^n}QgV5{?97TWVx7Tgmo z3xM5Dkj$s&wal|8Q04*~o|iIN&kLEL=edjx9=4y%yyvORxaWz?0Jc4kWEXpUWT$%` z%8tR#=e}%r&pnx1kC$u{Y<@gs$~|tfg*~paIpBZ0$R_nT$$ob`%Er6V7RX-K*KI57 z=(dr4f?W_UEAPf+h22tFHf)5%viNS1EV5f5dk=ddp6q!ySLWMoEqeglA(qUsn<BLqS!S1( zEUD|XECzN;CuDECj>`hOj>(?EX6cB`tLw1rZr4GXJ^20mWx_5EnRVA*85OonyJWY! zcFJyasmrdxu1QUHrfZu_vumsDAZ(mA%eHrIl5OtVAX^Jr!8+NZt~D~HE*04f*gmb4 z{q0;K``)=+Hqwc9P)lWjo!!!jon6x39Vp*umkxKdN&7ll zq#dxuYLeD=G)l`m8l;7=%lary?WmE)cT`IwVWU+cece$mecn+f^@VJtSnA$UD0S*6 zklMg@D_6?x$dNKSvZNH)ab-viJJO_j9jVeQu<1&Yp6p1F9_fge?t@$#19^^sIL??B6y^ zTU$3u8(KF=t6>YbR+`_cBF$`FElq}9+zM%UtFrW6>oRE|Y~&V8AGI!&-fNvNb%pFp zNs715k&0SpNjb2cn;|8)PM4arPLtk*9o=N<<<^PPv#k@PCty?eSEAASTcY0jOQH(7 z**D3m)^W*_)~}Lzu(kUlnc6xm`PVWi`PqVYcb_GLExnSSmL5qPZ16fIH7)Iu(w0_9 zKJ4*6Ns?QdB(W_Gl5p7OeU!Xvsgd}%R7)PiPOn1Z)>0;MY$=i8u-Pk=a9Ro^^p-pc z8S=Vp$*q=5iEc}VL>snzDUy>d$&w>2iIRP=>x+}9w!}!*w?s=;!NxCKGQTBEGOHy- zG7Yl6camSt!IH7&Hda9k4&VCHeU2hNR+?zN84Yh}R`)pRP(0KIupzVV8JG67=b!7>LKvQ141|I<+k>(gP06>Jv|NQ^)2lNfx`kX(fw<1UHTr=1ebPdg+BVAHr& zqV`Euvgy-i$r{K-H%JzJS|?HZv_>)mwvMYLf16fFzBegLMw-y>afzg>X_2I*X@R63 zHjr~AB~5cAc}=q<8L)?(A&F^Hkc2i(lLW&ya+1WaX@bP3>7UpOc9Orv_Dw&CuYKKGe~UK_)2Wl z7%0|<4d-+5g~n&%(~VEX#~?#~EZ*JdBUWql7H@)W=RNWAMo;mgMt89i>^xn>lN+7H ze;XXd-y6{8(^mYsK`!oWz{Jh4|CER;8${yb27x#iwxAqwVuQ6fx`8DQgySCbn-d5o3^D8;PwO48^pDn_?1dNA<)v8?KA5H(V88h8?N4_(a1c z@!^IGVhz}oo)N1yoEEQdI4NEQxwocxe#24mtcJtlX|OfjFaA}pAs(yWD;}yxyVITG z_WB*-rg}ATEo@M?hzsjCiL>iBic?{ax>g)nuOj|Xze*eg+f-%ollrA%@A}1J57?mSU*9m1zXlXqJ#CnM0@Igh_=J7 zbxgFjepIxg{)=b{Y+MILiuL`Xsr7xLe|0FU?-G5j>ktjrwTXIQ`}#@LSl1}3sjC;2 z!49@olvP(PN~x<9#la@FRP?^CSoFHCQ1l#f{#?<6x@?hqU8cwhwz8=rNnNstSC=GW z!frNBWL6g=GOCLb>BELLOmv|xM0C3Dz33Qp1m1{t*S!|0)dh++!M66fXnEZ;(W1Ji zA|=?_J`zo-dno$v;{(x;k7#r2B^vnXA?p64>7z>e2Ibo!&7=-9{Wq64t$y&_Wkcv-aR<3-UL=rx=bE&8Y>Qu=sGGy}H2nxen8 zM@8Rj4~s@>(e8J@sH;{()LOeo)Bqb`bx~>Uc2R!qHc=+*fj5g{Yd4C*YuAh3!8TY$ zN(1Bz#{}AbbryjvS$HO_uOMO@`1N zw#q3&o0=q{q$WYggWYnp(6S~{XkHU8G=>fH2jSJ4cfyM`!9p$QfV>hOtO*eAsd+Bk z4%_CZ!nHNN!WA`-giB!O{6MH!b5A(6##8vO8f~8M3cpr63kRzmg*~u;wiPy3%Y`-7 zn6MnS&>~@WwLq9!%@fAME}AX;P|XwuRnvtpU?WWtdRLQ#p4H|;7wDec5z4BKg@S5B zAse>S`a+9pUE%HOYr-3_qt+H)uD&EZTYX-50yfoJLXGNELiOqsLRILk92KsrJ|tXP zeLy%Lw$^)v3e~%X6RUR$e^;U1^)}&fm8!6>YO}BdHrVThAFI{~E2~xui(!wwT$o<9 zOqf`;L>LX*?D@jrs=2~|syV`Eu+yF?yjP_lbgh~ybb!tFM4_napMX>KM?iw&e~2^-5cTYNcGT9(LwZ!Lmw`U_qroFdH`K9Kpm&mf&{_Hu0y%8g4-2>z2L;TE{Q^tavF{cbRqPb#S8NyPz@}YQpjEL+pjoj& za1eS)YXsXXRtYv&tPre&t@{$el8Qxwc@+x;im-d1BluT7OYp0FreLfbZQ!R0ddnvZ z+RG;hnqUwAhhI_tlV4Q+ou32S_)&gB`4@h4`4B%8cJh7vfbt%`UwJ3r2R8GqeAn_% ze24NzJ`R1TT0W<|n$IY&05$z&_uVpHSw)k1BKIhrm|fmLE`t^Zm+Xd>`2D3;B1;_KUSvCKL9)bt9-SxEBwu6m-uU8^M97V zxJ-*bx9k*O5&B=p`2R`|^M95eq2M)Y5CAPfdC34Lo&+Y6+jW0oVs@-m($~Z$Sx-HybzzWZt9_bKaj~ zQ{J~?#6&RS^%vjdbrl=%T7ZvmjaOZKg;!d9nU@c&gmb)|qk;tf0+uoYBzCdI3Gw~CkZbb+(5n0LN- zA@5Z2Jl;`YF3jTXE}p?tD^}obf_~p5-iqRX+{MLzxpRTV@Pj+Gc%1vMXq5Z22yqz( zxkE+$+}@&IZaXjFjV`Ea)a1L7W6rO1P;T;$4K2%SVn?u;UP?&KmH?%zVhhLCbc3q{<4LIJlM zI1y}aVl=LP^v;wsmtP@8+N@DkS* zxDsc%^1{cF8`$z5N#oV&VkDR&t#DHd>N7tZBQFPzPt1U<^>-0ua`xFZFVx&6SZ_>a?C@SD?6 z@PktW+={Q9f`Tuctb!pm9P{-#a$s%faCrIJ z9A^GSjwNt6v^d83r#J@r$2r%4!EuOlCjS8EM7{>+Fmz7UIXm;WbGGJhGwmt<+kT~o8dC}Ip^CGO(peOsmdTriY>lJxH z)=PjD^3qx{&)<4l-c#!dzzun5J)Zl(dN|k1`ZF*@?pinJI$77}I#^c$PXxEl&y`wd z=8CLSfGxtcj>u(Of5>H62LWeBSzNtxi_uxTzzX1^mDITGjg@9 zDY+M|&45L6#@ZnFl=aoz&vUxjzQ8?cWqag&Vms$FuQq30TRI;se%GfmM z6c?~fa&p;*IazEyV56k4FXSY#Pv^w5HGz{7$=;h2#@>KJ3ZT) zod~=Y8api8lKnQD%zg#z6%)2^wlVub_ARzMa9DKNw%J$NvTSX(0GKT2*tBddHaYtw z+XQ;hN7;JWhuBxL_p>hmt7R8kGkXX7VD>il9^kfYWN*n{$6lYU!d?Xo7iIQ>>?Q0u z*$dgzp+l|2{+l(6{XJ_2do&BNT_&@8vL>+Gvi`D~fb;U5RgpEuD#{vRtBLhItDfZxESM^mM^**PC99NW2V9tZmM|-aWu2ADq5~r)nPr-l zz%tB=W$8nAJDhbfD}<$$^^SEM*fFnI8d)z{>RJ9QRp7`xX06V8$WqR_&sqpf88_C9 zEEm?4EJxOVnW*rgL zMCJ|F`%FDn5Ol_`u%2dKVm-_}&+-B`%_){c=5ZFDd6XpvPR)K6GjlJ?GIJNp9GErR zST{1au&!lpWL<{7xeDuK=1SI)%w??oz_MAuQp=pn+LSq)wHCNG3allWQ&{sdC$eS% zGb~?n$YY2!PuKV&QMPuVW{z$(HUB4R*d6mWX2)bBHUr9rx`J}rrl(01oqH1#`3f)j74de7;}L`bcQiC z?G$4|nkM5{Dq<2HWDKY7V|-5C!{`D&ks6~RRh3blx`|N+tRfXgcIrw-TBq?XY4!+s){u9lib-<+CGUkfax1p1QHSo-|bDEe&R zB7LAwN_|WJn-WC-o`M)j&*=jxe)OIcUwS+6lJ3(#rg+jTQrzgpz)o_YXQbHDlT&bd z9B`C`^baXKdQgfr{UtD!sC1tc3jJP+1>FsH8^&~-lv{LZiUFMutR)>fHRUp$lyZS? z0^FrjbiI`0be)u=^b5dX+DF$+*+V~+vXia>n-5j`)|5^3jVbHsD!^u1Nnf0zOrM*w zn63z%rn&S9DYNLmlV{M!lM%CNGQB_fAFV6-53LpWP2;qhl%e4n-#b}Fv4t;x=`4ap8P6<|eSv_;7h z+T3ITO%b?JY}$lmI_-Co6>U5TF{I3B{YiIdT}ei?R^UnL(Q1;e(aMvwX+^-6I!8-S zI!#MTIzfv8&eS2=`=tG}prk#t7r>m_PV-4prFkW7qPfC8MujF%T1k^6Dbx7CqFO+s zCMnTKNwa7sz@?f>(@UB}(@FYAy#S1=AJpSXf)q&>b#^{>MY<`l~E@q6;uBt7Er$@BBoU)bs#a7+LM?>Z3DhlH1%U*1hq0Tgjx)& zt2fll#6W6t;tOgVaIbu+A&EZJH;MPD0l>g=r9Mh@rru9H*jTouO_|JVo7-s7YN1 zEUg37Wr-Tpg^9bUbAYS0jXEW9GxcA>2I|iQ#MoLz9ZpcDeok0I?F8P|TxvtYY-&xy z3~Cv$w4GC;YZb1P<4jRd~XP)%%1YtJlEf>alv7&|&41&}!wCfObgrR*nfZ zRyGNhRuW)!6P*51s}l*qR)=B3^wMfq zg1?no!V{~_!1j7zwKBoWYH5O-)dJvrIa*Cmu(g_;fLr|+kCjNmljoW>(d}0yDHKh&Qmxj@PwH11{KQtC;xnR$=jHtlj}5Ow;N`{9&u7@dvCP z!ggwxm23QVE64b)R&rp6t+(RGt5~t)S6b14BevMeB!0e?Vf-8`ePD_ySY3>tVs$2d zg4GGwUH!D&AOFpASNy1@8nDLtE!V~OTCR%kv|I|@u}_wB;u|by#MfF*0R~x_<VDIH@c`wev(k;%$(g|2*VoO;Z-%=RIv9t!R8O@RsN3k@EGq*Gb#+i}j zwYZy>m*ey-&%stq+wxf41>9XV58PVc@kSs@s6#bcmi9kl;RLuNRh|pQ6#`wOQW!2lPT2L zcnS%aYY`N~*bs_->^sU;*tZ2z&cr^aoQQo&IRY#;Z_4giFUs~O4if7CU%H5cy6bInG&7+88 zW>a`EGbt=!z)hl%V*Zg$Vt$hiVUssTz8dp|d@*K#dqdDh$Z)qJP;j3?uia0w*gn~ zDfwgcV{&D*H@O5DbMEApgLG&T=HDJ~4A)kv@C!dPmMm`4I zx((#L(QC-+(JRSYfnm3pye4`+c}4Ub@)Fn}Dv)PIPbMowPasbMw%rfXkEk)y*QgQF z5OD7LNS#q#q?V|5QUfsW8c5|)wWOk`DpD@+?}|vtQTe2}sBBUMu<(*eZ=w=N0Z}oe zXTZe^Aw7tCNAidYBDnw~&!2=xJtc{w9+7ykee@(zqg+X(C})xhu=C_3{U|BvYLtj{ z2{?Le(#a?~>1dP{=>RbGOi4SUj7h3dw@4dcH+hYu9HmWK6m@|#7g&3zNYkP;NfVECM3OES^Pvv3Ly3zCH_&$Sw<)$Tkam*lRXeh$Cw)c#)MBEMWN+T96|1 zEKDM^EDV9`mt=7@GS1>sWVFRuVElcsI2svjaUk-Q#U9vtKC@7b^tIR!`OrcI*njR8 zizDw^%!_oim<1d_%wkfc*y3*l-{MCEVgfQPh9amIeGz1fPT&LHwrGejw5W|Ru&4l5 z;1!F!h>I4P5oaw@fE#$+A}ZpDMQFqUi?_fK+-dPVLe1hygsR0u*qE-haE(}H;TWN8 zVFPTz1r~w`B@62aMGHD`1}9sXMf@{2j`(eU1DJzj=GqZo%+E&*m}|j4wbT4?M63C} zh$i!0z#^Oq?peHMq#Y^gosG<-{GO=-@?(hHOPD* zJixp++~2$d*oBYG>%$+ISBHC=mjTDn$vh|A&OALFH%|hlq0l^nu>3xRv&`SXE|y~M zA8u~$8-B;!8(4=1=6A!dn>&Q-n9G5Cc+Q+3e%hQJe%zb}48#NGrr~?djl*}E-+)c+ z7IW?JjppaW*P5ROHlnimq434#8sYQJcLFDIrunAuY3A#~Cz-DTX5ufih2h`Ll)}H7 z&4fK}zuAQF9<$$J9cJIc5KFPqY%uJjS#MaCSqE?xi_Gf7^31BkvdqeWv6yU@6Bcil z5f*Kh47|k;W|3jRW+7p(%z}Zv=x631_Snof%-hTxIE-#)u3^q*j$!s@Ho#<*nhC;$ zX4YXmGdk>m>1O6(mS(rZEX-~KtI^2pO4tpv3t_ruTEK0*WOgL%oZ0@c(`LJY;dsPs zOV|Ok^R>Ou^&1`Yl7PEO_8_Z?_+i|7Yq_AaXe?u3U{Rl;z$Ju7Xp)<@rhfX!? z0_Nji)5g%BrnRBtrj@{d95T%h{cM^Q+HIN&EXZcl=+Fk!@X%V*_rQfLHGLUcXzCZ5 zYx)Qnk*TI0p^2t0p|Pg+uw4!{6^Fhv<%I^BvVk4xZ%Ph*Vrm-dV`>B(Ne|QOp?6KS zLmf@e15*++)eIGz9t!1|?t|Sk-Bc~q(sXmEh3PtAO&Xahhu$z<6sl`F7r2v`Os9pO zGo2WE+VpP-Vo)A2{Tgz>bSPx6X&>+?)l6GMwwN~lA5V7`71j6maa;wYySux)yE}$% zuob&e=bSUi%+TH4VRv_6{>1K9kP-n!>e=&M>;KGJ@9VjmbN0pT&#O;2^BHVYs%GBn zQ_Q^GC!2Wt==_O)cV z!1iTLhIL;>hFM=ph9T@=ax&EWm>J4_)C@V;#N3x5(ziQ9pl^Ey58U(KkTKJ{I%Bdo zGh-aKG7~et^~Pp=?2XEJ3%i*?83Vn384r5BGVZ{Jrc=h{UfYawy_Oj#;f}arMqjUP zMrW^PMhk3fDrQvo%4U@HN@f(o&Za;HvzIr6(z_(%0BmmlP2bTwnZCJqJbgXfFaMFA z(fcJmx%Yi~9BgquPY>%INDu6NnC=6+oVU`Qd#|P2^mkyIdJd$2g-y>L>2G?rq(AS; zN`DOdo-5Pu^rWX>?@3O-1Y4h^^pic|=|_5k(|cj}(>uMT$34Bi$0@xEHbAY?3wzAc zIXy<{Ot=%Tm42W{HGNNyV)_o)29-=--y@p7x<@cQ19n1}q{sElrIC96riH;~=y;lM z&v2SY&-XNExKIB+&8p{hnrYATGy~WYeUPT!)1Ri)b2Cj2c116yiS(RJUR&PYQg5|msG{>_o*`7uTv#pKVTqrdH2KAW!?R$^IhC6)T^nJT^Ccwy3V8y!7l2N z)Q??#sc*WvQeVJEYGdkyuG-Z8uFBLKu$NkpdcKR3da8?=dJMKx$*Emk*{N+^yHXor zM|ERrMc2C2;;vPxd9bOPoJ#A8PsO{UQ}@AcL2&A}F8|bxUEZl{VQbYXHLc4oHL1%g zH5PVP4O2tAbW;PmG*i91xErhrsZL!osdilwsg|&Lz@KW+#gnStwV0v?+pN^z(D6t-NC zrrhi7OS#qAm2wq!U7J$Qbk?Sv=&VdR3>&WnDIJ}hl;%!mNGVrU==4g7hMfkdl;BR=6#q`k z6ff9{HAr#n)Jd`F)JU;_-B|e){Z8o=txmBNRoIYSo+8t^G)1CwK3Nzx9;T9)b&e;` zcMK=bba1z2KPQiOyifkw@jCfC?94t+e%J9J`DMqQdnNg9$NA)29jBA8!v5@` zrDJt+R!2ti8rZIlPfqQKPEPEINRELWTmR&c4)5fE4!2})*tE4vcIvQ9w(T%Y zwuD^@on(U!jb!Z(kvzp><~&8h27hw$-Eu&NsH|>Nwe+T4czghiT0mK zBkkXl24N5PUDAj4S4pqipCvtqZQT1w587`h-D$s`bOUyB&n2C2Kb3T<{bTYjKYHM#wYJxqC%B0Hn(xj61f}{f2(q$$w+9^pyJ2~k9?CS1J+R?r>X>)s4(gxVr zU6GX8o|cr-o|KdTTN+VG5$&N#!R>)b{;<94k>u9ylH}NKpJWR=yyi(J?M6xZ?RrVt zu*s{Mq|~mMB-bvJBndkl!bt+{{7Jm+%aRt`xLdvd5~tgy5+~YzC62&u?~lYUZC?^U zw7pM!0~@~25(nBICq8JqpV$w3zBdxDv|Ua--*!InG;I4GOFYzeFtNL>JFy*hewz~O z+UgRk+A0%EVe_{jk<-RWWVSI9DX{-RPRwrGo4B)WXW~}a0?tZY+qNcgMcazRG}r}B zOpI-dO^j-bObmsM;DAJ*HlIX~Hupql*bcEvv~IIXG;1?WG=lA5okYzxjYO3;l|%*D z5tdFAZxc%tZWBse4x7SD6BkY2yFF9@P%Dt=LDBl`viwps|0J3|uJIk5z8(LE1SGOd@XTs)kM0`R^aC}UQe|#kDyST*% zv^d85wAjYG!xpniynTy)yj6=+UV=pw7#GYx&k39i9I`r7yCOo#YX@6`hY*lZMt!dg6ThX*Gwgh&o(_`69NwJKk zxL68oSck^$Z3>Lt+2j+u6*hRBW7js>#jb3!icN=YYlGOhCY@MPlX`48>|D#m`Zr0& zdNql}y20i(PpnTB*F~YEmeK&@u z=~m2Qm$02(67yeULCn2IcFb+q z(I#RpH|~!)-?%&G6l`j5iaFG{E~ck(WlRU`1|`MRH^#*6&o){%QT*gmVhnqqtOD5 zebKy)UC~Qm*SjJ5PeXO|?}qZ|G1&OdjsD({6aBe?8vPFTzV}8yYuFk6xM5551K9pv z6MeHGGx|zHO7sQT0gsM8(GVVeq#-D}4>rL)qgxwXq8l6RqibO&$t=3G!7#e8K_@yF zw!)R8sSR?`Sc7ErKG+Qxh~D176TP`%fwTcO#HUD^4dbNLhM%NF*jV~RifVXE3Tt>l z3W9C%ha}I2ev)g$4U!}5jGrf2Hk=}vHXJ1x!sd7vNwcAqq|(qpQh0!Mu zB3e91H(|Tno^-L^igdQ#lynky%(Y1e>(xo!^-836*ff_Q)z^!Vs_XelWv~l1AC*`C zH;Pq18AXS!^P#8%^%DeN~i0eQA^p?4+}!OzP=T2K7Xg4s53Hj#8=L7NtgeKO;NpzD2gcCi~mSnz|Q} z6?FrVC9s2aCz4ZlBa%^fIg$cf?I$C%>yAY3s_Tv12D|Mok?ZT~BUjf|MP|Z=dqHGk z9Varjju9CJ8(RA#gX(ri`qgcV^nz{ob&*bWDuP!7~3pU@q zB9-b~BjxHGBBfw|%Pdm3&M1<)Nr1=e0u-1F#qWG2(9Rn}}Pr&m*qEcKrQ_bG5f4PSswEI0ifNXCr!QPegRo z9*$^%P5JhSn%bs_irU(U64?DJiQv@cN95G9B51HRk45aS&5qbpyE9@3?9OLJWYw;T zSX-MJu@W}u<0F!5NfGh2VG+@=8RioaQtKWOQ0pAw1KaeL5w5i+5stO`5w@^XuNq-m zs}NyWD;=Q=oAp8ws_Kba-w}cz6zM<@<&cH6Gyy zYMjIO!fw80_|_Ve@QpS4;p<>SUo||lMj<@4MkYKFHqwN`qiXoV!)lg<2f?=fbeMO| zuQ2zT;V@^|+5Z$~UGp}~yyiuiF>LNX2-BQ)sfJxm4m)y{^=)SL{Hs5ufQ0$cnY zVSF{sVM}Z3!se^FyZj|#Q`Pxlzp7bbBe2nrg?+2e4*OKSGwdDg^=}A!R=qlGpgJS$ zA#C@@h25%-3cFSv8g>bG{Jq0YSG$EBuXYSO44eMuVV%`RVXf7AVNI~>rV>_FEgx1^ zEfrP-TmJ%K>}sAcM)g7{1$O@@L$j;LLU&aUg>DA};6vz!>er!bs-K0ffK9l2p~=;^ zLgTBihDL)8a5^-k`dDaS^}$eIZ~|IGU8@^H9jmKD?Z6Bu3^l9fgc?;dLiJ!zZhxqH z_3lvR>TRL&US{ z3)u=Ac$|=RRg92TRYXW8*ao{p605d_#8zz#A%SzSA|$vfHN?LvA;bsFgYXcSs=yG3 zDxVNr*w1qcF|D!uoh^+9hF#cOJ#O&Be)A&f-5UG1eaB=4lV+N zAvu^`85_)~j0~p0=AVD?zDlp)-IcDv+rehA4$i7H3tn4k7`zIc2KC^SO2y#BN}1qT zFdKw|!z%fLgDaN=`@>$~bdX2ouOOGo;UEXF96knFR=x=`t$ZG21g^vVAg#*VLF$#) zf|S8{I1?mOc|1s>@?ek%Yz?*s@l`eiEv>8$TBzXK4~0R~6`Y{o6^x)Ua3J;t{ixU# z^rd2J&<8Lf)&#w*$P9W~krMP6e2A!^yA`29w<-dHu7MTd7IePCG3a!KP0$H&BaDLj zDs+OnE7XJ9!H|#*YN(J1s;LkTs)UWhr9p)ivw?XP(}66oC58hj72gBN6`umL!I^jw zxV_?W;FgN}fmvWqTnk)PaWOEX;!I!)>?0lwjIHPjBvrHqhJ!^>9T-qi7U)w^80ZNu z1wGKQ0uQvS*cWI8M#a`Zc;Wa+$y(@GXP_KbP|bzAs-4cmvkORKU~n@qquz ze+E1N_u@mq&GOd)*UFy-Tml2*Ucl+{TLCA^uLK-{O~+FK-Q`CE+ROU_TENC=4yY}! z3#crw3@8OBBR?RoJSTu%P7PpynXxwjE8h{YuY7aB9@v9i8L+iHEns7LV!(Q^G{OT` zlm`W*mHP%Hfve#h5M6E;5Ls>!5DLbIUVvY@W`K9ON`O0TNlFGdl#2w|mh%T#g1s^4 zZ&d!rU$1<^UmF~bAO0%kpZpcd-}=jf$uZzBR{p?WsQk7+KkQIm^j}hb#(%Etxc^KU z*Xro_pdI~@-K(|OL_l-GAaMu zGEx5=ut1ji6J_&$0m z`bC$W@rwjID4rK*?wqT0T{mjZRKjX4&KYiHU+~TKE zw%$**Y?YrPSR+Y(Qe`oI;$;zjBH)hr`SF!`_$@7S_FE|B8YGr}e@c!0ewXU`je|#` z;x||-=l88t((e=4B>aA_OPBh+D4p|t0#3<T}ij6O+)XX=$ z)X+Bsc1G2GeM=R6y-H<#-M~r_^tCVL^|dKo^sxjtWzxr}bj(M;bjU{=43+mjDy6S{ z6ic7@$iYTwzmIt74IkmsOFjZ%tDNvzT6)N5p`_bqwuI}fH26%GRQvoYDf1ZtbA|2m zt%UCLxdiw50RGBOpO+6w_Fe9&my}e6tZ+F;a-RbREvc=o3WP`UA*f8ndCM8MU1|>1xy5PhFd#jcBdMlTB zcq@PzW9uzhV&N@TV(cvpd#)PZyd}!sOG{+E=Zm?PjIj5gVm|N5;w9eW;L1#S4Hb`j zeJdXF`V7X*2d}rque@FsKlOSB-b}yO!{QrW_lhrj-2r>%gxA&LLtdAPyS>hXL(|}O zqPW`YXmOd>Auws!UY*4>ueM^$s~L7=cX-tlZ}zGzUhh=~R!y2$esQ7~r#RXx2i%%K zFQVATi(KsPwGRv%8?PP3=3ZNi4ZSwO2CbUcnqoz-mBlh%8DQH8dL7Dc+@kfc+k@y%$s+f9>p&_U5f`ionXKAwx@ORHBXD;3!bK6;T-eSEAI2uF7EWy z02imuQ?aIeY?$bN%2O{xuP|mGeulGC)x9NQJm*^ zQIzK}I6D5G--PA8(J)B3F-~A_otDFn&xuJd5-_+={e3oM7u$-ovIy%EPiq#KR2i zpQRoKMRV>tMbqw@-~bJ~D;IrpS19`EE(<2mGk5W#NAAK!cijbGC-}1avZ8bDi-jlL z=L)%2P`CS3VVnCzVT1b^xIv}vgM|g|-wIjopTQ8q+}{@Nb$?m7!~Gd}LhIZg6|Qi< zUzqCN54I4={d!@j`<21~_Y2?*xw@Y!bZ|djXytwc%praEosDMi?N(6u%PkjNqHk`D!VhlL!q;vX7)6iV_7?WL?JB(CwjH*O z&$?|aJnpu>@Q~XYu!~yVG79V6QVXlxlE5*_cZ)8}af>XZx`lyhw8t%=aJ!pt;YK$v z*hS8Cb16)5b1aN=vjgiW#Lc46-_5kp)6EFnBRe*fY}OV{y&0oM^QlWx0yFSzFV zx!{892k?`Qy1pvtbA4XW;rawDrCQeq1r@G$3yNHCgR8`Fy;?xHUMkqOIks{OEMTv zmt0~C&bp8aj=My_hIE%pP(iDUe?h&A577rZ^?4nTM=OSCcwV<3`#0zX)L<-DZ1i^*Uap5UYcUe-P z=rW(rHKN2^{^Sd~Oy={r`~olPuk&#Jg!5qji1RnFqdqx*$baMfHvhTvD{!RlIX}t2 z>HJ^*W#MnJ%%+Gf+%SXf5U|$_@(#zlDq@BOb zNdp|LHBL(T8BX%~$xgChVnsNK=Lb89OL36Ni*t|yCoIH4B+t)5Fwet*AIvaYhoyPu4hy+P4zs!3J#{sQ>0CvJ z-?`Eb;u{~>qS{%!6z`&VF$y|#av`_%q%?nC=Wu*H7e zzCZV({jJ$AU<+i8D3x7q$IIAj&}$8(G9kK}Uf4}nRB+jr$=+jr#dv~PtS z_jUI5xhw5!b5rfBz$zozm*$4r7v=if=Yw13V$aI8vuEU5+Ec+W)3qn(YS{0~RkGg$ z8}Q=x+j9l&x8(BJZvxxwuie_*3A>_e6 z*@eP>{BgU0+=F($xm|YNxm*ja&dxQr(#|Qj*vPm@N&A zHy&GzGjFq>^T#F|w)Tf@c5=SiY~y^e*$npEQ=9dihc;_D{Whz>fxBpv&N*$9!Z~J> z1SVXEO$?{WhQz70iGZE{LYrU?$0m?NxA6ljZm*3eXNQd&XOoQ!xN(^__M8+O8%~^! zB^YwSHYOZD8zYW~jXrGr+uCSx%x%;;hBm5T%c$v0h+veSnwNGwcEDKkWO~lWeX;DGgi?A_K6*jugdf?c=T`X)Qw`Z_z&`U*I9;nwHb zf!1f)-qxqUv~#dN%C@pT%r>#^1D8P4x|6MJ-OiS^ZUO5~$hw}*YhBA;u&M(0?zdGb zd&H`k{oSen47}G?Z1yv&9QGqCI+zC6t#I}wD>D0x)jqKC`mA=bJFRxGo2|BjlUHt) z#V)j3&*oUI0W%M?%4F}gN@wq|N&ydHtyKa$(<+voVinEiT6&RI;p||m5Vo&X5V(3y zR=#W-D=)U0l?NDm+E&hNRVxR!yp?KwvVDC*@>a)izb=iZKTHx@# zwNz!luvBJ0wp0X@@1~^;`?94Z`<$gXI1Gm@h1gw|{OlG>KCt>KEtjy1Ef-k1ma{Cb z+ecVVv-Vj|vUXZdfZ?~!a)h_WZ7CiXPH|* z1?Nx4@)1kT@;*z!@-CQvqLw#V{Fc{QOD(T}|1f27o;7Z9mNjH?8Z5wf7ROjGEDo~< zEDnMTc*~-Tb;Y8Cb z%OVFH!SxnY)=CS4m1;o-Q;=kl%?h>H&GNU{3GRfm#TJ&G#U_@8#Rjkjbu8Af)GSuA z6fH8r9Tc@lVewlev6foIgF!fL9?cpzk7Ny*hl5%1&OC_q!aRUAVD1Mt;VpAd))jMi z);V(*a0(BbJFvRVZCS16)?gM^nwznT%}rQ&=0@OM5azn9edgM%o#q-Wu4TC1T!ppL zT#=P(E)T9@l(`fu#9V^qZ!QMLp|iOl%hsHqWp2(3R)&uG5|*0ze2#+oY!25x6fvL9 zS#Ca=v($V79KP;bGgETTBh!6gG+sB|opaH2XU-YZZD51+nQqGIFwM$o zGF=CDW0~oyoC4DoIc(E(a2&~|$vJyW6LYqi#)Ij&+LV-&ZW@`BWEu{xNVsWGPM~Q( zj<=~FSdaFmo;jAL?l~r=uHZgum^$PrncC&ZnA(5=DPU@mv&_^qXWqmZOp;$F`Z+&M zbaTF%Xn_s+(nKw1z(ghIzKIezkylM*bIzMc=bSW=1T(VRL?oxxL@1};L;yUK5) zJd>q4Op`?>*OJ_4GRxd)GQ-?#G7YZe3X=(Ds>wJr-eeSv$qjr;7;~6j#w@0bF%!&73u6k?*cfN(8k50q zQ8dnGN*nKCiW=_%3v;RQR_3hHX6BU9MsP6)jn*;07_DKxGg<{k=3}D_<~^fS=1rqy zuwTv^#WRl^#WD{XMT4E$Y!tz)H40-^7=?hN$uaV0(v5tXn2|S_n%j-snH!BKW-UHH@^t;FK{^V~QE6Fa?a1 zz?_*glw(dC$}qEF#OFZGW-RWC&O@rfgAp0WE&2G>$%DB3uCR}Cq|~>2QWTk4c{;#3|}#V z3}1kC<7W7T;b8cfVP*IT>`y(zdkhW3eulE)ZE!%v4X-l<4X-kI3@?KT`p4ir%!aFj7%a2Tx6TL!(1D+b++a|WH@h8{9#Wpo)dGg=H9!4R!9sAUuz zR5Nl7D#6&n4N4i=2E~jW28CdYt~JPIWE!v;$p$&#j7AvH7(oUUhK~Ub=BR_geukAn zHp9eV5BNM920Iu^2HO}i23r_hi&Vg1BV(Dt2F9HJI&evU>91n^)L+5)s-FQy=}Y|- z#(;hj4!2}^n)37`hnn>7U}ykIQl*ey1o~frhE0> z7~Az-7#sDSzy-?Cw__yf+c0AEt-v}B)Hh>z>zgoK^^L$iwba*V80+gYboI5tKvmRN zXGrU-GDP*2!4z7mFVC3OlVwclNrR0#s3*brq9?|9rzZkV>SH|t#y!2|jGKDAV5Xkc zTf#W5w?IFrH%I4sM9q3L^jf_?^m4r^I@eNV>;0nB^v39D4jWw6ZF)oWEWID})q3B+ zSWVRXM32_{Ko8S<2bPhS-YdF`-b=cj-gB^5jr0cSI(q-n)$|^M!z!hBmoB2$PhYNg z8%)-Jy4UHGx>xC=x|hL0`lNe-{zms4{h96=uv+_dPtdRH9;08>Jpyj)QQd>|Ufo`L zyKXlauGPBj^ithcdcJN87)lh~2Ks*8I{Gf%8n9j0>sHcN>Xy?}bxXl{jnXZohv??h z{dDude09=g(QR~@bTeH#_)A*46uOEoPM6aq)43L`pl&vuM|UrMUS~JBu)lP+(|_u0 zrGM4g3`XorohjQ70JOrwp9{dXkPGJx0d|tl2;vPrA2`JKa^s72H`%9Vfc6 zjssm+#|{iyMICFpw2mcRRL305sHHl_^ncn$^hs?4uxWp2>(D=GYt!FoYl2hzNL!WO zudPDAuB`-S?P+Z}`cZ9Jdat%LcvFqq;`C~5F?y-C2%T%$=4cDhDcbz>{n~us+HTQa zN?)(NguYUHfyOm%enARbhzt%yTr&ceRyS7?gG;^&EnxR%3_*$x3%`|zfMw+BnJy^VaS~avq%_`cA zW+k}1BbueO@0umFkD5hb^ghwdr#;ZjrQOzKgUxkblSwTyr;=zS}jo(>7{uqpi{00@`<_`)jP3PSe#)rKxGAfB`I}nLrcKjHfNvj0F?yp9YCGsS!yV)rbHa_>)Em?Ttn- z?U_a(IKg)`{AkxSd}tRmyul1UqTx>K(Qu=+X}EwVR;A%cE77p0L00Y>K~{M>hHijHc@{~)l+{()lh!{ewwuUQ>v)?0F__;F<8j6 zY7ePXYWJyQYWKiJ{;YO~`c~~0^_kjDFp~S#u2HY6U7=o7yA1Z)QMC)yUbS=7cD1u$ zCs(PRqL!$gpysI^2S=GuJ3`&3c8I!D?I4)S>(qLvnQC3sWVKFk+alE3s6lEiR3Eiw zu$CRv8mLxkbyO3zT5y-u)vBn9Y86yzwQ?|+`PE9OOVx_0v#Nz)zKyEpQGclBQa`D( z!DfD@%A`J0Wl;N7Y2Y+pR3)gVRB`GNRWg{(ZL0gJ4XWAHD%HK<#pS8)qB2!?P;u4m zRIcT`Lv;&vlj>&bTGfrmAvn`^Dtc54638&czi0#)J0__ z>Ws1?m1|KCE6Y*8Da%klC`*G&{X|)U`aoHndRtixjOugB!qgMWLexXb0$}U4DDzS4 zlzFM;$~<6Kvz3=nY08TfvhqBI>sW77o~2|d&rnt={{_=JL3xToQl6xQD*p!G+EaO) z;-oxAu~8lY>)Js1Cq+wnkfNge1KewI<*yV$A(8n11h+ zUQ=Euy`(%=dI2`}O{J%l%SuluXOsrO$?j8nMCnj^NNG}f0A_ZX(p^fvQa>d}={9(P z`;~4|b}3z_poto=v{xuyp`<8XqQog(1Xnv)=^VvZ=`6)f=?oa#R!S!+CQ2tLdP>K^ z5>!$;LXlQFOc7N&2=?|;rC!RcVh?3Xu?rmTABr86Pm1l7H;S!baz9dRrt~W|Qm!dB zfJ1mnv5s;?v4+y4SPfQpgJLD6Qn8#;tXKwaH$$<6f-4qLvK0%#@ZPAHPg$dwOUY2= zfMFP;$fATPGARLy46waj6loMYMGD12kpSmgTM?tEDv~Mkiu=L*7FNur@G0)4EGX;- z|8PQKCuLY+2j!c>HVW4Qf2pvAGN7=Ta$jK+xZqb5Hc-wftfw4TSO-RUr^0GVv%)G$ zt-?yM6AKhFC@h6^3RNKu?C{+RDU_`WNtE>piQtH*D#TOb72+sS3Nc`c`znwq?g~*9 zM}HYS6hnD6FwRxwl_~P_ zN)$e_0a&nZvax!3_56ekWzRF2b-pfgVgFYZ9M!7F1O1UW~3?}+nIYG*C zIRVN+Ieu^^o8}Ww**C;V+1CWuW$%`KNwmtoAnIhFgVA0j z`;_3wJ|XC`17KtBk^PU@Ci{rUl6?qvd%Em>B0=^ZL6W@-j=R6?ZNgLb7U3j&6HIqA z+3SRX>@`A5_A0oVva**6aoJ0RpzKAk-sfb_6Vo#1h;f;-;J$y6IZeEkIYm5|ISB^* zU76#=4Vh!aMVX^uavqgAO!UeeBHCpRf(>6K(@T`d^bmP6-QdLIGMz-WOb4+;rX9@q zwKA9O9-l8yxzx(mBL&X(rJp%>a|W zNt#B~NK=V2X$m-^Inp>mk;aJq(qypeH%sp))}dBN?*q3!R(dZHA-#tPlHLu5y_@t- z!d`j@VJW>G3{qX`t%SPt7D7RKGuZYb(i@58(pki!R2De*zopg_BU0;#?^0{QyniLN zns_3$ig+Nk68zFDQkld#sSM(TR621;DvjtwHA|%uwNfcWxl}SyD3wI8q!J0LR0458 zDxTOa6-R89iY3+~_mpd&rb2CVO9c|5QUL_Nls~ws|0I2hNz|yM5Aj3NoA@Z{MZA{uB%Vro5Dz8Yi93>R z#8pXG;ymi4qziFa(wXRzbRt?L9l>0!khCX?P;5y%f+lH8kR@%1J(AYMR!J*jgQO*~ z3Y8{lK_p0;6H$_8M2Ms*;U{TAcp$5l>$O@-8WEmvyj;tuMXgfekKLWwvfp-3E-P$0S` zgGvp)A2i$V%{nF)M(a*<}*Th&l14#FY3FVoZDyA4Gi? zU%=mr&*RU;=kQ0Ue(_oSy7)i*g7^%6O8hT=1jY4fTg9jGdhsc|5>+fdiF3q%<8<)} z97F9D|AlWCAIG!A$MDstbn#I>0UnC-7rT#pirvGVP&Q(BaWk=g+yJE|b_YCOS+QHVI7(3LCcaGU20kZx1D_VX zj*p98!v|5HMX%y-MX%t`QIA9~b9#tuN7B3b( zgXf~?qNj08^c21qwO#Zio+Ww$UyVu^J&q?L1DNXohl(D>{Y8)9o+u~L!?=y;A>0gQ zAbJqj6z#*6QL>`FxVUH!E`VAl+KtbNbmP+^U0?_gB1ibMNC*B_q#b{TdL+_@_oJ?h zwBi>;TJTe-BO=Xsk4O{VimDfB#4Az7A`RdV(?#lWOr#FqD^iPZLuHB7;Hy#TBGq_; zNEJ>(g^E<-{wNQT3fxJg9JfK4iIjm|tSM58D~puiGAJ>TVq5^VOr!{(6)wc5P-DUc z_#o<&a6bM9^-MSqe9p^{5JACSHW%2s3cHFdZkO z_6XDPZKy0^D!vNEHIoxiBw+#%5yo*pl!q{eJE5$F$+#&>U-$s7fl?CQkIM+}!^Kei z!rAyz6xUmxLX8UT!GEAW3GK$;pq>it!XKjU2<^nLq0S5Kz)uQo#}A{rg|^`>s5;~{ zbFJn=p)EKYMHAYLlTo{cHsM=Q8-zCEt5B&zS$I4uN@xQfg7OtwkGrEBk@3uRo=t?- z;(90zp*6T7N?K?&E{ft8T7@q`{S#b?PohQzSK!}K9|be<*Qlq+hvpj5w*}MjtElsW zY4{1$AwhJx8r3YAg4d$TQH6rZI15D;Ou`SKb_*urTTonIdL=4VFdmOXMGD5@!6+Y; zn_w*NfU**d!HrS6g3-7-N>Px6OQA%NOU<>Zm!M_@BJtm-5rGK&8|s5VIQ|Ot1a)5^ z48MiCA`pt7Lmd|g!4IN3QC!!$22~~ygcqQ41OjmiYCme1KmfiOwNAhvUx7+N#R~Z0 z5vU*mU)&qTHL>kcmM9|uZ(IkZCg6oDpd?Yk0-iV@YJuMa|BISH4fDI>Us3N-Tu*xd zb&uZ_zlpkxI?L~ZA4B!=JL4UwMpQMw6JCnSM=|*waRRju#kIIMq1N)-rD6ZozgyKcbFSo@1pnjo-mRsOoQ14JLmYd`M zq3)t?EH}e1p-!WYBLACffVZIzAMS~AUapVZqRdbR%k^+Alrl;dCB9r27ep;X&GG5r)2K1jAacjK_V`=WGt?tK zExaFf9d&_E6F-GIg6c-K@@e4ps7h23ii5mzI*RL-@8MI!x1q97t59its(1p5gbG3V z@u}b*C`Xhv$`m>0`X~()*F2ZuQ^G}2{HUd-2^{ADoR8$;t*16VtFv=I@hH~JQ z!mUuoC|#5~N|9F*mqLl4mZKJVB=H&Kv;RhMo%V0252#l>;`kHPebg<~71UWCG5k2{ zAgUA9gsMT6A=^D4#Wmh3sQsv&JR9@I8e7HajaBK8ZQ=*oRLW7bu$3nCH{ibC>T9VlCeSXY-jaFq+=!nev#cSZ1r<-{W>2*s0BB z)4z?G*lY#wRDoS4)@-ul_jH^CrsDeL*YzSn?CFc>@ta?tk}bt=j?Tr@k&DLcM@qh= zk;7TtKZi)Bm4i&6^c0fz7_=iUt`@nU7{_n%Mz7(XtujfhG=bZHBt@etsY+`r9n(1%g%lm z_wtA~d+!Usm(NYR1o!T9PJSjsqwSHs`{4=e%)i}!ylVzthh^=qpBnv-75H*jeczr( zu7^B#9dqJ+_>kVV)3K-MzV86<&b^|V_x`I(+tIc8X#amdPi!B4?|bLbHU8}pS+8%= zO=7k^(As|Uu}S^bKuOUXH}8JhQs~=tty)5ROX7Y1t4EimZ4Nm3<8obB`KHgJxtC-_ z`#08nw7fWHGm~}K?bZ2oL!GR{R`hdwCxSL??YBDHTDft(qV(s}SvtAvY81;)5%ukB z?+*o^ydZvI&Ds*)6B@+B)gl^~j}6SeUFA|oKB~w1u`)^C<4B>^*otG-yoY<2PGn|T z-#h5O$3CZ>n6m9*?|+_ZmL$}@zwTDba>-AfA2g09_iA0} zh?cBNT3b`oUcHx+xSDaGt#akcgx=B2*66oh@fz=gTmFrz#?dkznjg1L#q6RQGzAOw zM{f^NX&g7IAw9Y!-LOe&UDTCDvHH?`){)T*qIIFGX2ZAKm#A&~aVhN8F8P}4nM9~5 zuU7Tsd-sqJWQ(fGtl1#%aj!~i+2es&Mnc7^Z|ed|(P;hmVHN-6HN|BGw)cIRq9;lt z?q~ZnK6_nadqvlq_wMqNRca4BhbL@{RVTK4tcYD#bUIMpJ#4*}#L1zXO> zx;WXW7MvQLa55Xn$hUf%>$q>AJMVCbj)R5E-&`4uvv%e(LAh~-p|<9kjU490JL_{M zv+P^Zo2)Fe6WO6RW-YEoTx4ZNG0k_M)MI4|Nt)>%DakoITWPY}k1yw^jk@vhzI{yk z^%lc{*lC8r89jsWH#->&%}za%6~L2RI^I z@6_RZYiET-pX|W{3)c&V+=<8QlV0+#?{>xazw}?eZI3>lqIi`^c8;!YY*oY+ko<;rWw!Yz;4S;eXGaQM-9;-IeHtk`Hs(vPS2HK>8fkOV(Nt z*PX-Gr3fy3yEKbAxs1<0h?&LIl%LPv`t}b~_;+Fczit08!q%^VS=U^hE}nmiQ?Ia{NkcRJmtSJ>3r#bT@>meqzQ((qT3-n)bCkZt`N9e*41T44Vbcz+X1_`db;!}J^2xkvGTyWU>I)}D3$ z`@i=}`R&VCSH9@qZo5mE+uq4Pj~Xsu+AClG5#l|MC4^u76Sv|l_Q9#^&*=-Nu`_yw ze~hJ1VPB=>&!4%eBiNdk#(yr^AI64mO8qI@aS*$Cd}bQ! z?Zy5zf0*9?z8lLax;33I+J$Y!4^IE@eKwldh9#u!pLWS^LEpDxy1ujtJMA7cE!*9I z?Y6L-ZaiCum1`lYCht{YbG+ZCEjSn81%Dq;CEqhx% zReG`r+xLi=I^0@-C0$=T^)W9GYdsx4rN51X#rD}vQ6gE`_GZQV$38SwiCNc za+y3nw+-_R)t+2v+k)Bp3r(g5ZNjQOfBk+kxB=Vk^5S;}Z5?*k{?czgr8QWkb^Gs2 z-7B#V=6S#W_x|2}Ar1RrnDl$6dkR*g@AaE~J`o$xHT-?bCLUw!Nc{fS5rbXP{xcCH zN5b}Mzni#)MPNs@Z%jmf3B@+)^iE882V;G@B@^BC0oYdk?1_DozSvpAjENP#-Wb~? zU}9yF2lmn2d}99#SM0L2+(e&}GiK;8|LcF}hPXmotlI1Dum7%DVQm3Nf327>$6Uj! zeu=4=Vwth{ug4xnn0)G*Ux(85vE6c%~7VO;l+IOcePG5)<-1UuWmar}Shm9zVn zW9;wF<9E|}uvgPs@5$8L5@RAL9Lvo{M>8MioUGmGMeWObDx5<}wWscfi zx=tn)2aay>x<)h*5LJ^EKp6#&3Q)e^^1D zO}O^+f9FDxFG=LAGeti;-o=rlhW7l-d_p4gs-*vPyAe(%!u)@_90?}(6J|e?D*eeH zPsskP&Gtr0`rOcBoI5#N(j$*<4IBqagd-?#srTd^)*RKPU zJM{+rjYbY!JtsQ2rTxc&?aQWqTvq*ZfIsNX51YdG2k_!+KOW4#I`Hmw_mBUbgLn4- zcOZ1@-XDbF{R0^n(tjMM-ae2b6!1gz<+TGo@#a7B3@;s!`#+w}Dk`eC52Jv9grtO& zfS`mRjf6;dcXxMpoEf@1rIGHCZs|rk1wlYWQSmPw9~a*{S98N!T)~?2d-mR^jN}`) zXGh?|>CFL3S92gFy?1baQy)m0HF-cRSRI&u)O4WhUKU6qoP97{S`-+R5`3Vym>anA z&GvxwE;I1Cu7I=NVxWAU-ABdyd zz2BVe6-d%jyx)=M8c0qQyMLJD5J=|kzAu(;9Y{Q{w?7JtAw6AEX z6L@iszpo;%9{9`Pd=Fw#3f$}8+FQkt4cufH*)!S}4_t|_-NS2o8@PO$wg*712z+wGQ zU!REK1rkiPeT}+*bGEH;!B@s$)WF%sh_C<1?*b$loWK6Ay$G1d(fUgM_P+qL$8W#7 zj~)kL#XSFdrFa-H`~c@Gc;3jA`yAkRzP?-AzY^f#F|hlWYd#?KPvx#{;Z#74bMh`8 z)@Z=bW8d99$BzLr&ZfIRCc6T95NoFo-5~(m|Kv*-l~q6x&f1qBY$gE|h5cVtg!BS-cq+ae zN@@fwOeB73l~oG(Yv%K%Lq;Y*_{#XpiI`YGN2>G}6TUYA=4@lGgeFM7d?sQK zkg>Vl2G3VKpXmbrl}v3nby5XnN;Pj=r;-M^e#_Zbw;>3CVnVmQUt$eA)^I| zE~;-^j@Tmh~o$22S zKwb663#!=4E1&bXXHD9=l%BkQE3wZOc&;Gekum)Ww%Z1=Y~W811vYxKveA>HDj zs`mfS{OB9pHBU66Fg7yDr)(k zKO5Y{O;+~D_))d_d``ySt|evD4@b-TkjM6R%PXRmUgWk1h3n#zAjj}Zy z9BV(>`GmEVdSgHH3GcNdWgWj?gT`yp-&OpMd!^ToAXz`tF1EE5d@(<{4$?KeTmip| z_PfqnJZ@7eZKO(u$5xUc3-??n-w0724B5ul@;QM3SZVyz7@&lLf@!8 znw7!NS-wuFm@CN-l6^Pn|15)h0gZ65ud!YK^0ua*uX{qp@`<&ZFG)+%vWBOfuk>f% zWsD#*UknVhW!zvrUwtmQWox*audoT{GGTz6Z*x5PGQOLbZ(k3}vZ=X%ukr8iOXw<` zzA1F`OSi9?eT{TFm*gp)`S!)XU;1%D=G!qGv$Qi$;H!k>u>|fEQ@+T)5f`mg!%6+UP-O^nDtF9zQ3CB*+y?!EUFsuxl_tp zywK|P>B|gXEWc^-q5tZ%Sf5|(!^)w(NFY?|vjzz-PTap4_SG!I;+Aci592fZMTLu4 zpK;Ig1#lnX#R~Ajd^Wbw6yxqw?$@voi(&6`vXHgV3p4XMWDj0Y{!iB@F5YfI&|KAL z>!;d6$druFwvyli6PJijQUl$>%hcCCe~BM0#Qc8cgC6kTysXR%pQ+uAdCP1nA8Ey* z`K?1DAFsBW`8KXcK6=m7=l}RT@cAz#Xdc{U;Q#)3D|;!=ud*C^6Mla^pJcr4onTCJ z|0KWcJ+g!`|GahDyF>ZU9P-AHx83;aobYv*_lnfVxh>KU-l#*Bb33o9ynjoi%*lur zdFKrK&k-nRd1J|0%)Qk~^yZ&Yn430;@P4VqGdExmgiF)AW_Jw-aB|r%KlHYC`#Fp2d+Wtbv^0y${m*NzwP)7* z`;nKJVcD#F&W=|&YT_)oLvfzWc*W?L&Pt~bdnuvG&5rPNdmS`!&VIOm!>FzW#Vn3> zrPq5B)Y-Z70f92b8&l{IebdBOc~ zif7o^lbZ4Oq(Zl*rx4ZZMJOj{_CpD1pJpD2FCc(Y0sqoUnn+R(%&;GZEC)M8x432#dFUF0DUw_s; ze0hc@G;2S3KoYeR0#+j)(V7_(`DEQ5?`&Wbp`(o+^?|k%-`vVQrc>1>rk><^{H+n3 z;OTV}@eb{5{GKlK`1WFZe2dV|LriXL9NZbD=rui_W@L{G zm&$p(?+YF8q7(6W{ljs*JBP<(olJXNg5ae`vaHCs3Y^A6&!1_0=LfOJ>pH^mD|KuS zhP|t?cP&UBtW~svC2kYSQ)!_m?nU%- zicGh->x*G+&p0>Rz};c%H^FYcNK?Z&cV2GYVJ*Wl-S%#;aSDbhyiME=(xZmKJvV$) z*6nA#!7xqqTQ><&sbN)4F1Mw5wqeR82Dc&`vSFAfrCa44%5V@qf!lHBk0FvWG&g7N zr6F1VOV?L(y+b4;$F3}H6+4v}^IVvOB)o|c+@bgW$Yn%7>;JmTFtNyF;L7Q%8SE+-h!CVpx zSHGg%K@WQ!*9+r_!J|$E*N@b$gZJB}>+%=9!9HakSN>9oLFyDH*KZE525IJ~T=#jN z3=TaabiLmx264sFU1z6{2Ch9WU3&5s2jYv4U2a@@2f+Qh`1g{F7iG!-Bf*4A{l9<# zb=F=Nkxy0w&n25&Ueu`!20T^3IAKl1BHyBzFAeXNlXbkSLN|2W0M=E5{@ z_z~RAiGGu~{21f-_+|pj<;y6=N5Z08XTEW?j~N~(&VQ$V^^c3~I}>P(0+)s;H;apGR(C^!w<1F-2t3T8+(V0t3q+g6I z)HzL`xxcB;+u6dKsDH)W-Z?+*wh!FvMRL`gO;+dnLb#-y4{p2q0*CmWw_cR>v8b~; z%cv&xC2!C;(*^nW)teGIyVO|rh3!0a=G;>5BQ(BpvUx1fr?Y(QL?lPwr!BwZ#2bR! zhu^vAG~ILF8}eezY3q8Yw?3}R$yR8pH|uwulLM@^S4jE2)AymmUa%9i-$gm;=y>&} zs0KR8m6-H0=esy{{3q87eKU6|m*VM7Vbyjb$)@hLa*}gGJHhNduM~3fkpHhoZkOH3 zvg~t@0V%!HD%w~NyELiOC#$BOAvY{1rSaSz%6B)8%IuLnJl($?mowdZ2sU;d_a7Mc zG@LFu2DnQ1fPLZ(b+@C024xQuYrUiQ7<$hJ?|Vlc(Ldc9Z_*v1&h_pTp(sZ!zTxgn zfdI$O*7|NsE@#IY{_O5c1~W(Yp0IA6Cz_68k}lmrs4|Xw(|X-bKLi}f^(DI*W?3C~ z4%xb^>u4N>{K>noq8~f5;GuOBo1r__m;CAiyGY%G9}fO&gI#RXpB)B$>be3_KRJ|; zz3a-<8g!uU4($piYIWc;ckU9Lu5j4F*6SJw$#Gz5mFS}6NpN^<$<`&g19!+IChroC z@o?xEMeV|7w{{2!`qf!6tLw1IyVgnWsNk^mXRy-{P1qs0uCCKFi^E~W`CTX2V`!U6 z9NwHececF2ba3p`>!j_wvKNn$>@*WTw(rwn@AU83w*SgV(P_sqZ(o0f*2z&kWdHor z?~YG|ZT8|7>m9OzmG+N9hdZ)&bL?TJ4ILwr3HAk|IUQ5);r5R75goNR?)C?mZXNdO zR`&QO1|1JdbnL%vNOyo8XhKlPzOsX=;|j)RpH_p>f$@>np7Z_R_J6mJ?L)FZxA(tB zw~tI8Yj?klZB@{FXKT4o z*$Q?q|L=jeIi~PdpK51Y+iHhaOFL6rVF?w}dYdP^&{51*N?A%wa(=oiZd4I`T zgZLS3ofXhpX?DqM3Cn-CG)H3FhM{k?2r=K-j9ZViw2vIy>`XMaFqv-KOmXJ5B%FS- ziOY#R@#~h;;wYP?2 zXD^x^@QrNxRrZ?0;mS7T3$xAH$09Z=dR@&`+MG6KyJgL-U350;&MD13RKzyVZiAW! z{LpP?6YQFY=FhB+=(U=M7!R$dIz^iYeAld>YOyx=4Nq9B{(aI6cD@dcT5EIO-yd4j z@~y=-)<3k&C0aiW8~MYvf>NxMeVm&xJVLE{HT9cf zEj_L1c%_@D)UB)n$hew1-)LJ+-aT!yekNl@c!<^X43*zXW%0D}#}_86@WGwNp-ytE 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 z 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 z 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

o)O|1<20UG169w`ZZ!!M6Q0^6>jn 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%0AHw{9WBJhGOw|t-@RqgTL!H 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%0DcX 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

kr_Mm1FV@@+s0Ti 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%0A!RlD2*=F=K%^Kh*GPw{d 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°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�}zA;!WbM;yvO6 zB6XlRzE{O}#ScVkK`}o?OcR@n?ZggZH?gNUSR5jb5|0)qiBrY;z8&T%y;@u*o+f%e z9xjwkohpv^cJX2HG4WY(tN5B|WE)ZML)o8-Uy8fMpG61PzU(JaOch&*ZA5BhvD^gl zSn)WqP%IHE#43?;ZLEK?c&2!+c#*hTH1``({;#sl{YKcg%Qp8LVLvSUN%2|nZ{q9X zcJV{;GjW%=NBmLrd_tJ}ljw)yUmSlovA5V?H1{QuKTP&f;y95?VXQw>^n5~8$Ts&M zk#Fulf|n?Lt@szw_L$(A;+fr>p!7ah7<3SScs*&dYB53X_g66&=n5TSm ze-SpN)L6buq>38t(?oM05w^LH2vS0g`PYi(ej)4!WIrW7CsI0%<=+>nnnwG3G06L3 zu)X_(lue`ER_rL6`+`WPf*SM9eL!%M?5SeDSR|VJfGAff`$BP*c(b@kr1~1$e_h;8 z;@nIPHm2_ujno?Kc;2@H8;~eR)iv7fMJlY(?k^req8xSBm_AV~6iY-Zsxkj0k)mp} zmy6U@qkXkV{WRM5h?G#HZSKo~<~|(wq0%X&#{BO^@4j0q??WM-x@lyFNa-}%14Ig^ z(LPS3J{s+LqPd@j_4MwiouhP0qOn}9NL4i2n?(wv(SAy#_8IMWM9QDh-Yo`oA1Pj> z#u@Xy`(%_kquooS(i!bhBE`;VPZz0aM*BpOvSzgZEK=Ew_BxUJWwbYncam6ds+ckT zX_0zmwBHpeSw{OCk*a016GW<#(f00dQJ9SOSTT=8KjuCb(#?G=@KojhS-e8LMl|=S zP>+gaZ0{kFx?{Ari=U7vM+q{foBL9rxeo<4;C&;o8HsY#9HZS?q_P<8BSeae(asa8 zFGhQ|h|65l4mPVv2MqD`$q-!_;6v0rv5#opJ3xPfWsereiW9_1;tX-7 zI9n_e7l}*78u4^-xpa#g;iCS@o*INgLJ?*1>JHpiwoz^!n?>N6==f5 z3knPI?vX#2Z$J6mCKccXrCG)5$E~w(N*RA^q!uwyE32rYyqqtD`5G#zEGS1Iy!wtjs)Gx<8E{7t-Bm7dio+z_V zzg{Ke1rfM(L%?OQH3Wgn=wa^mY=$_?FtER=2;LYFwRjI{J$C>tUfv|w{`O{|y@vQ) zV|$zfuf3Uwdvy@Cwx;8Gfp2_X9`C_=ah5v_6S@$`wYPYAl}PaSJ8uHk1?Ly`%XF{b zGZ6RcAZl&OvaARrTD-hdVEfy+q(mC*5UrZrKUg5 zqb#U}c?=JWUb(*>iC@O54B?e~UU4rgb4YC8VH)R|%hL${@ioNwy!qqi^R~yEh-0(Q z1I#jWNZn(E{c<4#Cg%QIJp|vwkci#J$d$1@w$DC&yOH(jQ2ZDUY2M-Pj&*JLz!n*Xe>1&Q}({zLt>1Dhlwa*y< zPf7HX)XVQDXo^phjn`f{*mHWCG33IiCYzhccc)! zDLwahJ0pGFnjHE^a^N2+SjRuo&Kmkhn(@ElA1Quaobito{+0fbLI?4W1m8~w@sDJ~ zKayR?KT_Zq{UasAKT<&ck>37$`asV^Qu@kf#zRuGRj#+Ifm;)>l_tku(5l%Q_(e(# z?1DV*&f&?|e-%hf*m*`$!dHRR=k~HV)X6(Xij1 zj3Gzt$*}C+jrJzBzie0<{5tL0_BKi+?hMCI%L%MIPCk?lg%71!Bg0<>!mn?0Jt*A; z4_kg8N-S}oDe=Wt_GWc|V%t&hqV(1$&7)qFMtx%8mCB!gp2q7ob7%zZi*O(&--jbQ z8J`|c`VLS=;WOz{B*Wd$i@5x9+TtV-^O>{>7JMdcLII}$g=0RGUPO-b4Qj-ECY=T= z5FavLo#W%WpwpPoq!Fl$-+1A^p?oG?kHVhMq{opN^OJ|;zJqFXVPA@_{%<%-esFHpGj|E3jIElhO-g*OzOwR_wkv;=Sr^6 zq;C-Od?xWKGU_wwb~JiGpGgz3B0irCYTX%x6+ljx^>oX*27_d?uaGj$%HO#f8qQbDXA&PF z?CUd$@&~`cXVM=y%$U!lLpYxY^qDk~g=0RGuA&+9nRF7(n9rmu*;LGD(kM=D%xBWk zT&LgYGwFCX74w<&KIh|rK9l$W%;z)dB<|@kpGn_xkTIW0d@APinPe_pV?L8wvftn2 zGwB8l(dRSi1kRMtXVQtB44==W3z_fpnZ$=XexFH~a#!>DOgft@<@1^JEoa2%Gl>tk z{63R%*`Lp6QfJPB&u7vD?BC}zDZ=)BK9k;O|305dbkOSenZ$>aexFHC)AspH8bRCV zGl|Dl9iK_v*`VKNQW_KdK9gp0mHa-FcCd~AZl6iToJP-Q5}mlmd?uN5iO*-!dd`r~ zXVOTn|ABlaHA1^FpGoxE1a{=q4Z`Ap*7zB)dWK0!WwCcTW&waLT3dOnldqWrSR zkJv0$1i`W+WtbB9OzMqUj`>WAdmVXEXGg~UQ5kB+oE}yEOdD;|u7%ClvoijI{mLHGU>)kd1p8j5 z9fyB#IK=UtgKUZoWz1mOSd+$`^)jX{!#}tjV!u~n_-7+zRB_DXP1*&B^3|J+#Y{WK zq@9AfKLH_=4vZ$4<}$GxG(^ax1EYzi)QvE&L+AhpM!9BPGvUA}*ElfZ!~JIvGA`!Y z9QSGeYKKRGexmR>GWT zl2CD~sdy&LGY~rR#kL<28sd)6p?~7~WZJEG5w{+>e9C#~GESWmZ$rW@2v$ed31GN< z&{n73tH}Oa{d#^;Mjc8`)kN!caQkbVj6oo{{VB0C5;`EjV+rasN4Tqgy>ZAs zx_&+We1eZKtxnhB-)GS}g?4kU+d0VkbF_{UHz9#Po3J|9;0Os~{jif@v9~2=q~ezx ztB~3OEoC5dWk$CRNI4SL;RtvX$!d*J4Z>&m-weTiIgt*?1W&NITDe>X>e{P zA(D%rW;iGOHKlF-moTfbz>)teXKg!&TV48aok*ze?+$V^9gpkDB1h0**K|CUhtPEfnsEEK zdYBj3aa_w&QKlW@EB9UU*#XKfVC7sGs}Z?`l^3CMw=$$`g2l(F7!DiZ$w8iqI@lpP zPBM+Wh!R^7Oe0?-vJ0W>a<7qOluJawu6!5%na6i%ESo-mvh9h^ieNY!PJb34e+%;I zFQ~nn4@W>K0H;69uf`MC=T+aU>pA^VeXIAIIFY(ef0m$$KGSHz>5nl^!(`Iw56|Fz zJ*Pi3@LA3ew|?dau5|jtM2GY5HUOtTY{0Dpr$44nzsv9;6m$B+lSO~O(;pZyr#~=a zPJagQ(>v<)r{9%01;(8IaCY2wJ2banmvbo2T5=^m|A*S}Ae>))qGG~4gTr>Ezxhi-+keSUnR z4u0^-BLzFKwp=;`OL;Q8_CU)PV%0RQ^q68c~D<3r(1;+M;GoLdLw}Vdsv>)${0L4+>bC<+=iRTfT z!XL;*fg$z%V=#-q25I8UW+CGQgDdM!r{4)idkmgKx2wG-1$rPDLJda?UR4}sLHQ+M?gIs`s&A`cE zh=;g%ugt}8|3T{#ghVeTBT!3wt(&&YltLQk?j8i}(6PBQQBF`D&lvokgubz`yot%i z=dW2g?tNUzWK$K+l^Ed;g?56qjPyak9!+Q`+qleI57y@T++oTbOK@b4wJ>1h(cMja zEQk4;TZG^?G({M3chFM2PtwqV=4~oJer{$1-X0EFs54W9vF5;uP{L7B;N+P0KhYYKAoP-N2eo z@B-C1CSt_hai$Y1-SkDZj9l*;OKKUp*)^8dGP21vPOfF-4g|QyA?|V0T~|hryT;O5 zMxJ(!la0%w=V71*@uHg^sAc3e*H~K1$cL_RaxEjDBA^EGnVTM{Wn`CY1Zx?Qv5#XS z?z`^3yvS<5&%W%Y#m)m$WBam+@_2@qj(~CMv(H(~eJ22$gI|cXCm^O>Bfw4Gk2!E9 z1`IRNDa05ApW-6PMJ+#sxo4v2mSvvKiNGG>zk)m}h!9aglFaxv_Co z27KeH4En}Z8FNsBDK>jK_g+jDp--fE-4BLF|oQsC=$aRlH_?+>ML%He6GRGp1EUvP5lzAVb zJhH;jzOS-cnNNrfu;X1j!>;uXB-Uh{M-pp#tA>%9>B2vZ9|Lz?zHqX*1}sYQwgx^0 zi8*eRaMvT3;15qxz-!jOJuqPhY}ee%u_h5yO$(CmFqOgYfW#znkK4C6QyKhwoSlV)es1y8>a=e6QjTx0 za78EB##5%j_Oa09y6BlY~z-U?hHY5 z2P?zf`o zE*r${J1;T1lD_-5{yAdRsivc7bq6lWy~OCe`|jKN{lf5U;+_nn(_!1O#Axr9%~CpT zdb8rYc^f-^9aGZ%6z~m+Ro%pBn~u!{p0M_rKbxmE=J@v0ph>7PiP7UWXtR`?80{^V zc)+tDKakNc!h!t4FrTL!jO|kYK>^>82d`;v<+e91@82&BZ}sxa(!MP-=fE{vVct;y z3r~mc!b>o3;YlJHAr*nA1aI*UZ=T*S@TK!mU>J?SJ=t5hRlND$NmUi{ItW87){?qVf-VD}UIbT2QM zQ&Bnnf7!*#f1hiWCoQ;Effoe$Q!$=Z62j9$@TX$jsUTu#e5xE03Wsg@14wk>JS9wL zDTz)hW0es&AaK$np|*4`L6<6RnTwclsp1%yDsYDqDh)M6iBx(>>G4a^Y}AjrR6+Z$ zOO*t=R0)NTj8)G-LAX?jAT=YF%Ia`}5K36Mysk&LdP#$*+N8LyuYoqZ>VTTfpYn3FrR!MYSt0d92N}OD)JREba66f5h z=I)O+=ej?E`wDn!F|H@R@Vg{I`UP@T@_D`Vm7Z&roo)u!1FL85{qXmQJ4Yua|4*ZnJZGe(r;9OJoGc}}iXu!Z0^1g=%+8z>v@ zN-%Eh4Ro!N+!dn-khCx1S|y3DRaB>8_OC2{q}v5ttL)pR*O%9Jh^|$V(0vH5Ra))O zIZ7>O$+%W&#mSIs6--dnwF=hn6&x`8t$n$_HYPX%7ejKb0{1nhi3nyCO}x#WIKjCT zu2rV;r0}`xTE!f-$(@{(>L*!hZWi5)&|^_3u@%;D1n2JPW6hc-g;PSw9T26fq(v+e zIR%}|72S_};-6B3tB5WnGAHFI3UD0UoA^l6)yG5hDhja&b?^!=iOeT@eUz#x8 z_y_?bO7E)l9%3J*A1QmdI9lm>vX2#~D}9!1qsfQ%`4blQdy>+Pj}WAvuJj9)ZhV9w zeYMiBRQk1|(da`vcgi-}d?^2r%0Hv@7evoDh|%gpxv!M|t(by~2+l(z(f9&E`|V`& z2Q17tzCe)PSN1^BX!9ZcDB1i)3(Mz{NdKek05*v}I-&8a{K~TSo^0UO= zB+~g)8rB~!9z~-5IB^Pza)rt-5l>M1LfI#Y{P7IypCKA;Kh$5V{L4k7@rU$VWZx#< zO=8`)kjQ^t=`V_}D*Xf5pNRZf4g39$MEy9_HS;1;dx+`$6%Er{i=9Z+;}2@cUg9w2 z=ZMFMdEy^Qls6iHXtzq~3&o`*($A26ws;YVdTYhYMWYdjaT$$3@LrXFP<&E+Rx}!d zC}%VT!4H^@cKPcX@^kSgmACP$60Ucmm@1}=#y1G^GiCGVH7wtYM0*2Btj}nrj}<42 z(?p{&h?n2-dyDx!08cmiPgQcAUm8GsF=jjuoSM2+ojwig=NDi)egl zpxk$|v+>=9^@oZh#R=jh5npFa|NKVCabSuJu^9}Ti{`O8@;k`xEM|+IFN^WAbH!<* z=hI@QY`#y){wl;O@qBTGxLV}d>w)8E@q1Z#KGdR z;&EcNxJW!lyg=lSy4mi7;^X4e;x_SbB47Ms`R(E_`KtI?<@k0f>m`c~#Y4o_Vy4(h zq(Twv4HCzQHS6i*q-)Eajkf{c(wRf@lNqxvA!>g zmzDmS__g>C@h8znpX@hLOckl9#B|T+M0?qu&k4$QFyHezF-Z0i;wbTGvA(Z~0;Ly= zMu!3Md9oLa{8c^s@qA32BYTy2sd%|~g?NK_i&)AdOj(r62b9y5_^cfMdR}n z`9owI->0xCW5jw>#6O4yVzD?^tP~fEe-i&Jo+GXjFBK_S!G1Q1cZ&Cl?};CYpNYG~ z??vNl73~D^y9BluFQ$pj#kOLG*hS0|`-_K(!^9kMqBvPJK3maWf$V?RH^oM^vst`X zd{Cr32iI?x_?@^{mRe8D394W(02h2_2!DXK!-^BqB5721c0lun_YB~m?w z_HdB`DzvAH)JUOSE>b3i_NgM3QfOZ)QY?k`jUq)+Xg@5P`!ul4eHxI`D9qm}QUQfF zA2O10B-WccD70IMR6L>GLmVQG5UG2@eB+xHq^=3=r6Q$GXs;KqB+(BAPMCg&NGTKA zuZZUU32bx!1pJBVs7Fl`mTM^DGRCAM+oS`AxO_H56+;{@hV{SqN0go^_7wYw1H{4N zXmPAKLF6w>IIbDuOmVhYCN2_}iZ$Zt;&SmKvHpF6>y&<@xKZ3J-X-2AJ}Evc^4Coq zXButn1I?BGZ~79b^Z41P=Ks470nG2A2=NH`YHF4~q6gfvFbnrR#<@>(VLAU#9k@?( z>4t#I6l(|qm(0W6?br-)mSJFj+&8_p5w!+j0Dr{&F>mqm#v;Mr-e9!H&mFeMv3TuG zN8GD}sC6+49O12$FK@0d&T=o|r48QK^cJs;IY{vLn>+?TF~vT~ewps|`zOS`I*3|7 zb+N1nBU-$?#jySDeS@2H4Uxw7a9I#-Z#m*#9Yn3xUGWnWMznZ&=fU>37sT(mBgkZX z_&AHUcLm~J9Yn2f(H?#Hd5f2KITHNsWgh2lC$@*xj<$C*;;h5{flJTc_+fOt_LzS+ zg1_8FgZA%3;Bl1$%+m0%*uKLA&NG)S2>$VP!}z@U<8I?^kCza~W}gR`Wdhps@6+D; zk~rN&m(x*>zgx zw)~_cGl6w~28J_J^5Tr(^=CwWyUXGP9KyZW8dV(l|60y~F0DXRh* z<1J@Z^4gYbj%_n2$BIz1KY2~dwf0xmaQiTniSLxtK4+-W@@Ibh&aiFDK+C_d&GPuv zl?|3#yB?}p6W=0-D*l08P9VuB`6sT*YZF}Mtczc{)(WpoSsPl>VnjD(pj5^K=m-P zH+@88ZxiGOEtWrXQ}S2w$)k28#T~l0$%wnYvg5aHOIl;COB#{5W_?clf%W}MoV}^- z9rSALbw&j1>id_(?RDBCeX_GR9(ncj{Y#L8n(>nxp{5Pr2KK6dGzsr+5KdV0Vw28$ z>=}XG4FZ3~?^-@@658D$-3@}B_cR_7SZl2euU#?1>bmTkIk&W2hgn&E zNKS)w_RdEFEmx+j39k+8b(*BCN;TdZj@-&EnNmAB-tO(!_`jf4U6ub}jjOspVk=et ztxKWtKd-*Ve_T}K->P*L{_S;1Q1}mRudn8RSWTdxv#w-h+Yv8qYqatHPj_7yx28=_ ztDM$3EpjG((mcn(z7#ktV?_I$7VDE&2C?6D&PiESvCDSG<>Xjr!;^)x>i&e`ETxG2I6=V%ee%F zW19c;sq642T}<=81{O5`-^U>wh>xQvTuk$yr*4PO5T3QsKv_@o|3?fps`(#}A_vs`ACDFBY5sr4MtY^4!KukePPqlc z`&TvpE6`$8^Z!-s6F$xV9JV(o!EHX6(urnF^PiG;KF$Ai97{~|zcEJ|)BNY}PkoyI z+u2b}^PjGv53KpW2wT;s`OkaCe$D@zneEg3PsV5EK{fxMMQ<_9e>2}P&HpbsvY6)o zmzdh$uKC{sLyKzuf6w`fY5w2IVJ{48a`D81hhRfK2>T71{}*zYG0p!zoX-Pl{{NYU zW19cp(2QyRKSML7`F|IiifR52;N-?M|1ak{{YK6IW7t$o^Zyyn#{o6}XK5$#8 z`Jc}Ae477@Y5O$)`?9`I^Z#esivnri;EF7eF*ZGi(|A%qlRhE+3EDo*|Dm*fn*Thm z>S+GgutC4(|12i>HUIe>rHDT<{6RTgT`M-@teVYH1Y5O$)*K&n?n*WfQtfTq= z3`gzL{BO^p9YpirI0894&}=f=4P?wtFJylQ(fpsn{`{K%Y5xDr$?4&=?uh}|b|4rW!mS%0ydR@$ zGZ_EsY5uoDxn+@b)UqN7mK}MF6|C0u@8i?_r;1En&Hqx=+`s1kwQOey-(i85S)4q% z*vs&}u)Wd1A8NGxbCH;X(EbfV7;c!uPw zEbZ^*T8=bY{`bSan`x=|CqDpRA^J8##%89CHbVPLF`!C>3>LPJGHGwa=BpnW-{7D8 z0KAT2J&ce+X$$xPpak*_m=ij)%HVqj@B_fKJ1_)3b~nQP<4ki`V5I92G9lbQ-VFG4 zST7)CtmJ^l8wvj&xcS59ml+STvGJ`r0hhyGkC0h9x5%=OX+%Z2yJ6qPa`$thCYbhq zg#9tozUScbjKuzx*ugGE$oQv8GqV1BVbi~R246U_^Ng&29tJ%M!N~egGF9nPz1Ac_ zoqv*1=YJXI^Ck(h{*#QXe<%qzb(ln1|H-D}3?v^3FBx)_#SkZR2VZ5IUb>FUl{Wd zsX}m@V3(%F58hx=jMD^)#W7^yAk1&sxExpk?zd-n5uhoRP6dWQo6$GjG(Fg7!k+f z{~ZYStI0;+o-;KBg^oZllf*|=oI`h|STtxVe8Ea@q&~utaE_v$12{*X=K!-(Yf$@A zge=aH+YBo^7XN?EX5LJt^Ka7(-*mna!OYDgh&)V#Q~eque7>b-I4Ar9YMcMOi)MeA z%I7&|UigADAAXs6;S&Sisx$})<~~Z@;59cCW%w-2 zG&cniJ_s|-@eO7^1tAg~DkjbeT_?-R1VS2wiCS^)PlZf&bqTTD+NDtUhs8tGk) zlU4wd_cZz#nS4+3-j&JkwF`A(!uLGT`uc_MVZ?;*VZ?;*J5_QbUyDn=0fVx7@m-{t z@I43Vwj<$tw;c)JyX{E$-fhPdzVBz-8!;jV3g5&04h=K>E`0yH@V(U`rgY!Yuk^>sDu@tq{QiRyOsY2J5>mN%mI63XxHisO62_kM}{o<52DY%c>x z#r_oQd)F1Y?^9RgzHePU`+onbfc-pNPC=*sQ;QMv0p0QIAkU?B-qLYd1Omrf_ruU<6AHr2sba7jsNZ^SV+MC3t86a3l{MkhFh~)^7 zpdC$KWs)ZlZjZUqCijW(nHO|D3Aejx{*}qCWjE)U_Hv0UOmrIIHa*$DGWEpsgF$u2 z4{V525^SC0WV;MVCa8all_Cx>WOuu)Fx!Wdhep)82PAS47~NpZ6+v?s>yLWPyp4?43bW)_q~1vXVr-ag=p+`1k3Hsl7Dx28P`@WK%i_rz8N$AZK? zBVEuO(uwgVI+5Uw52H5E2!Ao5uzr;Q5L2g=9;(iS5Tm)=n zVk&~^iL=0?P9ZKrKq@yk z2hVyW2Z#e9HqKmcoPOQcivphVYb{sdc!d4>E{N?XJ!`#vqmG<1#_x%oqm4QXF42tB z0`B4M5#NA-_}C2?IKK{II}mpu#9J$_S{A0O0b0BtmS|G4jr#%Gk4Mvbw_!PNW3oZ+ z`CN4?PGrOzS5W{!vUn%n+-L&pg z?;-B$2T5M+;Se*|e29i2*^7%gBdSjAW9(c6FZsNz4TxWZz!f8}LkJ@t&Ir~req+>* zuVwrp1ndR`zZpO(pWv0OQTb=Y-It~lS#J8GT1IkQV@WL|V_aitEh9X(Q2pduMsg9* zEHTARUsB5mpSq#Y(ppAJTmxqxMCKr%1~J!757aVJ?HV{MAyVTSC)YA^Is$4CXSwNt zT1L)ujbJS!GET1b4h76C_k-Bs>?-=#J)GUN*kLl2hY61ZBkj-q{$vD9A;J9z;~=!Z z?C(s8TrAvb8xXL26CazQ!u^SNC>dWU$S{kI?%bt4z>{m7bs|1i!mZ3F)^Gk`M5kt% zf&Uv2a9Sc(x`SE2jFION@UcZ`kn7C{$!AFL^yeAhNgK)U= zM4olpoAMJ`egOi`Zb&qXD_76+*B%7yq>ZCJP4JpWs#};_n~P)axUl_w1ebZ+A>Q;h zfk;O1%hj`W4rZTvY?e#FTxg`Ci0@;-HkTZkCNa+~$N#)z$m0f|!CoR(&KzR=XqNgr zqb%twg$r9GY&40!E83fp;I_wezgf7x*CCl3Qu6nVvSc0k`+Jb!R-L4pKp{pm+e~+K z&}y`}8GQRe z&?LH_X>|p#tpHOQ{QH6ZBocW2ht`kdebVS+KZ_`Hurgkv@77^#TRApM@$$;Isr`x3 zofMu)qa~x8+IRmjrmyaplJ0RCRXF!2M)zdPW+}I1baMwy!pCMv(H$dbO1g>BHrAR2UpCeXvPgv3F zjvY&k&b#maVN8SGwt0+Wkp9i)PmK1C0x0E{j2;#^0+6WFFdO3H`ekwxeM5?sjJE06 zEXC8vKJ#bugu@))e(E~6)k)Oti=DHSn;7jamUzH(Q!6xp0}l&76x?OAn_vv@km!ik zd6xDTZ%2C{3EcYL!Zq>6%n^AD;|$FZI7)9>i#R{2HXvN(OXrDf69TW?@A0McB*W8* z7p5c5bCQ4YkAGp9r}jjY_+5DY|1IJ5%F5z0$m!<$U%$`7^F3EKuDqancGhg}ghl05 zrB(T}ii%+3kjkG~Tv9Nn+LQ|65G9Xm9ZJlA zqVd8pMjjctMuffT!cc;VFM_7|m~eK}76+0vZ#38$IK~I0dZ?5EiIb<-HEQ0`04f1_nv4sHyYokx*4v<_ctfngOTbu=cQ(aqiy_% zHUgnm&Lh!oqYCDm)$KR+1jo;k5c%$U>F3o~F#oz#)D0wInuCGbnj6Ge31tSWD+u=B- zlZ0sz9506&_XQL(pJas0dtjxV&rcrAJnE1$+sTPE#j)8e)F>Rm7_%Z-^lFfSW*Ruv zS&KuEQK9w!&|h{&nH)xUq=fdl^->0VwmZ~oy$6_wS+i@KNh zfn7a&et98Sg7lJk3;J}gn%8}1c0Z<+RTNZrFDNWMe0D+QOe7Rk7R^2!?JwwG+`YVO z$-GGSSu+{Je2vhmM$P zM_FkV4#9Hn@BbB==K1+Ub4O*ndiLcNT7#Jt^9#!`;IYRHKRSPsmA|mE z6wVJS=2s8n6;_@(dEokOQE9bRH5>b=SzF&~SC!zp3{!(EHtaxXd|}b-LMwk(Sw$hv zNTucT=2sTy&#SImX=r9uMgHu9xic{p^G0y9aad>!1E_OWEy8h!%-H#BR&g~}yf`1{ zQ)~F3>65F9E32l@shC?Zx4LKc^jW3V(}$1CJ1Q@~ugmEp@+M55P+2ht2VT|mQNxE@ z`2{nvw)s^?27Ff8e9VY9KMT+nj!x#f890)wD^AESD=<4&VRgmABG3DUnMLk+a|Ym5}ngyVZH`MI`O1CsiLB+DpFEW85vqx9vN9)Sd0t*nGwuv zQE^pOMP*fFV0WI5qu!=E|2yaCgX)y?8|MLZ%4a)$|9f@H+xWjW`ihKXuBFjxTQf&$e+Yy9A31I#v9m0_CWD>&2o2sjD{EH=XcF=cRqgC zEO+O@Xf!2azrd3kYS{iyYnI=ke(n*U6rUBhk=Re)lD%F0Na?#|eg%e67gj5d~t=iLA*-5O}taQkHr1f zhs38y^!qpE8|`vzmv@xDL+M|L-;fADk*Jq|H`%!zQ^dw3(jz4L$rQUQeISYQhl|6M zK3;aNXf&kIM}hLom42eQKHOe`0<~HxlC=taQG`&w56C3hCoz=ZbYS%29t7(?L(8 z{3Mk#T2yGqXijG|G{Fg>1gP&vuMfIe3Tc$CdxI_>%alxLy2EG#ce-_bb_Z zNwjCQ%CSC;@a{X;&uCbIZDh9>yNW%;J|yZLE}QT4v;J5T?dFPny`Q$HQ9eiIs>Frj zDJplSc&@lk`L&|ayh1-l^9sCO>354ylIZVw(bK?sU-=)4Uy8d$qlJa`cp+={4-)M( z6%P?RE5EzgPaGr;7e|Rkqa5u{l6^dhc8yj!I9s;S%tAS%nFXGq@@I=H#Y@DiNz}iA z#CEt>=?{vJD&5m2-=_3m(kTB~<(x)n7vnHmTcFX}0-G`&{k0>}|4^|&tRb;)tr9nj zUx+`7{TjRFa>Oy>WO15^En@n?Wt$?`Jqd?|qA|D#wS zo*-6;3&bVjDdHL8dE#<$qqteTSA0->Tzp#GCjL!)OWZDgDt;#J7QYkI@CA+Q(OjfX z2JH-yPnBtBi37yJ;&5@4I9|*Zr-^?Q`Qu2o_b2gm@how<$aiR1&iG6MYh_;}@|_sw z^M{q>!{Srob0U9a$$U@S`zP5pzLPRNK}-?(wj0y=ULo0D>?qdP^ya(5EO&%BN<3Q3 z6Fsf(eAz`JfAGorHR74#x#CLk67e$eFQR!h5%q7B%^!=hz4ydV#m~gu;&Sz7W#69AVVh}fYm>(~uiOt1K zv6D!#6_)QU4ib+LM~O#^x#AQtUn~;KM9OZk-NoXc#6OGYh%3a4#mmJj#2dt0#Jj}% z#7D#@#I54X;@hI9?Y%>`r|tc%?C-?@UdiCN!(s!miP%bvh=+<@MQYfw{*fZ}T4?8q zp4RvAvS*1Wh@RH>0@ml*fBVkzZ;Ly`FT`&} zPy5@Bcgu&wWU-;h-_5hV-r^wf2yv8nw3sVS5%a|&u|lj8mxw2eXNu>F{Ea^Qze42i z^J(8NJ|;dTZWI3|^0)gePeDC0PD~Qh#O7jKF+=Po_7o2nhl)pumCVJZ5 z?PPn}-rZz-+TQ(TQ}2N79V_OGMdBQBuIOodFP80Td!H`*T=7DY;t6d3ui{2=v*>Ai zKPa2Z3M~JcXnf$o{y?^;?fr#p$}X^cg4jlEFLoBYi-(ItMQSv#{!Ebq4YU`Flw+WM zfk-6=+EH`R0BPNSOuNhlrF?pq(XBMS-@t zj{}p$j7aGO+A~F}C(vFjQYC@5(eMT-ltBARky;6~ z?-D7OK>In7(g?KQ7paaw+xUP3DUd)rS)@Dy?H;1Je*$}i?4wDn=fA4mP5A@1dzol_ zxxx1Ck5J@*`A>+{IiUTP==o|h_d$?OH3Q~{MG6|wHa^-wY8ue)DVqBnut&=F?r;1- z_6cHzNTCAOKV3BUHL%{4D`5KN;w|EBBE<=q@7>R!J^}5wMSQ%Q`SZR9!!-H0EHp$H zhS=>4>wiywa`7T@wYXl~ zAYLVI6us}+hv<7y8q+aH-unJKn%4V$YwQ2Guysq!557Y4^G`^SB&}z?5o@*wiLbVI;LwKW8R%S8j-ZP^TQmSJFj`~ikH21G4> zPcFngBX9BYCL+P#-i>IF&koog=fG>P0CBGlqSlzE$oE#tmsjPBv)lyiXg^?o^A@j- z3MBaZJ#Qq|1LfE+)4hIAMck`{s5PdOWknd#;^mzT+uz<*liX+SY!9mwZSP{ly*h|m zbI{&HjA-%lR>1bRw;AoRBHP2MJ=)&2ZZiJ6OP9{@PwVYGNb=gd67f3iVFPhHu{}+Y;C4-oiYF2Sl&j5B>J9YyFJM0cNT0AKQ1Bz<#+rf#4tCeHdRu zq;Y(BtspwS*AT~Mp9h#_Gurd-``-GJ-m$`hpQ79ZB&H+I-H`pVefH_wjjRFK|E3|$ zTfFufA;DknS&Z*fuMp^!>(M(qJ3A6veo@!DU*BJ?YyD%9>2SZg)^G2bw;_2|YEB%K ztuHy{nHDY9Jkva7m7Nh>mAr0sdX7)EiPg|>so>^LtK zM#gO%2<2WmoV0xPM_owO>ruI1Wy_w?EH z9Oi7bmALa^JAQfMij>t@qm|7^*aMFn7KSGGsX6w#(3%!G@x2`Aakt26IeWrvtFyK1 zy&9`MW_x?nob;S#IcHOqyJ5y&8*1G4WM@Z`)Aom&J)?IxPR8Cw3!%r|)7p^~Z2QA$ zNDIby+S{ld6ugH}!8@`ySdy_fIJwi_G?WWks2hK(QRW`DBRK^H7_!CLST1XAaPHlh_lvS8NYU= zQRbd?%iDi%ImoZe9bZS6d&pL3s;^F|9S2?R>n(d1zU%KCp77^ZS9}#nPTYA$QsP&E z)aUlZOO-pvsB%BIC%AFYo{Ww4b-9zGy4-K0MDosX{Ir|^mAM<$QRZ&s?2dB|n-}O8 zTsI!d+}otgoto1tr`4LiIsKu`-3r?=a9E4A$t#jZyo6)sm|Z{j=1~*KSsmXoC$xOo zH$^w+ zigrV<`+epFd2S2Sv7a6I7{i8MHwP5B6#t;t&3N2jkxRX9UJAwsPWL5{^Aj(SVWqr@sfAv56J!N4f_RvP zVL`8(RRjIm_$@78LDAG;D0n{7FrmB-Xux=YB8kxJ=0r8T5&x*yorLyM?!Z6jbu*4W z8s(n=32yZmOgR?AgkHBhfcTVe(IND@T{Ag_PgbDU?V1f6vqkCDJ?nDBV?wfY-ZgfWj0TtA5-XcyMaS84CJJtv{~i0R^x}zo6+l@ z!Pd=uAK#d9w$7(2(Cc=G5=@~c0ra{{Om2J%2bNIShIO0_Jg5o<*>K_l{9{lLq2N*& zP3(qaF*NFRUk@{dzDuFk%{V)Hox@(}b%d6<*EO7su~M&_H`yEI&$ANlXsim2@++-` zJH0)jQT{?J;VxP6DHK+MUN?_X3b#`fA9~%cnc677u*6EZx6#R_=Y}a0S@=HHZJu%! z%}2~E1u|NtoJ8}n)>|;VKt?3xMsAuXT7PcL%#@Lw+^16-1A&ZADP!5uGYQm*4P!PncMN7qkKcU}6ons^7sW)7jKZjf_jkj3FuP0eaoTO;f`g;pZ?`!mDa( zL<&V*q1Wwhma!?PVw#}W{e@ZI2`PIy$afkKL!m&%q?A9g@cYS&QHXlom0Y6_Q+Wgj zGNz{-!hS!}&NkCZv)L%CHZ}jaw=_MI|Co;L!siwZnAMD4G+n)J&QAIXY!`an?x3vn zN=^p!y012?5KO<2`Oxcj?fCSg*)jCGT{}6Q+85O8cI!7xKL?#sult<@4m2&DKh~#S zx0~NH{d~^Q+(0u|PrFZg9{Yn{x0^p8{cGBlfy6Lx$Yl&p=Y=ozy4_RBkn}^@KJ>cX z@*~neVE@qTcJoK4-^BXR>rOWH$EF{{X@p+4TYf_NR@%_(=Hy_S)5p+;Ubk_Ym@ze- z#})Ouc_=v>rTA9n@EpN#6F{Z3?j-ciUJY zw9*_2=IqbC&>YM-eek&CGYXwCpRX7sviQ6k-(OQ6?H1IKv!6`UdH zb-ObdOy?s|>UC?6K#yGUP>{_x=W}7DV9dfnzJ1e&^&Rfl?ZIGs5P*aa5JGPYX15w_`AUG*<|E-7Fl)h);)1 zozd&&$3!3_Gkr0;hF-V37NgU9aA?r$KF72-A-yY@a8{tj4M@lFmQJnT1n70U2i)xR zW$X`n-L5?^y*109>)DIa^VuKty2qn`p3&0>umJSBk2eWt+36v+0KIOGz{%KPr=P+S z(CcQCPR3PsdRvYWdfjfqjduEd90c^b-Gt3{`b#VUy>2(*K0BS?^QqVECOm4V&*8oY zy>7RcXKlzzqj`?X%;_Pn%|RJE&b8-ycDi-Qu7ov#xHU*fPvD%c545DgIp-FpUiV*( zy~s-BS)GPysq_=yx;}baQ{S&7cdfn{Nwp;V* zF!j1e8`B8}dG5va*t-~An`!tLvU%;8cxoU_XQFL8pxm;^V^~Wof?(N^|A)QzfUly= z+rMYdoRgeXLJd*_2~9!>O%WoUBOo0F6g0F@loCjgA`W3yZ>~8xM0|Fi_kBM9cc15d=94?$`}e!++*8h+nK}1mTJBC$ zN@{by?itACy2+Gj2&IJT@PoD%{BPmD zhi&HeCD&5^6?6k zRkbWcg4^5j@tTSs$}OMaiucK)(&;s@*V6Y1eSK^H6+Y}PHU~n>ef0G+A7@HA4I!70 z^xXkj%(or(3i@n{@qy;cMv;$^C2vVr%m`kKYj!<`g%6Hxw(gTG*Oj;lvI-&h78G{} z)!K?|d}hbzdbxL+uReX1*w%a|mdh7G+(C`$+Y6h|v2yP>Ukm#9elnju<#MJjcW^C^ z6rT<8c~S06^EIGvMj8$Rggnd=KE%c(GaciDkare5^*NdwU@bz(-N3aU(vZHpar5Uo zgxs?@>O*qq>x+Bmxd{He;V0MTX64mhIzsM)9HpVw0(C7pudmJhJulZ5VGH(f{ z@E%r|Yj6w98_b2dzlUYh^%~5V=;GYp!))EDJ=p*O*M_Kncr9+h(XhKCv>FQ^HxXYx zZG8bd-`}mzUZr3kN=9hCioKGPv;Q_h@F(Wxi>Q8?fqt0*Na}~s*2>7~v^o>@mm=^5 zR6qYoe*RODcRYgMhMc8v%t7!c^xhpWGuSV)4oRH0*l$Blr_Eg`z!y*b`WO3oe~Wx~ zBKY;o`3xLe5S(^AOeSGFV>iR%ew8`~6&(8(yqq_>H3HA?!*tL`gAzM#SC!ni>f zLa^$NK_r`Z>2y6N|_Ru1rLXd=uolgF-M~%fOQzO?y7lk{1EGB(GFmq} z&_X~zxV1Q$i)a6zWIr0ZnJZY9o2wsk^+B-l9goN>dc(Ki)*SurnE^ z+uF@s9kgA59Qg?T{((qe8n%BRG7h0V%lI8|I&DOpd;0?@-4D)-?JdKf+M7n(9F7jA_NL)<{Vh%nHnlfRkG=Bi!PMR=ih3}$w+z&Ssl93V z^r69bA|Gv=+|b zx*hSMmR|RW{27V)yJILb*&wb=S|dNcp4WA~%*6U@BY!mLH1pT79FgiC)UEHdK{xBw zciW`Ng3p^Ai(su=6u7<9gYj#V&Kb1(BwgFjYHg{xtZj2?BJEtY zl<3RTB-e?)|JQSQC(g}%#7y4)Jl**T6MA=uPw0K*1mFd6zf~3)Z`+__+^gL37qUjj ziBIs&aqXNi^LLl(nZLUpZRT&z?aiGVL(To@I1P%-N&+5$>4_o9RcpD5;RT8ZFpUwQ;$f_JgG{boX zlOVFb0anQT487bKy)mV{_9`7;s~{T29=?723lt5u2568jFuPHjefD+1;o zBp5uWd`T4}fAWoGRg7%+jpa7^_dC9^qKc8-2$;2$*ysC~R59|M`9~2*N3{z=Rg6S^ zBV5G@zxN>}sfrtem$o)+jPU9f^T*_;z7eisWVLT3 zRq?WoyN~Ofc0R!GI+&TB@Gqn>V?87OesTuE?T&T{ZbjQQ8R_L4;i}*SfGW8O82lOQ zmtnH-BR2{>xuL2fH;V78-YBEEQTXExYbn?gs2r_0Hp~(=>6KogcS)n}KIt=kVG$tS*PlfW(XdHXQ5xuRv3Rm zNLY8849U(SKM#%Vex6|6X)?s~(0Iqs6RbN;hIk$tyATrAo#sA-cpjeSend!d76YPE0JvgMd3YKJlve^U=Y6o;XSI zx==7paTO1N9E77P9t7tq)?U3fg}ggy3(9G2{KGwQ4K|{am`#{?&W{rQ8jL4+KM)xb z+fcQ*l=}60d1nF>J`+#-QNpkH6k?9md&<%3DlYfYS^De=i z8zq(}e3Xx`{wQDUCVZ4H4kdh)FZQZoFsPd}BqzCkT2x5?-D`(PLt|pJ{m&&q@9#$mr@%kcDo-C&_#Vr1eu14To{G=Z*tlEtDRs>vS>;t|*;3Vv5lu@1r zv5A7SAvS776;F#i^mHJdAfi%e{) z%_ggG98!7N$iWIOA%l}MuSfz}1;)`1u3;8&pUrivc%o)tNixUch4w|J2yt|k;HL{# zbW;Uag9|=eumkeakGmdAGs|cM#>vT6BtcRFww;-RgQQa)cCy5S#2m`1Z!e$n!bto}wYvO0TwmtkK#yWh;(gBiceoZ2f_E^pML>Rvcs zv3e%39ya@nJc%t|j12y%d{p%n=GY(yZsTAHPSxB5!BRbbYit~IkbspUw9gKmiu`P@!BHr+UL zk0E%7F*jLm?(yi97Cx%-GkCkv4}2ozpGos4p~$Dk9u zE;+jJ0`dkIEs57O!4(aXgPtdaxaqj#Vut#Q{cW$b5WNfuJ8syVJTv?KC%UpiWan*Iwaiuj>y#Xwz?@Xw(I%m8~j>}v%iigdi z%dw!Lu;uif@jCsSM?DOKa*oR~H7fH$bnvY3%YmbpAz_?d_g*;sgEYRYBs}DC;vGuN zIib1>EUIHXaC$BsJmS%X^+#-KH<*l{Ixbog9_1u%JC=VEAu*?0?Tn9e!V{cCF$WfX zx@PfeXMEEqJh*Y<$DZf1=yNrTS3Bba;JM7jv*9m>+kH_f3Hxc-Wmf+aEP<=y~(!m2@b<6wi}vQt3%hL!Yx~dWkcw$E0#jddiF)j>w3) zrH`2Ev_>^S1vMtOoL^dAyx{nM4=IMH9bbx}5v3Sr+E3SfGH#>l9(~cg{#3N$O-} z3J}XfmZivIlfwr!^)Y88QZpNRm*$%ILtAf2&H!%->+S4!3Uw_G%Ks}}vK|ew9TZcu<)rw{HV#4Fspafm zwd%w@z8(Su3(}Ijx0mIZXvE!-36W4zm$=x(%hHXwD-chp)}eUC*P))zIbiX$GR&PncWPO%H_wIa!8{q7CLdBHbEi*PYCCr^ zH8LoIf>PD9?E6Xxh164lJb>+K&^vI7O;ezF+MM~+ekd-RJ{v++P)xvOT5){N@bW38 zCO}{+R!~ToGI#D2JB5usxW99EI_7(?-yxGWlI8Ow5hB!xDAo9@))A_88yh7X{ z-Xv}k9}%AsUl;!(ekOh;9u||ao~*yA*iIZF@uD->5Kk0`iKmNm#TDXJ;!Prd zE64iA;^rkeMVv2Ih*yc5M4Jl|`CpX%u4r>R!e1Yc99ds0v70zhJVh)K7l{{%SBtlc ze-NJ+-w{6(e-Lf1MYP)l=LELjL0l?cDn28=CVnOMO!dnR5hsdM#hKzVaiw^%c)3_9 z-XhwZf#}auvOf?%Be8A25ciV^he_m5!gC7RsbVb>{zkHG&OoH+%3mOVXYqLX`^k=p zC(A!h_Gx0V{AbFZCzi>-LiYLMCGxM8eT}$5{ySvfEj}tfAqE-~+hxB+V*Pf>{z&{x z{y<~mp#1-kKhT;;$GM*4RhvXTO=RbYt>h21Cc4Uhg8Tzy4-&_Tr-`$~IpP8m?JSqQ zQoKn1)w0)#w~2R&HkTpFKO%dJ_>%alXj&6kuMcJK7rzz5_-x~PM@9TD!}`@wHh-qT z^qO-U7AT+1ZHV+<%GY0ho8u7vG4h{EqRpvFpC|u9ak2atk=U;<71zqYkwksBh;+;yrM|?W_M3^h^5@Gg6nl~=*H;`Uj#K(+;xuulSSpr_7m%pOv?jnSWN%dZEuv{npkMdN zeni|NzC@zDX-$A{$^Jy?d&C3c_aZNtxxQhsE{XETkQk3+`e6dViF0K?WBGKL&67@VNZX>Y|zb$?*cBPW> zocN;nn)sIZzPL-=Eq*Q@5Wg4gMLqPZ97OF zPW(v>@p}jI|1%AXT;*#c7Kok2o?>tDB=KaCFC4HPzH~tHtuS()xLvgGMex5bdzbjB zxL36AOUQRnw#)B1up?ro$XBK4Z!B`U58ACozHmjmi^$oxX!jENvKj4@#Svmn4T=)^ zXNwEPv&9R33_e$y@lvt)CkE&5H%5VY@+U|ab+iQU9rqJ6(azQMAGiGg;-X|kt@GsRM|T&$^S z!AZl|pGxso@lNqx@d5F1@sHwj;)`OSb@8@r&a7eUE4CC{i-C3pr@UdlBC(G+SR5vf z6HgPTh$Z4Y(WWgye5ven#f!zu#7gm6@h0&$@gDI$v8G1GHu;|yUlCsy|0>$|Z^Sua z3Dn$XYr1<6g~X7LH} zDRH|PXjXh6`(yDN@t_#t_jc5qB630}+JQC&XH}wY6PAHRvipd`#8Kj8ak{ubTqIs7 zt`e^nuNUtU?LGtAdsOxl;>+T8G0>j)K=wZI8?mP5L_OXoK)nscR$@D`yI3R+7Ke$G z#L41Zae>G=XITGQ@p|z_(e7s;{kO7fYDnym{{wNi__=sM{9gP?gPI7U28JVPuIXN#p`xpJ2(KhT!QkljGE z`$tH(`$k|J`3uFaVo$NRI777iLnyaEcA!0B_lMxO`$OPwlzx?Xop^(It9YkaQK!lp4AJfn!9Q2FX_CSYG%?PVzvg`+&Vj}8GA&Z@ z_p%=qpAw%HUlHy85c2<3_73qAagX?&_=D)`en~{k6zhnbe~bMw?NM;3?2+PlaiTa~ zoF&c|%f#j4O7T)LxIeUBwrP=~y*p&zEe2W}ffni0@;@iODF)gbrbUW+Op6r!T|@0Ok@Jo*|4HIlae~N6$e3hJ=Zlw$SBRXUjQQ^n ze<$8AJ|b=rIei)Pza{PwzZC6$57O;^4`}yyK)b&Kw&Hyd(6mKC&T~fF?&E-G$et?B z7UznK#HHd&@j}tGLs8E)vhNV@79SIz6rU4c6l>nk*&+W2;%@PC@f-1=$XVIAJ{e+; zm?w4=?Y<834Uj!Z?od9)6Xf?$fhD^OQYRcm zB4;V1?cs$0GL=NXIae9&rXpu0qup8TFPiG^ZU(cVu$e~M%e5{HT-#j)aKak@B5oFgs~my0XK3&qvqI`KO32JtR&lek%Y zNPI-xBK}EyS*)x3RrP4&+}u$9{|b#Dy(jYDTpbAam@p=|J!$W>07qz_(8dtj(gOdP z54Wyt=_&?b8kaT*QG|b%kNaNDb`yWt#C@7eJ_5deIeieg4C;&f9Uy;O&pZrlZv;Zn z2SlB_(1B}kJ`9#1?PNF->zjc3_?(vY@%Rern}~Q&22rOMGIR}ADj{udLY(;);^m*E zI9`J#sAD!9iR~^KhDlPeW3pZPgLZkW1Z5C)_7$^Fj45H58QQunJ_Xw7tz8m34tk0R| zZztAQ3n5tF-yzO2+#k3sIv)3}Yt+Yd9_xwu{?hB{`asVrA7IN^ylmA+af0n~c?u!1 ze^K-=*st(06z|{bh-0&t0=BF}eTn-%`^1F|juqN}V!Lo=BhKBB?XrHhnXnr<(Y{Ca zFQ^ZfAV=hDi2i*DU$6xEpbylgTTb=zPxXPi7j`bR?2}U~1`dtkH|If>SckT@9)aWX z*%teSKG4;hM>N}UaQVtQYcgUv*Y7xZ;p!%_z5{v=xW1qB^$X{1>enFF=j%t$tFxiy zdT+loG=2ZiMH`|c_6&_26ASGfnx0mfv)$Pr4Q<*V^*SGletzr0=&sI(lE5S|42HoF z7~18Y5JJvdk@K_H($+t{w_lmF_h~16@3!w8o74)SVOHrwEV8I?I3 zHbm=II{W^yGHv}EQ241;*%B#FdznyiaeHP}W^72Qth*svS$jirW%7nJ)AUJQyE@ir z)3E)#=d}9sXU@Pse-=Ur58QEZ)#{`*tz#WyJ3b4$e?91I{wvn<{8-BVXv*cW zrw_lhX~$BFy#-SL?- zvvGRp>c-)#AMn<-?_U(_hV=KwZacgaxxT#UbNzL(^bJn?leeRP>mR^~c87*i_d}s3-J$E$ z9b4zw!xyYas{_%`E!z&ChqZDBX5Fyu@X9Ud(|W8YyjRYg^xy-BLWPeUaz;LN_yVMa zwxGt!%htme%&d>LLR%idHhSb>D2M4me$=}DX)Di~9kw@<;}%`N zEp2SG=(_%U`u6t@)bhSg>$m5mexU=kLa1q6%Jmx_=)Wh_e@|N4T?Q>IFZus*-XZ4PQ16GIj4$mC1XH}ZFcU9^m`<+^Yw&NjgYi#AMBVq%f z>(eDR{$P0Gq=VtJvSP=?o<01W>lTG#X|V&ZMPiw;l)Y)rsF<^%@uPdN2C;t8UCyeM zRqbP4V_OfO*Y#ca23YSiHsl@*wJ#f(QJJzol=9+hPEP&JPwd`zm6Pk_VO+Xmyb!`& zTdr>wYZGhsX>KejHnUk)EI(GKviBz~uOAd+uU`BV3Pgn;eCqtsu1oEZ4!e9dnLZI` zCEldJsrnpX$)RZS#c+i}5qlI8PPQk`Zc-_4aJx}zT6+{Qhu{#;+o4eM1xWGuyctSE zXVDdotj3k3_h)2<($ETXC68i3DvF0^He5qjG;$KE@kZl}7@mDhJC+Ye@B;?Nys znFZqpROEWR%@6${cGG(b|DZp_c=7_IQhx}aK)(LaFqBF81bu`4P&39~LXFTLqTfj! zh<|+YoW}gpAEGQtMhpCd{?Ki3hae%tiPfP$)E-{y4|#jB#?T*PQI9J3&>#8|S*bsC zJM*~FP4L!Y+~b>}&>!OPWqpQ!)F0y0;f$Wh0{tO-QXJPG@>>jNWMf63KjfRyj6b5+ z&>!;6^bG#A9r{DQ8R!qSL#0qN!9YEM6*w6k zSziyC;f!>eJ!M8S_>L^}hl0jOvM(pf%*uF=W-pobGWKH?p+DqjZkSP*W&6m)%Vf;l zS7we=hnMrFKhy;IGG<|`LVt*Hj{0vn218S5n*Pu=Odf74X8J=JxM+m_5LeX8y$}K- zHzJmg+_uWlA6kLdOn+zzYq#+}qYmS&y(I|!A-|*Hj2GDNDJd%~HJZVWL4SyYCH)~* zoXW@03~B*#C@`Qu)Er%-{?OAfGfoMk?Af&$XG7E|f&P#h!sZ!>y0h*^U#UOT6MdBa zkP1kDNcp8d!;c^z5b_ zJm?Sk<+HN)qEYG(eV4+H*314IM+EvqetKaxABIwY$kzwzn$0Uu>JRzp-Lqe#4gDbs zj8K1wFa1-0$Ul|z$zIO-p+Ds3ACO(f_Mt!Irw_`W%5>-tQIsTKpg(jRS}^^g6S+#z zA6f!>)E|0`bwGcppXD(9As!0;M*0~ICTt`#**R>aP3Ti3ybBrXVU}#XXodMeY&V=%XaM;%?OX!= zAsRTweR(D55BVb)&i;Y=xyMs~h?%KB z#Fr9ME(&GyV}klag=`x7L;hL}%5KcAL4T;7)i*MG07(6zZK#*}Lwxy$`a}K!H!FKI z+k^g)ZLj57%0sSGKu&F=fJD@+*mFo@tA-@&88kTxH zs%NikOrbwSo1HQn`a`rY4(vdG=zch|CnAOVLo_(%y*XykA9~7c=nwIvNW-dv{t!0~ z4+k_#)?=+q^a0%bVW?|2fS+!D=jn@Br(>qz#XvT=HLNNVEu&0q}IjNCnD8 z$r-3B)G$={RaAp3Mx;l=e1_f9eGXlBd#1Z=oy%j$$;G_{_X={exVA;L`SXXdaK;dF zdt(J8V#M2%575_u`FdHt2ztUZZ|-3HlZeq+_=X_lUW-n-eQM{UKI$V@(zk@ZzIC=C z`%AE&rH{V{a{HO@AF#it?@{LKZ)N*p1bAJSyN$j9=HpMGb|U0`fPd~uS!|;KE5mt* z@=j#`2AQu1s{V$){`3ttUu#s8j*!;|3GR?u%~AF{*smb8S^_1XlWWz1YaVv583?T? z?laU}cfh;_A@5;y(H)k>k$MjHGxTktZ@Brsh5c8AR;5cEcZ9hf#%{s)I$D)3b=;BG zkKWh_{K-sfNF9x`wQmK9qfzy@VQdz`UyP794V`jFHKea8TBAHfUPF%8Xe;pt*nAxz zkMHKWW9o6ko{rmqe59VoPa=1mtsj44QA%GY^VR1%^M2Up^c`ou#`HY|AAe@hin>SR zZKe5^{v?D}OQ3r+zAlGm4b0!rwG_D~SS~&@eH)?8K2-cC)X?^1_PnFp>|r>*K+0Z( zc6`Mxa5~3cj*WK>f`g+9N z`nMqP;j-U`l7=Gh5Cp#sIj6u;jNr6ci8ii_mznQ2;(GAS`}5*uH?L%>7$>7&ThaVq`iU z!AkK_>0*{@Uxu5mqpc7x)7`yU!&u-Zc&|kIufV3LCsPOC_r+X;#WLCtn-+-*wGkYoW*=qbA7GILrF!Fbw5oZ-l_s6VtEXHAc z5gGWT)mGsnMEF?MR^bpLe3!lhi)a{aJkIAR*u1B_?cn|+>kU-aiIrI;nYe+Pj$oBg z?x_WWU%oTPf$wj-&Q0t`lAC2C#)0ULT*t8(2ZCx>V`y+7&O~GuLI;-7Ky+bE8&Q*I z|LlT9uff0R2vZR{@YpNZjMxf<)^M-A@K6kvE`M01%8)RsO(1GvxTd}^ddb60*g@;z5mE-^J2=1wFRvR>6JLWhf zk43P3iqC@Q(ctlY5yAxs{yx=pD=Pa4W(*~}QU0l$J1Vpk(b1vBxcmPik`EwxhMycd z8!4kgi!8kyyBsfqSUf12T<&zrTjaD<^A`2T$vEomPfp=^;>5*Wknii{OxAGXVk+Yt zNX}$F=Y%`d-l-GQCSeX2XKGkJJI z2X-Z=@OT zR+63izbHITVtuev4ZUmX`D;HRgF`d2xos@45S^{W#!C{n-bkyv1GUB3u! zy4YYUPf>Otyr#Y8LK!Q9itLkNBz#vZYRkp!DMiiB3YQG7C?j!}f)L4HH__ncUe#V0WjQ?^`i7>a4N`wyQ@c$hlB zhUf~NIdyc91r=965}lsE8$sg zyjBZyD_zd1#ETX^h2X_-)X`;^X_vfZiK7T!o>eE(;(*n&>}y6Q<#KkX;1)gsT{t;TxeUMwTF8 zzb95AphUEa-$U0TpeEub1Zb?SsA6Q3Z!E83A()QdXjTWWq2I^kj72l0QVNwg}yKRzTE<`*|(8)EvuMz8bUp!|1y;+vk>aUQ<=vv z8SF=iy}KKExlIy%9BVEi3>?d*WHCmIZ~(J;_s=W zh+V$_k&0knMW?u@^0O$yPuzkkMtS1lppbsNu!{R_59{k#f~OkDjk;CbLm8N#;x_J3fJ_%eir8a&?E;Zu{-YjalWVm66IckJX20HN-af@wG`oTN4B|nTgS~=j>~T7p zW}F?4DbD_lL`ZV{&NE)Fv|zso(t_@@j{m6lexGyD;^hc9Xn1AzrXOXwi*45!gEg`R z7Iq7cH$Nh3;h;_Z`R7Ip1IZ`eX13eHem(r`_(dMogte7qBWjNeC%FvBSby0fw+1>2upX>4N2A}Uu;-BFDRe*hl$8!ar z^Nr%U;-B;JJVC#bLOfo0B@T_5=IMc(4AIMwuo_`=<{ULUy$lK4A`F##{~9bf+JgqF zQ*Z@vG-rI|!lB@!8$G=G$Q}+w?Q8*>vq2r6%PT$Zb5Q77T~Qfcvkw1$nVQgSb&(^w z&N>oLTtOXSH%LjS<3HHVgL0n7+Lj^wVyH1^fAGyGzTOeby27&im#jfW5trGSlCa*1 z&iKyiy1dM_XF$~>l<17N=DIu@HzK59x5lVlo-k_Fi3w|*=!`e$KkG?6y$7B4Oi+p` z37t-K#_MoH{7B%LrRF$=<0%OnDq>lmvFx}?#tA)WGUBolrX)03?flhqjcX5kcv?x1 zpR)SowTPcAu;xhP9RYMOEpd+w|Fe?z1c;}ZbcmtxWLV}LQM0A<_QEe~=Ch;!pk#=j z@4W7=IcQFZUWSA_Wnpvjk`>u&98|$oZGwng*rl_(W%s|S1Y=yCa@6bzP4dPWRsldcEPW8?86Y^;gELByUNh}&^umowhB&6{}ELga|FuaJsJt|nZCva;HLf{vbU-dk zMLa~gU}6InPcNAP51zzMpLHLt!JF}!D z$gE~~b%Ps<5!=zcXZYg4kVsuGdkEyRX6G7YBwNx9YaOJoNMMKv-)YbVuh0F|Knkx0{| ziP;nDClw|2_9cGMOs`1oB$s{eZ#q6XITIqO-s08hOiDqdmbZw_c$o#&VpmW4%1#hc z%1H9IN$lzg6T6b46$(5mv8%@e8K~-{$0>FNF(&ByoLw|HKaznJjih_!wkfix;N*FK zfYMbMnnTY=-63#5(&@>?Ze28);ytaJ9|&shLj9^F@9C&Z*(PNDBSw+xPuQ~0N^mbx0|wC^N}BxB#`I9dA`;PSS`V^N$N$G}*+vSwmty zE};CEdK_d7#JWCIrClr`(_0P6sg$ISrlj>jb()vX{%3lZE-Yx0cPw(`p%2X2%5r|D zobi5KrnT8!T}6Raa24de2BKV{b#qNHWZC|Zy%8U>d#i`+lRz+Qrz-OYV4XGLd7ncu z%kO=L_sIfw5<6=O6qGW&5!h3??osb)UpWi=!GUE|&O%Koy=@hm7DO@&B6T`-=n%>5 z(5XX56k9eVlG!RBb#z3Ix*Zs)TdzJ6pq-VHi(S@5e&jCb*q*H{Lk+pgUC)Xo=FUv2 z7ipRw$?VkOo`^o z>S5)ZC3&CPKIeJYM>wp_yibCV7ay-l5D4r zdT)jiv7SB#Ni_B#8SBy@(g;Fc5XQq1O)tg1;KxY^er!~DA-2`XOC3^_RDjJ{8!O~Z zD8e|P37o|0@f1YqyfHWtBzc{wx|J7klj`EM@ZO4|oSxMu37(9vswj%2=XOF2n*puu zg)CS4vEJGhMFk<=#4IizGi+$zp#vb*GGjUn`JiPDl!NX%z zI{L2{?TR-t=9K>Z2aXv-VWhHhs3AcSrDO_pQJ|AlEvLlKyZMVK#!@=J%ok;W0@Jkl z^Us=%0yF2#pNfyv*>g)5Ei5T6Ennyq_nSSFKch3*uEnOnw6LTMAEHjRL`_`Li=V!1 zdJ(Ebor_QoVoXz1dhTp!lO}-0$@CoS>y)x-<+JCO6i;1*dWy?pgNF{p z*iSEWN(aw_&d%U@l-TjT!REtg%wFOw=+uo3&7U!&tfbtLMpen&l7%x%=1p7boHYED zoc^7T&oTAS9144OD(u`Xr!91hN~V;Rw9A=@b?S&wfb8c~^mf{;oP{N4&n}xie_l@K z6D>;v9J7!${0^))w}i5k|{X%1p_#{ zqy&xP+rgAM)#sH(^A?p+c4}V9Vw^zFF2^|*V>M+7&ojkyj_W$bKmAOdb5_~xWhKsn zE}e9cSWP&2%~@D7vv?6&89i`}e=0lTEQW%nNjJ{~>=vVYC_iKN!m{$g^QM<9;bGXN zGpn3lHotflPK_9+(gD~Y#q8->)+e3-VC~) zanVb^4(-dhWrn&_>)`b^vM%0ekd3<@4u1v8+r88v!%qo}oSKL>rYUkbUu!E8neyfD zBK8pbii5;qA|HaVp2;E~qth-E&l4{e*NNAQn?(K+g5{nOw~OzKd&I9qK8<94(B0v_@Vf< z*c8Vm>**k#C=L@(7w3xSidTp?ioX+|5ML4hChikm{DzY4)e&>WuHry(jd-*8zWAA# zoa)yzMw}{^iKbD8c5E(caIO5;i5tb+#CyaS#8<_)#P`Gx#7{-jE<^p_$aZlqx|HohB%Kn(Ue49QhZ^K1W(;vR@KSlML(ep6tJgrb!0>SF#U?rb!0BhjTdBCs{O2GWfG)Hx_e9_}k02xu;Ri zG|AxaEq{N}G|Au}BirVlMt+-X8az|}rQ*5b`6S9+A$yH@jr=#uzFmAsG)*$p`@HOz z#J`K5iu?gC>;GQ%VUa)1r9X{CJ+;Jo@;8^AE4G!ti|pgYBKc2}eX=-G{)w`SMbjih zdkbZsC)!-o@UN47op>XOZFmQX@PPb(5FeNS1rq!1pGDImL;OS9sMqG22KUlN_+I|Q zqRlmpc2YC_^adpIHxir6-+@Fsox~pU$4KNKB94&X=AMSXSpE_c?aWj9GWl1Crb&iA zT_xKz$x!}A+GzJy66GIM`orQD`Av%q`CpJfm~;AF+9Q6t|0+24!20OfjyMbjQbxnpRfp5`R%j!N$$ zc9-8Y$57rh$H0;FqnyoIjdC-T|4gw=k${ivr(yj3)5t0)g!r8JqG)qhqduFv8hoFA z)cZM!dcKzJ;X48QpDbpH^~7UHuD|ToVkZ*y9Iy02@(&gHJ8IT@s(1#8dS=Q#OFWxI zJh`z8DTm3UD6QH&ss=_z6zk#i@}Z}$xn@k#M%kyDH^|EuEL;=AGpqTT;M z{7czii-*L2h@7;E^&KnPgjcYSlg(KWnci0%A`TbFixb7^;w*8#SSBtPSBjU2oR5?3 ztP`&jZx(MC?-d^q9}}MxzY~8DQ+YoH^=69MVq>w5*k0@^b{G4KobHbG1e$WE$UZ}y zD$WxZisy)?S&#C+k!{-bu&uDr56OR*n zh(pBTB4_7fxrO3V(e5w7f1&JE;#Fd$$f>+o{%-Mp@%JL9^9azd`n0;wJGy@nLbR_>B0PX!rL}&-=1>iF?Jb z#P7w!A}4cWe_Mzh#7<&&u}B;s4iZO+r-+lp$)er&L;a<)?fxHZyZ;AXBEQ}LgUyNL z*q_J5r^IK)SH#!FKr?QK>_9VakL*A*?pxV>fW!L3qTSbnoh7@W*hI_~+lYmt-QPpG zBH4XJyT1qjP}!UWkL^tnIRPH+mEvk~op_UYo48rD`*|q0RrWLDcJWQo?$;q-7~h@P zj@_pN8_KS!71v4rZelO7pJ?~#P=17LyH5w(?$d#@k*Mt z^wEA0(2%iI^w06}yVv#XjNyk+Tl6-WlRtae=r* zTrP4-Lgv3(yj#3i{Jr?7_>TC#$QcS*e!s{W2x%vYoP3aWW0A8B((Wm8HbL4WMNTA0 zyF}#7fwV6XIcXs6TSU7*20PGbdtd%tVu<&Fke(!RLP6SH#hxTSQ#q|5{li7h9!Ptd zX!o^{j}r;ff3C<$18E1EYn(Tb_9l^22hx5@ih@7jBb{#QSY$I|~KBgCmc0UQW-A@8JH6PRGiJW$i_66eg;*BCF-($MnF9Pj; z5oq^|z*m@#_2NW(%=dx#wfLQA_l1yd_k}=CtjGMVL{6MXdyvSv^Jvc!=aXn>h3xai zjp8jL=V)WOr^OdYlnXS`-j|#PH;yUpr@iy@;ag+FnSo8kYGxBd2-xS{w-xqg@ zABp?KZ^VP*k0M_z;r0oOHSc>hl%GF8W4;_QPb?I>irvK`v5z=F94XekKQ>AJSt5Uy z#`a3Za&e^?+!tFV`*Lx$xK6xDyiLs3eV%$;e|(lS4920LZ0X$cDN~`@R=&{ZtRPm7 zSB{;6=~K$5I0aM7${Z78qqE@GUbOMEOfQ+bXr}*WSb-m(GIc6m`Atm4%Xo?A6ucKa zvqVk!Wq#?IGkYFh1oczVN2g%g{JC@S%cI1KW-OdC7n$&eW5Ja2@`bafE-FX0|N7Dx zSute%Rg*1U#Q+#aTUy{h^WnCUEj9BojY}JZD8fI>SBN|{+uafrLRuJs3y*Jnb#eM2 zaCv5+zbzXe&O8ikZwx}v2SlBHsEc}u!4jm6fFrTK_fa3O#aJK5AgGV`wSzK1DE}HQH=K%f`w@eTf`t=@BaAdYLH23 z%=d!gLDClF>k}9t$C=Bs2#Nh$hyDfQR~Ko)_IMj{Z1z&XmLE}H;=a!|xsbuJLc4GP z+J!S4@!ANikM*-n)E8e$vHy*ZTh(LBGKu+aL;pTGN|&@3TL%E7;RE{$ODtW5EuqsFw`X6 z^VWXUXxsCe2Yt5lq0e@K)5z4)Qr6em=Y=9`Gq$fj+(3fxkloE?ODdyV6Ul zA7#RO(jw4ngD(Z4cK+zHlFujo$J=`u=Eozdg}V%ft2SJi6aadG)pEhUDv0_j>7(4P_7B zk2Nkj7`?m*s%=Gw!jp;)g@!gf>^a`y%*7t+@(zbvhBv%%|NR(+Er*bqMsMoTKk1u_q|W{O9}KroTJKg?_N(}2=6yRpOYKZG zz0}Hv)L09**`Bf?Y5k6aZC9R7m9?Zs8|n=hvFD<6Z|_CPYhtHA*y#E`vGy^i<;a8K zy`v6>?D~#k8IQhE8*>qRDF@x2HxG>N4@EzI&B@6yowUYKRjYg0 z&3!MPW2oi$a=X*vjn^7o-yceCJ3o!aLa|2IC&iLu#hFsP zrCl~3%6e{68LrPgH)^-KH{nDB88v>);b6HO`Mgl_mB?L(%7cjJFj6$-c^-l~Rf8aotv4*#H=#&~i$QmLDE9gJu= z`3{fo;HLZoV*%Z?B*tGxjnGY_-$^aPzk!IQF~4-v=EBZsgn!UYTLU-5P%`*~f9R&! z3%g7s_5`g+I=XGCcBlo`#qk{vCQnVvC`eK}EPR>mhZ zd&#Vq@pr5ubkqEr8)h74Lw#g6$@rLq(N|`UQ->etrkfT<8yQq|fo>Y(9Q7+X218S5 zdbumzj60Y-+*S;BDC2wDqhwzQ;iHSt?|R5>s|?+=3UtkM(lk#? z{EmiwQL!m0Gb}Zl!Hz*Uje{lKG*+B?HvTcFg-Dol6+t(xCAvc0w7X$uoW+$qyEfx& z=stFHanKMp5BIvPo6uM4reU(^KsQYVq?@LWNjJ^6q8UrruSZjOj6y^y;|@0Un9R6t z+6rqqD`P%0Z_z&0FyjrH+iaAmn|3$NXPZ8aQ4T>jZ3(yI^G&}nGcUt5lU~fIgU(Yo zEsG7kl+wY>xNe%?P+T|7UxB!8n&0Q5jLx_wgKku+XUH_fkVKt@+? z^moZX0c_Mw~RpGx{qnSBRs=%#USsGG(Y*{PfMsP%V3HjgXnrtwfR-L$=I z0J>>BMoc&DbvmG%MrAkCP3yx|f^OPm(4%hJTX7vsE zevj#e;pi;S=-FHq>ZYAx z4(O)6#~jd2V-LLCo80Wp%mLjrR$;nn@3T$lruh!&rnRF3x@o=xx@p&PEufp`JD{6J z)l=%G`3~r&9mDm8Zkpf9%g{}`0@bruHm1-`qs>m44c#=_^8!22O}ieBY~G}zZW;}a zc{?8a&`tZT+0aenNs)$C1>H1m93DureciO3a5Uywhq`IpxQ#P763|U!tA6`m28E!T zmW5WJn?_d?m!|>SyRn1)08b>$16_J*Tt|2)k?5}H zH#j)ZP2*cCm~k^4=Id;@9{W9tHS36f5trAFspp51_=Ae(`;f09=TZ#1lY`*6Irh6H zr|DL>sGBwexm>q}Un~UOH2#hvXEpOScUidkDHx&^%}+!-=QeK&_wweyh5wx9?_)Kf zn^p@6)J?k?<&tkk4?-!>0z|%AyXpBelcl7VZ10fN4b`R66RsGM9tnSI|9`;$mY9SA zo#~$LvJYG)p=mDeI(&1_{T5wzPsnP7yC7rXj3ML>rLRYwZHV(c{{Vf5>Fa6v8ld$k zLhf)RxJ8!l9M}u!TaS(Co|sh+^>I)hqwgI0dRe{?Veh1m5_3{svmbR~y>quPU!U4J zDBBBmYx3a@UFGOgyq^si&sKrqTV+dbC zO?kgV+wQ_$?u1+k6zJ0LyI}(#oJIR`QJsr1X5KKmGkac_}ZWB#G$g71la0k~)Mv41i zSJGF{eD&$O26tmGL&!VEe2wYjTlOE)*UWq^=!@aS(O_!I2$47KgFm8y|&!=z{`N~V-TAf^vdk&wx@onEXNJZr)-zg zcL@i7SSI(q^4b`Dggn0L>KFgD_icc9Qr73bw5HI&OXYY z^wq&iwjIvlE^-@i|NawF`A&A*u`DI$-{5!;!D+)Xe6^B4m+;G-=$G?w@6bi?%gNaY zjs^%$8+P3YiY$xc<>Xuq$K?o4 zyY2YLjp+Ark$Vi+?GH%eb2Ps#Id{SFCd(ZA8jjY<*i$hYSlr#|t+3JBe*|wS!aM}t z{B=6)N9-~LzA~+1yf_NmJ$-j?`lO&(6*An2kl!#U_9(1}tysY@e7WZQb)Nmdl1Iq5 zS@*E$GNinMOfMs}p9|yfh3BPG7!=b9IK9%cn<%sWp&?W{SZ{w5_xhE zth(b7=|+Rq4MiA&VAV}Qq!_{J7{Py561E$mm|G@mD0aj4eEN1a0-vh2Z-sxqLEs~` z_6_mxCWMU$`Gs6xidJnycnSgcA33_WSO@w44tCIUGtXzO9O8G7>um%Z-LDbZ$6|%- zhn+p_Kj-js)7>mSWVXH}DF>H zQ?XxL4<;hRsR;Q@v2HAaRmNgYA-5LKwx0cen*D%)*=UyK=DG~IRw3BhowD-|DR($_@=i$sOJUbe4a(Q*>@uHJ`L7$0FnI&s)ysk(w_Z)k@eJf zvp!@!+(yv`*o_fvT$&=%mQp12b#NC(^<~;59BCE@b?cyE~R1n2O=90^7)0+?|{>hpOHMmJ!dt% zZeKU~x2$P1+}n`%DHgsJhKoDbKeI5ib$9}v#_$}2fED6q<(t-Se0oLqG+$NCR^?RW z8joOWQHIC@7PFP-d)Z;<5t#1jZe}*>u@bA0;bMe*rdY9CVBPe8*n1B+tEzMTfA6!; zIn#%s4hq7+3`iS#2X&;32#7EsprS)BN^^!DWUv!sL9tMbhuEVg)~jeN2$sZxXpF&* z##q3viGw8id!Bba`<%n5(cIkMz4!P3XMaBHeAoM~y4S8}pMBQDVs0ZoZ{_&O3#MP` z7gVw=cZPeB>pu`|BR-ADlQg&y-$djM1h)~p-;ByGhnv5t_n;1259q8dL9`-*5$f3% zEY6nNNXyAs0my>?> z_V~u2xo_8{Z&=3u&VYWX|N-#hb!jl*^$wW8C*R(GLDdedUj+Sld5N@>KWks ztsd*L( zqIF0rj-^YSbxe~u>*OTPO4B6HIwuQBrc4rNDd{t-OrmC8>*kif8*9YrIg~J?wpouf zZL_548Lr*wQe{r4toMOJW%!eT3ByU3tnYzRXZ_O4hf-(#57d1d@Xtz_)#5A&#j;%< zBlag2NSTrRGGqxn34Hg`6>caP5d5~`)W{ech=2rwPs^dZL-5Iy%fr|>OBhYCsedG8 zhQ~YB(iozHMaL2R9RV{Vv&Ay2Z5%PuqQ|ifRt#kaWc!|_GyIsAo#<`R2}HOu6$!=; zw@NAqr^Paw2v?>ek!q*{Wxr!-4j(4kCS2!DiOsb)F4g(89v@e?7Pnz8u?@tPf|5wx zEZTUNM8l1TJUG`LxTv1Yv^@BpcfbNk4Q%~7i@l`-RWWih0>mtcmB{IPClH)+IjLMm z<0=HmINV;t$W{dOXEe!wOhIPpZ$N7s+KB|m0aX#)fXJLna&XaDIL36>=~}qn1*}kG zQxN7sAE|M}1uhqfL@+EqQt%EF7Bqzg3^)@b8sj!9LqJ;vB!daUFv5FG7%LKtjCRJ# z1S1oju`0pHYy|9A#9ZfJmf%|kXPbX4vDW<6kpv?foe@nive_B&1aBlJa~05&b3uOX zz!dC+yQf_hO)&D2^AioQHW)9WGlI$GFjD4>Xd-QE6!6ZAcS0yYFrdK71S7khpWu`) z$ineuP!w5R^<~;j>?L|`3tXw;PK#o^Gc#@MC8A||YTxmJje&(*#Xf0mM!26&Z#?m& zMaK{f&|q1XVB~pctVl5OvNKjD7$QsRlph*Tk9&m|ZFZ$&i0$PMP7MDUIq;zrQ~BW`O=B0h8eWeG;IF}BFGBEd+$ zGgc-TY2XZKogvZ$0oq8!!Op)T!3duTnSc@_9h|W$!3eiMN)X+hKayaiuQOIA7#ZS> zRS8ChA)o{?()lB%hr_22wjPYgSe4ic<4FV@)Wi;pjwTo&ueQtkmPhMF zgNGvO3AY8BNiI6Az)mUlb%2$2(dWqE?u6g~U|&5w?YyyYRoZ!DVU3+PKClv_39ggv z-Hg~S=uIHpd1I-cNS!y9M$*n3OM^ri_HcKfGJ$2o1zs)eXIBK>Uh!tZ-66F_1AmRU zYXXlSUNG%S1@gWG1qj}6u|P#4yo#ouo>2!oiVu9cfI}x4rw=yUKiqOw5M>Cspx<4y z0+H1Skmwp2hk6&|YY=e3BhE)az6WX;xd_1tc6Mu?purs&8N>ZJhJ6%bTN~lsj6m@$ z(#5+b?nj&(2PdPi0N(J$yu}_GWt2M&?*GDlC-4^6B)AiCN5KtOxW7o{EZkez2KO2U z3UqO}+_tDdownFmpbq4q!Wfp+jnC+-FzVMJgbHPh--Cdw3Gr51663tx$)rqLkApD; z;VCaHOq-{>RF3fE7v>1JA2zJ@1RwZzAD|3I+3ss15xfdT8>XQO{XQ1~*D+$ZMUN-m zMu2i(O@a}3Av!*FA;LD}WyM`2pc)rmBqSl%*)9}3?Q;mjO8|$Er~MZZFzCcC1n5}S zBp7+!`NI`w(Qu_%v^9F%4gq~7xI5cU#?^7lcOAyuHOmk%CqXfQ~-E5l`kN^;&B%x zT)pFoldazI-&Jo6)qY>S_E6iaAa+~5V+dDo1u@;~t@y5bDFDY|<&k=Y6&`y7@ScnE zw#jX=lf%N;ZIRuUEUc+3xx=!LOWjnCOJz@f>E)0I_L~43st0jHrzCbS>?>sn&r-$D?xgCvDYn5rbo{Ig^)t z-+o?OV$ShldEcI_FEnTJqU3(~JH?#I;pA^#JQMR25W`umPum2eY(1@Id@+WjPRl%I zn2(2540mEE$|!Tu_XDwKi`FL>f;*X+? z&bFdy>*}_i+frk>c@DNMk~|7vVR1kC@iNP=6snI=x9P_ctV1b(LzJhp!tXrOp({+p zPGG0Py5~A1Gl^%r)TuB$+c8l~JTe(OE01hwg5~9gZZbkIL)zgS%?h1$vu7kz(w0y_mmeVg4oO&g3|! z{q~r?nOOAky2Vq@uvI>W4bdr0D;e3yheO$xcwbUN!w4OKC|vd z;L{W>>CR+pDd+cIcmg{=@ch*QCn|nl?OVdD*b-?DrETV(h8V7__m68w|w|D@{PBOcV)CPHg3 zpQ?LRRNaFD7^I@Ai>SB9y**!!X|0B`8ocKXdeOgX+ykaQYK_qK9^`jcbvg7p; z8TtK@QBa(!hPd89C#~0DqKVy^u$~p7%3TTaEJq&GqzbDlGiNNLTOCI%$nhJW2+=CP zB3Q-_b+-<&?9wpnkLeFZz8Va--mnkJb#d)NeDGVoSVl4v*9tv0QNoi zoR}D-$Ec`B$-CRAYSy@MEK-u`%&4Ca7`p7`2JDd)Z=R$YXS+m zB9n*9fbiRowHje1n+1R17@An$A@Sh)6+VudqSzr$O7fK$*S~&n^9p#|#}2_~m_RAJ zoM7v6XKzLG?QFm?Seu;?-xUzzo5(}-LvJ7zJt4&j6~6itdD;n1ndnsbaFFKq#aOko zy=^Nhts}s9uLSrW{C3iP65#td7o{4d_Wz5kxfK^-NNg)U8-=o>ZN;rg-M#Fh#<7Ev zg9c5#jCeO3-|?V=tJ@iJq==>j^@>eU4~Nz%Sd%=QHXzZLjd4d6JcO3|IPV<7Uepr1+n1|4V@O*eHJCcE7|~`_?5i{_!$Ne}DX6-W zH{?GdHTt&4%wMnS+!??CGi_1nl(}=J zRL_B=Vd>17i|0eaaKZdi=9pC9>{>9j z8p_U2tMbQb`k7Mnk5uwA{l6iQ|C>rlzm%5c|APvB-#r6PA9ot#nFMm8-C!N4`uI%x8!Y%WXJvkFp8I=@9+dDI$@ggVO~fr&c7DmAoFjW6^OPA=rq1#F_K3#% z3@tszi|1t=lZF2wH;6XEe;Nvdrv5?x!G1Fz|2>SfPJ7bh8cKIWy-&YU^M-&=0n!%y z&YfoQxy^wOb^<)(;`~#oCF-?+F)^7f^$d)8{x@p&wL-tR)*OFo_Vr^&wG@!wbK=D1 zs$`K@0&(2$RG;i){-j7Bo{FO?>hW=lko*P3^e4!CH^&f(zpR*TdVJVn+R(_G@YgM}G4>m>STx-M*hk9duar!$5ibxoiKYX9^!H?cDK^HT z!*V5J4{?w!zk$H+cOoF}dlFBUh8cZlQoS7el*A}$d5?-}|p7Hyt& z*!RnRQhZtD-|U&cvDilJB@Pvj6K9Bv#dE~V#p}g;#3#gE;``!PBLDl#_M3~P;&Sn) z;-lho;>Y3u{J_uh!^IOt)8m7Gmh2Ux&Fc;Sxw0=1*NJzC_lggS+eOpoLwVEZ18x3p z(B|(3-&elCd^RsPY@3%GJVE7Vkg(^7^W|SI`*iV4 z`7e}xiFk$lzmR>sc(eTfA^Se@A^CqN`x(*Z??yju-fr~gP5Ev9Zuo89Zuo89ZtyGB z6T>;3{m&BfN#s9B_90>?(dO$${$9#w^K`==qV%KXA18aFxKLaqnjRn8Ia~G`(e(J> zUoZPA@fPtm@gZ@WXnK4o$3K#DeO?q_A>n^V_8#$L`M;9=wHV;q#{Bst>S-X_Jm0X} z$nGij6-|c^={CPNc!K;Vi_=KdYdU;LHyu83sr)vtH*A~N8~mC4SE&3(F(LoWvVSe! zCI3URw~0^4|GaF|=R^Ik(8m7$hG_GFqklFJIMQpC|L-LHSqL1DJh35(@`Yj%iO`8e zzOG^~`Hz%6R2)H~yy^9U6P0he(r1e{KRDvcWuGpZULVSxM;lyAB3z~P&Eoa)-yz%P z3rGKcLmS)tQKj!xy6N^I{U!PTEdTrB=Oo(ON20vx^>JMAS8dy0Nce3&arjNY59~lc z%5_zGneq=2kCxwb`;dRU{Na4#vuLCIsp3zRUL&p%FAy&mH;6VLIqJPZ_U$CP1g_hGqV3k zq8^(c9sT`C{?EiON%&3Q59OluVT1KZlxr*=Bz91GXR(hsKpY|t6HVU_^_)Z-oFZ~& z3AVFDtP#%=FA&#?;r!~?(?&hN6z^C1L*f(SQ{oHaF7aIw>CcESiZ6=?==-5R`{g%%KeQLccP#cZkAz)cY)+z`)?!<+kJ1N- zLqwb39p%T!K2DrWqMjP@auVmLJH+S3Ka253F1<_~C9V>qvCJHXT?zO?^W5m#dpQM;%DMt#cxDTddKz4 z6**@l?WSUL5i_Wo|4^~3*i#%J9wC;C!$o`kfO?OUeX=-Jnh5u1;V(`8$aN#3RI!;%Ko_GB7KYOP!I4a+0Tk~bpSt>|8tR|3T%gS`;!gDLa{__C-xBsh{ME@;)!CV zI9FUK)`(|`YsJgNYsDMIyTvV{Js(3qpOS6Q$zZ=K+n$fXuE*zHU=#6Rv6a|H>@0Q{ z2Z%?A!^Dx|SaE_lS^TlOfafT`J*PweLOsAMk;SAMk0}JH=gMs1NwI z?Ds@_?uYt5m;HCq$Gs}s;oN|vJr@KA$u1W|y}z-tE5&KzDdK!_srVCdjcCseQNKMm z1h16;8u144*W#Vx{o+I7W1>A*L_IIa-X*>v{z?2m{6zdxwC9Z|ALsKnFk5UOHW6Eh ztwqk8$oxl%qr?jFWO1r!&mWP0o@{&m2-}`Nf}tMZ#Y*2KCd6NfcZd&)p8Y-E4F z5ciAUh;e)&u=NugiiKhev9;Jy>>~CRL;XK{j)?Y-k^eaHcrn!fn<0CyXwMl@&YmxV zr^|288DZOVMsThCmx=bA5&lpw@J9LVxg-4cToJVAir{NXe^a#Qitv9V`%7`Z80rUR z@_8Ea)e{?v&BY?|P_d(E&l^$Bo;QL=%0E;bC02->J(KO6Dprg3yb=By*=LEIS(Ewg zIU@KQ*$<14i%*KriGL7Z6?cp8ihIS+#V^ILMSe$RyY_q$wC9UpBl(+(EyZH-aB+}$ zqF5;|5m$(uC6w)K6t59)5Pv1wb3)|XBKrYxyZD5-LwsK3WRo=Evi{+sJtu^1&k4bkjVUhEuvivUb4e?Ln9`PeF;PWx$&k&o7MWQ_)M0!Wrq3&UY z?Bm6g#OdN}(VhdMygdg5ITI_}yItHO+H*emx66J)+$p{wz9POMz9)Vlej(P1--rR9 zgQ5Ohu|O;on~AN(wqh5thuB{{Ts%q~A&wQp=Yl88o+@(IS@t8;S>%kfv@aB|7OxRG z(=5~P6*;dg?WaXfDNFlL;z#0VV!-ELNVn&HAg86I-9l_HmWrH5mg$4Uy1I*;o|5Ua zMa~~f`*e|0$I`w`wC8%T?YSO!kNo$GkBEM(%l=&aO8i>P;&U|Qx953a z2icv)qs3!HPC?83i^QLhxR>NawDeyjCd6ySn@Qy3%(KkLi8Dz~FiYBVJ@8Mm-xcfX zGv@I*9`e-}IioD?wjw8$r9D98yt1@Mi=0}P_6(7;$kOJ7nItEYB`+2?i`R*qNtWqP zh`YpB#Xpf)Pfi`ne18==LoDqak(0#IE)qFUEbU$*r;4RLT;!~>#0nDqo+5jOxI|nb{!F}B+$>%va!yv(`-I48S!u__ToUbYa#s3VikyO#_DSM& z68ShAEB#AFPP|I{0&yLQe4Kuj{u@M2vP%0mBIjA9y;I~=tF-?t;%l>5x)?_=eCV#&cI_1&@bqX@yVb!(&lf>gHn_mqQV_FaJ=!uET4~f%q!!mC3&KDBOD@j>8{s7rMaqDiFdxAnL6}UDtEtYYEdv!A`I50o2Fe z{#hT7QP#=&_`Y9Q22rmUcA!(!`WL1xtdnmuUf}!!$9%Yi`FLEVxBKdGp0^r}vR(Sa zcKJSGSO!t=vL5IkBU-|=pTJJ9ZxR{^#|2+$ll5JScvyy2+>QFu9bwu zBKwE0I?4L3JFvKSH+F>K955|meVbvY*Z1^1H?FJ?hhwt7+Yx7(t_WPd#tE!%o%)#m z8-(Dd2}HMxZK;WqSud~c(Fe@^Cd?a_qZ zWxuXPspSXtE_?Ot-q*7Ku-@fd{-}vdt6Sfc-sR=DZy1zYUVmLidHngN<^9Twp~4s~ z&xWV|rlJkOr(U^#_@>Nb_msz)miv3luBs zQ7{5Vw)%acN9kXSobNxEyWx?&M^;DnJ`#!V-5#$`HN)Vb^1OBVJMV-BV~^D%T4W&> zDQF9wOdq~+zn4biL&0hB4|)P66CMTg9c^6x)z(Bc|WVT<)+ManVWJq z99*8+J?GN3FDeP(&qrTo!NuCVjQ>af5qQb>lKYh z%8t3HYwouFJI1~CzBj8`ZshW2(aY})F6%gWV0ka3zcOz7{@0N^+V$8y4MsrQ@^8oP z$r%wZuUB4Fp808J=EyxcxliwZeRReKzaM%xI^&XipR2bqb5p}1`5V`l=WX&jj@XI* zZRAMyt<9X&cVDD=-+j^CzEHJ%Z2wss(dtn2^MURA&%j!FLkq6jy8o;P(5H=9Pk1ky zHR&#leb+7fywS*ml*j`p^S}<2-M;^v2mDShulE4T&1#IcA`fu;Y^jYDF+I$W)Q#Jc zHG6Dt7RN1Xbe$l39Y72H>*1W|=sAOhSE%W!~k-bM{-1=!G_v+@CmS0_d z-KTilymY`$uh=W{T6tGKgMGSRZSlgxYm2w`tSw&MySBK<@A1U`3;drC`tANR{ZF2Q zV&_&bk-ImVbz*sRW9vKa!z7e^u)e?&@f3gS@7Je96!YzHy~A0aDLGFO=^ zgFn;-l&6Z$YI+G>nXxBuf(t%IucC7fYR~e~82`5v@Ld9EWR8R@xDLgjk;yYm@D@Ix zky*t!fA5a*B9K4KWCb_JIwA>Ld0sGrmE01rXfT~=w>A3+S*e|QJ@fdPJ>ad!c)(wrp`FR$ zE8x|N+L^^z>%3j~fOaP1XhYhWuEl8HV5|tVGo6{4w-*gUJJXrDc~m-pcBV5!?acO8 z5w$ZPL~`~W_~-|htsB~=7AdteITK0VFYp2FOjm)Im&N+}%Z%pjMK__H=~6TE`f?2h z%FNBXC<^m1nFV?LMH$+eE_0*2oh*BV%%*v_v!ODX&GW{y?2$5yyav2YH|@;kXd{nu zQP9q0oTGj#YaW?J)3h`9FnN@%m}zI4G~5{3XG8q%=U9zS$Ze|(?aT+znrUY)W9>HH zCpTc6wLi?BRmNSvqj@*6-&3+yS!!k;I|l7c4wketS#kD7_+U^Akn)28MU^sijoO*p zVCMY+AJEQZoDEUJ589b(2%Bdp>Mo#w992zoNO_MkxaA%(H1ecF4=<9v@=Io*|NM0 znlIEp(afZFrmJd5-f`UMFRRZZ^Z0)jXlKTONb%^rPua=W8`#?g(9Y!B1kld3mxrL8 zX*bDl=ko}rc4iqH`m=U6YG<-TEZW#UxVJP;@PmGA7rvuVk4a4^4D7TsIXZ=lI8xBg zbSvZ){*r?M?aT*l6{4opOYKZ&XBJkmVQ6PMJGbzD?rPA^bma>QuSTQP&ipIx4ym1a zF!Mt@)1`MUaThXUjbT=|I@*5z|9W*T~UE%i3L6WPFyKO2H%6Ems&i>pB?O?{~ zV<;LpHMDV3=YOiGoym8MnjVD~O*`{md!0+?M!FK3kPuIpq)7py)*4hMj9Zqy6vC32JBF&ZeQA>DFRc z;ds^u?Mz(9U!YXlL>bH)>}(2edQ& zC>+qvbPi}|@;_$O&U6lFXHrX$+L^8uYG+=L>e(wBQ)p+>W~a=Cb|&p}Lp#*YyaSFx zyQzS7CJm1H3XU1HGaoS<+L=5l(y*$aoym>E14*{i&ipGJ&3M+Kb|yD&Gm1P?JCm)t z_TxBGtPr#_`FAa7XVN8&OrE!}gEfE$Dzq4r<~|R;@K_jVehSrQb04fg#Oi`}CJz~E zXR-!pXZ{CA9NL+a&5T5&)HJ~T*go{G1^;Fi^ABg2pq+U$YH3*?`D%(j$69(t?5kgN z1`BwH@D(^}XRbmn-_Q69(n5*LdiTMXVef`X=Q87F?t@Ju4WC7}Sd{6p=;Qco)?+MtC(8oWj z`bS#6FA@EmzAaqkLG}NP`VK;KjS*VEOy6Mhjey;czPITcVm`ii`Zz-Iqv*e1UXSlv zVkk1AmQD8n)kp?EQU!_3Fq(lPX1#`7e^+Ccqsl&xzC)GtRh-j21M z1OHfr;)}U9qngr}fepBizV+yqf2@@_8@^KzihsvmR@fRIfu8n2DCYfXsPf`;YTLb}d^$yXst zs9`zI3O)(*x8_2@aaQmRn0&FJ?I-9v-!M3IDc7aQZ+^xAJk{Wl@JRyY4xIL6Rv zZ7Bb2IA$VvZD*s6`uSlSC;Lsg9_J%zO|p!f*TV60mg#T~j)cD%&{fv>UkI8@{2m4?9z^4D7{?;7ovX1Dkrm9&1Y3_P=kii#)JO=_mlHs`XA*}IkPJ(vr0ZjnGeHCqDYD$q>aOwR(vxm^}o!& zoc-W99E3DvPkP$%vdxgO#m7 zWEl+(>cxogpH8kG+m)}e{%m1?zRGQg$D%fz*C7-C0_F4(xhp>ei!Vdqm0Grb6N<&W zoh%md^Z73$Yx?)d@f?CR{UIWIX|U-CpSU7)+6ihsy78)FZ|FNMh9W=4_X|4m$NV;k z6w{ahV<;kn5jqv1+0xVCsf5K=(H&O8gFoVS&{lqoe>Sp8`0u9EX|NLhmFedQowzGn zCHKMN3kZM zST(QaeV?i#@#C=TH@rfXd2Cm7x zNcH`St4Cc&Is=Zss{p!=tiY9luA`Odo4~~+_!vrzub_sY1ikKOijE&=^x#DY1{57X z&N$MHDbuFWIF@<)FTm+MGx#(ki^to5r9F`Evy6P!FkoqKD9C-Dk!2 zJXGaPMp1PhpdX2gcMkMN8~E(Of30|=lY{I^=}DZzlA@96Qj-6IR%AX#K;n>nwDO@= zvV+fZ1em%%WE+cWUMaL1Y_*jA$qO_UFVQFa&La>2w*(ap8R*?wv zh2(Fpm_eR!`A3H-A#FAm$U$(O*C0?D;(#U4+(kIgyM=d{$Q32;gcr&ZH`Or0XIl{3 zxw|Ibw|RmF>qhF`HH`4VIg90jLlB@%K}eK4lUhwe^<;+mQ768p zxCPDlxL{%ElM7~Nffvu=>36rs{6k~5cXhH9ZFehq$@&^bPCt730rWZTJrIv0WI}1j?i3TWoKTNN~FaTRwK&}LA7Ge z%$Cuuq&03b6Wjs#<^_XNj9?;>FPfjhP4#UL<(y9(c>52}ay*F_C!M`IjXa z;ff;DiUcFvQ(&w#$w?Wjk_M`!k56H&1S9ScMF~dSPPS~7?PN4if{@?se0|}tHW+aS zF-n97F-q|GWk9BgX~D>drW>mg;gOAf{lFb{x!3wzJF4@gcGTm!qw*NWVG~K7EYWys z-$SNIauN4zrO2pL1PJw~lny7OA zOj92_*Zkv&wdP;4DouTC$x2fnyUwMoNFHR`Zx85Ws$Ugl$nW}fTDn#(#9dSUI?ZX- z&O}!1n#6nr9EMJ-*7d6*)i0b)*ujmKsmf{9x_(u~ll{VmbbB}kn`0FoiRl*_cT&L4 z$bk++qzvX{1l$@BQxTxIR+C_41p@rUYJ_yU-2NfQWO zdc&k}RICbAXG;{d__$$+MiIkr|8Qc4MwGOpz7t2v8$)bCK*{TB7;y*snACv|6~FKb zfKKsPak*F`6+i!y$Z+3o_(M;Bb5Fr9G@ZfJ*1rq^jBhz}b? zBMM=__{k0SU47v50*vF@8b+!R;@)xVqT|*@S0m0wEzx>{*3IC^HnpytXg4^FHxCmz z)+0lMqpQo;+M0jVV?Jp`Tj;sdgp1&&>-+o6=R&y4wx>k5BOZ1++!dI{9@i=#JKP`_HDoH^QD(O z8RC3{w3`nsVj48`xyG zn1>g^=4ttoH?qlG%)w@`O5V4-5s!rTBv3JW4?jtymI!Z97}BvxT&+9r)oR@NAw6)FzRz!LJQb$pOm`+n+4p(yosW=(9TuZ@LE5OL64TZ=-I;7KC1+Q6 zgQv^aogA)7x-(gaZ$fZ9k<=ZhXfh>jAB)+Ia{9S5tUczl5~ifBeaiX0rxxFyb@POg zn><66m81m7u;xhP_Z)Qah4ei#`a>n{0XR<}xwvU`!kq`yZ0Y>=^zEAY==}RjHpfaM z1D52zZeL@~g%2L(Un68+5 z+_A&@(tX^6!-f0k5`=Is4E@)@$G|Pg5H9IH`fo+xmJSzQ?`9*Mf-o0>_jNqEhYPnL z!?_4+5O^iv77dp$?V_|ap8UgwTZ7>q1a7Zz;jL77JH-=x`m#37o{fjzFj4Z~dS(BE zdSwe1E~-4OTQAJIjeUnxZvRgTl|AZFNh=;S83>)SQ>a&U7?jB>#HI`4=;m<qbf_P9^6l+QCBmk8JIRhbYg*=FLCWCml!p5;IXm-ts6(ApE zm}2oRKNRhT@=Kux)R_xg$?F`Tjw~t?#o|Y#iWei}3S^|(SIW!cki3e?#WHdQ5CLj} zbuEqshs3hF;WK_r;fYP40(3;jS1x}{vG02BSF#u0w`omFwBpy7p)TfwOMsSyEek8292Svf+!M03)pv(F& z#?W^{O7}>|>&$#AFEwd=WSH>jX-<;t3?-ZzCj8|zzp1H(tx*ap%8du_pN85gK6Yh( zQT*62^M|N~;$ydKNUX=5IU?$Dm=UUJR_Ujv?A4@k4@<}m&VY_rM!buqeUeHGa@qgf z;H%R*H!tac93|)jbGEUZwaS_7$9}ENm#Hc`TLr73nKl&Vx>`3kheKA#Rfz|`PY&6y zQ$zO0P=)M6RptiZ98)+8g8h&obG^?A{&*TYiCq;kQrL{gVn5}&X9my3ir7B(gSS^u zj|_Tr8AsSE;N7y^&ar}SrKPdl(r%?)P;ABUSZJ9p{GR#u>fV&!gR#nN-<#v8?&b&BP7D;?1hx@4}>I@w~7B8xSTL&~p1tU2@m zo1>%MW6gbkxbIKIhJn}^wCOljrZ(0*9_+GxE(mUlakZKUe_T;i)Wz-iHz8jn-qyA! z*7tcFfUc%RVNKW6si_F6d|91~T=7J#vlXZC7mB~cVzfnL!+;{n(OTxmisGlD>b6uii)D1@z(N)* zW@m(^kOjley~O9aqGyvBYz#oG9{U2Bv8>=YAA({*=ixX$-(EGaXh7;{h4NVNl?QFF z=8*tj#+{_dNN9@uBWbV7rPCHIm^U?)2KuiN?}F|LWrQGgLUAP1ADTO3e%J;ygCJ=G zEt7={s-31uwFix@1*gtIfmw4GOod?BoOufuSIwwgxTwmj{9*YnQ*bifE?m`Ex=X$u!0Hf=%Gq8ZCd=kK ztGL5ghkN6^si|F4QatF^yy;Vx|7R7nDu0}GmdRm_q#o8kBce6+zf3!e_kGYxTT-dJ zK^`^O;pQ)17@jdIm&~Z*Ud991j^}VI&8eOab)$u2y7lrFj;)$@qb6Qn*)ODZ;mMQ(&_Wu!bSk<$!M;Gz$W0si_sSS4PwXD0z4OUh|^N3PPUM0og z&>pnRrh3Vp!Ku5=n1T~YcpjWHV+IaDQ)5~*XWk4`CzNawM3iPM#o1`dBJ34d?h~s~5UARm9XkEJ0cMVkN>VmZ2q6Mc`{<9KU-z$yv zU#5!X4vB@!`Q-@Lr@2#RRbyo5R98-0h8?SV#te)KPQcUc;^DT@l({pw{g8&Og#(#m zUO9i>l)2b`kl*46dKl9FMeTT+AGct^-0Gs43#y8ateRIebl%h%)2GjvUWCD)HlwA&F)AA_`s@nf6R|P(A`F@QoelPzXjjUzCUH^MEvKpm7Tu6KFL-+qi zO{_xni;rkH-qgfu$Bt?#0DFZ7NIRv0l{$1Fj`gk6H62MwtONF3ypw}!vK!!)ShAs; z7lAgPwDX@t+%Kqu#kWhz#^OOF9__Uuk*SmXJ;eUvks^PbW%*-7{v<(rvdEueX;+J9 zi2OO0{>#J-;;rHq@lkQ7_^P-^{8;2qPpr>$vcQJ2TZ;S(9Mg{!XNi3FM*q1Ye}^Af}6A8_cm`G~FvNN(> zJvRR>{8MFDi>8wWe~s)*#r5LV;&tLJqRnfIa!<>CN&H+4=coOKHnw?ya~E|0^GK9y zD!aMZO8!o=yNbQ!FOxk)JX-#7vL}is$v<26T=6vdSIS;3o+JNS*_VkMXH&?-c()!oOSg+v5B3+q}0Jms}TcTu_VHYB=T2^)8$_%dy%+; zL_0QbE#eo;zfN3FBHTct9n;AIZC+dWY(87Gvz_VSZ%Kp~WbYDRC((}0V~e=WUyJ-U ze=YborXytHg)r8WD>fm~UUL%VO%Ds{riTTZ9v1xkGZ@R+{I%dQDmPY~AkI?0Q^iH% zGVx3j?X4kE?|S+94>8tn`d8pDW#1{@Bbp8t%JC0jtmior_M1vK{VSB;Bfsfi!TwU| zoEwhiGR0i6If;BlVtcVv>@D^ek0w#iu_W5Blz*CN^Vp)kg|e56r;9d^Ey`U=8}+Ow zVc(?mTg5x%zhCx4;_pb5dsgW-e=XXx`D?)slX{|~sp2A$fAwNLXNc#B=aVS6kwp8OMgGx?_T41PZ4n<49}{!8 zDEBUjdQHy?<@YPybgkge!VNI%%@doFDA$5Sy3J#Y^d3qdD3*ywi^qr+B+7;J*3Oo_ zTl&?HQ8^9?~$k{6W;;I zcH+?_&I1$08REI(2GR7Sknbbez3`oah9O4jq5_@>DJl+(XojPQE{?6}DPm(xB(Y$KY^FZ}$kInzz=7n~sbM3L_oFnzYj zzm?NoE}kjc_Z;~7o+8uj`wqB4HYY)${|519(e#4hzgPB?;tuge@nw-OS+kx3u}CZt zOT}*DVd9bEaB-A4K|E2MC7S*)+Oh9dAm4RhyJw4h$AR`GVyLTR-?!kuUjAQ;cZ%D@ zP(SH;*)NK3iJ^`XesHmN;$o3lA|5Ud68T?$_Ukm!W+8&TQuf&*U+iYSi^X-~RpMsx zM)4N$PVpX*(;%>(?c&qoPH~s`s<=n|Nc>ui@cSF;X&`dSFxrQRtwhdSK>tW_oH$Xm z|Cb_thV1zwr{Z9_<>Kk$x#IcarQ#Lh&&6MeH;ca(Ihzsdy-(aGJ}z=j1zQiXjo4nq zKjAFBr#MI~7whUBRmwk2@PCO#!TD~38ougbRX z#fZNz`!n&c;@?G|-)9jIb&T?5hdM^hWQRIN?PPZmdx)WqQJL&e$A}Y#u>SGl3E~vd zzJDV<)G?}(|0iONxJJA{Tqj;BhPp+!$gZnb^tk*_ioX{*=^gv`y7-pJ`8DXz5gUqy zVhgdg*iq~v_7w+;HgOi}J6d+Adu00C@Sh|6_ z^WP@kBbr_}{5E9|_=NmB#TUfa#5cwF#1F*3i2FpmVQ=k)`bc@Q>x&1AEkw>l!v2Li zNk_;YEOIsyrrUE4aFOg~;u)gpgd_a|*`ZF-RkAmWp-$2*vhNg4PaNeRmc3nkQncqL zNPkK8YvP|p(;Y`TXG&pzLtQ0%o&vjx{4GU$z5;&-*`cmdf7yqN_S^;ej+T9#c)ZA2 zSlHeg@nUhEc$K(WyivSGyj$ENJ}hn*cZko6FN?2>?}&RuPFTeLd?jY;d5le227e>j zO~oS7rW`{$XOLm}!J<7!f;~a@G|_a|;kV~X;8OX|63-LYiC2o-#V5o+im!-oi|>hF zh_#}RdusMCCgzKw4pLqHqmD}NBK8#ribF+vzQpyA{S&dS-qDrvhq^~M%DzRsOT1Tn zSlli?B|a;@BEBKMEAAD)6!(h(pQE6k86v0cq1|3IU3J(!We*UK5XXt8r;dD;vZsls zi1S5G_`~|o6MsnGh_eAP{|=E;0nz@G_=Q+2a&jN0+jAh0^ZL+kEpj3s+Ji(+)I)oM z$T@mw&lNc-5ABOY&c{RhM)4`}S@BcxFCypWVgAOVJ%7Qul{56v-$g7FhlnFcuqFzq6L%%&&0pF7Sj)*_1Sb9|C%sR|} zkQnO!be7FIbeKL&N6L5kXrXM15jvLzjMNV@=`&f~4*wCIXavB@jt3=LZLwlVVKF7F8 z_H88Ai__LH-!_pG)X)y~xj9D-?N3EcQ$ss0avB=i?M2Q+L))H9fTL-n9nMEX|1^;^ z&(J?;lw z%fun#Fma?fQJf@B7N?5~#YN&WaizFMyg*zl+V7HB@6EEW6K@i46}N~Fh+D-+#hu~{ z;x6%3aku!k_=)(1SS$Wb8p??8K!7(Q>9D|?~1NL($RE!NZb=0;o}oI{$1>-Deca)fU%b;c`mou|*3x_DOQ z|C@pw%`hGqD*K%tI6!NFHiplZR`_H-d@Z-7rx=21Tn!#b$bL#^p>3Df4l5yqMJ;lVhU;@lN3VcHBh(%YRo62GP3+Q9XoKWujy;$ay? zy+<(sMT}?((-y%_udnAM_bvzP!!1;@zMml;mO<2e8}+SCbA-|Jkd|KG5Y*Qd8=v*z zmLXZ+&k+yHAnGmZ?7ky1&LvFa`xWW+Ey91%xSd!ZRy$eWFA--M?hjmcaUBR3 zrZL8t%iG9TrZ~ZI=JFsydjD3Ue+BTdf81@t?Xd%KZ1#nKEhUE^ zc#N=bT*&ZPp*<1#%HZU?INTjrAM0nEX}giP9{b-Q_`)Tuk7d&HU4Z_*9%cf=d|i5U z@AgmWarEwuS8}=hupURjbZhWidK^E49>;676E|n9%P-F;Z&V(8{-E+6(B#O6Do4h; zj7=xBSfANwh`-kRWbGN*P}eAKdEMUCv32{RUaQ*7+;#f`5F#D>B48Bs!AS1U2RS8< zD3mySC~=%o9o>6YG#kno85`<<68M?r!6msnFWcu89JKn#78yGm?elXduJ+qEf4C8} zBsQ#WyurKF>1B?iv1uH)@;T`3%O3Y9H}+jiB~%W)NM+HH)na zp!pG5*Lc&$a(~0iwb3$+SKzI?s{G|z91_s`cxScO8e_e?3C6de{HNuw*LnrT`+cuu zzdtkBlM}T3>g?KKdxD^NfBmJeqD*v8P7LZC@WnFQ?XTbJ_1fs@{7*CUOZLaS;{CCi z?e;fDzGxZBW?pk=?x&f#gZ5-bTJLY%;J#1&tY@E#Z;EZm-W%iwo2u`+16myeYcnqx z2#t<`7_Wi*A|spb54>Q1{?Y(-MfV4-Bb$DI#~sk+cwnEmIv;7V{lQZBX9oK-k>+>I z*?9+4I3B2t6d=Vz3QA_qtdEjg>wBMPc;D2|_&g)yul3`fXT+bcANf2Zvh~g*B4v9b zQ!~D(IjVQG(WcjGz0Lgx$G@nFcON{sHrg?|vC+D9gKEB*b=zz2H}0PW#f)u1V`!y7 zQzNVQ&Ww$XH$)T1W!~aNKJhazYJT64YoVc$z4x4)>`x>4&(ua&-|%T9^TE5k;)Bbd zfmTZY+Tz>$))p5)Kcfs<8lK;y{{EcSKOfX+zt@@?8s6=>d*hkMm;0Meyzlq*G2vg3 zQR@#lc4++5Nc^Sea!fO03&uTbO~d_u@hiz3_gRjQcCt0E^oi%jly@k9_1(>tUFF2H&I0;@teu z&tUyo4Uhx+8T5PE1Mx8wu^i@?e#Si5d2R6l{ftZC#-!MJ-B`iRF?&g`7!yWJMYo`z z!J?51nRZ*V7m=0v85hEb0i6VIJ;oyqkr(Sxrqim0D)J(9Ee3t20;Y~9fIPf-Q+Gx$%~ zyr=L1{R~%um&dzn=w~=Hn%9Kp0GXM2Q`pggGIR6p;tCxmvmlRe!a+a7m2H&w1y&LI z8P05)_cj|Uli56P9?Kpnv&d_}OS$Q1MA1gx4cMyC&tROR{yWw@GK*$VyxPxulgXoO z#b8JBy5l;ZHAXgmK+8S{{ceQZw#v}Y;2fc*pD~%W+jyVcfN|FTIeS(a57+q(_Ipa! zOiRtoW5=MM!NHP#1}n~9f)56@5R3BnFX(5SgsxFP<7Sw7f5!*(GZ<$>Ci}58YzUi& zdtJfh=qvRzim{T?&rkvBXQ*S+&u~^|9%s*ieg=nQkAbUIUDAq_|z)HC(5svP#WN z>SwrylKL5L1(Nz1uHAuo^SGUUU*F~rEiTLZnw#;3`h%^iq<)60YDnG+ZuFPc=aG5a zxGTPr{gJKj=)7E}zTRLE0AYu`i)g-;yBwJ?pMM^I?9O^SpGPqDGbpV9{S4O)>Sr*< zqK)l?drRZ<_(4Cm3x5-<$D}446Q`fSSm7_f91Q4ZTyLuoEqs>g(9dvo zX5l0@4E+pe=N5j%T@Csfu6#k^PBcpW40|{Y{fzp|5B&_6-nH;*ju7-SzR2Q=^mKY1 z(9dw`eGBNroCW<1mw!lMKlT^;87_TTVZidx&v5!2 zBMT>U7@?ox@{cZjlQ#4-I5^bLIFWWDl5wB)XJR3bE9z(PP%{0Dv)KUjGkA=ce#WVE zKtF>DAEuwd-@~Y%F&V2GP(QXAs;Gy6)(!0o=wvo(a=dh73L!V;N-y%aJ z|0{U7gQjJrE8LzGu5tBow@qb2`KEB#*`Ir%9n3g=@VFcs+Bm6mt^(?3+>VuLIvtgn zentX03hi9d#;;EU$9N%s?xcQ(8^LHHf9|G!hV}@w$Q6%8S$$JJlQ8{^J*=ufKB%8T zgH`2maG{^!?0DfsG)(=B@#vlDXE5>=GOOE8KZC!+6h>JU^fP!hV^wFdDD*Sjc8nIT z;R-=N!+x}Ze#Q{?8u}T$Oi(}LS@s(G8E!3x6_&9+=x3a7^^Gn(6{LQK{a6S6jANM} z`Wfzkn_ak;?Lj}o*$WGKmZE-!vzHYvWP8xh7=_OAj9$2m8K9qWvN@oi(S$WXKZ898 ziZ}a(k1z-HGgyV`XDnu$(9duV=w~#b1Ns@x0sV~j96;!2I0y7I4rdPNXE+D+Gk(e( z(9dwKJPrMf3sF6LWn&8c4BG6J+0f6RJwLQV{frH86dsL~Ea+#@;FwS6m_a||mu5ph zgC|8ARu%L!xN&$O$#(h~ufx%d=Njr~aN{-`%dvuf23vLQe-svie#Qu7fqn*E&3&E* zZ12Vn#^1AIQ6A{h)!;h9!{4o(x<)ql!TvC<1JJoRjB5b>44(O*pTRc^sGl*+%pe-= zjC9J=e)ev!R<;~i1~7xgn{A{X>CUPaMJ z7Q|eTr`|8%%P2y{p`u2{S*Ru=F^yQ1>9Odq?ei{tw(>bglRtpBaQJeJA>{&12>b%V zS1$a41;0nO;c%8Cw0<2q{KFb-M|?2?cih%zG2h{qZwqWb5opbOO{s0XhUiQ5@zs34 ztl$~c_YG{m0oD3T`i`v6x4HYF3;dTxYrc8_wGH~-g#8*qF<068k zBK+OCm@o7A!yokQiTx?wgQ_L7)UFR#z{29v> zGe$IIk4o`K=um``Wl+o*QApP$nB(c9V#Wwt7phhKf-chtv2MQvldlpN^F1g3n0nku ztMFKMHbU_m9OzN`+;_5Y|CWJJe53gq(bobtUz08V$b1LW*8_Gp`aU;b5qSB@{q@`oW; zPEP(J#9xQJwk$IVVSln*Cs*$GNPaF^PR>1Wykq59W-3At41#N~)RoJ}6Qf)N*Pfhh z;An;5wc}C1_nlptNq!;MjXxY6l`JD?H5_wTrv1-w#GQa$274_Q|HW+nFxTN~c;7+# z+Xx+*(CHR<_~7bmmU6}T$UW+&o_;C&4`H#!$Ye4JO~Yb*g|!p`pBea8%O~-Hee&|< z|0%x&D{V?1Ly&0@LWe_zd_?9VbUG5oS%{p0;HqOKfyd7aSl!$C)nRpf zmGue)tL|5b+(LuZZ9@c)8(ejKI{OC%ul>VVM^+NGr;kvspn67!58(X(>3a}5yaB^U z_=d*wh%`ZHgwU}oYUs2Nv3>}B5YRsk?p4-5er{&}KF#Hu&o;n3*^NZ7v7L>`Oa!l# zy||TGlXENiU*!+OuvdttqgprPGj#rXLE`}0ly<19)c13nV{8X0Y98^dUbU_;vhk#-23 zxuv`=+~6!6*ymPOz2F-VI&;%_UAaYAI`AgL#6%Xk7qJcw$Aielw}m@0#fIaL zu>OF6a%}&3l#6=HVETD}{;sg?50GOIg4;J5Vc(!(`v#0g2pw6*b-?S&t=et|N7U82^^MfV2UX4i0MQ zrwbn(TzG)l3_1vD(hAKR`-hr1#UbfJ5=Z0?#LYvCC^Qrf&&h#WMM_7ZWjmCox>b=y za4XX4zfJNYl(G0u(Th+Kqy2$G6gd-YP&&k*QXzeej?9V!miiTPl_m?ZjfpwOt5|2J zanYr2a?I7*HR(?mz3BGSGkxs5-5PRhbUz=j)km@~p=M=|Fabw zPv1~KN&_Q(8{!McKdW(3fI|-&7dt&h8u2)U#s$fne@o!;p1!n$fyt@~=J|dl3-=2! zCQjxpM++-8o@i~+u>_z0Vw&;MY7bF34_Mm5!YrUf*xI+1EbwD4GL0o%OD^M2QCBM8fK>D$qaKK z3BA*j7R5zBGt+0P=7ERfI~Qm>A{W1AA-C0r8U69EE0%;l0Qp-4Y-@r6vK`A3jO=vA ziUcFOoUt;&$Zlt>N-**X0_O83Y7wkBBYftDYKcrVj7iTU2}TN>5lt}C)EV&vHxloE zv5^Rdz*`YbFtXYFlL+221m4PMf|2)}pZLJ}mn9g9Vr`LWMS_t`XRJ&x!auPf1(Wt8 z!hf>(-Xx-t^RGxSQsj)42}Vksu`0nxI|P&#WIr;p#6^XLG!}-_zjr*B#Q9ZXHeAbk&rI< z&OLHcc;s>~z$UTWpZDk&VuXCwPa(y$Bsy4e(nL zX3HhqZTG5Zf)TgVoJ?>hK)VDtsqLYRaLNZ5(L{JkK$YAc3{I6~1tc&I+(Pg`?BT#I zte^M{oTYn!0C z1|h>c%`*qbYpu&uqdYV@av6B(!t#W}hT z$+?nv-2dPuMxrJ}!-JpYxNmX4!SyqBfLEk;AB%GLX^gK=mqp4-%G#bL zwy46s$s}H&8m1*PlO^(e;MOapDFGK6$Xf^s3uE15+)d|F-E=sr+m_SrmPbY+z zJC;K=wy?hMtM>w{Y&@~mMG05$cw(Z}JN~=s<+G;mtM_)Rtb%yiqGJeGZv}C(8`AI zj7$Br3**vA+J$jxU?NYvbEqrSgo@a$4hXpV{`lRNqsB5E84Em-hj9|?%S!uO#iMy1 zUV#uQn=pR1C5<6?zQMj5o_0(ZWet2h$KZrV@az)9=?Eep;faP)9UI|h;NG$YbmKdT z1N1k9n771(R0*Rz&~X_Ek9Uk?O@aqL4{o#_9^)~b&d^49gtHCaT`;hX@Op<5s8b8l zxNsn-ZGxo}qV6hEu^uCFHA1M3!uXvC5c(mur6uv$pZ%&UA_^-I^!DV>iq} zn+IYl2QBWBVGbUm?vztuJ;MjSzXkAOSHc}3R*R3d(H%#-XIhQ!W84Y1?;lURjsSt7 zngk>6KscV@%@Wi@9;himZM>0zv89F)-pD}CX-iEULrR19D5kKIjJvZGuXv$03*#Rk zq_kPWwPwk1jkz(noZx`?xSWT0?U@@38iIxHh;6>?PiDE1XYTJrh|EoBdXvu&M}JJ{uW$vcbxv zZZM7ubHE>g#(F#sN9v67f7m+{_^Qfl?eBf|IVUH>2~$FtJrGbC62hQ>qJ}9Vq9UN8 zpdmmYNC+VblOjPJs;v{?#Gt{cwMy$)M^v1xBUEi2szqw6Kvk%=MzQ)m&)UyEIYjKW zx4qx({l2?@zkUAiTJQYscki>uwVL*@iH9NLG_07{Udp)<{FYIx7}tauP@vmHrJp0* z&~&0SaXEB9G<{ut0|VUO%nM(z<3TtlWluf6`@WaJM+o-2-V)C5Fb8u{9z&}Mjg>#@gRvgR-{zX|52DqW1Cz@a9VV_l5P&vo@QD4O+xS(%Q1X%Tp0 zKvo8sGQ|T25;@!?{#Ka4p&x9co!o;UVPW@q==!>;GzRVInKL0MLG^H3@;oCiu?ouAr5g(ONd&oDf@ajJy14Jo|cTkA7W5Q z%7c-n1Hb2TpS{QmPTp`xRVK&9ahb|bnVcmlPe+<=dw7=elICSHtFKHp$#JRhmB~38 zHib^Lg2sm}rLRo3(@(kIBUg~maha!CVP1%e4Op8GoD-s!Ysxsg?nWs5<63g3NqL0g zBpZ~Pa#B+hm{o_xKInF7M zNK!Wwvu?IBQ?fTHlbb%}$%u1GvPmwpKGi&XlQKB~p37AH1Nqi)yU!^mWuAszCiVZb zlOvm|Og6Sj`JMkto*e*qfa-L zjOX(3!2>>8{t0d^Czr@SRcj7DJi;CJ@+84*J53d zHCTc<#y{>4Q}o;(!N_y4gN0$Pw0Ob|5G))8t~^@TU|oiF1=jPia&&@)M@$|YgOi;u z2=fq|x}^5=0^D5joNrLm|9VVGv5PyUa`v<-v!+j<0>h^TRr9LK3(8^8e2SS+pEA2@ zdgX!{<<9iOrqt2kE)y2)lMt5F_c62EteBvHW=2;B{d+h}dBX7>rnIEPlxlc5iOzzn zl)zVtT&6_4Jad=wcf6(K!LLC2A#ic9gnkY3;f(}N1}=!iqVCwSW8rRK6iaQ>22NAF zS~x$D1C-Wd;Dtc$Pud`HEBaCCjx2FgNS0$_P`||s<&=+&lb=QNo7&sBE`=`7b)K>`B8oqN#`i3Wd?NwWz$niZY0OW9uO@=?U87k?=9t^lO4Se zIELm%1wK_)pXDYZn6({!CqExW*#8#ZwP!)wGtv>iK|}%(>E6$m`0}q%{lPZi7_7^D z7b#c6Mam@ZP#-yC=xGTqlHeaDbJCa<9MS5)KME!~{i6)$;3fT|wD3L1m^T?7N4g$| zJiddJ2wbz|;tl7Z$4#zKPGuFY*NeN0H*Y9MpU#%xpvls6vM+)kl{^#xze=f2R4ga_ zH>J32DfCv?(}Rk?BPI^OD15aH9+L$GhES^_Q*8uaXO3N3|t}898nN{oj zW7hEbKeDgi6*)B+w0NNTH281#!tx)xT!FKJ!8Ckd3TGMr63;6&<+TecQJ~LKI8>Nd zH7j91`}k2PEvud0V^w~3K zm(TE>>6H6cH~t@RoWlDU-(bPxlBL;MakG07T%q&o{5$-njPow|_w}37Cg^}MY_=69 zCht5n-DP3)zoQ?O_GlMxxN!XGN2Mnls--2_?B5J0S#X=ueMWP=$w|j4xRr^l^pVm9 zg_HK|1>bUT4$wwTD=}AOJLnsw2Z^^O`E-Wq28&0DBSqd1W&Ek)8Dgb4U*z*Frn^wQ zR9q)+5I2esh);>X5`QD^5I+(5d?dcKXeDh zw}@u@6YZXLULvj*Zxrtp9~a*fcaYe&ABlTNtb0k6AH|~-${At{68a93&6XwN^QAA8 zzP~s~`r(pG#ABsDS@LOOsq|+`t`cjdUnY5l_yg%zNxoV%+m~qPk0swGJ}5pSnr{@e z-+ZHh<{Jh1wkh6xqd;%IQJ^>9D3HxJ3TVDjpf}$rkh5^C=XkXuq3%<1pe4`+}`9=ZFHwyT);$IWr z5Y0CV;>|Y-xSM*^zgO|!h++JGLJ?%R|QZk$#Zm!^L9hkCkjbQ;>cl zWz5q_Vwuv-Rl51&Lg`mXzEHe`ME)zpH6+^0?;P2lpNc=1{vpYaicgWqZ$4DOtxETf z;@=bhDE*%$|5Y>}D#+)cPL`8SVl^9{sJ}gBu#5D)Bo~SUNsRRoia$nr^QD4(cBTmdhWe7)jt6mJ*JRw>Fe-z(rI>0cm`f2;Vq$S+sfkDcPDqWNHf zo+s3d4~zU!1~`4KNSBYek0;z z7fY8Z(xw*k(INp!Lk^^wr2=W1g7P?VqBvEYA@Z#QrmGegi%Z4xL^C6TbeBn9C9V@2 zM7z#Hy6^JE@~F~1A^uW)NqkTIgZPoSN2Fy1w)a%AOf;XB&{s<4n+;62L_A02+YQwJ zP+TouBW@6H7H=2t5FZdXiBF2pid#gx&O<%s3ln@#`kf-p0WWH@dJ>M)O z<6{94TBbt=kjEp`(R z6wPNS;`>RaQ7xu7AEMwW$;XJ}#K1?)WXYu>t$Z*)ZBLMaPnWwTKP)~b(#Rdty(qpe zzA0`O|0sSW?h(HfzZUI!9Ob2BWw|tYN46CY5NU6Tdh=xp20mj3Nq@LFTnv22oFJJd zYMB2t@eHwCoGsRf3&ncTOuiueL&>z}#q!pR8^k-sd&Q^3=fuE=%&U^$65ka+5O;|* zxx#w7iTyJ#|zCNG5$L72JueuUh#49Y4J7j z4e<}+4zW@EN=)Z{2h94gv< z7vw)xvfX!qyhQSUV>>b@(%GMvAORS59g>XKTV_^Bg);xo??MGP#i24 zizCIrN6XogSBQ3h3+0+GVDM_`uM=+&ZxuI+zYrf3Y4?KddrEvoqzxwO-xhx-ejx4= z|1ADhZ0_qNi}#ICPD`=9*jel@9xM(J?LHau9VK~$X!psWKS46>KC%3T;yL2E;-%tB z@mg`cXg-6Hf1~6FMDrO8{qvGv7T*%z75^me7QYht0EF$L4JxvqI9Q||3F=3PM~mac ziQ;52@cB|9xl&vpE)mT)Fv>OGz~CzBuNKWWF!VP{w)qk$Y(q3UvpnEInvvGFvQdPmW_`%SR5*j5RVpVnv3bDiVMUg;&SnP z(e7sx6N3|fo~hTUxj?MY{vY-eX8>$ zo39(_&G#?3UV2(IWBPkUyB`Jl3CY2IsNYDYB{Qb~STtY1kpCu`X3Q8L`1-Z`PLS=s z6F5-ugT>~)Z%&r}G?CWKSl%LWg?OQOskl;HF9tq-ACdgHX!nm$p4~qJ&G!xdtL?rK zWV>$!($pF24elEyC?g#Wo>6Z;d%=;C?S2ttnl@wn>0*^=_luyXfiuScK%^lv%I1?7 zq%AYbcZoD-M)?_$7R@NXEz)`!<=vv)2ZC((fk4_YV|)jZ7R)FgA<|?OG94 zWz<)S=ZNQutHi5CS}0@s+eI2Fqipw&KpG^Y{JQvC67|q58TFrtv_3{TEYbiO<@O?N zkWnraX=RM^2$6=yC{Ge;YmD+-k=Dd0uMlZajPf<2`5K07zJ@_s4rBb|;&UY0P5WWg zzb(>I80Fofo8!w7v8~uaq&+aEKSHEQFv@3(D@fEs!(h~3CE_x|^q9`32aLF!G$M-; ze?P|N_uCTEcNdGqf#P6ss5n|2D~=NE5s|sYsK~A2JvR` zR&k^FfEe7b+bsDh@j3BD@eT2}Vz%z%V0az+Yi}pL^DpojG|2fM?=r~gi1EO!JbP~i z_;2+Yl=|gTn2o{G2P-Z$oMNn877xR@G}sm^({PPp9fOtq2o}DNQHp&vSc13`C{oM2 z2<2_d^2_7C7nH}ZC4)RHV;3qs8D$1b5Xb!?2s3V22iSe(WYZGF&48R*Z^iLAheP|= z59)(@7a<(vLD0$W>o^Gpv;=XrkWTXa0;F*?}rEnd00dt%KMN3EkWFckWd2;Uy6I*4ahu7YnF`}qs2;$y$-)M9aCnM(N zN|aUk#NL-DzO%!b)iEn{RmbpEcY9a%9x=4!5X8Sd@yWgKB6Yavgq^LAg%6*vPS}}w zY_z0BNungSCl(vKGc)VOz3+~Tu5pK;b>pHd@88;bZQ8mvBU`P#wxq>6r}wd2(7v^I z!)woAcs3dguSkQx2xkq3_nxQsp0^gYjzT*(J-+um^vW64X8q>9=WRlp)}o)Ap4@xc ztSR^04NpD~eBq2k8pMP)A2hp9dO43C0KM5xe$@ zWXTTeo5gX9t$i|cVwc#JBX$lO;eFb|OJCFSx<6+gJ7M_Fqlbq+Z4p9wC-2J4SUzHB ziN&Mt#hKTAX(>iqii~w>tK;jsHs&T?XqUd)=~MsN0e9rDYhRML&fWE7D1TM%n)uq# zUaw8=>bCR-sbEAb&<>Jo~jEr%);ie%!{F%(X- zr=xE47f2g&V`0GKi-d3>#N%Zsltv#7-qi@hbI=^B!jW8L^;$y@&q2#fmG%p&wld?a zb}OlhMey~KPv#Ft@U4L3ore11H)t$W9{t3_Z%`@2dDIu>)G*9vZjr%l zE?^i|E1k&D9R4kYV&S)0DqmfMKcO$7ir^b52!BB$*V}_O!JiPD>G8A<{)8A#dmXX# zCxm|p-=ENN$di66+6I3@eE&ARFH*pt5cN*RDEyp`P$tvMpAg-Q#Eb9)e?m7y9fC_3 zK8b@rq2ADj^23hzBQy*CgqYQ9VB8%YKSome6S{?I+*lQ~Eg1Ir)C&HDID9QX!w>xl z<)hc}Hb?@0LJXr0`4jSM49Cw#GvQCj7h`cg`bqDf{Nx(I(ler&t=E>=`5u~YnN<{c(6;k4$dw)qq4ggW9s!&ZeqA%;2X z@3Z8w=@iYM(A$hY-a2OfgofZ80RDv7Q7<2#!Dn2DP#>hWF2kRYhXTx>&|;Qu<9$YJ zhFSWTY*}g4Z)iCF8rxl#ZqG{dV{tYN{)9MK@+ZWCGcLmqSJeRbCJ^9HXa<@_e?m_{ zjJISb7q(*9y1`~I3M#_p8HKW2-i)@=pAa9~$)Aui$e)lJCVxV{6pLTZc0HJGyDa<( z9m}d7l9==-WDj)nTgESB;!T>x?c#4ze9}fK1b;$zQhd7eTWB8r34Ow%p6wjrL!12W z@zXiD&znyk`V-=_U-%OmWwA+rLViU_e?oo-lKzDJHV=*0v8Y#D(FaBd{)G5A4E}^B zo0#+`9{# z!=I2JUzB$XM+p9ee1AU!^B!h>@F(QQ56+t(h75l~_TU8mg!p0!{R#PplH$BGDZ`(T zpMGTCvCI#DLVo<{ytd2_e?r~)Kq7x^UM+_a{)GJW09W=ufB%%YZ+j;g;f0 z5sW`~1%D%bgVZS-$wW2|iFoLXgts9<4y-NXzYhhbB&90Yo*Y)cJWkuDM95zRg&qAl z3vFk{;bRmkm=nl2s6WhMgg+s^-_ULjYBYaB_ajA~9ZTR(hywQUyqDP<_!II+Fr4>u z_8fq7puDf|iX-;725kn(wO;erbBzm<0lI|P41OdNtgp;Opu_!Hva1pNu^ zVyod#$nVAIyrbDP_!HuvI`+Oip5)V?(38-^e^*`^)5D*Tzr$7JUBmj|Pso?6^A2Qs z_!IKw#d&;zfc}JLqJHxyRL2IvpU^^6z@JcOmH>Z3Y=M`*!OgpmMZljBi!gseKVY5k zC*&*OPpCZ=@F(Oe;7^FJfzY3juYf-xzBfaELcRk2g!p0y{R#QCya<0nx1e~o%ElD_ zgebF7Cc~c)d>DMH*Uw794q(}Vy%AtQS2#}3I2q}qZarRqDp>)c-+DSYYj~#%pJXx%bhRS z7lxXi&bu<$!tn@LS@0)xGwsbr`u&8cB5aAAM{UpHm=w?#4n_V8>>JKQ7_Mh&gj)~n7rrU|& zYgqHYL0jEXE#5%78xf=>p8Qv+D{0BRe2iCt9 zdu(Uwwn2UuYj>ENaon-3?uTwK{&4JK~EnYzIA*k-fY7T@>Y(o`4h4{Ux;6UiaJgVB^j#_K1 z=0Iq?W#j|g(@oXiamQOmezQ=6wa0F>y*utQ9e4-(9CNeTnTrwg1FQ!<&Q42-_na}F z|+qZny#O{UHE(>{lE&m_}I>GYV2 zw7*TJ9qqPdd*4C2x3L~*?UnMcQ1BB8=U`51zLbjXkHx(&qYa)I_T+2BGf>hrti2e~ z`^V5MgT!{@jF;JNMIdayw;|*{n8AmnmUT4}t;A}%eulv9%ysbLxRB%xaC!K7Dtjd} z@R83Gh~JF0=VT^9;4KP#NW=%dpJ469v*Q9fRZ*jVWd#k!ulsn`b3x5f1j1N*F~X`( zK;qX5Xf*5Jj(}&sA0y;Go!tVr{j3d#AQ9aoSsNxGa3Te^p#p)KSpDh`eh7X47@5Nk z{}$a>vL~^K51>5Jx(Fp` z7;QYVP>}2JmowP?b#`7$+>PZnu|kF;PjOJlDF~c|HDw$UmVE;Xb$^#V6R5ivhsu)x)dDLjX6+@&7BSo2?#}Fkps;Qn zhy>kP1~+Fh0!LC{%_kwiPZWA>Y3fGb{s?cxz#WYQMf9Lks`j;Suf_#6OJq zS$=$I0aBe9T8!WEp*p;Zan=1>^8 zu&mMvUFW4U8h>Q`SLpv1@_3)X)y><`dA(7&@9O50v;j{-}{O*=lN0o&5jxzGCzcrUd9+xKa}@6#d+kj@$G zy3cqxIAWz!9*EufH-l6rf+R2BEE{AT-xM12celc^qAw|t%#2p zQ4E^-;5PgVNcA$f{y5!~JPw{(XR7EB4dY3qFIj%#3uSMP`*MqBVC zV!Q=UBv|x*-1PAM_2lB0ej;%iR@f9}(OhAWnkcg11mZBPFxxzuCW_+L`gznM19-@x)lHmWqL(56zta$lf}3H!FPt!9v-*rVdPCuox@) zLVQO{TO*3*s7cnx@IH$Nlj*)fpujUfqzscZ^Nc26S;EmWCGh zx2fmCwmy$F!?_;EWq+Z(9V_a%sGflsQb(QBR)?po4)f%O-!WMv0~-Q?0bV&qol{qb zk(gmzn)@jk_;X4m!(RrG4200GASc5bqKoP|Ed1~%wS|=bh&AerTOB@eb(mp(n{zKOZo}>j)935T++016(HmulduB?Zl%LWQOO-Gpo zPcc1bakzm2&O+!3-Z+JRaRUPzeBrDH25$9*r40;7Se6u!ox0onL}xWH;LqK~OB)#A zZ37g%tbqZp$Pomg51F18e<3VwV8EZ<$PvtL5 zpF=N8NU^7lI{fZ9VeA6tV}Y{>uAI!R6Czn|%F&+XV)Ncw|2zV}!iv@syo^O_!wn4h zTk}+cn*?U(34i=+{Bhn6h3C|SlRJSG%Aw-wyHr|+*|zWCK?9dc`wpJ3YZ|->!I1;r z6GH#-e=3@53rB);Sx4qu>w~ejhWTmO6^x%P-SEpjhHjNsj*fP+n*Njjs~8I{Q$c^z zjU%$rD%5{%Jp(*k;IEumj5Tly!tip7nm}BL)%>9_z@ti#t~FY&&Rtut>VR%o*$;TI zt8WO@_#eRp;K7ekbk)&xQ0mvfgAzx_bJD*_W?_af|H1L(8F}b}#Qv2|whg`Vih2h8 ziE&~u8_*k03hrtVxZHqW5e98PLY2Y(MDHNMGzk2Pa0nogHrRcbGw2f9 z%b9Keq#Rn#-_(Bs%DndwbxvL#K4o>7;XcR^{2vt~%;pF240BTiaxlE9WugdMFe<7W znJ_f`{jN5Aj5uua<@F5k7DUuJX?1ww>M)<2vr>y>;O0Q!aNdVC>P)u(cZMGdB00c2 z1A#-zMq3$wuf@E-hfEkP-|tGu&M&{K%?BeX{UwseV-1>oGQw;rSUIfrTWOHb7S9f$1Ffpb zfih$VQ;rv$)dfl%gwe=8SW_G_;3g&%G_{q|8{DgaVodXtqoJ7DJmuF=MEC6-?|XW- zC-DrcOUl`me->uvS4Vx`^T5vseeNXB!aAj-OP+-#Q}M5iCpTFRPTi8)pli_(=M}dW zoD1;#rluuCE!UL(g-ywmiEk&TmTSrwgf z8GmO^2KhXXrEzcg*4TN}a!ncPh$&*0+`n`P3W~T)%9xaXrz(@3aNR7V;(;tBWvVhc z%C4J0Djq}9v43OKzFO8aYE6+TJx*07EA(%grXIS3Mtd#`XG}^{QkBUv+)y!6@i5SQ zoWjYNlsOi$q^U=~pvs8LLKu@$Ws~wd4-B190CpNI$$4X!hNi*~_n7rqe~gv;N3if; zjB_=ZmBHK(;+w}!MayPj4Hix-u7AbKsS+#5tUN3R3&Zs3 zITS08pT$^tgbWs*K?G+JJV>T4yhIO{O*mY7P6R3b*Kx;xm*b9_n)1rBy7JO_)pe!w z`yB#{pqMx`6FRr7uA;Dl`_c5dwXmcCV zr*hu(IesXa1X`p(M(DB8&C0HyMAhJyIv&g0T)>=o((&DQbfN9~X$g43IM$qZ;3u8# zHYj*4U3%|;4g7w&xsi-0Oxj1%I!7|{Bb~iPW6U%@Vqt1OFOj>5zBCYCG`Veb4AQs% zE=LxvhI&KlXo~;A`dDF;CyV!ep9(PV4^I}?ot1!-0MGk49W>by+;?hzEg{JD*4Tz ztfp+n?oapI_LidoOgPyF5qqu#{IQWwIT=S8pzFDx%N|_;9{kI12fTteFo4Lzd?c z*{jJR`+3ulJr;PwxIl&Z1Mrbm;d!gG3!{GPGri4deU?{HhzjV4VI15mui2 zf}Sx73j6jpcMm8bU#W8}TWad8XilVKpGa1}f@6Cp{bMvsMwb|o>}cCaX0J$g_ef?Z z%<=w_Y}Xxw8I72tNM;wPy0$T0G-qfevt_Cr$?Ox!?grlvsoHi4I)k7ajA-9nc)aoG z-2!tOQ{oe6rk4R{80O&O(88f!eCV%{%&Q7KTwwas!^KpNP}0Li9HRmyyS&(qB%*VW z#dmO#)-T0#McYVQ*JkKKc&>;<2bw%761RgvUmOZ>!0=8>U4PrMad1b9}L{8;jCZ#}(htC&srA(fe2?FRh$5)69|kM#a$>yt_W2 zKP{4%*VI(ab4uqBoDEU&^L+jKZC!-zdho5KTyZ{i&0&8N?sH)l37 z%&MF>t*o+i_T1_PHRYw%bu~`uxBOmIPncd)RyVyO@Jrz=NY?)^^L)|d@&cCEXH}s| zw6*?U=Ki9zd~SKotn#YqOPr&RKPfSy-=KuK%}UTCR==YDha?Wh-)1=+9`sC19yb2C zzVw_mq+nW2S=IE4L{0g^*|oFhRVDfl8g$5zA*Uw_=1#9(aK!X^HFf2S3+4`lTvxGR z?lf>F^fRj$4lJmxE|`H&mY}JeS5{X5M_or$l-10DqO4|m#Stif;h^$@xxHsrCkkfG zSX5Rsv!H*X;DiB*f|*tG3To?WW=}`1%GqVLv#Vx7Idef3T!750Du53QvKG1-Wp!n# z^33Xj>GP`UYRab99Ra@|jyb--wmWnn=Rx2AWB#E70`WiZ_M)_ulfnxApWy*Rdp6u! z{3E_F{&g-ed_(Qc_IzxV>6mp@3#x-7PU*t(8cwz3J|1kU*|jrj>zwKn`yJv`PpFwb z%zlSEr4>3RaHsvY6AU|a*jD;G?l5q)7|v6?3A4|_5dy~$xcEtNi(xsjvC+i+JHtrM z1e;?27hGWAos#ldr3=uY@uMdA2aSCWpwlYnj9`1KX3v{e>nuXsF^c&0kD)Va=ap8J zRn4d@cdAEXOiSs=VGa(F3+s3cN|rPo`zs=w4t}%B>#)a_bHJSuhfO)D7Mp6yne(d3 zs_KgRO_?>jZpw(`CLA-N^bns@Mot(vWn9g?GqJ2c=)a`KTJG+md{A|&HYYy7ymL( z7yd-9Uc!qDw4t(WRxO+l;d)~F;xg=9<>lxi4x2MdtI8K^aM4;$W5i*YvHNiVORMIV zRiYBI`^~MR+|Bk*cc$0^{ZPE$GKJ&N` z#nCox3E9Sf!b=&Kws_IppCh!5#FyB}T#;iO!X3~aBqmZH={X&k?l5tfI9fbTsDaEw1qoGmUE?-idE z-xGI>--y|`-@VGC#?net~#_c$IjI_zUrA@pbVJ;$OrFCOpf_6?=$g*An_s zlFgnaEc}R9Pv`|I`L=XBjU^A@5J4ri_Z^OPirw>94L+wSBf`?W{(j0%nl)Fb_T%- z8Gd=w#9Gn(Vj#X=ve^rSe68f`#hb<3#fQWf#W%%IMe~P&ZT$^p(8I9{Uz|H}66Lp( z+)3;zeILn1;vv!(OCBj6BmG3llf=`duaI0R&X<0v^#g7ulDBVetPZiIQ-uz-9-(2bWoeAqRzZlS;E4|qZgnp&utHhhdTgCguhsEc` zmqmX4!T!A`nqLgapGp3LNTf5r7YMIX{MF(*606wO*FfJsP|B%GrNG0M@TmR7D&(UMp)l;>1T=6Vx7n@ zMK~_!iWic|cQuJ})=TDhBTRRv_zUSDmHdRrk42d8Rq;3C2a4Y%ntuzF*C^TiTR=Ad z7GMs(l3+OR+q)+ob=wc)$3t_>}mZ$nQf~|2rhgF+Ucd`LO`MQaYYsvc7aNE}Gv8r0Yf*<(R(; zq%(gNp!ur+&0hsLR{6$>{4j+1%1M+nN1P|tlgM|Tc!_w0xJJBA+(@FFyGfM$g!Ipd z=C1j>9VFtvkp6FC6eqfDM}}zrDj?@c?nENr!6eEF>E7q^P9i+0|Qc5RdVq4+29Q}J`L zHP5S&o^R}soyD$VFR@Ux4``8YsN@kMKfGoBapFX=TC5Y#7VE_yh(8kTx&Y-|Et!T5 zSndttz2XDnX7MSJuV^v-$Kqc_d-D`}kLUAXnwTTD6T6B%!~(IOI9TKZZkhUn{N`?-L&qpBG;i13wBO zUeBPM3^7}z`3LKV*j4Nyn!iEh8zlK?(XOwc=Lgx$ANWt0C3%imBQ6w|i7Uj5#Y@Gj z#5E$nm1g-Li~ORQa^N??MVN9#Y$fK3oy3IL++V^F>5mY{h{ua3iKmLwM7#b&c&_C6 z;#uM{@dx6M#4E*XMOrOk`|WxW+$cHloA99IN5p5u=f%Kp!fzx8eiOD!4*Vv3BDqnd zSq~dGUKb*qF18eNL>ggWd{>d?r6?DQgT%wd;bP!_;bh6DiD!ycqFukDyuc5`3h6Ht zFBMmc{7#kk0&Df-g(|y7;Ep z++V{N(*I4Qc>(sflh{)%5C@8ZpN3+|BgJFI6GWOOV0krS;J3l<4?usR^gk3=isnxf z@i$1mMcgRfDLyFL{RE`{rR0~yZDQcJfhG{xo^Ql7oNG}wKb&A2$$4UPe+;Iv6wYXNiRSf(z+$;G3k)|4${|)g&@lRr-_>~yb{RlHJ zgnaEJcM=a4`-qdoDPpBqEiMty5ib@m6|WZ8iZ_Wr5$_T27dMN6zlE11Zx!DX-xafP zZp{9-6cb|LH^J_wAl~k$fI}5;_fsH`mONIp`zg@d{Sk@hjz-bcl!#b1hB#MeagBZ~ANN&ZZ16u%KY-akM(TGk*tiFSVk@*$G>!8GHG z#lUaEbjh^2!T7}@t!z-fRBY}afz~n@Z}&eyTEw6n_(ib$9+2(62S|e#jQ>*X!utS_ zyNM&k(ISmsFup>x`xZD>(F6wdD@0nlpnQ#ZJ&ANQdO`hN;uGRCB5hnSew#=$7nJ`Z zMs@w3A+{n>F0ENGU3Za2D<}^U?fwJgQzX-L1>-A4yYB$m?mK`qQo;CjqTO$RZ1)>L z^Op$*_Z7@h%SRnQjX;*^rCE_XKWRVsm7+)>g{Q=0A zN~RqN#@{Fgegy3P0Q7br0Nkqh?cyKB&&9oBh}XsF7wtl@++2|+ASm||X$6AvNYSqM zA)hK4fB#kvL`w%4aXM+l;opd9Xl#C6n~=V{c(B+<94rnMi^Y-RXmPAKNt_~16=#Um zVx72HTq<59ULsy0+H)%OdxPYg#aqRV;sfF)akKc8xJ7(Td_(-LxJ`Ut+%0}4Hi}<~ ze89-Dz&#nIwevH5lMROx4k6=J2hSX?Rw z*R?rpKlY(^K|lTpJMhgOnEsEq2Hz25g5k1fwZJ}ht|{Zv*_N*OWjb7v+A>fKz&I`k zVU1z^kJ1$(P4jwr{TwV|1-NhGG{-5HJaMSM9os@?8m_Ew9M+%>2s&4wtQT7BLS>BBZ2YC>5*7bIr%^Wx_LEQC_Q_K6)B!4@xJp3&r%lkRP z%)|M>WpaPmc*lQ5urQA6gJO{G^&$JW1^-%{`#wYaxY^h~ zyuy%d->V2?vsVMQT#52h=YG&%62p~To@aZAPf71>wA4tDQipxvJyZ ztZU*|rC$l_X1jlQZgkJ`k?zo&obcfXm+Wo#qmsK~(bdi_w@qYE%W&GBma(+e9oNOK z4DWKggjdFPxw+BZUPc5Kvz?LAwUZmehYxQI9~E8~U3Kf8mRU}3XLs?rv1^Bw;9KMT z6B}DD9oN{h@|nG92xnD}Ys^~u?A~bpxW;g$bM=XhvC0!0!%Ocf8HZ5Ie$VVp&v&lB zbU0JfMbPiI!h&~x+V!^}{Lmh!MK&y=qs)?@B7J!B$&KN&-67BJjpToB>5hZ#c*o6H zm$|mX_3oG6r*6sC;*63GBfNDZ8pFN4)uDA08p9n!tJBwA+~M54UjCLAC6J4Ej&Q>3 zI$X_mZ(kl;H>?D0uAI==vd{9p(OD<#JUXlOuB_+@JGU=7de@&8-M{OP_5DlQJ$C-i z4{Amr4f`~qG3$Gz%|hB3(#F0=+8EM?kv9CDX<7f0E$CODmIJOI=n^LPG!;mj=$?s3zzr|#MsS?3-e z+Y^pO_Jkvm)%Bm{-jTJg<63Xm3NLGQi*=JKve$Wgz8PA&bA6;>OV*mqk`@Cxb|~KI zhPw2A;?q#*%Ez31Hy`%tKy0&+)BETxbGo>_N4|+xc~18UJHoRj>>(zEw7a)vt@Cz8+GJt2MOt>+?PXf%8T7gSvz~YOy*}>)_9kQM`CG5~Aiiel2b_DHJMrtMmb~}JtaUw0S`NTA9XlK= zwilQM#=saD2E$|BAwj!#Y`yz~!6hqT`<)b3GBU}j+k)w93Gy$zP)$Y6s3n=?EqU%&vDE+7y+I_w`iE#(Obh(_rJBhj!Sp|FOsSr_!gPA<+feUh9EqP%2xT%oZM;WsN}mfkz7ulvmb7aD7;cU8=|J?hh`pRe8}D%za=XW@ z9^X`o-qG>bNJ<;;mqLf(EHc-edh$ zV>td9YKZmE^cxV1uQJg$e-G2%<56&|e@8#oY`n(?WVW(`Xyg4BL}#qQ51+nR-|&aT zJK)`8gJP^UPB+=HA?ZQ?8qu!UVG_gfZ4?ie2m|x%!BB}=@k7~`BP6zrKS1$Fi8*op zxyFu?*e=fJF|lHao#O47c$mb5)0%&2F*i0QMoUC--V}}m`ODq- zMT|b)ItDou{{!U{CDX?H1?VzAinlJq#`|2;Xx!_-SnBgXyCH7<`U@ z#Ht>W=-YUYJ=|)U)!Z_EA`@>?-gfbyQhd@zi8kKPrucMcyE6_O?=!h+p6&b*T1y-6 zt#INLdp_P8ppEw`R`f!;xgXB=ZM?@`Rz<#z_t-1yfN$eHwng<0jUUXSUTrnNiYkuZ z#qoHp)d&-P8}G5-sHl#*3{86R7J$HlK@Bj0U39En1(@!o-nw`VOu zBG{ac*RV(LXLApxjrVt0(H}I~XycvRnpt!0hqEP@&r5Tu$9CaysRg6j@@d4u;n>tr zjH8n`hvmY?yFXW)JldI#!N&V7)`f81m5hgtcVCX><*~!C@$So6c{I8cgN=7Tf6Kh( zs5Ax}@9*LaE(9CzPqCq}@$SbL<&CEd8}FZ4{J=aqYmdRkyB|L|?^DXK@gB`!{-JrV zuzuKh_YWn-dAw+j!N$9veq`S7SU+sM`|+dm9$Sd!QV(9Aa%+{GLenLM!FJxi-hTqB**;{8cxuZ zq*Mjl^HWR2e4MsTiIAUm4jqtzZawP_A-BpjrRd4HwGK;_OJ=_pcT`@ z#=F16RpgCidf0gPP-hBmZyuZs7u<`CIVB;PC>`n|e-hBmZ zyce(?u<`EK@*-@!Uy9<{DjQSSc&E%pnG756l=-N}WZHO-tqG;Afg&%Cm>6ulQ{b2% zfGrb)jrX6L3>)t}s#CD6u<_1~!yQR-huyJdA@5x%I`XI!gN=7?+>XCv8)4&}wfgmc z9Atux_b8IU#yeG=Tpk8&c4LBl2~8x-9bLBH*+*!)BaLqXK7(`cFo@Ow*m&nvTMRbd zdE|qQ_gh#oY`l*)5jNici~?{zb`4tBr3-!{?jUI3OCZXZVGno$>FX0)&`bE^!jGGn zjRH~b-=Km4|NNOq1sm@zP#!J1-;Ojb=w3T*Jz7b#?oUD!2~!mb{~W*Vb3(myG7rS9 z2mT8?p@N*81`?xtJIV|d=CroQK=4{%|5kkiIo5UV0w+|I(~4!`?=kNs*3d5}=YGrH z(n;GzMgN@0i%8IdHFR^YN0;2;JU4`S2lfJsyA`L?`4b#>M1monwU%J*UXQ-IBU?R# z+{+*@r0xXdaYwaci#9>No4SRl#w{^jD-;~T+Wm4wxJR3AKIC%ha4zY%qg%6ieBov@ z)*kGlJEkSe3!|9#sbe?YV@>xibic;h<4Kk`)^t4Dw!wN}^)sb-fF1Cl$eIK$I;9=!E|>+{yElzCbEW!rt6W(E}mrJ z*ATabc_OB3%dOc6`7`S17{EQ*TGa`2y#v-Bd|Agm#dQ547hye^FPKij*!hdQIX)1I zo`1y8XhfG_b$T(4e*=rZ{AY2Wj!y~FO+%Wg$#nNxS^VWza(@{=KS;L}Y0gTf+h*zb z%U7q|m*N|PbbNGsCDZk0y7b|>P0&NSE+=*qp%*@z5X03%x*1g~JR z6S^>*&Y?!0R&I~%Hkn>_$Ly1$t=#dhy{qxRHj;gN&Sq-&-@`_7sx@D>s9T|XR90Yg z`k*WtATEwxGdzn%hH(zmWG-6vj=Rg4u$hpSu7~U*r|M`cIcaLTnXP0?hutD+_V}de zq|8(IXDd0GVqe3^z4xQX{A_Og80T918aL)lwL6wHj)nsgPiOG&a87sfEzEA%BmU3= zJhCx@lMN%AL$k(82Z;!G}^XQMaL<0ouLuE$_mHCdF|C@(e zBc_~;EpQoDlr;JQ@KJ@y=dr><j zOD7XpVSuu(fq{d4VQ~WkMZU1Kfq^5jV#^TzfY(+xG!6JE>`m&@3&J$4uw6>{og7Cn z6Y3t@l$mB}ZL!0*g_;jqA7~H7n&m9~28-9f`yv<{rN&N`ojO=$rH0b+SYt3x>1!yl z+I@3!w8vtoS~@GoMe|i8Mzvc5r#}Zjf}I9~9E?BqtYG-z?V@SyAv6s8(%uA+kh*tcb9m@Ofk8)Cr-`u2WNDlG$>)mJ1)nb+*gB~&?62s?Rq=GQeaa5GlV znZLM!froryX#)d~`a)#`Z_vGu6+I+AG(CFAz}LQ>^Rn2Vn*>)BTHU|^9}GjNYhd77 zUs&A00MFbIv$TPMzhcFqgy1XEmi=o4Xdny?C$g}5&eCuL1O8EH3I~&Ry^xjIjn%UL z6#-3cG|?7+n3{TXGJEqUthSFc5Vkg)Y^hUz`XJ1igd-+ViPhgiSqyS3;pnodKG#y8(|XrS;h zW1SNTUVC65+=gHblLEEM)K~8h*pPb^nSY*tA z4raRbDT|pxJckuq#kHf&%f6oA!G<|t1U5MC(3C5WKU`_bl^f|xtY`}H6;^9Xupgjq z?hb>oqFcmaHrVs)8yMgKLXV!>g0nuz{^&8-H0hOfs z;b0T;|D9Wpe`7%$!(16hvLU(7%JucpmBrES=Qz=oBcnaK(lDnTPIw^yj_BYRpV|@> zXbW5IFTq%GtMIR{7%PVs<-)8Gg9OV8ISZEt1CVNtm*dXE09%S91qY1D5e({Jil8s- zSCE9^VBr`BX)xC7ZQxms2|=ouZCm}{76;n&RPD$>>tD?9>yN;&Z&M5}Ue@n7hL)g`({TELuOS85Z~7DAKmr4L2qnJ_XI?HXwbqhlZp61E6JFi?mk;QKqR$~&AytYHVGsg_|+S1@(A8$p>EXL({Z!K~oZ4;54LfAcPSs2Ojs%eu9 z7Rhq+aw3^5-&-;XcG0{{q(Cic(b*}?9n!D&7~g7I)b(l;Y`bqmt=f$o81>?lP}m4s zM?_I+is+6o1Nb_HxIVjP}S);Sb5Z2LK9T-K z5tuyejAZP5m#Fu2T44mEj%4vg~*c^Q$2Np#7_idJQ z^Zs&fvYdVYe$Gw%%endcb zMmwN6_tkSt?9)RS&%^v2n%d%6)SCcxy7zE>A`&|q@fnyU>D~`q3`ZoYx>$7IrdswN z?C19*Q8)(HYF)Q#!Q6>u)v!btSUmckmi1E2!zE2KnKi0^%1U1KDB2+UyQcE?V;7GG z_C_qIp>3&}@>-Zo-JfYZ*z}sW07=a78~R%Z)2p*#&@0vE9&IDd^z9@K92^veNAdr# z0X*M6Rlh^cOjyY=V@EX&FwFnWUhI^@5L|6J8eIPWtp&X4m9wi$&FbAezGOyAVBgmw zo{U(*-Xg4VEt*~{6I>YDx(OAtXVShE{OZw=SM?#aPNlC4UTB+L1&fST)61<=7>#5Z zC`o0&s8^HGM%fzURGCq>1QT=itWsM1Guw`-w!eJqY(-A>`0|;~^m+J!2`>C)+V)>G z9X1=y<{8Y&&8ww(vDz84XUwjGJ-52DYO{&9U+Z^G(~f&q^#tFL}aFS-v<`e%%)w;ZyB+p%{+haVh_K|lHLByV{-rfzhTo3gPPdq0JmQ&c4d{-6=nOi zW%qqdk2al{$>`kz&Eo${w(s!FrnJK0ZzZ?EzmFZfV3+0Lfk#a4PF2>t1yu`b%V(HH zJD94gs;w@cK6~bDXfRo6*KT&zOc-QsW(Kc%1oq6C__O;TXb$gN_V9Rh8!Wt{`VM<| z72cV?IlO;ITX=k5yJ=~>zkrX#-qfP#k05bn-reYbR(5oyujBKX>xWmxn(oC zbu+nDGdTzL?|AX=U+K~op4qx<+Izd#r7Dolo^Hf=8x~i~c+AHV$^ULUbsN-hGqTJgu?J>nMecjCulH(W}xzP{p- z;&I{>agKPFc(Hh`_!IGd@oDij@qO_#F&Fz6>&+MYi^IfmV!e2YxK6xF{80Q{%*7O9 zx!pyxrvQ1lCgBF9))`iP-hYGI5?*FJ3P4 zZ3CuzNVMgT%( zY)65(M7&shO57@bA|8%I9P^D4CyRldx>=IX5|@h?ikFD1#T&(Y#ove@h@XpXaT}WT z9wZ(n4kxkgOT;lG+G=*?z%t1*N#r-Xa?mf3{w(Rut{n6iOMjX4W>*gS>!iO?db2AB z{aw=EC%xH~gWkTA2A`MS?8-rYQ|aH8-oBTH-oBRx|1ACAl+MM0oBhG}A;ugrU!Tqh$50phnnIfO8Fn)!2v3RL?rO1byOlL2^ zfj3FsByJX;6<-iv6W#Gt3-aqz0XJ4HTwWja3XAnkktd`)tg|Lc(X*pO@? zwh=pseEPw7I%pz$iT%Yx#o=O!I9}xAN9LO*&J^d0^ToyDQt^E8B5|d7m3X~)qj(qxk$W3q=z`_uMszhH;Z;Yhxj`r-zPpKnjK=qKP#E9 zYO}o8#CJrqQw)7`yI6lw{1+nga^>e0WLymFWARH0>br3K_m<;27+@gT9cSR#%Q z`Cc>gRf~(orQ&(w55&vFRpMIldXeu$vpl=500Vnfk4w*Yq8V@38Q?a_f!(S`$zO>P zobxb!x@gxQkQ0*mo;2eR75P#$<+0*4ai++ZoEg7dY;K2&FD^4aus?-q^-tMX`Gfwq zb65^;;{@kp&Oc&r0}fQ`3RCYW7Q(ks;f(TW3ugJZ3l%P#HVvMIQtfZxo?@z420t3J z%4<_q-_}&}T>_N|ry)+^^m%jVmg6ROO06?%%H|>w92*su)xovUv;}o2_8(aOyKHRq zK^w72?EV&;I}qzw{I>=R{$^|$j$ft=mgPwEsm`~l3*wGM7*ob6#>ypD0EeO2CwZR? z)5y-tF_rBl#~=?xrxrKVcrPbdg1D(r1YyQ?z{Giu6=(_Kra(@u_fB+VDio}j^|2r1 zJgh+;1fA`j9VfwnmLP5p@ zJ%WXCTyGbHbZ_+9zwL|%ln$_EV(+GHO+_$Y?nOAYeUs3>me8?%y!RTk?`ecFm8t<- zu0(m*bjc;?FPSnuoac}(0cBh0c`ugbv3%BHL)vcHRAc@C+xgBBf7^K`TVXiweHZj@#b>qu*mA{UC(5(az`%gWgs`pnt&ev$KO z3n#x3J!_0YA8n?OLLY`c+)N*aJ_LPeAAPLfC8N-$ED!ZOzcqU8pc3{bdrN5W$dW;g zp^imggpO*pH?+sw_1*yQ(-xjP)LZ`NtzlTLi0%nRv-X6t!mwH~`HswW?P0ZIcv^hj z}9S_+qF5Z?QSm`-;%lZ{x6)OHp|^3)3)6IMW|@Pa<{P4WA}d% zE?T|3g;}SlF4^!w=aQO|hi&@}_#kub;U#WKr;41ZQz|A-rG<$YEMLSzf7$xV2OnXF z@%O2)%XbE|X5oh?%q@exL^}j*ON@ic3rF~D7bYe+abaR&3r{lLSQ{Wr2Q1-1?ItlM z6#0nK9mo?N(teJq(tgiWXCfRvuH7=K!f-SSiD&NN6WXsdRT{4c!uK=xtadk36^rl# zi!fi|56^Djlll1`XC%>vw`RhxBQnxGr<7sd%Z~JEQ^WA5_=yzdT)^YC}bNAcT)m7gLldU_F ziGOL=q?JM)0G+@TI=I0TqHsJv=#oJ>?MA%c6vc01+AZz*FeAAr?gygZ&w@6aakn3A z!)>GwbDo92f^fgkFtj?-7AE1cJjPK5xhTTrTA~|SjB19<&Euj)p$NYshRgF!eKI3A zz;U>|y%B|rBHTY?lsF<6#Vbfoe-i&DK_zX&ytxc6x`qdbK496reL8$V*l%Au`WvdE z8~H1$86Ku$C~_VvI$Xuf$jxlffhy)ihO%lSRLqZXqYfXWVnM`X-jOO6Mt;G(qg0Gp ztzxha+2KP&17H{76XxN=(ivy3zfaGVVT!^<@fDMgkcJ5t#le^a;YljvVov%W(TuUM zmL`LX;(e61$`1c5w2I!PzmIRlIKAfs!&O1k1#aXf)_Z37Qb`R(Sh4V|j_fSuqM+k+ zUNT|O5_M8ic9 zeohNATomEwwE>2UBD_V*9UeK4u3pNOucJjHBY6~G&Se3CBEv-y{ttCEHgYZp{dLV- z8R2)5@SoE=0s=)7BX}&&3cuM(u4sUZVjabIGOw4^X~M1%elLqFm|PSGv7q;LvXP5| zW6i9spS_6dW_5INXlkXn>WxWJ>2k&K#08)ZDdb@i$a%6^iy^QxG03k8BauC z$#ig07&#Q>i=7~MG;(G%oA%(MF!^($pQF$)xG1vt!wX@DDVRYbnMcYXiO9-f zka*GAbN9eqzTFFPPS6xns{HXRLXz>vX`3`c{_#-A?$22$iy7O;I26EZA-ZFx-2-1? za8YbUV+zhjiJ4(=Q9KWesO%-+qM(2^9_6L6Ft{j854uraA`OF!LT3a@WWzm|?hAPR zJ}V3^igx%`5Iq{IFt{iv&{a=%F1RR+9E_5oAPg=F`KZQEV(E&Z7mmDCk1CDAuz~a8VcqxF|YN0WJ!o02jqLb|APYi~?K~ zye=LF7ll!Pi-LSqVQ^8HQl0@9#r<&4T1lURi-IyMB{H}uD6jWra#4iAMe!sQ(SAq? zgNuR!`}_>{8Mr9^Br>=txT{kTSKy-H;BX&&j35bXmCK&Ic}vd)VXPqG%EkTon08$N3nqR(3oeRrG9pAG6ZIMe#7abQ%l0m zn;m{S9UTY{POL^sl~bh$;S-mn$^oAf`A3 z0}=Q(FaOVy9mEt5u}0tJd0{xuW(i$vzM8=v!K&h64Ah8+P5xsNQydgyjHk902wlmn zVvo$_TjZ8PUQFE`D8n9=%NpGR`5Nl@vyVMmbl*b$f;yh>+G9jF1%(}q(Df4f8{3N2 zyB0D}5Q^DEyCR4FwnBc4IyTcjSaj#XHGjP-evAIbi|%g7S0V^8#UY~Fj9T$TMTjX5 zX-#h{;g}yILQHX}jK@T@owu$Ov!Ct5q#`FkuBL7q8&)a0yCCzYgW`wr&#r983g3l! z!Pi0?nB5QAapN)!8s8m z-oOf6mcb0XWb{{N_&xjD=(<41wPkhZ7IAkX$L&Jjc_op<=st$LU2-%b$Amb?s9$ZKxO*djU3M#{=W4x@`h=KUa6j|R;3OA!gk|MiI34G~h__Ph!y z1(`TaLg={~LOCL(6wZclFd}^8U$0joSiQ&L|JBTlfd7rXzoUz3&`yWZu?T&b(3dX- z;|&=kyVugMMI>PH{|yLsV}yk0Qu;4pL>7E0{Tf7mM}ei^gUDS7T6zd7etq_=>*(Sm z?>xHb3hnbSdX~AO5I#WU9fUr#>RSd)4n~mg`_mTCM~3wTeQft0q7Sy9I}C~t`Y=IS zFbUEG$yUOm16YTSJob!iQtTWgl0RRH<%|AKLFn@#^RrmqT5$~m4$tL#4f>^HrUo8y z+S?9auU7gsCTU=^lPSU{s8!%mCzETT47cK2fybRN1!U$TFCT_=5m@6C+Eh9mQR85( zabWUXsd>s-s`F-AC!1f;o%dkfzqYQ7s&cMz2;~$;ia-V$2uIL%z;98>kh3){%rPIh zq(AK5PRpW)flCH~A>*C2EZSLRczLK85xJ<;o3kR^n95@ni>cn32GL#Gctx|41+!CKEmJz$uc5yrQ7x)dDLfgwhqbb zhd$5DYi1uwwI`QI77N5jMmN}FrsUa9R;vG8fc*z>%wYGRqQ+{i^d!{KH zM3MB>CSi%HvrbVh`zL0VJ4a(b@19{F8DzgCIaQi7ru6izvOJ|>=`{dxtltEQN-F(I zA9})~qm9~^e9sWeFO_R0CPPxH%rH8+%9H>`#q!h)hvbZ` zpp=2V1R}f5-Dgy7Md$n+1U%m2qqaYn`(;nX-IWG}$nTN-Di(Fn`pjI2PwL?oPT^i6R_c*i1kGQ#DeuL}q* z%+*FuU?+exClE&s^e6@D>Ky6oV1puxrHo^QU1T=;490J;FOH(*{2}26}?uXtcT!(<(wq?<8f#Bg=CJ0s-HG9BB zu7g4Zrhs6D(QXK62%!f8C~B6+86m+0^aO4S%mIQGe}5ps3ik;Hl5_Y=0o}}HFarUb zAi*pH@WY@Pa`5W{4w*@eus26jVND^h8?j7X;$ovFm;t)z*5!=cjDQXOR$)@1@Bjkx z6P`lAW_auJktm$i5&<6MaJ66u9~&^l;V-#V+LBe!uSW=46IZ*FR=bSfATrogj$G~D zia3YOPiOqa6q)f?5n5R%lOU^Won=^527^UqEA*^m8q$PTh4ti8ODOzxms%rak^}Wm z9PBvLTcz(drI9MS#A&e97%l!mqg61tM2wbLEsW{{M$sis18y1ZttBmsOB&IDYj1x> z>bgr}_S-U1UPsSisYnmvUqFwb8y zBz-i(bY;tWnA!I4nM}!|u0}E3qOcHsr8z|NfN6`AXZq z8c}|R2d&*l;;U%la1$vh!(%5d!UQd|U;6g8O()z*Q_WM9lYGm7&C^VCHZ|2(df|ZF z-M|ks)TD$p@y&eMw{`dDAS2+2172uBh9DiV44%dMvhTpMr)x?xnl+m8BP~Tqx;J`E zNARoRoB6Wu)s?bZI4DFa^5RHt?_Br(;rISVDELw1AN-hM@Yk=e=bp^a1A(Vc{=t>U zFcN`F(?7WLGE76@NtJ)hK%Aitf$PLSIF%W$Lg0M&4~~nBjdq4VHmT|CD0aEux$G$a zkYUlh>`dAmkKlKvZ%0h+pQo_7Io3Xu{-5NlGQ0rzKc=?6rr#lkgz7&{^z?s)#R~V; z?T5u`_QHnw4OJl10#g-s!taq6Kfq_@ zWd@zx;fI#QO3rk$N~U>joa#BGuJVG1CJ3uQ3$*x9Ap?S2P)U)xYB(5>9J~?7ZtVs7 zgB{CR!dP*h>v)}RR-{SFg&67Q<#zHqgAU0sVnv|q+=2^BXu7;$xuL`g&Oz-;^SmfZ z=>vYNtP-zJiI-X8Mf*uX*=+iMT{`KT(23b(nKHd}5*ek^AsgOM!`{}IZS=G@q}klsr^1^j2t|jO0d-;~mZO+B+REl5O(6 zK!J=K#%ArQ9Iis=R@_4;W86Ovo!LH^u$<^yu0Iv?+Bub;QCxa+zN>s>GCXRA%1Vk) z;h++FD^C@M)=c@XLe90zhnG0_gT;yzR%X^_J6~JFy>Jh-p){ol#i>o`=2z@{O(x(O}J8P&;epf@bVh z|0*-qNo50tr|8G>VWW z3RQ{PztK9$=~OllW^<~+s<^PKIn|ajLjB(*+`_p1CkeL90Em)1Ysr~GD!&$1 zE-!)Ldw7UH=K*nZ3h(kGwpMIQ#E$^QL>O^QnLbo;lp-%~Qh&H2FGo?Hp}0t~LGcX5 zvlTBqU8tX>c#`4@#ak5bQxskZ*uSlE0j>Zre|JURkV{$k z9)Pn|7G4L)XQ;eN@fpQGD+-?i>_WI~KtEB%Zi)jHc_%8@rQ*$s!Y6?I@`x7jZPl;D zRS%YTkz!o&7R3h@-%ymd6~dnHu4BG*tWn~BmS^ja>gQ3#R}?=`{8}-DyCzv)Tg6_A z!xZJYcBKDI#iv#O zs>-h`zNPx@Du1f@x$3`FnR_nlkw!$htyJdynbfyeeK(bRDfUyn&!;s)^@l4?Qk{U@s5 zt$N|lg5HJ=%MTI}a6_KR!lMO!JJlDfzNcb|>V;1Wb_c3{wCWF6nKyaT|4~GYL6xST zp!!9M4XR(J@|lX~5|QsBO<$+_s}y+yDC>Qz${Q8$AtK)+M1<#5|DqyaaYy|-D)YsA ztmnr>HaS0K2D^y;ocp(vfey!=( zsQ!Azn^k|O%J(WhMnt}6H2pQzzoGcP;zx>~5>fuwD(_Pa0eyb?wm+&9v`5rK$*hZ00-BRCO zQO-9Zm#aKTkxz)w?r6m-#o3Ar6#1(j?UpE>rucKka}?!#6?PY^%v+6^PtIF`x2b%G z;#S4?6n7|orudcOUPXuJnedaQ*jllzVob5CVsAy^n?=4MDi2p2r+A2>oFBuE_a(8M zpDE5%K$KUe%(F~aj+1UXk1`)K62Ku2`?QSkdQm<1^;8KVMOvY=(S=%2z7#@gLefq3H9s zy`-`{cZ~EmRpzrkwBMoFlGlwd8D_f8^K)RjVwR%t?LyDzpqVb;1Ax6%9-ufx@gT)9 zio(YW`y*B6vr6>i^SxcDvd{M>e7#7&O7(n@hxR_-+ifcQd~Xk`?DM@nrSfx%|Dh<~ zKj7y*l|NM6rRej$eXBCdWC$xp6x%5Jd~cmqE>ZXNUa0tc#TymxQuO)Uo>ci+MLwp-`h2PQH$|J@`=D>h z+tyn3Z52B!7Aux24p8JHfAmwSI7RVjMLzz=^ivhrD#jHzDQ;GLUr~6VkuM$RYRsRd z*iW&);#9?Hil-=^uE<9XnSX;KA2X!4+io{LZ)v}GC}j@`Wn%K|toaUXjlNQhq>@kNi=7Ns&+eQQoe&i->Z* zQhBeUe4m7#&jivwUy+ahQ5HUCU^!*j4Oaay#nGyl?~SlKQuTZmkoo0%Ban{+Qa(db zz9+)p1uDz;MWkO&8G1e}Nc$TVvE7K?KhK6J>G*gO#4-^?vjkh7hsRXkRk2iYfZ`Cv z;fmuGD;53o^QkJ&P^?y*r?^0|NwMYm`byQWQoKa*a>aFu*C}pLyj5|d;$4dODL$e2 zjN%r>mla=Ad_(a=#g7$tDt@83NAa(UmY)B*iaCnBO`GGyJK%`E)Fhw@dh*_FeX zIsCK{5b+UUjWlYj55B;bV$bF8Bp7zN7nJon0>RINsC7{uIE4JlrlieCi6d%V-3HG$ zW3Bs#?_)X?spU>T$g-NS7qeWJ$952F5&S%eTE};_tQaGD_-Q9XPWAWlp?p@#_(O9N z{?0_)&x5G7jQ&y-esmeqQvJOLf4tk2^~*%?>vsv_ejY@v^~Jcx#g5a%Pg?~!)n8+! zX&?PzSta~kg*fw+BJfzy8|7l(^be*n+^Fc={k8nZ@hdj4&BBa)DDeC9< zUn`{f?R^w+40|0wj=SJ5b*}pDC1T1Yj*np%gA&u>@A4~V4#aOtiCoFP7YS_VzKh_vVi~`Gt!rjtE`Y$ zjH_Q8@1ytIL)9~rCE<^j$gj(26k?llJ6P9=Z|Ara92)n>kF4xgw}@FMJv+rh5TNyA7*Yj1{{!MDkko6 zPn){OJ<&ekG1z|nLbT%YipbimHKD!E=iT=PcDEbju0{QOyQ`hGXw!+#>cX{mw1eiv z!qp&w|8hlL##*b#aq~xhe&89m?p^W4+>V=fb#n1@($|lF?#-IAr%UXdeF1yI_AO20 zw~q>4vm+F`4)ROU&^{;k%Vwcv! zE_3bK`<%HGw!hk7a*Wx2uyf`>~+7G z_F(B4Z|%k%Tcw=$>e$1du1H_YzD2(-n6f9Q&x(D)xl64!Z6|DhXUV}k-dl3#jt`cX zSFn_A^<$8ZeurJ=Kd{S$T?lree_$7aoeMj6zjiFs+Ih|j^mCt_{_DrtsOJqYU<9wg z_=Pxr`CHrrrdLeEIKWRo)_s}vQuN}sV|IMdaQlvTmY=o#-Nm!E*u%4CeEdRi?Xi2@ z40~ASE;lm>Cd*rH&R*MLjkV6%ai){KI%Dlid)!UAYn@%+jmTJAwSB#}Zsuze{N7mpMbRyOe=Od%X%~Ko*s^i&N}YcXe2{a+mWmU$<*b`n zVb;;g4<_vVZa}B*fA}DKZO@9F{uuGh(Fhn(U?wmG3;|uBn@J{3Q}2&n`0cj8>>0jk z;kLuD0h>M4wI9YtlzA?8Kwg-*TsJ5mz^7S>^dylcS>PRBa&dbX;Dd|gj^9E8k>(z3 z)P9NHdp`;qY{L zJO9J{TiSmLQ}SkB z10A~dXlSz;cgDgNyqWB>oagY5yqQI4X@s{gfH#wIl%c$trbIV#2C50(Oe2OO;ME{+ zrV%qEO>hj}Oe6ZdnLWi3c{9oKmHr3(I{+$a8_NDIT#z^OIhMTz|G=AR99WUo^fy#R zH}W@B6TF#z;kI{ww@r&=NeC z1cBhqJONcBZzf+c66wZ9F3y$Lji4Z*`&{A|gyG?=%i)h4oE~rd$OCZ{|mI^>_z) znFDw;d4dVv%w7QUX1;@lfj4uUhzZ_IQ&568(=;H#n`z1&9^rL6@Mg;8K=5X^q4;vH zTn$X}W*S#xBda;+uj|UIjPPD0@MZ=9x#UYTuQ>5 z$u}92H@TXo@LS{&;2}$@t^6O&TG8DHO8%a~8^C#`bY23OLc1v8kU6 zU*yf??@a}~I4``JcfukndpCG9DPS{+KE~F7H`DZ>8-1DW2XCg%2$aZ%doJA<4256e z&E(C9QNGQDyqOf}Y6LqMyqQK0Mvr07fj6@nwZoFP(iv$5W39H~%{&TIDOyNZ;LYTx zA6>0tR`6z;ade~np_ROuG$wB*iAu?v$&U&0W(HU^cr&k-{Ntmi(%*h~GarGTyqSEF zEO|4{f}0oR4PxZYG;)$R)5uNHU$8vzX7a@#+|d)fnTtgM-pnXHfH#vh5Z=u7h>$mv zE`&F;j%9*3(CXzH}e2mfH%`9z?*qJEx?;;N_hsnnb*KQ zYbAXO-b~7@l*r)CqBkJ_B#2Tx2f-aRxU<3gQa9nH(H0 zB$W+s=2uX(=dMHEOb%}QS?nwDX0lXMeh@1~GJ!YqER+J?OsWcPZUZvAF~M3P?zvp( z%BRUTLPLsN!>XCiIXD@j_yWJBoECvMlRF=HGkdUL@Mg{s5xkk%Xd%wW_$yGyCHUvr zgIOi;X7a|hPUB#=JXVP=^?5TdWCp9lDNvC&a~Z6_n@NsivSdC2!|c1EOZyY29jG!% zpXRw#dG2HQ-!>Llm7lRN1HFqBD{ygs{+&ehF22@Tfz|n~UV|B_G8b?rUgFD!D)ZO* zx%7p#5^ayZ4_um`$15X&qMWGQA#hoKt2ZS*Kl%>cUGCc#bZ#oO0$2EAp_SH??$_jd zyyLEm&EL!IQT!;v6ToaQ4tq6jGARP7=ICO^4uz@$p)0SCf*6wpH9-8#smdgvNQdG^7ro=4JakY7e9W@p%kF+Sn@!JCTW+BzA6xB@B6vSSJRI{=*y^$lBFQF1r&BJA|Hbdm^ zipB6{*+)o4f+&mcfGYk19_!b>op=OP$V&57Ahqllf5w;~jC z2tbWV9p3|VH9|KKZBCX_qtJ#Cx-9_(rf60`T1?ISMNqZjKtGP~5LFmGd#YINg}57` zJ4&$ZBSlxt+f(f$+cHZj<`(%RyK{orM@f43O^hFHY^!NIP2z{ZZVW>4@uHI=mqD(l z?lZRX7-{*lka-7WaXI}QE4p_fzm3r23d{|jw41}eGxr8u;OqG)wBI55YlNP6LExQ> zLlAmyfUpb^{#4Y9nR>qn4Sxu_4Waj25HfHD^*ah5LpTS*&k=fm1K|!tc+XvLHwQoZ zBk~SHAJQ_Cd&HLiD-a88c00{tJw_tw8`yk}VD)VUiJ!8l3PRv7ZsZ&q@vf;HL^2Vq z5_;QG!&_Jq)Nl87cR>8Jw5{2Vpq`9&oehWZ(&O`JfR7%xAQ< z=*u{Gn~dHny9>1soaJ`3>A>N@ls8#{v)wS)lr`ukBs+tUd?V}CU%o93a{JN|T9a!R zXXRx$S?#lq4CdOC?Ho+b;VkpR9!cvflSqPPqo9s{vN+1+t!S+(vVX2 zP9df2lgOk*m)_CBLfJQ=7gkHvwxF3;NBj{D=U#EnT#$nSso)JqNr zK6|z4I%)&8)hZ5Z=}^`W_649%Y{@Ny{FTHl*ek$axlt7_u&1P?v<_Cxzrc{dnu=kv%2N^!Qz|?Mwq(B~o`4|4kc=!sfG+|oNSl_2 z8M2F9f5^!E=G!0}50vEKTAv))WQ|HBiTA>P4rairbBQYvK;3vBTf}%f41jGNOJH!U zQ5tWcgiaCORg%4q0wttEUW(<$$2dKq+^RF6f7fITopP1QuB zwo=qo%|O_XBdS^3T&uBV8B{a02m5TWNK-$zCl!+L6H71H1?z$azxw+|p*Rh=YTNG5 zQ-ei6Oy(Kp-!06aJN}UP^T)QP`_spss-@Pw45aYoV+FvSU7 zjlM3p>=mz5{oFqC9Dg(d7&Qqi5p*~+8P~-*(jQuwK`RGb z%Rvt_5J1*OU@mZwrDUF(%zQKw<&ezA0~WPP9DBn)ioP*3!5_CY>omhb$|mvx8oHS< z0s$RlC%QRd$j-*^fvgLm6@qY(`fCH6f?O6G5Ik^gf^?M8jR>}NJmDS$$698~D&bWe z=n33lnFFMw{$5McQSP}6Bpu~|zKVdd39lhY+5Un-*<3f{5zr38p$KTl@;D>xFX*+a z?Q*=vrld1|CPFJ*7XkMu z7?r_8THIL(M>$OcsL%e=vY_VzNG+Rk><8>kjparfSeSz|btOX3LdA|*Ej`BbBA&l( z2J)PZaU%N${jy3riG9NazmI$e$Rh`?0;C*%F`NlJ_4oh*>xRHhMOaP;6tb})_(ckV z?b8%Ci^GBxzd*Y3OTafYJyHwe?!`gJ86>Mt?}+-I5#66F7~xC(vMBvF*z&b^0 z#HujvAK4mV$!iecmxb~?1<~a6PLu|%pVzf^!t);KjAm2JOb|{AY$5&}K-3@JR2E3z z8IUt+jbxfe;H>u7o;X35CHr`q-xD-RcJMUcU#6@oJsBM9Ya^*zo}&7P40sbty-q4H zg}~P7)|sCycuKOcoS?p5@96A@b(shza+R-EsVu=Jlrxj?& zHIE={&r|srk$>=N8VM?c)={fnY{b4ECp*xdz2B5I(B8b?l!u|^Y0US%@!D8Eg1`Iw z02{%*8J%Ql$4j0O`rd7VkgA|$Mp-V7A$P2T2zb3N&U8|Hr5%++7iaW>gm*xxUi71>KJGpTgAZjcv8%>+k4?)XHa_P zdFeq1B$L6zybesr?&K#hkq1aP^V+n|Cw1er7^o?of|6M5OsCBp`26E?DxSux3UX>msVzgS?V$oJQo!k9i{~~X&&C&5LX86GC$V(024(8GGb1H zkenKF%R1ZZ7IY%hQ0ye1`E&k$m_IXyx6W^ESU+Q4NldvvBSnTF5-;IHgCd>1v`%o; z*#pa`p#TN*W6aAfL1%=VUxs4fdCYabTtb@1&Ozsl5E>ChhvtKXR9HR1SlZFqy$t-8 zPKMnE17S03FXuZ8ZoJ?ivGamuc_1ML0cp4l%5tw2^5%Oz;i9yp1a0p}Cem!LSDDwd zm)EPS*D>f^hhgzr!y@9mLSKEI8=>jbd79TQ=saiH&3usf)Av!-(g)hs+yw`?tMi8@ z+v`R4);`YjX(ix@O}O=(bQ>kRHrQ3k=GqHY>s{uBOTf7rVBMZbdqV04KN-#=!pYjl zc_1w|4GPeH-q~auVpK2f#C)$yFvsgq>UHVkm6v)E%=DNSQ9rk*v5nwN&GU--qHW^u z$tKQ>()>K+%q5#`m%d(kzZN-f-e1n=Bxk?BpYw+O<$UqSlw~G z8w{&qr!{6-M$pN@h#uFX_G~og5IXOoG|WJ0w7A*UG>z1&o#_W7;&FXpd2Gj&3OSd` zBr0nS=kF~8IqIBgWFNiC9*&veWN~iPgUQs%fp@2_1Zka-7jrS#y+9T_r(oz}ZUAjC zhWT?KPK13EwgEcIY|gXF)gJEXwJGI7$DH-RqUtHFYEn@uyMizSi-jF*hh~FgwIrn- zL2h3ydS^IxmH?E_hiNgd81oBDC+K{-4E4s^@q$wEuCjz;!_hY(=Ua40MvoX`R||tH zc0=+GgQPg-Txo;d)(fW4!1ha4Z2wVImrakAI9rw-8gOv(>C>>*)YsS6Pg_XZKc(_) zs;#S81dh5zRW(iX8>?p4&jlUmlG%;53ul4Sd1fQ{>*`5G+Ax3aBG96eIC#emGfG3upPh!FEZpenHJ5 zEw64|eZA00^VhzrIbgt~n>mY6ui3S=C(cJv|0*GC6+E20sL`6UpmrvF3hg6)d2B}Z zx~Qh9agN32j-KC$GJh-=>p#P;n&|!JM5@w3Q)iMi@c%NWYE{*k%44m%2^jv_3pis2 z^{;BIm5I}gC9|Pswk2t1Bu}ZHc?yPd(QN*!{@xjpRmG8&saM}vyJU8QKiz5@8mG*g zKZo-{d%bR8gS9|)FoZegtG^l+VtD+iI(yzsOjVgiQaEN!)tr-A1I%a^;%CA-!s;ru zek@^c%4uBP{|T83IngYFbXf3JrAv{oz-BGICKbgvlrAhU};n}RL=(y`}{_$ zac12Z%ym=&vQ;&A=E8+DWf>!82tOCpE}9!deo&U0l|E}GUCaSF`-1uS5x%izVck)9 z$7I#QlNYdij;urmpl%%vi|1qQE}1R;zibfNU$dyDelEse_*Shd)8SUbyxRIkZDRdw(`q*OhiF)<_QU?n;r%BF zS%pejMr2XV5)8}YM$8v<;mjssT3#?{z)VBHJZr&;vTW12?d0>o|ju#LA_o!F##cK2^<8%(pS=4w+T@Chb>0g~OSV#EyF}rJ3?VLI6^F_jh zee$A{8)~X$qi?=zB+0M&nT3zNI=GlKAGYY_nG0$#Gw0NDS>l7Q9P6>6YIYMSo5x_W z&SB{_HCP|~{Lrn(&&EYrQ*)v$O?*6}9t&qKfJ>CY3Rwq_88bB2gt;6*u?tU*)~-Q>J^KWi!4+-xDu9nIQStw^>A=GD)n$k^pJAkL6{VY{<2!gIW1&9 z4Vpam$JNR^IdP3fer|8Z)td65kV4q%YjI%-mtIg^)`%Qlxr%&7mhumAw)WTbp^677 z9{VbJ#t$2;% z9~B=}d`0nn#V-{-On8>lTCrGhpyD{iBNc^12=>Am#PU^tsp9Vyg&PRzPpT|8PD4Hg zTLa5GNAWU6;o5;m7^Y>LeQ1NiZpD8X>JYDeu#VZwWQoLXBImNdW zdA~5rv2lMev6W(x;sC{QiWe#VM)3{Bj}+6e<B7+p{e7x`T=l}y3jG$<|5^2KDZZ!r&r}wUR@m=Ry@QRI<)-;gq4r}~>!zD@C7BIeaYM2zhVs((fCO~rQ+-G zl|NDRa4N_2JjHUwQHq%9(jI&a3St=uB3ZCNQGW14eT!A@saU263JUaI(W#d8!dQM_D{ztpndf2X)X@m9tA6(3T3PVq&>9g3eR@@6vn+pFmCdM*7HRy{}9;wKi6PWKX#R-bj6nPsf)8{KLROAn$)bj^X;u(s3c8&5n#j6zM zybpT*Fv|2lD&DQQNs)I4F#R>fHx%Dfl=DNR3wJ-T3(wbpy%b9n<$MwP5i0+)oTl?N z-$KQfoTg`~{uheBR=h&-8pZ1s<@^)%*{JfpigG>*{o^V>t@yIyYl&lSH`4X6t7d~oQN z{C)#{L@`&<=OXQ(a#zJ3ie-xOt_!S1Jrw18AMA#x zJWwUn=qmR{C$R zSftopu|%<4@j%5Hn9CmnzElU+DP^G}G@P5&zu`RFs{ z^@@DNnettVe3Y5;i;8??nexYqd_0+Q&_{ls!MyOlw?UM2oR$e<`xV6S3Ho;Yoq>K@ ze$R`kzN=yn#XgEd6o)I0R2-`~Ua?YfqM}@vM|sm!o~}4gae-o;Vx!^;#g&TZDxRdLrBQ=p%eBl;2(e&A2=%uaqhG%H}z&*&Q%@H-g{fYxDi=Y4e z?Fd6JznZaLyf5F+gQ)cuCdCN9vMFgbDRJ6$z@%x1_2nPFkC{-UmTRFRPhdY`xh#+E zAad^dc@VV*qoZPs=;5bvuBZBY0*i&sr9XVkCj6a)xSt16>uC79juAclw4Xyx_4gY5 zF(dtDBKY;Y!l?1z9N)no&zJqf_xEckn)$<%OKczgVQD4&U4uCDlp^q0*AL$-Tli!8 ztq7@hhYa37k1en5_;oTh zzbvA^25373b}=a1AkN<>>5u+dX38|OreXf|fX+XBf6S9=w-fby-8TaIcHprcJRp`l z{vnU;z(IpRaf{<0^VqJOAq9G74fnu)7`6I-v~$8)r``HZ=E&f=2hY3poBXX?_Jppw z5RA5gqDOaS2huP0cI5`zUKze5wCdJx+Kh}`nt55q#a3Ty=g-b4tqAV2z+>BB1%~Y_ z2v)eOSA>4qF>O~UGkwRVKyarM_ErxAZ|$bcv>lt$>{Y>w$Ak6t`U-DN`8R=syo=p6 z?mqX6E_(t8-Mr(y0nR?>b9cwPBkZ;A#pF$Gea57U(G^x#t2k}di+ikFL-UF%N-Cb- zw`tJSd56ynm50hU?|XF6Wupr#23Fi#@yQE+`6w70{|BdH*q*?N<$D6{?O~7YJ7e6} zFO*bdtX)4ceeD|~yNwBco{e|jhps4sjk7wiw*Q_$@4)Jd+ZU{DbsKcO3sz_C@|^a! zS-msCH2e69+xPx_*Kc;^dJpaDWZyXQkKG;GZgx-bTZJ~Fe4?rJirVo{!KMp-x z89+Hty%1bCqN45(f#F`oAoR?DZvy>t_c^-)JKiow%>wp;T~_RV;qF~_c*r+_!_syI z(lU1iGM9hR`ky z7}=7!#vXCoH&*Ge6=_>;`zBC&+6ud*@WI=@aZB%AkuChJkL@9!Tdq!eR25g&J zQBiTxwvH8(D;|-#@;CCYmSq=r-B;9HeHa3^P4uftL>zSOOe4mUv z5xavsxS*P!jdfy_)e7+6*@wTp{;P7RsN?!OPlUi zJq}v1fmtrEW`dWMS>0=yc1!z?h?AG~724RL6QRv!+%1MJcv;z>Id9+}d0D5R)sgS; z54^05qYUL`H6^+cUUvj9s}VznkFq@9h?$W~;26BDM)Y}Ej}b@YW&H%n>2Kp7uYyb4 zP&Thbl9%;c=pt|6A9z`f11r*#{)VdPMlvW4Q!x~&LtDVh>KA@B8+4$GIg!Dv=?E3` zBk!S!;AJ(&1(6*rXrzjTk>$)gO2t?TFKZ>rh_uJ3f|r$X_ByX^f|r$|0~Wu?kxV{9 z8U{HKxsCE9mC4KcEb2WS*3x9~vc7}TgqQU?dYAq_z7^y2zLzzt3Yv<#k^5NhnPJiv zfU+b7)kq0m)@ryQFDswo1~01-6TGaCNy!ObR(~uWVw)b3 zULr5+YKo6`kSn6#W#tug@Ujj>ZNbqP`IxnSDsrrdJtB|5C3sm+7BRugY6?p5vYG}Y zcv(%k!y^t((!k4ln&cfBSw_z<=l)W}F}b)0-U|Omu5mRsauo;tbzOOtk$X55|C~Mu zKwj3)OntMJT!jZO>qd(2WIiOR(<0mgz{|=NOkUO-SkU`A*~rVv3NdSI`N!GP`g#7N z9^=A$X|kErrXO+|URL%_f|u1a$cnzf&Hyj#C(;Brx`E|_m(|FjC@;Q}m(|Fb(JwjG zz{_g#=R{vZq2y)lmd=XiNBII{^0J!r(r6xK@UoIjk-V%=u{`jyn)D%tc@n&=M@ahc zD1SsGFRR%~Mn;dPfAF#z`?1kc%nx2xlRiEg;ZTE@b*kjAjGoMH1TU+xpBUwj2IOUB z=a83`KZ=l-)fW3{LT5-`RxTysWnIkzz{|=tBD}1pQUP98UM>_~)}3?-URGZBcF4=h zm%NdewO%ZQmz7Jw3=;c4WspQ<<+%jx7ix-vYH-r zqkm-k!ON;M0wuEHo=f)yN5QY~vX*0EM7KaiURDa&E`)lLysSnJMt{Yg123z5Y!`u- zm66df)@mDGR?>Gy`9f^+vhvf6uJ~d#^0Jz7bfe4JAn>x%n7phLSZnaI%8#YsWqp^m z1~02=#rWu}^tT^g*3Y3QFYEEN2QRBxaPy)b?ZL}xL9$<(?HnzZ*(WsHJ*!B1vmM3`F3Wd?AJn6lFyp zW`&;3ZzVqsfVA~xx_i#I&li%`=Y6q_mDU|?4{XWzI-|HQ_J!;oC28fU1P}Y>T%V+s zu}Y{a5W0Q?&-R#H7PJ!bV(QkRHul(D*8OY9pHRn}T0zoET_q|v5~1twkpPlb>Ua;v zRn(nFe+Rev97(*dVk<&1I|C%GwCf5tES_ zO#THtb*r0Y*_ExSdJQVR5mQN8*_&6RC-_5cF??AdX=OzohRmBki+RTYNLs1u$^k(r zejWMk3GJxM#^mOYkUmLk2t`ywo`_J)AplA1K9tcD^PV?db`z3TmO2B{WNNA{dvY6U zo`m!uHA34;4S)X1L+Fl&c0k)omD05`dJMuO1pcT=x>o9n4`C-A*_QE(5H4UkrwZs= zCH*&yA1!ry5NWp{6hDK8g0_|Q+=cq{CdT5&MAwG8Ag*q?2*nl5dra;&6vrDD+fv83 zf7-{2ZZKrtu-LN+27_@4tN3Ad)O8umz_-RPWCq?Mp*r4exDLVUxeEVyjo;+BPux9= zl&2ATNDia3dR_<1)d|aIqxAg_ta!(v@ojWpL;e!M>bVL3c%Pc_y+v~HKEtjECWq1S z9z(wS-Rk)o{(YUu@si}=Tl(fDav0rm$b4&`)pIBR;hLr?<5kJQdj~fpav0sCka_Q* z)iZ=yeq18QcFEBeW%ABHQ!At6Ti5#_SiLr44YorrbJ(}%_R0ZS?N(^{CiLqOdcOqW zGekb3@Hm7rl+Yca4>R@s1e#@#_~!Axdm;P)iuMlVCFe!Rkjt-eZJ25fK9W+>T;UkHiybfUB98 z!|?_t%71?AwO2+?qN_)d!VPBwLhrjEJb}n#6mEp@7exMyP__?()$0WOzlWKv8T@}% z@9XH|bZB?OXeUA+CiFcInoNXr1TCH4kpdR~Z$hxoihSmm-Wf)0xRgE&kpn2O^oa;Z zAehq2`yzS*+Ud!aOgq!|2B5^=hd^C}FdL!waQs_}(1g$@hCb_i6k^vRT#W#7BQ}9f zGGvRiBeu7IPS}R~5$;ClGm`n(hHVJ%BcPL6_#)(Ugi4b6q~O0oy%#|W&ci@tBlMZ! z7knV3VF)-pmmfs^AI6pu*Z~UO&!KbZbpZC8z{jra7z2cY_Y+t4?15xK4}9v%=08X% zcz3!P+*k%jv91HV+$=g7d;80iLeAE-Fz4IQCH-Odc3Kua z3|%q^WT)?>Wzo(Wv|vHK<-D8by$CxiosPH)340G=v z@d+mhgx%)U!awl|XCw)L|NqY?Od4L{7{i8o zq{e*=&v4%qp5Y{OaC4sFBzv&WGmO16Q9yG>;WGNec9ux?v#?hETk-%?IiNYQ@IWP7 z_NjxL6AKS+PAohm)nQCXkq?N16gneiJ`7Ezf5xttn&ptZ7|u0gs&vWMI(vKk;-~yvN_no^e{haP9mI& z01DrYAiNF4Dex*Y_`?X7B7k0R<8nqy;WS~$dcB^iNESN@w*Fyrt1?Fn0Jns{A_$uy zBLSGe?R8Q<1)i#a1Cd}_jx^Z$M@lQq7X;W=AaOSWoNido$X*0E1*Md4cn7!p`h zF-%r@3e@IEsclSQbr?WT8sH?a9SCdD3f%-Avle(qQS|H*(`N;Brb52B&zc2Vrm^&g35G ziN9NzKfqw197%d=*mG<#QT!oxtR>0ug^(Ov2+5KCyQTPJuBC9?-;+`%6LupwR=r`y zHRC?nANOScaRksJIk;L7EQkO7plRG!u0_C9Bita-$%K0lq#Q<`GkU^{5*Y z+mIkfmPDkn^89vzbwaog0X(swZbrmZep0gXlUe!K#iTwEXN21x_C{8Gl~l97Db5J5 zS)db6jWe>z2utIP@Cgy5EQ>S3%NWQ`V56aLiZk-5=%*6)h`uopXT+7pO(mowfb=$y z7%exkV6lyGS;>KuQauI$MB|q<{BayEwb+4aqfyuoVG2k1b8)$R-Ra@R4Z{_Yy(~j&-sf_ty<7x)Qo`5j<=Z zAQNWvR|u#e;SvPQ5nHy%bw*F%4#^xK6ZSVta#3>AWFSYSziLp%R;ackU@{QQiUIjC z>Me(S5+DI5@d&2djwEDBreg@L5FG0iJ7qIICfS=uGBb}LN?~U@_*68VYCg0%A5%Ga zDQ^^e5KtbuT7LE2Br?c=K|c8y;_UaJWzrdcFGXhjLxfi71n{MU1HkYB5B|Dmd^hw% zWf&G)LJ;h)sx%mj;xROaiz>B7{vt~l!HXO=o;vZQXD)^eHs?zL44`Qyn9q{q5t9QK zuu_fzh_fd-BK-WGhJckp;NlYM-tt1ff=JnfYO#8n;@1i(es9y2UqU$1$*BeX70E8V zyK)x87|&e-R>Lx476Lwbaeh-?xIdri>O9pWcd;01h0j#Kf+-)bsWpO;9GppKBA}Bv zbxx4XQ3(a8jv#-o|d&VQbm_I4YnGi#Xo4o zoq_v)drZj|MvVcZ=pr8s+#X@nvbdxX4Y;xF&q!UTe)MtSe2jo`VF&UE$jahsO4$~3 zQny`R#AAv?OpEVSBA4?vW9jOyJ6(x>;5^FXr+@Vaa)aRC1yp<(qSl_t$w= z^K~Bo6lq-NDK*9{$^T6=7nN{Xk#=Z4Zy!K661ZKM z^TM3uWSW|sOo_fu=4KXduSdk&j;apKw0{nQ292@T`-q zgSv@08e$k{G|QFuVC%Q0GRAAs1?T>J8+ll6~>*$`y`thuYXyWB^_OeN~rTurJe_qL|c9Z<2 zabhn7bWF?2$n(G`PMU{*$sY#N&Ivv0H*k5nZ5&{n@B-BeZ8Idc_3(+6SG8$O(&ZW zQq5D8iIo?y-$7H}la?ivUN~U$oPYr}sbfuiGhc>E4tIYJG6Ie`SY#ZGrvsMpX^O1* zQN<55C1vxq#dJ3kQj~l-3Oz11UZh&|NVD%%Ykv+3Q6_A0$dr^AKL-7S-|XuU>Jb_d z+F)K4AaK5M&T;{AZB0Yqob@N1zu=KY4$dM@otAokbf1D1&zb$>JwzD%&rM(NuZ=k< z>jVV<;0Gkb`3S30^!(6cxEg_DV4!s{veorp8Av-nZtAO4)E zhmM2b&xzD@4iJahA5;#Ie=yC@%lx$Y5Wycr-;S6%F7xrb4mMC&{>0dxLZSEH!q{Fm zuw*tCrSK0foY^?9WFE(5_QD2`3W7ZzB1WpJx@OKyP;piXy&-g1Z-(Bp5dyYxl0TYQ z!US3nfFdLGLClkynnh}?#b6TPei+L`ahMK|TV!mHk+D770p&SpsoS*&>2e-f*%y^~ zb{~+2Beets%;ZJScINs7?I1RG@@+D+moSe~wv(0JKfGL_KJMaEw3FZ1aI}|917mWw zb7A;Q@FC|o_bn!0ceb-R9E(8#s_i!x3rYKMGBy_`sM#}Fg~EOw{)2p-Eba5jl`Jgn ztqlWv2n@}nW>-pO(lTezx#L_B1m$<2KRDwZl79z^^FY+x$+;^8Ug`WcttXHeoaR@Y zWQ+afVqe@31HJUGclHPay@3FPT9NNF6sAF5zRmX}SY@gjIS zMY=%<)4vkJ^z&pygfM+42-6!6CC&LI_Mu6>^b#yk!s=y!K89 zOzSrJUZ6lGF;?9Jr*fzYoeMmj@cr{J-tB`4%Za|_Ll})Ph9t(kt#|Q+O}!|U zZ(Sx*s=~as0F3P5TSwtofUkl`zN;)W(5TKI-%Q$Ks&fgtx?Jh-Os!rpW0VtwaUFPT|Cr*CZp%;8fG znNl^-;PkOmCQb)u_z76$4b#Cc4u1UV>VNWO1o909cga=Fv-lrx1*mEe`t-RAPA22O zz7$|Fs)C(_sU`utPGjwfRSRa~g#vgjLh4%)42wG7?IEun;X5~Ks$=G*3i3ro`TLu_ zaOB^`^!`utxpQdr6($^x|Ap-Cyye2OcqhjG_}zJFV88tChi1)i#{b0cF5i#;jr{KH z@BQ$*%R2iWzdL3ezP;nwWiy84A;tZ|!beK(2+D1Vyp5lTf$pRFp^BpvD-?NMlKGBN zoU8c%v3Dl$Ra9sHpSer!%}N5n8%Tl|!lsgtu%jS50)i|eqJkkS36jMufQW*M;x5*G zjdicqr7lISTitiDwrVYPx2{mEw#BOT|NEW!&ApS55N&;Z+yBdaa`T<%oaZca=FEQ1 z^DGxvi)+QRM1B!wx~s(N#5=`%#K*+V;uet~-I)Fhk*_@{r-*zlNZGaTUL<*>I7yr> zR)|N77m3%4zZ4%4`9X>Kzaw&F2Ia5BEbJG`1H=&`U(+#srFe>H>~13bTFG~ckBBdc zZ;5{vIRTIPrScsdm?I7n$B2tX&c~)6Cnl1oi5H7ciu7sA_;Ij-r{*x;*tZ04l>DCfxtM`hOVo>sgT?*DS>ht`Lh(BBZt-#PcjEivU&SCgKFjGY z_7jJTQ^Z5W3b9!{S-e2JPP|*>tQY40s`#P!rFc2skTL#e;wJG)@m28)k;f?YyNZ3p zS>j@`Mm$bDOT0q7MSMVfUi_oDRs5&e1*0%nZd5E1CyED);*vt9BR;+G2N^e3hZi>V~^vn1z;y%j!4a-ld};o~Jw7LA=c zD~% zCxw3|nKP@XA4DExqL@bF*F$oyxQ{qk94k%`XNw1mHR92tvEz>Q6Di|&mcq{!jU79z zUriamTNM5a(b%=aI_F-ozMO|eK11T?+He28!i^nwtbZhVtN0fZKV#nx>0SHn326vN zU+F?3z9)(JUSgiY3nX(^7vo2fNH;<8GZj8ZJVfE8B=nAwyh8D-#kC4QUGmxD`6SX^ zq4*mW{&SHt$5`L{B|j`aK_cCYiho__EdPDI9Tz+#nIw)#m^EK zh=+@1;!<%1iE`GEDCbOtZxk<3_?42c7H=Vu?oM%&_@v^W6@M$fCcZ7cFMdHHpMQ`j zKN&Zy-2N^iXBbk>5qp!++goyhIGRL0;}kzf;q%4A6kaO1QaqYOx|NDwukcgFbHxk9 zOG%V}jpQ4|yGiuVx5cl-a91ZhDi(-i#TnvJ;_>1o;>%*sZcaXXiMTB`^~P#aG2QL=Jo4c7HDZUE~~ph7S`t zBb~DGg9R>>Ov^0{UnbUy>qMH}VEl#RrQ*-U+r_qi1OBG)e~3N!{DXXQ#r?&J;w;hi zAFxm|?Q=3+g=qY1L2i(|LZpEy>YXIgSQTaS90uMgnbyS^{-F4XNSkF0e^Gozd|jl0 z1jf651hOUXDfSol7Ke(olErl9`3{^YdAewx_prV|^5J5MSRuCcQ?OFu$BOI4Q$?Do zV7acpf=eY|DVpa=tQ%V#Agw)6e~b98_<^`x{6hRn{8mihb05}e<$&xaM#NrXA8{XX zusBK_Bbw(^tDc_+k!lr&%fY!ak4l|oGa3p81+g;4nv|` zBd!ovizkRDiyOuBMH+))`WCURUxGUoZl2qrXQsY`PbmBa@i*e@;v3@o;z#0k(LC=X zADRPU`Q5~xVlT0uxR+?GB0+zI?-ze7 zz9zmeekA@){D+u?do58q-eDJ6-a* z;sxSW;Ls<3{~i@y_pFTN{&ApTkWT>Mt_^SuP}$rkq%U4I1oNOt`Z(2^1L z+xjJ-$rgq$7R$vdu}(Dp^q{v|^6?@~x-k6(;^pF1B2Bt5{!#Hg@k7zPS3!I#?ro`O z{ON&1Bp)muDy|aOh*yZN{r^WKKOxe54Dn<&mH7F6;6{ejNeb3C{7jI zwcihY^L_-RRT-vVDRySR|0?NSD;j@xNPoX%^Bx4U@n;9Vqj2;712V13u)MEC+L58W zw@4c@l*fs*8bi5Oq{SG@CyBHXL)rM31I>F0@M(pAEN&BNA%^<7qIr)1d4%Lc#UsQu zqH8DLJnuu__-_Nvb3bUF`@v_WZ=U-hzarT@|3jv68J7RK_zx22z;7k{^}L%zBD{;_ zZX)e|Gn{s5n9p!=j5uDLF3u9?iwnhKu}q{@8|HVSc)EDDc!6l1_n~){CjWERN)6mt+l-%}xMpWT_#ew1=u}~Z) zjuOX+)5MwL9MOF5M7@_tE*GoB<>D%Fjkr!+FK!gi7cUks7jG1QF5WKQB|a=ZCO#!T zC%z_b5#JKu6Ss?Bh&#lu#jxHZnD43B-gL>CV%zs80~J0| zet6YkmSLg`S8oskxXxpr3-!LnesY(9Rt^B&Gz{XqoRK(hxQiP%2?4n6w#F;sVyt|K z`$>*%K$kERi&(FN@pIE))mplT^F5sFT->+{&pN~3#^8uK?UY-BIB&V@X2OPDx>GL8 z<93iu__=vw)hf!jtSDEsxN-H6z4;X`#_@+RZU=71WBF~sx|;^8)?DOwu_wS?JqdB% z{Kg}{IcR6*mx7;LKiZge(_q#5sK9xi<~kQQ?gFfP^V?YLY#;N(p%u&TI;ANDxh%ls z=R`Jy7Usv_?V_t!yuV}1NNPrhdJjm?4c`L2@vZ>6{pDV)d+T>G>gTo}E?cqsJ%e?0 zrFy_DIpdr@=*sT)lAdm9&4FGNf#^27^gmKR9`85Y%s@9k+!Dl&4MyLH`tg0XySRGr zKQek)G`__AkBp2)3r(=|zo@Wq#E22mXwk^R(L+pl=l)07c35KmM|$9lxZ`g4?WnNF zrcMq_wbz}v#Oi&Ml{NK>9nt!4|NhT!1JegIS$!V+DA;w$l0PkZr(_3rhgFJW!fBg; z{WW$#$`Z7wnIX(r&*HNa9z*Bw&p?lZbB{5If_s2rcs%j1#?JDM%$m(0U+^b5V*T03 z$~U@4sR;_b$Ao5N&aA9v1_gqbQ)@0CZf5s5)dYpiC+2YQMf5QLXMD|6-Q#M;ghO|r zPJx)ih`wlFex`Wq+ zeuiLQo|Seu?!AIH1!p0Oo*MjoZxOuN&!qlbW`0{XFX>$Z34tf6V~6Q+Gsty6$AE

D%(mf>eE>Q34UG(MXW9F*?9qu%23A@> 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%0ARbBV( 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

3kmN10?%A&Xtmv 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%0D>U2i&NG5~2=Dh&t%UqT=njpR@2|y=6RX#k0v% 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 iXU;$tMz?IDrRFU7aS4@s2svG}?8rRd9c!|_2W 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
  1. `zs8ixb6S`qDyYThRg{&?q%WldX#aA1CCo-+5(l3y?eE5A(`x8}j9b{q1$J0QXuy&ls7^Rqu~J}pV| z3&mjNcN@m7c`&M_UX1IL@V^7=Wlh_Qh`{{b#m-BXQ}V+mb}qjMF)s61P1f-;eD9Nl ze91H!uz0^qHx_+&InxMMx&s`yCOw996RiN0<&f7)7y|2e6!nWhoYW70PdQh=cQB6C zUJ2Ce4Dt)?`%?cu21dR9oW}ElYo(bMAUcG*I^1&Cr=&HqNb$b1R6#G$a@9j+?M$akQ_KI&p zj0K%*8t=!v>#ox37bM&2I@B9Y*SVwWLr&}ATGMqw+Tha0sQQ<@;Z26q_s!nWPn-8G z*G@%VX*(TZzvpy>QRIzkwl9CD**-R^*;riHY^2U^wk>|A*#`Cbbr|}$#4PXEVqd(p zr9Zr5`4U*raJMr%B5h5f-Fu!g?A;pcnziLeo3+LL zTly{6$1QDHzr1~8WV4Pq-HaO|ajwSQ&9>!PC|S};OgQTQc*-~5>dS*p+k}$ zjaogK5`Nkqe&n#eTdUWTa=O}@uC(9TWQ1yi=QrN%{>h(%cYGok)yP62b3gjT-b6umfViEy>oF9+ISRNp|Hh)Hb%|HppEBaec8-5-ruD8 zooHiwlNQnOlws@E_zsp~leHXUYmmBqV-}WU69%MY^f*yYE>r*#<+T3IL4JU?sJ>IuY%zQSH7OL*v{<8RKUkZ$2k_AcS4LqlEL`g!Mgukr5kHZ%t>&Tclkc5k)~ z%5K&N?QYhBPqldGKa2sUW_cHRle~`O>K1p}re=F^L;_k$dZM%tT1)Sm+tP1rpO$^8 zIW7Bw8xbySS+lrLi)-xgmaFGixAdK#+p>PFr^S_8*>Xqf$d+psZ$er9TY4||w_H7T zREu-Dr=|b=;VrRalUn+w=C<60eD0dx*lY|cYPo9ph?bc7(#q8>Yg0WfdT>t5m1x0r z^ZT^u%X_!7>kl9r;RkuCif%UZbi@GpP*7%jdN>k_#w&TZ+B8s4=$AKQi= zSB<(#zBMiD)f@vG7hp|%gr(|(=}0%WsAb*QLZr7L?Rum&koI8!@QiT}Ww1%6&-bT0FJcp6Y5g=1*<5&3B<6MT}aS5_CEuDD-qh=;||* zA2N2>>s@<}Va=@3c1$rgVGj^$tB*WoxK=b8^|QX&9IOuyZ(18Z>zm+6tj(Z9Cv6wK z(Gr?CEjr6*k*1J-@vQ{15onBva@p9y>4ff9VMsSZ2(QNK9GO%q(Z_a4`AM7#4 z$sR*PPG)bue#((Y>d}(t_7Q_*ZL~)#wCy8oD$d+TEclo0@Qhcs#0L)_L;X{|BmWk) zJF4zPS8aEP`f=TCTV-!(?F*NGHPzeiZ)dzKPRu&>Tf+LkX)mb%&#PTD9)^SuANibC zk5yE00dF?l`5C@5*>tzM6wl`9fp6J1o9hfBjk}T1mfray!S3jfDaM78cvhEu73ETw z54s)ds!+G90iQf}yF>2DYqPtqLlVO+*$jzHk#YGAU?fD%lUd#NpYU;OIFY5jPnSm# z<*>_d8K+z*s2e@-70oduTnaY+E)%QNxa&uxcP`YU*C5VqckDCd`t6{%@oDI|JM?`- z2FV4Oj(hNIJOqN}n?py8g{;Adp@q5~w+D?!I7}|zcHHTbZ%VcpEljQgcHHZb4^dl; zT|);$_&!5sHU1*g9_qFa)57fz`=y9OV{JifI~g~!kk-{nHAqA-B09TuaOg?YI!rlX3Nx1I&=WGnAu^C68t=L zIuhAp=7lxN5`7siTd*xAJFGwo`ih+`UyIUZUCXQ;)tmH|ju*?D#ACh4o~@ls>eP%z z7+`lTvbm*oqGk8v%C)glT6BA9^&(qHjanjmbhAt^vPGF;cl6CtaFMO284iu^E{#`W zbDMoFBDxiYx)$5q58@lWEhZ{jF1~e@S@|bKA4Z|Ba$6^Lab-+Wv{TBfw5E@amW$tA zRkq;w)%@e4QRA#OQ4jUSg%65`Br3ztoyOEm|(dch%aWj;i_7qVJYwTw$fp zh#ny2ue1e82 z2XY*CxePl>e*^6<9W)@RL|N^@|>jIqL~-4SWV zUV7IxSeVW?V~$W)jP9;Lis-Sje0}xy62LYd{hcgLKb<|q9{r(A@2|6mxKW}kxWg{l zcfJAnhPx){?x!Uy=_Ia+dIt$eR_U^GCRt%;^mQoMm8^HT5VgZ5uLaA9TprD8cWHF3 zvAM$0jM0N6tE+6C*Qlgg^y4z?T3ZKmJ=&ummjzm9i;%>&79pt-lHYpUkSdj5MzrYKVCyRJ*xsVAmZjWi>tt?l#nIB>u4}DuWpuuz zzs?HRM$2QOUDw+pda8B4Mvq=C32v}O#H)x6dh~S3;YPCtM$9dG^rw>ICNm2o<_FNAB3{v>zm^nR&FvB0Ro8;$lUiz} z+O&%qmP)Cx%M4#=g`>4Dr(8R2t`bBQ$7 z(1O=siDW}!xa%p`6*l8RM0AtAj%%AOL{@IMdTFb@wh$@REdP0Hrp}u48YIyjc8Th) z%WgpRZgj9WFz&F+cZ%+Mi^OxYIiup`YV2U?gTXk?qbgw2dgRFx#2eAF=hO8bIa2UY zqeo{I#N%;OF&*E>I$^e+dr(D(J`h!MUuAR3Mby2nK)Tf)xqpY|k&h+aqrQk}JvJc9 zeSmZ*#VwpLIj-?dy38Nwr>$NVB@vLNw78y(&=7s$R1Zy|PyVGF{Q@2kcIk zYpzk45QOI|U5@!&a=tMcQnxO7}Fvvc1JTB>7#e;yy=Mb}F%rc+=-cNnPZ|I$bfuz9(@DRNTD? z?~=F{yy@9dQij~%I~YUX%34joR3(!yQ`0f@tz4$*3suznSp0GfvG+)+J{7kTbIWa* zV_(MXy05#G>I}iN;bC8YO_`=Iij*d-K-@(b`YqP<997@Gmtm}#s z=X91hx%Bi&46$F!Qs?xNxSj2Ai5!O5H>AaK`b(VLQdDj)8vBWqpR0177J*ByFvOlz zaXlrSTynTe;?AhJK@umI1GdA^KUvDii;~s4I<}uAC{&eB!^9~VV&w)udSMq?kSz#r zkU05#(hGY@+?NO+k+=~muCK(6?11LS(6=^0(~DGg8xWLB*!tEcA}U%^$(LyW1k@$Lmp>OSQM5+Acx~_E+g{Rc$MKO}91;Mv5pbqWzzTuG}MtHaIInMTarY_%X zZLzpW|3XCK1F@54gpUomAY@F4-1pJWDL9nrXoo}+=Zr*>aaaQ`rgfNU-O+kTh&ii{ zWIJF3RMD6ts`b6i=a=+^sM?hoSoKGZUt;Vu&wJI6c7jfqrjdA?~=gw_s?iURNWxARrS&+1sfJYW9D58-f^J%Mjw#Xr{0ZGugEt^o#}> z+aMd7mLW)P<^-hrmzSBtMS|?B3~lqXtECQ-i3-SwWT9&p{maaV7=S_7G6gfMxq+3* zRFyGj&-|m=+v4Ofxvpgiv1)X#VCI=6{8jd>+C@^ieHbu$zl_SBOuI-}gj(9P%~M3F zHKN-pKNmUt?j`vkwI)ghW&HdX)7S&jpqz6rS&8aZg?G&Fz7SPZr!+Axwa7Q~bz9Yt zG@RuRh(cVzx|NR^w5*hEE^nqRuiWtpvBKkOG)s`ebnTM1CC`*1|6?aW?!S9U>3_U3 z&4$ltt4M}a_)zu9$@`@R#ZIF?JW?*H5jL5M$U7Ia@ZN^tN z$ViKd&lYUR-OyIr8)T%D8E`kqh^$de32l&7X0Eo(VvNd3dR<#6$Y5w!*c)WzVKd-v zkP%s_m=fA>5F_RaT_|7D&R{@|1P_+i(5k8%WMqIDsBMrDxg8>=tZa~xu^7;Ag)}q1 zvOz{NReXj}sNyT_4KlLa47eL)L^_V4RfaZf$H*=WDEk&*Zov!NI?Zh9Dc`CD3kB&k zSl?;lj~LJpwGA@zlNngqAR}@JLf5i|J{V9^M1zc|uTolukZZ=<8)W1PGvIEJk$q+$ zv_VD=n1P6fdFZD37}PqE5$U%GR5!@TOBhg~AOi}lY><%_Gf>?iBR`q})E6Vant_!K zGU7(3#_m9fz@TQA5%nWQ%NF{nc=QJu8EXdI4KgBIjp`4X7%{h)>?IgAcQ=`ByPJjR zR_Z0|`j0jP`?(DTOZ|r_)aVmn+C%X#R+Xwk^dU z8nC7K-2q#Q->$ZlBWm_6;kY$>+m@2mwx#%225c$*+JG&^U)_*|+L-&jORSB?t*y|8 z#a3#48mcf+{s5zEbKAC^B`X8Aoh7va+s=~e2H9XfH|LNIMh3N9ZCekPt8MGSaCV<&rM?ik97}|=J4Km_UeRxG}gN#fw1LpQ% ze&)_?+a54`+xCFc+qMUk-nKoUblDz4(S1?6U~UhXy=@~v>1`VUN^jc;R#Z1EKiBgw zkqyB7s0jF0W1Raog6^bV(o6qs=P1OwH9LpeO>$Qiuzxyl705mcJ7Gcg3$m*UsL>y6 zi;~8ANl!HQ$#bQPnT5^01qq}S^w0BFGD`^fMsaRIF}sv1 zq&Y5Il}+0;OO)o2aanTNCaiQaE}tMWO*R1O@YXb|^JCf!4+@elkMVS?>tlST^!$-# z{46oe9G@ZX;P@?2mea~tx{`DqD=g!(myVKEuC7K;{_UwLwOI#()nu zL7E<44s^Anib4SKf_$huv}!Fe{@h;6rX@DW=e!IyEuq0$5%{j&_K|-1>VVzStPINEnz}+!UetP;T8Jz`)*f=1cnjKJ){KnHYGM0NEJrEk_p{m7r<5c?h5@g!824h3H6u>L z;MA62(fTyVcq#^bDBxYaP^5av`j(GSU|7X}Y)z19qNX(fkD2G@Y{|Ub4jg zPxYGfb5UnnwN0rDG3OF9m(+k9rv~IGbyF`SQ@NV`@cbMz&0J6 z`6|LX&R~W(NTYVp2>#KMGMBV~TxLox`_0^EiOez0$`R$7yL`uwXn zQEOGYJ4R&7kOPF)>soBVfv>=@+_u*+A3~s?4G*)rD;h)pFVA__^2TOY%QKI&i}Lc~ z@F)4W@{00;IC-LQ+<8wr&i>uhY&<%?v?jkGyDTTKSpMYxzs|_N%>RFqNoh&0)cL$x zjfo!?pJ>(X|0KIVTsX~az3Jwn{?U_xhYyR-!ww8jG%qO3!9(DE>e1Hm#j^U$N6S|u zfbJkq2RFygB|$8nM~xW~kM*n`m~AF0%c(BL7}mI4w!n~l-r#>#^5Yk4`vXmP7*P)0 z8IkIUG$P|2x>4pa#|)=Y>2U-_I*iE3NQhTQ1Ufl}ICY29<8U~Q;BgMOQ%`k-#&}{J zZezKM?Cgnj%tw-`@s9cNNHx?^8%t9Y9btnJlZcp(e=r*6G^%wY z6s?FPVaDaUGd_NtWE+`k1nJ1vDfz`nevYub7$#e;JA(d0Twz->ml3QxLY=6&F+JYV z&Pb3tCpvgKANo$82i>S}$cMsrHTI?+%aJ4RxDw1n|G`hqLU(ZdF>4*e~kNLOJg>8w0Wa-)?YqTC(*J%{XsL^E{0!F^nINsCI z(Gv+mj1Z5br%~f^gs3I#7};4C$(7!=@=)m!vL62bUU{+R%FB)AT3LoV{)aegB4#LZlxDO{L<_fbgd5A_xSP< z$@#(JlI-8E_L?B{!E`SW5(2>j&^Zqj-d!g{=q1Afy?!NNFY1C zrLxbL?84%u7_-fh&v`q*7|HvO6d&^R#>CSPoSO0vK+S_Aa5$i$g zWqTaKM!2j_`51H#czg3d@mmUPZ-aB`7Glq)3(Qt1j~`&Cgke znilx+El#UBSF}tjuE0NTrCFq$8mU=cMGb0PSXz<8ce9?7xU2-rSW;G5Q&r%r#1)_C znkH-d{1jjM^enW~h1TfljF~;E-5Qe?dJ3O zz0=cD(9HRMt#W#KqPz`5z06o^O<|EsYO$sY3;hMsie&{=MFr(~%e1L8=XfS3j`FB) z%bsBgiDMEIhK=wHz?G~8IsSryo&~72bOihc$VCnFiaod%w!~jjQSKQw3YV~rxzrO^ zmRDIbKChw*m)FLXB_Uj0TvL_{3lU#fxg;shUm2I5I8tJyq2lnHVtjE>?ujcbuZY9tvL$(#tF$D?UxGG?D=e%jM;la> z$N3ACe#FUjzJcMw$~bi1>Z+W)>hV}`t#TID{<(E9J0)wj&pT;)+MGmR>ru=dLHwVXWs)d+8i@-|G~hMVh5^|z|(ilupetB?7XrGW=_Qh zk&>A?D^s=yKjuMCwdN_yZR@0YXce;(WvUX`D15T4sxM1P)=b!#u*oH8m04A&6Sfol zsE|&L?2A$Did?^zD{)!aj1t>MhqaAjA@WKq{HUzYpI?$+QeJ}Dv5iQlEy^h?%Tb#r z#$2vZ_ROQD)O>{$g}!wL4OYWs%Qy zo~-FJr_M>6l!;$$+zt4#0m~i?KmX7TQ9-PSTr^~9MK1Pm0XqRzg=Gb5HM5CI3JOpx z)>ckw+jd=3UgIx7%as=_#fn-|jXr{Q$*Gm?+*dj>DaYLWb4xEX_mpT6l?QhlzuRLV z(PY`JmaBfT6pMnEEi9?>S5Gg`FR0ZJVeYl^{T04q?1s=Pl~ZJ$O0BS8MftzmNwb@_ z?Hh{8?t)PxnAM(n-k>n{))?dr8%nCNB&Dw8x;hXQu z@X#>z7bxohlpK6Y4v$?IbhY~$*Lvp$$42|L#&xzE^-1B=j2U`xcx-aWq~S=NBS(@n z^_OPHsFb*L%^BuO53&V2JJ_T2j(W7wS?{8E)w}84^`5pq>Uf}4h8P%O*G~TyIL-Lo zR5<`<9x}7i7;@Mp;AP+-OXq;F99)xoCv-lS%$zOT3VMaKI5;L>uaA`@rb|M_twQ4s8=v7=N%0co|xh))QfABUv9EZcJkaBDMjo^yNLMDWM47d{41PHm(?rESp#tr_0rk& z5?VydX$@UVH_)y0HhLG8zqCs^FVHvX2UIQ-lIj1Xz0fccj;HF(3Bu|R_iz#87gIU& zBmliAik906?7-Pn?6Ag(D&$(p^GpUbO(krQ4SSRx*(g}1H z^-=YVMx?uz;a&7z`X2p?{++64Ct|*iI29=6$h|hi5j2I)p#`*tUPEuDchje+dX^#b z`*)=&j_#xl z^iFy|eTsfa&wrNRw-S%PpMTHkzc8#LPU7Wa4OyP{40ojJS$>G`%kV&|p5=%5F$|BV z$s*#@8J3GZB>%aL&tbTLE@pfU!^`LujNi!c4Rj0R_b_}b-N*Px82&STg}zQdpdZuY zBI?`3@OShK<9}lq_nuJ85lN%zP&%BB7Lng%hNsdr#$U|v0=kItmoZ#Hs~NwV;k9%F z(chmdnpQ-x1M!J_6K0xKNFPZ-{`ZfKQ{y_gh z)j3_HmwO7xeEq2W!$rc0bOaqoC(@~O2F;{%sa%{W`Q%XfYqNw)X*I2-tEu{)fOOj# z-bHVt`{>hDeSbju0}Q`GKc|1AEmVEaK>D8;{*~gtKdOGgRDIt-x&($tQT6=;@yQH( zsr3x`ix{3qvuPeJqUE%TE~BgHI=X?%|E#3_9;AP!PtpBUeXl{fHyM75zE6+PzT zgY@4re2V^qo~3drpOin2PNCDN`hJAzSq#so3uzHm-re7i&v>?xgoq`EQxTKS7_N@)uZ%m%p2dZ_#(?5&8*L-`|iOcqhwxd3 z>57BtPq! z@sSK$&y4TMu=ULNfea_o5meoh2KmVKd6M4@YCSW4F2mL{1}i$eTe>vK1=u0*XWy6?pY}H{*bEs@gV#a!!6W$HvCzJf1^(M{*Ls)RNZ+4 z;b?|?(mr%B9ZE;jaWsWar`9v$XESU)GhY4PKsjen!>r3&giD{5?HOf1_^s z9e{M!Guzeg4}`lg-a}()98IL7sr5{E^*aUgPiK54olAW*k1nR=bR}Iw*VF6hR=R`U zO7El((nqQK{e${E$ME^jc7KQQAJF6UOWI6N(^mR3#fe$fenB*XM$sO$HyuRf1_;vb zqv!=RnR;nDy@;ycXPEC&h70Lp>ZeQT8oG|&KsVDJbT_?|-a{Xyk5lzK5aqwj@Il&0 zKcFAeFX`9xH2pjMmC7+FX%F@L61HQw6IH)A5g)^Ff0{t8XVs5qcoJ2=Lowe>hR=Ui zyMaord^cbTC!F zR}n8aTaf8H=^gZL`VjpSeVSU&aDR>AH|hKI2>pzz-;pS%h2ih1`W=b*Ul>-uBN4_S zc2%z^+L>CdM>o(qdNbWiZ=?6ohv?(< zY5FSt3q4HVqsQoH^lSPp{ek|2$}wqKpH3P^+tcpUL;KUgG>ML;6X;}`MllyUHI5s2sbfBGR zFB(G!(RezFTF;@H%O8E{!V|Ua#LZ6chL~qnRcf!v_F-btH^w5bRNy7d9;XH&y4poyn?Q# z=RZ6CzdalNMb7ssJ^$J8A2R+Z{gQr7t!KoaVfZZljatu$?}8ISvYfqXUz$iqP`O8p zq|2b$bP+xOS@6}2ucdN78JT}Oy^Zdp57I~J)AV_IfWAS$q+ioBw3W(Dq@_GN4W$vZ zGqs-SF88sK^kb=)rqWD0moB8abTKWbauXcM?|QnG?x45OJLvuNVfrL}mdYJ;B)_Bd zOZqiEMbFTmsTOI@=cb|5dd7QahUIoVlK*Hrkxrp$G=t8g*)*RP(@I)Rt!K7xVR#qa zOZU-x>7(><`aFG!%8h}fzTeaHpS|vkGN%XA4zv^PN&C=2G@hRSEcRr^d+AJ?NzZ>a zdm-Z&(<-`zUO}&-*U}p)es*d$d}qeys+JQdakxZj9X~{J&4xtQ@nSqH;eY+igyF*i zA6!sUURYs0+~EJ2$0ew9{y3DX&U=I3-7{XoIE<)Xz40#TaM(<}lBk7DlUIKX_$l~b z(+xqI^UIZEMAl2zpS)&Zu=1AhexxbGcOC0xO`D1cbOUW7CzM`@%Z2fqUe4P~wvwOJ z>tYPnJQ&sDuw5is3mGu2Bw$?9HKyL&^thfWSM z25jl=9bB&`zR^{`Abm?J?oeN|c2NDX)?1Eu?Q!U&wh{L;FLG|l-{sz-#p-=JoH87J z8+&_u7Jt%;)#Gt_H+Ww;>#WtsPw{qXjNNpob?cgACu3`~TJ33{wAvTxaR<)YYo~Za z8WS+>6--M=`2>fQvRd8aUOua(4Dq__2k*$&Cb!yWT-1F-vb%2JW@mkBqwkx|;o7OO zYrA>};2!JY?IVU8P2t@m#>Q;MZMk~uTeZ!{PHIJ2tr6K#CARGe-Z7|!L*M9q`=l)@ zt2H!qg!f_ZOvGt(jqSLjIa0dQGKyb3YcHC0N(+|S&GAMIztFq?tbOk8lqBzMcrL)( zhhugP*y*g7rT%ME_!YrZP-f(IuXC4um~+d(U29I{Wu+1HmGjm_w`q$ z*Y9#?ZqZJ?bJd{T1NOMR8{IE9>3%z&Eikdp(WFNXMw=SO$h!Rcw9OI2lc3RLi=0vC zIF0|r*G1}Cb$8%i_><}q(CYSEQTrj4sbdbcc3yMvtSiRhJ$BNm zV@<}m>kqXKSo88(mwp6mA!d`lBV<#E*Vx$}?HR03@&5I!E9Jo1aQ#s0#5Etc+A9yW zCal4H2v@G@QFo|y^qNDh(=g1#P`f5<+p&`oDaTHR>Icq-B7diT>|}S{y-U0KwX;sd z*;3khBexkl+igD7x@e7S=b_dN%vX$I4SGU{jWIi-H)}h4-F)n1C*%@dwEwKWaXRYS zbL0NAp+z6Jx{n`ewI_Vs8oIyR=KaV``eK)D#@>$G|9V#2c0dq@UUcxRv2loZus3$kq1Nj+>EmT-?mZn5jMm&X#=H8= z#Se|#?W{X=(!Eg|Qr$RskFm44*tTt_cVd0)p6 zzSC5DzKB@o%>(c>6ln=(ebTOMEv7!XH6m?+mfUI|H@H4x_;hVB`eAabyZelt5yK~H z33Z#3BfZJkq73v=y)miozQ1MF57?EzIdaNwZ)SbHmRXlBPeZ`gI`_)V`T;uz?$n2C zO>2YlQA^LJ8{Gz;A~HyN-SGoW&MNf$&hpHQS>HIjMO-kcE_6Hk)Gg?34)f3wdjX`kXQvi-_hxxtI_pU4>h0@|@!EFdvQFfD>*)yHw)L&UvbMq-B6fu~*_^IF zWw+Wg^qttFc|6`%&*EbBp<&*RjWf5-!d5X;U)X9N;xD!hMUT?Myg`i_TQ5Rr zLbVr@*!=q7U1hQtTaaJpuHWso4|iibuS?!~csurB>ATPt$7PRktaZR=1M1`nGRqnV zpjF)a(XQH{daW;>MZU2L%b|B9FKU(UYTy9&venF#GmbtH2Ep^>nhX>W;$ugA& zo_KQTMlQB-)jRAF6A6}rIic;Vm zv;&_l`(HkhUat*KZcMMw-!*9O9?ga)XxxvM8oWn~E%;NH;)LQg*alK}`n)?IncHe# zIj{IO?5kb(+2VZO;Krn_hg#o#_}Iy$`x=VpVhfNdKJRMj#Ve{(q{O3#2h`_H8Bmvs zQeJG7)|Zw~J~7n$?FlLWj=vpi-Sk=F32o4GhaW-Arq8T22`8$(^66)MrM>Wz9J5p( zrFQ)~d~k<;iIAMAJpYB~TFA|&@u-F!m};{*ZpYUZJl7%{k%k|s+n#Ij0Hzq~Wazo) zTFBkYjU_TiQD?b1u+8l_BxkSPxal{(fSh~Ah1`n5sFcKf#>IycVLs!+Sb?e;qa!a< z^V`=*Dc9o-&%1a7Q4V_}-klpUvu<3CT3OG#kgsvp^Dg9+uRQPKdc>*cUGzZlL6xWq zo_EoL$e`DdBc695@#Y=Q<>3w?lAh1IklWygH6e`WU0e-pcs9ae)C|wNIIDtq-o;4C z=_j38Wv>+L&LH#51w~n2Ce5^{8MEVg@%$Fss~?*w;&XumJMIL zFGP;=yo}RA_i;U-8)T3(Zc^C3e60^M*c2NH+ zLGHIo&3sO4nIDmQ=LD%6nBaLAIOHhLyO74>^DZRgVEN053@pK6&qn~yyJ$sK<#`ud zq@a)ShUZ<#xOARcspe9vAgrDQak6bP##ktG3? zJz-J9Dmtj6;xdjaaUVx<9T#*Q$8ld!!BNLu2Y1mC+y=$v|Gre1iD1vK?o+ZRkM z&3lKnelqVH6FcW!&TV=s)dH7Cv5db9S5VsDh1-C%zYACAetCTU4u2PWTHgM7d@TU} zF6^m##@~fAH88Im+5`SBT;8F1e1{AEE?z`kV>akz=-bpjAYB?G?oxcmVPT>;T zg})1?!yYZXg^dA!7iZZP#S5?Gdic9=a(3ZIEExVSoSa+8?-SGCh0C8`xEzIM!QaKB zxC)HH-$f(S!{3El-@R~u%J6sL{898OyoTk$--TP>r?3rM0sb!dLHk%qzd{}u>F>fF zO8OV_;6{HJF8#p5msvjiUAXmw3ja!b@OQzF;KxdaI{y{$cj3|xFIEA2izF`3&EG{!ZW8=m3__Cy^mlO= zZNT5f?v?_tz$D@v3T`Joi`0>wWFjkvL=C7@B7Q3pH1{_{!wworN>#W&U$sQc$8MWR zg#7$V5c6-rUTA|^{w@v(Wz=pmn-Tsl_+D76A5b~-ckv6PD70fY{9RCBkC=?L^moC+ z;1Q{iub$E0g?a=^RM6iA6VuGt3Wv7fa3F@WL)2{au`IRUKEjH`Bx4g&T0w3%f8q{9QPCZed%dhrbIaFD~rB zO@Y6QeNjG-=!HX=0RAp2O#y!ww=o6$U9biL{au{T6!3RJ6Xx%NF9Xuwg;T)a#RI53 z{arW({9R;mtKjd#Dd6v-6|=zKg;T)a#Z;z%zYAB&2Kc*J0Q0PswJH2vP-dk}hQABS zV?sIfcd-JBLVWeaqrVFZY;(SJM1L3dvPKE~UGSht!A!y51$Pbyl4R%a;!!B}yI>I~_Xo1ZY~t3T}iZ5vM83DqSOE@Kmo30g0MnuqG=x$*dKhL!@ELm{LMa_R3@c!&^C6yTDmZ!=R!G&KAwFR$IC>biCslkH zy$3=m{`%SqJZdlMzJmM~0u=w}XaZ+5 z{|g*V?Cez{;!~pdCwxkjM4dxK{7mfXQ(`AS6YLIHFwk&p`mqa%l^B}v6tN~?1dd{v zsFdX4$5vSOU4AMd<3ptc-2pl05RA1!zzTu}e%@L`NeQ*cjl*-}QW0A(+5-byduoU5a5Q{z(YZ zU9>dQP!Pg`Y)x2_{<;_+8^qDZE%8K8IM$2^SBL_i)w9}zX4Vd{xQ*a%A)nXX1y!pK~NbOk8X zBfuE39D%L1gdLX6X96R3afcf4YVHGDF+bkO$W{dO9U_h<#)n`DwzlQvtI^!$+!8iz zk>Zh-UBjy)Tkv<>?&FyJo-(~6#5v0F;X7)XBA(zU9y9Csd3Y{RLW{4=Mb>3(F{dBE zfZ3pgr6WQm0&BUHk)a5vJu%hv@M*xvawlXrGQvG*J`J8kgaKbupW7G_>Z8KqsL)_S zbE`%b!M|d%?Cj#)+g24uZbrZ^x^-!?Pn$*x>(h!}Z5k;&j)3I1E@cGgoe)mWH%AN4 zLGZm}9!Hb3MxQkO(P+k-5%4)_g2BG~9}(&sBf{dS&|pH+y4G-_HG*Ylq>bsv5Is!4 zFy6?>5GQ2Yw~X0^18-q&BfmvE7XjUkVBbWY2p6p)u0gP-V8jV?=Qc)!`lzrtDm0kz z4f5fbNi;#Xw7RxJgjX>rj_752xHw>BxD&D)8F6C;E-!eR%JG1@5*z?lD@GWgCwOlF zQU0j_&)5;=A!oab65&u-$_R%8l7yqe42DNUR4p7Krbq9xB_8(VP?72X)VPts(GtTs zHb$C_2!1Ovlg{a4K_a3Ht-7&;{B9(<<5))+u0%jZE{cqfs?6wsvw*2cu-p>CSpXyF zIRVZB5V;otn@T)t(UF83Gv}^ek{L7e^CQD#er{CAjtX%TimiW-BsyBZNA`h;RGPku z(6M~=5=JICJ)tpnkqw$>pn#*AeEa$}2MvVWMn-0$MIdB1GQx3W{%jb@N8`Ys4dKQX zvUh|q69MCO>(V5KCxz$I3JhQh`PeZoMZY$U9FA8ZSmS1f-MswBu$z|~6|$p3+=M39 z$wv@wKq7l)6fSOvjKal>BcpI}ePcM@to+Qlf`N#T8x^vnLfiz*M`()?1jiQ6EAkr| zaf57lW{}Nohzzp1iz9<PtT<4G$JYZ%$=gvE`F zNT_e*Ak@gaXeoyqCm!42aOOeZM1OP(XAUi4<6t$TJPIJ&nx&D$L3DCl`g5Z_vu!Wd7+z79ZR@s9z!fP?FiyQiylLKpas&&YPuk0JOiZ%faJtI+tJ8pi}T1@p}9cGk-q zNvN9{v(cm|i9L>d3G<^m>D(SJT(~4SB<{DGOkm%4rY3}@EPrSW`9o8@ML}##f>Se+$4OR$ zS;?aja9kqT+2S@?GsfMEE=sU^sG7~F$` zJrcL``Nb$7{gH6f=u*EioEe~xPSNT7*bHWJ!6sQDGCe|Rx?GB?nx4;z; z!P5(?4I@eGL{&s91k*Fp20^}$810ULIubn)%-0UD?T&PMVmN|)A2G^P74AmT#k*VY zJR349LaedqXr95WchSr_=7J@S;fV8; ztVVcn;K2xKIqI>k7c6Cj*D=r&JWt>$OynA3{W8{*mE?+Wpfes`S;EkI8@U|4ER1B8 znTT}t9buKl56Z9*%4|1xcWNS5VYgnhj9z&tus%3OusX*fxOM0o6dDlFAOw3|dR;X@OC_C87X1o(z_d$`BIH`nn^@StrGKDdg*&!Mx3EI5lOMd@9N5~cn4n{#*xl%@F6H$4hyB|c<6CD8?L z7not!b@-fkM4g}$f;?DE1taM9qZ`}|6eXJUhCGBG2OuXh4rsoz&GymbEMMcXxW$)NBU}@p*Qx2%4*yU}3+^Dl0f> zs>J&!^L$mT$TH%?@RqEH3@t|2?&);eZo!GzJ>>qNLBV#!_KxEgcNy9`u|l;!(F!kj>(tdd zIcZOqvO}_mc@s&^z#u^f=m-x0@a@wXJ;W$El`L+V=!PNKxnn!@>*7+E2<_aabf4}x zc)-6!Q+kj{!F2;13M@cAPd?u-#lbH4h5xu6 z?)oKC!`B8a>v@=)b}x>_a8i^?HcjNvA5qX`Nb}~+6CF984oZ}@o3Kx!WA{W^(a~Lv z82)MR4Yk46a*Rk5=8x69zp0#$??LT@npl8QB?S$r9`boC>6O zK}VES)(?JyFga_tpjTHRvi@FSRJ%GQ`+bAl;w1s1>y5gMI4pqp#-WKk{3A6kT} ztc4eloM5fr&zym5URs2XNv9?`!IP+1lVouAQmje^qsCzq%459pPJf8~r`&zuJNLV~ z_eg(RIy}kyPjLA0U*y?iXLlaXTfi<(JpRvH$A6)>4mc**w->*QANuE*w{Oo-{7>@I z;T%l-)1Gj`K8*_(bp8KKPagmO`tWexJLIY4r#*L6|Hwm!`TVh+|L^nF0bdgT%`Q1` zd8@wquQ}%UKW`lWk~fb3pB-=DepN0))b~dB$UQ9H!ulEC8*75#pun7OApIdd@$)~- z{|3LAkXbUf>8Sgk=wG81>V;cXc58HJ{~D1g0nRmkeD=eKE*@TVcl(mBP2*K#dwrU1 zKzR=mw;(%^*x_BJ=WgSA^Q!?KBDqrJ4P~z96Gw8II8!`HTp^w#ULal}t`qrg4(pP0Q#erg#I9Z%0E*H-c8^xQ%`$Rt4r~TK&@5CHDMWLS0VMzXY3fV`r??gl9<8|s! z5ib@uif@YFiF{_v^m~f?i1s~Y=*<~4xJvr-#oNRO#An4f#81R;#eH$Rp5+`Sjuvag z1>&iqeWw`dua$hK_=xy|_^$Y+$Uov>IW5EvVsG&o8j#JO z259~?pf`USkj9x09#Cy6zp`O!f7#gdnhD98M0K>thW&z0W%Xh463^w&ynel(!JLwfU{ z0ePe37nIKYXF&gs^dCxZ{xhK8Et{Gj8KE}fPj`%*bJ-8=aUR$~^4?;F*jqeO ztmJ9p3F3Tlp}0o0`4RapmCRSkXzx1l2Jv^|-QosuqiFLc^1Ui~hxmh- zx;#1Vo$N3*k2qbju5Add?AE(cJ*JeT>4ewCE{A~H{y-r z9iq+Cu*W}IquoD?_5c;~TarH%KM}ifKE?XbKSdwO{lvjy=$B%Yik0F~VwE^S`Bw1`@%Q2%#mB`BV(7QxWyzbx_r%a|#pja05z}wcplsHk ze~(V?F18dyzZE5t`MNFB@ogG1^jmSDlT2me<@)H1*M~I`viQ;7O1aXeI zSZoka5$)pxu(w9ConJ$~RC1$uy|_;Nop`tSfcUWZw75wO{Zzam`F(MV_=UJ#4EJoGAU-BOB|aynXQXNYHu{FDK=XTA7-BFkfsgwiVlpc3p>bc3lVZGYiaT{t>}y$y3Cc;#~1W(XQu^{xr#Fi06yu9}(-< zO1?_`t$34omw2!EC-D){uJ>TauJ^!~rGH)IH6`nx6q|~>i+hM|#n6vMXUU--i=LAE ziU*0i`m-?qi73zfCxXW)UA0&%9xv93p7!TMy2yZWc-A^pDMLE@p}U~!l@N*pI1Cr%Yl5a);s z#gjySsDt(SwYXNiO8l*OlX#bSugI@@F#lh~H^j~2hvFyVSK>FK-^}I5D^X@=SN{}U zrSC58>Ysw&3t{;uh;`y3ajCdcJX1VJyimMEyh^-Iyji?myhr?l_?Y;V_?-BnxLJHp z{6q}>RPfs-tp8qOSFyXepLl?HxOjv(UOZNuCC(F`5hPL|AY9rxIz50_!sdl z@f~rC_^J4f_`R6iUG)`r7h8($#SUUuvAejRcz`%i93+kw$BV~_Q^k4W0k)85ktQb4@iDm+$6ptz9DWAKNY_czY((vT>IpRyNfNwy~Gl+yBPYFI7ISc zV(3R=l;mT?YBBU9F;jA#xJXMDc&RgNqj_nTHGY^drGYTH)0kZh*HiGcNbfVC1NMBT$r46z-8_~OxG1@b}hFT_F=ei-*Fj) z5Zb0Z9cjMDd2P6a>jpxB%S5lgR$PDx@86({*k47_9_uvPKT*LK~AIN6TGzxaZx9v`otK!g3cN9_B&ROP~RY7|{~0n+G{+Z^A^^uW1jL zgK2xK5fAeq>UDrU_Wy7R*R6sgYHw!59-A?&-zA8Ld1#|I?6t-9Q@DidE`%a#uL1VB zova^*R@&Zmh%--j1TG`@gB;nvT*q*m7^bT_=%;;c+^=+iEgO+;U?_mx4laCGB3i#y zs2|&f^}}?SuHRFLqc6_|Y-xV*&V4`JUNX`>yg^7;1SNK{y)VLYX`f|=V*^oddVl=& z8zWjmdpKp;DcuFAAD=^oOPCJ6HukG1$}IoL*G8|39u++-`9Jox(eH9A?MJ>g&VsLv zcx8M|;{28uC7x>wZyWLR_O2|hOq`!+^edj)^X_eaDjS|5E?W`5{PwTC{&#-ubuX{< z+L!Ez7sM-HEhya{J0R8#o-Vfjas}7j{&lQB)-}KL>lotR@RA*g0k0MeSRQoq@V#>% zmKLwL3wCb*I^Ml>N3h#nmd@qbt@18tE51%1<8qy{{FJtR_VUkTuFTrz z4Y^@kqDgF9b~e6BzsBD(q{;PL{Oq-r@lLl@-k;sO^0>;um0n5i^o`rSTT6HB*>fnq zz8}9YyCS;}CI7%}n;zX#Ij?XlJ_NqyPkw64qwy9S_y2m|;kSJqJFdfyWKX|O-o`t= zjzRXE+&KX`?p1spYg4qt@A>e+R|}p$tQ=dNwaw3ZWD~yp?`_hZEQ|EeH?_ZI?H|6u;MWFMoE3%;mF-^9E8Anop%i={zSZ)}D%)1Jscf<> z?!gy8e({do4(+&Ox6yHIb8K$uj@>qN+ObJ3QU zbNx0y`^`<>MOhd7oktAxwjQ=3*4f+Ib4Ad(^`_vWO|XP-<>waf$cOFx(Ye!0cjUt^ z{F_|V{p%*V%WsDkcD>QiZ5T2g>3Tl=`Ln$~DcJD&v;AHz82C|Q;LwkP0l(ko=RC39 z>;DA&V>H>8-6XXwJ9XhE|I$4wQ0j(!kOil}!_aQs@wNZk;A>>V>fLu__w2qs2`RpO_Z@M><3qb|k9BPh{m|9^fgW;D zeQYfF>Z+S~Tq-X#CN?KozY=VQ<3Z0xr^mOEl~%%u3nb659+$A#T?#CpD3 z&;|YB>cbXQHr*C$`iD)~=nuKKzK;5i^LoGKuSr}Q_6_!lY<%nA+xmy){>AW>&|#dn z3fn#)KB&?w^R}*8{(Ja0Xt}yzNAmM=w;ixO)-YyutgI0IGQRQGs}I;7pUL=u&!6qt z9wlCRXlz?7ws{l!Qm~>jcK&gd@k^^ex;Qr&*s5~oM)a2Dzul6XSX()$^1f|ev;G?^ zE9X^CL%TGY{^E9TP4SLBdJchKg7{?^9S2eJ58k$E!&zxI9qvfC32%-yoDqI3J+yU@WShVp(@0K`;lZ_^?*?0z^E) z=bORbkt2T89-NS3@vK@%@TtJhtiY#2AC!~vsW1{rfM6~H%q&!*)|@RQuhrve`k`oSBhNmkdUtVD1vezN9UJnJ;9%})DN$hs~tp9(do zN|t;oyaS6_KkHK=>*~~K)GqH6+RXS=_yA3q74fNX5RJ&E!UP)skxvCaS9d-YK1D3m z(i$h9GkmL*d@4Kyqp6*IDx`XZALY*Liw#L-d@8(z0#g~E3R6+X)J{GXQayA2flmc~ zbhb1lp9*w!kjnT};9DfAj8BEvDQ0{sbmtaid@7vEx@3GR@JVzk<5S^5=FRw2xReED zd@77);zM@zsgN3y{V~$zork@e%J@|H726=jwJ*fdetRy#&uSultmDqH*>dCcU>i4_x z<3q8M{Jd%=&iGWgonpqP!s!$^Qn+}RvX}a zDx@~5&i(R6(NxB#!n(=%dQsj zsqkxVRK%ykcD6{wr@|SOBR&=Q(r+r_Q=yct5b>$7f#pYhDwNZH#HYemmLKt{z?X(o z5uXbDnr15EQ{g7c5uXZWlp{VBIIdDrp9)np81<>pmx`!Qg=yTRs85AI)5ia7p9*zs z#?Yt2aBM(ss>ILcn+%0^EQ$D3SjHBL_*6K7+y8Su750MNrm2Jd?B{5TZ)l|Yhdva% zLcTGTiuhC*$d-dog(29<81h~dMm8gpzKOrb#?eeDh);z%lp{VBj^YMI zd@ArIp;W}D!i_9C;!~j$s}}L8us{1*#HRvZCQC(pDm1XXh);zsOds*7a45@*`c$Z7 zf~Zf07%fD7DxAXhuflLBD-nwCMcMGHa3kV0 z^(*R5U^?el;RDEm?sd-cY|}(@D#ei;Rxot!TD)8Ee8h|gp$E* zfuZKRVFm7PEkY>a+mQZH^WE?a5m=ZEAEMw@a04JSD@~3=++^0xE~inVuim)_!hw`UeFqM2obE}of$#s!iu|w%;sqDcrNO{k#`AAu!uvD=l~{W zLoP(*cnYk^JBYl5(1}^Pup#k=${^r67)p9qK=j-CxzEwkF;EY~t^FeqI&n?s>CjAu zbQ}VDDf6vEzQBHOWmWd_bFy%vQ$T^{D0I?~}|`?&ptVE^hwS zNOUEFZT@;h?xMh5^fV$*A=rM~jL2IE&K|7qC2gN1`tg%w8`3+Mo%7 z*=vu;UI=DyUqpH#ID5~-O3dT$OSIP)zS=^2MA`>ZCze1!A!R(!Z$Z7;< zk5&S+^&0IR=;sf@@U!i0M54xoS!OymRKcwu$mLWDaQ0{=@c7F==WAa`piLO7DA+7Fn3@!j-;LI{ruxYJFAd#C9~4b#fbcx0`1(4 z$T|dPrz_9Tm^<*+d$4hnpLGjuJO%Z`NcA8>$NM3CfXI6YotUiiOVGsHBgWvB(a7;; zgumvw>SjM{GYsuRLuQ~Ol9nQLVP3aiw&RQr7`k9%yKawAWVD%n@ z$S4HczcUdz9>FW)Ow8PH5rSX)H1Duj%j00jrs5Syw2Zkp6<>c5MW%&MKK$~} zZ~bAheJ^A#9v5##qMMnE$HgZRdE9a>gk*oJYrp)X7v#!&gSj{xy@^DxBUqb%fyieR z*ygEX3>O5oIr~y)=JqyX6a0y>yv{s%VLvKDsx}DLkA@&}5C!(5^@yxP=)^pljjcB= zhou~kzx?xHe}$hvm)2OLHYGS|Mz9)HAkvKjYgCEIK!iwdV(!3ftfrlne*XH<&M`|$O<{~ni0_~iN$SDXBJIoz;{N>GH{}eyp!`YbC=Mtp6h*@dp7DR5MKsyg3@*qOQ zj@?Q&8yC{fD$IkSomY_ZC1$0aPZ9Zq0`0_0u~QLbhb?^ta=YJaXlJ&czlL_$+O3hY z6@s;PH$=)Pu(bywawvjEE$uLOV87QR=Fjo-d6sE*#v|oe1hX?6k(m@|=M+R%AVfw# za|a%O*CF_G{rn=15$>;xkn%zV+pe1sxsd|5>p?^wK!~&tbK`6Zzqcd!^Zfkjp`E`V z4suO67YTz$f?Qr-R4kk{(+eI8QWU&IoX+ifaM}%S z4%+xs1{}}Mz%9;z%X6FZ^mrwPM3;oAd1l~JUm8t)d6=4iAQt>0OwIA@Qm+njShll$ zMwr_EJpV;Fs-QChOpgjc2lkWo&GejsJ5jHyBgv|6<2-KB`~*A8{?$)~_fS>90RD zF*-ReXME1s99ry{@G1)AkgijX&+jL6?v+vPoz6rDcbRPaFdN1zlj0gKoytrnoawT( zR(Yi_PwT_fm`2L|plRQn0}}h^bjmHVn&D3qLlyU21w81{TOLwS>=Df{xWHxUi7b&c zz2tOHS$gl9g+mJqMl`1FAN$vPheO?4@{-5M2MF}9NAgybt+4Dr`oUEV4u8XmUKSli z@L`PesmIuK1bnueptYZOwukj*V+4VdW#p{3v1~0zQ%-Yh;A`3JpTsVbSpfcN{Vj&s%g9@fw0 z?{C}{SkE-R_0b0*FfVC$+`LhQ-3IbT5_T8D8%6X-fN^4^MXj@}vT{Zd*SILbilI}e za1Y)$tjwP;{TY-69}0xsJn}{p`&c=n3A+sUMiZl)mW{C5${9^u@1le&J$*=w|HIN> zveG9IyoCeT4}{&}@Foy;@$O9^_+bhpVCi#v(G*{1$JKSX1~tdaMJ^RP3bTa&DVPyV|XyP{2Q@` z;~$4-!bL|Ayls!!I^M|0HwZWiCb3y|?c|LjS|Qj`kde+#h&M9ALj%?%%{zwXg7wQ7 z;Xs4;K*H`)dc%n?5HK@kH!>2pJv_WA(AT0P2=05-CuuVWrwmvj-m>Uef&o?*+hOQ$ zPB^KNk#C&P(8x#*#1WY6ZpA}nnMv6>7lHkilfj2+a$jCuXh&M9AC%ssc zY-EJfRkpXtJIO09Nj8pz#EA+{t-|@r8l0z9JT#gR9wTv3c@#P~N!f`550j`CvDKng z1P`3>3qrW)2!eNYY)>)b4x%H7&IlN%L?48}Ylt;6GRO(>Mn*P_`E4 zHX$=~vCZMY#U5W88MNpa;h;sLaJX8c%ut1&;Bcr~S6YRVI5LqV9H5qigL9qfM-Xm2 zP9R)#IPo_Gbkv4MM!rWtPl=(v9Fx}c;owBmXNKmyr8YFXyF?9*jBuP5pwIT`Fszin zZF-hAc*XGFnK_-CFd1pCLBJUq!9k2u>ERr~kD7WS@fHG31REL|dB+L$jf~hGQg0&1 z>XU4I?-+t-4cNhVEXxesdD)SHi-DdQxHt-B1}?f52X0Fn3nK_OaFM+Tf*Y+3OCzJT zp}|Hg2Pg)?NsZxvMB|4ikf_yKtY*OJ=2AOjS?7d?Mn={<;iN{M)^pTZGDaA1X+Y$n zN13xuMmPka?+h@YFoFZn_B11doX}t+akvvsN{>V}Feb=|$`f>_u#Uci20I#W};r5Zq{{Al((xPu129c#IizG2DE73|4_bQ9d!s!e8t(`QeAwjTBg|JdV(0-!>P-OdW0}val+y zRu;ViVmdbkR@3F)H_RQ@7PX0EtzEZw261L`-!i&cqc9W!CnG!#^4tU^Wk&0GD0W)* zfz$^9=Ys@OqRR}*o9#U^e-Xc;(&My z!Tj@aOn+qh;o*o*XAh@PWY@NN80B7OL{G>RkUmeh`w5&F**1=hv4xzD50M+XyOY5wA`{rMmS%hMTzDX9Zv9tE9{$Pjf|8!J;8I@ z1O^A3A2P~mljV{w?yex+#mhJX>tSi}vPMRlAo$+6w-~k78%^wvV0*F%k#f_IA^Mqq z;j%_X+@yu0IU^F5H1e?Q=A8)yuby$#Aa+ME|AUOUDQGOw5rJDkKZ=OFp zQ5E)2?l82KE$C$GbTPIWmhhJYlE(!WPx7>iU4Z0)f?Xp#V8py$jqD2UUes7lJJ;FX z>fXph`*jGY7jZL!)hj$)(0q74z>0BHapqw>b9!18&Y97=bBAN$r=hW6k3<$8HjYPt z>(oJX7|1xQgytt|twzTXJX6A??^{jzxkk%^J;wOM2$*yTo;!uBG8H~|5ZnI_1kC2F z`*w?tAilR~72&q%+(Bg0rv6a`_lO*VhIQxY=IM3<|9I}(AAuXq(aVDdTY_uuC?o*chlUabYG!*vwS9cBvv5WFt%gjaztXqksLOVSrt35(9R7 zSaFQwjJ5?BR*pl)&IlO}q%lwrxPVh3?c`hM;eWqhT36!}6ru-POr1#mM zb4;fn|2;&w26YSdzE1_O*N~iF)=Dpl^qR;?xSx3eGE=1QGrybA(x>ZDWu`O~?VfUT zQbVnI73ik3s&M{_YzxzbAsdl=gcQzX)lDcmJ7Z|4$gK@~I7MfA3{7`;YnLi7Mb3~o z*o9k6DGV$v7on-Q(Cb-xqF1bJ)VU%@v&c3GDcq;mT8gg7(JZp7TN`#9impfw3tN(S zeaT%T;HFWi^!#;c<;YMOnDSPv2)vVG>AA`CsbYv+5Cs0CP`Im(Q5gdnWqOkXI~&*a zNtn{}sn|ssc~>)Y#0V^8Bu1QOZiOYQl<|$k@q!i$XEqp{_{xr5<+CxM3w0+ z@_eRpDLLY7iM+F!>7aq7d~Ii&QRUb$yXP~NOBoqbRJ?<*>lpF;x3nfwS&Tp^KS03c zU1&I}%rsTz)y~X_jJ&5AZE4#3*lcF9`x#|=3j&|1c&&-^#dxHnP{puQrKsT5CDJA% zX{pk+XSe~8S1~g?%lE%P%Iye|?T;!m+i$79wUm*DWmcz*Y*j{??mta@ULbZvh#b43 z%Jh(myrP+Dea~lBmpxJ?D)HgQ@&abG zllDhJ0}*iLn5kz*nXXdgy~}7bF{^u?6Um-YMzS-NyTuXdOc`Y)d#L1%jC7qW??~9l z$2t4K9eEF70ocE^eR>cCKJ6cmfI-hsVWyYFKa<;X^1ON1+$o0KuHxYk6*xbHJ*u1mhl1Rt)6T#fsgw< z#p%5d(han}8q9(oTQ3Hk`F7I@4omdbnHLpy`() zuK=T4ze{OdEk{FG8bw#y7?#%0tqrGhimtRVEN!S;8&2mGU1{kCIwae;BF_2q}zs^;L>4WxBFq%Ev9` zyf7t2mok0)Yl8-N&5m_icr!6vc&*0J7ok4_>&`F^fyISkD&o9I;nftwa)ecp5MEWT zfsWx41YWO%OE#*^kdMH#;#LYpAkTw4D|82W<{K_N>1DVcf#gUXvSvO(YlqqHKNLDs`&g`19nn{yql5{``~WzOt{)$Z$h6}{oj6HPy5R^5!cY7}2Sot>SjW=*P}4hi#T z_0*c$NegDySDSM}=&*OI>*}Y%TO$Mvg_(1voZw>VB+w!SGD43V?DK1C!o;$RzXs)< zvV`@#;9<{)Ti;{=U($XsuZaG83lgaUxD{>&hrT@$K|uj!`~-ywyq%F~66Dam@PZ=5 z;2=I3%x9*ceNh2DW|t=l5rvQIYWn(ZA2jt_vI!D5}GT1Z^zJZ|*f?Jvv6(!*t9C|n%{_{LK2|kGqk(Rzg<9Rzx*f6XSMjrI{jN&tVV56BUc@^hE?a_|DNjn%og-hqyE%JN4J1J z%vt{?!K|IzGzdzu3$U31{HbFn!ddgIcU;;;60V@Luqr{P*xX-D6RG{3ujqJyefeAh z9_3?&=s7`--=eU<+W4|;+wbGUUHsWRABo!pPvbUcfIS)Oa3FVcvNff`_DF`_k_?nB z-7~(lp0UVJ76r}WI~v{ar1F-{kuxU=|K255)K<7QPj|6j&iCE!{30*X7-!FS9Soks zvy%UEu0&SFzgm#>WNsiEd>lG+00;4CNqA~!_eKo*BmG2vGI+>?AMRw3SIglww;Y`u z3Fuy%uCqB3kyy^hQ^9Wig8hqv!-o_F``=4P;=%f5@UmS{(83z`BMc`rCw_C2!C5D> z#e?AUcu}%vxEq|ZP4IzB>GW}U=04f>c|CoPH!FvG`-SCu?M3^!{cv{gw@joAG{{JB z8jdVr3;y757UF&Z3|gAti<4|$TC(f8YZz;u{^`b;RmYMigBRy#(qH>eq<u{Ig+AhI>q%!f&OMGF8e3S+#IRn#s5V5cdd?X%>Lil)QnkUWm+t0 zRZsq?Jx-6*?fieDtSynct@$U?|1DCt`+r=w4y>9*zfKTdCZpXn`M@OyNm zq%-0AgBxzt1gHHIwc8%qnp6I*^vzs(-(X~Cx$^j1jze3jsEEV7YjYcF=)*0c#W+H& zpr6H3$qE}9%du0E{qQY1cKaQ!*970;3vq>}`CgiD(wY?w)^CD`FxBCZ;|^1)WN=TN z(?7V2{$A<-Oz4Q-6(kFxa>ukW|kdf@s(kl3&D>+!xfNU)|sux>9C@~k) zaij)M$>Q}9i!AAR>2KLZ|FrZsM{9-_dJg&^v1f20_jF6n+wGFUJ16_)?aTM-hDrLJ zrR7$$yA$P!ShAOG5VE~#O|@t6E0--1>y;dWDAv4pvflzny`131rGB!ONAO$xm3BPq zmq_&*H>5n+yy%6ulShunt$AXiJ zih4m^k;n@$TbQ|~Lz>fCs)U&iFVR|@WjM|LKhmH=W&laDcp}mcon|+7B}{;*(-=s> zK9t*Ydq#3|3WMjD4B>(MJ+G(*j^;2vE`9LM2|n@tga{nqh`J7{W2AB&*Q^ z6>Cj)DTr#LY2}CyU0R z#Y@nvIerrL2u|$BhR!Lnefa0tKQnRHYvPWfsDEMN##E9MEJO{s%bTrisVOWy{i1y{ zllFpe(ryx+v={t%(*Eajr6=uwA&Z?VHB0V+^AvW#U@Rx@y=~%7WMdB`(6(q+PTU1{ z%;BnG*1FusXxyAm<&537)V1*WIKUi&agYi=(6M9B-KC1?g%{VM&)Rjt4v($fw>%m2ElLKJMZtmAO;bg7 z+O;9N2X76#%Eo9{x!t=<4z}}1#_KD-UtL{06_=2+su$0hTQl3Mo-@0;X7P;r>Phpb)#37M z($wmC6}=btsGd5>t6nsve$K4PxP+TjU*lEJ@72evn?L2yq0Ck{W7_OVGpi>rsPz`i zrcg7r2-kUD^~}k&bu&&v^4gh`V6nOy+MYeCv8HDJ{MmE7>RFRRdnkJxD7I(u4?{p`HGlj^3_&zMzXEm2)vS2=j-VQ9Fib>7^;vn%-11LZnx*z(x68H>^K zwY7CM^&bB4cL6r8W>(GoX*IK_oah~X^r zE;{Crk;A(2x_$q$$*As>=|%Hv7S5=fF=uvBkNx)Rz5o8l7M0DKGIzm&Q|8RCuUT9+ zs~6<@=?i8}25X_Oox8ACS>4>SsTKQD!^SDYjgJGTPntg!ib?aQOg|9z7w%V6HmghR z+@i8+Qx{E|Ut89rsO+eoMP;?K=akje&z~^`xn|CoR5t@HQ&wBMU^ZG}&g`^#@|}y}3tmXLGk8lZ%{aI~F%tu$N{}^(IZ3(w#pQ{OQ4; zo^F>}N19(hXVH{8b)HD)oq^6%7U-Rbfa}WTHJXQEbkXnRDvU z1FGw$&cMBr8E6r^Y2sB+n>1_IBpYgoaqJz!v6tzIZZuR48+ypVabERgbPiMjw@_xz zsDqJN92(WtqlcpBf*SU93uj=|Et+DR9d1DFjG3%JdJv#WHIrs9m>XuRURX1q{mUAi zM+0o*+^YH5EBs{-$1a>vHxt@e@y4~PS2rEK*p4lhnA>a#beytXU03UlNVo-s9*63n`6r|OX3m+6gH&|1 zv)~hJY`>~OX4KT6FzlpBGcyBu!R!TfHE5^VHH)x+7S^LvVB04x=D@C=xo@vYZoE&P zd4e76=Jl+wy2k`hf+d9P}YzA`R*Bu+D*3GG&jw276VeUZgJXYug zE1HMce{jQ-2ZJBotxK1#Zk#ztPOGU$Gu3ckcmw)Q7+r^*JK^{_vnS22?_M!s+Kl=M z1BO)%uBz_sIALJb@Cn1`&p96Bx^BYZ0|sE%OhwyN*Rg77WFEf4?v?H+)pc$K4ixos zPN<$a$-3m^=&-RiN8Z}mHu-24QFX0X^9YX{g6ae5En*))F1yXh9gpcI>_a%Ja8Jy( zs=2*rhjgzRx#!kQnNd5VW~$rUHR$iPn2>CuLLbJB%_)n~dFpDo=Q$79+~D@bq?zpV zT!+1a;mNkEo;_>QOl$;fvp5e;)3>NI58tDBXSt|$&itZ7=FciRY}Vu&+~S;CghrfF zQ&%@eTGhvVM_Voj5&y zMsQ~AZ2yp^MjoZ_nQw(Zqg-l@0Tfd0E3!u_npgqKwTl`eyORg;6{I-MpNv;&fhy=@yGC#k0jr z#r5K2;)`MvbSLI76!{hj<=!G+SfE@bP8Q8CI`qpWpCg*zbLel9e4n^Md`9snw^8J$j46L7=As)>-c#I1++XBVHm+YKo-f)L?xBA`^0VR_ z;wR#_;=bs!v~!rqZ<$iA5f_N3iu{&2*Iz5%DLx{;AigVpDdMi0kNj^{&27BGsMfpyTtoR?8^tmM@iISqt?GF`AzX1=|7eHxoG}$QQrW^H0I9|b4ln6 zCGRN~N#8|sH?f!W2TL9x4wAk~@>p?#^wT7tAf7BP6IYR_$2pSE7cY|jYRSJ5*GYf3 zkJJ(DK9~Hh$jcVivl$6HEyO*TC2xJ~?0{DFjBJozxD z#MUIXr=8eI>>`@~U99gT`4I6i@hB2@M~madlORxKVswe4B)w4@tD+H`0GEX0>$X<%rG2R$^Nc`N~Mx=_&3f z4kA(Cq2g$9yf|5`6&H}ObF#QhT%+|Dh?k33iZ_Tii+>t~7!#1qAp;%VZqNZ7elY!q+R z`a8rwh<_5F6rT}aCt>Gp@qKZ-)_*G|aI=crnG$ywTZ$b>*y$p66Z>oZKyjEjLOfcW zD9$2br;bE_S}y%6@htIN@e*;Zcr}T9w~{yq{-d}-{6yppGOpiKEEflh6U0U0ZQ>ur zFGbw8vijn-h!K||Mx0g{QJm4<_QrN~ki558A@&xBi=#yTDJI*aTC5e17wg5v;xh3R zu~EEQyg|HKyi>eKd_a6yd|KQjejt71c*>JF$bfx7bhYFAfri zic`hu;yiJI*dQ(!=`W4toh9BN-YniJ-XlIBJ}f>hZW3P+-w@vwKNPo${1ZBsOGh~5 z;UeFJr_8@oB99TPMZP6ZJ>Qfk>%>LkQgNktrfByak^Vx-mxx!2bh$=*H;eqV2xa=% zA^#vgDn2Q05?>JC5I2h-il2yIiQkC$zMa{}yMM-}B0opLa`zD1ilt&_u|n)E@+%e0 z*Iyhg4iiU-k;q5b5-Y^$mER6wDEu zi7my}VzJm!EE6k4{)GhX@Xwe?{-p$I_i;gbG@@K39xYB3=`V`wXNdg!Im!#f264Ig z3-L_xJduAq#C(^FSBlq*{Bs(vze8Lv{!x5Ld`h(Y%SivCJiEzBl4_A05n*ED#IDc4D!(w^%0j68nhsP)57YiZ6+;i64sgJOSyxlKhRB z#ryrx=ZLMuHev^HZ*gC-uXwn4gg8!|Al8U8#JOUW3w zDBAN3=+{fWPkcmtLVQkqQG8wetN4NVvG}F8?i*}B$kUk z!~?{G#X;gwakMyIoGjLgvqXCygZi8#d8v4+c)EC=c%j%RUM<@59N4*4^8Mn2;uGT2 z;)~)d;@jf;;@`y2#IMEg#5kY7puB9cnOGpU7Tbv(#Jxp(zJ&byNwdz6-SHX zMSK2){I!zjh;<@eFtUD2#Z$%8#q-1q#mmJjMf$E_{&nK-#Jj}@#D~SF#An49#aG0? zitmbl6F(Eb7QYkeu8`%QA)YJ#N?a>mCEh6BBHkt5D?TJXCT7kh{Yi1xe*b}J`sGmKr0_}MfXwR!adtL?F z^D6Kf<-1-CpI7}(@_ph1;$z}d;&bAQ;+x{z;>Y4v@oVurF{$S~boR)0-AxRiXSI`D zEZTD|q_gK*U@z(Wh=+)Wi9^NV;&|~`ajH07Tp^w+{!&~c{#v|Lyh^-Iyh*%Gq+3#M z7hOS;FN@)Gu6HGWC~g(M5O;|7+za`$^qeP0++A!b(&s75sSx{!{lo#{;o_0vNHKiQ zb%Nyi;zDtWxI(n&Tqy4n$ybWkitEH%MY>kC_7Ls)7V^I?`Caitahv$1_^n896||Er z=86Skp=i&ukj|cGfkUJ}QXDOg7mpLCiYJJ3#0GJ>c)s{+(VlOi9DBY6{#N>%#Cyg2 zMf#BCcDyToCVnM;C;EJzgLK(qu1J5g)OQl?c@|`Qo(1-m{vh!%F?_B?-?YrXL|i4V z7S9!bC0-?7C*CC9Cf+YTC_W*E&##`B{F3-r@m=v_ajW>9=95=Zf{>5^;rS&!tfQFC~Z1r!JLzwfGzH z7V&rDz2g1iW8zcdbK;BQ>*8OAd#KGbSakMx=q}xfBJ42i$E)Y)?SBR&I z_IwQa?D-gYk@S~|^oLEm8^o8y*Zv=SZvtOcasL0GbI)Cq+>i}!*e@h(0x>KiA}VVH z3_B`PBqWfq$P%)!q$s#szo;N?h#Kp@Yu&Y4t@~0dF0EFpwN^zzQfRFrSp9!KGoO=O zP)qym_t)RIzkg3&C+~TlnKLtI&YW}4GV?s5{~c_rd>ey#YO2y7#^ z6T6ECiT%Yv;t}F-(R?REKIS_aNFP+p_js{PoFgt2mxy%c&GZ|@O``cu2L1JtZx-(o z?-d^r9~b@aWiLuL-@}m49?3C%FN%wKV!qfz>@D^e2Z^J_vEp=brZ`8OCoUHo#8bsH z#f!wtME|?kwUX}^?-!pIpBL%!ob9(qOy~C^$gM>4y$f(K^ELMnBBE88o z{)ZwR%2U2jq~CbTH;Qx}Px%p%-s361BEBzvB+^ejtw>k!lphr74W9B#A|1k0eqW^DcgkOgUz6yE zbOBF&wn$I!l)H;`_D=b5k^bH(PZH_TopPl}r|y&+MEZ57e1S;M?Ub(*>AaotPeuA@ zr@Td^n|8`uMS5eW{FO+D?3A-b`edivU8L7_%7=?|yiR$NNZ;#}D@A%&r`#aY!8+v& z#H+>YM7mjL{6iwWsZ;)?NQdf_{~*$*I_2FW-KtZLi}apOxvNMA>XZ)^=|i1zsYo~K zlq*DfOQ*a-q{DQ|>qPoYr~G4)Zqq5>FVZ_YXsNFV8x|00HyR!$S!i=D+{ zaiBO_94pQcXNgP2TJa3=9C4F)rFe&UxA>I!ocOW$srY9S{hqGOxgTM%yLgb;k3_m* zl1GX3NzUzNh;&O%xmr9`JX2gpA|E;;XSzo5F7aORrzFzR^*Gc0Qv99x2a!(38NXYM zb+vL_q&IQK7mB^bgGD+RXZ!^5M6q0)FD?>)D6SFD63-PkiC2pBSE)d9<3#!~r(7n|l{w`)@l5eYBK?&!{wncK z@gDIh@i~!x$(jCL@sHx4MdO_u@zFw?j{e7)zLR*cI6$Nqa>kDlPY_QOmxwju>EhWU z{fTq?E5zHypNRA-&iH40a};&Yji@tWGuPlv}oBjfha5I<*zNfFgIa!;|3SS$_{2a7|+Vd5xp zj94m85~qpN#hK!KagkUp)`=^{)#6(54DlRsow#1SNW5CSPP|FHO?*&%M0{L)O57s8 zF1{)LR(wzVK>S$zRNN_kChiu$5~Hqd_Y9HNI(htQv6D=Sg?@ZM@!THog!7e;Q&hWZ zab0-@h>6yQ^ZgL464W_GW=4EbMQyE9L`BiJCZ#$>uq;tDx3Z#so}Ce`aCt=q>`J7@ za;|eq;&RN9o>z%{TeknUW)W>4N`E=UMSv=@`eQ2i7Ro1EuSOH2as^0msf?f(ncQ z{k*A~gft%R`~Ag_8wCYE(>lWx(X+yi3&*PoGuxT@v0l@#`r9DrOvOD$YrnE7aaAc{ zrsHqcY26sIi=PLI*{9sQ>hYeX5P3q+^89k4-lyDcM>|duI)Cx=TLwkyevG-CHoa|r z_)OZI-#G~T+aTzqp`mD%)?fVK8BnC=Hy!zLoF40!fz_`c)cfQ&WGvpZ;Cq3;`1xG| zMQVOyuCV*b{BUYD=XV3b+@=^SmkrZ#KZAP@e_3*iLA2ok= z%dw`8`@!X5tf}>zg!=jIhu6u?^?MOv9QJC!EH};Gx9_t|E@Z%j?7!d6cFgq!uYAlr zbC%2eS!PN%a=t2uDShbt#m^6~1XizfQzyG1dRzEv!&FIn+Yw*`*>^eQ0^QGofo&-28?77|(*TaO< z_miCy&%A5Xh|I>&tD%yNlB|-pB?pxhl(_w#Z#T1(v%%Rp{j}fhxTYbnE13CENp{KF z61RJsoiG!(Wy21q;msY+!X8cC8{8vSG@ad$y(N2x3!Q6qeW{CVxok(EVe*cE(NR<1 z;noqKeCjqVD;c__Y}>_AXXinuIlHpl-|hHOgS$Q2;f`Hd;fdR#?Xq_S8-BebI3#m32mopA})9!&)e-J607S2XniuWMKiRyLh!Wn6+tZ?%*pH%;E4O;RBiql41h$_Q81|<-PIWeKj=CG2o$sDHaofddk?mgl z_HJmW7ky!S+N!|DYj$OMkzH9CB_)CFv9`#ild~%$;$3uEN#l;03llrMcE|4sv`g%8 z56U|9uBMV1JDWaKrs%h=QE=^~Tt8FSAH=yav8C{zqL$JT?YMQP;Xi(Ex3ui;_(d0G^Xeu0XXj8bM zuBq!mvzvO1>x#9u=}feddr+6A9y8`O{TOklk7GLzZ0b60c2jajm!{;9Lz)V}s~eI{ zr!91c);FCogC!l>6q+%psmH==v41X(z|F6Gea~-pI1N{!wacL|Z@O^^N@$pi)h()T zx?x6L)3xIcX^NPwdTluYNBdpuT^F=8(hZr{bjFY>gab%>HqxGsv;`(@?v}RL^LKZI zu-B1>9!L>5?dZ}S!5O8fLB@{2j12Up%w1WT8K|MR z<%*J$t?a;o&E6H>sH;lc&6}NhB{*)Ib9Z_fxV)X}Zgwx^5%hMs=GgJb*<*H2G_rkN z299ZH;})^X zxglD%w`f(mZ_*c&N-{=MO|bI z&c%jYtV~CZJM_~}-5DIDdi^V*yB_^`=LNYX;gZ+4I-4FTae8gu;%w@?qk7?aPGtM3 z8E#4MdtOBuyoPZ56-{R~toun0N_fR@qu%!Fu>mDa`BodbyMpdJuk;+{^jY)S(mS8s zTDIe?hFx3FD*5uGM@r^wb$UJb%A?TzSHs$p@JG&Lzrqimy_N@E+Q`V@fM5FlQ|k1k3YAe8WWBTM{IbO zo2Y{>8Vudw?LZ*b4Zk{}n=<(O7`q-hhHlQK-bv#x>R+*@Gri|zL_^ocIO8DxCgjld zk;Oouz==PMCJEgV;tyh=An17X<`KHpK{ zjcJ6eTahR~a&YuXmT@hTMEd12j54xe11{2EB?jYrQO!vIbX$RFe3KFLte6oWhixML z+gmX!yKJQs8Ib>Tkw;d+2L%bCe50{v9 zI4cOw1R~?2w0{!M#!-zNlg2PxeGF=@)gd_CpKlFtY@X-8mp zX+Xv7a%U%pgWT7s=nB_vS!BG|q}eDmt;T zyn=IJA3n&8(~1zyRV9Ri10m$PS4EUu0IVWt$<@1;gSq zDZZY)*JL#^8x|d%$Q#OPR6Ndu{+6~ajW0zrMcz)k!R+s(cq1$MZq6PcP%tgto{8Vj z=!Zmsg6VNS7(_nEH)nm&k|eY;*DG%VW(=TbqCEEv=8@Kk9K@LddNZquO-C zmOX=!*?}lqC$W(ERs>WjCoz|eF)xsQB5u}kJxK7}hn#2SXo7>wA$PKJM&e9%wFQBw z?Q2s?*=*L; zffySH&75drd}APD1|=6vPw>2oTpP&cspJ(r2c!1P@VY<_&k?WS7l8z)_e5?AWNC){8bbT?RImrB5e<-Xkc_B<#ED*^;94Ze zbMMA}vxBB2rOH2^9Q$wcW4CQdgzdLLVXpq{h2~_&<%8#CI_jq@X5<7mV`sPBeC%ER z%h-X8NP!!r1)zkvc6W2LjX9tKCozP(*WFbQ2_|~8L3+6AAyJgb9S;SWeLmmGWJZp1 zqt`I2%TR;JFgJ$+E*FX0x#@6U4kw;u)+5}UBT+k?@=h89G%uuTx7`w18;E?42kArw zvpOx1&tEfU)x=Ft59HY67)%_(9XcbB#l*PCCEnmMI5Uvo&qSc0FmV!#J}c15_R}$m ztC-)}fj(6xzex!`3`Ncfw3}n9Iz7S3UXdRK+Sn6reqt}nJJ*-16Wy8qzkGRR!ejip zKvvis^R;ebI1`)~$ZBI0=eUVenc{p~1Fzs}H?fu}F0fg61=qQWAnUl^SKQ_%Ze}Gm z_=M2KyAMW8(ew)qomvnvDn#;{VsN+*q1bqXe{j!qg64o@V>?RG{^33$8` zwC7bPa&aJ?2e&;ZG)1loq_b38{tf;{`A+y|By~eUsyev544B@H4t6)fp&;)mI=DRf z{Bz;AM*jl-r?C%m_`az?!0GrUo4CkJ@XF`99XT^Aa4^l#YBqhAMhqpnyaDT{rR(;$j^G*;x=< zakzdcX#aDleiwH=QoEnS+CLUf>f+*dZO1x&(Rvw@jDunn)~*dqxjW~F2%my=Idw^< z`_iQ2+l_mvI}HEaJto~}2(tXH)3{T6Tc3pdXc=w_)`E%n2g}8IEQHfTms2^7O4llH zM)-Ov7o#J&0XL7EZ-;_L;tH!*I<99E9)y}bg*1iLs~niHH#vsTY@EDRz!`q9sBDyY zl6Nk^S`f3!4lMf_D1L^uu(p0N-O%K+c{tx>FH>@&qZ@I}?usSRxTjfDi4o`<^0j%8?I&Rc%TzC?Ltr`0sV$R1}@GN&M>gH1!!7Hji#-SX*wu-u) zsk{fuE3p=E9;usQ>oyJVzQ$oKxX3Eovcfk&aRrr|tgxi`%#x*x?3RA#7W`G{?xUnE{u0qdyH-Xb*5kr zw>%CjDxK|i%gjypGTUb!8_ss8xMoIMp_86|B$W73YU6mBL(&gVKP-K0E*?4*gQgF) zLL%zIxkxe;4@fX>VA6(c+GxT}Pq&-8NEVCllT(`Oj?JY$y^Aw8mv+T6a`#COlT$4v z55|sUvOt_9-H{%5in*?rnVNq#(ntN8GJTFo5o)PHZfl40De_voJu+mBB{q1lJasN2aqWQB!T- zxhK+fKyOQ$0QR~|k$Y5z-yS_OvfUhaSoqQr$e?Q|rJVxd2S(t`Do8Cyxr zu5{f}b?gpUaO&YQb+RF{Vz`i;jtGPYlQV6&kmOZ~dL-FzVF!bsKZ4H<@GMF&ebD){ zJE;-Ex0XC;;6IhH+e{ zqLDZftLN0YjSTPt27m6;!Ub+)1$N;VSdosPJ2jK;bp*J3&@1C+*cRJhTF$oEhUPdM zVBy#B8s$u4{y#JMOnRm{%Sox}nK)o-I;Ex1DSirL)ir<$I{^ORzapd~w3WEq*D z%3vb{6;_BgGQeg=Oh)772s~qiWp#}V{L%_58yWbu6;?Mg@FrHA55%WdU)}gM0z4Kd zo3MvvMV;xUH1LY1TiM6}--ke0-N?WstT-@4h1FL#GO*1E%c>h0$Y85DlZi~MIMJ#b zuR(y1O6G|0(DPo?b!HJ3671>N z8-gp^DJ!M-qtRM=|MF-`??*$k_rGs8KaSYxZ@wD=d+D1@*b`w2doowgsm(Io`UWdx zG&1mv6{3v{*bZMCG#x(5R>I{TupJ(oXF(W>6_>-+jSS4U!pcSl)?1;@Tm^SSz)w!g zsesK}PKDZxlvANLnsO?j^kHc238v#sCG4qy&0G3EN^j}^t5&A;|5bI3?CG}CPhn5z zYWBUQ+oSaNptao|rMGl@l+JGdHCF69!E2(~yrtVuZRz&4t5dpt?aGvHUt4E>3~jfc z!YT7EJnwPezK zf^ZvN*V!#}U5~=O7QtA;H;lWvRjAE zj@mH$DdX5p**8rX+p<^q=@_=PT0fDs;xY5%{Nso1j`0s4!sGp;hwua*yw9;RZ;}U% z=}EQ}!+ulw`SK@rp^cm9U!MFp9x5Ik=En;ZkBT41Ft1CD^AC|9hg~!a+YHr6S@IF? zgcW^iO(O&Lf-;Sl2i{tRom!{f>CoukW<}w995U{$*k=5ZiSb^`s{E?^8~Igg*{J1e zIjyCRwgeRTttAOfF;-lpi0NkcPBvt-p|gx3nJe#vTXLW5=T5c1aPLh@Fp1S(k*4`O zg50L@AeSPI>r5l2VKq05EQO5=Jqxkje;V>I3o}L(J0|XC*#Ge8$uQ4XE)@Nnl>lB} zaIxLEc`K`;J6|q53WKqR@OofCyG91bV8xv|QHs@b>RoerpKbL-1=bJ_Prst(Ykk1! z*T`!=*ML*p$TQ(ICF|d~9wzy6wV{->;eL%IE6p^dJsplk1-z#$lMKg*;U=tjoFMo+;YYER*}Oc*{c0mO*7{Yf*n(hXL%50| zua&t(*T9LXC@xHgM4X6o=mNwTznQ=37) zYQpO$k}MheD4Az#Fr4gZ!xPD2CcMgUn)Ku%t6xp7wfYGpuSNl9)ykG?>bWvhf>O>h zC9WTF1IViyYCgihx*tI_+7?|uo>X4V+w+wV)L78JwD8)Hx}?fS;^naCyum&AM_t(e(_ZEO zpLS1g{b7w=GG|f!+)8}DX?A~wfriFU{kL4vfH}voq>a{iQuU&5*-OsnB*YdyR zlAbOk3zBe2e-9%Bna z#i{TsTfmSpl<-xgK4aShznGGpZLd!6iJT-RT>1|CEU+IWR35RSpe z(Hm>;(^&5K@#DP}<4|mGlWkrY?p^l}qM_2gx}*o6oVJF`Q1R*TIO^eF*!#kv`&X|T zo?*Z3L)^w?Y^T^z?>u+KQMAJ zl?U0RUV4#@>t#~Lib9ztP-|0ayEv-1Z+sQ1NKM#eX8n)bP0@-rrXS-?OdFd`xD7SM zHrYW8_vb(OoZlxeCHCTGANr_5_4_0;e!i8rZ4$WTRb^MH>Sjj{TnxUdx75n3`JQ5o zL)!iJ!yFy$j<*sAo*9LuXl{n@m#vR&(|}=92_5jFaG~#7*}9R%VPl8{CDR z*X3Duuv{v8S;%W)xd3#C^SB4=KXSK)H}H+25x7|B9B z*HE>4u~TvH7yDd`55~pOyB!g@Z2iT-)iB+=b4?Lk4_|`|cUsuH;$*5m2qcTJDLe_o zmGa5cnb{iwT-aNob>UAur6sKw?@$|P_c;#6lebZ)BsOlvQ=9!;zPyY5w(g>~MoW$5 zFV{~_hIeW2kFGr?8%{~01DX!!Jp#|%sNYMgnV@G;GQd{{%`QKi9ZY_g+hVx;{O27N z|4ZEy@9UV@c;K~;K#gP6?{-n_yC(h@_$2<1H)1&TG_GR*+un%3!~Zb4>A$taIwmA0;FR}9*t?*Eu}#ih_8pCp8Gmnz46%9n-{?b_ zV}|g)$h>mi&xf$N_!QPTg>(0L;lbChc)^6RVLZM8jN-!>J44QAr3{lv#y3hgGE=^T zp&y|5A>we6pJ2G%c<~2fg}6XmA(}VyNYC%=-0lML$Ks9RJ>p~Huf*Sr5$rg(ZzFaW z`-@}5DdH^gB=H>aQjxDWncrLDR`GL@uWlI6m#t)h*k2qjP7;le52RZv`DAgOc!hYI z$Z^fg_id5iBPf37 zYswcn4x92I@n~_nXnYnR-q`#H+v1BP)AtY$6^|C@iZ$YC;)UX);!EN?qOtLheE%vr zj=`ubr=!?cJVG2Vo+vI6jV*p`w_fs(#k<8P#n;6T#eR6b%<_hdt3_jb9{L+4|5@ZU zg6WN|chJ~+2Rln|Y`a6|I8&xOQXC~7BhC<4iKmh{R{Pj$$57D=6n{Ah`6}^R>Fb`Y;3cG#>X)9+mzneW{3XIl%fAddJj65A0?sBlbkPh zl)jhbzTy!g2WfNr$>Oo%3=;WONnR)}mEQOiM%efi2G=Y8B5@Om?XQ=7vv`N}#s)mX zKa<|rf=7DeLm0Z(q~9SLAHoQKP8sRwC!X~Vi^kSF^a;uB#Uu&6@ga=##)mL?i1fpi zZnS7@yCc2vC5&`4q%TwYlO!({*NCT!#-=;AGdA798>PQhG`8EJe@wEm*$&y*YzMip zzv1#^h-8NRt*4%2K1lPq1}v1^Q!EzEmu19{lgx3F+>Rf5$rHrc;#`qq3>bf!_#^Q= z@gnguk>h=t{#x;2@n_=G;`8Db@pbVtaku!5=<#<9`KF1PVnS>$_7HoE=Jyoa4U%l8 zA3+`|`8aWg$PcnCr%K%4N7vcX|Ce~7c!|jQ8QlJM@m}#kkyAAo|3~o)ajzKU?*T^cP9qEH;Wah_{G85$_W@ZH47=Vk_zU(mG7?FwxvUAbz~$$>I!gmN-x3bTZ~w zC$1Dv70(pU7cUeyiJV8v?Qalo5q~1yC;m))LVQttS$tD8_cO@v50bZv9A(CGJ`?{c zy1YMuJ}Pqb3+2{gTd}Li5wncn-zOIby-`fNtx~o@oSMf zuIXYcku%e&ZzmRrJ;Y*hpm>DH$^P7q^Tf$gajJN{I7_S$7l^)Zt~$xSZ>}|xPZ!S> zX$FDinEOSL({w4DnM7coWZySdXURQ9V;TYJ4v~DA$cZe>r$ihtP8Q95C*nDAn&~P< za~}%1M)GoTjp+N#S|@qEc&WHq^nGRBB-!_sb&q773Tdd@<|i-_o0=PzEJdiXZ4fp`_39Fd9*lIoFX14mWgH>E6QCYxmsKy z{!lzaJV)FhUMyZEni;&v?^eloiua2Ti%*Krid)3jMRWg;e10!^o7g1&Mf_3>@O~ZX z!=iakfSfJ4o!Ck2A@&vrii5?Y#F1jDI7vJ~G|w3*r%LidahX^zt`^sdoc+l9ZW6B+ zuM_w80mg}uO#g!Tiufz>9r62oesK;ZxA%Q^9V~f(==SC@H?Lj7)){vPoG@iFm9@kQ}v@on*U;#P6H_=UJv^!VI@@*<*n zUW1&FY@XL37f9xGQ>Gs;9w(aTH0aAESBjj>%JlW(>EhXLG*oTy&>86 zrS-n#?cyIr-1ow!E9JOTc7#)zOeT9ft80BA&k!#lVYLRM=Tci_lY$_ z`dMO?xKOMSmy4%}r-?KY!1C`B9~2)EpAw%Fw}`KczZKsTKNdd~KNEM0{NTazf}-ym zD@$^|*g-55dy2*4Kyj!zOr(JW=08iU5*La!;&Sm6@ig&V@qCfS5t!c{;{D>oqVGHF z8OgsCUlrdH-xWU+w}~{g!2Hw19I=hqN$e^fBo>K-#3AAcu|(Y8N7h2=mx#;72JtlU zED?_vP5}2hIDDp_fFT}34L{O*pFGM)4N`gLJo5_%l_#Y$E62W+?pRST_2?3HmT))z=Ng54~~TF=gp{m z^ugcYH{M_TxTB!J;dh29q7N*=>_q1LUWrZ2dtKIRB36GJ1f5;z-<+Q1FMeD(6n>a- z-{2$gCFpDZ;>Vo`MQXVnhB?mTNXv3r9`}Q+#_Df_pmT9|$4N4v#gAJAIW@oEPPKiS z`Qa9~Ilt2p_P0UMxexiV@B51%w+4#T{60;|kIm@U?_z}gZJ5W?$ZrHU)Z)i&fSj7& zSICe1$NJ%?vpK&XBg}1zv2uwZ@CuHHzc7yLZK9v<%|YL7=lCI|1I#iF*6@ZYO!)of zK7>>27o678ems2s{yu{+`f@d3mWz;IYM*A^xR5E`!+DP7LdkFHILs!$ERbdT=LUjK z6#cJ&0WE%h=x+O@%R~J*8Qfp|bO#SS^sxTPmZjOw@j&0gv9)UK+c`e$kim%Ia$q~h z=X5cpHQPCEi>qPQeQxz>vx6lsIQb<`mv6rK`kUFavmSLGGtW0BdC*;k%4O7GFKc;5 z?YF=-=+{tt*P?|3z4M168YVHvLj^mbgQyHdXzLMnLWe=}e!!TCZRavwFp@(l8lu6Y zKs18U<0*DRnU&`v#>>xTH}US}zv8^<+%y`@Wp17E4>m*ZhAI?%5dXtRB1hLNLy52% zI+ZHBIe&e#m4Nw3&naHL@~l*c1B13AKGDD_SntI!&u^tA}cW++Vw z#-D{8x<0ZB2*AE1-^#;g=pT#-o1y%Q4x6Fe)ccficecL)akLpqd!1;YpF-P;VQ(hV z!e%HNB#YBaX*2X~maz&+U^A3qlp&j;w!~nZ?{8r<)QZvg1S95IF(ZB$wt>x1EBZD= ze{V9P&Cq&;(iY&~F05wXP<8}OLz|&zq1gCLmVH>vX5hqshkC(gs1<{8V}tN;iP8Au zOgvO#Mm&vmIYMGqypH0L67%BMFsq{^=Ep0!?J$WQ;+%a7o1wNK*bK$pskIsUI?}~I zM-^c+lwr1de~P6siXLr-j>SQT%~0+b#oC#nvlwlS$h1Fc)7lgyZUYA8Xm$Vtm7wobbstsf_R27rWP%A~_Q&_KuVj}_C z41J14JuI==W++WF1PZd^W1097_2T^ag%qDOtwful3n)I_@j_HD0GpvbcpRVY_^1&J z0YU?~S{tmNxE!*QOPS^~sqWF5Y zc{5zlY%|nmH7d>z46qq$w=Iox+zxDpn$MpFlj8im0-K@cvI3i-8SEkNXN*N6+6xDmZG5q{^$44x)~4scL>9|~%}^UZIPnT)*bJpnzyNH9^2e4oL+zzxSb`sWX*1NO zACr=`tM8WN<<(7V~Huo-I8PfCntv%+R58;3SSZ)ZGghMK`5uo=qp ziZ(-eDjA!he_#Qy8On3S*bL=NW!emFLJ7uZ=!?t}HbaZiWFBpXj%6OO8M?=$Fg8PZ zD%gYc02(CaAQ_RB!$F#hI)#EXw3+9=01Z26N>Zx)H^TM}XWkD)MEfA&Ii zGUM{W^RmE~Q9F(yqs`E@*v;0t=u)Iem}@s|hEl*eo+#w*!Dgs!!C+!9_a8Px z)gw?McRUni_W65JjB_BaL;bPz+Ep-fDhq3d`IU^A3I6SNuHl|{p5 zsNIV(iMyB|Y=+jD{3a!OgR~iHKBk}_+`+ws%}{&7%}>0?@?bO6%GHUEOb?r(R$iHS zg5|+xXeV>bVKbCJ`?MKaWE8L&TE!e-Gn6&(Xft#vQ@~~@voJP8`D;L%p;iH#p=+ps z%}}d=%}{nsc$<}7*9ZTL1HEbN zgK2510Bw6>L)r{w4zL-@FV?gf$|o{oGxTM|<9>`^E;~I8WsA+w3gpuH6r^91oQu75 zl2{!#Nh6%d_idV zvyq++dK9vWotV?ce0hL@=4()o*sPp3KSE-3VkbgFf3dQh5QmU;aruGU{aF~9*qeFM zJsxl0yH0i7$BG#$ger-(fJM2FXS1X+SVvID?A@QYX70SK*HgzTxKFfZ4LBa>eysEv z?wp9sy1A3QKf6=AxszS=W*h({>h8KPV3QrF3Z(y7tHcAVU z-(kbD@JFY)INtrRNw;%P!vxZ_4I|hgiX0lwJbPHCwT6kl!v)tRtS1}t!4qLVbMLe8 zVIKC>2qu9Enth^;zz1~LZ6Wv^8h}L?lIdx*a&jXA-&#;DY&3;n<^iWVN-6_*jcLi? z+g2zU3-cnWiKaG}(!pehf95Hgv{~7Z{m;7j%i(AT&-oH3<9|#a^e^f+bAfCX{Ihl) zobNDwP_bZHefiw7Ipwu;%I8*=&8_M`4UXIv)Rk5JYt11Ht*BqHsIKpVB}bZG&|)0n z3E155@-S63E0on0bNdU-RB95lS63pgC*Fl{PA?|Px?Pg^W%);^dzRHMn75>SQCUTO zmD4nUaeF1|A%RwOX?R-tt+Q%zOu5Cv8AJds=136R4gv5 zURt|grBk-Fs;agUjZ?X}vSwc8k~yoKqbD4j9NF*Cg5Cb)>ikO+iwsxiMv*UXuJ1f~}*KeV#%;@(x&$-eXEt|+gm>f1lrcjAC#->M}``@(`J#HT`VchgzhE9`Jv#5;GSp6R`SH5_0x#{-^!JY})qj|P;H4Z;(U4cV~o{#x)ix$*!x9S(+f7!96NDZn} z)Gl8zSJ#!POY3XqR32P{^SH7GOX+2lR?aok>nYS$SI${bwE!Bl zV)>#<>lD@gejvjIwPkZwmOIrWmsa8`ihL_8=Q?I%T|4~EkU!#Z7+_Thzd9&warq*; zP=#|I6zd#4a^#R?PhNPZEnT{(Hd(c_CON!jadPzHipsfjE9WLB)hwM;SzEibrZ#z4 zUtW^?E*ppo<-(;kz5bc&^ta}L=J_{mAn)OZXGYHmobNir2S6yV#6{Y1dm$J)badbG zPB~bAowpYd7KLyKUWeZhNM#5jWu|f-;JS)ApWolt?QNcanKj?__}w2* zym-LZV*qxGH4lLN_D8lQ`KU|c8KIB#{lufh5^=o9Clzjgf;dlHBJ$aq@u!RDh!=_1 zh&PH4iI0gdif@QJ#4p9pXiVl`B=T{e@;Gs}xKLa!o-ST3-YNb}{FC^N$nVU|x1-oc zEwuW04~ zKsFy0!4sulES@Z$CtfMuEbH&TWTf|?9ABukwLpTRnZfmidc!)S!JXWj}>&3IgOU0YS zheR{x8u`C1`BU+);#j;LWceqE7l}U>&Ddqcr{kRg)3pvsL)>To{5f^J2l#LMm8bvrX5aFE z>&NUrW3br%T<|kvmLB+zQ?>a{XP{L#|M%13J+#?|$CC@waa^3g;4*9${*L2xaE2KP z&NkZF{Ox-~`}U6I(WZl+HWaku^aHY4nBgP`*q^5ePVFMiymP^9KpoovYuyVRWD?FjqZAn3e_{5b#A zU;Mb6p-9bdZL;OK@h;S_AMcmA4f_L^1a9p9;CBkhjN|&0=%?G0`0lYtH%O~z}!5=#FLmOWDBrQLiFj9B~EW==bp8p%Yz#OyRw}0%kke$FS)6tyrjP5CnaZch(~J zvNQLl7d*ZP0zmENABzdc1Js`McSv4W8liCk$XzMSEc3~MZUqA zry}h$$T4u$GswLqU*;OzZ1Z&wFWnt1mCy8y;Ks&RLYp%$zoR5~)aa6Tb`M<}+PJPH zw%O@DXG>^vU{k00?&gfk&f4o0ytp?LbZ6j`QqVSNoV?FBlkEvk^8RL z=Hc5S?)1mpk#6tjb~{;9na5?X?G8TfZeC~d2&0WM3!0I#!SKByi1(V^ zd@n!>3=W)!3ra8>8(?tYWTT4SLMae3reXq-1|~R*G2`>iK!RY1#$$pHGS$SkXEG)j zp)jEkn_qhK5#TtLC)><`s7wIydD2AR**jt!Sk^L-r!tw8x#$$ zX6Bqejd6qTBN~G}@IQPJHg<#8qB0ma$a(}HVPuU7M;0TN;|33f&Wsy81p69Wg~Bmz zkROv{&ml*Q8>Aloxbbf^Lg`Geaf6E?$G?V*af7^)a_HAvs2Ro$<|2x|#)HF{$*mqY z4OTPrJKO&nNjYxtJf?A@8PK+3IJg%fj2k=?@maj`a@=4#@{2!&e;7B&Fv`%lL0e)l z-V-~5af4Qj#veg}k^XsB%!r$TNB!Gd(H}RMZ8GAx!Rt|O+9v$#0+rb}lsy(Xa@^qk z(8VvoKa3l+88~s+>E*aVD+c4Ap_=eDZpCPv_p=x`XvK{90@mdSiCOXYDIO^?Fa8@Q zK1yPK{CXBNOk#&Pr`KcLpv?;72Kj2j_!bj2ra#`6<@BJXU35 zqj6RY;|AGS8aK#{)0X2OSCtS7u7-edgKbb1jvJ&oggD0xVBDZFjevqKVKrCy1>x|p z*JaH@T{&)$6YDi@P#b96pem+ugI0>h*RWm>#ij!sH<)C5J}j|$+~6sw0LKk3XW~cH zi}T~pQ+(3262}c*P4VfDPoR1nH%QA+7&o}Xh=uVqJV0RFU=9!{=ovqc`}AVWO!ICT zH)soL9ye%rpn2S&t@F@$7iRTZ_5hRBu(%m0^?LS5BQ}p4v{{Xc8?Vi8sm`Tw+84pN zLH?`Z_j2j%tUBbA**=QOwZjdjRIBxJDlfsM}ri<#3QL!oG!q z&mlpcy9XL}(3GT9`N#9mCK0z|w{1y;?dkd3T>aS#&B=_*2hYo?zKq({vl%gN@Gk63 zK3_JOaf6LWkucX1j2onYi-{fYhH--H|fm!{9n_}FcmBR^Iw&1uy^A>@=#u?ay#HzL(H^|{-cAOu^4f5BFSq_d{+@L+-<|oX+Zj2kWa&=-D(_`GAl~*QcG=$>@C!l;@(Gw>!0mco^G75|ve3B_J zZjd$bIBxI;rogyCW?{w+PG=o4ZqO<)ZtyWy0^M1ZgemX!-Y$G>@mL0P|tmYrV!y!FbDtB*awFoU@Cy|eXY3%7&pi(AI1&7%*MgE zL0WJz;|6)#gmHscpvX=I_!n|H)`PyrFGMb#KSlaANxo}#l8ANOq_Gv{bmVJhjvK5( zDvTQ(iTq-@f!te>rqz$3!$@Rk@&ma~LK6y76$;WmT-&VJ#gX&`9?=sgq3qbDk-P_x zgsuA|8Z&lTBb1!*vIuoEmJv#XSZ$&>UJg!tKc*AL|aoT5vP=0uKz?EMYDbv#7j)Z8OTvW;HH> z;zBBoo50a-4(s|5*88v)R*zlcxJSEL-28JW-oo1LM<~=C<7RR5S5b|puy*6Fxnr%8 zUmW^j?Z*9c$Jx!Vfr9sKh2?YL@8lS_)jim}54Ot0T37+++@-E**m0=cD6EAQaL!%o z=CWm1LSAlkaL!%oCaBv8`M;k+(6) zCKDsDdd`O1)-d32^X;LajKwfeKM`Exje=&Mh2uFf*pu+{X&LOvt0CQ|VL?cq!?=4` z^021V=zNH#Mhx)j8$OZi8X4ddIs|w*Mj#IvL0H|$KnYg(;w7e8eRbn(1geaHy<^}O ztP$>NxFFa_VP}gX+DM@&(3~QpaS8-80nXoq0uA;lkErq3xCjbUTU5y`#_=G1nVG%g zzKy_&wqt$H!U~^-1nvv4A$(~wkY#dN88yx!SqtM!+pmF1=9dm3%HJQe;L;q4m?rfL z3eo+1L6Bu?Z|+(X9@e3e!XT`uJQPDaG*URSSuwDK*?j@lJ%dkfOsk2UN} z*%+LGrng39hryQu3%#M8#J8o-f_v>%$_yMzI zf9C49EyFa$neO~0(5u1u;?OU8bvON-eceyQ@K^gM;)%f3PsA|0?mjv3yx@trj}nJI zWnnMlTMV3c#0;!(h`5O4#R+HZ6>AVSiybUawQD|N`Fcb4&N{5fh+whU`06zb@N9ve zP^MQmXKFS!|Jb*ADTAX^Vm5Z!bxt6Z*@G#W9hZ{XgUy*CEf!{U4pz7;C3qZhEg@{( zkA>1K=E@U5t#}zC&BD#sVa0Wl;H@HZ`V<&pa+*xAzd=jfWP-DZCKEi4;K6{KP-2P+ z&LVhm!u}BzCODI@)#5F!S)f5GW@Q$u#D7-IHqcDs4y>4_@Hk*AHi?*RsxXo zu~{t@JFcZ-Gg+}2rZ%$(TgRFHbrjWQ``bG5D4PWrR4(*DOz0QN*6~ef&{sYH_zDC; zVkp)Ct|6qY*|e6LO=itL!gi$* zOcx|G7i{i~w!~)3plxaF$=s3IEeVu0HQcWpn>DXi8^(kSO|dO~mZyhVxR+eaz&P!^ z-P_xsb)DlM1cIn4f}@r9u2pkyx0v8G?rjbV$KfMb{eZL5bd>2vJ&mvj;`o*W zF}bB;$Fnl~EjkE%3JRNYj>`v9dg^SWowW$K+a@4(o8U}>6+yReX}tY=Dl32lsReg} z&>buGg{VOaocPx@pOZ{G5bFr6I3Wn8am}>`0`By&1)J1mD1=2j;`jG3eyXR!tuH%0 zyEwAHX$=FDOwFefvwb}SRanhNaLmhAzs*F#3poR9d;APPvL@WGL!*B}SVe#P^UqeW ziUIc5o=3oVG4~Heb8`QH_*LZYaBCx|qP%Jk$ z@miYWoe#gBv2Yjq=sO+rk21U^$)TYf?}9aSgLkk=+i4s<&Q%T# zd9C3LFcb~D{rdDf2&aCRTneGsfKaqOMI=icd@%gd!9i!#I$iD3IxiRg`HVBtaaYl! zVS)UN_6v2!wtbVK&PAbtMWM0qXUFJ%a1&XK2>4e_hKjuv$xx@FP*1y|eCeUCa1Mxx zP(@7l&u)Flx6AJQH_En7Qu~GaqU`Uic@q0SvMAKaJ0j`V8*Mv`P9`5W4i^Vu57X(b zkX{h!X!UW-Dxo*TEaU1C&I}_*nKl}Trs`-~tSt&lF9@~m=oeWOf^%Fn0dfkrD)Ls; zp~i41i!zM2*g8vX4zyB?jNrqZIiY!xV z5b`=<=fm#7*hf0n%mw?yM{YWt{)XWPGUlxu%0~Oa&``FQQ3Q{(E0XZkn9YO0unnbq zo6%EU?;LmNP~2=`?!r9GXz}Ofe3!e!eFuZj#e~0pn4?fz#}ky3lTzp4)C?SKr`0Sr zp6veaX>!Q0&Uz&Lzc^ve%m-S$0F!DKEUvDvsVu9m<1`A)(88>Zn(`%cxpOs@wV2gZ zc2dd|sC{PuVp?R~g2k0)E)J#x*$Hu+qVu0=a(`=@T=m5IItRUA&_I7?7U#?@8#KTd zSMBQ?@q1>@Va8$I)cFglFdHUy4&5T@4m_3a@A1y}tud$mj}_;~m2r|Fr%)o{T0ziOUcnLld|mqGQ>?{$*6@7%fOYhB75y4v!^)tG5m zJ&KbN?R>g=^;yjH;{>ketIYqQX?6ItQ#Rk>|3#=lEsHFhXC|TgKMu`PD9dVX1SZJV zEj_7hQMsAyS-}~set)-f**G7ryaw~2`9pvyX1418djE<4#J$@ADdjs9fLL~g(IIoTm&@D^L;}~`S8~r49LA~%CXrAJm{UmcKAL#Tr3g!zJ_{^u_r6Ud1AfTAoBen)14=B3_9hjMZVmj%(pw_ zQ{t=Q8{#M8AH}_5gb&QvuA|sXG&X&p=kPPeFA*EW_2T8?4dOi_-y?Cm--&#WLAfi= z0rFsxA1)}57x@B%@=0QY$WP(a)3h0RqxgXMv`BMNjQ>FVOl*z!H`Eu1{l($pB#{Gh zm~Nf8S^SCkvG|2({0Sj_Ax;Z!H$WUAP8Mg2SBS=s57Iv``Au=F__-Lu8z<(QCvqek z%aJxI_G_c%V6R<8eZm^2NpCDdGj<)#6XYY51_u?aD=C zNDcBD$rp&Xi4Th}h;NDi?3}qXqqZIwi`R?yi_eO0il2ykM2 z_IdH~b2I@SG@!$zcUnzNkxJ3E}$)|{?OMijnjpB9UP2%k&>hqA~ zN5v1Dq-SY|;47fWBVx zS>n0kX0cJcOT1TnN_1~%*Yj%fU1K;I-t~}U=ztf=a?~junC_gB2LI!0{Cn0IBko5iU{a!L{2U5RFWSFb*uME;y zBW2&;p6_3e2C%8;SU%F+AArY7K0z!OD@Bg;V|vb=AUVd5yi~kOyhglLyi>eiq=86o zXZ$mRzmfc&_<^`x{G+&A{7UqApMY>glOx_>}1T+k06uM?iA>J)+C| z8^|Hi_@{=u*BERz_bG$I?ai{oz_*3y&@kQ}f@z>(J z;`<_p8Z*DYib3ATLNL)e8QB~lmMYM7-9{xcnJ4a~BCI>vG7ffc9o0n_zCn*GbI z^9w^9ZV}AFc}RZVRNRC#Q*dAJFMiy3C~#Ui!xZsmZ`?Owr&>cs7clv;UYup)Z-bz- z2gU_jrSMgP=3HqvIqQ z(BjAOomgsq>xbg^06OM})22DU4G8<&Am}VZeoW^te%yIbq~>>ZN`8F)@#}Xj!u~eQ z<5c9A>f^|dYeZaXes>{1?jP%iQ>;0^I}zqKX37m%*%f^QzjOY=IIa(ie!6wNzS~a2 zvq}e;C3;ZHv8KZBFHa(zTE7QV_7{h+xqh!BjJ{kAm}Ly|OYPJC{*o!(!&!}VNhsSu zpN*B}vfWvxe{LY?T!H?FqMH{#KW>wn?l~m-pgC2`F@T+hLk8n(xxX~qX&CrDb{Y=z z?K<PQ$%pO@ZIC)9_z+jhesy%Z$eZ7o7p3o)^9JNiZ-Swi;Y7yzz7=1`7>qyWN6zcz5SLXYC!gEoa2h+rlNsZ1awBj~KH%c+!O>KPY+X6?b#&%HE@* zSGpU+n+xu7H{bK6Q(U;$`)sSJ!xJSx-}_<->rl8S_F4ClsDZor?vdL9BQCf*u({XT zqqn6W-EMZ-?C5~N#^7f6@ZiQ6ts87Sb8BF8yV+0f4&JqEYv{^Xwx%1a14qILi0vmq z_ZK+W8Btt(Mq_<5<=`?HI2&Ci*eh`e!k!!EyiCuHnn#8qj5#!aB4Yxfmmqn8h;cr> z9ID{>`~{2&hRpL6UuFg;wq0#hkxh^SS9AM$`4>BaDHhLgD?8GZ;EhWh04avAsn|3bxiJXZpbAj8n$+|wDRKlISh zJif;8qQP5GdfgNV!ClZr zgOMA&N^BFm3005Wl)=$*v0S8x+?-3j^=46zP&(7oMnUA-*p-mu3H*y(AGsOo0H&Gq zNjP##Xe6|>Q4pAgYDI4KxM{#lSiZA82WQeo!J{A!z!GfHis3*jq>Z&P4V(22^2?7M z9OavVI451j`sJFp1lC4DtiMVO#>-I6SpRfefoPnLiDLcpte6o$9~sB`x3{9PQ4kxD zJ{C6F&QOjWAu%h?nZ>aqCFaFH#4g5;l9(UoJBZjYiSVbxZHG%tIywAI7IkCe zq61Mzd^r?b{RGb zo!Sy|XNf%WGUE00}bVxw_ZELPEpjU^ie%s7p+c)6;C zQ1CVguu*U^Y95W%M>+p7{w4m!mS;1}f{tP}SNH|t@bEgGbr$M6KXzYqDt3}K3S#%? zXam|Ph&|x<1llNwJt!#}=Y2%%p%~9;+9(*v_Iy~PwNViJY4#natL0&-lIErx#=9QCBt!V!u>D z)W$l2qQ4rgra)-wGJtFp6_8gPdusG+)#$L}hPsQ?W6njHijfyYhL4Qlzmd5$+ zF7|d>CxA8z;*5Parv{*nf-@<;pK-H^ogQD$J^CP%XE1FP@H&9TCz{ZbBd_x&F z3e1BZd>b9lW`vCbn|@MaD`nUyVB^rY(G<$CQSeEO^7I7Hs~Bt)@KiE33V7DUV55Kq z85;#BQvn+V6Hr5Aqu?Iy5^NN#$F3S11$>Z-!A1ceD!l?@qkyM^JxF|WlX8%Z$jad$ zaXxP-xEtB!xd$Q44w{mbD*t#EAj;;)ZrhRw+mC_5_%dQIG$%7IA3QHl_hnq**^gqd zQScsiCZAKZGhzj9^kt+-m}?1a6i~o9p5Uv#7;F^S77QkM2F75cKs^E_a>qkKW}iP6 z`DVtBa-;2Vr<=GGsu*k(P+(RuHZE)wSUH@aZJ-!z6dZ@z8Q(?>9E8NGcH1qnwSfrV zIVAW(Dh3+`{54}%wB!(jjRJcdg9+O5h`~mIc|idi1&6cNuu;ID3EC+56>AL}1$HmS zB(7wBuu*W0$!}6(3>brrg14b(KPYE<*eI|k-2B9^SRQN?Sh+eegy~_Uz{)EV^H?5i z6r6&}@`|1?Pg$^0aK2H%Mge{H#9*U%B+-;VWWWZ zRlZCc1+h(m$n#JnI4(a18wC{D=09hf!A8Mvj0_tEysA?$S;0mD4-QWx$?bN=P6>Ft z613-4Ck7h@Jh<)oaykYZ1uWH;Pm=>?BiJao38lbB0aYDbUIt9>MhBzGk5G^&dIy&$ zpMNe)GkW@2Nn;;eh=9opHVTTk2e47VD<5nWyugD78wGsZ?Ydqt$j>{t9~+I$I$eV* zhFsojrol$R6Ue1=U!+@;OrS}fWGno0lhZZSU|qx*0bo=A2`w8qFOp;4 z|KKugzK5S5$?=ewCOFJ^g$w-jFj&wQyAW6(3B{106|?LDd)uhoVKP`S3{~Xf-igO5 z8Y~#%_GIt~=nlhL@LTMXd$^m;5-OmWMdj;ksG)8)t8q3Ir&Ia=vG*PDRTbI)_rCjT zk{8n8(S1Myp(K#dS4wD+DjiXfkdOqTq>zNBG<$bxHW0&NS=%aN!_JBY5fEM1j%!!c zRV@EC3$FgZ-??Yry9pqm{`~F!mdR)Gopa{QnR4gecgvYG-0{)uYbL!3;&#Ma5N(GA zgUkdLe;thH5z}am0e=SxEY2@uoKUH-(KUyd4c-Uu_n_%yB()s&qh_wn{1S{;$)sz7 zlWg94D7qd|xh5ED^R|F~oIJWA7-}X{AwLK4wk(Z}g;xYs3-=i1_n@?;IKp5yq2zcl zMwhpCQSwnR9zcxvPuK_MS76X@avBd593!YM@(%D+#55i) z_%=|3@g*4VlR1o%C*!(`rj5Y3(y>+=?JwxEfMdzc&!&;d(*n$V#YMXi;wiK$oUIo zxN&g%91wp;f;Y%U2Nt3%#tH?dnF-@`0T;#;tDNAt5J8n{4yq}+Mu)F4lUXc=?=8)I zGw~7@^FSG$HFst)=CtSb<|9B2Q^iyhInPc0D_~-d8TYuZaXN&iA*#yGLSg|+wTr>y zD`nmMSIk1yW{~dR)7v74hyDu0^d=x~LSh4A`>r5(=ky?=(e7ll;tV9zzY1!YZwC8A zL#MNmlg_=-cR_FmVtPJ^_mOxPG2`SBX&3*krkd-_;5MrH5;=V!_&b(-55!m`MkBWW9z-z`g@|@Tu0=w5 z9KL}X)|x?Ig0mlILvSIYYQS8&LdyBFFR- zrugr3M02+pe3^Q9Ob0<|0HQjk{6aDbQ61A#B+f*%$Knellqb<|so@nf7>ioeG3~@o zsK%cQ>1BwHF`%@?f3+<3ni(99VrmTd73C_#Xz_bM-5n{e`mSCe@GxK@zh?<+WZzYv zw?UGYM;)1+!9HWjB*%-d8>}s$OuRjb%F}V!KFTvosc#60)=_)&+dez>n^LgNv6e<+*WY6t-vmGkCe&g zX0xs}TKeRO^jfF%IxP*=hV?caZhgbV6Ois&UXevsHZPzcvPtA9fFMT!}R_Ayh} zn~WuXW^grgM_tYw_c8N-)yGWRSaYJ6&THDW!2W~d%*_L16U`)Za_p&|Q)0=7YtXD@ zaa_~BTQuDvB0td^mF`G&xR$UGt_76Gwc{XBTo^J2XVj72Xxx*#>aJjQv zt?}ob@u6Jqq@XZd?hq()XqP*^l+aj$7CP9+jx97!3mwYGPFU#~PtbazK6b!lFtMZ> z*Nbc<9o6#I1q;mYTgrsGhcTuR7?m3xCf-KGGWhoZ{JFq#aCmiTsldAzYsN|FlfLjpj7P||aO-f)A;VC=GTZC^_azZWOdqgQ#ZP(^P z`#Bz{jnGsj$3jd67ykD{RCgN21R53cC^$CvbQw9w&r!@VNT~oy-R0Vf$3}}q6#GRI zs+1&;8XOl83RH3&;Q^bw8xW^z7)RicLsm}-$AbI@REIW?M1jjy+40K(uh>a~U3N;e z?07I$p#KR=-KFyL3y#hP!0mRDLr2w)e#1#J{`3*V=uw9NU|UU=Yjs?(Pu%g zF=dr|(ki!BqG=vxYSXmVtZ5!kR^c@!sPeixO(RQ%fX^2nk8=@0{pU%-k-<5%c_|Z& zIKwt8cT^4@O5t_mqZv5v!2ieQK?~qgBcMdk)v~=QU%;g(cy|pM^DuWy};n? zf~H58GLeG_P4FNA|5zlXg=F|^NSura?=S?Z<gj97KWAsgOpAfN(n0ZA)OoL$PF zL{?f2)7w?nM8ZpmxEz>~3yqcoUxhfAOH%BBdKC_b62#Vs+V2F@w7|tM5qPdB_Y^?8 zU6JXAVS^rh!iIVeQ|~%} zHkf*v9en+;g(Gv_GIOAeN6Tw`{cc=DF%srL$$?K3&A0p%74aQTac?BY;nO6h!QsS% zksJ)a)^56Zqze$yn3wT<5DhMJ868&;w@C)C(T8D9K$acUmE4w`qIrgS29i9%9W8b; z$7o4QNjWbAksMQBAROJW9L&hbxyU>}W~8x}`gP*Wj5Df?m>+*^I?u>SZ58?bwaiV(+okIGdav_9 zd5%!hFe4Ac(c|uTLU!y#ZGH~@jE*b0VSWL|w~FcLF&Uil^{=XysdF527_JU*3u|9M zG0)U2=C2+vkD7)q75Fowudg~!Uq&^pWt$`6QiNNx)HOpB`c&ZcFw%CUHJ`l5%s{$Y z;xZsFH9GLnGV1Gr=JSv+@)F5I^9JJEh&ph981-F*=5v)o0wTwRu@NHstj9#l>2c8g z*L-3Qmh)Opyiw1M^1()<~-O3I3iU%C_a)T)J5 z$D#!LA5Wb*W5!f0!_O!yFDuI6#+Fmne#gJw?%apos1eIdv%1@^bLa%1G{1UQ<}6Ou z8KqU&P86*IiKl?P!lL4QI#^rTqt7;r(8 zXk7q@IdN7qx+s|#h9jJ|%G(Yd?uhFhPome%M9J3hq2qRWENh$FZ0Kw%N!NtLpJu z_qxMYN*E%s)+^Z7UC?KFPO!GeaeML<_ymFs`1e(r+=`re zUh88xZn07tH5{OGuc)$1eW*$`YS>k0tf(>@HcasZ;cTc2b~?Ac`vkjq>C6XOA)f3_ zKA}|xh|Wz^#eb?-@os0uTkBVRk5v5U`W4^*lNC2Y_nTQ)v-^!w@ITpWeSNkGH$Ih_ zo@A>*I3tpT*BtAfrJ3q*z2y#jT;6WFZ=a(C4l|nGO0XS-Z>Osti2JSg+?kosjpMf; zlJuPf=R1v}qxc29`Z$MpRkdS?FNSNMIz#-q^z_2|J>7T6p0<`DZU`4paLE+*BzIPQ zc*Wv0NVINP#A#r~hT)*c3g95A5&5&_7?Il-*|YQ&D-+#rtGbQO+^5*htSz>z$JLe{ zR{eZ%5oQ=2{g`m+6R@f?!{~ixUELm+J%9&m^7et2SnDPXmTA?Rne_aVmp6XY$N?h< z<9t4%3!uuP{6bz-7G&oY<{#4M&(HSsgW9nfH=XWa6LfnUan`0Bs9=L@?N0(19e&`; zD~5v?dfO;2!(PZU%FE9zf%l@Bv&#$eXV>xCGq7YPE@QSYqWQ{mjP1Bb`C3t)hLEjx zJm-erv#<}jf&M8!9y7}4qNLg}-Y$O_mq1XE)q^F(HIP*B8+Ztk&Ebnmiz;UpmCaaa za98I+Sv`NrHqGIT(is(V`_90Y=0yuKO1puso;A0$09XuuamBoD8C4Y-g;_nwnO&Y= zoq->;zO(Wx3&F^*oH45}er)FTEXpYDSX>d#m{~YKzp^+ZJDf4PYdE90tULqWLP}U<|%T#+%OysWx1e@1m*Y@==bN`8X!)OPC14UJ=R zm*oG%FRJm2eGAzRrnG0QpW!G7Zg|S8=&q}(umnHT*n^&D@x%dx<#!vWLVjs!KHU(N zA?5H<#gn08ynTKZyRv9z-dxl&Zpe81phdj>@WB0#x)1uf4zJWL z=AhqAomf>=SvB>H^0NH0>MmJRXO>h?9W-kEu8LG zz?F%=1ZB!=l06;N&w`PM16fftqolZ`sL-A^{IM%8hoaf}Gpn-U0jw%-#)5p~KiWkR zUL4f*QIyWRe+hhAJdBT`F|M`osmJ{j#p|I`Xw_L+#HZ_|dim6~7Bio3KZq*@ zuMxai@Ls{qf=>zV7JN&Pub!xfFNKJF6GGJfiJAzl{4;>xQRtq6%KrlRrwYAPkgE%* z=LW&s1-A%p7kowVeL+5fvz+pa0BkArI6>v-0Q@qcm45@!mkYgC@OD9N1V(+^1eG5H z&@{d!U->Tpy78z_Iz=#5aEKty*qC1+I7e`q;N5~WVx!#ig6|48cH8`Rf5u3c+=Pe-eC5kalvE-y`^U z!G8(T=8gH>ZjG2B*jI3rpz;fV{8FJ83tl0(PEf7mhujlF?-qPl@O-=~VLdAZ)rM}M z?-u$A!M6m}u58HPFLVsP)UkYb!6AYZ1&ajd3SJ<1l_0I7SpI&&rv?8isMe7q|2v`m zu?Sx^aH8NW!8t_Cjk$sgiRjA}f-3~CCPLo^ zp>GkqL-^dAoaG)7+#>uPLhlxQSMWo@Pl?d`525!9#^A@6`r-vo5X1(3ir-bRr{GC~ zBLt@i<_Q)OQBQ@?)q)F!e}T}K2wo}tHA3GYc%$&|7W!Vne|JAc+;h!^v7JCfoKD2} z77CUKf3DCA1(y<0?qbPbE&OW**9reNq5mX!FA?P)mHchO-y!&-@b?J)uHa`x%*TC# z-wJwg`@r@F1d{|C35JO%mqtXrJ%s-|!T!P@D)dOfQ-~-xRq{)PKSyw$@RtgGp5T>4 zlv^cujo_`4f2ZL6f)5F9C8FFm!5xBoB>!E(PX)ga{7&$IAnenWo*2P+!Bir~DP1s2 zu)E-3BI+L|I7)Duu;72HXLo|gn) z5&T^8_X++}@Lz&)33jenln-bxd3eFQeOK>TX z=Y!Cf3tmHnp6dnI3*IC7_X|EQ_@vY0=m*ktcEoT1`h>&Y2*hH{{ zi~MD*hf;g<6^8~p9h5AdM*=OEqJZq&4RZHZWO#v@G-$Z3+@tpNsz0Vs9&uH z0CFp6(mx1tF+b^8!N!8k1=|Z|2zC?fCCG(QEI(SXSnv!%?nTRdwZ0B`j?i2!P5zaF zD+RfHiv0To9~ImpxI=Ka;H!df3cfGMWy93Nl~+XVr!L6nLC}eUTxLZ&UGR5;{RFwr ziuvOOxx|X}8G?%hmkDx>74x|WpUCA^#5)Ba7kpBX%c_|Fs^Hs1JahhC=&uCHqnvV? z0SuBxE;33442Y3&b=OQA@AEXdVPq`w#Bf+y0A1i9vkbVorhYa*Q^$dyf`Ckk?L6X`Pq zxqgZCQb8_ZBE4ErJ%@w7O=vDuV*XY^u2mwf{09S-|6t(Xh0j$<%nu5t5YZQ|O(MUY zAeSJKK1opfX`3oE7a}o#j^Me17Yf$*$HsL;l)qn)D}_k!5c~@f?RZV-w*=o8zIq=3 z`C8%sD10}c*TMG-HXuR|rkz54UjtIf;j&@N3+nry`u9Cy$xjvRBG^q(y}v}geS{t= zsPBWu2t7e?x?rK;EWz1=6@s+vVtmhOvkawowgY zAf5|!(0QZ4!0Bb=NXG7LEDOdnPD9X`no1wrbvmLhgQW2QCI{aa>!9<>!O&^uy%EB7 zALpqKI`2#{ob@j22kTE%#ClmD`$1fSsLLQ}{G*j&gqe__^Ueb8)HmxSJnw-=eXL&V zTY zn!aIrxGKhMoNKiD@w*>>oIX9_u?KJ-*<;`~ze5A#@E*pXGvoTfbqa>V74bzjfcH`A zV@Jov=qBA_Ek`M=ro9|;@I^L(0_v(A@kMquHQWFxSHu_DD3{60Q}MtzR0 zg<4lGSeE!4<1>rZI9dI~m9n7t9P3LN+vga3S*Rz3xv0wBy2*P`;cGR=xA*v$F5A{-vhx`YQ&-z?w# ze!6C(Z!zBkNm78m#e5IynLyuSzRg1UgDp&c z#eBP@BHOo^?*-|A?OV*ZTk7o-JU~@{N$jdrn~_p-)*ce2dw1T!qidmFz<@CF#VhVt+&X6JVa zWs!z&G4*f)-(u@oAAF11`Mp9dISTMC=H){Pe2ej7=7VoB`%;nxBj7UQX; ze2dZhpbx&qc#bIFVyBS--(qxrqM&ITZ~`GL+V-r-(u=>Ic5Z1LHgiZ%pO5^=rZ;nzQtrlphkAw zF-@GWK^M|X%uB0l&QqcEK>y~kq!-(vikpl`8FtQx+>>|P8F?P7WO z7Q0mG8xtb>;9Kkt)K1@G{U{ILV)h9)E7XSa@GWN36`@6xhi@^PUJ&9-G#`A6os9Z< zMGyU+0`M(1O)=nG>^4fkw-{SswOMb5YAFHVVpO4gixsj?_!hGn@GZtSv_AM2vl;L$ z=3=klTg+y_w;12W`rup4X27=?yN2)@N$hbVlDk=5MfWkAhtOfdSH_qchYH#d3m>2rZ@ z3O#OmnUCQd{2dai0q_A<#vZ`87_WTrE%qQQhHtTw}^JcoKUMG7bI!p2uzfzYFOm z34yD8u`#%b4Lya@fopszTOr2*eF2&S*ZPv~g&1zWLR-*|z;(W)hZOA(HDdl6U-BJF z9v;NrcY zERnVGo6}74*d%j!B3pC==rxF`Y=$`^fzMv96-HWP;GNLj)*NGfV~%fYjy3VrTTh4xY0kZ51y}Ex>0w(*x1-%$(g!1y)RpH|D%J6{7((sVd zf+BcLC=6pE+>D~Cs`ARJaPN%lE?K=Z=5)jI*)z&3+y9c)yZqJW_bTT;@x05_f%kU< z;{E5luz2O)alKU=-B5+m`&5!v3_KDz!olmW8X9epkGnHo!B++M3VtbgK+wmh4(Mwk zsBAVtD;rIqvdIMU#R=v33W&H|aE;(Cg39I+`MZVwo8T9Mt#Lce@|^|y2_D}&-X52a zaVm0r{vmjL?|6GW-r#FkjEe^k`^1KVX@cDahX^X$Fvt}NJy-Ao!K(ys7W_}&JAOOf zq;Oo`5d2hdzhEpb(adim*ouh9(lo*LL|oSO-tjp?4f0cAo8X@W)$ao4q;4PBN?y0$$Lku(^LOND+j`NI3(i5RGmrHA{2y-g zg)#cyvis_Sy7AK#x#Q`EwDa8@k0(PXL`-iZ2a(~vrg-5Gq}>f=7)hUoNPRktLE>S| zaUFEtBru%%9)-SHm@m}Fxux|LBdyCIX>cuKJIpN|bROrkPBSkH#!pXZAxB;{($0EQ z!>~&OkM)wT>%9nRr@npA7Y0uUop&A>PJJ(j?Q??q*ln$k-wkvbB#i{z67t;9LFZi! zhEv}M;ix`bh9dfS-=oVQskVCg-66*1R^&PLeH)G*H{O-%_VNCS`ZymLPD=!h^IHez zF>V#qa#I=~+CFTz$N^M%4RYz40J2_&9f;2MeIJhYmv_aweO#-9_lXq%J2W{u`><}1 zqenr$sYaKSz62oaguX~9#QYl-p`v5UGETX;RQ6|@iAZXC`&Y!Uh%mxdlJ#K~1ZxcJ#FY9HptiRYq;k1JvyHXfy1 zZ=<-YXX7a-4qLI)Apl#k5QMQ;#P)0K;Vb?w8rAm4OxdAzm{y8y+seOMN954I1BL512r z>>Ox3vVGXg)ETu8yBTMh(>^RfC1M}Ol|%>IhwVlQ+dk}G*_T4;x0|sD0Qe{}c9MXK|`I?8D}; zQ$JxJ_AR^Run(Kb`W*IQUy^p%hw;Y1X&)9({SN!EKe2v?eb|jG@30Shoulfo598uC zr+pYrK%DkrJg@55ht;wIr+wJp$Z*<+y-1Z#`>+b?`1iIC8_!|X_F)gB15x`hbuDq& zhjn209QI*cMtWHLFdC~I-ahP4Eb6ciyNjw}A69^atoEK{;?VYCT%6~$592<~PW!OV z?2yAg>|P!Nhke*WR{az9VI4Wo9QI*bd6XUYVIQ$RhkaNJ$~)}C_Od>weHia3>)40Q zrUs{dSUDw}_F;Qjr_(;{QZk(OVb8G_PW!M;lyKUIoxpbdO7>yjv4OvieHgDg5&N(w z*~Z_*KI}90AZj0WF)Mc3hrNY-*oRF*>soHX@u_DY#+ABD!`vR%2qPM1_%uv2*oSco zW`}*)F60HU_vC}XL)nL6he>50HVmZ$*kMvxTERZ-YN!cdhsiqjVc20(+lSF(RRB9o z+VZdu>wty^u*0NnA2uJ9dD3C*!-m$i4`bD^1-k<+9Evy)(Y6m8uI$6k20fQNHpv{J z?8A8Jd$v5{=eWo{J6>1|B%D*|7?@3Ut~k6E(=a);c9b_-`YvIwsbmf z{sj}b!3E&XqL>fT{?E2sb$ZPH`A)n4 zmkhq@esBDR9=Yo(t7rU658wX{9=qdkKY83%3=hx$_O@b2aM*3ziecLR&)bTP;qwSS zdQKB85}YllY#EThROkx@`TCya)(Wl{(hx5sh;0P3 z1qTSyM*#De3SKU_R`4D{zSyALcY+P^l7n=rU{}F`f@1}z3tlgHhv0L9uL&Nv6|=|l zVX+O{E_mEl%pRA^#rA8J;0D3}c3UyN&!lbENWt-frwHZ=&Jg6gPRgt6EKpr%ftL!O z-x8Tm+ZCd^&H^_I&9}VdKO%^?us`Wn?KiX?`_Fe6hOumhh_}^sY`8#10xs(+w8DSN z;c~13ZM~d|PT$Bi}-y1(^p$7aE3>S%1oN{-TY?1Q7U z9c%39?@!r|#T}*XSk6(}j#Xg(jp9H`&|`~Xh@3;rN=N(tE;0ly2ivjkVhnb4wqxD9 zbyI@jBioKmN1X`uY{$&$=T3L$*7Yi8JTViK&c0T-O|D~zqr+-Cr>!5b$7&N?#I3*a zMyz9FWz=Q*c?!B*p6+D2e4QZRa(nuNvXled(M<}W$L02AP|ok69~qb57epOmABH@t zvIZdsHetNHSYih@nMM8XBx<8a9N2+v0?Xs(-1D9ajo7^vHNp;TEQ?*h%u1E^GRp9Kv&u!R8lstCS> zp@JRQ`-*fM)~8f>hsB~+CewE}y9Igl6LvayF4O-nlxV=Tbp!HY2gU(OSc8AG1ACKo zJOUB;31b>{h@UXKMt6{FB47t*lm6fticGP|xL|LTfgPAlYCmD`Dn;}YHW#TFTF`uj zsQQMwTVrTw2X-N<4c@@Idk1U9+}X zU?i2Fu>Qq8}HVk%P94zq@M#V9?$YzupJnoSo;3sSwno2vcvp@!E4GB9irdiQY zHgmqN2#1HWE+GqTr5zZ*28*9CDIk8rq+#MG%%=RoactK^fk6P;fo)|~4+|Nw13OvO zoDdW{FuQEyAn)B^2gXsNpD?ilTZ!hm;3uptkK?l~9#dp$@KLsUd+w@tVo0(r9``;h@UXK0}(%AcD;Rq^!W@wVHO`*+T;YMl6*NaS&39~z7gihyRzz%G#>Vi9@ z?Z9l>A9|7%!%vt^$A#|URD&IuT|OanD=MWO*j>1jpr5dE%EM2Xo!=!CAPqaPr&NBo z&^XoyJ1{%HS7O5Dc3^h?(9o4E4?8gB zG`Y>l&=)-PumiK@$AqSHSm7s(gF`=I%6sMbrU1Fgi98KVdu-?1S_m2EcKU6v@WnAQhrb z9{05nNHMpA!wKpTB}*UAtxAaHIBlasDE|o<>gvx~s7_{FK6qZX(KK3jDTfhuV9U^% z#xGz@lpR<(Btq)i4LdLrILAZ%IbyH_vq#V!>dXGaPngUI)X0u|+*IHA0P0b8V0@Sl ztw&SnCrmxrLlr&#(+J6;KuYge_B|M(7I` zg`Y6{IJ!fr>=5k0C`>=a|7y*g{3a zPZ%$XB$O)n30sB&JduR9{e;~GMl)V@Xa~lF+w4`g5q4m#)vo_>T?l@{?tv)$gpt+U z>Kft!4dE>X1K@C`)+0yq0SzXzk0xg3-^%C`IB!y1Em3hs947wqJ8rc%KQBer2x z=IF$Wkj_OMNFLRjV;WL>Ip~?>u?gnbhHL>ZwYMUsCgI=dP?lyp0!!15z}Sbjrb%N& zKL!ibp$)xKjo8?Ju@)W|twu)Fp%iX+B?nJm*ldd4t8h!33=#UY@`eroT`?98mGVsmEvQWs~&G1zq#cg_B{@B;Q?#IDPOXH?q>82p04 z8JOv{79f?5_a8sy3G6@1wo6$I%_^Tu2TV@STg9`>^TnJ(ZBk!?UEWJdE9O=fW1osbnyXb7Rl!jbe2XgwMCxB%cRu-5GopLQ=T+qn8#%lCqh(bIVY&ysWD8PZ=}VvnMal)~h$LuPCo7S)ev7 zS3a4Jd-2LUIxk*%dGqpT&&5{n72T_Fl#cuEDypo)6pUC|=F!0yoMx3&6;>e`_1y*D z&v)5XcYZr8e=xaGUlmR_I{AZ}#Qf@fFy_ygRRH_8+2sW=6m^`Nb@kLW`mt60*8aYZ z8+`E!$<2DIW|db~*Yk8%TvolX0{isf=$=(%6qe70Ydm$);xsFxsT<6+=2jIIs;ljB zn=RhC9ry2L-^>1*{=GP^$L!zB{^31>e=lBjqBdK6GWa?Ey*i;BZFsT-`wQ|}nfy_L z69i8clE_yg}zAeD#4os z?-P7V@I%3G1o{1i^(G321xE``6+BaruPZ3OSy1f>3i?B#>C>J07G9MQ`K686O0bLI zY(Xx*X8v`8w+hmuJo(QE{#Eb;!IpUc!F=@*5ZG5}e%B%Ybiq==#e!D|t`q!|;A4V2 z1@{R4UGQImLA=7D{uY86f_(+~CX4xbf)#@22&Ve%e6_bEw@nRaZEoH z+)G5;z89oU;{{_zUh*${Cz==fqYDBg?wp3 znsyn)RKaw?&VpS9a|MSBjuo6J$oGuYQzdwo;1a0^gBL|V87i?Cj zpZ6P-VI+MTqSlS1vJpHJb6*FYHwg@I!CHeGp70^`omWp^F9`7*WZtq4n|n)Mbz~wnHC%f$E_1ZUw`sZ*n+#+!`QH>!TeE%Wyt0@XakZ zj?sa6j9Ue@+`FNp^WQZUlPX;+1F~L*9f;2MO%F%=i_Zm-_U%C$bGZVb!uinWoYQO@ z1JN-I#%9PJjsLDsni$3?rNREE_3_=bK8Ki75k9O9R_{al?*g-nGPbh+XLae)qeqW$ zIIBnZuGxxzWE-rP`4JgENp^qJaeju3jJ^9tKfiJJUUP`|Y-3jY6+8EKbIoaft>4;b zS>6>Vt@3=8Vp?X$6+>6Kze+G&pBc%y%R8(Xwrcb~Bevt(+-t|zrgR!#n{fU3TK5ju z%JF-xTRW@;-O0Ujd~F}wrvG1F6+OJ7p?t-4~Ys?i1*%i6g%3ZlH=DwHv zRIYoSxn^f=cq8=Y8trx+@XQQcGj6YY)}FooB-gr~wdot5KHyDC{K^Kt!P!`0UHkK_!l zP3W^{Z_1DzDBB^|L`x@cw52B2`bX}powczYHM)214UOf6Zj7X1 zu1>#xW6r?6t}bRD%mA0QGJW;ZZ{2sdUo-T&n8EE=4qIccd?)wi-0itvN*` zJle8x`vF%ZFAKfyVs1MSAK`R`^fpLm&qVuYHi8cCTJ+z2eU7=-%xFHneXg-yR&`tJxz;>!;9e`f+p6T<-Pg8XWq#yd z<5`KLyRs_xmfZI~w$|K`i+Qxlv$9R@n;+xsUfJT~5gQ--WZ&<psxA_(>hH-Q7 z?|*AKAeJRQFi)_z>kqqdxPLK3!|^#1}|PCg7-i%`-vs`2Rrx91wvE;wYe_c`v2|MsZ zVD(C#k2GuzXdGnC!N0mb0N0_gX`weE>G5g6JNxR(mS3eE?e3%&WUcENnjqfvbD~S|1<<+fNQ! z!n61n@d5Z9x_j6?ViVC3hYvtH+Hv>*EI^x&)dyfUG)8;?(w@@c1JF->(LG{6MKc{f z0Ee;%Q6GTg*p}!XvCor?`T%@^Wura--)BWpAAsE`?C=5D5YkZ}fVAj!_yD|sW8l~$ z_B>`g_K1C%^iS;(y9~8OeE_QQj`{%nnk|d^0DPG3j`{#(!;ZlRU>uqf@d3Dt;}!J* zcsZNt^a03Omq15JKf?zg-=jHfKb0NsLAIYu&;VDPgy3unM|}YDU7EuOAa7kAJ^&Z; z&_sOz8hBCR*dvzvI{#cBfFY`i?h&hu-45#mkQ;?Md;mVjnHlu~$fbb}AAmh69Q6Ts z1$z|r0l0$$|FiapEkQ|#55Nnl*Re06dQaa=1NWX@VK`0r&w&#<52%z3)1G z0Q#6;-}ZCAZl=p{>=CPMH644zX0s@4KlL85qu3#b55V_%3>-cHxt*!g2jHhH@7N>u zWX>~(4?r5qJAD8u<9vq?z#Pgud;luDZl@2x@f2|G5&Ja9(dh&5dP+Eb0P;n59Up*P zWl_fm;C@OteE=%UWTy|nVeI#>=ILmN+0V8PosKp#m|x=l znbx8G)0yfER&T^ME0J&JBvO4LXnH1Sb1lmcNMsZE6UsNSZMf{o9GJvr@VufZewin!vd@90sd;Mt3~bmq zR1F<3ul*2H3%VHQFva3EeY;|1ftAedciW*+{GQXcARDX@S>|b}`OI%dViNMkAg1Os z{{*rw0J)T`$z>25t~B%0&RsSSa>G+7cP_@@48+t^m0T0@a?s|sh~QDKC3)Y0-b3DG zjKv70j@xEmg_!0-=gpDI<6EiwzCMpsAD%T%wUUM}lt`k&+nP`qn3<|%z#M{PQLxTQLh2gIu5r+{HMqEuV5V=u? zyN1LBL<@$;HB6kQ2q;9$RB++DmI|nifnAYtVrvpm1zL08VkVZ`m7^b5t0i;H@Rz z!Od$(sCzWUfJPEg2HHb{%IzX(4+$=?#gM+WM7Ky0$WQ@SWIJ#W>Kzl8(WRylT9$)| zIl3OOMJ313P9g^pT>d7vMugcq7oG7Y6I>T6<#3tCG(AZmz+*5{amN!lL0raM{I4I_ zk;#Y{D+1@WSB8OUdy1{tyjV{$ovFtdUEI7Ff-0cN2vm7KqG_B;;ABJN2=+la6--Cq z$gwKZm`qr%#HSK$aW+c@TYFS|D#ceS@zV&l_*9XWGC1Ts^eWh_(*V5xK#vJjf=;P< z$MhCdgHCN(%mhzj5Kk>;!tTgK$H}uLa`Hgv(Z%}2Q6=z?? ziLt>sb{n@WW`kuKJgTMvZ+FlD0%w6eczv3qeicwP1IOL1f=%OpA>z4+m<@#0ki@US z7Qj>pBS~O;p%N|X(>yxrWAvz_tnLJ+Is3wv<2)d+-A8pEus`;6;S{J7EQUIqS)h2A zi%N0;-`hz-PNc0l&6$otK}ba#I4#=132a~^)xhxtw$)`+E+P(A>}dp!HdGMUNc2(9 z5peZM$8x%fXoe1Gf!!vVskDir9TW~0f!7Wk-bWWRF;F#i9Dx@Sb=aA(FC{-QWp!o5 zmWZi{nBxSFC=_jTUJp18kZzK+MQ+xJ)V~)>Gt6`c)8^w1oVWJul7uVfOyjjg_ zNZ5UvK;ZAE7rz|iyEd(1n#&kXVdV}vHB78l#GIuyOt52^S0laI_RmX%?%F)^ z>uMPg)b$xC1}}jYoix z1dgCHIO*Q_0kMovF^(?tKzvY*CS*CTNANxRiM(fV{rrYGQS z<%#oJSD9uX>w=}#9-kHLgOb*iOpm9b$BzQBRw(T8TP5MnSsgqcZ>wZ*lac7$5QWV? zWHHe>!_Gt!2`e@;#S?3Khc6F%eBLZ?$P?4d<4f;21?n1rWzEU#-?3y=$C6c6e5O@7 z*-Ff`%EQ+DOe+vp=}i1@)6pvLgThw4Icii#lq_faQo^2~RT&0(7In92=n0}qpSNp6 z1aAZIF$O+lvP7T{lJS{HRc0bJKb!?>AjonyB84?hVa18nR{3zL%9CQvUCv^xW46?h zQm2j>D^LuHK-d!lok*RP*)hv%09|F_Vk?R4YStVVw#qW8wt+e7F=#uJ%*Lu^XQDl5 zJhSFkqslU>N$LZkbxZqLpWy(dw1oslIo7&tsp$uLYKL#i|aZV;VH{G(bAmniBRju+mijKuw04 z{)f?)+25(I0Y}D%QLCpl7PH2zudM( z>a5=Ad}ptj>9KM=4VrtbR8NBzWO-s!Fl$Xuz?z%M!!|zC6N5f?#N6eM$ zGp&!8K+v=vF*Ez%Qdz}ST3B{cTsXU=pfqnmc|{S{qLi2A6)h;K&daZySygW%XvYc` zob+5r^z*%(=S7_R{s#We54R?+YF0_Hto$kc_gxR?xXK=150_C~T#+%OysWx1e@1oR z^5SBnV)Wc<1GA||H@%9hs%VBWr$<*!9^Dc-EG?`aFZ1EQaI7d{l+Q)4ayct0Dnb=#WB%;uI#qkw6@=(pyq8*zRWx5YAfL@^UupgV zu3*iZ-J@H++NmM0VD_165f`p^GM$dn&-r22?CEov6V~=^?(m0Rm0wzcm0}fxxdxF< z|3B{=J@5EZxyqt>C0vUd&hFW>d+*+~G{Q%sI{wW&IUaxb^fNF%_58pE{tJBgbA3#agd{H{=)`(-iqRGv_LAexHFWiEg=XXz7UdNd z*Legw{F=GQSz2KdKn+2Z|d`a+C!M%cC3ex8k>-S;Mi2QU-Y%e%kaGGG5 z;8}vp1=k4PB1k(4>e(&$H^DCiTjNoX`JDy(362uv>oew`DR`FPC4$!q(vKkJ9u$09 zkj8A}e<1j+;Bmj^_PG4gwQ@8^;`q{TlvpabMDX{5>jmkUigFWhi6G_+Do1IcmkRxR z!8-+&w=?9^_Z7>%A^1zz%3XkSnfk60yjk!8!Dj_u6WlAfUoaM5oLRoPV1}S_?*%?R zc`;wP>I1$g^p}Ds;!?Ui-Nna2%mh5W@N-B?h) znFXCDbbCQsvruk;;84Mlf`x*!1naLw!K6Gt&JgnjxnhF!Y{3da8g-F>iQsa<)q-mUYXqMW+%EW{ zpjz7xJ?{$rq2L#SG+AUl2Lyi<^nyozj9{{0NH8pzDwrXdCCGKAEZ;|Ph~O~6ae`d@ zLAi4UFBH5&kj7=q=Moa)9|Ug~Yym?W4ZI9PCm;Alba#>{f33FZqH3C``___*Mcf^>gM{w_fp0g^r-=;D1HXqw3rgMx{IEd*N$rVDlw z>?+t(u%F;S!C``<1SblfDmY!RQ1DDab$^QX%oF-7!E*#J5Tpeo+kKnhM#1|89}#>) zaGT%`!M_N;D)^4z2ZEmoekoWh_`M*lC0Tz%!RCTtL0V2Sf3)Bf!92lPg0lq|3N98r zU+`kV)q>Xw)(GAxc&Fe-LFI!2^*<)`bAmesUl-gX_>thJg8vXy_utS%t55c)sbCwy zc7k-$%lvG?69xMVV%q)W{xkoS-(i|px$s&--%lBtRSQe2^9z90l{U`ODZCb~HZqk{ zu*`z0DkGDO%p<)~Jnr`ZL#zUZT!nV{kHc-?CsKuOf*Q13Coq`iv1Fhe-}~sGlas*E zWthj`xPS15S%S{vyBJIlBS-k}bcBTwl=B@ArV@XuRl5p+x(t%WrFa?C7WXwe=)7t$ zbeee^lW~8>3MA+}nm;+~t;j|jz+k-`2VL)ZNb5348b9FXKFov!owpRUQ{ToDabE!* z_2DrvqL26Nx(t#=%NDjA(+oOqCDKlPTO9g0jJkcdI?5nvWI|tG4x9w7?HL z{bc+222ks}4{4U^g2-@YYrLPr^-c%oF+L%vWyF>I?lfil!wjny( z_nM=>NyyXf;}R>(Q64@O21B27uIm009n-^D0J$)jG{)t7MC#-5VV!!;BWYZV`IpOt z1g(!{oN}L_eS5VKP|J1h-X*)2@=sv@%j({%M^-Pqtv;MTgWlO);no1*$o>opPf`^g z#|`ZHL){GV}Kmj4qiSw0!w3{1O8}{%JtbY%eC5C>0Z9$s|IntRjxI!*Ba|z zuXS&9uM5qZG;8&&xa={xQ*vD^jf`=-_teHMyE1oLtvj~e0ppvt2V%OW9*FHaXn)){ z);A5TwVTe}H0aaV5d%Ms8QAVX0`gsT@{`;r?7wXPz)ur$)@&O7sWsf}JMh!kK|^cZ zcdX4lH}@|udeD%t`gCI8D}TUTW$m`ETZh%xZ+#q4tF4VE?#JY?kF(q4^IqJu zIIKm4f9S z)wqN?ZqF^qas7xA?$J&7EN;1d8$elp&%Kx$mfyz*U0H99yfF}QeSm+Sl%)1dcSN=) zoIHr>CsEMTDVd)zTyIjQOA6<-<#(5}7P|TJwr=tsbKIZczxO>9FkQSw^L2`6gIssw zpRZD-eUBj5kG*!T1<&vH-C}h|U4i*%mhaX$8XpFlLc(`jGWquI3U$_7`)&-BA}4r& zI-~2Ylc*rN-rA)$o3PhgyULhXcfB7!p%H--CD$LMabqC5-ntma zBoJM1-HlC)uD5=UWuxn@UtmSi_13h~3>>uHIxyVtMjgSMFxLVjVwlE=1h-SOW4$%+ z+XIgE)#cdg57b?69VlqY!IHgpQlKMd z9{w?^K|KLOy$A&M+L?l;`2%zPH2n;2!@oduy*0l~1rAzoU4bE=6}aEe^~Kz4C-6WL z3#*w>X#^hBGl6^U1U3uh4;HhT4+VIRa<3h_%L_a#q`lWp;E}{7N>M_PXH_7&-ufYu zTVpOj&D?8eImxG6sHY_CwR0X-Mb}$bv(?*!NdQ-y^x%2y)ANB0McRAq1a?V9_Fg-I z7o-FBUOR!^(&j$F%cv^4-a3V3-SyUiS4Gv};JG~LZ%EmZ!N)i=qwB3xnEQ6pKmhmJ zxte5jz4b-xQFOg^4lDXu>#euoaHhKh(_Ma!PG~;$I@VjS<6t<}Ti?Wd$9ii%sDW;& z9?aUrg|8$vjk!_11r3{f_n41F7G! z-nuEvJJwt8BJEgj&7IQ%j`h}jVGwYvx1K@TvEG{JRRDYK@U&8U?G#ZV_S)e&qW0S1 z7E}S}dh3Pk6875Rv#!OxcDTkn@bA6e`i~q&?6tEIooQTv4#Wl8nEo2{Af&D(j`h~} zu{VzO*7WcZINW;cuFxAF=x_QzrK-t1_>T3~e2W*rUOUWmwef~Va^$eynokmHuN@}# zBU6@%H`yIn=7PfusA@`8j`h}b9vN_~x1PZcIo4Z`WUC$Pt@*++fW3C?pM{~JY1HRf zZ_N+M0mpjlE|kY!JN(IXwV4&VlJz;(TW3+;vEF(C>vOKR9!vq}dg~Z!aIUxJb3(wm z-kL9A1K4Yaby{t(*ACzI2C&zT&A?te-%`T4-ueVGoa?PeasK|Y_11ywT)yi#=3G1< zaICjJmt%HJ>#YMzT-MuA)r?o20QTD9!EH8$V|Cc|)+G@6wbolVW)Gt4ty{6;$a-tb z?dHy1xF6%&v6i#YM32dP#~AFjqt;vZgZ$F)M;K$h-kPh3vEI4`MmYw1?G)p=4}0zW zKM1(uo$IYHLrE7_U~?sH-SyV4OMS6wz4c$159`)bhq+LOk9VO=)YYVQU8I-3>6PTL@w{ z;yygjr(MrNX9cN<6Y&JZv^+=&kFVZ&!)dfVAO9|A0v|N(Qdg-`Tusk&$1Y{_szLLH z+GzU>{_R4X8Y#6)mAVeO*F;L$yp5pghstQT8&e_&3G@^#nH;kcrPJRBlUq;mt$TZB zbl3;Zm!SBbT}ll{!p--0=9GkOx|Ex960toqRH>Grnj@mr1}I^v*e>{IPD}iOrS1o_ zEAq2giWwcA1c!DId>4-|HEiJo7T~|hOjN{W<9&u|C4ai6BdV(S^8G9p>Ua(w87b=K zzo{%!6|7>Jb;wu&5!z9tF9$(C9=td2a65=cka!5u==cLFWjTxgrX!kjgMX%iju6`o z5x#IwZwcZo8Z+UWkcHKNki8wtK^ zSK3ZSVkDx{HUkM-cNiUWp?d)mF8<>~s(EE_47C+A10sB>o_;EbE0EwFYKJNi8<1F! zXg7!Dl;5#sRIogFgKo})5V;>wHHWX!X(FPU^DYv9LsZTA2NK^R+S;hZ;y+GZb7k;z ztt}QWpaO_WTNsI!Bsf&vk?4x3v<*jMD5BA>2m{Z#Zw;lU>wKLPAb$>+e4~CkVtO@* zrAY7To4E*MXvgW;BQgpWnsRzsG^*)?fwI@Zj@>`Gbh+;O|0W2ckOo?<4Up zqTM5wv-s~xDtIpV02T1y*FuDE%{%entDXe$14p|R)sxmpgb{5mER1zI@Yzi*&j-KP zT6#jHJ7QGJNKnHOm6m)Y@(}Iucnb;NENb}D(;0p3#PLw$umCdEi0zr1!EwOrK@Qq$Ok#VO)xTmoHBTXDQD zX2BZVa6M}UNT4vU?b&URblqh&H_5bk#@Y(*wiVcA?vXOt>ZA17oGX8$<7Ct$m{L^H|E@m@1fX>IMn4WizIPuyPMy@r+^mMpx~I<7E&!evG* z_9sj-+2D39%&g>b=H`L16TOpTPmMiA^)}sOWND@CV@>+$>(DLA>KG|RHPK>l`I7~m z85HFwg8Hg)hG$|h>|tmZ7glw3k&ehvW=S7}%yt$SmTVX4D&rwC-JFAtOIrORJo6B6 z>fyHeV3#2K!G}wbZ3YuR*g~m*Iss=Y-o1|@P~^}qLAofRu>>u2un!PhXq*;u87l@u zzD{Tg3M+64T2Iskh>|o-yj8}P#pr;jZcL1^ky{gE8t*t5En~@|8YVU&V#PV(0hJs} zco-3DiCs0{B2jDe@m~ch$76+oRpwq+BF$zcw=l<;OklK(1&eB!uq&BN;5{Iga})T( zVPVlUA2C#L`TY$VL>fOFJa}LrFj~e!cMTIC*?hw1n$H9W1oHT=0xpVNuB}Nm9(GeF z5c(lvgmZ{Fh*&J0L*F4xvlg57s~YWL97o`Iuo&?li0BG|b(0NHfgUo{9~v+noI*q# zH-h@5G{!GO@_d_1P(Oyo_{fj3amq8`ZdU@VR|OYz*oW_GASRtYQ~_g-vD%fBn$xz1 zM{c*u9gF`eL>gn5F;l^rj)=z029()J-fk_kla~WF*vZEMY>;W3q7N5V^Mj#+3;#KI zl!62Y#GWXpAf>)>;8r^s zRW<%Ca2Vqt#(K_1jjbGK$av&Q$OPIQr&bk`_}_)@Tb9(z9;-F^S!p#)-+%}&00h=* z8FS4V_JT**mTOwWG~3`ZvTAgD=zB$XQ|p6>3i=FSgY2_q#iL7^U;%Vmm%|$WN0-)u zXSdqX6~{C|whC_iFGS>2_F|)oMMm2irYQ=Y_%Gpd;08nolV#6GB{nWm^i%!t_q z27Bn3axAM)3oi}=>)j3>MIB<6D+i3>h+gCCUHAo!2G>BOnd1<52gnfdhn?cSNDk(o zRuY?VIPv&Mj-w-{i-&eHA{w*Osoijq%jnSVHp$?mISey$b{Qt6Y{|%wTZ%DV6^}BN zq|H1HSt?i#X5{2F%<0Hvbo9Vd3?6SMQ%Ty)Daca6axmFzJD8NJSKMVT0CN$dqnl2q zqnnhnC8Ir3jAg2Llxb4RW{yKj1nHPM>i=|zqp## z8;}uaoUN`IRqC1nh6BLdNyFrY{&7UOF2R2ZQKn-6DP>DWn3iHZ zi40u2bz#e-l+ARE6&VLfl3`!Mqs5h!T-UWu!z7~~(-#wOz6CZTIK)eNUBO))$I_REgd=DAy zi4NqygGio}4^mxii45cM@(LTuxo~kmR`)1%H~O_H{2x?aS=4!0*^Jq93yY4sP{}CG zKcl>IDlGFd%F4@%GPvY2ve)uYuNchgZaYn(RbOd-^{mWU_yIO%lvb5g<;|Qi10?QM z@(PQJ^SKSL+D{TZH+WUmg;+cc0tc6CgzZ#B1YAg12-yhZDBDlyrES@LH#a9nMw6y-I-Y zDInGw?o-?@k7YgYH5$UC|xhJ$-C|PH1maN@&Ry1SdLQ}bAq3@9#RNdUVU6<}^ zm-czBohWU2POzSjM*~t)&>vI?{-!xL|MhzOn}q*rJ^ml(n4X|%dNc8-6vUaHWN-2b ztupA>q=~BI|Ficd@KscI|NqRLyJfi{B!L?sz=ecGgb>0aXjBl0fGC>_4@E*Q9y=oaaiu?UMEb9eXrnbYs-3%0t+UYW%&_y$`F5xS z1!FQH{n8uJ^CS?G=@cc*@ZS*T(Dw7T^9>YeiGHG&o!US*f#2`%K8?j60x+8YU5xqX7t-0uk^oAq0rd22dN;=qzPN9sBq0HXU z?5X9hb5atS>=`s$Tx}Gy)vtxHzgk16#_i*#I*6wDR|N5n?=5xt!GQBxDABmVm`OL( zaRb{queue40@ltb8p(go#}5H^@rRdsF!R-RNb z!&O+oi-Q+TFFoIT-?v3w1fxp;8hr%571_K^92;X45d7~H|8D&hRMTew%jv!1?rX)p z=Kgc97ys4=qWkoRgu=JIJX{(d|G#{NxRFdTni-Tzam6#tEU2i2Sy73}#Mi-_88)}J z3hxWotny9kic;%;P%;HtB~>+;$R#z?EAVj$6_JvX38$VhWSBl5@fz*YIde+Q`?V4C zy~UpMz8Wv6=P@$1ly#KjGjetXH85#iRrBUf zE9+fcF}t>GZbjvc;(3+RYN1C_)B8J)FI>O;7b>(={*$^aB_-pBPjGklyh^@Zy=;1d zyS${bqH1c5wE%IPj`06~llqE#N;jwLk{a`V@ENn`ae8S6HVW~S)VM3?DN=QA$!zHF z@gU_P>P<|ec*9v;X%xIP1k+|3ZJY_Gj^-iqjjt|mzRUf3Up$}wAlC9#v6fU^M1P3| z^2HaVrN;1zyrzX;9lt@VWkjGZE$;`Nmb9k9LdKt7k7z&7Wptd+mGPBKiOV9O8h~m#T}P*`1;N9xmWyH{7h_xui{*v zC-xOj632;CMDut7^7AEAEca{i4Utb!G5xP%2;bvr^C4;SG?9-)(Vin-C>lRxq;HUY zm-wi-U3^>IEB;-KVZyWC_F^ybc#+R1asAoi9PtO87I$2J&}qRq;CHtFZ8|Nj@Bz(! zwGq3EJ;me16UEcS@#0w|=KWOJ<>I+YpD(*kT%zOH;T6@{XW?bh!2xE zHXj$CBhimnwf=SSEv0`Xdyja4MESpnUyvxDguwBLi5Vn9d)b}DZY0VdE%qZ3P9#x& zs5nCD6J(zymXau6PU2^X`AV-7mni)**;k3zlPI@d>$fOEhX9sW?ll6c>`H z=R)zv;tH+5PTVNoC~g+-5x0qth|iFy_XY7K@m;O|K>U-qU;LZ+cQK3y8@WBnVit*d z+lcMOURvKrJXSnGJXt(NJcC3%lf-kxO0AzOE)tiBmx))2*NJPyn@H4qySPPsMC+dr ze=Tkoe}<#d##^sS_8A*J%Apag%tnc$avu_%Mljo)DiBU(@GI6tr z%VEH&l7(lUMa2=eQt;LRFu1HS@wnw)#a-?{wc)B=I zEEUVd*&15Gsg6T#F61+k7Eu!&9LHd2N9~9|Z$a2q!&x^anz2c{$r<28B z-B>Otri)o(Ld+9Aoh+j_iE_s%{W$R?u~?*c2kS2v=ZNQt3&jh>i^QLZ*N7{{HR1-5 zt|F|T&aLF5BAruc?+}fSC2YEpF#Vu-q@GrY-*2!!NlX{B#C9V6u$Zr_*h8dG3e$&( ze7`eoIuVj|P$5f2dZ*C-CVee>s&M^{;vM2$;{D<_@p17<@weiCi0_FzMS8ukeuv+? zz+^E^G~e@(&KFK{eL^(f`(S&zTD_I->1Yj?eWaciy=Pbto#Dx!h*ygA)Mxt7L{B&C zCfR(bo9llrJ}f>iJ}bT;n(vj!zeo0`;vw-%(Lo;8n<}P@blhQj7x75FtPx75`yun4 zEtZOO*I_!{1<8xW%S1ZsFnxo#RlHw(LVQZ3mk#s)hxi_epS0<#!}Noq@ykIx%I~RQ z3ljP0okP2`NKYKv$A~A8$Y;LqBApIWTu;9nvRpLZf06G<{VV#~FyD3Jt>T>`J#M)E zagnYywE4bq@+DpaQ%lO-DYUh50a#R4B0}Yiwx~NkzO*i2Z?l) zp?#X@=}b+NO~)9nzev1-L|b%^VfqG`xWs6@gtF5FI@k*NS_zlEyd1a zSCRfLT<_^a(YuBASdk7cw97;~ve3Rjyof}+OX-*vrkr=Z0@Kus z!`cwtH}tM+j=Y{pXnmeoAodf@{Y><;NcITPyS^DKn@_EAdnSsL#hK!4v0AJZ7m62% zmx))2%f)NOP2$aB2YrrZ(Z+WcZ~Okm`daw;;|F~$46#{o31yaU_|N%;k5IGp6FqqO zdLn^w&Q&fZpSKb==PDOIA?QoC`oVY**XiEkts9R7On+;zR&2wh{TSalTEWH?H1)Ax zQxUu}h+2Cy(Fd=yzIC;}IP)EB4R-}Lpv9|$bJySQCL9z`pdq%)_P8D7MF?IQM6J6L zmW98@#aqXF{r>u<4F7)mTH6!uBZFRrUVZ%T;IFS5_3cL*`m(NKVMn?_tV#U5BYfh z@fL5sJck5-|7N0p=}2S$IBmS`<##0PcJ4m2I+F?-=QEeYd{WbNx+YN9t=0g}T<6*A|c2 zy(%p-GiyM4e`miF7_&RAP3oSs?ACijqgw9`_BeB|)1&p?z_DlUwU0exZ*Wqpy$(X4 z?u@;5-D3x=7S{fkmf8o>t<(eQPHl1e-r%gM`?`#pzArqh^S(ryvu-)(iyUZ*a7Z(!2&eW6LHch!jR$KdGCC zymrx0^mFW9ypnuh7u4Eq)_{GTW?AU#0JP?yzXSGlMOp;4hU#v3dE~I6#a55uJ6_&v zjp~dN=u_LN=r>BC&d99(`?{jd+v@sb+w2|#P~Sy+ty#zKSb-MM*SfNOLFB(>)&lft z+P*OQ(A1Yej|Ka>)jf$Z%SZizNnQ2@dQ3+f=yQ+x`w(p{2=kL1_y}T5>2yNa} zcM*DTpEw+29>SQ1U=2t4@PVvw=s=y{TEq}UxyO_J}R*U?Uk5#sT2xc>O1JoI{XXR;gm2D zorJZ4K*;=(6^NJ%=U`|GiaFGn35;oDKI?;#Oj^;<7#w1OXe1w%OD`-CjGTlTo!|0b zLDp#29t|EqKIiZF7wp_-Es{dPP52)^1-01D$!I#%Gi^9hoLjkau8Bu_Vr>{&U_4bv zp<3qbMI?z|Mnku!KF0X<=ve5EOr~4OJQMvLA%*$zdXQ-7rlckF+*}kp3_- zWk-5PpJW^L$P($3$v9*#TH+zMNTFH`#`dC{k-`+W1JM}2_C*S_Tr)K`31uRM?OfAn zfkpbJ{MuAREwHl@OCE=R)Q~XSh7(>CLz5RdCQ3!_*fO>~D9PJCo^B(@$_&QdK{q4E z$&AMS$jn7DQ)B#zGjhDl^w_=Z+6gkVVo$Q{i88ZeSF-G2nK`lNS$2rbgq6WlaMX^B ziax?#QIt4xN;2aZkr-Smt;pyknojOgJJyG*Pcs_^I}lq&dz|cx16K0!*o+sE+iY@2 zD`O0r960SI{roGw=`1WXy{mWbAi_ob`NJ=`grtpX5<&q-=mMz z0*gG5p#m*S=30?odNYAqV3BRIqA?yzkq48G0jLF5&!!%d>1u&R9&R}Rse#<|*cfJh zL}jyMKd1Sm86|3gRndI9eI2?NfEHMY`|;WKw-_@ob~k(de9Y)5Lkp}M8+swheC^D2 zwZJ03QA4g4SmY&bfU5--*`aoeVo$TGS6l8eH4l!RM)S3nMu|ChXv>n>Q?1DBs%lt_ zHyR>us_f_(_3$IVPrlV`@7UN1u6-xtFhDJ^7-z`)seOjyxvyEYmHEfn(&|M1V>>Nx$6hUZ=nq>u*b~$qWE^U4=phFR5IA;6Gfl}=H?$3 ze~j%z3(Q?VB0h`dp#^4M7Lq$U{vk&dT3~Mev2lu-N1z49!ND-c-{X2{ft_dCn;7SD z6@eBQ4<(}o#=C$KXo2w|vqVA&Wlhgx8lvJPm0y>D{- zDTMLoq2TVMdJKqfCmEBSLni7>hJs6xA^ffkq%x6X~m`EW@D zT44N`2;}C)2eWBtfw@~TBEFjSK?|(h)HgQX2aG@q%-kHxofzlM;s~_B+yicAoDYjc zpatgI)$v^BhZdM?FO2_%?LiAHZ1(w5J3fFJpan*CZJuW1HLL+zVC;dDyUC8vV-9G6 zu?i>mW;@Os(Gh5Yxe3q$yM+nR0&^3f1-6`90WB~$;SoFjBy&Iu%uRU8j=#$s&;oN? zdC|6#hogG-%8Y3n*Jh`T9dT{m!ZCK-YO_BAEwFJ&h_~XHLJN!r$NUkF8MMI6jhx(t zRx;1(G)&RM70^`nY#|M5Q&;nztZu_@-g|e;iO~?u@ zFec^LJPnxHjR|%i;-Mf9^c46d!Tsm}uEz$W$qvsVF=QWwlqj^o_%fl6ytBL{u?$=3X@QyFY^?Ttbww0f zU>%SPT3~-ghNSj^mgz8C{2Ts-g6@B6g|$gd+7wB-53zU&x|4KcBx@0y#enjcfTWuu ztT{FG7q9GNBDV(~;ih;sN=-&^b-#jvOpcI^ zQh#CM)B@~tH*Esa#vvFlktB=@pJPKJa)txh%*jvS3lZ}E&CS`KiAQ0uS|T9P@;eBH$ZxF1>HeT;AnwA8jaPB6&w){dVR0hFu8~^LAH&~pjbJ?^yImt%&j`;_K38v8&AQHx`$i=J6QjaT3^N5M5Ip@k zR!y*;ksDnjTF;2vi5h<=kgcf`HPL$1Xcn9UBN2DdV6)u>LcppHl5R!ws_PlqVw#v& zThGW=*H~E3$o;NyK|Lc+AVBwm;J$+HMRj9qIPnFvi_Gpq6aF@%Y?HyU=FhHYB+oUf z>lx|p8nyL|^mL7d^^EW;6J;)_XXFvnfins21XC9y?wFrRxE(_q$lkPQ)_7wZu$GVZ zh8FQL-pC?;8tdbDG7q`ajgKL@e*@SrO%=2AY!bOgG^M&5w9HK(=JgPHhWYbw^R967 z4EN<3?$5)mUg_p3_T?$|=jjJyt()g$U!IeFc>-FLG!W#sF!bn@$G~*A^eEE2iVf-H zLN|RRd8->AMY0u^B{fzf$&cOiQKUxY6g6q!DeZV^y!~8`fVxIq1OCp9k7PgcRTukV zUT=!_eEk^d>&Gbe<9BZUQ%Ln`6zT4>)T=lM+qNY-tL6{)slK|v|ubYCr)-1#)ZDm1Z49D$z)?s zd1CVVfOfqFyD%N`+f7Sn5!(jk@r__$&+0?Cq_!1n=q70Tjt4>gKUe1Vsi*rPmwi7rN9VsgGuU?S8uY$u>e z@i8`q-uY{njDp4lbP4FB-}^h*2YMB5zON^w5hx51imVDH8?lByq4r?Q{7{elP&_|$ zOnxXYKQt^q)F&Sb3hC4VsHPG@pHPpm6SG4toEjrckc>4d-x5TzY*P${O|d>Kc674} zhJAMh?OC7;i}qm5R5GktC6L!Ri@i81L3sr9!rKb<0-KOGD%59GD8=n{3)9H~nXRxP z4==GpsbObOK2D|B4j&XVCvx; zKU{QY_&jnKR#lflfuX9hq-Wa2|K{ z85T^hu`1`yflvO7GK|Exsy3ATpx59E1DyZ8^cqS^By&;SA0rDL2cu!&sX4%Nyh$)b z9^%v-FjZsbmXt#afOFDlKzI)3rFa`*MQs6RF4TvNCdh(mGchmdU;j0_4CVvmze|r{ z+U&B@%6ZkE>wHP0=lqf&@T3K7rXY!1S+Q~ytoiK7jNq?7#=3E}Q zhF=r@H|ivG@b%lhSJ{-{@Fy1E;#j=j-LyF7DM7!@8{th09$0BI5Od7^sivfVMkk>Y zigPSE#^0)wU`|rsB9VZz5HI2bQFmX`$BNInk$kp-Y(u8F_x%Id6y82!dSCHaafrzK zQCxqj_#<(uSRpPDFA#YPmF0da-XPv4^0^4Ee_Z^n_y^I`KrmnRk*_PphWQIcexs&6 zUNkp%V4o}dGVyxR+z!C{H)Ve${#B&p9_ur{MPRP%LUD*VRxA;#ME>@~@>hxL#Vz7? z@%Q3x@o!=j-^y727;%`$ADx(9A#M`+V-nN1i*Jd0#KR(gPh!4ok#CHlJx%7tavO#ChT+;&tLJ;xELf#ovk_ihmJ9nBb;; zv5PoBHcbihZJ>Zd3X}F@Vz=`@7paeYus zB9Y!ob{nyS(tF6x7f%$2iX%vrKV9}j@oc46$ett4Rr+Gt%fwaU_2O;fX7OS1aq%Vb zRq+GyBk?n_K}^NDncJN%b`raY1H@y+Q^YZ1i8xK1Nn*QeWiJ#jRQlzzuNE=#W(&1MRPMAHXkuzdK)nz=83&T^B5fRncL#v2}(a%JViWRoG6xx zW#Yx6`P@Q1Kb5^oTq|xAZxQbh?-L&o9~aHzXQ=N***iq@_z}|Imd!^axV^kNY{o-O z6ES@Z$BJ!yVwo@x!ATAXz7q1q7Ch`eVmb*#3P24KpFCOV@ z`<&AGv>eO-R^%%~X}>4#6!`!M(>wfHRB@d6Z=&auTPC|gJWre_UMT)p zyj;9myiQyr-XPv0-X-2EzApY={6PFjJkn>EkH>O*`8skk!s{x~_#=RsviUq6(>sc} z;?ZJn(evp&PWDjIT)(0G7}*m%^PH+r)dspNkKRkBiTW zFNl0zitYbJw0WHeJ0zOxOW5hM&2=X1_Og!>dx`zTf#MKxxOk**@Q;*UBF+?Ni}S?u zMLx>K{#`F_6wMQ^NZ%~`9ub@Mt-h+C>hmFs`O@5{PgwuI&X*HkUjL7~akj&7V3^Ez zaKQDYWJC)-TFlZ3|CtY`UbFNQJ#ZbDZV0%%|IU0pk>|*Exxc&xr!KRM!+&40)g2vL z!wWkt-a1~h;nLF@tn}Kh_#qn;g!d4*%UK`$bvA-m22qReq~vviw|MKSkl@9+?svF| zd<^r>TfBAWBEjG8BiOM0$j5fsp4aYT#Jw_zTG!%Hs01Tgymfq>!C&7N3^cD_Ss%V$ zG}gBQajy)b*8QlD`MkwjcQq3H^*!RNkHhHo?Y-^+({Am$$*^6?h0KHl5%jv=nwiT>^M zGJ#$`_;3#Dn`m0T%ZIbD-++PrO!n{g;oLIWG;h8J~O0Z-18Z#~e_wib3< zer@qH2Rd5aSLUo(8;u;uvfRE?>XU6G-tx0U}^@e)Sh|kGQk8=)2~A6maLT%b~!IhIF#M< zsCBt3Ixml|w2rp+FTJSK+V-o0#ZSl63%BpGhNrGfE$+THXZ72M2EMobQ1U$dspD{)~j2uPu;MkA-Z|Y?mx{>ZAdz} zsUd2I8=`$D6}KH0Y)Hy%Q+&pu^b6wGzZh@1<|hrdomIcBIHUeqNYgE?j-c^j6Q`WVv=XPffOIbCkICF>%$vwJ&>>hhr^#o4_o`6!92m1_3M7vJ}`Q>m5L{)Qlp2% z2U@R4Z3uoAUDJ9!_fNRNS@7eAklo>DH#a!L?Tx{8PD8jMd*i*u85^HzfZM^wn;ODv z(fhT_isP$)T%5T&ts(r_mBmjqByA3?-h$qz6dyM%rGCM%?Yn|@%Jr?+IQ5}bc0=T> z;5vKF@x>pW0gNyGd-c;@B#I~l|omL&aE_qegbv*XZ{BiEu zPHSF|w=UkkD?B4$c&VR&|>br^mVN^wrg`|gSB}pYxjDML z<&>`L?Vf3elfJO_|8?oxyTY40ZLk_r4ph!e|Jl>=+|}{x?ryMht%gv`U~zQyriS3~ z*s#Llw1$*EEjOkVzY$;7fLB3o{JA+oQgYW7XRS-Ze#Li~VtYg8x|PLGHbge3HiZ7# zd0p!bPD7~tb{tt4>*2Ar_J(LfD6i$7WV>^5?Ak3z=P}TK*sJjjGc(3z4@EsWYg=td z+h`q5I&2>f92{HR>2Ts;QBG-ywhS~_1$QFPV9bE*JBJ&OX@;abt8XWy;O9>+_T3@OkBq!^ zLw7|phVBZVITW92L-DCL6rX8{zFpSlt?ITetI$5K%gS!6I`8PduG6Z_;`4SsS^R$S z{^GX}C7yWqBbI*yGd*zTYsE39Z8})oy7<+PvevaJels3j*S`3jcy}Bd7=sMt%9#Df zUR&XR|5NMn&v3EjUY7)I-d{_lkklQx(tW~zb%FC3Tn!O$$M39djcXH1(*um-j9UP3UR z)y&9V&7^3EE?&X${Fj|M97#dmM+o-JENA>f{wv7htyJJHQ(VT#*krnEE_(T|@uR+HD@UneA) zZNry=&KR1!=rK`h62y2bGCC;9+dkegjvgyB7~6+#Mvs#jjq!eAv`A)ZtPA^cyv+0% z{r;jS$jpkp%CaZQ%#P8^GCEjhPAtOALu5Ak@kd8RgJ>f*5PLOxN;2ad^)t}p=;$Px z4*mG=;Of)NhQSWR4$~edn|}P4U^B9i+iWuY_$Q#X<#zP!=oHp&#`~NM##uY>vPMh7 z?hpiHkFnpSN#$m(>&G9R+JS>5KYmu6JRkoU)IunD0Sx%@^Hx(dIxl)B%-Hq#7oFdd zaW-@xyScz?2)l=~E}cL2&W!#dnv0V3dkN(n|3H0NSZj%*_@j!__m^2Zf zAO9LHn~AAj`WmWxfx>9J~Nene%nV^7k2(u@-Q_}9{Wy8W-vJ^JyF=B|0R{a$0{ z#k%54YxMb81`vQB|0Fi_LXx@lBR~G=Z`6?M#~*!38{qo!M|Y^*qS*1Q>eZHgO;v+q z&u~0mYdO@It{;E&byYPiMzxRVn<_gxb|q)#?~^$r1G!^ki`mI{GEPD!`tf&T=J!+2 zM<)95uizH#OydzuKmJeH(1)6A^yBBgX31V`b=f0Sw3_2ZAikKf#Qg&+TyoLBJUcMrIk z@y=`ye*CWO`te8M$M4z;<9}j%@Z&!X?emNtKMNJZ)jRzhlK?;d_1swa@v{fUkAD+$ zz>l9*7(aggNEL-2zncI*{>Rw~`0=|5@Z*1yIpD|dCcuw>A9KKu-%WrYe-8TrKYq6r z{H&OKHL7Q?%$UNDpEf&XZ20lhuJmmB@kimuzXl2MPFNF#A3qK5KHe0M!jJzBW5bW1 zXLTB;D){kp=kP$1-FANze*Etsp&idUQTXw5=eFaIK2iAbvsJhKeO@8>@wY=3`0+C- z$L49k%x+Au!$^T#1hzQG=E3J33wel#f*JUq%sF^0BBlfI<8Q?+fFD24eDLF^WKa}- z{8U~we*C-#h3m0x=v{};kr=X1K$nu>$Ik~PI^K@_OA^1pR(gK?7qEcU{(U4R!H=JQ z`tak=LD4{FAagS^wzvUlPzFItHsnQ+5(+XY6ucY%+oT5yGg9Iy7+v!yRKJW&^OHG7 zml_R${uvouNvHk*wk0qiBf~tJff>DnRUYHzPep}%cq1|ZEd&N;gkFTvqCLuXviTwu zd#zmk??yFT?BC!rny&uq?4FDskF-Guxn<0~-fqcurX%4TCQ_!#-e9+U0*SoVUCG1@ z=G=zN64F8q1ezQIms@fL_X2wk{=_KkKrH*g*jDwxQv zv~O~Y{}~A%Ah@pnH`^_^fh$nzM+mMP{w=l{-+RzK{-ox*;oo9safC0yUYv&Dy5ZmI z7GH$=DcI_|;ooX!u}(ha(+$DM2i)dX*#fgG3Bkw*+-7I8Mn0`WRnokvaN)nrjx&uq z6>|`}Qa<1|yB*WIQa0c=yCdVqwf}av&dtcT0-*~p&+R+xmYXp+KSHLn5W19djPG=Z z^ExCfVIndxu`S2=WDL~t2wiqD=VrG~KG||L6F+bhTeH#kknji-sTpi4D7F)FJ|FF{*;Q5p8`;gq7Z#Zys@cWc)4Q7tF?6e!a z97i!n8mv?VHz%J&z>QSq{M=4^p;^wJuzED+%r`mTW6m$_w7p(VU#mT_zk_b?5`nZh zyTpE(R!1Q}-<;vL%A8TFn!U^oqz&?N`s&(&9JciwbDR`No95*(b@2@w(;Mreh?i|8 z*t_9@v`f64zPg^m0pM5@nPYJvjqi_W>er>HXBq42!I7ot8tP(=O9N@XQN>})XP}P$ zJ5~km3U;tLADx~Ht-#&EB*uH5Zw2lNCULK#Fzz*{Wu`c3?b6N&x3tIG>6qUEpTdKp zn9ITDVh^DfR!YjqOniUKw4Age?D2>)7zF{0THH=aIX30EltC#rvfPMT}7RI+W4 z%w&2>Cu?M8Z}d1dvsr$;1f?lIpF&GxgE-o|B0s(ZWZF)ezy6lUANA^I{tS~N)YOB_ zR#rE3Gpm)|E!AziRmjxUx-loZ&OXJ}w%HQamEG8ya{Rxn@X!^i4;)GD$8PQIKAGd~ zZ6}4!2v1D;x6oN;h`NWYJ{YN^2q{DK_)11h!+h)}w=NEP0y_{h*Izwnq4_1r)04mi z#3$f|dE}iqu{zd;Z`h3RgN7?uz`ta{fF1+EEMG4)!6&PkZ5(kLf@7`NvV;+@%vW_M z@Ns6!j3<~C8Vg>DfVE--QkpG2U_pg~@G5Omp`h0~{ECqSo^PgDb1jMvNP8Z^^ox-W z$RDv*ys%{^I9+#)-%!_$GV$!U`{=aa~c!+<>9C77uG`cE{pyZnU0#P(PTE z+Sn}QFPfw*Fbqjal(IkzY=yfrWF54}<^~yM1yO6owk6?cBF9uY7%A8^q>RX^r!lNC z0b@nu%*F%^JU5=3)>H{HB*am2r}Km*B1_NSV0@Fg_a7$ANuhpn-zg5y>N8J}+K39EvquL{mWyw0=F zS{3B(<43NSpYajKM&>hD1sSKrW7wLwDmZ>skRPcG8PEj8Wg}m;g_eU<;W}HRPZ$5~NGuF~2W=_-MBe~`nz#QiuTaMt( z55~EFqMXJUk5xfh>{8gmti{}A+_iBCp$6|G!K-0D)?en!&-fLdjr@#ryUf`Fw%2)# zcH0*UG8OT11e73DqS{wtf3p&^kg3wmPpH;Uo8>{eIZn(~OXDZQUy&TZ z*g;Q(;6;f$h|ZE(ABt6M>q<|?%n@#65{9L77N6y^y(L<-#~!7jMDigFmQHmk-F1!kmK!N45Gxr;CZ7m}yB z@e4@q6}O6EIot)8Az*G1+!H~bEy9e=M!>n9(C**`W#dT=tGx3WiqFSjaK|8(BftfH zGJE2?W?j(aDmEo>4q{O*w!@1p2LDONUB|V&2g2Y#ad~TlVejIp>2&U`vmIXCFnoQz z0dxJqYmlbX6t5`UD-8Ek=hc;i2)cj;gQ|tI$Xj@*yn^r=!Y2ra5ctbNI<_hcAzL8_ z`aJ{#Vcl&!FFb_xN1cbo|lMp5&OhNFLrHIpuW+lS42R?!GnF}CLw+f zg7*@c0%04%uMnO=cpl+Jgf|fQ`#FDvqG!s-2;N@y`opq(106k1Z$-Ep zfp4DsK6QPHe4ium%_~RNI}vG<5qQW|BFshL&$qnDUXHL5VKu@=gc}iVMYtW|R|wA| zcr)%z#NR{kmYWf0-mM5;-WL&Pe&&52VJE`J2>TJdWhJH?-@LXOVJ!kbJhmb5vfI1# zeh=|a5O{-{(z;(D@LF>j0^e@N1O6(6n-OkBxD#Ou0^e-*D}?6|coZ=3gNL%|yat_& zFa=>M!gPeC2;T9r3Go{dZb!HiVGF|D2)r!dPi?b~FCo(G;f$e*3--V(w ze?<5z!Xbpu5&Vn)cn;&9nPct2k?{{JfVpBEp2pRGRx<1VZ9TAWQUL2)xNtzflJolZ z$)9FnANcgTaNK@H6%5BqlPVY{7S%lRXYx$ls0xO7qbeAtlcx%XkZ ziaK+sCgo-dg>y3{D%QzKv8f&w9tAC|=%c|vs37co6ta5-?NG9_wl1G3NWjMAhYIq0 z^&Y7eMabWmf?>$e-}yr*f%FuozK$YZCo-LpQU# zU4EbTsG^UNID<}Dd8m+*Sql=TsaH+!63zqY9TL%(n3Kx&wF$_UB{5T5=Xq0C%z4mk zBXYIEq77{8JQXtI;|{~4W-Gg3CG@=9Aw>V&bx+lC$O@cCLW!DA$Mwz+6}2=Q@+)n~ zW1&Q+P|=S={oPGRa#yD=k?Zxo)zOWcfz2@^a&O}}W_CP2RMZRmDO5DdRQiJHh&yn1 zy93uB173u&D)PqaH+39bZ&wvKTSLoD*&U{Ah1o`Df!pb=UZD@Q6>B*&I-x~V06pSBEAVdyjVRbs@KddsO1OP|@;^y*r}%PysrJ4ZwV8{O{)dv&q}v zSrHoLb>kECz0jGNz~EwUWhY>y=7$pQUJNCiGVVVJ*cCdH6QQhbFwW<^?9)1wg<-%9 z#x68tc(uk5orDP8CuZw9I9D`F{YxFDIErOCsYRR{P^xoUFb1JEFP86QCUB^kZN4g0 zZnpVTGmyEQF0HYmZP@u+&_;&~@{cp?FI$wzH3j|>bf?H=i@bvb2jgFZcD}nqu2|&m zguez89ZkV&7Ui31!NTZt&^>;TYHIr=h=Ft~yk?Qxql3XwwVWXRd1PUrRf`!ClF%)=i;7Hj`_;MSi<+{3Y_f;kDP=0Vb`f_7j-43yN(%P|kGjGzrTN_bf}Mp! z3hNe76EMl_E3An*=Z(V9wj0HS+KI5oaBTZvpm6A8?Am5>Dmou7wnMS7^AausQk;92 zr}z*FPU^=oG~=J6m;N6F5=YpfnK8<*_- z$_!Ln=W&c3&vs|Iv-p`siNQJOMnP7V8K!$QOlFgRZFWnM^UEM4YSH`)i)u|94+Pz5 z`@9DKfna{9KhLYo!d+D4`~pb@z1>r*I~TSunuy`a=9bTN_u2iygj?vXMG4L{^uqMv zF4G5|2SY_2%@N}sgD;uMGu}uFVzOeaCx!~$LB=qhTZA$1kO;NNg;8RTnpXLtG=4h7 z_)!6)g?s8dE8(;^I}bzO25ZLR$mkR2mW7>%%v5U{J`5KdX96~_3o^Au9t>f}PC5@f zqd|F4v*=k3JZx{0K5HgcfjPt?;Ym8PnnBW_xfAgLRe^EEV2n0{;q8!6L1vlBynWF! ztmyCjoFkm*WYS(VBlDHf>yNXJdnCNH2xpy0cz|#0%sl031*2$2%RgzIY5Dlz=BRRf zTVYf=-#M-@7jh(BP0Iy|rZJ3#+qx@pSZFjK)M&bsufV}%JVm4F9?6g4NoP(Qj1b4) z3~gI%S1)&VKDTIDhk~A*7#h2R=Cc$ZterZZ!dX(_4#e|j@cU!>x!e7Msh1<|w+mpG zcj}09Ek2b)38=+gmy+ZdSEloynTU z*c&`R7ML^1C=B>i|M>T4@6B%HX~pZBK25_Pa{Adgjkubc|K``$?2W-IKtg)RnN$Qx z&3Tv$DbDC390dty8o?dSH1B{(!MWZ&cJkSs-z?^3-!8kh2)CO4Ii1bsqIo6L%lnkL z*R&OtHN38MHS@lg5N8P4?fRgjvX)}+<-kyI< zS+6-qmsclx&6vKRbZ&XC!bGnzeG|RPE310d)XuG#R@glO80=TRzD!BUZll-9X`MvZ#d-`tq z@s8g~X?YhXT@t-C@{{moq056;I9EdBb4c17w)2XUmWQWR`=UT;8BY0@eH5ahV}|!S z)e6TVrzXLlA|se(x3c3-w%x{VYqzuU40WJ0?pQTn{0Twpz?c5D4sUSz7RSOZF5iM5 zeSH@1N(S+0hkwCMEZ_3KQR}lC`p2#0cz>JLr++$sMe);j5yg`bZ{GehnxDtA9G)m0 zA{LAM37Y9gYJJX7`aH2tH}ka@ zj}pg-=ZKYJow!_FEAnT5*7I|bzXH*ISKKFd#!qQufp0Ya)NqVLSX4hHQoDP3DUH@sqaE3%T;zuHXWnn%(DL`h4r-??}3h8t^<$9xG1zs(CgLs$t zsJLBxTih%DU8Fx0>uWFe5|0;870(vuh>Jy|5ry*n^@R1@E1r&Hl6I+BB`y(vDsB-U z5}y~}6hnBPfc3NzyNLb8;o=!$nK)0pM7&PCMSMVfR(wO;B_0-2;1R&~bHrZa`J$%@ zYF9coK=eo+(ZeOGuPIS9XL`fIY^5Z_k%F4=pO5Z8_V{xz2|0etIBI{tFzXsdM5b+qjNzawtO{BL5^AD6=Bo0yf zsj|n3lSu6UDI~`50@=%CuO`v%dhu4R-=g)uQu;IE4z2&4)_)@VknFTHx4sN9heZ3G zNwj~0>|wGek!b%Mai-Q+YW)?mm&?ADME*O)`?dZdt^X~FzHni?IL#VjxDC_AY|%WC zfqY$LA0^TQi{*!iBgE0-baAFgoi66D5ibyzimS!-;!Wah;@#qX;xpp&;>+T1Mf16i z_EPw{3ucLY0)%!K(R|*+E|fh$JW(7fjulTAOT{wLTpysGxw03DOT?>0bKQV^Q~_W= zHi&$hg!bLy!{X!Oi=w%%Kt4}f^$$un*B40tL^d7QSYM{tR_q{l5swm$7CG_{kUdm9 zSv*~wDAEUx^`9^DNfX+ai4-!Ry;d~WE3h}q<`XGg|A_c&(P)_?o$hp8e^C5F4Dh-G z=`F-eF(KxOM{1;=r1WBuo_Vb2I`Iba7SUYqU_JdOneX4lr^T1W-->?_KNJs$e-UH6 zoi#Z$yFq7nB%{u0@ji&u+lL{Gc)NX=4DtMpOjGuK(D&(kXXozmYF|0we5 z5%$wue}R0`g|^XV2a^$K^QjWDt;nZKX!j5YhBZtGae{c3I7d8ByiokHNT*5G z^K^H@CL{EEkkL*vyLn0s6X8n9blWZx{RhxE>m=L>(p7v;=Y@-#A z{N{QQ9HR75BA@zUef0MvFBg}K*NW!)5$kW3eV1siCy`FCUzUGFd{XqZMPHTuy7->B zQ`{>a5c#AI>*LcpWQf;?}{IYe-;mlUy2T|bJ2baF;g_!`bZxl+i2{= z9w)n0G}qfmuaUh#{E2v_xJKL{-X-2EJ}UmZ_>%al_^$YYctHG%NRMD{N2b_T>>zd( zdx%EcANhyN9xaX)CyJ9rdJ?n#d7^nI0PLl*={?N#_lOUO4~fr+e1kpny(01*_q5*? zKM;3|^sMLl&%_2X$m@KhN5w2LTQu(;!1`R-J;eg?7}0z`LB5k@7mMb53erntmy5GR z`arY&HR3Je9pZiB1LBk7v*K^WSHyS3_r+b}UhyyD-^38F|IxmAhXH8bVE~$U7=T^0 z{wR^|+01{6I6*v1oF>i?D@F6p0+g$hZQfk~o1WdQ?|N~gc%yiSc$Y}0Z|2`ALfXvO ze-=Lz%{vQ_FT(EwV2YR_wierq=3NHJ*GqOEaiB`Q8KDeD4AAvGA=L&N%Iu^5~AC_dOy@ z_L1Kw5=ze#yNf-=0ayUMn8?{biHVZx(MCw}@NC`^9bIBjOX{Q{r>ti{cLPHSs-hr}(k>Cvm^{sdz~I zT;z>oj$crWim9Uay(vd_Ld+BSG(F4r6brCvm^{sdz~IT;$IiW`BxNk)8xhPZzVqgqSDNE5Ynfu|Vu64it;T!QwD+gg9FC zzBiit+h~7^(x;0v#n~b~8Q6ZUxKO-6Tq+*&%~8Q)A^bA^%%{^Z!5omICNwVO%g&=6V5Wru|ME z)7LDW@SpiGyk_Yqdf+-P-4LP(-<7W?@*LUjR(z-PmY^c^M)c}t(oW=Q!2a|WZ`~Lq z;H!l-SSxNu)UcVUH9Gk@YSKQzEy~OWe~Lr zQQr=4(0%KEinzbNM^N8>TpV&-(9OpBZt;~t)CwGpdq>Qm#cS&Z*#7#q;D=#uAM4|8 z@wWF~#95{QflDgn+NcreEnLUI>nDG{F(=@=ikC_2xc=9Qd#heVzQLXWdh_LJ#Qpud zAN}*jFGKm*U&_p4xT*oOq@LJ(?z2rUq;GmygOM+RL`)m=K25gE`q`#$_^l~};ZBM) zZ}IADi3ESXr_jGYdYM2kU+?~X3I`>cmOlLl4(K!RnErfuL4iqj|Mw{<7%*T!A~EO~ zy`~`X-R~(F+u1bO_@06`I6J2QB3QiPP}J&FedClw%_uv&*y{AvIK8OW- zW{zY0UH&V`nojVYoX)_^1&Bj~FOw~H#J^xOP2^Ki*mhQ+hoPQnrs}Q8ADV08kwUBu zpJT`Q)gc-TNfS9AjfbR(JP9?1JWXV7{cv7@eXcg;}nd8k>YZM+)1yrqM)>e6uDpw+#nC8ipn>B2DB=*!G|#Z~Hi=$Z;~GvA;2Mk<8Q>kK@SkGSg$VG*6J372D3TC(6u@UCXkAW#+{G#K9OMGht=4 zK<=m=ktQ-91c)?gA`d~2BR);!MO^LEM1GO>*J>hjlc9;6kFG7ZBho}RNUc@{H2qO#esM`<=` zB410hNfWsn_hXYLGH+f-nlzF5TTi69CUT^?CUT^?CURtl+AWH;z-LONNfUWBYi_QI z9BI--{*v8zQ)NfT_*-A3NfVi`!;Lg)B2z#)(xi!eCAX+a6Zt7N^r0pjHIccmPePF< zd0bZ$nd#UsJhix*$fYRRJs6oHP2`JNFEo*LxWsuu9`R`+-_G?uP2?}wuul_tBc~cP zk=^p?aca~?e45CcnID?S?)rlGaN0giRcIo+`Nzgj=dk)Tk?-PqpC&SotB79{IfoVcHIW@A_%)F` zbCdj<$Rk?tE$ZA_+PC-G*&cWELktE-7j?7kpC&Tj z92xOxBL9+ALlb$FsXEn4X5_Hf&4ATrN5s=a-pHz;iOiD|^?7^H_Gu#Xqb}mpM81mq zz^92!S=9(Mk=?Br5vSXE1e(ZKnEJ-XalL6pe45A~abEc}k@=Fqh))x_J@flCk$18^ zzb5iHX7Fnw&*R2I6PZ15ayQxWwanqyMCOYL*0}n#h}(!>@__JLd3fBJ)AJ z2sDx1R&e{MNfVhv=hsB0?bk%6O-iOC^V4?qlxU=ZTCk! zO=O;RBAzDlI*!#>HIZ2en#laA@%w2aa~pBMe4QpT>wWFLhTXm7ik$cvGGNrE!#RszAY6V<2?_44O@2wvy%XB}uFN3m;@nrR|m zgZ+}!sEO>VAtyl%xg~z5h?k&}B%c~GZ(bxp4Vf!>gi$IX32MkspmyqeQyM$zt7^!+ z;7o!V@-xWR$-WPLwTFjMHGX~OKP)yM7o!exaZkqbkd#2kWe4n&Th=2!0^ua4u~B=3 z5kX!Admhu+F?(c7_G=4leir1hGxjJ`Hn76#l8v+nvA(N4)`1>SS9_d|euaV*KJI4Q zPoRc<=o!c9yYyX~i@FAzs;*;qwVt)fzHCrCGmDW;NXu8BeH4l=O;>=P}c4 z;aaFx`7<>st-76OejEc@nC4&nb`iGRvA)3J`40=6{2*yEr*u};+{w6K+N-jvvaA=K zLnc>LPMbY%dYRQ+{^i>RPU!U3q;m2VT@&o0CS4Pp-lS`SSfj29;*Gi{*zumO36iC2 zg3k-y*KJZcDVjR3Vs>q>ib~v9!VmyJG5`l7&^(WtCP*Rb@%pLTpXx+!=5ul4`D z`|F&tIW=YUBc3+9th91oHDcy~E}368w+0@`+$MAQ%E7b5^?fawSt2iVI*QL>zJJc+ z)wsuEKcak1x$6xNVJEmiBLQPI)hd}WyJ{*N&zoCTQeCT|KflcE1f6{<%F1wp z!6=u`uC16;Rzi2tl6jT$YRaagqGryn-}v*EcNT_2^88xtZESk!!UfZD8k;?!U#VLq z{^P7!QCZ@R+rQKWwuD=7u4(_j!`~G{&Sw5oKBwNGL7)qJY94li_kqwjfl6xJ75vq) z>fDmqr8U^wbEf(a6tm+{w!G4OZs35bESsKik2CXGX4TBBnp>NgSE*HI#*|mqo?l&t z{Zms>S7v!W*6@+%T&?s?fs(nUm6!)8U0pV?wTc;y6HSb4q7pBhUt$wN4&7^w>oA zlTSM%ae7tN?3zS*)!f98xpNZ3=S(e|J{_Ajc5cZey2k!r>Ceiq!c9xl1uWB?#$RmR9FF-Ft|_-;ev$Iq_-5f- z9Lx7(Cej^?ccq&a$NakGxAD!vw>ah<3QY+PegW(WlV5*1uJmU;t!cISjqHf4ooS`h z%bH#BG+y<6o0F?|gjqV}pbhTRWc;{?FVMJ|;Qp>jpP81lLH;&L;wN0=v(tsd#9)7! z-bchwd&VvnPZh_DQ^Ycn_sdy+p?IlywYW~)ByJJ6iBE~Ih_8#g#6OD-;t#&B?s$*I zbv(!Y2j5qB9DeY9b;sfVn(yn&xBECY(l?N3moNRI{e+0ql1b+$6W8OEYRG#xwDZL7 zVsEjpI6@pPP7u!$OT=j+Z;P_tC89as!oEWGO7Ul+Ip1RaR@uK49~RB$1#YQ({YA2= z-`k!T?f|eoe!l$E&yeAAV&|2IE|a- z$b4MKr5gfoFMe0P0^~WeUH?rz?oTc~5pcLzgAuswZ|m02XL*>1f$dF3@cMwLQFMP6 zbKYCLbrX@`ukR4*tHyj`eH;U?zL|)7We~OKy#$9uusOo9)%N9&xV>qSn!78{(Mt9!C%+Q z1bX@K%-J#SQ)T7>v&45jbJnMCL4Q1YhUL4TIUC&DG}!peSvIz&*RK61m+W4Zwzl}H z;&}129qE0n1BpQ7K*E_{Jnm5XNYLvXq^6xR4dIZPQIQcBL~afeco zFS}X3Y~;&omM;tWqR5xtEMGeEr8di#ihM!ji#E#_MZTafpMAnm*!F>RJAnQ==hnV$N81coi{<7e(9+r z@$dg*?@Iuqs;>9nn>RC=gbV}-49em_08t@?9hEA|A|T2lAXPL3l8|74kOT;b3W%V% z;nvorj#{NwX{%JLwbq4-TBVAuORN5@qPA7U;#!fm{=e_u@6Eh~MO^CgFArY6d(J&~ zdG{^zmh;`S3Kyioft}4H{PYY@){T`S7ruEza7e*7uN$sf-gjwmT$^!(aO61Tcr~;d zvtOxEWsyScwPuMKZ5B`!i=2tW3%+@6&|bzjZxHf4`dPsrZy3|}@lR1cFPq+#=qUX0 zPD2{sf0JybJO02Q?=h$%;Z67(oruD&Hx9jmKOQ^eUChiHlg=Vlnf`beKxh2%I44l{ zD0Bt>cyB|QJp(nuACGz`hi7{aq?*uP{&*81$6tgDf4p-5^v8Q0J%c}4pV;iI$z#orkw9&ly zG`QHQ#c=#3bQAt~wga&^spRm-vtn+1D9XSe&x*c3-gZ+_J_d>rm2;NjPd1t`+lIF3 z=tO@!ItRtCXWNHn``h;>`UQVHD~98bP&`~>EZ&M+Fi2u{P7Hb0;4`M0&#RUMMkuaAI|LK&4xh^ z#V?>dPV#a%)Xc&rlU!jo8UA=A=o^1LG9B!ApW1?H?o)mU{-aSnrBa8(PDFu4#d-8@p*>5s>t7jg0#;E%^N8yd=PF7O*dO+4!I z2BEL?$7_O;&5NrY_~WTS^Wqu@{&?z`{PC<5i}Sq${P6|==#OVSv+j|Y_QxwXE$78Y z()eE0)F#f~YWU-EltKmVtZUzf_P3yWp@L+*FZbgk?VmAX=lE^x^<(jmjo2+diQDve zHh(%p1>KwDC7uI+JljwaL~Ov5+JJ!&u?3sd?w~mN?C{59T6(<5?N8-?@eG$Fp*7;vODq@W->|^AbNoqx8o!1nPqP#A&pL zKc3AmN^k-L`s2NbU-M8w-^3|w5B_*Ie_-PGl;MwOh|~px62D~o@W->4lEI0ltRMb( z)_!PWE8B-Zp3NVT;DJVey!TE0qZ6D+g8q2cer$r?+4RTb;Dib$B%WeE{PC_g_LCDl zujr4*Q^_lMG?W;~3gM5(bHppy7)l&K1^n@%IaItDNo;17@W!`TO$)W5jYiY%@kE4<9Rg z_2*G&PG(#_cwTa@16?t*=nF`HJo1p*JdVy8f4r5jNSJFk{P8I8i0Fe{`s1-NdJFM& z6#emZM4&}(cqGi~+t44#_~ZS7RdKcm`r}bxRb)HSAJ59s#Qm%q{&@TdjZ@yqVPZ3k z)otsK$GHF!r?M*e8-NTEHLADjsqZjD1aiJlhKW@#dj=_R5SY{P8HWQ$~hA9_2~C?EB*_ zg(C3@I|zR~3LNwMIA-w2W7zdjLA{g1lZ}F@3jTQ9IXsahTYtQVp=isi4*l`CbK7#V z7y9F|Ronivej)hd-2_wk<5AVlJe-8jHDBOM9zL~rNveryz)?C=zn8Gk%Z@OHpj*q@cW1zYJP zu{v(@0QbxxNNu$+K(W7_%xW4#)d7p1MO&gpUzEX%Qe zoVLEuSlW$Sic6#&1q|^bGqCDOa4Z!OIxRm^>$d&H`dl|b>JN% zFMe$-TVRNDv06*3bGju_r?tA*SRDlm{x(@FtAoitCr7+-_*Mn6hbv>i$q}b-1J}jq zT}R_uR3K-{pxa|-g{BYcx-`N5Z{gDal9B7_e`&JuzO9KnF-mcMQ&UWAHu|xIZAM=mPB9U~rg=_vEX71? zE99n_D6~ReiU~fYz$`z-#3(DY;YBpPAi^jY$ck4VVpa>Rh=573gE56L6szaVtxGXc zWrg|_6PH_Iaf*rcSW%c@w`Fd%*_M}#ehMLMy0SQ&VuBGMJ!f$&#f0tT;@k$ERM%`* zO$Yg&5aUI#9Xyduy=Al~5?5_hVY}N9-qpN-(&J75$?n4IrCjJ zR;(}r)@+~sQ%s^f{+~n$Vf7H8-3(nft0!>qSfW>9dK^PeuM{_fYse{TFr=(BiIu~K z__><_ADZNN9#QSEVt9E79c`1y)6yMSh_!)t@DWf9Zmi@l>8-U!8-#>!tpad%@SWOG39wGs9fcYVIumT}zIhneIFG|DU=Bl$0^Fi#@Cld&1k zqhUlt^L8*Y$Dz5-*b2D+{e{EHqmX0ChB=UI)n9lDvoW5qY>B5Qn+Yz#`qtoA)^lEi z#h!hbhs>E(T~$_pTuEKUa0T9|b@q8Ne?~9n=@`WNVn)O$t|^0K9wuRj^A`sHtMOaL z9l9e=bU7a$rL` zvcJ(m(L$@s_7GI51;-^4?S|UsARJtSLHI9~HG`@Ku^aN;PzV?Jv~%EIdW*xeZ^rCz za&)BG^Jbk;!mA3r1rc6p9voTW>svxsLHfo1*Fq#U@Y&qeb&Y<4#k)RLi;IVk96c=K zsEJ5GmG$u4hsz^9fy-u<)yycHJ$<1=|HUD_27D2RL_|iKUOn$S)8V{XR^MY*U&wV8 z^JYy0mP21&J-=^{+Ug#qz4}wbk^9zqk`Li^aVULTiv#hLz6wwB&lfJw_FkH_y?W(4-=TfXP;NyWQx4`&1BSW&E`;^OhcP5`H8_Kb$^%_usAe(|#nTVMe^ zp5bmONpbnhY)<)c_XkKcA5mV?j3VZx(?!-agL zWWMoe0M3wHC0rz2Dx`A(?fG7Uc%5*q@E+m)LcV9F-E+cMh5r!Z*4*Sb7Y-2e;f>`c z38x9`h0BB&3He==_IC>(5k4!-!P6!46T+^-e!`)`6NJ-*bA?NU7YkFup9=34ZWO*K z{I{?P9yrJv90i6;i1A2!sWutgtrSH z5I!lSp9SmND*Ttw%zY32Fud<)KHW};WkOCILHQiv6~dc@cM3NMpAo(;{6NT0y{yOh z-T=Eu?k5~3GnYErJw@^?;TggUh1UvyE_^`vlyI}~Jz*GMtjzcbON3_bayo(cwa{S5TPHlXpH1(!V2MRVV&@F;VR)ZLNfb;LL_T_pZ=Y636^+ws5SVoXv zkp5-qw@Chn@O|k&k?i3U59^5$(N0UroWglwe~tr z5Srgv=*=r_;5g|g3a1FC3M+-iX$to9B`*@5E#wqiY|s2Y122_qey1U)B(D+PBK(E$ zF5v^hhlKoq&3d;8-xYo+{I}5M?=I|O!dzi1;eNtSLUTU=`<{~f2nPuV3r7l%6Y}FZ z+o=%F5!MP#tV86VDVZPEY0n9)h(8zpLP*yr>hBXiB79uPxs;gyyzmtvJu<0(TSy-d z%A7lpXzoLRG2S--bA|cBHbQ>oXFey;A|5V0QaD^l7gFYr6HXKw4>;(}Oq4)==BJ(E zp#k|JpYr8GeyXSZ6CppwQ@&5g&+U}|DC7rq%6}K~lR0H`KLq55amvQ`7T8{LM`1T1 z9cgLDPvpd5!qLL9!V`rj3vpZFgm4ewUtb`a^2j!bpJ{`QuS5CLCxxAb-GtqRMZ&(q z!NQ?J>O^m8+#5s2Az(h0@pwB4t6v65=Uf~Y2jRT;7eB8G z3O~)f+i?)j^g9*Et3W!~?u3Kz4IXxEm+i3#@pP=g`r5)E37xeKkpi( zgY^w9wA;t}FqG-~)~XE8Q7-+!Ir%*=2wGSlSN_HmeY;R{*W8(hWCt+I;$%av3%7&I z16YIo8;$US@P~(kZ!)-F#j_uUZ)>$9yuI1S%Re6T<{O80&d+|YS$2>7oE;I!ZyuKOUbCEL zAD{n0ct_-ett}((HH(aS^N?f1JDR-zTFdZz&B6zKeBSn-t{eGg&ZuE;hKD}#k#pVR zso)9u@xsgZMA?TD(kt(FWuH-AS|y>$E9W(Z8cr8x$Lz@@2$fp;oYUV5JEsmSr}W{LDX*Ha;Z zKQk3IfImZz#zy>^)>I{14q!zqVI0=n){jCFwsTv_FF|frnm-d=;~D-;cXTBx{>%o{7~L&@Ci;9M^D+7r%kXD-VTxt=GykM(T*26$_%lbM zYpdPZDKR?w$IW;{!DD|`7=4}N=*Ej+1$tse}>_>V>|I@CSVs< z#4`MuSOfk{tO0)}cDEe!WAPK&&CGn(ybX^voXXiC!=G70F~gs!ry@Mm_g*BSl{-+RUy@@HZV`7^PG{FzvWKhpyDK(P#e=0~i#A%7;8;m`2JWh}#= zS->Mb!=JgIoy_oOIPr2U!=IVMEz0m`NV|xAF8)jvN_Gp!riNmMKf@cWSb#snhpAYA zKXVE51N<468yw)zaN^cjfImZGMl8UeA>Sqz;LjXOIl!Oc!(1%DpZOK#0DtBIwjbcn zbY=Yk{>+nXKfs^iOY2yGKhuuG7~s#`KsmslNl*^(XLw%4g8Ui2C65L9GcFZD{tRiD zu^@lu4%YF_=FgOH7=8W>XY$RBVLofapE1{x0Dop7M<~Fb>CNrm9e<_+>TMdseAcAM zB>uvY3GipmWYGYBhHuzojpwr_#X|gt{WisxgtAD9N&JMS0sc%8gOD0cT^4_%kugXKh|i71Sq4Sco;|&wyf) z;m`b*7D4_Dog!mF{tQ3N#De@8QXFGJ{>)Xh2=Zqb|0)*b&%8~GFUFsVVLoe8W)jUf zrUCv8gVn}96MrU#`K%3phF6`K&!1_=k=QMNW*bbuEdGqgEy(a^HuA&_@@LE|%UJjd zG}$46KbAj}jrpt%f974-pOqwM)JbA>+++nR1b^nYP-SQMGcO=7)HKMSITD)~0;7h0 zxefUIGE5Y$t100%9Anu^qNEWScb~PSK=q_qY9p9$iLmgjZxr;hd z_cG)cspBgJ_jJ=n2-*LkuD#Kjz8nGFVOR?~8C_fUk8_UKPeG2qVt7M7CE}w;yDFd~~|3#ve{PZMWkNQ-VZ` z!RZoKcOqndj&!=*j6V!UYD?T{N-${3!gL9%TMhXlQ{n-XSduRBOH*PUa>(bjy|TK; zA#X4x{)7_i(k1RPC33MBat;(j}}eFNSupI$dYtTrwO7{^2`G_uSl3sNukc$e0b2Dy-dBKsXnP z73nfG4f78jz}@q5&-Bau5GGgqW$r@a&U6`?hWW>oIX`!uUuGjr9`nom6^Yka<{+Nu zlacVI;*WcMGg^)x9Co zwHao2VKt`sDKI=4Yj>8k<3T%*e`;9Z#@v%oz>LQN*fGYm84pq+FUIN|#4)64xSsYm z<*xSa*C6{wtOqm06nX&CeJo^KT7`tiKV024x%c`dpMlLEv3BRk+mX1Nw%cg;tH>v` z<0kwAHe0cpO=+2f*Fabgrj;3q9*_>fifbH4;t3=?{&^a!dru@Y3gckJFUfWkoWe?+ z?V;a#ZC$Sv<$At>OH1e>FV_fX;UEib@N#+WD1!T=6MDqUrhscVsfxXRg$rfqDzBYO zrDqFYZ3|obAIg3op>1SKoUko1bAFRZX4d>faMt~S7{fNkA}~$=el6W50r6{}wLi^8 z3w>rvnh06dikLMy7kSZ4@%oljApD4w)D3{ zSO~{5?Q!I%O*2)4hf;_^w?lqlZql^XQ`|hnKHzRC5(Q6UuV8_ZEtB}fZ5Es;xW}`0C$%*5(CClbtMoWwUK%%#r(@y);df!>yz;&qUnLJ7i0COMuEH9e>arI;WI z387|fY=I@foMV!A6KI!^gVl3tT{G~7 zR!`v2vjmuPOmY**oFm$F1LjunN$ z%|eS&NU>Mw+${iG$3&BDw63}NC^zW|cLN@_N&MB4xlp2xQ9oDPPMIvhG|6M-We%w7fg#zs2I zYp|jSfqNiW1fp56bIq*EY?al<*s5uBJS6TM?0eSF3No4NAl+dz@mEVBa0*t}c&{3z z=dfZ9WnROfJhE%xA`sZArWF2!&9RW)2mUxVC^iaq{91uc%oJma^>LhXGed}i)UXK5 z3EbL-22g033@pbQIPSv`{bFVyIY_9LLqzj{shz0cUZYGOyv@v|lLyb9M&cUeH#(-n zX4-@FQMb#HxCO=TGwn4R3D(Em-*7{zVG)c3fxEV$0Tfzxae{Cp{9?h8;PF871|tDE z^b!8h-wDm}N;}vl3HI7D4*6!`wIyVJ`1p(00$)xq5AhV3Z%;prb{-1xrw)1H#(Dm) z9`f+=$DTU;%e|xq)C@2FNv!B8FZ=dlH^INW<7(=g+YYfaytbm^P~%3~8D3+N7j2y9 z|MDU)XLlWPLoHBy8>~_1-6wPWhKV6+xdxAKqihG|&gRr|#Wfdy%@WS`l`wxbSbJ7F zC$PIbb0qWfng^ma$8K=vg-*^VpX}c;J%XM)8Tm7@qRM{;tBmYbX_n+KcjMAth+1B_ zciu8;xdsQqrDD~t%w75jGAA$)UW^KvHy8-d9J4&<_O#7+BmW7kje8y0o6@G_)4M3m zofE>!%bmYWz`^7%ossB<^LxcUpzT>D}jVFw4si6`xrv^zlT%x- zewJ-c{+^;);VjsRdybbA49)?*Tww)I5C&GUsdUUNXwxyX@K(`}nFVzwO4iP7^F+&* zEhAp*d=Rn8FRun8+siZD^5SqP($2dSylbyjt4QdmmQgnhwsq8db)jprF7dPaq_bXE z*2R8SBAxXH2<%lH5r9XT~LSyLs4%>1lwuH za>*h)mhbxoGXr+^A{YB+|6L5rJPk{eorZ-u-1a7gI}OXuS@~vIRt1M;n;8}y0>`kc zp7&_OvDu=rIWIFdg?2kI04Vi~voJE=Q%>D3nEgeOc6N$_eD30ozLf3NW6yVkssI(B zlW97?DG*IY$>`6Nk>ax!Z@iQ+wp+i(CFb$Xm1 zH~;kEA3R}weSzTkJ}@{(Kx65C_XzJ7 z(nXkd&k0`@{zJHLo&Y;O`{oI-;}F4t&f|ryI>au*e!^iwI_5Bc-#h_!9KPxE1Z>K& z{d|E4kCeX%Uz6USAK*RdKa$>`A0P`K)LAZypq&M>f@OY9uQ#gkRy@?YCdoxb}@NDT#oH)p4o&ezYrN2St*9dQw{+E*P z5#BHTW0Ic`{!#juBySe}P5O5we<(Eb2cVx({6KJ=a)ix@(C;s~gRp>zvfY(GK>EXl zgQY)K@)+SnBFder{7UI(32UT3L-JDLN+QawR{qt}r-V03|8vP^J^^gUuPCG3dgcFK z`A-R-mHrjUuM4*jQSN=^eZ(*n@@{x`cF;2~eZHag_niO^x_Er8s;Zee2!ZAdYn;@JltWbWHaGr3X z@N6Q=k@HHtKzNPvuM_@6_*3CsMA+X;#CC3!ev|Oe!v7O)Cc$)juM_GTqMM8 zpXopE+_@b%Ee#^u;9dVT&U+k$s2?lg`0%W311Mt zCj7hb9pMMU{|GThtm$VHVKZSHVLKrm^tnA|zAs?oc|H93JE~;2KzO=vnQ(>hLg6LC ztAu2au$`X>&HP}H?~r`A@Im1Qp_w-fcAF%>ApDE)Z^A7?G6~p@heuyxjt%LxrK2SFEtpT5t{DN?^@UKErA!r{Jk_JK9#LWiwklag1A_Vh?3rT{Y ze6oPL03n0> zP$uDlI6-)_uvl0woGBz3g7#+%uNJ0+cL{$jBt3%muM6K2ZWI1fxI;+l1nu*M-GxQM z5yH_zawuqDBV0&CU8GY`e}Ry^3Ch#{5mpdkNA3glrwf-!PZ|XER|v^@pnQw)b|T7?`9S?c zLNXjE|5^Al5q4xWQ2(Bgqz1|fVFx1YNNu3Lmyiqw$`gfCh_J(9XVAa@fN1P+x*Nps z81(N`+DL9EObR;-i-dULYs#7TZfJLq8BzRtT$v^}@x%CBo&x)k5=r z4(B&|K)j=@NRbByh_-$X2H;#Rfri*F+v9c+`3&Nh zLDCs^fa4^Y(BkLunI%}?lB4NVXzOG1etj1q?UzB)DMNje0}4O63VFf$R--=NpR<3t zSpE90L)tHcr1P63{&3*5_<6jR1nZkR)NUW^Yl_vcZ!OX+Q-qbvZ@S=p6Rx@b!aS~b z34OaaaA5GegTMH84?)4Szm)c{-!*)h?Q(elYp{P6=$}7+*wyL&@!JHB(Q1HMu0egl zW7Thq7&ttfO|VNs*&2F&hhe*{pKbcbJd)0~!o8bUsUH1%g$1PgsSQt3>|MLP-QXXba4@G*?zTHdZ$fnMD58-^5aByKWB8=4;hC+r z#ugp;cGpGjkzu4JZp~UWu!tIq2+D<#p13t`Y{IBxDAJR*Mq!g{ zY{I~aTbr2tp}FAru*eLjm(2nMsesk>QX$LtY=V-(;GHv;IMY zSmbC_xa*kVcfbyD!bj6Q7A7U!<2*Wu4Sp3=k??i+8|{SFT(1MJn}`iQ3>xnoX4aT= z7H0%tZ16hhOlZ+1IG;i@rv2F99E3b>2V;Z(mTfG831WjY zjW!e;+_o5wa}pQC2Df4?&PPAQ2Df55Hn&w(y_rgSc(nKigOB)%~dT#!kkkSvB57vR~Z|88bm)fIMdt=&WeKA;A#lFhu8Xa zZ15M*N5uwL0mTNFy<&q~X)j}g_ctx4V}skWZQ_@56Mt()iLt>eDQ;-L2;F0B@E+Wc zkF>wZh@InSu-A{pA2VXN`2MI8vBAxwYbG|hZ73ZZ+-^WRHn?qfP~1d6{$ukkrmDg5 zF0A?K=A1k!RFIAhZmSv^H*u(+*O@muUW{Fe*x+l>*HFRO_(|;KOD#SIAZT@*vsxfF zcrO@*3MR*=a*JMT$}^a;!N;+o*LCbMHaI)PqOHsy9xbi-?ywd0*e?<6#AeKD{WelI zHaJHoK>`wEgWC;q5`6K**x;w&2c40i&tN|0HnMUoaW)&q+(uT;O;qzx!`w!;d|qM( z8f9$o@8MT7gxKH%X^**$Y<^MV4?OTOw~?9n9I?Uq;)}7tZGI*;IO*~s#0KZh24jQU zOGzd+xV0aexSj1|ZX=tYi4ATZI15H6?&2_FZX;_yHgOQ!$J|Ed#VTThuVX&uHZmVt z3nnLcUNJT}PbCu@{9kMUa~ts-F|om4r2=ysF?g|w4gPahiMfq9F^9+4;A2<^<~G`F zEZ$;laGnZwC#5hTft_STb`C~-xQT?9z#!jU2MrInKhET33D4&U^CnN02^RpgP#bCgt>NOZX*gf#}hGb9_BW(BN$HP zbB|$eBOMWFksFTi=lGk64SoZwDnSnz8=L~G@?(QrIhweDRX2_e&Z+#>Z5tc>L)>I1 z4q;W8+laqrtm-Zn#oR`AKW1Ws)0nZrujW3$+(!JFU~KR{>^0^#vRg4CF@yDCZliKj zUnVyAbko(ziAT7XF}IOD;VKdju|3RfWaUh3a4Xj*9$|Z!+bC-Gc_21;YokDHa86yr z*x>AeS8$!1n1cjkgR=?~8+G*#0Iym zY(#AEVW^(HGGmI^;FQ@ZBO^9A<*vT$#|9qLY~nR-+jL^I zxjWv)Q-Kre>@;a|1e7=wTQ`U@999m_t4K2#agu~+OPCDG#bC--vn9k5c7h57DCRT{ z*_zQp@rrX?cVtWIn{;$WwxlOVt|qjQeLQH-88Di%K@4eE*yFw;Js*bbo5Mcl$3v!l zi}aitvS``LIS}2)v@#l*Q*n3B2yiM3eKKH(mt$K)4GY_viw#l-Vg$W1ZvmKE|+Oz>4E zX2Qr%F~RS*5Q0&Up)nh;4aaF^UlCwB3vO~>teC8$F2%$^E0m^~m|}&B6chDUs4_ji z83KwE9yNMQfWgGytq@BwVY@OnIF-ci#(sQe7{;$fQ9BHnxgs+RHNj!P{1lmCs0j{3 zO>h`$g2RAnv8=%g0yKdKOT%d_aG~PjB7;^$O=H0vO=H2NJz}O1Ivdjy372EV{2ZGG>wHne4NID!^pK!0O-*EFz2v^oYlv1%&g7o zUsX=Cj+dQMJuC%1C ztQZ$QXUJhwCf1hK)J~Z>XLiZ#x}siFW>nT$hTm7k^!v7x{JuUyUoP$Dkl;+ZeD8HERSUU2cum)(rULu9TF5HY;w zfo8W{K6|O$4VRBU6nd(T*>CUkndUcSBEO##KaI;6 z@Izq)k6COdUsxdQEj&s%R#+^YBRoTRf$$pPTH)`7#zzm~a!fghLtS?Qk_8qOd3`KIKz zh5r`1c!kS;aAE&&I2+{e9cB915ZegNn-|D@D^C4*AwN}8K1EnAoGGjo`rMEul9vlF z6#ln3A%9l=|0n#b@J-=+!hZ_+qr>enZ=Qg0$<2lP3ps5W?f6B2$PYF|-xtz+lYs1V zLFgjE{Bq$;VXcrcb(p_IxLkO?(C3c)K=L)hn}k0R@@oX^c|!P%(0p=({$Q6xglA+E~A{!4Kcq5kbQ1QN9A`B^2-P9j}Q(M`Y~Vm6@>Zph9E8xGA0$}^Mw}+ zzbCv(_#@$uh3ka;=Em~B5&GPa$0R=?d`3tg6WYHf{JU_Q@O`2A9fDmhe?Nfy&`LC3 z9Y9=8_vq97-}Q;*JEz&GQ|0gbw=A%x3XG3Nl*Smzi-L$rQ=M(!P?1IOZf4n?^`hxxI9N1ny z`S{!W6w=tdYJget@FN?n&);4mE=TEQDD09@@>30l$kfMiXPbfHa!PUh^@q-1{Q6iX zXxA70d&M^b`gZV%?bj=rS<*hSy_3lzqqcv06&3aG-#?k`)u*UvpwWN2Pi!9i#j!N- ziS6;mwlOPjTQU3xvG8RV4EHXLtUhZ~{_uj~P2Wknx$h)H$v)%Xh?R}|sNLdmA0led>;!YC6$nJ~)4c2j149((8a%^f)8jnI7f{f1m@pZ8AEyZEWd)!tQ2 zw+!i!yJbkb(3T-Bz01N^Gd}5JOlQ7YGY>7!WDiyy_3%XfGzb?cHHp?X+{QQBFy z!z&1HsR%!?WxC@QKKMo`+#L`S+_B=sdN84-dCDkD}P>kD%JAp*Jy!1?|-0%>#CvYVZuqA7Vzh#_o8R+DvxV3 z4rM~&NG@``lW9C=zfz;hx|ynHa1e)Pv@y4qvB*G5u`H5W8pSsKJB_=y9EPGEeRARR zJDEVIRBvF*(^zFJ{1=q>__zrF-^ZYW(-!{X3l2^Q?=bWV{=e*y$47Yh|1zERD5|Fa z?*$Ny|8ILVpG}_*`2W5QWp-Cs!2g$e>jBmSDHA46{=Z}m$6rJ){D02@z^NymLeJp; zyTgd^|Gl0SDz@nk=Is>Ql=nF{w&@huX0Yg-J* z7o(f-|FvQ)zP}Okt(f-zwW9C;yB(Fnn-BwaAyPR@@h2Nim~F!ao@`M1|B}rcFJs%8 z*rsoyU-19+8-IjiCbsF5G|t2}-N+5f#5Ntwu4Q7I@*)raUt3k1cpb}TVwG1#MhI#b=okw|3u}%4s!TA4>{%wZ z>G#?1hOtev_CB`hPtkMw|6a<5hI1n`u}w)ch5xSx7rTeQYia-ACMYTYUlzvECjVdA z%m3F(JNf@EWmETL4?vBff~L)jrTHH>YV)iAbcRwlOTZLBI2+w>@k4P%>TWn!CN#GRgr zZCZ@Z!vFVKvw>sdN#T(M1aP}2JUa&!{YSugy5?M`qK zoj4eQ*rqF)ABb&Ae^vVbUdWd(1-Xecd8h?qoBIC0591Dj{=XAwABb&g903EdO%rS{ z5ZiPm(0mlD#C3b4U zT)P9YO&{de1Y(H_-z+9M!_lYRt>MZ$;UZ^r-k53I^K+6Q8rPGZqOY*Vt}ck=(; zjFRTU9&)VzZ&w^j3BFvU|1W?2=!^PC77fHUrK@CCAhszd5}^MteGz6;vc%W_yidn`Q-Ko6>WW{=favSzN*01h0fy!PutdtRWcN zbRjK*u}xoPo59$o3>-}VUv|PPfd6j|w;~wZl<&Cd|7$Ja|NC27e6iT3S$=F&-~V^1 zIhUQpkGT&%Q*6^LKej2aI`seL&TVVlaCaNql#v#{tk|Y}<(8F+ZEAQR!Pus+@o0*L z`=H4V_hA2I{C^ka!2fp?cIsKlQVgk+#Ok<7`Tt%56#~~591kn_|9&5K*@$F%8Ej0T zPcR&yX%lLBD>RWX-^513-^1UI?vt=}XVKddvul{YkUQOl3KheYuQw0H+UYmc&1ufp zvwXF84AxEzP2g5HXTZJ9kT+5H6pY=uEm8ooF{-c@+(Wxsqq`n5UvYIVaojr7yMCy+ zE!NJ{plQL*y$$IP)Zm`H&V(iX1uEcXbuNXb4Q*y)e5PPU#rr&n@kE^VHHPyuy_yr> zn)rQRf(J2<3_N?;_;)yYnC304a~}>!&pG1(li=aqC@>z*mIe!p1{F9??Ta5c^x~Lv zI$=eWGeRL&go-OoF)_&s6)7gBS)nS$#40OPn_yhuvqD{p3G+PW%&ku`@tDn7oMPf% zSmBRL;DiNeWon8E&enw13EhnT%y5c{NmhuZn3!gT+!Pa>U>Bj-@={D(Wrh3{6Zcx7 zp-U~I1HwbrtezJ_^NP?jt{sxxXxEv-j<8WA3EfRS2)DgLa-x?chiw@ST4Is)B1RV?Z^r22pbJKmy9Oz`)?HKXhAr|G@G?@%yi*`w49q_ zn!T|3wpaJ0<@^-W93h+Euy5#r;vAj8Pek^px@0WXT3nPgGfQCz(fwSgw_(LGM0g)7 ze7aq;OZT^pjEy2b9@FeN9E%APu)?wUtP~UMFe2O$xGN(Fc!T(OOtPDFEGF7?gZOx8 zY*z~p+7Vb0PKm(7HiW}$8gQ{y6L|1KUBSckHmfG^fQ7o6$Le3Ln!pW%x}Jx{D6BYy z3EY;DbEY{sE;Z^Ct^(X_#k(aU<3m^;m-4h{fqW!MU;d4_RjQLhQPIi$9TLev!$T$Z=k8lN?)~ znuvbIu8c6rNd$Ez%oB6IQBNSKD`q@-00#n^wL@JTL;IrFB+@r2R?6J8P`(rQ44(5k zDhaten#Rr59cotksUC^WKBxE3@APhiCe7{B>ud6Qe+Red#_K&nr|yOBAb5;tCnK)6 zAQ|zZCK>e>zy@iANZc5=LiKaqDC^#J6SW_rbU;O0JmKv|Djhm=<*d(0?ZP*PLgqj$2$m_ErK<+JDXsI9B1 zoL<+Xq^h!{wsQ6iD9h)~Mi8SpvwOgwo>&VV+>J|ua%2B{92fojGEx%V@9Bp>w|^gB z+&gdlZ;99aSME8_fHg-M@A9KFaeM3$4ljBWS<8(4XNu1A#k}a#SCY!IGF&X+v|dt` ziF!3}_Pp9M6S--Dab-tfF9i51sW(xus`~dWF;|pgc*C0zVfaDQf%4fL=Nqv%(!Y)l z4n@nt33%3553S{~Y252S^)997?yANQ?>^uBV!MA$NHhmRZFSl7%JRyxQhOYfA#7Lq z9K`*pDw$CWE=^@^@$`BG=Bh2@F~K-$3hCvWW4|B|tOo>qBcGvo_N?qXDU!HG{ zZ+dIjZU4(2Gqwe-nN5d840M_%pEn*j0*$yLHd!lgprH~(_U*9rNFnf2Wx^nLXC zj+gr9gs%$!A&g*fm~VVXfdeED7xG0F^Z95^tQRg5^2G-AR}1eJJ|cWpn1iQ7+9iZt zg=U^^=!Z%^K{!old@+%~M6&U@giP-P)@SD32693y${U3*3jZx^f(K6KbIv9rKkE>U zM+VT$e+{gY{%qlu!c9VYV6fc3h4lNN%t_gZ2MZ4sju7%Q5A!b*nt7)oKOmWJ_nH5a zaI28-?WymN7wANOh9piDmI>zx&kv@e_}+!t@h zjtgh6;rN*8ser$d{G6~L$L9M!`a>jhx)_!lBb+9z5Y86X2~QWU5?&+xrSLu?_NDQ` z2l_tv8TAvD)l z=xZe#2QA1;Brg|UD7-{?m5?tfS?`a9w+inN-YtAkxIy@YkZ&_t{?Eey6aH2Brtlr% z2g3gdL%gn{{AZ09(Oc#E3;BVN_4vO3rIIUzbA+|RMMA!sWVw|>p965YRMgs%u+7rrI*eg5fL$9g^y zX7P6jviW@j@)IrPLxqEdhMNXG-CUT@DNKnc3QrbJ7nCPp3E9{X)p^*pwT`kKhMp>faS^7noNB;z@JFIU1;uakiJ*)1Hwmz8-=)S z*&`R`eO*`bY1h<#KV-X3VeP_MbtTh)bu|_%{8U|8eVtRtms?KZwAxyykcz_HJ^z3E z$uOW4m}e@EC6~Sy(tmMjGD}DN#c<+7k6jwuF^|iESn+7}sdn9A!!p5kAMz`K9*4YH z#^7&2?eI5aA?_#q#m_qy3fyWqgO$;}6P|CdugTHiE@yr0*U4D@GDtdeasRU`F3hY( zcGb;rpT&x__;pl54z_zE24E~UitVyJzum=1`(==Hj)g&z2`zqJJ>+10@At6xN30LG zZ|VB@?C6(4(m4$V=?{p3yz`L`))&U7MB1@F-hcW1yB_IaeW%0VSN_fprgV5KPChc@`zU&__ z4?+>_U%SBe2Dvc2XT#=I`{l1oHazy(CKsZA4p4qN>FgC3=KYQh=dbtcYmPbs!|HTL z|2DH?ExsMNFar)vW|mLo!t@@{2b35rpU#CbUNkr@>^W@bhbI>XbHvA-ZOfK8nEM^` z#AA;5yzs-r`)zM}Z~yI07x&wqx3>TGylb*{H2GJ~j;w#4m7l#M=i@PNR*lZy(PaC^ zEi*@FZK)jD`J=pzoj+=NO~36qD3ya!xhR$UsiksJDhH*aC>2Gi7)r%HwNwnHqSy4_ z9zu!Gz5TX_Q7W7+W&4)%F?*Wn;eGG8O*?-SM#<1M5o{%Ax({PZS7A2#7-pl7VK(}h znT`I~O}A}#9=LsbXz*>@L)Eu$cczAS*PB!MzHMYnH{4ZeMQ&e+?w#~g1*eM z#Dg&pTH(kvW+!x-bTkgx1NP+vp!D+~S*?>xS%YFF+x*6cU@b(gO-=Bj@ z;7lKjFLc1F$htH3`M57bbRh8Y z3EUSeelhM#5%=S6xi81Dp|67b@*2C5;lA9$BR#`?na|t|_k~Y8Ujz50n1k^dxG%rv zp%&o2@MQ?+zTaE!%LKL;;J!RTc@Nx|cC3HC&(#^4c#Z7`xG(3ie1QAHht555Up6p5 zz_XyClCs9U&`6^XW+hk%;V}aa9^Hh zdtZ?Il4Ku)+?U7Mi6Hld(=IjOzPv$;AonGQ{rHl&FZ`g!x$nPh?h7Y%;@tO>_@t6E z53O)2d&76a-1lE5_hma82ykEc#)@;_7vYeGk90U}UQO?w`*I!Z&q|UF>?E-|Zqj@k zblU$3ssQ)pDdc504RT-j&5LXp5>gs+UyekMJ12^b#;i)_FXT@DL51M7kmoWO8A+_2 z!nB-gbe&+>0&Ay3+4CC1eYqAgKUsF-_fYU$_}acH4hMdoEXbqXJfj;1xhGa~U*;R` z3tztK7VA8w?2qKZSTT8gO^S)JR;WucG1Ut5Q%tO|LVbz}x_+a~ zBExC9*9wbMOl-8mnP$R!eqn;UJ0TCfK#A%U6RokLb;ABeUmY?;2;R7YB@s?Bal93x zDJJ-h2syD76Flo6<$7<(F+3RdFe84*a8yLE;fpiPh|i?$^<=`^SV1}> ze25inBG>FV-d<=%d?trth37uOZd|Qvb{#hZdII;CX2fTbn?T|U(WduIT;VY}7^~}i zmoOS@2uIOW;C!r56P96xx{inCTB|0Q52w!jdLEOTt(x#IR#-3IAAPt8D@aX*8%&bN zy;&e3C$m~DW%jAJ$vKgrKGjS`y27dn>eGDo=~}BMs85U7r>Cu&pgx_+W3;d7$ccpE zSVLe`@<`=pRM$C?u*j;T?DqGJ`UKQrmJt31SE-?6w+CW%os$T*+w;s&&bDfT?e;t~ zls8&6!FGF|8Oj%}nqa#M+aBoD+7J z*{*Z)RKO~m>wVK89xg|h71YB$NL} ziIzn@)GNOY!wwnRm~wIeHv_Z{!`EO0hBWnLwWudFAn(KQP00T+_4Ey_y z;h=!hlHrf!CJ#XQjzI#+msU~Bo;?q-BQGin88GNWdK-63MgeW}|3fy)++O|Q$G+R> z5PRaJ;Ej5({&a$;do-ChHD$H)s_KeQvyS-Hmg*Im7n_miTf4OZ@LpS<**t@${;) zlG*dBL9#F`v*P&(NdWE;m><&&r_3h%U)1fcI~3ktDjR_F{h?3$!}Eu zA8=f-8GEF%>|>++&#+Of|3)xYL}&j_8OX=bUGh+UN}`)CNw_MuwNv3sgV9e ztmks!b;7m6dxZB3`No&_`?x4}9QJWh>^SV>qS$e`7BBR8e*9ecfbc2dX5o9nFg^g$ zzLk&>l_~GzqS$fxs<|kGd40n-q@hCkmr|xbDsi%KiqKqNp|6x&Bjnpr+MgvnTX=zR zweU(I{VQp|MtFg6??H)tvq$7C z!o*&}fxgV!fS;$2>o~yKb3rk@NVIQ!VSVF zgntmeApDE)@4~l)9|+AP!{{eJB(lFPg!>8G3;9uz`6GpmxhBQZPZ!P&TOjl~ zC@Und5?&&_LdaQ-S?&hmPlSdu3H{xY4R;dqLy{jAHs+rEQ+l6+!jCqrpT2Fxrot9N z^ZN#U2gzN8hIxA@OW_z4Jk+?zlJE7r#LjSa66Tb=a%aZ>l+#;lN8|(R}kl(8*hr$-=c0jqQke`n! zA1*vvI9%v+P{vF4IVh({_Bkk(l6?*er?O?eJ_luqWS@g_zU0e<-xpphyg_)2kZvNZ z?@r;bgq-k|db$S@`SF|hrtlr%2ST5df^SX6&gZ1i1&-xf2wMx=3p)xA64Eb__I-r| zg@c7dh339F%lfj@o(mD(G5EgD=X}bz-ESlPm&N_St^2n=5Xv`+`@!qEzi=ON;csm~ z?eLntH{6f49rup=QG)xcz2SaLZRR*9=on+a{66uw9=B=EV60p^gZuFS?8t?{ZJjw5 ziHouNWsr1!frB#1gcd)q9&)h0*Sg!|oAu>j<+!juKCAg{rdyb*t}|hS(3@U z<9jZ%Cg!1`D}+YAhsQ`fO!|4_s%EEBYAhyHC=9>KTk*{@I005CcHWiPlN zMSYF&r*l7EMw?g~a6iEN$lZ2F-6rQ91Q35G3EoFCJY)F8tyw2c+8SHb3hSh;Su+oO zd*#foZ?9Z5^<0r zVIPLQw+DL<_Tib6wuWFEf~||P?n%4rk9*|Mts(TvT@=OkM6f+!Y|r<>?idYr$7rxS zMvL9CX{&S6Q(K)yn^5B=us;x6HRJ6y*ut*pO&7Cu+)DTG^;?~p>tWGr((Pt#TfIdIlnJ9u7-b?T6WMK<^;;v0)?-Vz-CKRkz$W$E@G7VypB{&qp z;h2cZGaQbEF!A2upQ8NHG>?Vp1m_)uKj3Oy1yv+`9sWk!pnliO$7zi?CBvZc)-$ul zq_cP%K(0m|bS6&8RwS}{^9Qa5pIx#`Q6sn-)Y~{Ed;)1gd&Mc~f{w+T;SabPv!D(k zPRSD(5^yyhHzMMcyuk`@^;py!!t~GEUW9bha3pLVNZiC-$+yxVGHJC;l&GC^ftG8MV$2o^KxEi(tu{g;x;A&VgH@*~Qz}2v#&(-*ysfck( zNW{+>hd+PDYPJn+ll4ok2A>4t3^NC=hQECW!VX*wD~97Aqnn6RV#QeeKQtaBF*i|H86IN^BGV5z7vi*e?D)2jeJ-Nv8#V;Sh=paZ3375Z{Eohd3qX zSpuWZdpU45C~{W&_oDvmKoDy|RaZ3Ds!QbGl zUnww2Zk&%5JI5*MZ(7caub}b0I;PshpQQL(GfJU?cJVb7H?&`b?u8Jiq!;(&BkgZ8 zV&`}*5OGQ#Gh(;+WH$78_UlIM-W*e6IfzqY8!CcW?I2Ex-GG4*YaGNWv3(vCU&X5a z*nEpAJ2>8!;?vD{7;#AR;wn`2oT?fc-^gw}ud<`#bQc0wV-5NmDi|9-mANmq_!tl> zm=HJ4-zy4{Sv`W zY{snCuOVgQlyGzsbUtF761zc8VkQRzT#ZxkAP_1DC+=ZB;*?l9mRQIwM4S>U=O*~D zOs9JBbhHWR@V^i3FU2)G(He_(=MNaSkV zXUY#syutPnr^H@L1}BbX{ora?`=N@$Hh)Coa+U{I;~`UibYdMx6>&))t_IH$uV7;+5u*ZJ4f>aR1usSt zlikY>7!w9ZM1vaM5Mc4onr{qLf zB+RuNTn!31#}nJRHQ;L45ez5BbNj*7&=G+ax#5v8t8X&|^%}0m4Xo-!^dJjyN+__Z zYgrUr4J$_z%Q$jJyDg4D@4(Y@a+p{LV|ClcDftjL=!uT33UNyKYsRV=J&AEj?0yU< z`0|Tf4H}0EVhKaDL!1)+OfXK#Ts94^hTV!0iBnh~;*^w|`o<n2RF6mT`H0&z<2p#|cUSjD|=;stgSTn(#0oRTK& z2e=xxm5r{GGYr+US7uE2vobqn0ARfsoU_h+BX-CA{*vZhJ$b z0#}2#QiiLMKtArr;%KtNUr?JkeP2pO@B1@sJ`K0su-AbSG`oqgaZT>{AtSV5yGO))Xt3Kc0P zcwQi)5=vDym3*c#Z}%m4&7cO2U`=dLr3z!l7maEb|j z{(%rnF(Dz>2>fkBPF{)$3He5_ZO?7gc4n{xZI5T$F;oEN27zCpz`_U{)(Efk5Mn7N z=wc2b*U&hst&o>u!ZufvpJGBnux+$}%9_^%&yOCOv;D57KGU6Kkx#f`{m((i3m6`f47a>!l|?ZT0m$ z5Q|LDRv$|oVbf!X+&3Uk#7cpSr6*os^?4}zsY_Q_^v8<+A4fder017T0+vfpRR611 zApJe*iRypdI;0<#o~ZsW=E0nA`*s}BeD4GUipTV5>51BwTprO&q$g@y@=>K(pmKJ% zc12zxR&2}hM7u5XrgB?Om7Zv~WnKlhOPkJ<$GGD*~fR4=9$_?^%2#6 znCIzgt3MW|W@(4Nwr-w3cHs#aT!QjOoOb&NA72~cqr6Y=uZi$+t_y-f%a#$(JJ|Ip zAL9$bj3{I%jFseX7}fz2Ep0H4{74J1Bii+hv?z?U>k&zS{Se0rUPb;ctXqDG);^U& z9q~ySJGYSSl`xve0o;T}Y>z?{Xk@LI16qq4ZOry)SaUDc+#}MWXCz?)m(*pVgalY5 zez1^TchIjUFklVBjeL=cH1Z;xn9w7k&&c-poD2qg$bQDaC75r1Hs-3Ai#mB1C77gs z*0dVLEbv32U|RY)^T5q0ubxv&C-(B$h?X*a&YaUK5&Gch${BPuH{^~5r6mh}>V`8f z?Yhl?7!}}S?4BA@UNxsge%>_R7r5lB3|x{9SYi@if2fjO5*u)EGor$r>8BYQ#e(S- z2&^z?8V|&(Ikh+ri)%|OODktr;!wo#S_#_4jFMTiN=yhJqyju5bGS|`VWIMxva+g5 z2F92Lwh=0sIC{?P89svpVO-`{;%rzjy(SnLsJya@?R~{`k8dQagGbC~i&;{EwVaTMM7A{>sxSU!$@DjXp^PI$6#ny^y1K)6`AO2}`MtnYf^kA=Sw-Y@7S>I96zU zYGFS|@)^Plgx3hy3eCLiu;+INw)3WtJ^_^Zaf~=XXy#RiYp6Zjj+`~*vV6mPYOt%RIcld^H^ z01lJPH{jHl3FisV5nds@NqDDlgYX&Q>%tF&5gg#AePI`2e<8o`GJmqLQkcunQ_$}x zJWx15c#N=ASR-5}yj1ub;qQh2_y5@Y68I{rv;CPnb8qe>_l7_cZ;dt6RcsZZxK&%V{-5WZ z_uM-PplJJjwcnq~Z|-y6_nh;dGiS~$nR%ai1$PR5CK%=GG_==Eut0FE;7q~e1?vRY z2yPI(UT~A(qk=C8ZWk=V%Nw>gL2$L;If6eBd|xn-uFGc&9xT{H(8LoNCGt4I$%01- zeoOEq!PAJ?S7!<`P&?y!TqyZhiF~c#_eIZ-ZL!=Y!TUt7;*CIW;*I=L^uLjEFA4rp z^lyv2OYl=ci#|-SlPTCqFfQ0juvl<}AWlbZe0k}s$nE2UDPo?WdWHmfmdNu2j}<&# zuu|{@LB)YXJ$3#Bt`+?mg69ifBzTqJwSqqoyiM?K!TSZ(`4x5_75OPaJ`-mD6=x3k zvdC`;{zZ`fS1k9T;6DWeJa0n(WpP6IHjd>c2&(forL%j9-bJ7X|+)__`q9 zhjM#53U(IkCirDsjImOVpGu~k>4Gx_7YZILSSnZ{SSv`k1lB)E@D#x_1nHFzk@Uxj-pNsqp!KVf3 zG06JA6a16lcEO#3?+X51@H4?6>axBk*ikT7@XNRu!=)U*y+}I?1&;o=1<*KDGesSA_cQASxCTPHvqh|=y+=pCP z&i@_s5t@{WQ6w-DBN$)Ioj9Ly8?^aJq1R`-klBbho#S}yL( z_J`ZybkK2VSci+TQH`{}-N*VsfsJCj90$`b|MxO=khE^jv8*@~vY5P9$ZhOlpm;w+ zd$?Un+T;IjrVf(UldzY3A?M3G4{5)>7ku_2$TR)B-d6`n>$k8+?weUmTXfm<+avdc z+sXdnaYNGH50Pe_LabbF#?9CUv$G*Hk1Owm{N+Z0v%zLUaGiEXK z<>yfN`}dA-dpjY|Z13|(WAhqJeR4(o_DowuTwaq)*SNJ`+>SAa>>sz|Q}pk(r1jJ` zg4;24cs#XyIk#g}@hDaN%eftk2df6#a61s!V?xQ>7iVsmdKmc~4&r(QKA1ZHt?<;d zJ_#*5;}dtvsac^N6`_eAXVuJqE3}6;00vNc(!e*$OS9cAwQ@7m$Wl7o;F*fXcYj3pj&++M6x zrRrEa%B*!u5c}dZ>)~pgEA;+z?XB3Ekq~}P=NX~h0*b@Y$a30*sQ_t$Zge0`9D^#U zAQ*8dUG?w7%)Ck%0)b)~W|ph2Y_mI)9RUJG7~t*0s+yb5#99RfY#U3?2F zm+$4lp{Qm09(2?hmAw{e`0ov;!3q57*?B8eaDv5eXc{Wp?sRkjdBpm1=DH$ zkV`(rNC=8g(GA<=@r%VK_Qh$in2dcf1;yx(m%;MFry$WI`U+(5DR}h4Niu5Fz^%bg zl;~QnLnAu&g?l{ne$<5jwOgPw_t6;A56OVqfSM z-RO&G0elKAhNCS?%+X>bdOGTZPoYJ_r}#Tt&L^MZe5BG(!;gn1)V85*-sL1?UnnQk zLp^N(T|vLVr_iDseS+d)B8Hgt00n#sra9^(u`~U#FNQLEmfA3fe2OzD&lQ<`3jRa(so7-k zDdwQHRO|~i-l^CZ%FDJSWVZQo_Pf-Zg>8kavEfsYPA+^38czQ*UgJw!@7^EQ6is$|K5X7aVxqP0H1<)@xIs>H?!AUqyJF3{i2O*=qtv)(Cvez*kpYq2?8TJc&ih)W@@+o+X2J$CIcd;8U$&oiBdLM?#7yII5=B8p_@Gd*; zwMZ!n1;D4^gA4E}cm$JAv6>BSm&ryx1v|u`e!1$0vn7|YK69zZe&PLl2WB1A88tPZ zf};~Fqh0VR^afcmlJCDL_Qf4+7<`KJ)h0$Xp8j2=<<_e9?Sb;U)(|27yE*Nn8~Nm<>$m^ zvwiR>I5^}}Y-PSL_63itHnA@j(4ar|#bH$VV_&>Pli*WK!;mOG1&R85jeWsRJc|MG z?Ia~qkDWxvxS)F{3gp!Poejt8{>@k$G*6W z`v80jUM9$=;KwA$r_ft5Ep{>Ofltw2*_#s^2qd5464lj3u^ue%i+%A|wg*0iJ^)jE z3N5$B{>b*eF!n_YEr3tK9w(E{@$FobF4XSKDAjB--4~Q;#e&^eluDJpMswP@x{LQ2;~^*;u4fm(IwKh zV9$AZf$ZC$X&d{3PfqO`-l`(x2Y;~GJ(t3QU8~|;jDjMLwdW*ux=zKpcn2~I_k0dN zc73M=;5#sJ3f6qac(s=+9mys?qV6r)YgBzX7F{_4YkmXEHLA!KZ$Rc}Ve((akKLro z{Q%o^KGyv0N~g*(oNEP<3|-zvF)!Mtdb({-&!#@(5Nmq&5Zv=evfGr8`pfgZNhTY_j_8B( zxEsl~olL*|jwl~C-DCMqszfl=gX~q>;wpiy zK4h?cc*G2U-$+NhlRZ9k`9v7#8T5^7AaoxmeZI7#c9rP3x7GjBBuQWzsfmX){>wK@ z%3)unpeA90xd&ktn#93K!l%7F!NedfR3(^D=O(MECc(r+ozswDVyYIJ6`Nv_7FrWb zEY`y61QRQ;!gHQ*hSo1hFmbNZ&mnA7de9_*W^rYKj0hEuE{w|#;SM|Ogy56aDoZ_tYZ0|;UqBq zkPW+pbt<`t@EfdTD9rP37z(P<*Zc&KIWQAtSA3hBRfiQ376^@49k}AFF4ADoYPE(Q zoM7@gthTj?pog#3PTT!hq$|zr$`Y+6NLN;0fbaTyhhY$Ivf1i&=eq<$>$qnm_F%GeW zfUk%d`hD6Mh58e^@Eukm5l~V*%0vA;6A$ji)=8Hd#*D$E!u_#pN&V5{gkrNsP>Eg^%X##T5zq! zp_p0&NOPsm%+DCkb=-CO*Js4cS`0|J9uN(_B4#r0(}tPiuu-FJXz=js&Rwl-Xz%fn2q8#V_}_zS^op@{UkTsXIi<<1sND>rI>i z0`@1FQJnMDSs$|frT+2%a!ioLwWVcM)ph@RaFNALCpCSQ-qchtUA(NUY%zSG3+n3Y zD*l)GFQv;$nwGbeHdd6EEFW4l802Go$g;emvXrqHnonw|Xc}C_y{KKRn;~E?(J5P} zl0~3}6E-SB?_#=FRMbh~T0~-i5_j2j^A;(D{T;-oPSpHx{)&HyylgUHVnOgHS{d#n zeQ?lrRw$}SdYn9wMIe&&3a0C*APjwyAId5S4jdB9=^2cYL{gZ_%tmHMoq5RD$P5k~ z9L(<#%qc`aD#$kJLi>zWvJ`w3)u*0|e8EcCt!(mKvUAaJrmB8OFozYe1yOEGFq99e z3G9@wTv#z$vX$u$rf0=^tHdV8EDH=*95E7!pthv7zM%ph@%42j6|L3HC8dqa;5fgs z%K9y40RK1EG^EIWcTaqMqd@~3nin_25+Q^rl zF8l#O_BaCm4G~Fvgod`}F^)QJiH;aiTLOYjbu0E$Wo1(Z=m-_H6^+X(>dH>Cj+nJD zKB;JAT!lW07Z(;CT2xp(Jl?Od0zoI5D*DHdn=o%Cx1-?Df~AO|QdSjjtXNUa_!IHs zkt2s6dg$@-g4(i%ma%0B4pGrsP&*8Ab5%?2QeY+Yl?^L~6*M&zloySlhJ>5~1X~(g zRoYk%MQLMM)mYeHF|wkdc3@>gykJ@R%F@Qlg5r3=?4j|3%DVc3rsl@#GSsT6E^Vr= zTLxvN#9S$8sz9`s`no3Q%1fI|{c>ePL0NrWb7N^)^H^-Sg_$*Cn2D8vde-t0Lyg#u zoKjj=R%qd;$SSF;XeEndX%na#E6bV;b*W@UX-x~JZNqRi;hBpvCbxEJise*>4aNQ- z`$(~vF#Ai`eMN?%O;f29!&lv0_+QONDXA)v<5q1jgOu=yR^z@Op+{0&6h<-m280;_ zYpupASz2?VI!WQuB@^bWaZ{4#w6Duisje*rd1zThGv;^&N7$M)dhx<0#DQ6SLVaCn zU2|d4;$_v%izm&TKYf15aE*&6&!4k+PGkKEI7FHjA2Df?RZ?0G)=^2*(w0hCQ}frH zAd)dQYNxOB3!87^=wvYo)27qO7{I8XDaqW>O_6h3ZNH(pGg-Nm*+t z>{V2tI4jA)YKp@y@=nBWb2-PXq^`EK2Bu(}%~=?d(eZvf11_kquW5=`);Go{G}gwa z)Gn>SJw|yPgI8A3)KuTt6hE|p=f;BN!*Iqrp}w*IzjDIFvp3wA_~VW69@Z>;G%+zV z?~Kry!L!`6oppf=>~Cb8k#45L3UM>$TO8hp`4)$7Q+$h~JYrG`M|tk}WsXp4`FC(s z;xNa5`#HYtIVx?hp13`2OHyf@jrzQ={5m|9(X5B(j1vT>3DSp)`lAI6Po-MqI>FU~ zrwP)rf%PsGyiSn+UsL~p;KPD^?oIuRg0BnyRS@^eD!-%PNWrOs^#5S}rGo042axG) zKs~0aLKWK@^8F$|A^01?bli}$d`z&9;Bdjog7XEJ3N9C1D|n$`LQs9f9d`MFMcSut z0r3^V&jd5@e+2dFTkOF8B99VWCfF?a9l^Ax1gO|!QO(y1*Zru6s#0nDY#DXO2ILFEeLzl1=YvqATJYnrQoH4 z8wL6OFxGoS@L%Pt)P}XaQv}Z!JP>O{kIRm9Al?N2Rqz8M#{YAX9lRo8ewYY-w#YHT zuA*-rYot*0he^4^1t*Jsw#f4Z7m2=1)}h?nB7Z2T9NM7gqa)hm zn?U}Kpt}B{e1XWr1l9Er zdOkCyJ;mz;9wqW@K@)rAIFZ$7b5TyYYys;;PaiSbY0rD%OLOXP6MRyT-zuVhhu~iY z)pZv7EM6ahLj;Ek(*1~f#TNxOiM&$qQo$<(?-Tr~;BN(A5&T5(bHT2#N&9iZ!v*PU zKs{gh6W0l<>n_r_i2S7BQ-W^^?i7shdWm$FV1ZzfARXkGzd&%gV2j|Tf>#LMBlr`+ z-wM7W_;QS1wOCFc0#`?o-5if8yQ#SCe87yjQ)Ea`%=!D&qW zF9B%dTTdB>vRV$oFUw)-tA($d{0sBA^u>zXm@h3i2xZ#0`&;PDf+?;RUL%cdDk2bS zas4%m$(sQMZUwCIk}RSO$MmXSi-D#NlGaJMXz%bTOp@1JlV-Vc%%3XE zJF}QPUZef(ZpHwZb~z5F-BXY@b!g)$bS%zmmE?&GFg8rYG%fMB3D$iBDmV=UKCuJl<3I?Ja>lZYTSPAxhf218LSN z#L8uSXT%=j0V@mhxc)@Ylnci9&MVm>>C$iK&AB08*yvDcqK08AOFubi?P=c3g56=t?1wDrV!AS1FvMnuy|@o z@=A*0@j|86zeR$ z|HOI!xSZY}hsTs9)1finPo~{5uUBOa)1~Zjy+00&38L<6&)GY0H?<=ztJ7{L&}o|^ zB{IFfvUkl*>joZc`8_#Qx1T?A;UH}ar}hZ@IRKIg6%9uPtpcu zvJ=iN_(^M2>9q044TJx|!!zur-Q+0#2XA!JZjS7N(qn+Hv|F;N*I!UCKq`af$^S_E zzPAu^^i#-bH>RBlfFo^`%;U5a|HJt+4Ql>}Glc0q_#gj74aNU(u0XzbkQ$tSUCt}E}ynDh7{Kj}1-o2fq0^@0T z_nDbM{)czJNSgoQ{luFD6XbvVj7>ctqUL{iKkcY)%=5FN)45F#O5MCD|1b4Y{Ezb~ zruZNIxF4VB_G|POzTnZHvezm82d`OPTmFalj5MUO!Rr0O7TC) zcJSKrKfD*k)Z{2X;^Ms|b!SBRzoz$cIv?vYo(6B}y%hh0UcFvh{)d<1e_Y6hw##HA z|Km(p*&F|ZdhD0su%`JRgHW@d>n#a{ll%`4{12AH9*vO!!F97qvdey z=WN)=|KI~m5Bv{ZKP&cKZWQ8a(CeG=G*+-Y_#ZmIFvfojJRkq#D7FXwht3}rdzv!h zY0&XIkUu82jqM|zhCY>ykBy~$@IQ3<$ts|L=i`5@V|^e0;~kDF_#e9boY=A;WFPDnKX_buh^N8BO2yOYLxX<)N0bUb|6?aj`uQK{(+1*cbi&=2lds}w@KDe@X>a@w zb`CpffA}9#RP#S5?4AF?<52NGcrZ&m4aNV^XUsG{|Mm?3<2UGB#LKtCivOX`B|iSg zp~&^X|6pT`uriL@zc2pBVA#z>u#zw-A29|C@qGLbo&`J~|6?mnga2`)GL3i|OuUAg z>Y_#dhqpG6)(2A|#t#a4;D4y?!93-IUeCw>;D@L@#M5A5#?#owecRmA{EuI74ED4yJ7qRN{1br^Ijj@7c`YhVy|UxX?h@ib=P2uD1P9mor0`uQInU@QPe z2)(r1@;{nrr#1vTmbI2YSnP))@QhxA*1-4RCz-}WIS6adr_cn{981c<7bt0l&mH*BCH@GEfCAZwIX29KK@K(Y(1N}H| zi)a9=Wj`KK6<>n%0#;Sg2>n??)%LK9NwCH;;BgFV;3}u9%{}D218W1-+qkQp2!%oL z)3E~Ib3A5a4&4kWI2xv%hd|up&UXgaHxyAUrUapw!gvZp_?+C?oED*g-hCN)r!8a0 zO>ub+kax&T`cIR0ND1n>pY)wxp!6i^O+xAE-OVn_o@d`bF@t=dMH$Ct9HZzpN5f@}Bwvoec zmYIIdWxsf`b*z@w1QT&BtV%F3NDHeIOz`A{Vy7mUn2Oc5782MyRh@~&NP! zB$#N`f}3DMcXN5DEq4eR3$WVOJi=P6Z3#xWv~aOG!YD<=#ghWhWI=f3O9&KhlWiSC z7^jj)6DDFsP#inKZn6c|0ON?sC0NleVJTKbaj_HSNHk!Dp3sPuHNZGxlAA!r5mBd8 zj3XVa!d6p8@AVv%0#U3hAg+_iON=!?dE&R`bMG$J1-NfHaH!S{;IJWyU$tQKeSb86 z5LOh31A6Kt_t{{b8QERj`@_9O+`DUoxFyItoNQxM}g#G4?~iJ=Ck1_1vk^Dv}`KcDIM%xM;%T3 zHPEn!KNgkZ95mT49JF@(r7KiwN~$>t0n1wTtA7>&Xvpl{W~6DtzpV8MaZGK;%7DqQ z!L`ut)zjB9uHo>J50|^=hPPco|Gq5k|NeO3G&9e}C z2F`0qdIr)-dPXQk&wyG88GMhEB4q5gNXW=#ND?m@lB9vOjI1~VdK~Wtkac;;&J6~7 zXS-l1IDb0HcAa1k=e|rk=;Y)K3E5PKoGl2<(G8@H4y;$G>Rs%w_omd_)UMvvJ?mZI zulKgpyQ5vbXWG~6>YR<{om_VH5Yww&Qv23+wV#*To>LPKc5rgoX{Q@wvCL+q5+~#g z_Y*&QtL^z+&^Hc=ReBu$9&I}gXEy3_@SK&j>?z9;Fk74xF;4$ULu$`BrYqo*VPs5fx^*0hk7*8G6Yc z{F1ouo_sCR6H;+dPL(hy2RJ7GhBzo3XWUn-|CzpsW1`MM`{tP7ocQ%QCPPt|KG~xL z`HX||Ou>1AO9U$f`9z)N_N_0uM%7?*dlnU;OTN!KaC^^St111mBeWw*}u9{78@&b&jJem`Q}4Y{8fy zzq!V80|kc(juPZY%vkRT!J`C^ll&6FD#04T7D4*$(*Addu(OVcK3*#ND+I3>yixF0 zBFfz*@_m926S04v7kpok-(#bm3){itCxysXm?fAesGeP-+<1{E3mzq?IF`siTI6pD zmI*EsF`VSM;^$@sDDdMe#VJR_e+*LN^pVTB0;_!XZ~_Q#rcFx zHyi5tqMWF{=?J__WPX>I`iBG`5&VVV(}Icr?)NVEb4#yG8$j zAYb~kd{mI$zm)R?dkE$W;&$N+IVxc}uG*hZazq~&>?L@xjH}AW%Q=<<>GG3#Nox=HS=Vq2g|=1LPV*+2qYY z8kab0JXS6+DsG zZ!&qOyK4TGP^0cL54nYx-dPv^CDCQH)ab9 zgoEm;8&1oE@pjx8p0f}Sg{LTRVE&GV9el0cLJX9vpbEOz;WzY8Xl#d{3r7r;DbP4) zGP6;o)80fbW1uucr(&S&M8f+Uwg@p$9%6b5N+1Rb^_m02yU+}lml!C$(Xr_BkP!o= z7C;)qMKo}0@Rv$-E$2D(4KYwy)!E6sA9c9^X~saAg6bF)ey5`Y)6RO7MGO=ULKe4! zF;K`7k1~WHVxTC-xaPp56-$e*jx17~p*s+c@-rK0#VS+`sSlG;A2CpLu8D!7Za-BF zl;e?|J{Lb^o2zX@+hhPU21*^8jgtPIcBp5z?``x8F;KMVMt?@}FcHJipR@275hGFF zz90sQG#)Ks*T#vM6Wz$Vhl`jOW+_+YKIso zpC~aI14Wyf9Noljyd-sJMEP9?#6Y=8ZSS1u;mrL*r+)wtoFlrK;%kv26k-gNCETJn zGI<0u2FeUJv|T0}IWQbVR?SsEoGrPB^M`uummqdx2WA~a*1C>?!qJJ5_Qx0~dM8-1 zc^nLIV2;O)6B!SuFdrNkEr(;LvSDywv>b`?qY7!@!07r}v1MqKF;KpXt06fsD!30g zFgm|5_B4+JaA4E}FvLJPg6)9=qw`0_?xPG2%tNaFnAq)X9~>BcDj6T+KhTVUqRUT? zUCH*rfzkQXVyjsn9GJ&c{TVTStcNjBbon_k4g_PMaBvs{!>>3n1`3Z6C;zEH?3Yx41H&K;Dh3L_>=RSxZg61KXMVso`6IUm92h-1EaTM zT5Kupfdf;i?4@F$l&P*Riv5UN2@Z@t;HqLbvOREMw4928qUF}u_t_peFd?V z1!AC($jBHdTJe}2QxsNkV00_wz)XR8_DYQ@I53piDJ6pgL%ENUO$?N|P$XlZP*A&% zV+IaPsge-`g=cjN$`m*-+&MguMAk7-cqZt=vkqgRaOZY8i(>^23|rOh-()I*15=Au zz=5HvtIgAZn%$USn~)B=JkYz^JowD9z;H@IcPoC=IS1cELUn+#N;t&e!0^n67$`H? zFgP&$cTjO)UP3Fd7%1IQ z3LKbMk>_;_bj*U-;aL0xUHw~$^da_LY;KjNz5D@1x!67XuumuFE=LjG77oJNlc8(v z)ww4^Hw-QDzl@$wu=FXN_!T2Qm3shd{%=`sjnaJx`H$57kh-AadoC)RurmQ9tsK?jVDG?%PBK4^S1Om*C)FPAut)LlU6U^a% zyE#}@h!Z9TXrU^>#9%EFu`*&OfOEHfyB93 z!9gHgp!DD%FmaO>!U-mB)j}k}#3NeBQb9(xXdx%T1P^zR81noa0B)VyYCnO38)#c| z34CJcSj`OyCg=eUp;-|nCTgKI!Nfc*R3(@=K?^l%11^RDTZB85ez}`qVyhOy2_|&U z_7V$a9WucNAaIAZWhdZ>=fVwODZL>93e54b6ZG~RP3VagBnrYRtRPYNa0vo$V z6`M!6K@|f#fg`;cEBZrt1go$Um{jLduoH+nonj|I^#u!OP*w0_YA!0&4PEFw1!p-9vW+NAZf ziJP@Pyao7-N^h7=)LYiTk=&1kb0&@zTQ-X*TUPGdvdJT$=Y0>$5M|3|%tQKHq9@9h zEjR(`M$r>x%NAdZ^i^6vnek%|y-f{DG5#9TPt_on0gs=>i-eS*;=>HeS0l`sxLT?!=-CZSCXhh#~y zv)=_6bO9dqj?;OOla3D3ZQmC-LhKev%P8E6*8Az!S+@n=_{lI6|5|C&XE6)U`po}n z&wBaBJHB||T-uDUc+>q^ea}Ai*?Uq&>RaHjUWwQPbX>2jgU@+cef^2ms4%g58C-_7 zoApZdS$uJ5Z%KYDoga{|f_v}2{pFR{{Lo?=S6`doyXU;|m`5k+GJn8T{@)W#;R{{m z_u(b~zwQ_Rb)CfZ2@t;Q^-Y+pB~9hkpgmP%o+`E~w1VlM25`}{Y~0lsad15>|MmeVh&)Yjrr>dc>K`POs}^~s;A+8h1&wd~^&!RoApc$DF#aiE`y&O_ccdXJUo&8}=&uv}ksv=~ z#(I1qN>ty02L3~2u3&G$;et~H z7YbGgwg{dnc$wghg7*kMF8FJ~?SdZ)1~I`^`+~g%M+hDvxJZzn^J4i39##`O3-%Qp zDR_inxnQH<>4Fyv{!H*`!QTu1tML}1RZ$$r+pz@tZKi?L4m!R^UhyI@;)4!VSaA7|&trhaR zN14x>l+UD~dN2b$-x^RqNAMUybv}f?T;wXj<$^7OrwX1fc%Gm-KcfB>B3~nTqu?!q zn*`OvC6rg^P2i)V-zumcpF#hk$S(`NA@~=;cLhHb{HI`m=R?%b5bPkxHzd@L5>&4O zAx{#SuT$0d2p%g)7ZU0#1y2xc5?m>`R`3kL^8_yxyh89A!5al{5&SYAYQDK)Khy_a zfiBOxK;s+TLF8;f{b)gTeSkgVJ3UME^8}9-q{9r`trDyeY!+-4 zX>;AX)m z1)mapLGZVNuL`~)_>Q3QvHn=(PX%3G57ED{poz0Umj>#U7aK4xGQSK<{UAYHmcG#U z+RRrzA^x9;55T*{1HRN4Tr4;>sHHD{aXGcHi`6nr(10n&x5rF#A97*2SDBCnyI3u} zR+u_e*>0CkOGzZPRPb&#~W;-a;~r!dL7cIDDC z@o^~ADPP_RNc-EpJ0Hg(%CTLx$0|g=wlubpv?g`3tT+?0n7sDB)WiDe>nZKw@|(1` z0clf*Cdy!s*Il!iy!BA{`#0HV51XE}w-ISmhc=pEkFHK;F?rWQ;kUN{_PBlQABHGt z?+&C{rw}Wb2Ti-^;Caw+U)?Uyh09L&Gb$y%wt)BoBxtX2*B_xfJS4H-VH7;e+a zCFx7OulN8(BZlvdts)T=3TJ+26UdmRbF$e*V!vKVR@xsJ*_M*1PTWh#X++oPf%imPK3rr_xrW zh&d0uYp1(tFZga&aLaSy9Y^JPJ2E=kS7+~b(sQ?k-wlVo9p|PmdMglTPo`y^{z)Kz zI_j5M-n*_x3(rkqsh!U`cmC`zyDzjJeuej_YBOD%oUzD22z1|SzXZZ*vykt&LB1-0 zYjh(@z@hqMl!fo`L_#1q3G)jM)ft$VZx7!H^B1Z zYt8Q#M?2vMzScal;6N263k<&2pD59_+&|HvjyK>Q#`GTX26(Td;tjaG%Yd&n$0Uod zYUykJKHGQ_M&WDCG}>Ui0r*<$7TqYn;+s~Sp~Y}?i4t?P7>TYz9r#*n(fC@c+fn6f zeLk|&Ps5LgCNj8fX!|cPL0@Zno<*-_+lPAEfEA6?-e?is=w~PoUu)BN2X4U_5hL0u zcdUq6QRNgiPQ;w(Ypi>?hzwdnV?euurHpFVu8ndYeXr09z` z&>cG+zSi6@hrZVJl=m8MfSU|o>%*|g%GY`tn$_c-iZ}2R_N*kNyW&QlX209U8%X?CZEgchI zYb}MN>)6eoc)ZNh*P8xp@U_-r($~6D8On;TVc`d5PUR^A0er0$#T35Qw=g#qZ$LS} zrs54;!d|E14a{LfZQ~8V*IGA}^tIL-ko2|IeI65ikfu`c1`eaxHr_y5D&D~FIMZK} zKF^3=#+jLlH&DskRJ;M@jh~7)a2>ZO6>ne}8`>_DjlS0G(B9$=P>=mG9J@lt8*oum z`&z4b16R^6e695cSuwif(bw9<8~7RXeenk9hn4cRE~Y_$yn)VC_~Q-m zSsZ<>r{Niw^0hvWHue^8fSq_21Cp!u6enx05~;^d+Mjp>QuJk5(K~(b@dl>Apo%xZ zgBiZolvTU|ea1{%!`)=!4cvhZP`=hG-heuH`{E5mxOwok)+6Y~j^y_5E8YNU7RuN9 zc??F3(Oc8tYfS-1f9$)g>Weq9k*48mJ)fPVuQd~|p|Co!Gu}YjT8TF>fu`VVt+ofI zl+V5|-arL6$QN%w#oqD78{mUs`daI)m=-&Q_TX#H`y@pBh?N4aE_@j-oRZPv%SU} zU{&~96Rt;1wfnkR+Shsu6kT}Mp|3S}ZWnq5)7ScFgW#MsK9Abs=_z^0ht~`M4irRK)IgLm9Nkp(1^)SK&Xg9(>xr zCeCLlRvfEk$IoH~s~ZVv^tGOaQt-8Y4dpyU7q|pvI`C00P8iVS1+s60rfs}|E4g{% zc>N4=x!BuqE8BA>tk@^3cmqd6ISOk}e3%=~*DBt?Ks4PMYfrxOf%7#TMmHjPE!O-X z%dJtmUqb#lbuZA~TGgK(=uR%yd=9axO_k%P1b#@}qe`dBHDg;( zz}l-A4YH%(!P?uN8)$*s$|tSH7x`^l z{qM%XeCFWDm-~dLK8x?R{b2rqujK#NeI@^#(`|47in94>{od!Ej*o_?Uo;W3w2#Ta z{1|K<9vKrkdwiz(;yor17fcu&l&2`f(ZzHx;#Qq5B=S(B9w3WyArAyXp|rG&j0hi; zV9w)c#-XE@gDF{a2>3@I|3WpFCzxo~LREqZ5o-KGgI{R&3$1=(wGz&P5q#O6aH%%D zB*DaWSZ!+&;RdXZ)!Le1;$|(ZPB5_rD+&>w)cRJQ6;ewun2s@23pWmN>aoJ{o4~Ha z>6*Y5PS>uldoB7y`m1zKB*DZfSW%g9uF*5W{=yQ0!)#l};Dg*&VdR@*w7P=qyL zH80@?b2E@`a?nVeO1ixpl9W}XBvD(e4Ssdi)io_ zF@w3!X3P+y^SZKt&xYwd9{s6t*Cz|DHCJC##xHNiu5zqDV7Gsb@68|hmV9mL3H6P8 z|4_bsf8Ts}zulMRmk%xa&pM35V>}jw=W{E4#nZ4}PS*aZEOroa9ev3>qvSJec0! zP7gYwm(nXd-+aD(%ot=8w`*0KLzP}fhUm53WW$V&kKT{Lg-o12YfD<|8!GTE@cO!v ziq`7plG4UyaG+jU)?8n^6n?1myZ)-~t$H_=G~)Z=B~8`K>PlfMv*)Y1cqdOp|0i6%OTeA_uX5;a z>zl4-C+HBkDBw`9Ev>=kSoq*cOC?@UPntA3-tUN63*!qIoF`sc-x#0JSR0>GyR@Rb zyrMilr?I}QqN%CAu_@jzOi%y#zvAM}|3&=%-Tll>B9Qlq6El0A;hh;iEA8yiy5KqP zxz2fk3+xG*g@L7+y(SDrfzpc7rPY?*AIadzDFrjFP&93(7f26va&zolJBFYoo$Z6| zE_PSDd!VQJpA)6^;#auVyPq39(NX`6q%@A)*%}SwI{6m|{}}V#eQI%2Nu->lhlW-= z>TQ3jh@;-N`(^#VmC-o(pT@s9RtLWb`+OswS{w`iFYhf zS0Ib&J?0Q@8~5<}=G1C)7F5*TbTl^=CWuP}R|!5S7y^DB|M1bQhvAqYI8AW2ARp{8 z-}r}Di(Dtje-)X3nxJ|S4f#@$uM_0IJ}mcup!!b}@^d1;DEPYIUj>60RMzV#I8tz` z;L(Ch1=TlNQ63LuR6PbVW&NuK?-zVR@Hc|#`2UIJ)HhUteMBBEI9YJM;8H>LO;nU$ zEAoYc2|+%bq+Ncbiujb^D}sD%Pkjas0ph`e>RY9dM~S>lkPkOm?mL243T_kpqo9fe zigFPgIxOEsaDX5`7)Jdx!7~K;sUPZpEVxeJVHt&vPkH5nL!(A=n~# zrr>3QHwxY(__*M&1-A=+D7Y^_@dMvX*W>Tv#RT_5u3)JkzbHff|F7RnkK+=+?H@?Q zSPT&yCi=rgo+LO;^z%hNMsTs{mx+9$U;`0z^bEl(1aBAIEch!T`thP5PIIar4kLxU zj?)gW8AM)Ji0XL|u$RcZzEiKx&pV zT5y6OKgh&#^rIpwJ`wOZkxK-t1ZxDps{i^%si$~Iu>V7me=NwCTWtSXLB&&ote(^X zw~PKQ!S@6ee+l^kULSxVLB1HHtawbo0U{3;Z12B5QS?&1?{9uMuU{xPNl;zyAk$fmddA)+ zs_P!`evyq|_{$=z>mc%tUpH>aR6TW{gm=2;_`)<(dUO2kl=07@J~MUveWh<*H&)aP zZbtCB!F$~F9q`TOfMdZhtEDe~!&tG~)G|!afGJl91=HMrTv%?KO6ec&KQ4o?;`DBf z$I4|?4;`lYAf#D_E8Cla)!0VT;(6v(oRiIB@}@!Ix3>iL?#H~MJ@&=eTZFW!gQWFF z1g`}#$IW8$PJqIsndf!DdqUHBUtT5iu#U&dC9gL=vW!7uyVRR@PeR&nuMq#L#Gx~b z$-}$vHul!_)5ieqakGuR^+=mKNLq7XkH?BxOx`*u{QbMaXAhURq`hmAHg#xY3G6+# zmvOlYd4790!(JFV_76jpw0A4gw8#0tr56f3VkQM-=5f78(3E=<7tmGEnZ=ZQ1PZ3j zvZR|1xNKyzYaW8a-@iM3+lx&~_U~Dwv6~u9{cB*)Kc`JwMBgx2+fc3$${6(g@00Cv z+}Wl%Hjtz%rA1#6vlx4<<1e=v{o}RPET$ZMxQ7jmrNwt z^Wpw@Haxh!*wnRCGpF|77M!|uYGi7^s`w|??n9=I&!L}mm6ERSs->HCUNq^(+)|x?cW)=3@3nWInF;j0_U;!c94%+Re&S66(D(W+HuZpr+V|S~sklUEMfvc` zdr<1;Mem@P^1bGkdnw;*GU>gP@Aducb;|d8IvZ;1d+oLLz4o4!4bZ;V-Zp7>Oq8y( zUds1+3B|U)*Ivr^+Tl)rN$Sps(vQze`CebfPNsaXV=SEVz2-wXFXel^o(*l6$wuF6 zZt>oHuc^m=84hdO_qso7_H(@@fw1zuRyPswy=FO_4q{~-44>~c|7nDrqkXNzv4_~O z&-eOrPBr*m>-t$SKAiJ>zSm7G58rE@Ul@y0_W54Z@!f;(wayx-{*Tx ze^3v;*Sh@V*sE;c=X-rO>-&7K-{Ppk_ga^q6Dtow_W54F!F-?ZHIFOL?|VIv2K~O* zov85pUcXI~e&6eJX=87`*X+dJe6Oj;PTC*eYbmOIuPN-^_nOC{^1bH4EZ@0SzSsJU znbyEzG``or3gY7F<=bK9d#%nTKHqCT2K3;2&BplU^GV$PefeJZf!$1eL_Dl~udm_G z_W52v#Hv2u>nCU$zSl=8)9}4!Lit|nZg<}18Q*ILO7!4+tuioA-(yvu?=>G9dp_Um zr@0S&zSs1J_uzZ2w_;jsBkjTW`c&2QoY+{P=kvY(8|RhJ_xf|T=kvWD!ty@fYkr~F z^ZQ;;WC6eL^_jE)-)r_j`CgyL5`N$7t{fh}?=?9zp5OQSC6@5}UTmQ=%{`p>W8*$j|&G(wN;3J*EElBxZZ)C%M-|J6VEbPuh zlih!Z{iDBgoo;-uA4d5#@ux88R-EsL?6~>{g4NAIMtaKk`gNMg^!r{%U@QP{>;!V! z`d&j}*|i~bOh?~S@&eq-_FN64cAfIQ=D!zltUVXOj$N;OueU(Ho4U8~V>fiV4Zu6l zL$T%$VYx=7qc1yeqI%&Af_6)XtJCq{8N>%z?0QTWdxg?Pk#w;3UWc~%NYddC{-v_) zvme9tdU7(sf%K=tBei89)Q;BTpIw{73>HKq&)8PzHGW zbY9W`x7gv&C>q!h@gmZLjVN-RF<=B`fX}7wQ3g1C<5`bCQ<=CVeJl+uLk3^ZY{lBQ z8N!=Lyn$8snnhjy@VsMR8adT8%12s%$Etd51l4F3CPOACL~l0AN3k}4_$=0bJbjaC zv^R?6V^xjv0T}Pob)zim@@EC>Y>6;Lq#El5C^8SLYSaj-Q4&Y^w#e$&3qOyd;WVuM z;j`WhU9sr87+t{XH(qo@jLx};lvubw9DsG0-SG9tBb(%+oc%HTZ4e98FLU@X z49?sHo`2!OPUwSGIm0udPK_3v;hC7Ib0P^QcnBc<>xaSl2`U-_Y z2_|&s77%nNjz+58q8pw^sKRPn#}HV&?bqF*KrRMSeW^m%I+k!W_13otx^Z~wvqhQ- zS}QF$>NBZM+SV~hsU?8Dq5nAY>H=uZ;ka{?v1^hSC2J0c`ADUm&*5C53*c8R_|Uxk z(MTLCYSYMIo#bGR(McN7Lp7g9_!JXm@v9a`O$F(RQCcaxdf=?YFqP-(p8Eh+bS)aigrpnV6K#V8a7ka*Ev_s z-F9P)yB8R4r{tjMx$7dO7fu`h;+Ie5^-A6Rd=1BX?WSy8$F+ptN%f5tLyY!-^Zge& z-?#UhDjKfc?fGV{wzRowa25AvS#48wQ^~TjGKkn;dwjedyIOz1xETd-_bVT7M=JU8 zcBJ9cS6)$x5+R%lD=O-wur!00hPdUof@<~HDi?Pe=%MEXVLY4gmL|+egb;m)%kT$Sq=tLX0KbNH~Qmf+l@Y}5gQ#3 zIT6~!2j(%Rd4mVz+}-XaDuM-n1){)zhs*!+qT%ohu4}2CUs~HxQ$g-QS$zw>{h~hf zF22xv|HwOBgNsJcskpJUt{n6R`I`KJZ@&Lqc>rJd&38Ec7y8^bIYI02_J26d}UdcRZ?BQ6m9JJRriwlGZ#*nY`*TUFHrLldZ4TV7b#A~ z)|oiTPDNAA)%A5vL-sfpaW+2%LJy$t3un~VEd#3W zy2HlP_7OCcc>r$*=sEH0cbGcbe-@EU76~ z6KE+}G-i(cw{Zv1?{5}Ufb8J5T!CJ`dtcuAPR#80o%B7~0^i7Q!sq(>&j0=V%Qu-P zz;WImo`AaF-IFJP6CF>*nk@xE{Rc^Y0RMd?juD(CxLOdmws?rG=K%dsJ5mO69EqKY z8F;ut#6%e+`k{jS|BvPPj~#KQ;5@-4f)#>Ig8Z+QjZBXd_eGF!RG{D z6ntIquYw170(yK8@C5WY9N-D)ad-~LI*+^81m71tz!T8p62rNUe1I;30|W;P4kcpz z#)&*p@F*gl8O#w}AXqN>Rf5X}TLe!PJY8@-5q2&TyiD*$$-hN#lip{!CitM5Md{b zeNOBuSSUDIa3K+EmEbvo_X=(i+$xC6l(NS=6xu~I3bO?H;Fx-KeFYva@+3h%9%VkS z=R`h{CMsSYuw3LS!R3N<*y%du@&!BPiv;=doU(e`3T)5oP&`KH zw@JAdiFicHcjm13wqSd{2VaRZKSz-7z9}odBe0M%?6l{B@D(@9EfVBgZpyWS>b@5B z%<+V2rt;14)=B!4Lw%-xf5!U%7G4K#zz=+LpCitfJ$mU2z^w+K#;b+rH~(VF6++20 z_a7IQTc=X`$NWb(2qG?1)_AS9t~q4?cpVR-{I75hHj8O@8WetekHKCm=FdUUvoCCy z{a=LD)Irj^5Oe1N%q6p!yc3`>Y35DGKUS;F#{2Rrk@mMcroUw^K{>Wdy=k{Suj6q{ z+&J>hV%p;Q-EZ$23>1$6+QTJ2X>UE!rVf(UcGzP%vzR=Nz2DyLK6@NS)4ywxHg#y@ zL)bfgFWY++^8EH5gguTc`_}=hv3D!dw8#0tWn~_&EoM?cW**mj1WmaaJ@${+@g&Oe z+G-ZI%jF@g{{B7Y+g`lfPxkLwq_KGo0KLTbkJm8_<@SfyQGUq&@j6~W|NbalAaG2$ zfY&i%Sc=vW|59GZh*2ZJP zzLh_2YR=AZ`huNltKz$?^kut#u&QuZ-}HNSZBBo8SJpo^zxVjsdv=Xi=^yXfe6IEG zFV_Zly65KX453bNA9ZeSSLbHbaZtxa9cLeP&TCia7Ssu#P5^c6z1FFFxoywRMh*L1 zdz^^^aPf22jw7<{9cdjq?REn5wr$vHrEl}uvhqjnTASR``yb9&5^iJhq!&)xX`O42 z9*&v;)J*lfea)lV)trx-=*fUQ)O1lZHBMH(e{?&yY41qX3Y_cS`LlNd=OF^YX;VIS z*I)kUDIbT|pN!wg`fuYmYyE^jpSR?lKR^9epp(6UjG5mvb;YbbGz0h0)bF90NsVn^ ztnJuw=gN(HXjcE(zKHqul|TBk^{~2cSM$oXcVIF{ZpF_|T$r~hW$FjKoKtZ=059he zz~n)yPc)&!!o=up7F`;r*_6 z9hwZ?98u?%f52ksmTc;+be^?7!(x-qR55CG4HcSWIFgTGXw zYdK?Sr@S|*lo`~V1 zY^Ko$V;qEwrA0S72OAPD&d?nQM|YvYaIp#nL3+j6s1q*kqH`6`COkCb7s^l$2I_dE z(&ysmcUaZ7;o{N&i@m}l!*#e?M&HFx_)yPm-$5uB9xb99{R6rgK1{@L^h9=ajEIpa zsa4^zB4$N%*wb+$=0qQ5-NQx9i!$C-c)W;RqYGJgf{4i&2jL^b53*M)uvf!Jr8CV@ z-$=_dJc>^KT043JvuCLdgB*x{NO`WvU=F2^#b)qESZy+RHus^m4R-kWa2~cmkN3Ab zF-_|px2hzhhrm@NlyIr1_|N&_D6fU#rQJDLPX0Q$8Mri@J{Xm_N((`E7=&y)i*XFX z;g&GJejj}eKj9S}nPx-ui4Lzc4Z#v;UDg`(wJLm1_+|8wF%H7_c9IGmOB${4eP$+* zXA{0(q;Pa8`}Gr#95qgaZXC}CMAST+@J~CcpkVn~(PLToL8+S;y^G?bYLo(qad0lh z$GfdU_X7Fx=$$n6M7JB2*el8aj^VA*txD_{y`9_iOK-ap2X(~fm8|eH(vXgE5PnuR zK=W+E+oatw(L$Q~RmUBw?)d1>f#DZAexk%l9ZPCp>P0a%Il7EH{Uxb8BT7Dh_~rDQ z)b`Gae!x!tp%V|{K>mVg3k$y%DMFz@{-Wq<+@d!!c?1XY7e{xpq3tr+$g|{jAulXfzC-&3AF96Ufhry}*uwXQT5AV|A3lvr!)hL5zdD zSRXtaoj)p;&rtx+<{?#oOzdg451x%am5h(^&<}%Wqsvc@6|g>dHadS=>@SqTvw2L_ zpAnnJVFb@cm!A`RfHHVC>Yw`j1+ht#!Lv~xEy-UL<8c)R&xVJRig9oO4T5LGW5mgS zDiCX-0z4ajm)*&KB^W!3n*^Rs9)?E6I3Twt44%zvs>C}%j6V+ry^|6s?b}I8Wam(b z0T6@kS`^5!H$lS*>MKf>*`EwGq3vy^7nYNz82%b$9 zHYRT{3P!@<*&KrsF?H?+&xQhy@z|vtA@FSU2)ePGxc%VS$c#XX-0+}F^Lf)@H!}>L z%|@E~42Hwt*-)UV_gED?8!d-oJ(&-l%{Xis4tXn`iA^Xh-R`_C44%#3a1$SUf=&hI*bI?i{Jex{o zZ%*tmU>H1`GS$^Zv13^tJR5z$RmGODJ@9O_+z=~ZdGKts+!`YxA`G5QNbU2rc5FNg zfM;`%QmnIMud)PqHtd0uf1MrMz!Kou(1eqJgB@GLHo>#eireiNpIn5&v(bvX?N}yf z7I-#V@t_?e%Q6g}jaDGWK`TpuXQNvo&t?kDvsY?N!Ly;vPAM5Y8_Io*OrA{`Je#>t z#3mvq44w@IjyVI~hQYH@ANt8}wbFT3r=U!MXTzPt14-nAcZb2V;hCTd&pKi7Y`Al~ z9LA9V&xWn)_HQzkz_ZCj5%6rN>T2^epk_BF*e0ZdE)VpsHV-~?EHGS3(A|pPbk4!| zkWd`}&!z{r06ZI>`E0wJ&4$6Vp4bnGQN@ca&Qb zSO1vBp||Y#C9Gg|D}X(asPem`lx-iP={bQg+lcoF)Od%TR($to-DFHi;GzIH6?rA27GTcBeWgbvr?C+OMo_TY^<}^=c$8!`k;g9)tj2lZ zZ%{ID)4?6M!>mEJJq3fz)vL2JzdYQ-0saZ2Oy^~TQjy^!oOI5%{o=u~HX?{ge*Q$) zT)S_CgpF=~UIoJ{;OyYS^0_TdrL3V^NsrUvDS1SU64Pf94ECx zi+}Jzs6gQ_Sh^w)?)ii`R!}?26HLs}LREr^1zM;{FmZ+!8WK#b(?WBCiTkzCnqY#@ zb75_Df{EQ&K{+A(Q|p%`m~hcKv`*l6!yK!@O)$Zag+T}>coA*TLRNy?O~NBA5jHD* zb8CW$Em~+uF!7WYsuJ6fc+KQ6@qx)nrP5Bnu|mEVc%$?YrfG$rn|>z>QS0U;M8x+9deE!_$sDV3O@axI zG4#yqe%i({9w_#vfl zZrBWbOsA_jhqvnVlGI=~WO1O?KR8x%6=yS_YBGciC-Y}I-OAalBGX&V4II}AYFrz# zuo+)#>4jQ@uwq7a_ew^u)FQkG(Sitg5)%{<-^2$PIx6ZrJofKoALpeJLty zSPT$0i;5;83kilKWC27}R8Uc@DAX!igNnOVTlcNC?zL*MwXIca)oQCCDb}STwf&xF z<~g}1aiNQS>-)VPIQh+g_A_U>XPIZlxErfCfm@Ax^Bhv`+V~LMPs*QEyRJ<`y|YZ+ zH_su}uEBh`%@=o+OR8Pd*1?UJSf)Ot+BM75u4_H*+URN5YEQeCdD=D0)2`K?b}jR? z>sn8{HhS7M3!7pW)Wu#83qf;DWN|FU7|fUX8N;S<|K`DAn|1R9Hw_QtWK}j#aN|12 z!d_|DgUGDWd--c~#cOPLE|np{I;_l^t-_+{PHuhsVtDDk2P=wM-R!yKu5M;)@EkWG zh~Zh7$nNyb6WlZ`CfR`Pi+LI;cnw2lYg;e!#$banoiRLRz{y1R7}`96`<_LynB+e5 z6l0QhM+|%Yo1452&GlS|czN(Hh|k4M$J`gduTCX>3%pkD_e77LFlSfUm zW<8NVwhv3t{NtSqs5;pTd@etv0V zG?a0WryO?|xGl-N8OL3+V0XpJwit(%XJjE(wnrmYo{8sTWt-fH)ol-!;oTnQ=e0k< zX8+4`3$>L%el2$VC&Z2w!-qj$gB{gY?D#2lBko41GJtFb+C}UusT<*HRX4)js&2$f z0$1G#Z>bycQ0q}QHv6E>%ghXn^ks#tym1=kjbmp*-Z+igzp)9tABhHjHXPr4VSc}$ z0+PSJ?qomW&`>rW%?CgYI2f^ehXaochr4Si3g1XL(5WKSF+4LAn+ap6D>}Tcz}GI9 zA?A<<%f8bnhJ#a2}x6NhIXKc|O$R#CE1&dxo0d%2a>sjH@)=WZ6SbP3ziYn4azdfj$)4Kn z{{t4ngF#J~+yq}>XMqn%5qQV&MWL8EXoiH+!@dOkI{oV&z1?H&NwpBArs+PmamT>- zhL0aSb5ZNR@qRzvCAO;8K5JsCiSuR^&6>DideQ8OvuDiCZ#PlZKdC>p6HT>dIe+2g z$y4XgH%dY??-gX7B~Vd8^_LU}^4za&g2t|*uC{@azls`a{c3AZtb&?uQq@u;%PVSJ zUbM=H2c-~gg7@%YMk0uyN{Iffqy*(OHGIAn)hJSv>6W)sr6#LBH8Q>Xs33PyX0Eh=ALUca=wrt~C-Q@2bWI{M$4iv<%@mDV*KURqlZF=p=a z5wII8o0cyDE8t&Iw{k>oLtSp!&{6cMt}SWI#ndZ@|BugYRW}C*P3!(zFm?WdqWp<7 z3Kq_r3Yi`b2~Kxq9PK8$`W$g<8#!xhwgppXPs6z}b>6%=^LT3fH$<-Hw-K7dHd@aw zUA6iTXjNM!TR7}&(^fT;-OneM-yPR)5QE%y!`Xhg#SvDws3* zsG=iZDG&Pjtl2uc_3Kyl7jks>%`c<-e zRT(Z))uTp~m}t1HRYN)~l`D_Be{O=TqObnMSk&sFale+h{^uvd!o6%7R_}aRV_>@r zpKT_kXRi-$2%Qx?J8%wW!kUzx2o**{b0d>5CDzW=^u(laVR&wOHswBF>t4Ua`LWpc z|A6k*{w{w?_sR>NJ&*Y8Or0yApGiIolYAZ~`AkdZiARWh&iQxruj7~=Uza9|)5Tfh zapDrON?awb70(qf5U&)k6K@xPB(kp}%Y98Wx*6Df-lzW|;xKW#I8Qu5JW=Gk0H*tn zXx@>)eo^)x#ScXed&BryqS2$kHu@9Lyukzu6<#Eoc}3uVitJ6|<>JlaGa^61vz%Qb z2UesV#X~MRTAU)z7mXeS;oD{3Dn28=EbbOR7E|yD%zU#&j{Z!$RAlEv+MC5@@fPtx z@o6!Pr)$RVBK8wGrZWAfiVMYZkv+>8zCrx9c#U|c_?Y-h@lEjqF@yu$lrQ!ZM~TzK zMPikhhR^g&$8LBeyOofm#c5)hSTCL-vVQ>MKPa-B0PWw3d&Ez~Sk#915_84F#aZI< zVvTs3xLLeX{DJt0_`LY0I27FhSf7dFT5+Rzo%o*UPqpzg#qQ$4;xLh4xS8(};uP^H zu}Z8Jo5YjF)5WvJ^Tn;=mEuF{;T`BR$)Z zM*MN&ktEU;C|;p>jCj1bghaX%#YXWo676?|c#FuvVd>9>>2P^5gtuXam@S%j)QHzt z_5hLZq?vw%I9{9}P8SQr&Ei(^GLfGtn9ud%&ElQnz2d{-<05r4O!o`%W${(R*eI?RPZu|c-x4npFBQKlUMt=x-Y&ZO(uZU}Dw_KOY|nGD zUld;vIi@+c_igdd;)kL;&lo@BGhRnAQ{*t}^iPQFf=7G2I9Z$~vO6BbH;9|Xt>R^3 zv&fFQjDMrZuGO^f7TL9%_QRsNUxEFc>=#6H{{sIvWxp-%72g;CE(Ul%g7_W8j$&7_ zyVyrOL>w#*6U{uK$cG9P<~Kz&9p_*d$~N~+u#b~nBrX+C6xnr=`P?e9Yd7ut#Ye;^ zL^JOw!ha$ACGmISAI06`d*WZjzl#CnVcJ9ND01cu`u7mg`^(ta)D7 zMfSm`eXDr4c)$3F_=NZ~@fYGt;_t*iio3=4#J`At7uj{4<+8Ig*-?y(Jw$fGW%x+( z2yv2llsHFZKV8OOCYt+h*ehk9Dw_Ln__MDr<6kabBiN zZ_0jKWS3s%AK-m8m?mb3-9&R=k8t+-WxO%s1aXR3AQp=3`OEmr#0GJdxK3OzvU4!w zH;dPaH;K24cZ<)6W?USkdqMWg;_t;jitI+r{8PkEqM2V8{=H=P77rD3#gXDz(L8@3 z-Bj7LMAMxg{y3b>_y_L&9ZXX`E@OtMmSOw*Kz4CqJ=@<84v_yKvHkrZ--|JwdtW$R zwtGKVD0_jpNL(ydiq&GB*eI?R*NW$eo5ancd%t;!?90XN;tuh8@n-Qh@ec7G@d5E6 z@lkQ7_`LX^obQuwtG*r=0u7A?x36aDkH1l@xJ@z32+@TbFApAc^L*gKc)VwI7oHDX z24Tf16s%E5PdJ4W}9Rc#L4i9Gm z;^o0J4u2dHCO_uSGTn0nPG>!iKX=<{yZJGVH(nO%_d7<=;>N?c5MxIEGvh*x95s5B ziGSevKG%*lg|&_gk&Ug%eS7bmjkj%$KJ#|K7rH3CC9>7od&%jse5Vh_hwu%^zc@cL ze`|gs&%d?s?dYPpA0?{ie$=zzto@;z=Iq)wdfKk@rp?)P)7Z22M`@4RpPj$!y!;uv z)6(EO`kej2jX%hqwmUt2&aO)kcjL6ex5M{s*dLtwQja;iZWulHqwMPH-I28G^ZV!T z=B6~d(ZJ<5Bj&B_I{sR z1DB@dM=lNSo|qBX9K6KYJ+V{p!qBCi_TsK^?|0S(zZ)Q0)AxtDCr3`* zb>7t7+3WX*mvaAdkKWl~-TvUVIlC?$v2H(ZTYu!*nyCnM&|E22kpCg*i_Ve(yr4dv3;-C z)^zU1tqEV+p}6y9KmI8A&?9dP((1xL77wOewBanviNftI1LxLz?jSv;f8*bbHfG> z#-CuDd28cH>|OpFFLWCFiYu z8^uJD^VV|kjYx9dTK?8VlJnL!(oD`<`z+HY=dHb%X_NETzRJe%%v;N!>ZmWGd24@$ zeH%&6Tib!AXWrURXwObP9hD7mJdN2n2qIrJZ!KR&ZT3YpZ>?$X*Tz({9YPqJ8x~I z?Yy;-w)56TlJnMbe&I-R-rDXo+s<1XNzPmQFsqTAx0X9QlAO1euL&c`d24?~GdXW9 zZLhI{6%J(C4{=B?e%L(Ma9 z?M7~tXWrUe#`nxy`vebk&%Cuqu{_VbwfEEZ%v<{c%lFJ%%NxUpXWrVMuzb(Fwdt+Y@y=VzF%2T#d22arW5hde?G9$?ows%d^Z07d zTg$!XWrT)*dU)bZ|wl&n~n+H?Yy-m-1(k) zYtLm;&%Cv#v*p^4r|~)-Va#Ofey7{c2*%UkunX}7v+~Sadoz<_JdIiu$Z=md&Pv2H zZ|x@5+B0wM@hsXiZ!KT4Mm+P@9>(L$GjHwhxR*Wi*51qVJoDCaY=nqs-r9Ruo_F3_ zKAA+k^VagUc*Hwz?Rv)W&RZK|9li6`-o{FJ=dI-@lZbcT+GiQVJ8$h@7~|iYw>IL= zTics$>Y2BeFPbC&)V#G3civiFbt3M(wU@E2K6l>QdX(~I&0E`rTacW$wuA+H=dBI% z=!pi?P~<`Uj9>@Gz_=~pHL1|cpNjaWC3ucF39ODUVZL!Xz0Bw=$$4vkig+oQrFIMA zblixP*o*MV_GjJ%pHT2(c!h$T>a(}+D(1761>*}5bH?K9!@f7ZQ_TFd)$qv2+UH&R zoof6xAUcQX?eiXEpVpb5oY|c#h_#P-@3GFzcRLd{hj8d~G#l}B?)Mg%lP$TbzeggcH`+=lIQp~m`xjkoI7FdyM$hyxwR=c zWBC!FFXsC3ZRkR;*WksWF#49!E1OzAI{A&}l9ePOthZ=Np$iT#>` z6pFFH*P}yxHAaW{oS`6ae0|115ILVQ5CjK@Xg@b8j{x3hRZ_a!Ic*b6wP zJZT*HFc?7cR51aF)VgrA1)m>-F4z_RW&j4`%@7+g0bs}jVjxxswx^K8um+qJWzBTl zXpPEdI%HHEBO9k3qSZCiA*0b4)C(eHbu%3@)*9ngcwi&|;w>AgxS72$dAhQAlBX|5 zIhaD}J>AP%?PxRI^{sYVGu=B|?Tlu+UudxO)|x4&6Sy=SqST* zWsWE|8V?@~V?nU9Evhzwd;u#OZbEoy&t|%JVMR28ZOmvS9E?^F#+U|lmtnchYUz0P(-MCCDq!DAz{%BjBcR z+2n`tbK$<(wGsXR+!Qgpn;pO1@Y!$|du$$!J3RIsa6j&`c~oYjG2Ha* zEM!mg1!nu)L(>iaqBg~*+SAJtrf2c<@;noXnvdS|Zb#|lpsF~>32w3t z$v}nLFZPn__4SW}wGu1R6Zc?6Masw*tT%CptzR{nj}@^AZCN9EkM$;A#fnVUlG?Jx zyoir6^(-WK{kHWC(s_jqA$aAsA!&3D!Uo~@fkZnI}bpkVA%LVJe4ymW4}Aw+W9%$`X#d*)~&xoxd`rYGu#G+6AG z(Z%bTck$X)c=8E2zh|9%`_p6Ct>(86w(o$VQRnMn3%+RBg0@3E7!`3T<_=w5R94$q zR99b%IZuZVwIdmPYU~2+!sOTm*nJwi0It@t3*c@Yy8!#z9lHSD8oK~{)-yr^@37HZ zn1U7T@zXJqK}u#O=4p;o=DnI){M7Ln#$aWFVthF5_y#LYKqAyDuzF@5O zsCLgjp+1AyY^dN6aF8~uU2JYaN?=hU)F&_?VYgu@JQkX<6}a25M~AqRP>)9*dDv-L z2lY7!&fdmJM{)tWt72=6tMwQ>aGTq0#3mkTHWAZ&ck*Gh3Ez-|(b_}k3i*cMwE5m?<1q?F zB7q;90}Pk|Niion#%W*D2)%GUCapG-W9W-HH*8Z4^~dF92{UX#^^yuR@hv7aE?El2 zFeeALqYv1j5-=2kn-51uppJN6d4rj9_zMR~ND8UF7pZ?^?1X=5^6vlmcnJSDM>fDQ zGHQf7vIU1RSTSn2YyJy^8GOmZ7E~=SSz6T4wA>u5#_^BN*8PVaG10n_pi# z(c#}opE38gIbY4b_@~AxFp7GENrGRbEuHyrde< z?qCWD{JI?QUf(mtz4w;^x33OnF&~#0z!72=)YeuvBr0m_6BFx~|5wH{802}*;bYFE z^uC{-v3p|r^uQIq)bzfSI!qjn1SRDdXvXm!3TJ5a)ZAH4I2M_e;!h2C4rckf_~L(fcUh?cM>e` z6R`vKJ?-w|p(4Ae(f{lDw{1Io-Z%s!aRRWNIEp^GP^=JFiRXxyisNzmGyV+GOoYPr zmc2^cDqbZTy%XX+Ec@RbhhRC*UDo3i@qCdV7U+Mg_>lPj+x**R+yQLouW`AhPW~nF zRTBQYW&cThU;clW9l*7X>7pd!XUcZx;qEE_{_;Oe%#;5&WFIL`k^dao^TkE-FO|Ji zTq&**H;U(rmy6rQTgBT&T<(lsioaIWP2m!4$X}Ds(qEbDIO6d)m*GRjk)pXi!@o|p z>3j?OWZ7qmXN#LfbKOR~@5;VXyiw%m0+x5Tc)$3l_@rpA>xlPD*{_JNi*Jj2#1F-f zML)00NFNqEi(N(DMKIjFMh1t;9wkl^&F=)l`3a5j&F=-cM0SP9P9h9v7d(=m*huz` zCNCGai~L+f|J%d|#D_$FK4SPz(Y(Nh{i^JDMDsEm{``Q#_zo0 z_$i9%UETdLvP;Brv0AJX*Ngm0!}OcQt>O>GhedWBWIR_#|4Z4w5!>tM_sai$@vkCp z-4dR{Rz2alyPsCq}zY*UQ-xfa*_lfMu#d-}F$B9RX>|@OE znc`g0+?T-rc-idb$#|7wwb&@G7G2#syAU%zyAzTZh^}t^GTB#&*NV4_w~P0QKNNo= zJ|l7}Kj!~}$Zl%1V`7%b>EP&}5c`Up5Q_doL^IwK>~F}PB<72=#d+c};_+g+SS79y zo5Z!^I`KU50`X#To7i5zew+O75ZMQh^>=mZ@5tUOekA@?bam?y-k%{|M=?|EE*>Nv zA`TRXiX+AG;skMqXvVKX{tIL;5=+IUq8Zl;@#10n0>>ez3QZN|5P|9!H5C_X0s zM09oSzm)Cj+FzCZmiUhNp2(@PSnl7&0PfLfcMv;@oTQHa-Nk;Qt9#FrJwiNEoGi{1 zXNx#&zfkY~XZ`;2yRRRQ@Y%ZWa0WM=w7juo3D{U~S?Rhk>~5no*oSx zzPJ#|CZW#Nxc=Ib8 zV|ByK505~t`JE59n+8tjLFDIsBjtu|M3^_fMo)fx_HgURPKRz9IGtyZ-*Psb7B}oN z*xvlsBR_5*>&G`_Zhkkx%`|yfxr|HT8G$FO7KU-XOLXIP!~w*%au+w=Bk-WxT{a=! z1lIuF-G5fjqb4-+erJS67mwK&MIPa&OLxD4SmA=l_n+;1 z40$}Zf4wibKh4AnqNHH;*nR%RHkQADc|C!=o-naOh{cfm-u0!XppK8DgedBH^K+Z? zFU@zh1upBbJJ7?wJCNyY@m-d=HxQh$)4A;aea=I-?{kW8-{&v9f1kf@QvOl-kMG}v zk~jGx`$MQbYwjD*JW!Tzh)EMfnjq4IktSUCnJEUjDY}{z(Yo9BMUf(P!u|VF3y)%6 z?dr|?GR@R{|7AC)Oxd-utY`5VDe0F%>AR$RamZ?Uu?N=WZ_K~qk1z5ag4uOJ-&HtJ z(m2;A2Xbn^K+8Lj_jA7JNeB(F@0Ndb_GCnZu6H9Xf8=mP2=MTSuJ?E%7}|o6fEhSy zPB#-0jBxm>z+$FYntdi?MMLIEDH@rM3M6&C^AQ#p46i^Ub2QyYGvT1jxpcqEKY3YY z#QE3&Xnf6UifFKcCD!8)G`_DRI23#ff5Xd=*cad{J!pJcxxn`sSZ~~sIS8f3_Y(L; zgV6YnM7b#(SPdHAFx}rnj?nnh-_Dvm6|N49kJtK9XndE$jhjpRps|f!`n;8ecYA#^d-yjc*5p z#_qu%Xng5L8J&twgltzO24mDgL*r{J5RLKCEHW(1nrSh1T!qHhni-vnRy)x6b}|`d zp`orpaO$P_(;Hr9+fa628_viRWhR`?hak4m_y*BRF-{K+ zjW6A7^%K|z1t~NGIqQ6}LI%$^8wT4SyOQ=?*?4)8$`?448=6f%*y+p%UZe3XX6~lF zPv}fHbLZ%Q(D=IBd@t)=l2TzpqcK(t8ecY6Am!$)s&nOD`w;elr}pijW1itpVKpTE<+#d z^)RaE&q>7AaMwK1ixbUb{_NOJ*7~Vf=LpRKF}^E-#y8iPgF4}Zrvr_zEhrBrHsEL4 zfH5$!1v^#l_!!4IgT{BbNjo97oaXbLCL42dr=n_P^=oA{CDw&I{Y9lMh+V)V^QF`l zv%Q6}>sZNGI!{6*f6ju~p^W@`+DT@M7R65I7QKS>E5jsnbTMfc z^M~!w!LM<7>n7;zk7xjqm#=d_;UJ%Y(+( zhL16`f>Yxg=8Nx~@$nZ}J~Y1eQZgaVzU|cb+W1rAzh?Q+_}cL4@t-h1XnfO5`hxg= zwkkBfHhy7z1)CKbUp5Y!IsPHTq4B-f)Mrtg=M^=+Je2}DPx|8&15o43b0m=Sv_GCg z4`_TjUv?npZX zQ1D4a$nt#*A0D8dsPuC8=X)j+)A6uPMnZbNvPk85$fMAl%(#5ep6}YI9SyNg-f z!JR+B*O>;h`UR6h<7@43{CQ>#jqgm<4yU}6O2@~DtZG}0?-AHF@djoEjW2)AnAP8z z6dGTe#yQX>HNO0rz&RhkmPJG3Yqw&0oG*x|@jch%R~VlJQsaA* zsp_Km9v)ZF_}UY$GENyNHNMuai}NOu8eeO#j+;Rnpz-AcI@A+&MgvWOv_7jqfY)=)tQFHNM=rJt#J%#+Rkq@>|?Q z*-rQ|M1{teUOj!h449)E2iV8(2?cqgqn`!+xsCAY3wJ2k8GloG432}tQ~-0^_uv*l z>Z z;f`-3Z{8d;#4+jXa|Ckto!jXdMB#U?DOme(09oI8#_tS7=TB^(eT==SGrv_GiX!+8 zrO#&io!{vfNc&CL{GQ+E2Da$8jNcmAln>-gWD{&QX>Wr~9YIblHq>`v$A^%1F`N^y z<{W1HdeQG_RG|Q?5&T|cw)07tchQT2--|kP)2ATgQCN-O_o6QJq8@)6y(sv-D4Sm2 zK$Uu7MS))ne(|epCVLMhr(=(Mr*r?mD)_zFoNT9zA-7p~U(yT)?wm4)hmX5JmO|~S zyTZGT+!sf&UAhC1z7hkC^EhHK)_`+TeKQ@!)@W>|L&i#DoMl5+H`5_wjWKSvA#0oI zka4Op9*2j|Ifi)NMyhLm9gbbb|2Sf=@juz$Ob5l00q5jkGaY@c5pJfV&>GQZI{2X% z(Nde~IMo_y&1@Zh%EcBEY$#}?kZbGG+Cprp)>fe^2ns5~w#oul@vm4Z#3s3h;ST5c zo9WI&*47R-)19=##^wiT8y;<@J87pHn^m^qw$@j`Mhytw)@NDZ(aIc1(M(TL!WCKyhOImlH*}Zn3^2LK$T6ZBVzx=#l zCB0fz+H3}+y@Z5!5!^K%`&78Mdh8u=-{-OUpvCtAZh9UkK~yp9EZP!0W=oLnbYnwH ziu|+TKFAY33hoJ>@R@LPbKUfnaMydnx#`?XZn(R@z1xH;n1yWt8HKFR+H%%5>=bSZ z&fOBEdyUE2+R2iv{Y51qDUS$u#SZ0#V*$OLZxY2={mw~sWHnZZ_y}Gz;N3`W$Lezy z5;tRo_iB>WLMFTv@YMD>i`_FEzVNgQRQeL?qwG=eE5?er1T#lmf*Ha$neRfLyEfl% z5 z>rb%Ukh!b`lT|p{lyCp=C7!#&$B+M71LI)N#)>)<#aR8$>Uy#sE4&F-58f-ui;VXI zf>nk08uA|NO+0J8PbGhD-8I}4-Y6nNf?Hs#?5Fbx8$u*E#FQRWM-D0 z_=_#Uf-Tg-bKARk?L0*LT8Np;uGovm4jwjm=;ErH((0zN@_$=ps?O~*l-*}`PaZn* zza+%`R;v)RD}|UR`JlWEqzr}b06#)A!eU-aRr2(eW4tb)hQ9mNrXC4wb{q(fn%aK1cf(S zK_Tw#KBXu8tWWtvM><8dHAUsCs~U?+>M0fcD##4~^|_c=3>^tA%fF;5gm7x;C<!1Gvqr->T~i%_T!^H zPb?P8#RhS;Xr5LP|9si}M#S{nMf2DSo6oBBe^fNjs<3}8`)$$H8Sa-ILEA8$nfDPq zRQ4S41hGcs3lhfPEb^rY?Q6x`#hv2s#1^p+AJ!3nhP z79SIz7vB(#{sQT{;9U^&$q_jc677j1`&`mKP241!c?jWe^bz1&^5@XGjNb*P0ohk% zrw`hbM59}PT`ZfQf*Ee+?*o4#`vvijB0objUI?E_$SiTTc)ZBIi3~qQ}mf7>e3_x`_Qm(~lhKr^;R^mWxf|2JzeCHR4_36QY^V4Een+`(x4c z4LPmkf$A(df|O-(B`WBD(@G{$b(>af~=ooGS8z2IITB#A9S1FP*2_`LXn_=fnF_`dj&807B<@`;Ka#Y~ak*BPEG zju6L)6T~SZzr8d5apDrOLNvc~2tQT!S>m}OzsWQG9pe4skHp7C4z|B(#y_YF)H&F?4dZnAre{lr{xsL1{TOkXV4iH+hqkvay(+bpvC z7wzrh4w3zm=zoX!koc&$Q+!^0ReVF-E50xCB|G!urvx%X%n}o#`CUgi-?lT}2$6js zXmc7Ja+z2ovWFr4IVwDPuJ|o+n|OuDjuVXcwD=40*P=U5@9$;r64`Zz>CF8C__1ss z-1Im14`57oCox;>DY8Er#*pl6OuF;(9xI#uR_R|ZR*7|Dqv+1ddzx(1 zy&CTGWV1^M^SMpDTfARUvvgauxoFo#X}7h^m|3$E zvp$9}>tnDYf8n0!%msU*=PuY28P{b`((a{ainmaAtDZwbyUZ^;?g*s^hEzm@^Vj%X2uERf(+m8f=-?H2K-0u+`PwG^PE|I%XaSZ&FtTD_Oe5edK7B9 zswHJ$MavH4zGIDV+=!NnnWI~-+BS6OPHf$Cd;9}0#Fp;d6PUTA{I6S4ZrT~)$rqX?Dk8i1I-U$(?x>;Y60+AnKHW4xV)_RE@SF^=yJ?UyxO z?blCCM$~@s;W2eC{`>~3**09fdB;rcR}G4dUCpw`rq~Re*axT=v|rW?#-6144Vlqc z1lt1bms@yO*5z=S8L@RVkC2%a`ySICDKk5EGYgs^vuEr>W;IbJv|sGkZM0txuvTwi z??L-TH(NbHvmk}0(SCKtPKWl38)md$rL^bDUJvoc;RxZtYG#w6{Thd=8SNJ*S+MPW zLT9>}JD(Jx{c^YY64tvU|TezCEn{bI(cgAvSCC4_<_U_kqI8LCR{*Akd9 zKC?mlMK=rT!D_B@3&QTKAJ~hAN zC{uDqYz8AgprbfD_FbBfm{y|ptBU4hz1E<5erUgpEbob4*BG;J>>}3ssn}D-91!Dp zInaK+Y0Osbmo2DO`(-zvRr_V@JU+&5_0WECb}N6*gcyfRf%a>^Fdz^R6*Kge&gN+j+OL;szMeJ|k^DJ}V#VB|H_~|qQ~Pxs3wl!r z8?|4o5R-N>e|WTXIg)?qkNv`D!j25;`Vm}K`^DCY^QMm4FS|ibyqb*x?Uxyp1lq52 z7!K{1wWIM%STM9-)=rC4K}hYFO`j3}9tx%Q>tfvLQ2RBB@uB^);dyaBtZ{zFn@#wL zcnQmc_REHkiF42)YQKJH!pFxcY@qhbUP>m!7chTlzij*|@!zq0XuoXu^!UY05ABzE z8JklOH*ybXzij-%_;8jF?H3z|+OJ#L%+P+VFy$?ZkE0Fk7f+=CwO<37A+%pSM~wEX z6Fs2)`V~?b?bp4`6520{t^(A4Eo2_he!XsD;HM-MJ$p{ zF)_>c1NiU&^+ctYyFYI-k(iE$Z88$lQ`u;=UOWoT$t>+x2h>kj%!tt)Li<&Tjmf?W z8(_3w92qcfuHDdnnPCE<_%Z4^XuoU=2IC93{m_2th(L+laENm7H=CPav|m>-tCgq$ zwO=%FxrlFPQfR-d9gbhjmTN!1;|~y7)wbHN4{_5O=irCbe(~3gS^bzvq5ZP^F&O9U zchr6{GPPfqa34VX#h(dkzZzIHv|n~BrpMPZKWM)yOn!y&!$4}kN=;Q4#XsP21?`tT z;VR?LvOH+NtX&uH#rV*ES$lQ-QI-eoSJ>=xXuo(Rr1p!WzVI>|U%(uo{bCJ__KVLo z)P6Awqy6GQVAOtD4`{#mhL74W>jCZ81B?Ofm-T@5i{HGc{jwg=e#KZ1XuoVJPec1P z71^^^rcI&!qRmPf8`>}0oI=ysuJ&s#JmRScq4tZ0*?nv?XumiZh(8C~FJ2UBn558t zap&+vl5MqLyb|=_RfpOy?%Wn4Ks>ui()?H9dz`gj>IM>h_zAHW?7 z@tG$KapgFcpAC>u+pgXuo*ngZ67V8wc7iKGquT*P95({a9}l zdC>LnOlrUQvF2dD!8Cmoq7~5e+rayc)fA{-+-t3Mz@NgELf)$r0 z>&_srz>y381i9V1Gf4Br2l1230i<5c*hyg3ypDb03^+|?&2+4@MrAV{GOCTS9Uh2Q z*Gz|uMq}`?0U@iK>5#G37`xyBRRHn6ja1xB$H&IMkl;ns^;+z**@tt<7361*S}-voG^<<`ILi2Czw{y^F0s zVTBs?lv>fr&7{3HXE^e#&u-doAd9HcuxvS$95pvvp4+AF}SF z$eq?*KysHcEomER^K>}P(za~tXKSDctw_M-tx+Rv45c@D`F zA93c9+l_lw>!D+$LnzB#?D4|=oLn$TFdjXzB9j^9I^%9CCeJbM%}0^jjk~FmyxzDs z&mx~R?xs4Pshw?QW|PB=yUsA*`p+RNtbdeTBY%<`gUQ@7kd3>znk6#1`19aijTJSX zNv<>QrZVypd z%QW&_>pzuL?X!@DSw1BLGqqlaFw}Z3x!t-8Nn4}M6G&pTjmmoM-)KldLzk%e3ej@+a-KtjI!^X6cE) z_BgQHLQkIh-oMufUHTUzR4^yYDn#sP7RW-yo=h z9(NL<%)kSu4Tk$shl;35ui~p!^hB-KkU>z5wf+rd1u6!cNz5pB%CghTwR2islhu7? zVd64QGnW)cF;#oNFOJKJ`ZT3pR=B%sxM?s`pPjwVl~b`&n6!?ntp4p)Sw{4wS?f}b zEn2)ICk1Mvk7fxxBN_1)@O)YaaKD;UyHPwmhiB`nMiHx|6!3<8g8)vj>YHr z*QTe%9Dba47v67AOwU*!+z>d+f3|N@dLmR94b6>&=7mG^L;k13^TPAPh2gpB855s) z{IN&bW#@l|W{aOHlKsPy&l{}&S5d>2K)v`V#QpJk8ZP@|-M10riG9{s4Ls}Zn?-yK z;6CU0_v}AJvcDDCjYMESGN$?B;6Gg9AzWQ7H<(B6it6^#0!UPd=BZ#bp6DU;#6^=X!=VdUX$z% z;fe0{>~U%fx!| z4DllILGc;!x8ff06EPOG<@FMC#luB2-v`P)UbdOn1NLdMH;Y$_W;WR*?Xew4 zh!x^8afR3uW_T}O=;teAES+G3zuO-cO8GJU2BSAUf!dxXd@#f<0btBPfpiRO0z;kB|?i)+OV z;zrTDt3>>ZWjBjgi#Ln6iTo%@~p^E-w7(7n!-@6HRiMfP{ZW|18WSx#o=(iQ&H&cZ+`#|025js{ntW5TAV!$&Mn20;cWG4|lL^ey6AZF=DxBeiz}tLUxmQ zig>!XQ9NJ#ws@&{rFf0_J@NbEz2bx7W8zOlcHv_EekuM|d`)~?+#`M<-BEzY<>*Ul;!%vd0DEWr?nSD}iyNd^jhlpmL5QMvWu4CoDM63{N#CnnaCYi6%zk_GVK38P-QifkFULjs3-YB|y zuDfL4Cq67bEC=p$MRpQ}Xu~rl}teFT+3UI?Rt#{*Jgmmj9PB zPZ*!XzSeo6MUx+@`@@ahfoE^K@V>^oV0V~h5dPB5{l|sz_)P3B+<#p7JnHdwUWUQB zdfmkhn*k5p@;Va~@N^EoiQ_os^Dy8rKh~?g&TAf?jWh6@f+)RUDv)tJob6~qW8$JxAYS=yh5aP7q_aspY_)7ugEw9eym?- ztnT*igd4|b9blHcKK2-NZPtwo={Y={GQ{IODw?M?KjzOe-D4h3XDg1s(R65W^W%FO zZ@e^Uu3mK`fo?qLyhaUAB$rm5SKjB$6EoqAy5OUp)n|Qt&4-i01s`R@FB{B~Ul!aM@XG+xt~&#j9g3$^IyvhiXW{s_Q0o$Lp%LdsU?%D z&iMH1_l_!|>gjA8ymr3?ee2L@X)Ca2kH(ok#?zQ|Lhtk%yrFl>BmALv(EOMu>wQ=O zUJU}Xvga~hFti^bfg|WYr(2ovioAwgp?w;|G*L_vf&(ZR!uV*29vRQXQA7_8%A88~ zWB3!y%UZ;w(ID>_1H4TP_36f^u2AqE{0;X;0$-pPPKEHGbQT=oqg%M%xFbGtUlqO~lm50Rd>6PnFg|rq;j2?9kBI#qcKDjeNdP)G z$9R_?zA;2!GY1y$g2Oijm^8pU_3*7du0g?!{ z=u0evj}+0NnRKHJ>Y$>-RAMl8C#o48*1=XF8tZAyENiC4_%<&(tcNv?4k|jl!)qoZ z>Y$q7O0B}5cd?pn!%56L$-dFiQH~@L<8VsRu_^BMy^DH9$H@$ud90$}kQp^IfJMj4 zOp86l4LV$AMr;zRc7)8V7++XMkCd4mYh*zaWcG~R%(N3_CR`mHzbyO;+1Uo%C+iVzYe~j<0qH|?a2elBJ%TDiRlc9s+U=N#p(c`0eaM<=f zp)=jg{Y*rR7KLpS1Y_S}y-QN89LMUQqDu~9V@U_aj8pTGn5#;FECU8~P@7rRXj60z z%orm?S9YS?YzC{j$}I@HCl5ts%tT!)qjyH%L-SDw6}_vo5>N*fz1uw!sDp~$Bg^Wb zqW7lo(#Scm_}CV0tAmQ(--)_Ee~#5bMITVw>=@r^L?1D&L>*KE&BuC~J5uPN_#_s6 zqL&#sAg6DP8i?pqvDX34ftA6~pQe0bOsj*6KC6PP4l4RHZGhE5MR%&)@v$w;>KB~? z_*wTu2i2G6^PMt{X?0N1Un{FAW=gf_i%MG%TaIRmzLfeyv%Q6}K0Mf7>D(F3%{j2B zoQb}kHUp8UgW^k{=o{%ggQ}qvNBjTJ4J_;R_4Ig7>Sc*aiMWF-dz&_S_r zsDrwm;m|>um!vt1;ykaS&_VH3GCC-Z8WV*Misy*YLH&jv&_QvM9;1W0g;_!em503^ zpbjd|JfVZ)q&!voY4m0s@te8faz zIv%#kNJ#${Jd6&CN1-{HrGv_GZTyaK^P|u~t;1$!e+L_o7R~WRIZ|2NT)UxzGQ*ZZ zar7~_20AF)g26b4$%#S-r6U3*a>Fsr7yf4RU0!44SIlZD(|yKa!4SjPs#23LVrsY%;Dq@w=E5Iw-pzgK?f1QRtu; znL4OrS!?K^_%lHr)S)aIIw-pp)8l-|jY0=iZ}PJ`s3>$$C!=(nZ}A7Ym!X5QCtPLx z5tauXl(nr6DheHxwO7aakt7No)InySO9ut1OvYg20UZ>T(^2T4Sc3rPz@j4x9Tc-L zIw-z4i$VuwJ)nd77CoSYvL4Vu)pIMLgR&mbLGjyC6gnvD0Ugxci~${#E#+zGppHlO ztd(g~=%8q`QpSc3iuMt%O&wGeb6{1$BOXRb6gnsxY;!*7N1=l<1He%S#j83ElNEGO z>##*Ukz{w@8^s)0x4@$ZuR2lapty5;RI#m~gJP++{2#iBpo3b0QlNvPm-J4&Zs7o< z(g}(}RH~=11#b6T;B7=;dsIY0+Bgatzfm2FJSfwddq zxF73^A`kj5Jgp8Y#o8C$!h9=C4bH}au?lNHmeUjI;70s) z9XUGPA+_+_3m*=Rb;uGJVN@iDwLfDGSj#l9x?{ySnaqMe?56iKZ=!wYbiB~bW+>uN zJ!P_)1_#CSCWqtUI1a1LU40ue}VKo_?1IJldO$JxMaXD6-fw_0) zpJHZkNykjo%52E(h{AWYCIjADKY`U`@H;s8+wTnICY%9>Kbwhf?`RT!grGlTH3a1LC3}cOr|2J8cJO%c{$A%SEl>YZkwc1@*A zE;`=k*3{ON8-Y&l*xX@xL&xT>7?HcYWLa(f;x?h~lue75my}jk)%^QYH!W^Bso|fQ z{|QP7*127+{->ssLa+E`MJt969bAgzz$sncP}NX`+6=DbaZprNUQyCijR_`Bsw;1R zA9h<&Lt`1Qe9hmqII=KfiGepA^dU2Twh-9MqXahSP4)3xUpZftOyPfyci9c zqb|^bCybQL%upciYKt%h66Tgl1pT2v;FXRQc+(A4P2jpZUnm2@nwXg?Dhr_p2Y%ks z7Ybx$9ToN=PAqT(qJ+Z3KNan%w$Z--Inf?&8|~iDiFThiT1wzbM2iJ5^;0N30`)!? z6G2fDG_X;#K(V_0Y?T z>*|D=H*psJ=af4|tuvH-riQ0z`I7qT@){gmC5`A9jw7hH2|dFr>S`OFKGi~<5#N?r)6Xxts@TxU5Z`jDhfco<4@{)$~LlehMoHuI-uU}(xmtab$(#k}A z`O2yWs9qAoMvopjcI@$q+~uWpO^27();E@~&RsqNc4KAJ@+Dve{445Kj>v7O%Pku^ ziawMtg4&v;pww|+p5CUYvPfr@5uw%A*b3nsGBS&TIg^hnT7W~bzKSOo&M?fZ<}_5| z5J|AUb@S^>Z36GdNkEEHI$d>w|qX%(b97Ko}<|E)wA$BkuObG0}u9g)xl2{ zbakt+b5=Iunt|pmS#8d;>QN&~?8yf;PD9n2atA+bW{>`}!kyMDh)1bYH-)>>>VH@? z&+=9YP$|wI1ST&%OUoP4Qsvw)&g5~67dDjFH!NOOTT@cgm^XCs(yGSAlV{DJF~4Y} z<>D#x3l|sG*DiyEtzq%B$&<00%Am$7YA_d*rPWP53U%PDL|!=K8EONdiEFGqv8cMl z9BfM(Ygd)JS5njLJQ!=tOnTghI&a0HZ49`5)Kg)=mIYVIs29E;3K@u!A62eW)#eDOfGubZ#CuZORv?;t-%A!xgJ zJ%Y}=fA@xBCPlA_8#8kQ)#?}Et(s@S&9>?Pkn~F4;M4D`sJrQgdT}e+#_e=B?v)9b z0%&eNeTgt{Q2w1clg6P;YH%is`Qifc7;&jsBQ}X=isy)YFk*gJiPwquil$FD!hb5; z^x=lRNA^DPU^EEx87!J{A7Jy-F8zzeW#UTlOmVw-tN26F^tnTN2+>SF={TI2UoUZx z_ziKUc#K#n^3^ue@ijO3ZE=Tqhxn-Yrud%d$6?EKoy3GVM`X_ihMy?%V>Io1M80CC z{igW77{K99|IT7>(afm;|7zJMiD#g z`654ZF#Y$$2gPT^-->(0PsA9WrkIYMQ%w2d;o@wuNURf27yIJ*i|K}nM~ZXAB5|#F zuDDISQT(O&rucyvirW0Ui2cNo;#6^=SS~h+XNlhtuNUtXpAugZ-w{6%XW;7-x9=En zt9YgOBe6rOjc2qrh<})DqqTuOTDCi9Qladl#l>Q&ST9~EUP@x0eOJ7aMA5pKq|22YlKn%I60rHhr$%%y~U%v?&~t%`rU_<;D3 z_!IFN@z*5My)3>e?p65v;wPdHKkBS!s+cZjlgOtRiMWT#KUW+jjuVe05pTNe0&xL} z{c(zj%eToFmkUF98)k^vqIm&_@@LED3scs|{N8}a%dQZYi4Ec^ah?gW&JmtwAAs#Lo?JM$`F1tYdrg)rK zDlQex?=#Y!C;LDeqni}(R`G7}e(@3U3Grv5t3`TAwyQ4W5n@druJJF?es54qv77vf343zqhi4&!z}&r zm-`QgnpsAOF5GzBS9J4O;KF!(c5)XU3tVPkb<@y(1M7J_FtoT~Q(@yL(wQLt!ru6L zi_F~7r3b(i1SJ41G4_GeS z!7X>CCk>p=**F*zbZBwQVplS6eiP78JWrS(Zj)N`+X%Ot22STX-+btsiw4ZW=h9KOw(M+@0tN`wraR{BA>j+)n0)Q>!(<>)>X7d04rejg$CN zcW1+97}p<&ZoI_7pRLc}Z@RaBmm?mJ8Fz7a&HeE3*6$uq`|*RIyS-1tjm@ib)9-AT zpIa8`IXs+T!f_Jtq&}k)R_4e3!!kY1<@D`sdt$-cEN*^Gi4qZ5NE@xRR3HNIfZuF=zO`MB$cw|v~?gE_lK<Ez8HWf)qY<2yZEjYBA^t`M)+0r5PB$JL&|#P<{-U9C zkpnauyh&@P(U=UcP$F|Qq6cOpX=qU9T)IENpHN;_8MBE7r!eP2{0aBz_7p>cJMlNX z6bXERWvEGHP&zAN^csfmw9l+T(`^ zqh6y4erQDA<8-7uz!BY3x|+tx*nvpdDMO;XgN!|mOjCwtn!8D>*GL(r5`(c1P|cKK z9c%@nu`R~TvSwOrGt#FF>tRi!*GL)OVIND*pwCMRm-cmYn8g!x*%%H>sH)bwetUd&w1|5O$Y>EY5#A3 z&HZHZJvvVQT$w)HpCJKvLOjEMoK=)i7nR zaSiGDLZ5~W*L7&dcaT<1hP_4{rL8vuNBL)<1zO)ncVn2j^Jz8^_i7brdyPP;I^qah znbo;9fwEpyme^}BJPN~F94a!`#@l22E#1qC{}ZoT@bpb z5b8~*qnzr%-Tn|#(q1EQPd790%LS*bU1Wd12gQ!AcZ!&i5Kx4I325bZUxDZD+U6hgMWM&P|LXE5zG zE@wgS%V49u#_7m~NxQ3m94+1Hr=mOg=$8?QN@G-yVMsZ^6IkZ*Q#;CDBLI61%ArRi zEmQ{VHGZy|pzSq4XKC6Wd7cHsUPIFlroG0;)GF*XwEVnCy#*Tf8p??W>@{{U9`+jQ#TxeMb6y2t zufeIL>@}t^L)dF@jwpMLgUEorh8NFZ%3g!!eF4~O%z(<2y~cUW1NIu-l!UU^;8f6^ zLZ#LN%GiUgKb! z#-jc!suA`YoX=6dq)iFHUgJziMAX_1dkqpC5haKXz+Que!J;q1SJ?sBYsiQ|iEOy# zVfN9(kZ%}=0{LHHR=1#*0oZGhU{=>NDeN^g?N!D*0oZFCsO0m7_8Ph$J(1(tAlPeAnD!cfU?0FaQBnZG>Lo;Bn@d5`o>@_q4_8N~; z0`?l30eg+_DFJ&8&49fIPs0nqUPG5cdyQ6P&sr&+!d`fQUVar3~s36B+9!OOI z*lW;yIskhO<^X$*YgsVtH3}68dyNATkLR&+6xr)tFtxo#5cV2tkW23^kY5|S2dy+> z_!wsFGA1x`KL#rZdyP4eg1v?xTzA-&`Af*8(fGobj?CP!;MfR`wF_~ezbrpq&~2k#%C-z6`M(#+~^eC2r~g4g1c zKZbJ0DBe4upTP&l8%2h>BJEP7rQuHtKHwF@@I&#Ip$)v>gEtJkEXuWlZpNo?P5p52 zdXm>~8w$Dv?~3!4J@Lb7Y}0uVIt!ot;jFag@!b>OLmB;_M|0*OfH=gS7J3$`2Yd+T zz_;*^zgZoF&mhJg^fz!ENrEv@=INnbZIYY<@pVkXSUbsYkdk@0`I5&xIW!^#1>6ND z&#bzL(u^4VFgSE2b2~ncg3?(*^Ndh6QYGv51cV-AQpVZ^+0E%u%_L`rE^U+KO^DOD zau8$fBnZ9ZiZ#vb%@a8NNjNxxr%GJj>6U?-ELqJw!8 z8N}H3Ne17}Bo|r3+a%$amA*{ESV=O(E~WTMCb`&3mM{^b6DZCY5jP6fqMGh4?rhV2 zDKa10kL0876h+*LQRaRO1V%~W%FS@^Eo5TK{${9H^oU7J zp;So7B4+}c)UX=G?U@+kZS8D^cVK6O$%nhoiE3Tty#rzX@Md4ykOtIVZEB(rz}9)f z0r;lp7w2G(mrH(`?|f*TpoO@J*9!fmcHP%s-I zu%p@<*#t()V*)W);;*TUuQo$vJMfkXl)#gUFh9!uR4TCH3LAiw0 z_$VVAw&y&}C$KeQWW(T<_|V9PsKZGs3~a3imsfk_=*d(3rR@HCd;%B?7rILNl=Rz3 zvQfn@B(&h;F`A9uO3$p9Lv|g=(=^K~$w{7p55^pUU7(XQ#3mrQEz5zlL9>FAoaANr zAURrOR)PtA_1}jl1+$WO`Xvo)#dTe1M=fCl4Btl?uhGlQALdL8lOEM1lpHZDQ_f5oa$yX)3Z9t zq{jgrabtaKF0y{tnRP$)bS8zii5XnDr!>W?l8aE0_POPN=Ta5)*ws{X)+W*s$ik-= zK6&`qB_OCS@;GqX^QjnHIgGQf0t7gw+RKwib+zYD0&iLeeDY>=z$fp}4){(U^Kb%&Z@Nr((I*22nzWr<)rERLZET#6r3``p*IrqO8jleEb ztlRBuqqyl*Y?!br?Pe*3PSmCXw3Nb)3R{_JDTPqNQVQXOrIa^mDFt?iwoyB@ZB%#5 z-P1OXf^ks59WE$P)=@X79$KKSqyE%ndfc#=+UPaATdrZ5Zl;yz{z&Bk)P_V>8PDh!_TnXk|Z>c1`@l{BfY-QT~cTgxzxi+-pZx{Y0?fCBs|JUvK zA2ykpnVDHAKHGg8tJ@>Xaz*V@9#;*?cHg>N%o7rG%Wg4GO3cm47*Y0{$FUO*Lm}=l zOLjN&qQ%#NSymbk&hn;PX@xOw0rCjAS9fgWwV&jnkc9o%znOWL*mZSk2fCYOh?=PT zWDa(0(FhnE?D0@1mB${Aa)Nn8(MVb=!1}6U_-NQSDx0%^nsFFj2eiU`qsv4rzHf&# zHC2{Y#L>U2i{mx4Qxg3(j({=Os`6%awo$Wf98(ALDBI?+TwCz)5HDp+2uqnbPnLpt zQ5jMtEo!v+R3S`ixTbR`{9iB_ON`5XIjX6>!9>vrGy*NJX|8|;QR95lNt3dP3#J$8 z__`lwS*GmIoSpN}vMT#un}@~Y3#KmArf_WxqB=a?=|9~_EIxnY!X>mU>#`Nornh*A z$Lr}m+KTZZe^NN-G~emoGpsW`XSsjoI*;!Ix@^V5&_eQZtKDBtn!C)Bms{-;bJAJr z>?G=vI_}U`Og$WQU@L~D4$t2B@k;j{_v~{&8Ik+%h&_oR{02Zo2M-qhFu~D+(*$P= zE)ZNMSSi>n$oEOi|75}Q1uqobBzUvnZv{6C{y|Xfy+=Op3jJ3>`kPhl5ga8rP4IBR zGQrh?rwDRzGX153YR^09Cxm`QFojcjiROeeDzgvWU zP>?^Uvz#{s{~;K{_b>A46^%GhaJ1lZL2k)l{HcQKdrv3 zM74(-I7a9hf~N^`0~Y1}OYpx1pBH>fkXtDz_nqKKeB&cMRdBIjrC_Vz>4Lu!yhiYD z!N&w&7JOguOF;_*o#m+WnSgzT9w9hYkbbWyM^}tQZW$n+CCELeq{s0me&9^OBLtTV zt`fXZ@Jhiu1RoLnSWunMg#1!57n!d*p9wfbXmvgl=-EQ6^O-=`34NmA&jqg#yiM@G z1^*zpUGQ^34}SS(x!naz1&ii|-=f;{wd7q#3fzUnh9F@Yf4{q2LunwC^e+KKBXVw*7io z_FOWATkeu=~% zCF$yjkZTfJ`8S6g_tLYR^}^pIa@Pp`TZ#Xj;1=P(NJM_G3H`Cee=7Ku@V(F}2RpBBNB1+NsmTX3u3-vx1-QTbyTQ;6y*Ocxw0 zc!=Os!I^@5LCgB_B`VRjZ7UV}7(u>JW&A3^;{{Iti&mz)Lhw4ln*{F? zyif39!N&xj6MR9C8%LNQe`g|cw+b;uFjFuh7!&Lx$gRMXFA^LpsBE~wpDMI+Ee(2} z(2E3*5-b%|Hr|k{7kZT-w{WqX(*(JVl=LqIeP2s;IxI^$GLEE+s zzxt{4?QPoBa}o0GE%Ef?%W{SZP8OUlI7e`Spt8A#e526ZoW%5J2y*)o>B|JKBH~$r zn~=!AN057sNIxUUjYOp15#%l*(q9XHPeeZ43PgT}AiWQh&;35+A0${Td~WO^f2!at z;p1^grL)&PkV+24D8%E1!uIQ9mhfYOeFO&x4i;43FHqJvp-Tj(2)18Gmk58UV6|Ya zV54A*;5xz61kVyYSMb+@{MnQ3-z0do;O&C#*V6}u|D@ovf?EY&65J;Ep5P9_j|6uL zej)fb!S4k5;|%NN5p2IM(~O1jIfC}Ol*RP;>KV23DQG^fuBEgL=S;z$j>2j?1eZxI zMuGBuR8ZF3Y!r}D(7}7OuCt|}P5xG`ul@i(K3G!JHC)gJTW&BI40A5=qTKZ=r2ly& z%x4EX4OwsC<8!<|u;ZqJk4GY-1Rq{+^o0XZ%x!+B$57ysrs~CC)a^6~8t)>nzhFJL zFFS5I7B>Ab`368jn5q8$^S-ccs zJDDH5#m?_Kgjt6|e0V*cV;DRq&b}DO&mDrc+|Bv>X1h3`&%W6%zJ&UvqYT!s8$NdZ zxHe&oHUiYOv|WCz8!w_`co^#;7Xz~g_ z9WkeCIalgqbB#G(r#9Dk9Op_+hehLbWzm?e&Xw9q$+47t7@>@< zr&gb{Y%6j!2Wg&rjc=>FCRDmrN`4r~6Q+#KZ}2;=YL3UGH~y5FAjUc-s*1xu*fOg3 zC8j?Mv9MnpfUd(CQ?HToSffC>^BA7na|y*gzTZ>8Z>hIPe&1YV-p*$6L&&)cvu07; z4>Lbd8TjYP>&b5-mS+?GdoAQ?x=jpyYjAifIPM1-*`&fgz8dnvHn9afWO1$gV*~;v z7)jRkDZgWQJ|wIgGRfE0Dg0IvqC9OAt*ZikQL)qj{#n=f>cEDrhQ!aY$FdpE^~MS(;2qxakeIvZK7{j=qZ&EZ4>!LCpaJf{)mri z8z$8w$fA#L6watY*%z|xF#)@M2SUy_R!C3k7pSK1U?Kgfd_U+LCuB-0A8UQ%g-lPS zM+M&@LT07@k!dFg8BOJP1z(AfIjMX^_DvKrVVmeX)X#U6sSlxVeTN0r`$}m23+6m4 zK+?^#q&{Ty9Mv$;uGDcD1itw~(>8HDn!%Txs>!fTj3I;drtc_!6vb+NAKi^%_UUHU zEbi4R@T5M^G}N={E*N8tx0Z8Y^Ml3SFPXq&i+L>Y9 z#_nCbF-Yw7dGp(b9ba|B;V=;nI@Es2+bnXn@DJ%;l$cBI}ti zY!hX=L};zzgKgqbcp#!B+Fgu?ZK9_A>I@#xy)>N?`7MVUY!h|*^vD%#6l@bO3NU?E zB%2k5ZK94ZjPQlD54MTwg=zlq$U>F}+e95dI#x?`mCy1k&RR%Y!kKoyhsYmhixL2!?UC|Fdnvv>P0SW z6FIMZuubGtQnrbl5~MfOM9H%I^Cl(4bR4!xA*A05hO$lMC{&YK zY!gGMpRAa^byOp46RXjf=<#SkiVwDld`lluYd35Y)hl~gr2Uz#fo-DJpeHho?T2lm zj0lv-hFczHALYOc`(T@RC9|4>8u(zFNCL}6gl{8!uuasoH_|}OwLeRWKLJR!dv5iu zbNRl)Lt`Y&tYDkSyBV|Ez@)HE)cxp*RIx#@O{6ew6HjHWVVlU?1kaMHWYMrq)UB8i zIh6UqHnB?Or)?8`uuUviRb8TNUVX4l)Dx~cavjTqZK9^NZK4mhiJD#=xsBz)Hqop4 zTx=74uubft7_dzo!W>|m$Qmfy#A^}o!8VauDBDCHn(l*bqGrH0k*7BLV4J8JuuZ&` z60l9w4A>^_pag6aH3PPZpHl+1iMkZpCQe26td-I!Y!gYdQi_IcBI$lMP1{5tY!l~$ z5gCaXA8ZpzQ0Mj38Eg~Pj~_fsimN&al@)9g**Tm@LLacx2iruh1le45e6USq=Vo6( zUBNbyrRwspwG+WMkv}oPHj%6xlgoe_-56kZAZ&R!(dCROwhuf17F7Dc*aapTh@? zE+egfYa=c6wHP^tcnpwh&&L+Ax7Ak}8Y*FM8N5p)oKEBjBR_d*o2A5m#wQ2_n1T9Y ziX(aW{gm&#VANBwk%2y%sNTo`$0%ZIH!?6<6O9`gDA7dAMh5sT2V$!?GO$P!Cnysk zuC_2LB5A5!%6!TyqG~8FV;q1_JY0h=_5h)T?E%6G+XM8oeM$@1Vtara zrNhF(i=MXyznrV04i*_!tae9pOEnI_Y;#IPJ$^pHkrJ|r z{-3sc{y%)*e7oPLFkgM zcn<9!wI9BkD2#`k#FsVM*Hr=q0bfnZN(qVQ>PqT@`IBfHK- zQ4h{;^^2$q3eAW7S?G5JeNX`F(L=DGV6or~ z!3Bax3$74U`{9uOVxg}Ud|mJ_f?o+*c%Ei?S%Ue3#ex$B=LyCI8w5`jJXi2C!J7qt zFQ|N^qnr&H_$k-yXtrwH=3I%&H8BW@DBO^`3J$bUodL&0wZ19|bF*Kz2I*I?-1M~_>$oJf<<^)%JdTjPZ0c>;B|tZ3%c-TlJc2?_L(TXg|_#( zj~4n6!6|}=3I0UzIKh*N=&REO>CKJ%md}^?4MJZbc$M(!$c=J$2;M7vwGSSAdmsEW z!hc2NUKhl&q4$Rg^4`UIaP=id1=X7m&~t=dAlP;GhSt+Wu7}W%T3>)8sAK|kN>yUlfaZ|y-(q)uLgddB~ z-;fFSrD3Y5cdxA1Vtnj02paSN`Jsbh2bZ^#yBF*CDm*{fmn~NghO=DbKx{FA9Lr^S zYzJ{AK6V-ejRGu|F$Uzav$mNuL|~M%kkNjVf$Kiz`pHIywB0zZb)pm_gRG9j{S*ewad>gi|9~;@gU@4VD%n8b1|_Ckf|?G+ zq-cL(A7B#(0^IR$$M|v|ioxefoM|u>v(4>7a@Uxiha)BS2VMYSH}|HwW=Ctt@>q)~ zwF{}SS5SS&@%Vm8%5PnZq2_*_kC`<+FQTyDMF5r#x{cR7(Dx8$KeP>VTY07z5#m0jzcDOf5*7nvi}CrG>_MF z8)Z!YuN9Z^Z=-PRIHW4m&qB7`aY$RC@CIlSI}VlIP-4fSF3}TCLqo9RP?P>J51jKA zXK6Ae{3>*e9fz8^QUw--tfJjzcLtyqQ%yM98c#mtX8S)UnZU2@5I_GAGQ9 z57=?2W3l6qzh?SP>^SU)8ibF*XvB^~hN<;OsDoJnl5Xrc413V&*m1~)fpAU$7b z>^KZvhZyd*Q%%N>!$MR|?KtEfK&|hiyD`k%=dxyTuda$GJc0Et4RA9SHsgd@G3+>` zveb@4uZJ0jxP6o#DZ%TZV|na2JOgu)I}V=(8GedAzA}Sh78GGMSJ?%jdpPRSpGPcr z98SgkQFa_k0@-mW6_Xu@n(~JaLKCs$a5A#MX$avd)Mwk%5U}G=eRa-H59d+%K^eu- z@G>@WOORT^j>GWZ8T(l7d(eX`KNkL!-TFjs8af-hkHYt`)=#GnSLA^3;cU}00d

    BEjg&S2~~47akN_hqng#~~}k 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 }X>$J-Wv#Ih}YrchCsW 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%0DH&*Tw9nEn+9*cGKQxvrW5c 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

    © COPYRIGHT(c) 2025 STMicroelectronics

    -** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of STMicroelectronics nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Specify the memory areas */ -MEMORY -{ -RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K -CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K -FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K -} - -/* Highest address of the user mode stack */ -_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of RAM */ -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x200; /* required amount of heap */ -_Min_Stack_Size = 0x400; /* required amount of stack */ - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data goes into FLASH */ - .rodata : - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - *(.ARM.extab* .gnu.linkonce.armextab.*) - . = ALIGN(4); - } >FLASH - - .ARM (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - . = ALIGN(4); - } >FLASH - - .preinit_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - . = ALIGN(4); - } >FLASH - - .init_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - . = ALIGN(4); - } >FLASH - - .fini_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - . = ALIGN(4); - } >FLASH - - _siccmram = LOADADDR(.ccmram); - - /* CCM-RAM section - * - * IMPORTANT NOTE! - * If initialized variables will be placed in this section, - * the startup code needs to be modified to copy the init-values. - */ - .ccmram : - { - . = ALIGN(4); - _sccmram = .; /* create a global symbol at ccmram start */ - *(.ccmram) - *(.ccmram*) - - . = ALIGN(4); - _eccmram = .; /* create a global symbol at ccmram end */ - } >CCMRAM AT> FLASH - - /* used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - *(.RamFunc) /* .RamFunc sections */ - *(.RamFunc*) /* .RamFunc* sections */ - - . = ALIGN(4); - } >RAM AT> FLASH - - /* Initialized TLS data section */ - .tdata : ALIGN(4) - { - *(.tdata .tdata.* .gnu.linkonce.td.*) - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - PROVIDE(__data_end = .); - PROVIDE(__tdata_end = .); - } >RAM AT> FLASH - - PROVIDE( __tdata_start = ADDR(.tdata) ); - PROVIDE( __tdata_size = __tdata_end - __tdata_start ); - - PROVIDE( __data_start = ADDR(.data) ); - PROVIDE( __data_size = __data_end - __data_start ); - - PROVIDE( __tdata_source = LOADADDR(.tdata) ); - PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) ); - PROVIDE( __tdata_source_size = __tdata_source_end - __tdata_source ); - - PROVIDE( __data_source = LOADADDR(.data) ); - PROVIDE( __data_source_end = __tdata_source_end ); - PROVIDE( __data_source_size = __data_source_end - __data_source ); - /* Uninitialized data section */ - .tbss (NOLOAD) : ALIGN(4) - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.tbss .tbss.*) - . = ALIGN(4); - PROVIDE( __tbss_end = . ); - } >RAM - - PROVIDE( __tbss_start = ADDR(.tbss) ); - PROVIDE( __tbss_size = __tbss_end - __tbss_start ); - PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) ); - - PROVIDE( __tls_base = __tdata_start ); - PROVIDE( __tls_end = __tbss_end ); - PROVIDE( __tls_size = __tls_end - __tls_base ); - PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) ); - PROVIDE( __tls_size_align = (__tls_size + __tls_align - 1) & ~(__tls_align - 1) ); - PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) ); - PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) ); - - .bss (NOLOAD) : ALIGN(4) - { - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - PROVIDE( __bss_end = .); - } >RAM - PROVIDE( __non_tls_bss_start = ADDR(.bss) ); - - PROVIDE( __bss_start = __tbss_start ); - PROVIDE( __bss_size = __bss_end - __bss_start ); - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack (NOLOAD) : - { - . = ALIGN(8); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(8); - } >RAM - - - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a:* ( * ) - libm.a:* ( * ) - libgcc.a:* ( * ) - } - -} diff --git a/L1_MCU/STM32F429ZIT6_STARM/STM32F429ZIT6_STARM.ioc b/L1_MCU/STM32F429ZIT6_STARM/STM32F429ZIT6_STARM.ioc deleted file mode 100644 index 583a754..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/STM32F429ZIT6_STARM.ioc +++ /dev/null @@ -1,513 +0,0 @@ -#MicroXplorer Configuration settings - do not modify -CAD.formats= -CAD.pinconfig= -CAD.provider= -DMA2D.ColorMode=DMA2D_OUTPUT_RGB565 -DMA2D.IPParameters=ColorMode -Dma.Request0=USART1_RX -Dma.Request1=USART1_TX -Dma.RequestsNb=2 -Dma.USART1_RX.0.Direction=DMA_PERIPH_TO_MEMORY -Dma.USART1_RX.0.FIFOMode=DMA_FIFOMODE_DISABLE -Dma.USART1_RX.0.Instance=DMA2_Stream2 -Dma.USART1_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE -Dma.USART1_RX.0.MemInc=DMA_MINC_ENABLE -Dma.USART1_RX.0.Mode=DMA_NORMAL -Dma.USART1_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE -Dma.USART1_RX.0.PeriphInc=DMA_PINC_DISABLE -Dma.USART1_RX.0.Priority=DMA_PRIORITY_LOW -Dma.USART1_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode -Dma.USART1_TX.1.Direction=DMA_MEMORY_TO_PERIPH -Dma.USART1_TX.1.FIFOMode=DMA_FIFOMODE_DISABLE -Dma.USART1_TX.1.Instance=DMA2_Stream7 -Dma.USART1_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE -Dma.USART1_TX.1.MemInc=DMA_MINC_ENABLE -Dma.USART1_TX.1.Mode=DMA_NORMAL -Dma.USART1_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE -Dma.USART1_TX.1.PeriphInc=DMA_PINC_DISABLE -Dma.USART1_TX.1.Priority=DMA_PRIORITY_LOW -Dma.USART1_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode -FMC.CASLatency1=FMC_SDRAM_CAS_LATENCY_3 -FMC.ExitSelfRefreshDelay1=7 -FMC.IPParameters=CASLatency1,ReadBurst1,SDClockPeriod1,ReadPipeDelay1,ExitSelfRefreshDelay1,SelfRefreshTime1,RowCycleDelay1,WriteRecoveryTime1,RPDelay1,RCDDelay1,LoadToActiveDelay1,RowCycleDelay2 -FMC.LoadToActiveDelay1=2 -FMC.RCDDelay1=2 -FMC.RPDelay1=2 -FMC.ReadBurst1=FMC_SDRAM_RBURST_ENABLE -FMC.ReadPipeDelay1=FMC_SDRAM_RPIPE_DELAY_1 -FMC.RowCycleDelay1=7 -FMC.RowCycleDelay2=7 -FMC.SDClockPeriod1=FMC_SDRAM_CLOCK_PERIOD_2 -FMC.SelfRefreshTime1=4 -FMC.WriteRecoveryTime1=3 -File.Version=6 -GPIO.groupedBy=Group By Peripherals -I2C3.I2C_Mode=I2C_Standard -I2C3.IPParameters=I2C_Mode -KeepUserPlacement=false -LTDC.ActiveH=320 -LTDC.ActiveW=240 -LTDC.Alpha0_L0=0 -LTDC.Alpha0_L1=255 -LTDC.Alpha_L0=255 -LTDC.Alpha_L1=255 -LTDC.BlendingFactor1_L0=LTDC_BLENDING_FACTOR1_PAxCA -LTDC.BlendingFactor1_L1=LTDC_BLENDING_FACTOR1_PAxCA -LTDC.BlendingFactor2_L0=LTDC_BLENDING_FACTOR2_PAxCA -LTDC.BlendingFactor2_L1=LTDC_BLENDING_FACTOR2_PAxCA -LTDC.Blue_L0=0 -LTDC.FBStartAdress_L0=0 -LTDC.FBStartAdress_L1=FB_ADDR_LAYER1 -LTDC.HBP=20 -LTDC.HFP=10 -LTDC.HSync=10 -LTDC.IPParameters=HSync,HBP,ActiveW,HFP,VSync,ActiveH,WindowX0_L0,WindowY0_L0,WindowX0_L1,WindowY0_L1,PixelFormat_L0,Alpha_L0,BlendingFactor1_L0,BlendingFactor2_L0,BlendingFactor1_L1,BlendingFactor2_L1,FBStartAdress_L0,ImageWidth_L0,ImageHeight_L0,ImageWidth_L1,ImageHeight_L1,FBStartAdress_L1,Alpha_L1,VFP,WindowX1_L0,WindowY1_L0,WindowX1_L1,WindowY1_L1,Layers,Red,Blue_L0,Alpha0_L0,Alpha0_L1 -LTDC.IPParametersWithoutCheck=FBStartAdress_L1,FBStartAdress_L0 -LTDC.ImageHeight_L0=320 -LTDC.ImageHeight_L1=320 -LTDC.ImageWidth_L0=240 -LTDC.ImageWidth_L1=240 -LTDC.Layers=0 -LTDC.PixelFormat_L0=LTDC_PIXEL_FORMAT_RGB565 -LTDC.Red=0 -LTDC.VFP=4 -LTDC.VSync=2 -LTDC.WindowX0_L0=0 -LTDC.WindowX0_L1=0 -LTDC.WindowX1_L0=240 -LTDC.WindowX1_L1=240 -LTDC.WindowY0_L0=0 -LTDC.WindowY0_L1=0 -LTDC.WindowY1_L0=320 -LTDC.WindowY1_L1=320 -Mcu.CPN=STM32F429ZIT6 -Mcu.Family=STM32F4 -Mcu.IP0=DMA -Mcu.IP1=DMA2D -Mcu.IP2=FMC -Mcu.IP3=I2C3 -Mcu.IP4=LTDC -Mcu.IP5=NVIC -Mcu.IP6=RCC -Mcu.IP7=SPI5 -Mcu.IP8=SYS -Mcu.IP9=USART1 -Mcu.IPNb=10 -Mcu.Name=STM32F429ZITx -Mcu.Package=LQFP144 -Mcu.Pin0=PF0 -Mcu.Pin1=PF1 -Mcu.Pin10=PH0/OSC_IN -Mcu.Pin11=PH1/OSC_OUT -Mcu.Pin12=PC0 -Mcu.Pin13=PC2 -Mcu.Pin14=PA0/WKUP -Mcu.Pin15=PA3 -Mcu.Pin16=PA4 -Mcu.Pin17=PA6 -Mcu.Pin18=PB0 -Mcu.Pin19=PB1 -Mcu.Pin2=PF2 -Mcu.Pin20=PF11 -Mcu.Pin21=PF12 -Mcu.Pin22=PF13 -Mcu.Pin23=PF14 -Mcu.Pin24=PF15 -Mcu.Pin25=PG0 -Mcu.Pin26=PG1 -Mcu.Pin27=PE7 -Mcu.Pin28=PE8 -Mcu.Pin29=PE9 -Mcu.Pin3=PF3 -Mcu.Pin30=PE10 -Mcu.Pin31=PE11 -Mcu.Pin32=PE12 -Mcu.Pin33=PE13 -Mcu.Pin34=PE14 -Mcu.Pin35=PE15 -Mcu.Pin36=PB10 -Mcu.Pin37=PB11 -Mcu.Pin38=PD8 -Mcu.Pin39=PD9 -Mcu.Pin4=PF4 -Mcu.Pin40=PD10 -Mcu.Pin41=PD12 -Mcu.Pin42=PD13 -Mcu.Pin43=PD14 -Mcu.Pin44=PD15 -Mcu.Pin45=PG4 -Mcu.Pin46=PG5 -Mcu.Pin47=PG6 -Mcu.Pin48=PG7 -Mcu.Pin49=PG8 -Mcu.Pin5=PF5 -Mcu.Pin50=PC6 -Mcu.Pin51=PC7 -Mcu.Pin52=PC9 -Mcu.Pin53=PA8 -Mcu.Pin54=PA9 -Mcu.Pin55=PA10 -Mcu.Pin56=PA11 -Mcu.Pin57=PA12 -Mcu.Pin58=PA13 -Mcu.Pin59=PA14 -Mcu.Pin6=PF7 -Mcu.Pin60=PD0 -Mcu.Pin61=PD1 -Mcu.Pin62=PD3 -Mcu.Pin63=PG10 -Mcu.Pin64=PG11 -Mcu.Pin65=PG12 -Mcu.Pin66=PG13 -Mcu.Pin67=PG14 -Mcu.Pin68=PG15 -Mcu.Pin69=PB5 -Mcu.Pin7=PF8 -Mcu.Pin70=PB6 -Mcu.Pin71=PB8 -Mcu.Pin72=PB9 -Mcu.Pin73=PE0 -Mcu.Pin74=PE1 -Mcu.Pin75=VP_DMA2D_VS_DMA2D -Mcu.Pin76=VP_SYS_VS_tim6 -Mcu.Pin77=VP_STMicroelectronics.X-CUBE-ALGOBUILD_VS_DSPOoLibraryJjLibrary_1.4.0_1.4.0 -Mcu.Pin8=PF9 -Mcu.Pin9=PF10 -Mcu.PinsNb=78 -Mcu.ThirdParty0=STMicroelectronics.X-CUBE-ALGOBUILD.1.4.0 -Mcu.ThirdPartyNb=1 -Mcu.UserConstants= -Mcu.UserName=STM32F429ZITx -MxCube.Version=6.16.0 -MxDb.Version=DB.6.0.160 -NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.DMA2_Stream2_IRQn=true\:2\:0\:true\:false\:true\:false\:true\:true -NVIC.DMA2_Stream7_IRQn=true\:2\:0\:true\:false\:true\:false\:true\:true -NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.ForceEnableDMAVector=true -NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false -NVIC.PendSV_IRQn=true\:15\:0\:true\:false\:true\:false\:false\:false -NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 -NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.SysTick_IRQn=true\:15\:0\:true\:false\:true\:false\:true\:false -NVIC.TIM6_DAC_IRQn=true\:0\:0\:true\:false\:true\:false\:true\:true -NVIC.TimeBase=TIM6_DAC_IRQn -NVIC.TimeBaseIP=TIM6 -NVIC.USART1_IRQn=true\:2\:0\:true\:false\:true\:true\:true\:true -NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -PA0/WKUP.GPIOParameters=GPIO_PuPd,GPIO_Label -PA0/WKUP.GPIO_Label=USER_KEY -PA0/WKUP.GPIO_PuPd=GPIO_NOPULL -PA0/WKUP.Locked=true -PA0/WKUP.Signal=GPIO_Input -PA10.Mode=Asynchronous -PA10.Signal=USART1_RX -PA11.Mode=RGB565 -PA11.Signal=LTDC_R4 -PA12.Mode=RGB565 -PA12.Signal=LTDC_R5 -PA13.Mode=Serial_Wire -PA13.Signal=SYS_JTMS-SWDIO -PA14.Mode=Serial_Wire -PA14.Signal=SYS_JTCK-SWCLK -PA3.Mode=RGB565 -PA3.Signal=LTDC_B5 -PA4.Mode=RGB565 -PA4.Signal=LTDC_VSYNC -PA6.Mode=RGB565 -PA6.Signal=LTDC_G2 -PA8.Mode=I2C -PA8.Signal=I2C3_SCL -PA9.Mode=Asynchronous -PA9.Signal=USART1_TX -PB0.Mode=RGB565 -PB0.Signal=LTDC_R3 -PB1.Mode=RGB565 -PB1.Signal=LTDC_R6 -PB10.Mode=RGB565 -PB10.Signal=LTDC_G4 -PB11.Mode=RGB565 -PB11.Signal=LTDC_G5 -PB5.Mode=SdramChipSelect2_1 -PB5.Signal=FMC_SDCKE1 -PB6.Mode=SdramChipSelect2_1 -PB6.Signal=FMC_SDNE1 -PB8.Mode=RGB565 -PB8.Signal=LTDC_B6 -PB9.Mode=RGB565 -PB9.Signal=LTDC_B7 -PC0.Signal=FMC_SDNWE -PC2.GPIOParameters=GPIO_Speed,GPIO_Label -PC2.GPIO_Label=LCD_NCS -PC2.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH -PC2.Locked=true -PC2.Signal=GPIO_Output -PC6.Mode=RGB565 -PC6.Signal=LTDC_HSYNC -PC7.Mode=RGB565 -PC7.Signal=LTDC_G6 -PC9.Mode=I2C -PC9.Signal=I2C3_SDA -PCC.Checker=false -PCC.Line=STM32F429/439 -PCC.MCU=STM32F429ZITx -PCC.PartNumber=STM32F429ZITx -PCC.Series=STM32F4 -PCC.Temperature=25 -PCC.Vdd=3.3 -PD0.Signal=FMC_D2_DA2 -PD1.Signal=FMC_D3_DA3 -PD10.Signal=FMC_D15_DA15 -PD12.GPIOParameters=GPIO_Speed,GPIO_Label -PD12.GPIO_Label=LCD_RDX -PD12.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH -PD12.Locked=true -PD12.Signal=GPIO_Output -PD13.GPIOParameters=GPIO_Speed,GPIO_Label -PD13.GPIO_Label=LCD_WRX -PD13.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH -PD13.Locked=true -PD13.Signal=GPIO_Output -PD14.Signal=FMC_D0_DA0 -PD15.Signal=FMC_D1_DA1 -PD3.Mode=RGB565 -PD3.Signal=LTDC_G7 -PD8.Signal=FMC_D13_DA13 -PD9.Signal=FMC_D14_DA14 -PE0.Signal=FMC_NBL0 -PE1.Signal=FMC_NBL1 -PE10.Signal=FMC_D7_DA7 -PE11.Signal=FMC_D8_DA8 -PE12.Signal=FMC_D9_DA9 -PE13.Signal=FMC_D10_DA10 -PE14.Signal=FMC_D11_DA11 -PE15.Signal=FMC_D12_DA12 -PE7.Signal=FMC_D4_DA4 -PE8.Signal=FMC_D5_DA5 -PE9.Signal=FMC_D6_DA6 -PF0.Signal=FMC_A0 -PF1.Signal=FMC_A1 -PF10.Mode=RGB565 -PF10.Signal=LTDC_DE -PF11.Signal=FMC_SDNRAS -PF12.Signal=FMC_A6 -PF13.Signal=FMC_A7 -PF14.Signal=FMC_A8 -PF15.Signal=FMC_A9 -PF2.Signal=FMC_A2 -PF3.Signal=FMC_A3 -PF4.Signal=FMC_A4 -PF5.Signal=FMC_A5 -PF7.Mode=Full_Duplex_Master -PF7.Signal=SPI5_SCK -PF8.Mode=Full_Duplex_Master -PF8.Signal=SPI5_MISO -PF9.Mode=Full_Duplex_Master -PF9.Signal=SPI5_MOSI -PG0.Signal=FMC_A10 -PG1.Signal=FMC_A11 -PG10.Locked=true -PG10.Mode=RGB565 -PG10.Signal=LTDC_G3 -PG11.Locked=true -PG11.Mode=RGB565 -PG11.Signal=LTDC_B3 -PG12.Locked=true -PG12.Mode=RGB565 -PG12.Signal=LTDC_B4 -PG13.GPIOParameters=PinState,GPIO_Label -PG13.GPIO_Label=LED_GREEN -PG13.Locked=true -PG13.PinState=GPIO_PIN_RESET -PG13.Signal=GPIO_Output -PG14.GPIOParameters=PinState,GPIO_Label -PG14.GPIO_Label=LED_RED -PG14.Locked=true -PG14.PinState=GPIO_PIN_RESET -PG14.Signal=GPIO_Output -PG15.Signal=FMC_SDNCAS -PG4.Signal=FMC_A14_BA0 -PG5.Signal=FMC_A15_BA1 -PG6.Locked=true -PG6.Mode=RGB565 -PG6.Signal=LTDC_R7 -PG7.Locked=true -PG7.Mode=RGB565 -PG7.Signal=LTDC_CLK -PG8.Signal=FMC_SDCLK -PH0/OSC_IN.Mode=HSE-External-Oscillator -PH0/OSC_IN.Signal=RCC_OSC_IN -PH1/OSC_OUT.Mode=HSE-External-Oscillator -PH1/OSC_OUT.Signal=RCC_OSC_OUT -PinOutPanel.RotationAngle=0 -ProjectManager.AskForMigrate=true -ProjectManager.BackupPrevious=false -ProjectManager.CompilerLinker=Starm-Clang -ProjectManager.CompilerOptimize=6 -ProjectManager.ComputerToolchain=false -ProjectManager.CoupleFile=true -ProjectManager.CustomerFirmwarePackage= -ProjectManager.DefaultFWLocation=true -ProjectManager.DeletePrevious=true -ProjectManager.DeviceId=STM32F429ZITx -ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.28.3 -ProjectManager.FreePins=false -ProjectManager.FreePinsContext= -ProjectManager.HalAssertFull=false -ProjectManager.HeapSize=0x200 -ProjectManager.KeepUserCode=true -ProjectManager.LastFirmware=true -ProjectManager.LibraryCopy=1 -ProjectManager.MainLocation=Core/Src -ProjectManager.NoMain=false -ProjectManager.PreviousToolchain=STM32CubeIDE -ProjectManager.ProjectBuild=false -ProjectManager.ProjectFileName=STM32F429ZIT6_STARM.ioc -ProjectManager.ProjectName=STM32F429ZIT6_STARM -ProjectManager.ProjectStructure= -ProjectManager.RegisterCallBack= -ProjectManager.StackSize=0x400 -ProjectManager.TargetToolchain=CMake -ProjectManager.ToolChainLocation= -ProjectManager.UAScriptAfterPath= -ProjectManager.UAScriptBeforePath= -ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_LTDC_Init-LTDC-false-HAL-true,6-MX_FMC_Init-FMC-false-HAL-true,7-MX_SPI5_Init-SPI5-false-HAL-true,8-MX_I2C3_Init-I2C3-false-HAL-true,9-MX_DMA2D_Init-DMA2D-false-HAL-true -RCC.48MHZClocksFreq_Value=45000000 -RCC.AHBFreq_Value=180000000 -RCC.APB1CLKDivider=RCC_HCLK_DIV4 -RCC.APB1Freq_Value=45000000 -RCC.APB1TimFreq_Value=90000000 -RCC.APB2CLKDivider=RCC_HCLK_DIV2 -RCC.APB2Freq_Value=90000000 -RCC.APB2TimFreq_Value=180000000 -RCC.CortexFreq_Value=180000000 -RCC.EnbaleCSS=true -RCC.EthernetFreq_Value=180000000 -RCC.FCLKCortexFreq_Value=180000000 -RCC.FamilyName=M -RCC.HCLKFreq_Value=180000000 -RCC.HSE_VALUE=8000000 -RCC.HSI_VALUE=16000000 -RCC.I2SClocksFreq_Value=192000000 -RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EnbaleCSS,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LCDTFTFreq_Value,LSE_VALUE,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,PLLSAIDivR,PLLSAIN,PLLSAIR,PLLSourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SAI_AClocksFreq_Value,SAI_BClocksFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIOutputFreq_Value,VCOSAIOutputFreq_ValueQ,VCOSAIOutputFreq_ValueR,VcooutputI2S,VcooutputI2SQ -RCC.LCDTFTFreq_Value=6250000 -RCC.LSE_VALUE=32768 -RCC.LSI_VALUE=32000 -RCC.MCO2PinFreq_Value=180000000 -RCC.PLLCLKFreq_Value=180000000 -RCC.PLLM=4 -RCC.PLLN=180 -RCC.PLLQ=8 -RCC.PLLQCLKFreq_Value=45000000 -RCC.PLLSAIDivR=RCC_PLLSAIDIVR_4 -RCC.PLLSAIN=50 -RCC.PLLSAIR=4 -RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE -RCC.RTCFreq_Value=32000 -RCC.RTCHSEDivFreq_Value=4000000 -RCC.SAI_AClocksFreq_Value=25000000 -RCC.SAI_BClocksFreq_Value=25000000 -RCC.SYSCLKFreq_VALUE=180000000 -RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK -RCC.VCOI2SOutputFreq_Value=384000000 -RCC.VCOInputFreq_Value=2000000 -RCC.VCOOutputFreq_Value=360000000 -RCC.VCOSAIOutputFreq_Value=100000000 -RCC.VCOSAIOutputFreq_ValueQ=25000000 -RCC.VCOSAIOutputFreq_ValueR=25000000 -RCC.VcooutputI2S=192000000 -RCC.VcooutputI2SQ=192000000 -SH.FMC_A0.0=FMC_A0,12b-sda1 -SH.FMC_A0.ConfNb=1 -SH.FMC_A1.0=FMC_A1,12b-sda1 -SH.FMC_A1.ConfNb=1 -SH.FMC_A10.0=FMC_A10,12b-sda1 -SH.FMC_A10.ConfNb=1 -SH.FMC_A11.0=FMC_A11,12b-sda1 -SH.FMC_A11.ConfNb=1 -SH.FMC_A14_BA0.0=FMC_BA0,FourSdramBanks1 -SH.FMC_A14_BA0.ConfNb=1 -SH.FMC_A15_BA1.0=FMC_BA1,FourSdramBanks1 -SH.FMC_A15_BA1.ConfNb=1 -SH.FMC_A2.0=FMC_A2,12b-sda1 -SH.FMC_A2.ConfNb=1 -SH.FMC_A3.0=FMC_A3,12b-sda1 -SH.FMC_A3.ConfNb=1 -SH.FMC_A4.0=FMC_A4,12b-sda1 -SH.FMC_A4.ConfNb=1 -SH.FMC_A5.0=FMC_A5,12b-sda1 -SH.FMC_A5.ConfNb=1 -SH.FMC_A6.0=FMC_A6,12b-sda1 -SH.FMC_A6.ConfNb=1 -SH.FMC_A7.0=FMC_A7,12b-sda1 -SH.FMC_A7.ConfNb=1 -SH.FMC_A8.0=FMC_A8,12b-sda1 -SH.FMC_A8.ConfNb=1 -SH.FMC_A9.0=FMC_A9,12b-sda1 -SH.FMC_A9.ConfNb=1 -SH.FMC_D0_DA0.0=FMC_D0,sd-16b-d1 -SH.FMC_D0_DA0.ConfNb=1 -SH.FMC_D10_DA10.0=FMC_D10,sd-16b-d1 -SH.FMC_D10_DA10.ConfNb=1 -SH.FMC_D11_DA11.0=FMC_D11,sd-16b-d1 -SH.FMC_D11_DA11.ConfNb=1 -SH.FMC_D12_DA12.0=FMC_D12,sd-16b-d1 -SH.FMC_D12_DA12.ConfNb=1 -SH.FMC_D13_DA13.0=FMC_D13,sd-16b-d1 -SH.FMC_D13_DA13.ConfNb=1 -SH.FMC_D14_DA14.0=FMC_D14,sd-16b-d1 -SH.FMC_D14_DA14.ConfNb=1 -SH.FMC_D15_DA15.0=FMC_D15,sd-16b-d1 -SH.FMC_D15_DA15.ConfNb=1 -SH.FMC_D1_DA1.0=FMC_D1,sd-16b-d1 -SH.FMC_D1_DA1.ConfNb=1 -SH.FMC_D2_DA2.0=FMC_D2,sd-16b-d1 -SH.FMC_D2_DA2.ConfNb=1 -SH.FMC_D3_DA3.0=FMC_D3,sd-16b-d1 -SH.FMC_D3_DA3.ConfNb=1 -SH.FMC_D4_DA4.0=FMC_D4,sd-16b-d1 -SH.FMC_D4_DA4.ConfNb=1 -SH.FMC_D5_DA5.0=FMC_D5,sd-16b-d1 -SH.FMC_D5_DA5.ConfNb=1 -SH.FMC_D6_DA6.0=FMC_D6,sd-16b-d1 -SH.FMC_D6_DA6.ConfNb=1 -SH.FMC_D7_DA7.0=FMC_D7,sd-16b-d1 -SH.FMC_D7_DA7.ConfNb=1 -SH.FMC_D8_DA8.0=FMC_D8,sd-16b-d1 -SH.FMC_D8_DA8.ConfNb=1 -SH.FMC_D9_DA9.0=FMC_D9,sd-16b-d1 -SH.FMC_D9_DA9.ConfNb=1 -SH.FMC_NBL0.0=FMC_NBL0,Sd2ByteEnable1 -SH.FMC_NBL0.ConfNb=1 -SH.FMC_NBL1.0=FMC_NBL1,Sd2ByteEnable1 -SH.FMC_NBL1.ConfNb=1 -SH.FMC_SDCLK.0=FMC_SDCLK,12b-sda1 -SH.FMC_SDCLK.ConfNb=1 -SH.FMC_SDNCAS.0=FMC_SDNCAS,12b-sda1 -SH.FMC_SDNCAS.ConfNb=1 -SH.FMC_SDNRAS.0=FMC_SDNRAS,12b-sda1 -SH.FMC_SDNRAS.ConfNb=1 -SH.FMC_SDNWE.0=FMC_SDNWE,12b-sda1 -SH.FMC_SDNWE.ConfNb=1 -SPI5.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16 -SPI5.CalculateBaudRate=5.625 MBits/s -SPI5.Direction=SPI_DIRECTION_2LINES -SPI5.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler -SPI5.Mode=SPI_MODE_MASTER -SPI5.VirtualType=VM_MASTER -STMicroelectronics.X-CUBE-ALGOBUILD.1.4.0.DSPOoLibraryJjLibrary_Checked=true -STMicroelectronics.X-CUBE-ALGOBUILD.1.4.0.IPParameters=LibraryCcDSPOoLibraryJjDSPOoLibrary -STMicroelectronics.X-CUBE-ALGOBUILD.1.4.0.LibraryCcDSPOoLibraryJjDSPOoLibrary=true -STMicroelectronics.X-CUBE-ALGOBUILD.1.4.0_SwParameter=LibraryCcDSPOoLibraryJjDSPOoLibrary\:true; -USART1.IPParameters=VirtualMode -USART1.VirtualMode=VM_ASYNC -VP_DMA2D_VS_DMA2D.Mode=DMA2D_Activate -VP_DMA2D_VS_DMA2D.Signal=DMA2D_VS_DMA2D -VP_STMicroelectronics.X-CUBE-ALGOBUILD_VS_DSPOoLibraryJjLibrary_1.4.0_1.4.0.Mode=DSPOoLibraryJjLibrary -VP_STMicroelectronics.X-CUBE-ALGOBUILD_VS_DSPOoLibraryJjLibrary_1.4.0_1.4.0.Signal=STMicroelectronics.X-CUBE-ALGOBUILD_VS_DSPOoLibraryJjLibrary_1.4.0_1.4.0 -VP_SYS_VS_tim6.Mode=TIM6 -VP_SYS_VS_tim6.Signal=SYS_VS_tim6 -board=custom diff --git a/L1_MCU/STM32F429ZIT6_STARM/cmake/gcc-arm-none-eabi.cmake b/L1_MCU/STM32F429ZIT6_STARM/cmake/gcc-arm-none-eabi.cmake deleted file mode 100644 index 46ad5e8..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/cmake/gcc-arm-none-eabi.cmake +++ /dev/null @@ -1,43 +0,0 @@ -set(CMAKE_SYSTEM_NAME Generic) -set(CMAKE_SYSTEM_PROCESSOR arm) - -set(CMAKE_C_COMPILER_ID GNU) -set(CMAKE_CXX_COMPILER_ID GNU) - -# Some default GCC settings -# arm-none-eabi- must be part of path environment -set(TOOLCHAIN_PREFIX arm-none-eabi-) - -set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) -set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER}) -set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++) -set(CMAKE_LINKER ${TOOLCHAIN_PREFIX}g++) -set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy) -set(CMAKE_SIZE ${TOOLCHAIN_PREFIX}size) - -set(CMAKE_EXECUTABLE_SUFFIX_ASM ".elf") -set(CMAKE_EXECUTABLE_SUFFIX_C ".elf") -set(CMAKE_EXECUTABLE_SUFFIX_CXX ".elf") - -set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) - -# MCU specific flags -set(TARGET_FLAGS "-mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard ") - -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TARGET_FLAGS}") -set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -x assembler-with-cpp -MMD -MP") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fdata-sections -ffunction-sections") - -set(CMAKE_C_FLAGS_DEBUG "-O0 -g3") -set(CMAKE_C_FLAGS_RELEASE "-Os -g0") -set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3") -set(CMAKE_CXX_FLAGS_RELEASE "-Os -g0") - -set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -fno-rtti -fno-exceptions -fno-threadsafe-statics") - -set(CMAKE_EXE_LINKER_FLAGS "${TARGET_FLAGS}") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T \"${CMAKE_SOURCE_DIR}/STM32F429XX_FLASH.ld\"") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=nano.specs") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${CMAKE_PROJECT_NAME}.map -Wl,--gc-sections") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--print-memory-usage") -set(TOOLCHAIN_LINK_LIBRARIES "m") diff --git a/L1_MCU/STM32F429ZIT6_STARM/cmake/starm-clang.cmake b/L1_MCU/STM32F429ZIT6_STARM/cmake/starm-clang.cmake deleted file mode 100644 index 70ba403..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/cmake/starm-clang.cmake +++ /dev/null @@ -1,65 +0,0 @@ -set(CMAKE_SYSTEM_NAME Generic) -set(CMAKE_SYSTEM_PROCESSOR arm) - -set(CMAKE_C_COMPILER_ID Clang) -set(CMAKE_CXX_COMPILER_ID Clang) - -# Some default llvm settings -set(TOOLCHAIN_PREFIX starm-) - -set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}clang) -set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER}) -set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}clang++) -set(CMAKE_LINKER ${TOOLCHAIN_PREFIX}clang) -set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy) -set(CMAKE_SIZE ${TOOLCHAIN_PREFIX}size) - -set(CMAKE_EXECUTABLE_SUFFIX_ASM ".elf") -set(CMAKE_EXECUTABLE_SUFFIX_C ".elf") -set(CMAKE_EXECUTABLE_SUFFIX_CXX ".elf") - -set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) - -# STARM_TOOLCHAIN_CONFIG allows you to choose the toolchain configuration. -# Possible values are: -# "STARM_HYBRID" : Hybrid configuration using starm-clang Assemler and Compiler and GNU Linker -# "STARM_NEWLIB" : starm-clang toolchain with NEWLIB C library -# "STARM_PICOLIBC" : starm-clang toolchain with PICOLIBC C library -set(STARM_TOOLCHAIN_CONFIG "STARM_PICOLIBC") - -if(STARM_TOOLCHAIN_CONFIG STREQUAL "STARM_HYBRID") - set(TOOLCHAIN_MULTILIBS "--multi-lib-config=\"$ENV{CLANG_GCC_CMSIS_COMPILER}/multilib.gnu_tools_for_stm32.yaml\" --gcc-toolchain=\"$ENV{GCC_TOOLCHAIN_ROOT}/..\"") -elseif (STARM_TOOLCHAIN_CONFIG STREQUAL "STARM_NEWLIB") - set(TOOLCHAIN_MULTILIBS "--config=newlib.cfg") -endif() - -# MCU specific flags -set(TARGET_FLAGS "-mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard ${TOOLCHAIN_MULTILIBS}") - -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TARGET_FLAGS}") -set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -x assembler-with-cpp -MP") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fdata-sections -ffunction-sections") - -set(CMAKE_C_FLAGS_DEBUG "-Og -g3") -set(CMAKE_C_FLAGS_RELEASE "-Oz -g0") -set(CMAKE_CXX_FLAGS_DEBUG "-Og -g3") -set(CMAKE_CXX_FLAGS_RELEASE "-Oz -g0") - -set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -fno-rtti -fno-exceptions -fno-threadsafe-statics") - -set(CMAKE_EXE_LINKER_FLAGS "${TARGET_FLAGS}") - -if (STARM_TOOLCHAIN_CONFIG STREQUAL "STARM_HYBRID") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --gcc-specs=nano.specs") - set(TOOLCHAIN_LINK_LIBRARIES "m") -elseif(STARM_TOOLCHAIN_CONFIG STREQUAL "STARM_NEWLIB") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lcrt0-nosys") -elseif(STARM_TOOLCHAIN_CONFIG STREQUAL "STARM_PICOLIBC") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lcrt0-hosted -z norelro") - -endif() - -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T \"${CMAKE_SOURCE_DIR}/STM32F429XX_FLASH.ld\"") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${CMAKE_PROJECT_NAME}.map -Wl,--gc-sections") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -z noexecstack") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--print-memory-usage ") diff --git a/L1_MCU/STM32F429ZIT6_STARM/cmake/stm32cubemx/CMakeLists.txt b/L1_MCU/STM32F429ZIT6_STARM/cmake/stm32cubemx/CMakeLists.txt deleted file mode 100644 index 7b9aa6d..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/cmake/stm32cubemx/CMakeLists.txt +++ /dev/null @@ -1,116 +0,0 @@ -cmake_minimum_required(VERSION 3.22) -# Enable CMake support for ASM and C languages -enable_language(C ASM) -# STM32CubeMX generated symbols (macros) -set(MX_Defines_Syms - USE_HAL_DRIVER - STM32F429xx - $<$:DEBUG> -) - -# STM32CubeMX generated include paths -set(MX_Include_Dirs - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Inc - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Inc - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/CMSIS/Device/ST/STM32F4xx/Include - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/CMSIS/Include - ${CMAKE_CURRENT_SOURCE_DIR}/../../Middlewares/ST/ARM/DSP/Inc -) - -# STM32CubeMX generated application sources -set(MX_Application_Src - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/main.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/gpio.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/dma.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/dma2d.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/fmc.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/i2c.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/ltdc.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/spi.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/usart.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/stm32f4xx_it.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/stm32f4xx_hal_msp.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/stm32f4xx_hal_timebase_tim.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/sysmem.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/syscalls.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../startup_stm32f429xx.s -) - -# STM32 HAL/LL Drivers -set(STM32_Drivers_Src - ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/system_stm32f4xx.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c - ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c -) - -# Drivers Midllewares - - - -# Link directories setup -set(MX_LINK_DIRS - - ${CMAKE_CURRENT_SOURCE_DIR}/../../Middlewares/ST/ARM/DSP/Lib -) -# Project static libraries -set(MX_LINK_LIBS - :libarm_cortexM4lf_math.a - STM32_Drivers - ${TOOLCHAIN_LINK_LIBRARIES} - -) -# Interface library for includes and symbols -add_library(stm32cubemx INTERFACE) -target_include_directories(stm32cubemx INTERFACE ${MX_Include_Dirs}) -target_compile_definitions(stm32cubemx INTERFACE ${MX_Defines_Syms}) - -# Create STM32_Drivers static library -add_library(STM32_Drivers OBJECT) -target_sources(STM32_Drivers PRIVATE ${STM32_Drivers_Src}) -target_link_libraries(STM32_Drivers PUBLIC stm32cubemx) - - -# Add STM32CubeMX generated application sources to the project -target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${MX_Application_Src}) - -# Link directories setup -target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE ${MX_LINK_DIRS}) - -# Add libraries to the project -target_link_libraries(${CMAKE_PROJECT_NAME} ${MX_LINK_LIBS}) - -# Add the map file to the list of files to be removed with 'clean' target -set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES ADDITIONAL_CLEAN_FILES ${CMAKE_PROJECT_NAME}.map) - -# Validate that STM32CubeMX code is compatible with C standard -if((CMAKE_C_STANDARD EQUAL 90) OR (CMAKE_C_STANDARD EQUAL 99)) - message(ERROR "Generated code requires C11 or higher") -endif() diff --git a/L1_MCU/STM32F429ZIT6_STARM/startup_stm32f429xx.s b/L1_MCU/STM32F429ZIT6_STARM/startup_stm32f429xx.s deleted file mode 100644 index 5c28f05..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/startup_stm32f429xx.s +++ /dev/null @@ -1,543 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f429xx.s - * @author MCD Application Team - * @brief STM32F429xx Devices vector table for GCC based toolchains. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M4 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m4 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss -/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ - -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr sp, =_estack /* set stack pointer */ - -/* Call the clock system initialization function.*/ - bl SystemInit - -/* Copy the data segment initializers from flash to SRAM */ - ldr r0, =_sdata - ldr r1, =_edata - ldr r2, =_sidata - movs r3, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r4, [r2, r3] - str r4, [r0, r3] - adds r3, r3, #4 - -LoopCopyDataInit: - adds r4, r0, r3 - cmp r4, r1 - bcc CopyDataInit - -/* Zero fill the bss segment. */ - ldr r2, =_sbss - ldr r4, =_ebss - movs r3, #0 - b LoopFillZerobss - -FillZerobss: - str r3, [r2] - adds r2, r2, #4 - -LoopFillZerobss: - cmp r2, r4 - bcc FillZerobss - -/* Call static constructors */ - bl __libc_init_array -/* Call the application's entry point.*/ - bl main - bx lr -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * @param None - * @retval None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M3. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -*******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - -g_pfnVectors: - .word _estack - .word Reset_Handler - - .word NMI_Handler - .word HardFault_Handler - .word MemManage_Handler - .word BusFault_Handler - .word UsageFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word DebugMon_Handler - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - /* External Interrupts */ - .word WWDG_IRQHandler /* Window WatchDog */ - .word PVD_IRQHandler /* PVD through EXTI Line detection */ - .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ - .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ - .word FLASH_IRQHandler /* FLASH */ - .word RCC_IRQHandler /* RCC */ - .word EXTI0_IRQHandler /* EXTI Line0 */ - .word EXTI1_IRQHandler /* EXTI Line1 */ - .word EXTI2_IRQHandler /* EXTI Line2 */ - .word EXTI3_IRQHandler /* EXTI Line3 */ - .word EXTI4_IRQHandler /* EXTI Line4 */ - .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ - .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ - .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ - .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ - .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ - .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ - .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ - .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ - .word CAN1_TX_IRQHandler /* CAN1 TX */ - .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ - .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ - .word CAN1_SCE_IRQHandler /* CAN1 SCE */ - .word EXTI9_5_IRQHandler /* External Line[9:5]s */ - .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ - .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ - .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ - .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ - .word TIM2_IRQHandler /* TIM2 */ - .word TIM3_IRQHandler /* TIM3 */ - .word TIM4_IRQHandler /* TIM4 */ - .word I2C1_EV_IRQHandler /* I2C1 Event */ - .word I2C1_ER_IRQHandler /* I2C1 Error */ - .word I2C2_EV_IRQHandler /* I2C2 Event */ - .word I2C2_ER_IRQHandler /* I2C2 Error */ - .word SPI1_IRQHandler /* SPI1 */ - .word SPI2_IRQHandler /* SPI2 */ - .word USART1_IRQHandler /* USART1 */ - .word USART2_IRQHandler /* USART2 */ - .word USART3_IRQHandler /* USART3 */ - .word EXTI15_10_IRQHandler /* External Line[15:10]s */ - .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ - .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ - .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ - .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ - .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ - .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ - .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ - .word FMC_IRQHandler /* FMC */ - .word SDIO_IRQHandler /* SDIO */ - .word TIM5_IRQHandler /* TIM5 */ - .word SPI3_IRQHandler /* SPI3 */ - .word UART4_IRQHandler /* UART4 */ - .word UART5_IRQHandler /* UART5 */ - .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ - .word TIM7_IRQHandler /* TIM7 */ - .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ - .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ - .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ - .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ - .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ - .word ETH_IRQHandler /* Ethernet */ - .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ - .word CAN2_TX_IRQHandler /* CAN2 TX */ - .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ - .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ - .word CAN2_SCE_IRQHandler /* CAN2 SCE */ - .word OTG_FS_IRQHandler /* USB OTG FS */ - .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ - .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ - .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ - .word USART6_IRQHandler /* USART6 */ - .word I2C3_EV_IRQHandler /* I2C3 event */ - .word I2C3_ER_IRQHandler /* I2C3 error */ - .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ - .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ - .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ - .word OTG_HS_IRQHandler /* USB OTG HS */ - .word DCMI_IRQHandler /* DCMI */ - .word 0 /* Reserved */ - .word HASH_RNG_IRQHandler /* Hash and Rng */ - .word FPU_IRQHandler /* FPU */ - .word UART7_IRQHandler /* UART7 */ - .word UART8_IRQHandler /* UART8 */ - .word SPI4_IRQHandler /* SPI4 */ - .word SPI5_IRQHandler /* SPI5 */ - .word SPI6_IRQHandler /* SPI6 */ - .word SAI1_IRQHandler /* SAI1 */ - .word LTDC_IRQHandler /* LTDC_IRQHandler */ - .word LTDC_ER_IRQHandler /* LTDC_ER_IRQHandler */ - .word DMA2D_IRQHandler /* DMA2D */ - - - .size g_pfnVectors, .-g_pfnVectors - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak MemManage_Handler - .thumb_set MemManage_Handler,Default_Handler - - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler - - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak DebugMon_Handler - .thumb_set DebugMon_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak TAMP_STAMP_IRQHandler - .thumb_set TAMP_STAMP_IRQHandler,Default_Handler - - .weak RTC_WKUP_IRQHandler - .thumb_set RTC_WKUP_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler - - .weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler - - .weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler - - .weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler - - .weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler - - .weak DMA1_Stream0_IRQHandler - .thumb_set DMA1_Stream0_IRQHandler,Default_Handler - - .weak DMA1_Stream1_IRQHandler - .thumb_set DMA1_Stream1_IRQHandler,Default_Handler - - .weak DMA1_Stream2_IRQHandler - .thumb_set DMA1_Stream2_IRQHandler,Default_Handler - - .weak DMA1_Stream3_IRQHandler - .thumb_set DMA1_Stream3_IRQHandler,Default_Handler - - .weak DMA1_Stream4_IRQHandler - .thumb_set DMA1_Stream4_IRQHandler,Default_Handler - - .weak DMA1_Stream5_IRQHandler - .thumb_set DMA1_Stream5_IRQHandler,Default_Handler - - .weak DMA1_Stream6_IRQHandler - .thumb_set DMA1_Stream6_IRQHandler,Default_Handler - - .weak ADC_IRQHandler - .thumb_set ADC_IRQHandler,Default_Handler - - .weak CAN1_TX_IRQHandler - .thumb_set CAN1_TX_IRQHandler,Default_Handler - - .weak CAN1_RX0_IRQHandler - .thumb_set CAN1_RX0_IRQHandler,Default_Handler - - .weak CAN1_RX1_IRQHandler - .thumb_set CAN1_RX1_IRQHandler,Default_Handler - - .weak CAN1_SCE_IRQHandler - .thumb_set CAN1_SCE_IRQHandler,Default_Handler - - .weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler - - .weak TIM1_BRK_TIM9_IRQHandler - .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler - - .weak TIM1_UP_TIM10_IRQHandler - .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler - - .weak TIM1_TRG_COM_TIM11_IRQHandler - .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM4_IRQHandler - .thumb_set TIM4_IRQHandler,Default_Handler - - .weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler - - .weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler - - .weak I2C2_EV_IRQHandler - .thumb_set I2C2_EV_IRQHandler,Default_Handler - - .weak I2C2_ER_IRQHandler - .thumb_set I2C2_ER_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler - - .weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler - - .weak RTC_Alarm_IRQHandler - .thumb_set RTC_Alarm_IRQHandler,Default_Handler - - .weak OTG_FS_WKUP_IRQHandler - .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler - - .weak TIM8_BRK_TIM12_IRQHandler - .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler - - .weak TIM8_UP_TIM13_IRQHandler - .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler - - .weak TIM8_TRG_COM_TIM14_IRQHandler - .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler - - .weak TIM8_CC_IRQHandler - .thumb_set TIM8_CC_IRQHandler,Default_Handler - - .weak DMA1_Stream7_IRQHandler - .thumb_set DMA1_Stream7_IRQHandler,Default_Handler - - .weak FMC_IRQHandler - .thumb_set FMC_IRQHandler,Default_Handler - - .weak SDIO_IRQHandler - .thumb_set SDIO_IRQHandler,Default_Handler - - .weak TIM5_IRQHandler - .thumb_set TIM5_IRQHandler,Default_Handler - - .weak SPI3_IRQHandler - .thumb_set SPI3_IRQHandler,Default_Handler - - .weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler - - .weak UART5_IRQHandler - .thumb_set UART5_IRQHandler,Default_Handler - - .weak TIM6_DAC_IRQHandler - .thumb_set TIM6_DAC_IRQHandler,Default_Handler - - .weak TIM7_IRQHandler - .thumb_set TIM7_IRQHandler,Default_Handler - - .weak DMA2_Stream0_IRQHandler - .thumb_set DMA2_Stream0_IRQHandler,Default_Handler - - .weak DMA2_Stream1_IRQHandler - .thumb_set DMA2_Stream1_IRQHandler,Default_Handler - - .weak DMA2_Stream2_IRQHandler - .thumb_set DMA2_Stream2_IRQHandler,Default_Handler - - .weak DMA2_Stream3_IRQHandler - .thumb_set DMA2_Stream3_IRQHandler,Default_Handler - - .weak DMA2_Stream4_IRQHandler - .thumb_set DMA2_Stream4_IRQHandler,Default_Handler - - .weak ETH_IRQHandler - .thumb_set ETH_IRQHandler,Default_Handler - - .weak ETH_WKUP_IRQHandler - .thumb_set ETH_WKUP_IRQHandler,Default_Handler - - .weak CAN2_TX_IRQHandler - .thumb_set CAN2_TX_IRQHandler,Default_Handler - - .weak CAN2_RX0_IRQHandler - .thumb_set CAN2_RX0_IRQHandler,Default_Handler - - .weak CAN2_RX1_IRQHandler - .thumb_set CAN2_RX1_IRQHandler,Default_Handler - - .weak CAN2_SCE_IRQHandler - .thumb_set CAN2_SCE_IRQHandler,Default_Handler - - .weak OTG_FS_IRQHandler - .thumb_set OTG_FS_IRQHandler,Default_Handler - - .weak DMA2_Stream5_IRQHandler - .thumb_set DMA2_Stream5_IRQHandler,Default_Handler - - .weak DMA2_Stream6_IRQHandler - .thumb_set DMA2_Stream6_IRQHandler,Default_Handler - - .weak DMA2_Stream7_IRQHandler - .thumb_set DMA2_Stream7_IRQHandler,Default_Handler - - .weak USART6_IRQHandler - .thumb_set USART6_IRQHandler,Default_Handler - - .weak I2C3_EV_IRQHandler - .thumb_set I2C3_EV_IRQHandler,Default_Handler - - .weak I2C3_ER_IRQHandler - .thumb_set I2C3_ER_IRQHandler,Default_Handler - - .weak OTG_HS_EP1_OUT_IRQHandler - .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler - - .weak OTG_HS_EP1_IN_IRQHandler - .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler - - .weak OTG_HS_WKUP_IRQHandler - .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler - - .weak OTG_HS_IRQHandler - .thumb_set OTG_HS_IRQHandler,Default_Handler - - .weak DCMI_IRQHandler - .thumb_set DCMI_IRQHandler,Default_Handler - - .weak HASH_RNG_IRQHandler - .thumb_set HASH_RNG_IRQHandler,Default_Handler - - .weak FPU_IRQHandler - .thumb_set FPU_IRQHandler,Default_Handler - - .weak UART7_IRQHandler - .thumb_set UART7_IRQHandler,Default_Handler - - .weak UART8_IRQHandler - .thumb_set UART8_IRQHandler,Default_Handler - - .weak SPI4_IRQHandler - .thumb_set SPI4_IRQHandler,Default_Handler - - .weak SPI5_IRQHandler - .thumb_set SPI5_IRQHandler,Default_Handler - - .weak SPI6_IRQHandler - .thumb_set SPI6_IRQHandler,Default_Handler - - .weak SAI1_IRQHandler - .thumb_set SAI1_IRQHandler,Default_Handler - - .weak LTDC_IRQHandler - .thumb_set LTDC_IRQHandler,Default_Handler - - .weak LTDC_ER_IRQHandler - .thumb_set LTDC_ER_IRQHandler,Default_Handler - - .weak DMA2D_IRQHandler - .thumb_set DMA2D_IRQHandler,Default_Handler diff --git a/L1_MCU/STM32F429ZIT6_STARM/stm32f429zit6_flash.ld b/L1_MCU/STM32F429ZIT6_STARM/stm32f429zit6_flash.ld deleted file mode 100644 index 4ca6e76..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/stm32f429zit6_flash.ld +++ /dev/null @@ -1,276 +0,0 @@ -/* -****************************************************************************** -** - -** File : LinkerScript.ld -** -** Author : STM32CubeMX -** -** Abstract : Linker script for STM32F429ZITx series -** 2048Kbytes FLASH and 256Kbytes RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** Distribution: The file is distributed “as is,” without any warranty -** of any kind. -** -***************************************************************************** -** @attention -** -**

    © COPYRIGHT(c) 2025 STMicroelectronics

    -** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of STMicroelectronics nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Specify the memory areas */ -MEMORY -{ -RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K -CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K -FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K -} - -/* Highest address of the user mode stack */ -_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of RAM */ -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x200; /* required amount of heap */ -_Min_Stack_Size = 0x400; /* required amount of stack */ - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data goes into FLASH */ - .rodata : - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - *(.ARM.extab* .gnu.linkonce.armextab.*) - . = ALIGN(4); - } >FLASH - - .ARM (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - . = ALIGN(4); - } >FLASH - - .preinit_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - . = ALIGN(4); - } >FLASH - - .init_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - . = ALIGN(4); - } >FLASH - - .fini_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - . = ALIGN(4); - } >FLASH - - _siccmram = LOADADDR(.ccmram); - - /* CCM-RAM section - * - * IMPORTANT NOTE! - * If initialized variables will be placed in this section, - * the startup code needs to be modified to copy the init-values. - */ - .ccmram : - { - . = ALIGN(4); - _sccmram = .; /* create a global symbol at ccmram start */ - *(.ccmram) - *(.ccmram*) - - . = ALIGN(4); - _eccmram = .; /* create a global symbol at ccmram end */ - } >CCMRAM AT> FLASH - - /* used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - *(.RamFunc) /* .RamFunc sections */ - *(.RamFunc*) /* .RamFunc* sections */ - - . = ALIGN(4); - } >RAM AT> FLASH - - /* Initialized TLS data section */ - .tdata : ALIGN(4) - { - *(.tdata .tdata.* .gnu.linkonce.td.*) - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - PROVIDE(__data_end = .); - PROVIDE(__tdata_end = .); - } >RAM AT> FLASH - - PROVIDE( __tdata_start = ADDR(.tdata) ); - PROVIDE( __tdata_size = __tdata_end - __tdata_start ); - - PROVIDE( __data_start = ADDR(.data) ); - PROVIDE( __data_size = __data_end - __data_start ); - - PROVIDE( __tdata_source = LOADADDR(.tdata) ); - PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) ); - PROVIDE( __tdata_source_size = __tdata_source_end - __tdata_source ); - - PROVIDE( __data_source = LOADADDR(.data) ); - PROVIDE( __data_source_end = __tdata_source_end ); - PROVIDE( __data_source_size = __data_source_end - __data_source ); - /* Uninitialized data section */ - .tbss (NOLOAD) : ALIGN(4) - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.tbss .tbss.*) - . = ALIGN(4); - PROVIDE( __tbss_end = . ); - } >RAM - - PROVIDE( __tbss_start = ADDR(.tbss) ); - PROVIDE( __tbss_size = __tbss_end - __tbss_start ); - PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) ); - - PROVIDE( __tls_base = __tdata_start ); - PROVIDE( __tls_end = __tbss_end ); - PROVIDE( __tls_size = __tls_end - __tls_base ); - PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) ); - PROVIDE( __tls_size_align = (__tls_size + __tls_align - 1) & ~(__tls_align - 1) ); - PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) ); - PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) ); - - .bss (NOLOAD) : ALIGN(4) - { - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - PROVIDE( __bss_end = .); - } >RAM - PROVIDE( __non_tls_bss_start = ADDR(.bss) ); - - PROVIDE( __bss_start = __tbss_start ); - PROVIDE( __bss_size = __bss_end - __bss_start ); - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack (NOLOAD) : - { - . = ALIGN(8); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(8); - } >RAM - - .ek_export : - { - . = ALIGN(4); - _ek_export_fn_start = .; - KEEP(*(SORT(.ek_export_fn*))) - . = ALIGN(4); - _ek_export_fn_end = .; - } > FLASH - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a:* ( * ) - libm.a:* ( * ) - libgcc.a:* ( * ) - } - -} diff --git a/cmake/starm-clang.cmake b/cmake/starm-clang.cmake deleted file mode 100644 index 59529cc..0000000 --- a/cmake/starm-clang.cmake +++ /dev/null @@ -1,65 +0,0 @@ -set(CMAKE_SYSTEM_NAME Generic) -set(CMAKE_SYSTEM_PROCESSOR arm) -set(CMAKE_C_COMPILER_ID Clang) -set(CMAKE_CXX_COMPILER_ID Clang) - -# 工具链前缀,确保在 PATH 中或使用绝对路径 -set(TOOLCHAIN_PREFIX starm-) - -set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}clang) -set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER}) -set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}clang++) -set(CMAKE_LINKER ${TOOLCHAIN_PREFIX}clang) -set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy) -set(CMAKE_SIZE ${TOOLCHAIN_PREFIX}size) - -set(CMAKE_EXECUTABLE_SUFFIX_ASM ".elf") -set(CMAKE_EXECUTABLE_SUFFIX_C ".elf") -set(CMAKE_EXECUTABLE_SUFFIX_CXX ".elf") -set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) - -# C 库选择: STARM_PICOLIBC / STARM_NEWLIB / STARM_HYBRID -set(STARM_TOOLCHAIN_CONFIG "STARM_PICOLIBC") - -if(STARM_TOOLCHAIN_CONFIG STREQUAL "STARM_HYBRID") - set(TOOLCHAIN_MULTILIBS "--multi-lib-config=\"$ENV{CLANG_GCC_CMSIS_COMPILER}/multilib.gnu_tools_for_stm32.yaml\" --gcc-toolchain=\"$ENV{GCC_TOOLCHAIN_ROOT}/..\"") -elseif (STARM_TOOLCHAIN_CONFIG STREQUAL "STARM_NEWLIB") - set(TOOLCHAIN_MULTILIBS "--config=newlib.cfg") -endif() - -# 芯片架构: Cortex-M4 with FPU -set(TARGET_FLAGS "-mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard ${TOOLCHAIN_MULTILIBS}") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TARGET_FLAGS}") -set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -x assembler-with-cpp -MP") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fdata-sections -ffunction-sections") - -set(CMAKE_C_FLAGS_DEBUG "-Og -g3") -set(CMAKE_C_FLAGS_RELEASE "-Oz -g0") -set(CMAKE_CXX_FLAGS_DEBUG "-Og -g3") -set(CMAKE_CXX_FLAGS_RELEASE "-Oz -g0") - -set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -fno-rtti -fno-exceptions -fno-threadsafe-statics") - -# 链接脚本路径 (可通过 -DLINKER_SCRIPT 覆盖) -set(LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/L1_MCU/STM32F429ZIT6_STARM/stm32f429zit6_flash.ld" - CACHE FILEPATH "The path to the linker script") - -if(NOT CMAKE_SOURCE_DIR MATCHES "CMakeScratch") - if(NOT EXISTS "${LINKER_SCRIPT}") - message(WARNING "Linker script not found at: ${LINKER_SCRIPT}") - endif() -endif() - -set(CMAKE_EXE_LINKER_FLAGS "${TARGET_FLAGS}") -if (STARM_TOOLCHAIN_CONFIG STREQUAL "STARM_HYBRID") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --gcc-specs=nano.specs") - set(TOOLCHAIN_LINK_LIBRARIES "m") -elseif(STARM_TOOLCHAIN_CONFIG STREQUAL "STARM_NEWLIB") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lcrt0-nosys") -elseif(STARM_TOOLCHAIN_CONFIG STREQUAL "STARM_PICOLIBC") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lcrt0-hosted -z norelro") -endif() - -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${CMAKE_PROJECT_NAME}.map -Wl,--gc-sections") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -z noexecstack") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--print-memory-usage") diff --git a/justfile b/justfile index 6dae449..a01d8a4 100644 --- a/justfile +++ b/justfile @@ -1,6 +1,5 @@ alias b := build alias bg := build-gd -alias bs := build-starm alias c := clean alias t := test @@ -24,16 +23,6 @@ build-gd: -DUSE_LVGL=OFF @ninja -C build -build-starm: - @cmake -B build -G Ninja \ - -DCMAKE_TOOLCHAIN_FILE="cmake/starm-clang.cmake" \ - -DCMAKE_BUILD_TYPE=Debug \ - -DMCU_MODEL="STM32F429ZIT6_STARM" \ - -DUSE_FREERTOS=OFF \ - -DUSE_FATFS=OFF \ - -DUSE_LVGL=OFF - @ninja -C build - clean: @rm -rf build @echo 'build directory has been removed' From c2c45eb1966871ac92bb637652d6b6928f3a9e22 Mon Sep 17 00:00:00 2001 From: N1netyNine99 Date: Wed, 25 Feb 2026 23:52:45 +0800 Subject: [PATCH 3/4] =?UTF-8?q?[update]=E5=88=A0=E9=99=A4=E4=BA=86?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E7=9A=84=E9=93=BE=E6=8E=A5=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- L1_MCU/GD32F470ZGT6/gd32f470zgt6_flash.ld | 198 ------------ .../STM32F429ZIT6_GCC/stm32f429zit6_flash.ld | 293 ------------------ cmake/gcc-arm-none-eabi.cmake | 4 - 3 files changed, 495 deletions(-) delete mode 100644 L1_MCU/GD32F470ZGT6/gd32f470zgt6_flash.ld delete mode 100644 L1_MCU/STM32F429ZIT6_GCC/stm32f429zit6_flash.ld diff --git a/L1_MCU/GD32F470ZGT6/gd32f470zgt6_flash.ld b/L1_MCU/GD32F470ZGT6/gd32f470zgt6_flash.ld deleted file mode 100644 index 78cfd98..0000000 --- a/L1_MCU/GD32F470ZGT6/gd32f470zgt6_flash.ld +++ /dev/null @@ -1,198 +0,0 @@ -/* Memory Map */ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_sp = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */ - -_Min_Heap_Size = 0x200; /* required amount of heap */ -_Min_Stack_Size = 0x400; /* required amount of stack */ - -/* Memories definition */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 448K - TCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K - SDRAM (xrw) : ORIGIN = 0xC0000000, LENGTH = 32M -} - -/* Sections */ -SECTIONS -{ - /* The startup code into "FLASH" Rom type memory */ - .vectors : - { - . = ALIGN(4); - KEEP(*(.vectors)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data into "FLASH" Rom type memory */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data into "FLASH" Rom type memory */ - .rodata : - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - *(.ARM.extab* .gnu.linkonce.armextab.*) - . = ALIGN(4); - } >FLASH - - .ARM (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - . = ALIGN(4); - } >FLASH - - .preinit_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - . = ALIGN(4); - } >FLASH - - .init_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - . = ALIGN(4); - } >FLASH - - .fini_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - . = ALIGN(4); - } >FLASH - - /* Used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections into "RAM" Ram type memory */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - *(.RamFunc) /* .RamFunc sections */ - *(.RamFunc*) /* .RamFunc* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - - } >RAM AT> FLASH - - /* Uninitialized data section into "RAM" Ram type memory */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss section */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >RAM - - /* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */ - ._user_heap_stack : - { - . = ALIGN(8); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(8); - } >RAM - - /* Used by the startup to initialize tcmram */ - _sitcmram = LOADADDR(.tcmram); - - /* Initialized tcmram sections into "TCMRAM" Ram type memory */ - .tcmram : - { - . = ALIGN(4); - _stcmram = .; /* create a global symbol at tcmram start */ - *(.tcmram) /* .tcmram sections */ - *(.tcmram*) /* .tcmram* sections */ - - *(.ccmram) /* .ccmram 与 ST 适配 */ - *(.ccmram*) - - . = ALIGN(4); - _etcmram = .; /* define a global symbol at tcmram end */ - } >TCMRAM AT> FLASH - - /* Remove information from the compiler libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } - - /* EK EXPORT */ - .ek_export : - { - . = ALIGN(4); - _ek_export_fn_start = .; - KEEP(*(SORT(.ek_export_fn*))) - . = ALIGN(4); - _ek_export_fn_end = .; - } > FLASH - - /* SDRAM Data */ - .sdram_data (NOLOAD) : - { - . = ALIGN(4); - _sdram_data_start = .; - *(.sdram_data) - *(.sdram_data*) - - . = ALIGN(4); - _sdram_data_end = .; - - } > SDRAM -} diff --git a/L1_MCU/STM32F429ZIT6_GCC/stm32f429zit6_flash.ld b/L1_MCU/STM32F429ZIT6_GCC/stm32f429zit6_flash.ld deleted file mode 100644 index 9b56b82..0000000 --- a/L1_MCU/STM32F429ZIT6_GCC/stm32f429zit6_flash.ld +++ /dev/null @@ -1,293 +0,0 @@ -/* -****************************************************************************** -** - -** File : LinkerScript.ld -** -** Author : STM32CubeMX -** -** Abstract : Linker script for STM32F429ZITx series -** 2048Kbytes FLASH and 256Kbytes RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** Distribution: The file is distributed “as is,” without any warranty -** of any kind. -** -***************************************************************************** -** @attention -** -**

    © COPYRIGHT(c) 2025 STMicroelectronics

    -** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of STMicroelectronics nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Specify the memory areas */ -MEMORY -{ - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K - CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K - FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K - SDRAM(xrw) : ORIGIN = 0xD0000000, LENGTH = 8M -} - -/* Highest address of the user mode stack */ -_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of RAM */ -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x200; /* required amount of heap */ -_Min_Stack_Size = 0x400; /* required amount of stack */ - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data goes into FLASH */ - .rodata : - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - . = ALIGN(4); - } >FLASH - - .ARM.extab (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - *(.ARM.extab* .gnu.linkonce.armextab.*) - . = ALIGN(4); - } >FLASH - - .ARM (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - . = ALIGN(4); - } >FLASH - - .preinit_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - . = ALIGN(4); - } >FLASH - - .init_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - . = ALIGN(4); - } >FLASH - - .fini_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - . = ALIGN(4); - } >FLASH - - _siccmram = LOADADDR(.ccmram); - - /* CCM-RAM section - * - * IMPORTANT NOTE! - * If initialized variables will be placed in this section, - * the startup code needs to be modified to copy the init-values. - */ - .ccmram : - { - . = ALIGN(4); - _sccmram = .; /* create a global symbol at ccmram start */ - *(.ccmram) - *(.ccmram*) - - . = ALIGN(4); - _eccmram = .; /* create a global symbol at ccmram end */ - } >CCMRAM AT> FLASH - - /* used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - *(.RamFunc) /* .RamFunc sections */ - *(.RamFunc*) /* .RamFunc* sections */ - - . = ALIGN(4); - } >RAM AT> FLASH - - /* Initialized TLS data section */ - .tdata : ALIGN(4) - { - *(.tdata .tdata.* .gnu.linkonce.td.*) - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - PROVIDE(__data_end = .); - PROVIDE(__tdata_end = .); - } >RAM AT> FLASH - - PROVIDE( __tdata_start = ADDR(.tdata) ); - PROVIDE( __tdata_size = __tdata_end - __tdata_start ); - - PROVIDE( __data_start = ADDR(.data) ); - PROVIDE( __data_size = __data_end - __data_start ); - - PROVIDE( __tdata_source = LOADADDR(.tdata) ); - PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) ); - PROVIDE( __tdata_source_size = __tdata_source_end - __tdata_source ); - - PROVIDE( __data_source = LOADADDR(.data) ); - PROVIDE( __data_source_end = __tdata_source_end ); - PROVIDE( __data_source_size = __data_source_end - __data_source ); - /* Uninitialized data section */ - .tbss (NOLOAD) : ALIGN(4) - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.tbss .tbss.*) - . = ALIGN(4); - PROVIDE( __tbss_end = . ); - } >RAM - - PROVIDE( __tbss_start = ADDR(.tbss) ); - PROVIDE( __tbss_size = __tbss_end - __tbss_start ); - PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) ); - - PROVIDE( __tls_base = __tdata_start ); - PROVIDE( __tls_end = __tbss_end ); - PROVIDE( __tls_size = __tls_end - __tls_base ); - PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) ); - PROVIDE( __tls_size_align = (__tls_size + __tls_align - 1) & ~(__tls_align - 1) ); - PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) ); - PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) ); - - .bss (NOLOAD) : ALIGN(4) - { - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - PROVIDE( __bss_end = .); - } >RAM - PROVIDE( __non_tls_bss_start = ADDR(.bss) ); - - PROVIDE( __bss_start = __tbss_start ); - PROVIDE( __bss_size = __bss_end - __bss_start ); - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack (NOLOAD) : - { - . = ALIGN(8); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(8); - } >RAM - - - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a:* ( * ) - libm.a:* ( * ) - libgcc.a:* ( * ) - } - - /* EK EXPORT */ - .ek_export : - { - . = ALIGN(4); - _ek_export_fn_start = .; - KEEP(*(SORT(.ek_export_fn*))) - . = ALIGN(4); - _ek_export_fn_end = .; - } > FLASH - - /* SDRAM Data */ - .sdram_data (NOLOAD) : - { - . = ALIGN(4); - _sdram_data_start = .; - *(.sdram_data) - *(.sdram_data*) - - . = ALIGN(4); - _sdram_data_end = .; - - } > SDRAM -} diff --git a/cmake/gcc-arm-none-eabi.cmake b/cmake/gcc-arm-none-eabi.cmake index fa6d624..bd2f8c3 100644 --- a/cmake/gcc-arm-none-eabi.cmake +++ b/cmake/gcc-arm-none-eabi.cmake @@ -18,10 +18,6 @@ set(CMAKE_EXECUTABLE_SUFFIX_C ".elf") set(CMAKE_EXECUTABLE_SUFFIX_CXX ".elf") set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) -# 链接脚本路径 (可通过 -DLINKER_SCRIPT 覆盖) -set(LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/L1_MCU/STM32F429ZIT6_GCC/stm32f429zit6_flash.ld" - CACHE FILEPATH "The path to the linker script") - if(NOT CMAKE_SOURCE_DIR MATCHES "CMakeScratch") if(NOT EXISTS "${LINKER_SCRIPT}") message(WARNING "Linker script not found at: ${LINKER_SCRIPT}") From 6fa529514b1d51cb79be8ffa82dba8aa2e3640ab Mon Sep 17 00:00:00 2001 From: N1netyNine99 Date: Wed, 25 Feb 2026 23:53:08 +0800 Subject: [PATCH 4/4] =?UTF-8?q?[fix]=E4=BF=AE=E5=A4=8D=E4=BA=86gd32?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E6=96=87=E4=BB=B6=E4=B8=AD=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=20=5Fsp=20=E5=AF=BC=E8=87=B4=E7=BC=96=E8=AF=91=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmake/ld/ek_generic.ld.in | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/ld/ek_generic.ld.in b/cmake/ld/ek_generic.ld.in index 051a94e..b66f2dc 100644 --- a/cmake/ld/ek_generic.ld.in +++ b/cmake/ld/ek_generic.ld.in @@ -29,6 +29,7 @@ ENTRY(Reset_Handler) /* Highest address of the user mode stack */ _estack = ORIGIN(RAM) + LENGTH(RAM); /* end of RAM */ +_sp = _estack; /* GD32 startup alias */ /* Generate a link error if heap and stack don't fit into RAM */ _Min_Heap_Size = @EK_MIN_HEAP_SIZE@; /* required amount of heap */

    {_7^2kF50#{`4W7)B@ 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 M_D265uSx#@0A6;SU;qFB diff --git a/L1_MCU/STM32F429ZIT6_STARM/Middlewares/Third_Party/ARM/DSP/LICENSE.txt b/L1_MCU/STM32F429ZIT6_STARM/Middlewares/Third_Party/ARM/DSP/LICENSE.txt deleted file mode 100644 index c0ee812..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/Middlewares/Third_Party/ARM/DSP/LICENSE.txt +++ /dev/null @@ -1,201 +0,0 @@ - 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. diff --git a/L1_MCU/STM32F429ZIT6_STARM/STM32F429XX_FLASH.ld b/L1_MCU/STM32F429ZIT6_STARM/STM32F429XX_FLASH.ld deleted file mode 100644 index bec9cb9..0000000 --- a/L1_MCU/STM32F429ZIT6_STARM/STM32F429XX_FLASH.ld +++ /dev/null @@ -1,269 +0,0 @@ -/* -****************************************************************************** -** - -** File : LinkerScript.ld -** -** Author : STM32CubeMX -** -** Abstract : Linker script for STM32F429ZITx series -** 2048Kbytes FLASH and 256Kbytes RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** Distribution: The file is distributed “as is,” without any warranty -** of any kind. -** -***************************************************************************** -** @attention -** -**

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%0DT8t=wFGZ~2Yo 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